1
1
# -*- coding: utf-8 -*-
2
+
2
3
from __future__ import absolute_import , unicode_literals
3
4
4
5
# Standard Library
15
16
from xlsxwriter .workbook import Workbook
16
17
17
18
# Junction Stuff
18
- from junction .base .constants import ProposalReviewVote , ProposalStatus , ProposalVotesFilter
19
+ from junction .base .constants import (
20
+ ProposalReviewVote ,
21
+ ProposalStatus ,
22
+ ProposalVotesFilter
23
+ )
19
24
from junction .conferences .models import Conference , ConferenceProposalReviewer
20
25
21
26
from .forms import ProposalVotesFilterForm
27
+ from .permissions import is_conference_moderator
28
+
22
29
from .models import (
23
30
Proposal ,
24
31
ProposalComment ,
27
34
ProposalSectionReviewerVoteValue
28
35
)
29
36
37
+ from . import services
38
+
30
39
31
40
@login_required
32
41
@require_http_methods (['GET' ])
33
42
def proposals_dashboard (request , conference_slug ):
34
43
conference = get_object_or_404 (Conference , slug = conference_slug )
35
44
36
- if not request .user . is_superuser :
45
+ if not is_conference_moderator ( user = request .user , conference = conference ) :
37
46
raise PermissionDenied
38
47
39
48
proposals_qs = Proposal .objects .filter (
@@ -128,7 +137,7 @@ def proposals_dashboard(request, conference_slug):
128
137
def reviewer_comments_dashboard (request , conference_slug ):
129
138
conference = get_object_or_404 (Conference , slug = conference_slug )
130
139
131
- if not request .user . is_superuser :
140
+ if not is_conference_moderator ( user = request .user , conference = conference ) :
132
141
raise PermissionDenied
133
142
conference_reviewers = ConferenceProposalReviewer .objects .filter (
134
143
conference = conference , active = True )
@@ -142,7 +151,9 @@ def reviewer_comments_dashboard(request, conference_slug):
142
151
by_conference .setdefault (id , [reviewers .reviewer , 0 ])
143
152
by_conference [id ][1 ] = ProposalComment .objects .filter (
144
153
commenter = reviewers .reviewer ,
145
- deleted = False , private = True ).count ()
154
+ deleted = False , private = True ,
155
+ proposal__status = ProposalStatus .PUBLIC ,
156
+ proposal__conference = conference ).distinct ('proposal' ).count ()
146
157
# by_section is dict with
147
158
# find each reviewers section and their comments
148
159
# Need to rework on this code section to make it 1-2 loops
@@ -181,11 +192,11 @@ def reviewer_comments_dashboard(request, conference_slug):
181
192
182
193
@require_http_methods (['GET' , 'POST' ])
183
194
def reviewer_votes_dashboard (request , conference_slug ):
195
+ conference = get_object_or_404 (Conference , slug = conference_slug )
184
196
185
- if not request .user . is_superuser :
197
+ if not is_conference_moderator ( user = request .user , conference = conference ) :
186
198
raise PermissionDenied
187
199
188
- conference = get_object_or_404 (Conference , slug = conference_slug )
189
200
proposal_sections = conference .proposal_sections .all ()
190
201
proposals_qs = Proposal .objects .select_related (
191
202
'proposal_type' , 'proposal_section' , 'conference' , 'author' ,
@@ -238,7 +249,8 @@ def reviewer_votes_dashboard(request, conference_slug):
238
249
p for p in proposals_qs if p .get_reviewer_votes_count () >= votes ]
239
250
elif votes == ProposalVotesFilter .SORT :
240
251
proposals_qs = sorted (
241
- proposals_qs , key = lambda x : x .get_reviewer_votes_sum (), reverse = True )
252
+ proposals_qs , key = lambda x : x .get_reviewer_votes_sum (),
253
+ reverse = True )
242
254
243
255
for section in proposal_sections :
244
256
section_proposals = [
@@ -256,10 +268,11 @@ def export_reviewer_votes(request, conference_slug):
256
268
"""
257
269
Write reviewer votes to a spreadsheet.
258
270
"""
259
- if not request .user .is_superuser :
271
+ conference = get_object_or_404 (Conference , slug = conference_slug )
272
+
273
+ if not is_conference_moderator (user = request .user , conference = conference ):
260
274
raise PermissionDenied
261
275
262
- conference = get_object_or_404 (Conference , slug = conference_slug )
263
276
proposal_sections = conference .proposal_sections .all ()
264
277
proposals_qs = Proposal .objects .select_related (
265
278
'proposal_type' , 'proposal_section' , 'conference' , 'author' ,
@@ -293,10 +306,12 @@ def export_reviewer_votes(request, conference_slug):
293
306
p .get_reviewer_votes_count (),) + \
294
307
vote_details + (p .get_votes_count (), vote_comment ,)
295
308
if p .get_reviewer_votes_count_by_value (
296
- ProposalSectionReviewerVoteValue .objects .get (vote_value = ProposalReviewVote .NOT_ALLOWED )) > 0 :
309
+ ProposalSectionReviewerVoteValue .objects .get (
310
+ vote_value = ProposalReviewVote .NOT_ALLOWED )) > 0 :
297
311
cell_format = book .add_format ({'bg_color' : 'red' })
298
312
elif p .get_reviewer_votes_count_by_value (
299
- ProposalSectionReviewerVoteValue .objects .get (vote_value = ProposalReviewVote .MUST_HAVE )) > 2 :
313
+ ProposalSectionReviewerVoteValue .objects .get (
314
+ vote_value = ProposalReviewVote .MUST_HAVE )) > 2 :
300
315
cell_format = book .add_format ({'bg_color' : 'green' })
301
316
elif p .get_reviewer_votes_count () < 2 :
302
317
cell_format = book .add_format ({'bg_color' : 'yellow' })
@@ -314,3 +329,19 @@ def export_reviewer_votes(request, conference_slug):
314
329
response ['Content-Disposition' ] = "attachment; filename=junction-{}.xlsx" .format (file_name )
315
330
316
331
return response
332
+
333
+
334
+ @login_required
335
+ @require_http_methods (['GET' ])
336
+ def proposal_state (request , conference_slug ):
337
+ conf = get_object_or_404 (Conference , slug = conference_slug )
338
+
339
+ if not is_conference_moderator (user = request .user , conference = conf ):
340
+ raise PermissionDenied
341
+
342
+ state = request .GET .get ('q' , 'unreviewed' )
343
+ proposals = services .group_proposals_by_reveiew_state (conf = conf , state = state )
344
+ return render (request , 'proposals/review_state.html' ,
345
+ {'conference' : conf ,
346
+ 'proposals' : dict (proposals ),
347
+ 'state' : state .title ()})
0 commit comments