diff --git a/eodb/events/management/commands/activity.py b/eodb/events/management/commands/activity.py new file mode 100644 index 0000000..8a747c1 --- /dev/null +++ b/eodb/events/management/commands/activity.py @@ -0,0 +1,62 @@ +import datetime +import matplotlib +import matplotlib.dates +import matplotlib.pyplot as plt + +from django.core.management.base import BaseCommand +from django.utils.dateparse import parse_date + +from eodb.events.models import Commit + + +class Command(BaseCommand): + def add_arguments(self, parser): + parser.add_argument('--username', metavar='USERNAME') + parser.add_argument('--datemin', metavar='DATEMIN') + parser.add_argument('--datemax', metavar='DATEMAX') + parser.add_argument('--groupby', metavar='TIME UNIT', default='weeks', + help='aggregate over weeks (default) / months / years') + parser.add_argument('--committime', action='store_true', + help='use commit datetime instead of author datetime') + + def handle(self, *args, **options): + filters = {'author_email__endswith': '@entrouvert.com'} + + title = 'Git activity' + + if options.get('username'): + filters['author_email__startswith'] = options['username'] + '@' + title += ' for %s' % options['username'] + + datetime_var = 'author_datetime' + if options.get('committime'): + datetime_var = 'commit_datetime' + if options.get('datemin'): + filters[datetime_var + '__gte'] = parse_date(options['datemin']) + title += ' from %s' % options['datemin'] + if options.get('datemax'): + filters[datetime_var + '__lt'] = parse_date(options['datemax']) + title += ' until %s' % options['datemax'] + + events = {} + for commit in Commit.objects.filter(**filters): + commit_date = getattr(commit, datetime_var).date() + if options.get('groupby') == 'weeks': + graph_date = commit_date - datetime.timedelta(days=commit_date.weekday()) + elif options.get('groupby') == 'months': + graph_date = commit_date.replace(day=1) + elif options.get('groupby') == 'years': + graph_date = commit_date.replace(month=1, day=1) + + date = matplotlib.dates.date2num(graph_date) + if not date in events: + events[date] = 0 + events[date] = events[date] + 1 + + dates = sorted(events.keys()) + values = [events[x] for x in dates] + + plt.title(title) + plt.plot(dates, values) + plt.gca().xaxis.set_major_formatter(matplotlib.dates.DateFormatter('%m/%Y')) + plt.show()