From: Magnus Hagander Date: Fri, 29 Dec 2017 13:42:34 +0000 (+0100) Subject: Add ability to copy submissions from a previous conference X-Git-Url: http://git.postgresql.org/gitweb/static/session/%7B%7Bsession.id%7D%7D-%7B%7Bsession.title%7Cslugify%7D%7D?a=commitdiff_plain;h=5d9c5eb8a8b0173308d64dc826079b20069bbdcc;p=pgeu-website.git Add ability to copy submissions from a previous conference For people that submit to many of our events, this will cut down the copy/paste work. We make a copy of the submission, so the user can edit eh specifics, and will make a note in the submission notes field that this was a copy. For the time being we include all old submissions the speaker has made. In the future we may want to put some sort of limit on it, and also bring in some ability for the speaker to see which previous events the same talk has been submitted to (and for reviewers). --- diff --git a/postgresqleu/confreg/forms.py b/postgresqleu/confreg/forms.py index f48d667..14d40db 100644 --- a/postgresqleu/confreg/forms.py +++ b/postgresqleu/confreg/forms.py @@ -398,6 +398,21 @@ class CallForPapersForm(forms.ModelForm): raise ValidationError("Please choose the track that is the closest match to your talk") return self.cleaned_data.get('track') +class SessionCopyField(forms.ModelMultipleChoiceField): + def label_from_instance(self, obj): + return u"{0}: {1} ({2})".format(obj.conference, obj.title, obj.status_string) + +class CallForPapersCopyForm(forms.Form): + sessions = SessionCopyField(widget=forms.CheckboxSelectMultiple, + required=True, + queryset=ConferenceSession.objects.filter(id=-1), + label='Select sessions') + def __init__(self, conference, speaker, *args, **kwargs): + self.conference = conference + self.speaker = speaker + super(CallForPapersCopyForm, self).__init__(*args, **kwargs) + self.fields['sessions'].queryset = ConferenceSession.objects.select_related('conference').filter(speaker=speaker).exclude(conference=conference).order_by('-conference__startdate', 'title') + class SessionSlidesUrlForm(forms.Form): url = forms.URLField(label='URL', required=False, max_length=1000) diff --git a/postgresqleu/confreg/models.py b/postgresqleu/confreg/models.py index 9e352f5..49de8aa 100644 --- a/postgresqleu/confreg/models.py +++ b/postgresqleu/confreg/models.py @@ -589,7 +589,7 @@ class ConferenceSession(models.Model): lastmodified = models.DateTimeField(auto_now=True, null=False, blank=False) # NOTE! Any added fields need to be considered for inclusion in - # forms.CallForPapersForm! + # forms.CallForPapersForm and in views.callforpapers_copy()! # Not a db field, but set from the view to track if the current user # has given any feedback on this session. diff --git a/postgresqleu/confreg/views.py b/postgresqleu/confreg/views.py index 1dc82f4..f06a2ba 100644 --- a/postgresqleu/confreg/views.py +++ b/postgresqleu/confreg/views.py @@ -30,7 +30,7 @@ from models import STATUS_CHOICES from forms import ConferenceRegistrationForm, ConferenceSessionFeedbackForm from forms import ConferenceFeedbackForm, SpeakerProfileForm from forms import CallForPapersForm, CallForPapersSpeakerForm, CallForPapersSubmissionForm -from forms import PrepaidCreateForm, BulkRegistrationForm +from forms import CallForPapersCopyForm, PrepaidCreateForm, BulkRegistrationForm from forms import EmailSendForm, EmailSessionForm, CrossConferenceMailForm from forms import AttendeeMailForm, WaitlistOfferForm, TransferRegForm from forms import SessionSlidesUrlForm, SessionSlidesFileForm @@ -843,10 +843,13 @@ def callforpapers(request, confname): try: speaker = Speaker.objects.get(user=request.user) sessions = ConferenceSession.objects.filter(conference=conference, speaker=speaker).order_by('title') + other_submissions = ConferenceSession.objects.filter(speaker=speaker).exclude(conference=conference).exists() except Speaker.DoesNotExist: + other_submissions = False sessions = [] return render_conference_response(request, conference, 'cfp', 'confreg/callforpapers.html', { + 'other_submissions': other_submissions, 'sessions': sessions, 'is_tester': is_tester, }) @@ -1008,6 +1011,39 @@ def callforpapers_edit(request, confname, sessionid): 'session': session, }) +@login_required +@transaction.atomic +def callforpapers_copy(request, confname): + conference = get_object_or_404(Conference, urlname=confname) + speaker = get_object_or_404(Speaker, user=request.user) + + if request.method == 'POST': + form = CallForPapersCopyForm(conference, speaker, data=request.POST) + if form.is_valid(): + for s in form.cleaned_data['sessions']: + # The majority of all fields should just be blank in the new submission, so create + # a new session object instead of trying to copy the old one. + submissionnote = u"Submission copied from {0}.".format(s.conference) + if s.submissionnote: + submissionnote += " Original note:\n\n" + s.submissionnote + + n = ConferenceSession(conference=conference, + title=s.title, + abstract=s.abstract, + skill_level=s.skill_level, + status=0, + submissionnote=submissionnote, + ) + n.save() + n.speaker = s.speaker.all() + return HttpResponseRedirect('../') + else: + form = CallForPapersCopyForm(conference, speaker) + + return render_conference_response(request, conference, 'cfp', 'confreg/callforpaperscopyform.html', { + 'form': form, + }) + @login_required def callforpapers_delslides(request, confname, sessionid, slideid): conference = get_object_or_404(Conference, urlname=confname) diff --git a/postgresqleu/urls.py b/postgresqleu/urls.py index 0b39d7a..06e85e1 100644 --- a/postgresqleu/urls.py +++ b/postgresqleu/urls.py @@ -78,6 +78,7 @@ urlpatterns = patterns('', (r'^events/([^/]+)/speakerprofile/$', postgresqleu.confreg.views.speakerprofile), (r'^events/([^/]+)/callforpapers/$', postgresqleu.confreg.views.callforpapers), (r'^events/([^/]+)/callforpapers/(\d+|new)/$', postgresqleu.confreg.views.callforpapers_edit), + (r'^events/([^/]+)/callforpapers/copy/$', postgresqleu.confreg.views.callforpapers_copy), (r'^events/([^/]+)/callforpapers/(\d+)/delslides/(\d+)/$', 'postgresqleu.confreg.views.callforpapers_delslides'), (r'^events/([^/]+)/callforpapers/(\d+)/speakerconfirm/$', postgresqleu.confreg.views.callforpapers_confirm), (r'^events/([^/]+)/sessionnotifyqueue/$', postgresqleu.confreg.views.session_notify_queue), diff --git a/template.jinja/confreg/callforpapers.html b/template.jinja/confreg/callforpapers.html index e703d48..f28e1a4 100644 --- a/template.jinja/confreg/callforpapers.html +++ b/template.jinja/confreg/callforpapers.html @@ -42,6 +42,12 @@ You have made the following submission{%if sessions|length > 1%}s{%endif%} to th

Click here to make a new submission to {{conference}}.

+{%if other_submissions%} +

+ If you have submitted to other conferences managed by {{org_name}} in the past, you can also + copy and update a previous submission. +

+{%endif%}

Remove submission

diff --git a/template.jinja/confreg/callforpaperscopyform.html b/template.jinja/confreg/callforpaperscopyform.html new file mode 100644 index 0000000..8f55440 --- /dev/null +++ b/template.jinja/confreg/callforpaperscopyform.html @@ -0,0 +1,29 @@ +{%extends "base.html" %} +{%block title%}Call for Papers - {{conference}}{%endblock%} +{%block content%} +

Call for Papers - {{conference}}

+ +

Copy submissions

+

+Select which fields you would like to copy to your new submission. You will be +given a chance to edit the submissions once you are done, but please only copy +those entries that you actually want to submit. +

+

+In particular, please verify that the speakers listed for the submission is correct when +there are multiple speakers of a session. +

+ +{% if form.errors %} +

Note! This form contains errors and has not been saved!

+{% endif %} +
{{ csrf_input }} + +{{form.as_table()}} +
+ + +
+
+ +{%endblock%}