83 lines
3.1 KiB
Python
83 lines
3.1 KiB
Python
import matplotlib.pyplot as plt
|
|
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
from django.utils.dateparse import parse_date
|
|
|
|
from eodb.events.models import Commit, Email
|
|
|
|
class GraphCommand(BaseCommand):
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('--username', metavar='USERNAME')
|
|
parser.add_argument('--module', metavar='MODULE')
|
|
parser.add_argument('--datemin', metavar='DATEMIN')
|
|
parser.add_argument('--datemax', metavar='DATEMAX')
|
|
parser.add_argument('--committime', action='store_true',
|
|
help='use commit datetime instead of author datetime')
|
|
parser.add_argument('--mailinglist', action='store_true',
|
|
help='use mailing list emails instead of commits')
|
|
parser.add_argument('--notitle', action='store_true')
|
|
parser.add_argument('--filename', metavar='FILENAME')
|
|
|
|
def get_series(self, options):
|
|
usernames = options['username'].split(',') if options.get('username') else []
|
|
modules = options['module'].split(',') if options.get('module') else []
|
|
|
|
if len(usernames) > 1 and len(modules) > 1:
|
|
raise CommandError('only one dimension is allowed')
|
|
|
|
if len(usernames) > 1:
|
|
for username in usernames:
|
|
options['username'] = username
|
|
yield (username, self.get_events(options))
|
|
elif len(modules) > 1:
|
|
for module in modules:
|
|
options['module'] = module
|
|
yield (module, self.get_events(options))
|
|
else:
|
|
yield (None, self.get_events(options))
|
|
|
|
def get_events(self, options):
|
|
filters = {'author_email__endswith': '@entrouvert.com'}
|
|
|
|
if options.get('username'):
|
|
filters['author_email__startswith'] = options['username'] + '@'
|
|
|
|
if options.get('module'):
|
|
filters['module'] = options['module']
|
|
|
|
datetime_var = 'author_datetime'
|
|
if options.get('committime'):
|
|
datetime_var = 'commit_datetime'
|
|
if options.get('datemin'):
|
|
filters[datetime_var + '__gte'] = parse_date(options['datemin'])
|
|
if options.get('datemax'):
|
|
filters[datetime_var + '__lt'] = parse_date(options['datemax'])
|
|
|
|
if options.get('mailinglist'):
|
|
return Email.objects.filter(**filters)
|
|
else:
|
|
return Commit.objects.filter(**filters)
|
|
|
|
def get_title(self, options):
|
|
if options.get('mailinglist'):
|
|
title = 'Email activity'
|
|
else:
|
|
title = 'Git activity'
|
|
if options.get('username'):
|
|
title += ' for %s' % options['username']
|
|
if options.get('module'):
|
|
title += ' in module %s' % options['module']
|
|
if options.get('datemin'):
|
|
title += ' from %s' % options['datemin']
|
|
if options.get('datemax'):
|
|
title += ' until %s' % options['datemax']
|
|
return title
|
|
|
|
def plot(self, options):
|
|
if not options.get('notitle'):
|
|
plt.title(self.get_title(options))
|
|
if options.get('filename'):
|
|
plt.savefig(options['filename'])
|
|
else:
|
|
plt.show()
|