Skip to content

Commit c32035b

Browse files
committed
Add sort option based on proposal selection
1 parent 51dc483 commit c32035b

File tree

4 files changed

+106
-39
lines changed

4 files changed

+106
-39
lines changed

junction/base/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class ProposalVotesFilter:
8282
_MIN_ONE_VOTE = [1, "Minimum 1 vote"]
8383
_SORT_BY_SUM = [2, "Sort by total votes"]
8484
_SORT_BY_REVIEWER = [3, "Sort by your votes"]
85+
_SORT_BY_SELECTION = [4, "Sort by selection"]
8586

8687

8788
class ConferenceSettingConstants:

junction/proposals/dashboard.py

Lines changed: 3 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
from .forms import ProposalVotesFilterForm
2727
from .permissions import is_conference_moderator
28-
28+
from .utils import _sort_proposals_for_dashboard
2929
from .models import (
3030
Proposal,
3131
ProposalComment,
@@ -193,7 +193,7 @@ def reviewer_comments_dashboard(request, conference_slug):
193193
@require_http_methods(['GET', 'POST'])
194194
def reviewer_votes_dashboard(request, conference_slug):
195195
conference = get_object_or_404(Conference, slug=conference_slug)
196-
196+
user = request.user
197197
if not is_conference_moderator(user=request.user, conference=conference):
198198
raise PermissionDenied
199199

@@ -226,43 +226,8 @@ def reviewer_votes_dashboard(request, conference_slug):
226226
'errors': form.errors})
227227

228228
# Valid form
229-
cps = form.cleaned_data['proposal_section']
230-
cpt = form.cleaned_data['proposal_type']
231-
votes = form.cleaned_data['votes']
232-
review_status = form.cleaned_data['review_status']
233-
proposal_sections = conference.proposal_sections.all()
234229

235-
if cps != 'all':
236-
proposal_sections = ProposalSection.objects.filter(pk=cps)
237-
if cpt != 'all':
238-
proposals_qs = proposals_qs.filter(proposal_type__id__in=cpt)
239-
if votes != 'all':
240-
votes = int(votes)
241-
if review_status != 'all':
242-
proposals_qs = proposals_qs.filter(review_status=review_status)
243-
244-
if votes == ProposalVotesFilter.NO_VOTES:
245-
proposals_qs = [
246-
p for p in proposals_qs if p.get_reviewer_votes_count() == votes]
247-
elif votes == ProposalVotesFilter.MIN_ONE_VOTE:
248-
proposals_qs = [
249-
p for p in proposals_qs if p.get_reviewer_votes_count() >= votes]
250-
elif votes == ProposalVotesFilter.SORT_BY_REVIEWER:
251-
proposals_qs = sorted(
252-
proposals_qs,
253-
key=lambda x: x.get_reviewer_vote_value(reviewer=request.user),
254-
reverse=True,
255-
)
256-
elif votes == ProposalVotesFilter.SORT_BY_SUM:
257-
proposals_qs = sorted(
258-
proposals_qs, key=lambda x: x.get_reviewer_votes_sum(),
259-
reverse=True)
260-
proposals = [s_items('', proposals_qs)]
261-
262-
if votes != ProposalVotesFilter.SORT_BY_SUM:
263-
for section in proposal_sections:
264-
section_proposals = [p for p in proposals_qs if p.proposal_section == section]
265-
proposals.append(s_items(section, section_proposals))
230+
proposals = _sort_proposals_for_dashboard(conference, proposals_qs, user, form)
266231

