From ec2f174e5c9d27630a4e7f507761edbdecffbe9c Mon Sep 17 00:00:00 2001 From: Magnus Hagander Date: Sun, 8 Feb 2015 16:54:12 +0100 Subject: [PATCH] Collect and show attachment filenames --- pgcommitfest/commitfest/ajax.py | 3 +- pgcommitfest/commitfest/models.py | 1 + pgcommitfest/commitfest/templates/patch.html | 4 +- .../oneoff/update_attachment_filenames.py | 79 +++++++++++++++++++ 4 files changed, 84 insertions(+), 3 deletions(-) create mode 100755 tools/commitfest/oneoff/update_attachment_filenames.py diff --git a/pgcommitfest/commitfest/ajax.py b/pgcommitfest/commitfest/ajax.py index f489d12..92c4575 100644 --- a/pgcommitfest/commitfest/ajax.py +++ b/pgcommitfest/commitfest/ajax.py @@ -75,7 +75,8 @@ def parse_and_add_attachments(threadinfo, mailthread): defaults={ 'date': t['date'], 'author': t['from'], - 'attachmentid': t['atts'][0], + 'attachmentid': t['atts'][0]['id'], + 'filename': t['atts'][0]['name'], }) # In theory we should remove objects if they don't have an # attachment, but how could that ever happen? Ignore for now. diff --git a/pgcommitfest/commitfest/models.py b/pgcommitfest/commitfest/models.py index f118bc2..124af72 100644 --- a/pgcommitfest/commitfest/models.py +++ b/pgcommitfest/commitfest/models.py @@ -219,6 +219,7 @@ class MailThreadAttachment(models.Model): mailthread = models.ForeignKey(MailThread, null=False, blank=False) messageid = models.CharField(max_length=1000, null=False, blank=False) attachmentid = models.IntegerField(null=False, blank=False) + filename = models.CharField(max_length=1000, null=False, blank=True) date = models.DateTimeField(null=False, blank=False) author = models.CharField(max_length=500, null=False, blank=False) ispatch = models.NullBooleanField() diff --git a/pgcommitfest/commitfest/templates/patch.html b/pgcommitfest/commitfest/templates/patch.html index 7fcf9fd..97ac9b5 100644 --- a/pgcommitfest/commitfest/templates/patch.html +++ b/pgcommitfest/commitfest/templates/patch.html @@ -68,10 +68,10 @@ Latest at {{t.latestmessage}} by {{t.latestauthor|hidemail}}
{%for ta in t.mailthreadattachment_set.all%} {%if forloop.first%} - Latest attachment at {{ta.date}} from {{ta.author|hidemail}} + Latest attachment ({{ta.filename}}) at {{ta.date}} from {{ta.author|hidemail}}
{%endif%} -     Attachment at {{ta.date}} from {{ta.author|hidemail}} (Patch: {{ta.ispatch|yesno:"Yes,No,Pending check"}})
+     Attachment ({{ta.filename}}) at {{ta.date}} from {{ta.author|hidemail}} (Patch: {{ta.ispatch|yesno:"Yes,No,Pending check"}})
{%if forloop.last%}
{%endif%} {%endfor%} diff --git a/tools/commitfest/oneoff/update_attachment_filenames.py b/tools/commitfest/oneoff/update_attachment_filenames.py new file mode 100755 index 0000000..3ee675c --- /dev/null +++ b/tools/commitfest/oneoff/update_attachment_filenames.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# +# update_attachment_filenames.py + +# Go through all old attachments in the system and update the filename based on +# the information in the archives. Required after we added the filename field +# to attachments. +# + +import os +import sys +import socket +import httplib +import magic +import logging + +import simplejson + +# Set up for accessing django +from django.core.management import setup_environ +sys.path.append(os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), '../../../pgcommitfest')) +import settings +setup_environ(settings) + +from django.db import connection + +from commitfest.models import MailThreadAttachment + +if __name__ == "__main__": + debug = "--debug" in sys.argv + + # Logging always done to stdout, but we can turn on/off how much + logging.basicConfig(format='%(asctime)s %(levelname)s: %(msg)s', + level=debug and logging.DEBUG or logging.INFO, + stream=sys.stdout) + + socket.setdefaulttimeout(settings.ARCHIVES_TIMEOUT) + mag = magic.open(magic.MIME) + mag.load() + + logging.info("Fetching attachment filenames from archives") + + for a in MailThreadAttachment.objects.filter(filename=""): + url = "/message-id.json/%s" % a.messageid + logging.debug("Checking attachment %s" % a.attachmentid) + + h = httplib.HTTPConnection(settings.ARCHIVES_SERVER, + settings.ARCHIVES_PORT, + True, + settings.ARCHIVES_TIMEOUT) + h.request('GET', url, headers={ + 'Host': settings.ARCHIVES_HOST, + }) + resp = h.getresponse() + if resp.status != 200: + logging.error("Failed to get %s: %s" % (url, resp.status)) + continue + + contents = resp.read() + resp.close() + h.close() + + obj = simplejson.loads(contents) + + try: + for msg in obj: + for att in msg['atts']: + if att['id'] == a.attachmentid: + print "id %s, att id %s, filename %s" % (a.id, a.attachmentid, att['name']) + a.filename = att['name'] + a.save() + raise StopIteration + logging.error("No match found for attachmentid %s" % a.attachmentid) + except StopIteration: + # Success + pass + + connection.close() + logging.debug("Done.") -- 2.39.5