Skip to content

Commit 220e258

Browse files
committed
Add ability to enter recording URLs for non working group sessions. Fixes ietf-tools#1885. Commit ready for merge.
- Legacy-Id: 11072
1 parent 5c06843 commit 220e258

6 files changed

Lines changed: 35 additions & 91 deletions

File tree

ietf/secr/proceedings/forms.py

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,6 @@
2323
# Forms
2424
#----------------------------------------------------------
2525

26-
class AjaxChoiceField(forms.ChoiceField):
27-
'''
28-
Special ChoiceField to use when populating options with Ajax. The submitted value
29-
is not in the initial choices list so we need to override valid_value().
30-
'''
31-
def valid_value(self, value):
32-
return True
33-
3426
class EditSlideForm(forms.ModelForm):
3527
class Meta:
3628
model = Document
@@ -52,26 +44,14 @@ def clean(self):
5244
return cleaned_data
5345

5446
class RecordingForm(forms.Form):
55-
group = forms.CharField(max_length=40)
5647
external_url = forms.URLField(label='Url')
57-
session = AjaxChoiceField(choices=(('','----'),))
58-
59-
def clean_session(self):
60-
'''
61-
Emulate ModelChoiceField functionality
62-
'''
63-
id = self.cleaned_data.get('session')
64-
try:
65-
return Session.objects.get(id=id)
66-
except Session.DoesNotExist:
67-
raise forms.ValidationError('Invalid Session')
48+
session = forms.ModelChoiceField(queryset=Session.objects,empty_label='')
6849

69-
def clean_group(self):
70-
acronym = self.cleaned_data.get('group')
71-
try:
72-
return Group.objects.get(acronym=acronym)
73-
except Group.DoesNotExist:
74-
raise forms.ValidationError('Invalid group name')
50+
def __init__(self, *args, **kwargs):
51+
self.meeting = kwargs.pop('meeting')
52+
super(RecordingForm, self).__init__(*args,**kwargs)
53+
self.fields['session'].queryset = Session.objects.filter(meeting=self.meeting,
54+
type__in=('session','plenary','other'),status='sched').order_by('group__acronym')
7555

7656
class RecordingEditForm(forms.ModelForm):
7757
class Meta:

ietf/secr/proceedings/proc_utils.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,16 @@ def check_audio_files(group,meeting):
5757
url = 'https://www.ietf.org/audio/ietf{}/{}'.format(meeting.number,os.path.basename(file))
5858
doc = Document.objects.filter(external_url=url).first()
5959
if not doc:
60-
create_recording(session,meeting,group,url)
60+
create_recording(session,url)
6161

6262

63-
def create_recording(session,meeting,group,url):
63+
def create_recording(session,url):
6464
'''
6565
Creates the Document type=recording, setting external_url and creating
6666
NewRevisionDocEvent
6767
'''
68-
sequence = get_next_sequence(group,meeting,'recording')
69-
name = 'recording-{}-{}-{}'.format(meeting.number,group.acronym,sequence)
68+
sequence = get_next_sequence(session.group,session.meeting,'recording')
69+
name = 'recording-{}-{}-{}'.format(session.meeting.number,session.group.acronym,sequence)
7070
time = session.official_timeslotassignment().timeslot.time.strftime('%Y-%m-%d %H:%M')
7171
if url.endswith('mp3'):
7272
title = 'Audio recording for {}'.format(time)
@@ -76,7 +76,7 @@ def create_recording(session,meeting,group,url):
7676
doc = Document.objects.create(name=name,
7777
title=title,
7878
external_url=url,
79-
group=group,
79+
group=session.group,
8080
rev='00',
8181
type_id='recording')
8282
doc.set_state(State.objects.get(type='recording', slug='active'))

