From 220e2587b85a9dbec7771855f992ca8a454b8730 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Sat, 2 Apr 2016 18:50:20 +0000 Subject: [PATCH] Add ability to enter recording URLs for non working group sessions. Fixes #1885. Commit ready for merge. - Legacy-Id: 11072 --- ietf/secr/proceedings/forms.py | 32 +++------------- ietf/secr/proceedings/proc_utils.py | 10 ++--- ietf/secr/proceedings/urls.py | 1 - ietf/secr/proceedings/views.py | 38 +++---------------- .../static/secr/js/proceedings-recording.js | 20 +--------- .../secr/templates/proceedings/recording.html | 25 ++++++++---- 6 files changed, 35 insertions(+), 91 deletions(-) diff --git a/ietf/secr/proceedings/forms.py b/ietf/secr/proceedings/forms.py index 37161b011..daf846da6 100644 --- a/ietf/secr/proceedings/forms.py +++ b/ietf/secr/proceedings/forms.py @@ -23,14 +23,6 @@ VALID_BLUESHEET_EXTENSIONS = ('.pdf','.jpg','.jpeg') # Forms #---------------------------------------------------------- -class AjaxChoiceField(forms.ChoiceField): - ''' - Special ChoiceField to use when populating options with Ajax. The submitted value - is not in the initial choices list so we need to override valid_value(). - ''' - def valid_value(self, value): - return True - class EditSlideForm(forms.ModelForm): class Meta: model = Document @@ -52,26 +44,14 @@ class InterimMeetingForm(forms.Form): return cleaned_data class RecordingForm(forms.Form): - group = forms.CharField(max_length=40) external_url = forms.URLField(label='Url') - session = AjaxChoiceField(choices=(('','----'),)) + session = forms.ModelChoiceField(queryset=Session.objects,empty_label='') - def clean_session(self): - ''' - Emulate ModelChoiceField functionality - ''' - id = self.cleaned_data.get('session') - try: - return Session.objects.get(id=id) - except Session.DoesNotExist: - raise forms.ValidationError('Invalid Session') - - def clean_group(self): - acronym = self.cleaned_data.get('group') - try: - return Group.objects.get(acronym=acronym) - except Group.DoesNotExist: - raise forms.ValidationError('Invalid group name') + def __init__(self, *args, **kwargs): + self.meeting = kwargs.pop('meeting') + super(RecordingForm, self).__init__(*args,**kwargs) + self.fields['session'].queryset = Session.objects.filter(meeting=self.meeting, + type__in=('session','plenary','other'),status='sched').order_by('group__acronym') class RecordingEditForm(forms.ModelForm): class Meta: diff --git a/ietf/secr/proceedings/proc_utils.py b/ietf/secr/proceedings/proc_utils.py index 37a732daf..feabd82d5 100644 --- a/ietf/secr/proceedings/proc_utils.py +++ b/ietf/secr/proceedings/proc_utils.py @@ -57,16 +57,16 @@ def check_audio_files(group,meeting): url = 'https://www.ietf.org/audio/ietf{}/{}'.format(meeting.number,os.path.basename(file)) doc = Document.objects.filter(external_url=url).first() if not doc: - create_recording(session,meeting,group,url) + create_recording(session,url) -def create_recording(session,meeting,group,url): +def create_recording(session,url): ''' Creates the Document type=recording, setting external_url and creating NewRevisionDocEvent ''' - sequence = get_next_sequence(group,meeting,'recording') - name = 'recording-{}-{}-{}'.format(meeting.number,group.acronym,sequence) + sequence = get_next_sequence(session.group,session.meeting,'recording') + name = 'recording-{}-{}-{}'.format(session.meeting.number,session.group.acronym,sequence) time = session.official_timeslotassignment().timeslot.time.strftime('%Y-%m-%d %H:%M') if url.endswith('mp3'): title = 'Audio recording for {}'.format(time) @@ -76,7 +76,7 @@ def create_recording(session,meeting,group,url): doc = Document.objects.create(name=name, title=title, external_url=url, - group=group, + group=session.group, rev='00', type_id='recording') doc.set_state(State.objects.get(type='recording', slug='active')) diff --git a/ietf/secr/proceedings/urls.py b/ietf/secr/proceedings/urls.py index f7fdd2db2..a67fda3d5 100644 --- a/ietf/secr/proceedings/urls.py +++ b/ietf/secr/proceedings/urls.py @@ -3,7 +3,6 @@ from django.conf.urls import patterns, url urlpatterns = patterns('ietf.secr.proceedings.views', url(r'^$', 'main', name='proceedings'), url(r'^ajax/generate-proceedings/(?P\d{1,3})/$', 'ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'), - url(r'^ajax/get-sessions/(?P\d{1,3})/(?P[A-Za-z0-9_\-\+]+)/', 'ajax_get_sessions', name='proceedings_ajax_get_sessions'), url(r'^ajax/order-slide/$', 'ajax_order_slide', name='proceedings_ajax_order_slide'), # special offline URL for testing proceedings build url(r'^build/(?P\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/(?P[A-Za-z0-9_\-\+]+)/$', diff --git a/ietf/secr/proceedings/views.py b/ietf/secr/proceedings/views.py index aacfec18f..22ccb69c4 100644 --- a/ietf/secr/proceedings/views.py +++ b/ietf/secr/proceedings/views.py @@ -277,33 +277,6 @@ def ajax_generate_proceedings(request, meeting_num): RequestContext(request,{}), ) -@jsonapi -def ajax_get_sessions(request, meeting_num, acronym): - ''' - Ajax function to get session info for group / meeting - returns JSON format response: [{id:session_id, value:session info},...] - If there are no sessions an empty list is returned. - ''' - results=[] - try: - meeting = Meeting.objects.get(number=meeting_num) - group = Group.objects.get(acronym=acronym) - except ObjectDoesNotExist: - return results - - sessions = Session.objects.filter(meeting=meeting,group=group,status='sched') - - # order by time scheduled - sessions = sorted(sessions,key = lambda x: x.official_timeslotassignment().timeslot.time) - - for n,session in enumerate(sessions,start=1): - timeslot = session.official_timeslotassignment().timeslot - val = '{}: {} {}'.format(n,timeslot.time.strftime('%m-%d %H:%M'),timeslot.location.name) - d = {'id':session.id, 'value': val} - results.append(d) - - return results - @jsonapi def ajax_order_slide(request): ''' @@ -629,12 +602,11 @@ def recording(request, meeting_num): session. ''' meeting = get_object_or_404(Meeting, number=meeting_num) - sessions = meeting.session_set.filter(type='session',status='sched').order_by('group__acronym') + sessions = meeting.session_set.filter(type__in=('session','plenary','other'),status='sched').order_by('group__acronym') if request.method == 'POST': - form = RecordingForm(request.POST) + form = RecordingForm(request.POST,meeting=meeting) if form.is_valid(): - group = form.cleaned_data['group'] external_url = form.cleaned_data['external_url'] session = form.cleaned_data['session'] @@ -642,16 +614,16 @@ def recording(request, meeting_num): messages.error(request, "Recording already exists") return redirect('proceedings_recording', meeting_num=meeting_num) else: - create_recording(session,meeting,group,external_url) + create_recording(session,external_url) # rebuild proceedings - create_proceedings(meeting,group) + create_proceedings(meeting,session.group) messages.success(request,'Recording added') return redirect('proceedings_recording', meeting_num=meeting_num) else: - form = RecordingForm() + form = RecordingForm(meeting=meeting) return render_to_response('proceedings/recording.html',{ 'meeting':meeting, diff --git a/ietf/secr/static/secr/js/proceedings-recording.js b/ietf/secr/static/secr/js/proceedings-recording.js index e861a2ae6..64cf9503e 100644 --- a/ietf/secr/static/secr/js/proceedings-recording.js +++ b/ietf/secr/static/secr/js/proceedings-recording.js @@ -2,23 +2,5 @@ $(document).ready(function() { - // auto populate Session select list - $('#id_group').blur(function(){ - var loadUrl = "/secr/proceedings/ajax/get-sessions/"; - var url = window.location.pathname; - var parts = url.split("/"); - var acronym = $(this).val(); - loadUrl = loadUrl+parts[3]+"/"+acronym+"/"; - $('.errorlist').remove(); - $.getJSON(loadUrl,function(data) { - $('#id_session').find('option').remove(); - if (data.length == 0) { - $( '
  • No sessions found
' ).insertBefore( "#id_group" ); - } else { - $.each(data,function(i,item) { - $('#id_session').append(''); - }); - } - }); - }); + $('#id_session').select2({ placeholder: 'Type group acronym or part of session name', width: '450px' });; }); diff --git a/ietf/secr/templates/proceedings/recording.html b/ietf/secr/templates/proceedings/recording.html index 3918eee04..99352903f 100755 --- a/ietf/secr/templates/proceedings/recording.html +++ b/ietf/secr/templates/proceedings/recording.html @@ -5,10 +5,12 @@ {% block extrastyle %}{{ block.super }} + {% endblock %} {% block extrahead %}{{ block.super }} + {% endblock %} @@ -57,21 +59,30 @@ + {% for session in sessions %} - - {{ session.group.acronym }} - {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} {% if session.recordings %} - {{ session.recordings.0.name }} - {{ session.recordings.0.href }} - Edit + {% for recording in session.recordings %} + + {{ session.group.acronym }} + {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} + {{ recording.name }} + {{ recording.href }} + Edit + + {% endfor %} {% else %} + + {{ session.group.acronym }} + {{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }} + {% endif %} - + {% endfor %} +