Add ability to copy submissions from a previous conference
authorMagnus Hagander <magnus@hagander.net>
Fri, 29 Dec 2017 13:42:34 +0000 (14:42 +0100)
committerMagnus Hagander <magnus@hagander.net>
Fri, 29 Dec 2017 13:42:34 +0000 (14:42 +0100)
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).

postgresqleu/confreg/forms.py
postgresqleu/confreg/models.py
postgresqleu/confreg/views.py
postgresqleu/urls.py
template.jinja/confreg/callforpapers.html
template.jinja/confreg/callforpaperscopyform.html [new file with mode: 0644]

index f48d667e81fde7693253b643faaf1fa694f20c61..14d40db370bf6dfbe9fb3c334dc778dabbaa0929 100644 (file)
@@ -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)
 
index 9e352f538ed2e8eadacab31b759dcd565652d86b..49de8aafdd02db5c23150b74779e30e27057b259 100644 (file)
@@ -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.
index 1dc82f4ca9742aace3d086b358737f54b0689b81..f06a2bad1dc2e58e9079170828b572ee126e7618 100644 (file)
@@ -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)
index 0b39d7a082845e16c2fea084b2a09c13da40dc14..06e85e19e8656a89a6f5fbb58f651969e72e7567 100644 (file)
@@ -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),
index e703d48c1c6fca38fc0196bf1a409279d629a300..f28e1a4de7301af432b9b0883bd00fbbdc32db6e 100644 (file)
@@ -42,6 +42,12 @@ You have made the following submission{%if sessions|length > 1%}s{%endif%} to th
 <p>
   Click <a href="new/">here</a> to make a new submission to {{conference}}.
 </p>
+{%if other_submissions%}
+<p>
+  If you have submitted to other conferences managed by {{org_name}} in the past, you can also
+  <a href="copy/">copy</a> and update a previous submission.
+</p>
+{%endif%}
 
 <h2>Remove submission</h2>
 <p>
diff --git a/template.jinja/confreg/callforpaperscopyform.html b/template.jinja/confreg/callforpaperscopyform.html
new file mode 100644 (file)
index 0000000..8f55440
--- /dev/null
@@ -0,0 +1,29 @@
+{%extends "base.html" %}
+{%block title%}Call for Papers - {{conference}}{%endblock%}
+{%block content%}
+<h1>Call for Papers - {{conference}}</h1>
+
+<h2>Copy submissions</h2>
+<p>
+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.
+</p>
+<p>
+In particular, please verify that the speakers listed for the submission is correct when
+there are multiple speakers of a session.
+</p>
+
+{% if form.errors %}
+<p><b style="color:red;">Note! This form contains errors and has not been saved!</b></p>
+{% endif %}
+<form class="pgeucfpform" method="post" action=".">{{ csrf_input }}
+<table id="cfp_table">
+{{form.as_table()}}
+</table>
+<input type="submit" value="Copy">
+<input class="button" type="button" onclick="window.location.href = '../'" value="Cancel" />
+</form>
+<br/>
+
+{%endblock%}