ietf/secr/proceedings/urls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
urlpatterns = patterns('ietf.secr.proceedings.views',
44
url(r'^$', 'main', name='proceedings'),
55
url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', 'ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
6-
url(r'^ajax/get-sessions/(?P<meeting_num>\d{1,3})/(?P<acronym>[A-Za-z0-9_\-\+]+)/', 'ajax_get_sessions', name='proceedings_ajax_get_sessions'),
76
url(r'^ajax/order-slide/$', 'ajax_order_slide', name='proceedings_ajax_order_slide'),
87
# special offline URL for testing proceedings build
98
url(r'^build/(?P<meeting_num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/(?P<acronym>[A-Za-z0-9_\-\+]+)/$',

ietf/secr/proceedings/views.py

Lines changed: 5 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -277,33 +277,6 @@ def ajax_generate_proceedings(request, meeting_num):
277277
RequestContext(request,{}),
278278
)
279279

280-
@jsonapi
281-
def ajax_get_sessions(request, meeting_num, acronym):
282-
'''
283-
Ajax function to get session info for group / meeting
284-
returns JSON format response: [{id:session_id, value:session info},...]
285-
If there are no sessions an empty list is returned.
286-
'''
287-
results=[]
288-
try:
289-
meeting = Meeting.objects.get(number=meeting_num)
290-
group = Group.objects.get(acronym=acronym)
291-
except ObjectDoesNotExist:
292-
return results
293-
294-
sessions = Session.objects.filter(meeting=meeting,group=group,status='sched')
295-
296-
# order by time scheduled
297-
sessions = sorted(sessions,key = lambda x: x.official_timeslotassignment().timeslot.time)
298-
299-
for n,session in enumerate(sessions,start=1):
300-
timeslot = session.official_timeslotassignment().timeslot
301-
val = '{}: {} {}'.format(n,timeslot.time.strftime('%m-%d %H:%M'),timeslot.location.name)
302-
d = {'id':session.id, 'value': val}
303-
results.append(d)
304-
305-
return results
306-
307280
@jsonapi
308281
def ajax_order_slide(request):
309282
'''
@@ -629,29 +602,28 @@ def recording(request, meeting_num):
629602
session.
630603
'''
631604
meeting = get_object_or_404(Meeting, number=meeting_num)
632-
sessions = meeting.session_set.filter(type='session',status='sched').order_by('group__acronym')
605+
sessions = meeting.session_set.filter(type__in=('session','plenary','other'),status='sched').order_by('group__acronym')
633606

634607
if request.method == 'POST':
635-
form = RecordingForm(request.POST)
608+
form = RecordingForm(request.POST,meeting=meeting)
636609
if form.is_valid():
637-
group = form.cleaned_data['group']
638610
external_url = form.cleaned_data['external_url']
639611
session = form.cleaned_data['session']
640612

641613
if Document.objects.filter(type='recording',external_url=external_url):
642614
messages.error(request, "Recording already exists")
643615
return redirect('proceedings_recording', meeting_num=meeting_num)
644616
else:
645-
create_recording(session,meeting,group,external_url)
617+
create_recording(session,external_url)
646618

647619
# rebuild proceedings
648-
create_proceedings(meeting,group)
620+
create_proceedings(meeting,session.group)
649621

650622
messages.success(request,'Recording added')
651623
return redirect('proceedings_recording', meeting_num=meeting_num)
652624

653625
else:
654-
form = RecordingForm()
626+
form = RecordingForm(meeting=meeting)
655627

656628
return render_to_response('proceedings/recording.html',{
657629
'meeting':meeting,

ietf/secr/static/secr/js/proceedings-recording.js

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,5 @@
22

33

44
$(document).ready(function() {
5-
// auto populate Session select list
6-
$('#id_group').blur(function(){
7-
var loadUrl = "/secr/proceedings/ajax/get-sessions/";
8-
var url = window.location.pathname;
9-
var parts = url.split("/");
10-
var acronym = $(this).val();
11-
loadUrl = loadUrl+parts[3]+"/"+acronym+"/";
12-
$('.errorlist').remove();
13-
$.getJSON(loadUrl,function(data) {
14-
$('#id_session').find('option').remove();
15-
if (data.length == 0) {
16-
$( '<ul class="errorlist"><li>No sessions found</li></ul>' ).insertBefore( "#id_group" );
17-
} else {
18-
$.each(data,function(i,item) {
19-
$('#id_session').append('<option value="'+item.id+'">'+item.value+'</option>');
20-
});
21-
}
22-
});
23-
});
5+
$('#id_session').select2({ placeholder: 'Type group acronym or part of session name', width: '450px' });;
246
});

ietf/secr/templates/proceedings/recording.html

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55

66
{% block extrastyle %}{{ block.super }}
77
<link rel="stylesheet" type="text/css" href="{% static 'secr/css/jquery-ui-1.11.4.custom.css' %}" />
8+
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
89
{% endblock %}
910

1011
{% block extrahead %}{{ block.super }}
1112
<script type="text/javascript" src="{% static 'secr/js/jquery-ui-1.11.4.custom.min.js' %}"></script>
13+
<script src="{% static 'select2/select2.min.js' %}"></script>
1214
<script type="text/javascript" src="{% static 'secr/js/proceedings-recording.js' %}"></script>
1315
{% endblock %}
1416

@@ -57,21 +59,30 @@ <h2>{{ meeting }} - Recordings</h2>
5759
</tr>
5860
</thead>
5961
<tbody>
62+
6063
{% for session in sessions %}
61-
<tr>
62-
<td>{{ session.group.acronym }}</td>
63-
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
6464
{% if session.recordings %}
65-
<td class="document-name" >{{ session.recordings.0.name }}</td>
66-
<td><a href="{{ session.recordings.first.href }}">{{ session.recordings.0.href }}</a></td>
67-
<td><a href="{% url "proceedings_recording_edit" meeting_num=meeting.number name=session.recordings.0.name %}">Edit</a></td>
65+
{% for recording in session.recordings %}
66+
<tr>
67+
<td>{{ session.group.acronym }}</td>
68+
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
69+
<td class="document-name" >{{ recording.name }}</td>
70+
<td><a href="{{ recording.href }}">{{ recording.href }}</a></td>
71+
<td><a href="{% url "proceedings_recording_edit" meeting_num=meeting.number name=recording.name %}">Edit</a></td>
72+
</tr>
73+
{% endfor %}
6874
{% else %}
75+
<tr>
76+
<td>{{ session.group.acronym }}</td>
77+
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
6978
<td></td>
7079
<td></td>
7180
<td></td>
81+
</tr>
7282
{% endif %}
73-
</tr>
83+
7484
{% endfor %}
85+
7586
</tbody>
7687
</table>
7788
</div> <!-- inline-group -->

0 commit comments

Comments
 (0)