1010from junction .conferences import service
1111from junction .conferences .models import ConferenceProposalReviewer
1212from junction .proposals .models import ProposalSection
13+ from junction .base .constants import ProposalStatus , ProposalReviewStatus
1314
15+ from django .http import HttpResponse
1416from . import models
1517
1618
19+ class ExportMixin :
20+ def export_as_csv (self , request , queryset ):
21+ import csv
22+
23+ response = HttpResponse (content_type = 'text/csv' )
24+ response ['Content-Disposition' ] = 'attachment; filename="exported_data.csv"'
25+
26+ writer = csv .writer (response )
27+ writer .writerow (['Proposal Info' , 'Author Info' , 'Author Email' , 'Conference' , 'Status' , 'Review Status' ])
28+
29+ for item in queryset :
30+ writer .writerow ([self .proposal_info (item ), self .author_info (item ), self .author_email (item ),
31+ item .conference .name , dict (ProposalStatus .CHOICES ).get (item .status ),
32+ dict (ProposalReviewStatus .CHOICES ).get (item .review_status )])
33+
34+ return response
35+
36+ export_as_csv .short_description = "Export To CSV"
37+
38+
1739@admin .register (models .ProposalSection )
1840class ProposalSectionAdmin (AuditAdmin ):
1941 list_display = ("name" , "active" ) + AuditAdmin .list_display
@@ -32,26 +54,27 @@ def get_queryset(self, request):
3254 return qs .filter (
3355 conference_reviewer__conference__in = [m .conference for m in moderators ]
3456 )
35-
57+
3658 def get_form (self , request , obj = None , ** kwargs ):
3759 form = super (ProposalSectionReviewerAdmin , self ).get_form (request , obj , ** kwargs )
38- form .base_fields ['conference_reviewer' ].queryset = ConferenceProposalReviewer .objects .all ().order_by ('-created_at' )
60+ form .base_fields ['conference_reviewer' ].queryset = ConferenceProposalReviewer .objects .all ().order_by (
61+ '-created_at' )
3962 form .base_fields ['proposal_section' ].queryset = ProposalSection .objects .all ().order_by ('-created_at' )
4063 return form
4164
4265
4366@admin .register (models .ProposalType )
4467class ProposalTypeAdmin (AuditAdmin ):
4568 list_display = (
46- "name" ,
47- "active" ,
48- "start_date" ,
49- "end_date" ,
69+ "name" ,
70+ "active" ,
71+ "start_date" ,
72+ "end_date" ,
5073 ) + AuditAdmin .list_display
5174
5275
5376@admin .register (models .Proposal )
54- class ProposalAdmin (TimeAuditAdmin , SimpleHistoryAdmin ):
77+ class ProposalAdmin (TimeAuditAdmin , SimpleHistoryAdmin , ExportMixin ):
5578 list_display = (
5679 "proposal_info" ,
5780 "author_info" ,
@@ -72,6 +95,8 @@ class ProposalAdmin(TimeAuditAdmin, SimpleHistoryAdmin):
7295 TextField : {"widget" : AdminPagedownWidget },
7396 }
7497
98+ actions = ["export_as_csv" ]
99+
75100 def proposal_info (self , obj ):
76101 return "%s (%s)" % (obj .title , obj .proposal_type )
77102
0 commit comments