diff --git a/.gitignore b/.gitignore index b5f9c6fb..df68e801 100644 --- a/.gitignore +++ b/.gitignore @@ -91,3 +91,6 @@ qr_files/ .vscode/ tmp/ + +# generated by command to create csv +csvs/ diff --git a/junction/proposals/management/commands/__init__.py b/junction/proposals/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/junction/proposals/management/commands/export_conf_proposals.py b/junction/proposals/management/commands/export_conf_proposals.py new file mode 100644 index 00000000..defd9ff0 --- /dev/null +++ b/junction/proposals/management/commands/export_conf_proposals.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- +import csv +import os +import sys + +from django.contrib.auth.models import User +from django.core.management.base import BaseCommand +from settings.common import ROOT_DIR + +from junction.base.constants import ProposalStatus +from junction.conferences.models import Conference +from junction.proposals.models import Proposal, ProposalSectionReviewerVoteValue +from junction.proposals.permissions import is_conference_moderator + + +class Command(BaseCommand): + def add_arguments(self, parser): + parser.add_argument( + "--conference_slug", + default=None, + help="Enter the conference whose reviewer votes are to be exported from", + ) + + parser.add_argument("--user_id", default=None, help="Enter your user id") + + def handle(self, *args, **options): + + try: + conference = Conference.objects.get(slug=options.get("conference_slug")) + user = User.objects.get(id=options.get("user_id")) + except User.DoesNotExist: + self.stdout.write("Invalid user") + sys.exit(1) + except Conference.DoesNotExist: + self.stdout.write("Invalid conference") + sys.exit(1) + + if not is_conference_moderator(user=user, conference=conference): + self.stdout.write("The user id is not a conference moderator") + sys.exit(1) + + proposal_sections = conference.proposal_sections.all() + proposals_qs = Proposal.objects.select_related( + "proposal_type", "proposal_section", "conference", "author" + ).filter(conference=conference, status=ProposalStatus.PUBLIC) + proposals_qs = sorted( + proposals_qs, key=lambda x: x.get_reviewer_votes_sum(), reverse=True + ) + proposal_vote_values = ProposalSectionReviewerVoteValue.objects.order_by( + "-vote_value" + ) + vote_values_list = [v.vote_value for v in proposal_vote_values] + vote_values_desc = tuple(i.description for i in proposal_vote_values) + header = ("Proposal Type", "Title", "Sum of reviewer votes", "No. of reviewer votes") + + ("Public votes count", "Vote comments") + + tuple(vote_values_desc) + + csv_contents = [] + + for section in proposal_sections: + section_proposals = [ + p for p in proposals_qs if p.proposal_section == section + ] + + for index, p in enumerate(section_proposals, 1): + vote_details = tuple( + p.get_reviewer_votes_count_by_value(v) for v in vote_values_list + ) + vote_comment = "\n".join( + [ + comment.comment + for comment in p.proposalcomment_set.filter( + vote=True, deleted=False + ) + ] + ) + row = { + header[0]: p.proposal_type.name, + header[1]: p.title, + header[2]: p.get_reviewer_votes_sum(), + header[3]: p.get_reviewer_votes_count(), + header[4]: p.get_votes_count(), + header[5]: vote_comment, + } + for i in range(len(tuple(vote_values_desc))): + row[tuple(vote_values_desc)[i]] = vote_details[i] + + csv_contents.append(row) + + csv_file_name = "%s-%s.csv" % (user.username, conference.name) + csv_base_dir = os.path.join(ROOT_DIR, "csvs") + + if not os.path.exists(csv_base_dir): + os.makedirs(csv_base_dir) + + csv_file_location = os.path.join(ROOT_DIR, "csvs", csv_file_name) + + with open(csv_file_location, "w") as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=header) + + writer.writeheader() + for row in csv_contents: + writer.writerow(row) + + self.stdout.write("Successfully created the csv file")