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:
parent
5c06843f2c
commit
220e2587b8
|
@ -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:
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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_\-\+]+)/$',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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' });;
|
||||
});
|
||||
|
|
|
@ -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 -->
|
||||
|
|
Loading…
Reference in a new issue