[Debconf-video-commits] r390 - package/branches/pycon09/src/pyconvideo/pyconvideo

benh at alioth.debian.org benh at alioth.debian.org
Thu Mar 26 05:37:28 UTC 2009


Author: benh
Date: 2009-03-26 05:37:28 +0000 (Thu, 26 Mar 2009)
New Revision: 390

Added:
   package/branches/pycon09/src/pyconvideo/pyconvideo/review_locked.html
   package/branches/pycon09/src/pyconvideo/pyconvideo/review_target.html
Modified:
   package/branches/pycon09/src/pyconvideo/pyconvideo/review_list_events.html
   package/branches/pycon09/src/pyconvideo/pyconvideo/videorecording_list.html
   package/branches/pycon09/src/pyconvideo/pyconvideo/videotargetfile_list.html
   package/branches/pycon09/src/pyconvideo/pyconvideo/views.py
Log:
Finish review interface. Modulo bugs.


Modified: package/branches/pycon09/src/pyconvideo/pyconvideo/review_list_events.html
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/review_list_events.html	2009-03-26 04:25:50 UTC (rev 389)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/review_list_events.html	2009-03-26 05:37:28 UTC (rev 390)
@@ -12,15 +12,18 @@
       </a>
     </p>
 
+    {% if completed %}
+    <p>Thankyou for reviewing! Now select the next event.</p>
+    {% else %}
     <p>
       Select the event covered by this recording. If the recording
       covers multiple events, review the video again for each event.
     </p>
+    {% endif %}
 
     <form action="review" method="post">
       If the recording does not cover any events, press
-      <input type="hidden" name="file_status" value="D" />
-      <input type="submit" name="submit" value="Delete" />
+      <input type="submit" name="delete" value="Delete" />
     </form>
 
     <table>

Added: package/branches/pycon09/src/pyconvideo/pyconvideo/review_locked.html
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/review_locked.html	                        (rev 0)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/review_locked.html	2009-03-26 05:37:28 UTC (rev 390)
@@ -0,0 +1,13 @@
+<html>
+
+  <head><title>File is locked</title></head>
+
+  <body>
+    <h1>File is locked</h1>
+
+    <p>File: {{ filename }}</p>
+
+    <p>This file is being reviewed by {{ user.get_full_name }}.</p>
+  </body>
+
+</html>

Added: package/branches/pycon09/src/pyconvideo/pyconvideo/review_target.html
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/review_target.html	                        (rev 0)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/review_target.html	2009-03-26 05:37:28 UTC (rev 390)
@@ -0,0 +1,21 @@
+<html>
+
+  <head><title>Review target</title></head>
+
+  <body>
+    <h1>Review target</h1>
+
+    <p>
+      Target:
+      <a href="file://{{ target.target_filename|urlencode }}">
+	{{ target.target_filename }}
+      </a>
+    </p>
+
+    <form action="review" method="POST">
+      {{ form.as_p }}
+      <input type="submit" name="finish" value="Finish review" />
+    </form>
+  </body>
+
+</html>

Modified: package/branches/pycon09/src/pyconvideo/pyconvideo/videorecording_list.html
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/videorecording_list.html	2009-03-26 04:25:50 UTC (rev 389)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/videorecording_list.html	2009-03-26 05:37:28 UTC (rev 390)
@@ -5,6 +5,10 @@
   <body>
     <h1>Video recordings</h1>
 
+    {% if completed %}
+    <p>Thankyou for reviewing! Please select another unclaimed file.</p>
+    {% endif %}
+
     <table>
       <tr>
 	<th>Start time</th>
@@ -32,12 +36,12 @@
 	  {% endfor %}
 	  {% if recording.locked_by %}
 	  {% ifequal recording.locked_by user %}
-	  <form action="{{ recording.id }}/review" method="post">
+	  <form action="/recording/{{ recording.id }}/review" method="post">
 	    <input type="submit" name="submit" value="Continue review" />
 	  </form>
 	  {% endifequal %}
 	  {% else %}
-	  <form action="{{ recording.id }}/review" method="post">
+	  <form action="/recording/{{ recording.id }}/review" method="post">
 	    <input type="submit" name="submit" value="Review" />
 	  </form>
 	  {% endif %}

Modified: package/branches/pycon09/src/pyconvideo/pyconvideo/videotargetfile_list.html
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/videotargetfile_list.html	2009-03-26 04:25:50 UTC (rev 389)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/videotargetfile_list.html	2009-03-26 05:37:28 UTC (rev 390)
@@ -5,6 +5,10 @@
   <body>
     <h1>Target files</h1>
 
+    {% if completed %}
+    <p>Thankyou for reviewing! Please select another unclaimed file.</p>
+    {% endif %}
+
     <table>
       <tr>
 	<th>Event</th>
@@ -22,12 +26,12 @@
 	<td class="status-{{ target.status.status_code }}">
 	  {% if target.locked_by %}
 	  {% ifequal target.locked_by user %}
-	  <form action="{{ target.id }}/review" method="post">
+	  <form action="/target/{{ target.id }}/review" method="post">
 	    <input type="submit" name="submit" value="Continue review" />
 	  </form>
 	  {% endifequal %}
 	  {% else %}
-	  <form action="{{ target.id }}/review" method="post">
+	  <form action="/target/{{ target.id }}/review" method="post">
 	    <input type="submit" name="submit" value="Review" />
 	  </form>
 	  {% endif %}

