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

111 lines
4.4 KiB
Python

import itertools
import matplotlib.pyplot as plt
from django.core.management.base import BaseCommand, CommandError
from django.db.models import Q
from django.utils.dateparse import parse_date
from django.utils.timezone import make_aware, make_naive
from eodb.events.models import Commit, Email, Redmine, Formdata
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('--events', default='git',
help='use event of this type (git (default), emails, redmine)')
parser.add_argument('--notitle', action='store_true')
parser.add_argument('--entrouvert', action='store_true',
help='limit to @entrouvert persons')
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_event_datetime(self, event, options):
datetime_var = 'author_datetime'
if options.get('committime'):
datetime_var = 'commit_datetime'
return make_aware(make_naive(getattr(event, datetime_var)))
def get_events(self, options):
if options.get('entrouvert'):
domain_filter = Q(author_email__endswith='@entrouvert.com') | \
Q(author_email__endswith='@entrouvert.org')
elif options['events'] in ('formdata',):
domain_filter = Q(author_datetime__isnull=False)
else:
domain_filter = Q()
filters = {}
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['events'] == 'all':
return itertools.chain(
Email.objects.filter(domain_filter).filter(**filters),
Redmine.objects.filter(domain_filter).filter(**filters),
Commit.objects.filter(domain_filter).filter(**filters),
)
return {'emails': Email, 'redmine': Redmine, 'git': Commit,
'formdata': Formdata}[
options['events']].objects.filter(domain_filter).filter(**filters)
def get_title(self, options):
title = {
'emails': 'Email activity',
'git': 'Git activity',
'redmine': 'Redmine activity',
'formdata': 'Formdata activity',
'all': 'Global activity',
}[options['events']]
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()