From 084f8a7495e22c1de9a462889955b6404adf7020 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Fri, 10 Mar 2017 23:04:06 +0000 Subject: [PATCH] Refactor session audio file import. Add informative email. Fixes #2164. Commit ready for merge - Legacy-Id: 12990 --- .../0048_import_shared_audio_files.py | 43 ++++++ ietf/meeting/utils.py | 2 + ietf/secr/proceedings/proc_utils.py | 133 +++++++++++++----- ietf/secr/proceedings/tests.py | 119 +++++++++++++++- .../proceedings/audio_import_warning.txt | 9 ++ ietf/settings.py | 3 +- 6 files changed, 274 insertions(+), 35 deletions(-) create mode 100644 ietf/meeting/migrations/0048_import_shared_audio_files.py create mode 100644 ietf/secr/templates/proceedings/audio_import_warning.txt diff --git a/ietf/meeting/migrations/0048_import_shared_audio_files.py b/ietf/meeting/migrations/0048_import_shared_audio_files.py new file mode 100644 index 000000000..3859491b6 --- /dev/null +++ b/ietf/meeting/migrations/0048_import_shared_audio_files.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.5 on 2017-03-07 11:59 +from __future__ import unicode_literals + +import os + +from django.db import migrations +from ietf.secr.proceedings.proc_utils import import_audio_files + + +def purge_missing_files(apps, meeting): + Document = apps.get_model('doc', 'Document') + url = 'https://www.ietf.org/audio/ietf{}'.format(meeting.number) + documents = Document.objects.filter(external_url__startswith=url) + for document in documents: + filename = document.external_url.split('/')[-1] + if not os.path.exists(os.path.join('/a/www/audio/ietf{}'.format(meeting.number),filename)): + print "Removing missing recording: {} ({})".format(filename,document.pk) + document.delete() + +def forward(apps, schema_editor): + Meeting = apps.get_model('meeting', 'Meeting') + Document = apps.get_model('doc', 'Document') + for meeting in Meeting.objects.filter(number__in=range(94,98)): + print '\nMeeting #{}:'.format(meeting.number) + purge_missing_files(apps, meeting) + before = Document.objects.filter(type='recording').count() + import_audio_files(meeting) + after = Document.objects.filter(type='recording').count() + print ' {} Documents Added'.format(after - before) + +def backward(apps, schema_editor): + pass + +class Migration(migrations.Migration): + + dependencies = [ + ('meeting', '0047_fix_shared_timeslot_audio'), + ] + + operations = [ + migrations.RunPython(forward, backward) + ] diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 632a9338a..fbafc839c 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -9,6 +9,7 @@ from django.template.loader import render_to_string from ietf.dbtemplate.models import DBTemplate from ietf.meeting.models import Session from ietf.group.utils import can_manage_materials +from ietf.secr.proceedings.proc_utils import import_audio_files def group_sessions(sessions): @@ -120,6 +121,7 @@ def finalize(meeting): sp.rev = '00' sp.save() + import_audio_files(meeting) create_proceedings_templates(meeting) meeting.proceedings_final = True meeting.save() diff --git a/ietf/secr/proceedings/proc_utils.py b/ietf/secr/proceedings/proc_utils.py index b9d98e4a7..b931fdbbe 100644 --- a/ietf/secr/proceedings/proc_utils.py +++ b/ietf/secr/proceedings/proc_utils.py @@ -7,21 +7,23 @@ from urllib2 import urlopen import datetime import glob import os +import re import shutil import subprocess import debug # pyflakes:ignore from django.conf import settings +from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest from django.shortcuts import render_to_response, render from django.db.utils import ConnectionDoesNotExist -from ietf.doc.models import Document, RelatedDocument, DocEvent, NewRevisionDocEvent, State +from ietf.doc.models import Document, DocAlias, RelatedDocument, DocEvent, NewRevisionDocEvent, State from ietf.group.models import Group, Role from ietf.group.utils import get_charter_text from ietf.meeting.helpers import get_schedule -from ietf.meeting.models import Session, Meeting, SchedTimeSessAssignment, SessionPresentation +from ietf.meeting.models import Session, Meeting, SchedTimeSessAssignment, SessionPresentation, TimeSlot from ietf.person.models import Person from ietf.secr.proceedings.models import InterimMeeting # proxy model from ietf.secr.proceedings.models import Registration @@ -29,36 +31,86 @@ from ietf.secr.utils.document import get_rfc_num from ietf.secr.utils.group import groups_by_session from ietf.secr.utils.meeting import get_proceedings_path, get_materials, get_session from ietf.utils.log import log +from ietf.utils.mail import send_mail + +AUDIO_FILE_RE = re.compile(r'ietf(?P[\d]+)-(?P.*)-(?P