diff --git a/ietf/api/tests.py b/ietf/api/tests.py index 2fae6882c..24bdc74d6 100644 --- a/ietf/api/tests.py +++ b/ietf/api/tests.py @@ -2,6 +2,7 @@ import os import sys import json from importlib import import_module +from mock import patch from django.apps import apps from django.test import Client @@ -23,7 +24,8 @@ OMITTED_APPS = ( ) class CustomApiTestCase(TestCase): - def test_notify_meeting_import_audio_files(self): + @patch('ietf.secr.proceedings.proc_utils.import_youtube_video_urls') + def test_notify_meeting_import_audio_files(self, mock_import): meeting = make_meeting_test_data() client = Client(Accept='application/json') # try invalid method GET diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index d20275259..363282791 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -80,13 +80,14 @@ class InterimSessionInlineFormSet(BaseInlineFormSet): if date: dates.append(date) if len(dates) < 2: - return + return self.cleaned_data dates.sort() last_date = dates[0] for date in dates[1:]: - if last_date.day + 1 != date.day: + if last_date + datetime.timedelta(days=1) != date: raise forms.ValidationError('For Multi-Day meetings, days must be consecutive') last_date = date + return self.cleaned_data class InterimMeetingModelForm(forms.ModelForm): group = GroupModelChoiceField(queryset=Group.objects.filter(type__in=('wg', 'rg'), state__in=('active', 'proposed', 'bof')).order_by('acronym'), required=False) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index df7ccc8bf..dfb102416 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -970,7 +970,6 @@ class InterimTests(TestCase): 'session_set-INITIAL_FORMS':0} r = self.client.post(urlreverse("ietf.meeting.views.interim_request"),data) - self.assertRedirects(r,urlreverse('ietf.meeting.views.upcoming')) meeting = Meeting.objects.order_by('id').last() self.assertEqual(meeting.type_id,'interim') diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 74157e2e7..0d0ca4ca9 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -58,7 +58,8 @@ from ietf.meeting.helpers import send_interim_approval_request from ietf.meeting.helpers import send_interim_announcement_request from ietf.meeting.utils import finalize from ietf.secr.proceedings.utils import handle_upload_file -from ietf.secr.proceedings.proc_utils import get_progress_stats, post_process, import_audio_files +from ietf.secr.proceedings.proc_utils import (get_progress_stats, post_process, import_audio_files, + import_youtube_video_urls) from ietf.utils import log from ietf.utils.mail import send_mail_message from ietf.utils.pipe import pipe @@ -2173,6 +2174,7 @@ def api_import_recordings(request, number): if request.method == 'POST': meeting = get_meeting(number) import_audio_files(meeting) + import_youtube_video_urls(meeting) return HttpResponse(status=201) else: return HttpResponse(status=405) diff --git a/ietf/secr/proceedings/proc_utils.py b/ietf/secr/proceedings/proc_utils.py index 6e25388fd..bd521c63f 100644 --- a/ietf/secr/proceedings/proc_utils.py +++ b/ietf/secr/proceedings/proc_utils.py @@ -3,16 +3,19 @@ proc_utils.py This module contains all the functions for generating static proceedings pages ''' -from urllib2 import urlopen import datetime import glob +import httplib2 import os import re import shutil import subprocess +import urllib2 +from urllib import urlencode import debug # pyflakes:ignore +from apiclient.discovery import build from django.conf import settings from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -34,10 +37,84 @@ from ietf.utils.log import log from ietf.utils.mail import send_mail AUDIO_FILE_RE = re.compile(r'ietf(?P[\d]+)-(?P.*)-(?P