Modified: package/branches/pycon09/src/pyconvideo/pyconvideo/views.py
===================================================================
--- package/branches/pycon09/src/pyconvideo/pyconvideo/views.py	2009-03-26 04:25:50 UTC (rev 389)
+++ package/branches/pycon09/src/pyconvideo/pyconvideo/views.py	2009-03-26 05:37:28 UTC (rev 390)
@@ -15,10 +15,11 @@
     value = unicode(re.sub('[^\w\s_]', '', value).strip())
     return defaultfilters.mark_safe(re.sub('[_\s]+', '_', value))
 
-def list_recordings(request):
+def list_recordings(request, completed=False):
     return render_to_response(
         'pyconvideo/videorecording_list.html',
-        {'object_list':
+        {'completed': completed,
+         'object_list':
              models.VideoRecording.objects.all().order_by('recording_time').select_related(),
          'user': request.user})
 
@@ -37,11 +38,18 @@
                 return mx.DateTime.DateTimeDelta(0, hours, minutes, seconds)
         raise forms.ValidationError('%s is not a valid time' % value)
 
+class FileStatusField(forms.ChoiceField):
+    def __init__(self):
+        forms.ChoiceField.__init__(
+            self,
+            choices=(models.VideoFileStatus.objects
+                     .exclude(file_status_code='D')
+                     .exclude(file_status_code='X')
+                     .values_list('file_status_code', 'file_status_desc')),
+            widget=forms.RadioSelect)
+
 class RecordingReviewForm(forms.Form):
-    file_status = forms.ChoiceField(
-        choices=models.VideoFileStatus.objects.values_list('file_status_code',
-                                                           'file_status_desc'),
-        widget=forms.RadioSelect)
+    file_status = FileStatusField()
     start_time = IntervalField()
     end_time = IntervalField()
     base_name = forms.CharField()
@@ -51,6 +59,7 @@
 @transaction.commit_on_success
 def review_recording(request, recording_id):
     recording = get_object_or_404(models.VideoRecording, pk=recording_id)
+    completed = False
 
     # lock or fail
     if not recording.locked_by:
@@ -65,14 +74,40 @@
 
     event_id = request.POST.get('event')
     event = event_id and models.Event.objects.get(event_id=event_id)
-    file_status = request.POST.get('file_status')
 
-    if (event and file_status) or file_status == 'D':
+    if request.POST.get('finish') or request.POST.get('continue'):
         # process review
         form = RecordingReviewForm(request.POST)
         if form.is_valid():
-            # TODO
-            pass
+            recording.file_status = \
+                models.VideoFileStatus.objects.get(
+                file_status_code=form.file_status)
+            if request.POST.get('finish'):
+                recording.locked_by = None
+            recording.save()
+            event_recording = models.VideoEventRecording(
+                event=event, recording=recording,
+                start_time=form.start_time, end_time=form.end_time,
+                event_recording_base_name=form.base_name)
+            event_recording.save()
+            if request.POST.get('finish'):
+                return list_recordings(request, completed=True)
+            else:
+                # go back to the list of events, but acknowledge
+                # completion
+                completed = True
+        else:
+            # try again
+            return render_to_response('pyconvideo/review_event_recording.html',
+                                      {'recording': recording,
+                                       'event': event,
+                                       'form': form})
+    elif request.POST.get('delete'):
+        recording.file_status = \
+            models.VideoFileStatus.objects.get(file_status_code='D')
+        recording.locked_by = None
+        recording.save()
+        return list_recordings(request, completed=True)
     elif event:
         # show main form
         defaults = {'file_status': recording.file_status.file_status_code,
@@ -83,19 +118,20 @@
                                   {'recording': recording,
                                    'event': event,
                                    'form': RecordingReviewForm(defaults)})
-    else:
-        # list events for association
-        events = models.Event.objects
-        events = events.extra(
-            select={'proximity':
-                        "abs(date_part('epoch', age(event.start_time, %s)))"},
-            select_params=[recording.recording_time],
-            order_by=['proximity'])
-        events = events.all()
-        return render_to_response('pyconvideo/review_list_events.html',
-                                  {'recording': recording,
-                                   'events': events})
 
+    # list events for association
+    events = models.Event.objects
+    events = events.extra(
+        select={'proximity':
+                    "abs(date_part('epoch', age(event.start_time, %s)))"},
+        select_params=[recording.recording_time],
+        order_by=['proximity'])
+    events = events.all()
+    return render_to_response('pyconvideo/review_list_events.html',
+                              {'completed': completed,
+                               'recording': recording,
+                               'events': events})
+
 def list_targets(request):
     sources = models.VideoEventRecording.objects.all().select_related()
     formats = models.VideoTargetFormat.objects.all()
@@ -114,6 +150,10 @@
                                'formats': formats,
                                'user': request.user})
 
+class TargetReviewForm(forms.Form):
+    file_status = FileStatusField()
+    comments = forms.CharField(required=False, widget=forms.Textarea)
+
 @login_required
 @transaction.commit_on_success
 def review_target(request, target_id):
@@ -129,3 +169,25 @@
                                    'user': target.locked_by})
     else:
         return render_to_response('pyconvideo/review_locked.html')
+
+    if request.POST.get('finish'):
+        # process review
+        form = TargetReviewForm(request.POST)
+        if form.is_valid():
+            target.file_status = \
+                models.VideoFileStatus.objects.get(
+                file_status_code=form.file_status)
+            target.locked_by = None
+            target.save()
+            return list_targets(request, completed=True)
+        else:
+            # try again
+            return render_to_response('pyconvideo/review_target.html',
+                                      {'target': target,
+                                       'form': form})
+    else:
+        # show form
+        defaults = {'file_status': target.file_status.file_status_code}
+        return render_to_response('pyconvideo/review_target.html',
+                                  {'target': target,
+                                   'form': TargetReviewForm(defaults)})




More information about the Debconf-video-commits mailing list