Add ability to enter recording URLs for non working group sessions. Fixes #1885. Commit ready for merge.

- Legacy-Id: 11072
This commit is contained in:
Ryan Cross 2016-04-02 18:50:20 +00:00
parent 5c06843f2c
commit 220e2587b8
6 changed files with 35 additions and 91 deletions

View file

@ -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:

View file

@ -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'))

View file

@ -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<meeting_num>\d{1,3})/$', 'ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
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'),
url(r'^ajax/order-slide/$', 'ajax_order_slide', name='proceedings_ajax_order_slide'),
# special offline URL for testing proceedings build
url(r'^build/(?P<meeting_num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/(?P<acronym>[A-Za-z0-9_\-\+]+)/$',

View file

@ -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,

View file

@ -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) {
$( '<ul class="errorlist"><li>No sessions found</li></ul>' ).insertBefore( "#id_group" );
} else {
$.each(data,function(i,item) {
$('#id_session').append('<option value="'+item.id+'">'+item.value+'</option>');
});
}
});
});
$('#id_session').select2({ placeholder: 'Type group acronym or part of session name', width: '450px' });;
});

View file

@ -5,10 +5,12 @@
{% block extrastyle %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% static 'secr/css/jquery-ui-1.11.4.custom.css' %}" />
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
{% endblock %}
{% block extrahead %}{{ block.super }}
<script type="text/javascript" src="{% static 'secr/js/jquery-ui-1.11.4.custom.min.js' %}"></script>
<script src="{% static 'select2/select2.min.js' %}"></script>
<script type="text/javascript" src="{% static 'secr/js/proceedings-recording.js' %}"></script>
{% endblock %}
@ -57,21 +59,30 @@
</tr>
</thead>
<tbody>
{% for session in sessions %}
<tr>
<td>{{ session.group.acronym }}</td>
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
{% if session.recordings %}
<td class="document-name" >{{ session.recordings.0.name }}</td>
<td><a href="{{ session.recordings.first.href }}">{{ session.recordings.0.href }}</a></td>
<td><a href="{% url "proceedings_recording_edit" meeting_num=meeting.number name=session.recordings.0.name %}">Edit</a></td>
{% for recording in session.recordings %}
<tr>
<td>{{ session.group.acronym }}</td>
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
<td class="document-name" >{{ recording.name }}</td>
<td><a href="{{ recording.href }}">{{ recording.href }}</a></td>
<td><a href="{% url "proceedings_recording_edit" meeting_num=meeting.number name=recording.name %}">Edit</a></td>
</tr>
{% endfor %}
{% else %}
<tr>
<td>{{ session.group.acronym }}</td>
<td>{{ session.official_timeslotassignment.timeslot.time|date:"m-d H:i" }}</td>
<td></td>
<td></td>
<td></td>
</tr>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div> <!-- inline-group -->