267232
return render(request, 'proposals/votes-dashboard.html',
268233
{'conference': conference,

junction/proposals/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
from simple_history.models import HistoricalRecords
1616

1717
# Junction Stuff
18-
from junction.base.constants import ProposalReviewStatus, ProposalStatus, ProposalTargetAudience, ProposalUserVoteRole
18+
from junction.base.constants import ProposalReviewStatus, ProposalStatus, ProposalTargetAudience, ProposalUserVoteRole, \
19+
ProposalReviewVote
1920
from junction.base.models import AuditModel, TimeAuditModel
2021
from junction.conferences.models import Conference, ConferenceProposalReviewer
2122

@@ -202,6 +203,12 @@ def get_reviewers_count(self):
202203
proposal_section=self.proposal_section
203204
).count()
204205

206+
def has_negative_votes(self):
207+
""" Show sum of reviewer votes for given vote value. """
208+
return ProposalSectionReviewerVote.objects.filter(
209+
proposal=self, vote_value__vote_value=ProposalReviewVote.NOT_ALLOWED,
210+
).count() > 0
211+
205212
class Meta:
206213
unique_together = ("conference", "slug")
207214

junction/proposals/utils.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import collections
2+
3+
from junction.base.constants import ProposalReviewVote, ProposalVotesFilter
4+
from junction.proposals.models import ProposalSection
5+
6+
7+
def _sort_proposals_for_dashboard(conference, proposals_qs, user, form):
8+
"""
9+
"""
10+
cps = form.cleaned_data['proposal_section']
11+
cpt = form.cleaned_data['proposal_type']
12+
votes = form.cleaned_data['votes']
13+
review_status = form.cleaned_data['review_status']
14+
15+
proposal_sections = conference.proposal_sections.all()
16+
s_items = collections.namedtuple('section_items', 'section proposals')
17+
proposals = []
18+
19+
if cps != 'all':
20+
proposal_sections = ProposalSection.objects.filter(pk=cps)
21+
if cpt != 'all':
22+
proposals_qs = proposals_qs.filter(proposal_type__id__in=cpt)
23+
if votes != 'all':
24+
votes = int(votes)
25+
if review_status != 'all':
26+
proposals_qs = proposals_qs.filter(review_status=review_status)
27+
28+
if votes == ProposalVotesFilter.NO_VOTES:
29+
proposals_qs = [
30+
p for p in proposals_qs if p.get_reviewer_votes_count() == votes]
31+
elif votes == ProposalVotesFilter.MIN_ONE_VOTE:
32+
proposals_qs = [
33+
p for p in proposals_qs if p.get_reviewer_votes_count() >= votes]
34+
elif votes == ProposalVotesFilter.SORT_BY_REVIEWER:
35+
proposals_qs = sorted(
36+
proposals_qs,
37+
key=lambda x: x.get_reviewer_vote_value(reviewer=user),
38+
reverse=True,
39+
)
40+
elif votes == ProposalVotesFilter.SORT_BY_SUM:
41+
proposals_qs = sorted(
42+
proposals_qs, key=lambda x: x.get_reviewer_votes_sum(),
43+
reverse=True)
44+
proposals = [s_items('', proposals_qs)]
45+
46+
elif votes == ProposalVotesFilter.SORT_BY_SELECTION:
47+
# Selection of proposal is based on conference guidelines.
48+
# More info is available at http://tiny.cc/qzo5cy
49+
50+
proposals_qs = [p for p in proposals_qs if not p.has_negative_votes()]
51+
proposals_qs = sorted(proposals_qs, key=lambda x: x.get_reviewer_votes_sum(), reverse=True)
52+
53+
selected = [p for p in proposals_qs if p.get_reviewer_votes_count_by_value(ProposalReviewVote.MUST_HAVE) > 1]
54+
proposals.append(s_items('Selected', selected))
55+
56+
batches = []
57+
58+
batch1 = [p for p in proposals_qs
59+
if p.get_reviewer_votes_count_by_value(ProposalReviewVote.MUST_HAVE) > 0 and
60+
p.get_reviewer_votes_count_by_value(ProposalReviewVote.GOOD) > 1]
61+
proposals.append(s_items('Batch 1', batch1))
62+
batches += batch1
63+
64+
batch2 = [p for p in proposals_qs
65+
if p.get_reviewer_votes_count_by_value(ProposalReviewVote.MUST_HAVE) > 0 and
66+
p.get_reviewer_votes_count_by_value(ProposalReviewVote.GOOD) > 0 and
67+
p not in batches]
68+
proposals.append(s_items('Batch 2', batch2))
69+
batches += batch2
70+
71+
batch3 = [p for p in proposals_qs
72+
if p.get_reviewer_votes_count_by_value(ProposalReviewVote.GOOD) > 1 and
73+
p not in batches]
74+
proposals.append(s_items('Batch 3', batch3))
75+
batches += batch3
76+
77+
batch4 = [p for p in proposals_qs
78+
if p.get_reviewer_votes_count_by_value(ProposalReviewVote.GOOD) > 0 and
79+
p.get_reviewer_votes_count_by_value(ProposalReviewVote.NOT_BAD) > 1 and
80+
p not in batches]
81+
proposals.append(s_items('Batch 4', batch4))
82+
83+
# proposals = selected + batch1 + batch2 + batch3 + batch4
84+
# unique_proposals = set()
85+
# proposals = [x for x in proposals if not (x in unique_proposals or unique_proposals.add(x))]
86+
# proposals = [s_items('', set(proposals))]
87+
88+
if votes not in (ProposalVotesFilter.SORT_BY_SUM, ProposalVotesFilter.SORT_BY_SELECTION):
89+
print('f')
90+
for section in proposal_sections:
91+
section_proposals = [p for p in proposals_qs if p.proposal_section == section]
92+
proposals.append(s_items(section, section_proposals))
93+
94+
return proposals

0 commit comments

Comments
 (0)