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)
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.
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
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,
})
'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)
(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),
<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>
--- /dev/null
+{%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%}