Make it possible to filter talkvote list by status
authorMagnus Hagander <magnus@hagander.net>
Fri, 24 Aug 2018 09:29:15 +0000 (11:29 +0200)
committerMagnus Hagander <magnus@hagander.net>
Fri, 24 Aug 2018 09:29:15 +0000 (11:29 +0200)
postgresqleu/confreg/views.py
template/confreg/sessionvotes.html

index 62d134992863db8c284fcdb6ca2b03e1cc755317..f3544c5fa8a71a40f7794fc1055217fa31c5c72e 100644 (file)
@@ -2091,12 +2091,20 @@ def talkvote(request, confname):
        alltracks.insert(0, {'id': 0, 'trackname': 'No track'})
        alltrackids = [t['id'] for t in alltracks]
        selectedtracks = [int(id) for id in request.GET.getlist('tracks') if int(id) in alltrackids]
+       allstatusids = [id for id,status in STATUS_CHOICES]
+       selectedstatuses = [int(id) for id in request.GET.getlist('statuses') if int(id) in allstatusids]
        if selectedtracks:
                urltrackfilter = "{0}&".format("&".join(["tracks={0}".format(t) for t in selectedtracks]))
        else:
                selectedtracks = alltrackids
                urltrackfilter = ''
 
+       if selectedstatuses:
+               urlstatusfilter = "{0}&".format("&".join(["statuses={0}".format(t) for t in selectedstatuses]))
+       else:
+               selectedstatuses = allstatusids
+               urlstatusfilter = ''
+
        curs = connection.cursor()
 
        order = ""
@@ -2108,10 +2116,11 @@ def talkvote(request, confname):
 
        # Render the form. Need to do this with a manual query, can't figure
        # out the right way to do it with the django ORM.
-       curs.execute("SELECT s.id, s.title, s.status, s.lastnotifiedstatus, s.abstract, s.submissionnote, (SELECT string_agg(spk.fullname, ',') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers, (SELECT string_agg(spk.fullname || '(' || spk.company || ')', ',') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers_full, (SELECT string_agg('####' ||spk.fullname || '\n' || spk.abstract, '\n\n') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers_long, u.username, v.vote, v.comment, avg(v.vote) OVER (PARTITION BY s.id)::numeric(3,2) AS avg, trackname FROM (confreg_conferencesession s CROSS JOIN auth_user u) LEFT JOIN confreg_track track ON track.id=s.track_id LEFT JOIN confreg_conferencesessionvote v ON v.session_id=s.id AND v.voter_id=u.id WHERE s.conference_id=%(confid)s AND u.id IN (SELECT user_id FROM confreg_conference_talkvoters tv WHERE tv.conference_id=%(confid)s) AND (COALESCE(s.track_id,0)=ANY(%(tracks)s)) ORDER BY " + order + "s.title,s.id, u.id=%(userid)s DESC, u.username", {
+       curs.execute("SELECT s.id, s.title, s.status, s.lastnotifiedstatus, s.abstract, s.submissionnote, (SELECT string_agg(spk.fullname, ',') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers, (SELECT string_agg(spk.fullname || '(' || spk.company || ')', ',') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers_full, (SELECT string_agg('####' ||spk.fullname || '\n' || spk.abstract, '\n\n') FROM confreg_speaker spk INNER JOIN confreg_conferencesession_speaker cs ON cs.speaker_id=spk.id WHERE cs.conferencesession_id=s.id) AS speakers_long, u.username, v.vote, v.comment, avg(v.vote) OVER (PARTITION BY s.id)::numeric(3,2) AS avg, trackname FROM (confreg_conferencesession s CROSS JOIN auth_user u) LEFT JOIN confreg_track track ON track.id=s.track_id LEFT JOIN confreg_conferencesessionvote v ON v.session_id=s.id AND v.voter_id=u.id WHERE s.conference_id=%(confid)s AND u.id IN (SELECT user_id FROM confreg_conference_talkvoters tv WHERE tv.conference_id=%(confid)s) AND (COALESCE(s.track_id,0)=ANY(%(tracks)s)) AND status=ANY(%(statuses)s) ORDER BY " + order + "s.title,s.id, u.id=%(userid)s DESC, u.username", {
                        'confid': conference.id,
                        'userid': request.user.id,
                        'tracks': selectedtracks,
+                       'statuses': selectedstatuses,
                        })
 
        def getusernames(all):
@@ -2171,7 +2180,8 @@ def talkvote(request, confname):
                    'status_choices': STATUS_CHOICES,
                    'tracks': alltracks,
                    'selectedtracks': selectedtracks,
-                   'urltrackfilter': urltrackfilter,
+                       'selectedstatuses': selectedstatuses,
+                   'urlfilter': urltrackfilter + urlstatusfilter,
                        'helplink': 'callforpapers',
                        })
 
index c07bdc0908a0c144dc60754e061e63ba5a558889..4ce88ce4321026778c04e075be3e32bc9b400267 100644 (file)
@@ -39,6 +39,9 @@ $(function() {
   $('#selectTracks').selectize({
       plugins: ['remove_button'],
   });
+  $('#selectStatuses').selectize({
+      plugins: ['remove_button'],
+  });
 
   $('#ajaxStatus').hide();
 
@@ -190,6 +193,13 @@ width: 100%;
     <select id="selectTracks" name="tracks" multiple="multiple" style="inline-block; width=80%;">
 {%for t in tracks%}
       <option value="{{t.id}}"{%if t.id in selectedtracks%} SELECTED{%endif%}>{{t.trackname}}</option>
+{%endfor%}
+    </select>
+  </div>
+  <div>
+    <select id="selectStatuses" name="statuses" multiple="multiple" style="inline-block; width=80%;">
+{%for sid,s in status_choices %}
+      <option value="{{sid}}"{%if sid in selectedstatuses%} SELECTED{%endif%}>{{s}}</option>
 {%endfor%}
     </select>
   </div>
@@ -201,12 +211,12 @@ width: 100%;
 
 <table id="votetable" class="table table-bordered table-condensed" style="display:none">
  <tr>
-  <th class="col-md-6"><a href="?{{urltrackfilter}}sort=session">Session</a> | <a href="?{{urltrackfilter}}sort=speakers">Speakers</a></th>
+  <th class="col-md-6"><a href="?{{urlfilter}}sort=session">Session</a> | <a href="?{{urlfilter}}sort=speakers">Speakers</a></th>
   <th>Status</th>
   {%for u in users%}
   <th>{{u}}</th>
   {%endfor%}
-  <th><a href="?{{urltrackfilter}}sort=avg">Average</a></th>
+  <th><a href="?{{urlfilter}}sort=avg">Average</a></th>
   <th>Comments</th>
  </tr>
 {%for s in sessionvotes%}