Skip to content

Commit b3a113f

Browse files
authored
Export CSV for proposal Model in the Admin Panel (#787)
* Export CSV for proposal * removed spaces * removed spaces
1 parent 208d175 commit b3a113f

2 files changed

Lines changed: 33 additions & 7 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ var/
2727
*.egg-info/
2828
.installed.cfg
2929
*.egg
30+
.idea/*
3031

3132
# PyInstaller
3233
# Usually these files are written by a python script from a template

junction/proposals/admin.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,32 @@
1010
from junction.conferences import service
1111
from junction.conferences.models import ConferenceProposalReviewer
1212
from junction.proposals.models import ProposalSection
13+
from junction.base.constants import ProposalStatus, ProposalReviewStatus
1314

15+
from django.http import HttpResponse
1416
from . 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)
1840
class 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)
4467
class 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

Comments
 (0)