Improve proposal reviews
Display talk format or proposal kind on review tables and in CSV. Add suggested status to CSV output, for auto-accept and auto-reject. Add endpoint to download CSV of proposals for section.
This commit is contained in:
		
							parent
							
								
									149b7c8a54
								
							
						
					
					
						commit
						87ecc83314
					
				
					 3 changed files with 36 additions and 12 deletions
				
			
		|  | @ -34,7 +34,11 @@ | |||
|                         <p class="badge-success">Not withdrawn</p> | ||||
|                     {% endif %}</td> | ||||
|                 <td>{{ proposal.get_target_audience_display }}</td> | ||||
|                 {% if proposal.talk_format %} | ||||
|                 <td>{{ proposal.get_talk_format_display }}</td> | ||||
|                 {% else %} | ||||
|                 <td>{{ proposal.kind.name|capfirst }}</td> | ||||
|                 {% endif %} | ||||
|                 <td>{{ proposal.total_votes }}</td> | ||||
|                 <td>{{ proposal.score }}</td> | ||||
|                 <td>{{ proposal.plus_two }}</td> | ||||
|  |  | |||
							
								
								
									
										7
									
								
								vendor/symposion/reviews/urls.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/symposion/reviews/urls.py
									
										
									
									
										vendored
									
									
								
							|  | @ -14,7 +14,7 @@ from .views import ( | |||
|     review_delete, | ||||
|     review_assignments, | ||||
|     review_assignment_opt_out, | ||||
|     review_all_proposals_csv, | ||||
|     review_proposals_csv, | ||||
| ) | ||||
| 
 | ||||
| urlpatterns = [ | ||||
|  | @ -32,7 +32,7 @@ urlpatterns = [ | |||
|     url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/$", result_notification, name="result_notification"), | ||||
|     url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/prepare/$", result_notification_prepare, name="result_notification_prepare"), | ||||
|     url(r"^section/(?P<section_slug>[\w\-]+)/notification/(?P<status>\w+)/send/$", result_notification_send, name="result_notification_send"), | ||||
| 
 | ||||
|     url(r"^section/(?P<section_slug>[\w\-]+)/csv$", review_proposals_csv, name="review_proposals_csv"), | ||||
| 
 | ||||
|     url(r"^review/(?P<pk>\d+)/$", review_detail, name="review_detail"), | ||||
| 
 | ||||
|  | @ -40,6 +40,5 @@ urlpatterns = [ | |||
|     url(r"^assignments/$", review_assignments, name="review_assignments"), | ||||
|     url(r"^assignment/(?P<pk>\d+)/opt-out/$", review_assignment_opt_out, name="review_assignment_opt_out"), | ||||
| 
 | ||||
|     url(r"^csv$", review_all_proposals_csv, name="review_all_proposals_csv"), | ||||
| 
 | ||||
|     url(r"^csv$", review_proposals_csv, name="review_all_proposals_csv"), | ||||
| ] | ||||
|  |  | |||
							
								
								
									
										37
									
								
								vendor/symposion/reviews/views.py
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/symposion/reviews/views.py
									
										
									
									
										vendored
									
									
								
							|  | @ -143,34 +143,47 @@ def review_section(request, section_slug, assigned=False, reviewed="all"): | |||
| 
 | ||||
| 
 | ||||
| @login_required | ||||
| def review_all_proposals_csv(request): | ||||
| def review_proposals_csv(request, section_slug=None): | ||||
|     ''' Returns a CSV representation of all of the proposals this user has | ||||
|     permisison to review. ''' | ||||
| 
 | ||||
|     response = HttpResponse("text/csv") | ||||
|     response['Content-Disposition'] = 'attachment; filename="proposals.csv"' | ||||
|     filename = "proposals.csv" | ||||
|     if section_slug: | ||||
|         filename = "proposals_{}.csv".format(section_slug) | ||||
|     response = HttpResponse(content_type="text/csv") | ||||
|     response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) | ||||
|     writer = csv.writer(response, quoting=csv.QUOTE_NONNUMERIC) | ||||
| 
 | ||||
|     queryset = ProposalBase.objects.filter() | ||||
|     queryset = ProposalBase.objects.select_related("speaker__user", "result").select_subclasses() | ||||
|     if section_slug: | ||||
|         queryset = queryset.filter(kind__section__slug=section_slug) | ||||
|     queryset = queryset.order_by("submitted") | ||||
| 
 | ||||
|     proposals = proposals_generator(request, queryset, check_speaker=False) | ||||
| 
 | ||||
|     # The fields from each proposal object to report in the csv | ||||
|     fields = [ | ||||
|         "id", "proposal_type", "speaker_name", "speaker_email", "title", | ||||
|         "submitted", "other_speakers", "speaker_travel", | ||||
|         "speaker_accommodation", "cancelled", "status", "score", "total_votes", | ||||
|         "minus_two", "minus_one", "plus_one", "plus_two", | ||||
|         "audience", "submitted", "other_speakers", "speaker_travel", | ||||
|         "speaker_accommodation", "cancelled", "status", "suggested_status", | ||||
|         "score", "total_votes", "minus_two", "minus_one", "plus_one", "plus_two", | ||||
|     ] | ||||
| 
 | ||||
|     # Fields are the heading | ||||
|     writer.writerow(fields) | ||||
| 
 | ||||
|     for proposal in proposals_generator(request, queryset, check_speaker=False): | ||||
|     for proposal in proposals: | ||||
| 
 | ||||
|         proposal.speaker_name = proposal.speaker.name | ||||
|         section_slug = proposal.kind.section.slug | ||||
|         kind_slug = proposal.kind.slug | ||||
|         proposal.proposal_type = kind_slug | ||||
| 
 | ||||
|         if hasattr(proposal, "target_audience"): | ||||
|             proposal.audience = proposal.get_target_audience_display() | ||||
|         else: | ||||
|             proposal.audience = "Unknown" | ||||
| 
 | ||||
|         proposal.other_speakers = ", ".join( | ||||
|             speaker.name | ||||
|             for speaker in proposal.additional_speakers.all() | ||||
|  | @ -186,6 +199,14 @@ def review_all_proposals_csv(request): | |||
|             for speaker in proposal.speakers() | ||||
|         ) | ||||
| 
 | ||||
|         suggested_status = proposal.status | ||||
|         if suggested_status == "undecided": | ||||
|             if proposal.score >= 1.5: | ||||
|                 suggested_status = "auto-accept" | ||||
|             elif proposal.score <= -1.5: | ||||
|                 suggested_status = "auto-reject" | ||||
|         proposal.suggested_status = suggested_status | ||||
| 
 | ||||
|         if not request.user.has_perm("reviews.can_review_%s" % section_slug): | ||||
|             continue | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Joel Addison
						Joel Addison