diff --git a/eodb/events/management/commands/activity.py b/eodb/events/management/commands/activity.py index ab694d3..0c777f9 100644 --- a/eodb/events/management/commands/activity.py +++ b/eodb/events/management/commands/activity.py @@ -23,7 +23,7 @@ class Command(GraphCommand): datetime_var = 'commit_datetime' events = {} - for commit in self.get_commits(options): + for commit in self.get_events(options): commit_date = getattr(commit, datetime_var).date() if options.get('groupby') == 'weeks': graph_date = commit_date - datetime.timedelta(days=commit_date.weekday()) diff --git a/eodb/events/management/commands/common.py b/eodb/events/management/commands/common.py index f4ab9ef..cb82945 100644 --- a/eodb/events/management/commands/common.py +++ b/eodb/events/management/commands/common.py @@ -3,7 +3,7 @@ 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 +from eodb.events.models import Commit, Email class GraphCommand(BaseCommand): def add_arguments(self, parser): @@ -13,9 +13,11 @@ class GraphCommand(BaseCommand): 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('--filename', metavar='FILENAME') - def get_commits(self, options): + def get_events(self, options): filters = {'author_email__endswith': '@entrouvert.com'} if options.get('username'): @@ -32,10 +34,16 @@ class GraphCommand(BaseCommand): if options.get('datemax'): filters[datetime_var + '__lt'] = parse_date(options['datemax']) - return Commit.objects.filter(**filters) + if options.get('mailinglist'): + return Email.objects.filter(**filters) + else: + return Commit.objects.filter(**filters) def get_title(self, options): - title = 'Git activity' + if options.get('mailinglist'): + title = 'Email activity' + else: + title = 'Git activity' if options.get('username'): title += ' for %s' % options['username'] if options.get('module'): diff --git a/eodb/events/management/commands/feed_emails.py b/eodb/events/management/commands/feed_emails.py new file mode 100644 index 0000000..ff3be87 --- /dev/null +++ b/eodb/events/management/commands/feed_emails.py @@ -0,0 +1,34 @@ +import datetime +import mailbox +import rfc822 +import time + +from django.core.management.base import BaseCommand +from django.utils.dateparse import parse_datetime + +from eodb.events.models import Email + + +class Command(BaseCommand): + + def add_arguments(self, parser): + parser.add_argument('maildir', nargs='+') + + def handle(self, *args, **options): + for maildir in options.get('maildir'): + box = mailbox.Maildir(maildir, create=False) + for message_id in box.iterkeys(): + message = box[message_id] + try: + list_id = message['list-id'].strip('<>').replace('.listes.entrouvert.com', '') + except KeyError: + print 'failed to get list id', message['date'], message['subject'] + continue + author_email = rfc822.parseaddr(message['From'])[1] + author_date = datetime.datetime.fromtimestamp(time.mktime(rfc822.parsedate(message['date']))) + + msg, created = Email.objects.get_or_create(msgid=message_id, + defaults={ + 'list_id': list_id, + 'author_email': author_email, + 'author_datetime': author_date}) diff --git a/eodb/events/management/commands/punchcard.py b/eodb/events/management/commands/punchcard.py index f2511bf..865ffea 100644 --- a/eodb/events/management/commands/punchcard.py +++ b/eodb/events/management/commands/punchcard.py @@ -16,7 +16,7 @@ class Command(GraphCommand): if options.get('committime'): datetime_var = 'commit_datetime' - for commit in self.get_commits(options): + for commit in self.get_events(options): coords = (getattr(commit, datetime_var).weekday(), getattr(commit, datetime_var).hour) infos[coords] = infos[coords] + 1 diff --git a/eodb/events/management/commands/times.py b/eodb/events/management/commands/times.py index 7f8ad0a..28f73b9 100644 --- a/eodb/events/management/commands/times.py +++ b/eodb/events/management/commands/times.py @@ -13,7 +13,7 @@ class Command(GraphCommand): event_dates = [] event_times = [] - for commit in self.get_commits(options): + for commit in self.get_events(options): graph_date = getattr(commit, datetime_var) event_dates.append(matplotlib.dates.date2num(graph_date.date())) event_times.append(graph_date.hour + graph_date.minute / 60. + graph_date.second / 3600) diff --git a/eodb/events/migrations/0002_email.py b/eodb/events/migrations/0002_email.py new file mode 100644 index 0000000..e442759 --- /dev/null +++ b/eodb/events/migrations/0002_email.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-15 12:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('events', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Email', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('msgid', models.CharField(max_length=100, unique=True)), + ('list_id', models.CharField(max_length=100)), + ('author_email', models.CharField(max_length=100)), + ('author_datetime', models.DateTimeField()), + ], + ), + ] diff --git a/eodb/events/models.py b/eodb/events/models.py index 901ab5b..decc169 100644 --- a/eodb/events/models.py +++ b/eodb/events/models.py @@ -8,3 +8,10 @@ class Commit(models.Model): author_email = models.CharField(max_length=100) author_datetime = models.DateTimeField() commit_datetime = models.DateTimeField() + + +class Email(models.Model): + msgid = models.CharField(max_length=100, unique=True) + list_id = models.CharField(max_length=100) + author_email = models.CharField(max_length=100) + author_datetime = models.DateTimeField()