This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
eodb/eodb/events/management/commands/common.py

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()