From 5507e11db6c8588d490ae16c11af018ecfb734dc Mon Sep 17 00:00:00 2001
From: Magnus Hagander
Date: Fri, 29 Dec 2017 15:23:47 +0100
Subject: [PATCH] Remove support for non-jinja based conference skinning
The jinja skinning is basically better in every aspect, and by removing
support for the pre-jinja code we no longer have to maintain a whole lot
of duplicated templates.
In exchange for that we now have to maintain a duplicated base.html
template :) Would be good to get that sorted at some point as well, but
that's for later.
This includes dropping the database columns holding the data from
previous conferences, and it means we can get rid of the ugly setup with
symlinks in the directory conference_templates.
---
postgresqleu/confreg/admin.py | 5 -
postgresqleu/confreg/badges.py | 27 +--
postgresqleu/confreg/jinjafunc.py | 23 ++-
.../0015_remove_non_jinja_conferences.py | 34 ++++
postgresqleu/confreg/models.py | 17 --
postgresqleu/confreg/views.py | 76 ++-------
postgresqleu/settings.py | 1 -
template.jinja/base.html | 51 ++++++
template/confreg/attendee_mail_view.html | 13 --
template/confreg/bulkpay_list.html | 107 ------------
template/confreg/bulkpay_view.html | 20 ---
template/confreg/bulkpayexists.html | 13 --
template/confreg/callforpapers.html | 60 -------
template/confreg/callforpapersconfirm.html | 35 ----
template/confreg/callforpapersconfirmed.html | 27 ---
template/confreg/callforpapersform.html | 74 --------
template/confreg/canceled.html | 12 --
template/confreg/closed.html | 8 -
template/confreg/conference_feedback.html | 73 --------
.../confreg/conference_session_feedback.html | 63 -------
template/confreg/confirm_addons.html | 90 ----------
template/confreg/feedback.html | 27 ---
template/confreg/feedback_conference.html | 42 -----
template/confreg/feedback_index.html | 24 ---
template/confreg/feedbackclosed.html | 8 -
template/confreg/feedbacknotyet.html | 8 -
template/confreg/invoice.html | 18 --
template/confreg/invoicecancel.html | 27 ---
template/confreg/invoiceexists.html | 13 --
template/confreg/nopay.html | 13 --
template/confreg/noregtype.html | 13 --
template/confreg/offer_waitlist.html | 59 -------
template/confreg/regform.html | 116 -------------
template/confreg/regform_completed.html | 103 -----------
template/confreg/regform_confirm.html | 124 --------------
template/confreg/registration_dashboard.html | 161 ------------------
template/confreg/schedule.html | 75 --------
template/confreg/scheduleclosed.html | 8 -
template/confreg/session.html | 33 ----
template/confreg/session_feedback.html | 100 -----------
template/confreg/sessionlist.html | 28 ---
template/confreg/sessionsclosed.html | 8 -
template/confreg/speaker.html | 27 ---
template/confreg/speakerprofile.html | 75 --------
template/confreg/specialregtypeconfirm.html | 12 --
template/confreg/waitlist_status.html | 34 ----
46 files changed, 117 insertions(+), 1868 deletions(-)
create mode 100644 postgresqleu/confreg/migrations/0015_remove_non_jinja_conferences.py
create mode 100644 template.jinja/base.html
delete mode 100644 template/confreg/attendee_mail_view.html
delete mode 100644 template/confreg/bulkpay_list.html
delete mode 100644 template/confreg/bulkpay_view.html
delete mode 100644 template/confreg/bulkpayexists.html
delete mode 100644 template/confreg/callforpapers.html
delete mode 100644 template/confreg/callforpapersconfirm.html
delete mode 100644 template/confreg/callforpapersconfirmed.html
delete mode 100644 template/confreg/callforpapersform.html
delete mode 100644 template/confreg/canceled.html
delete mode 100644 template/confreg/closed.html
delete mode 100644 template/confreg/conference_feedback.html
delete mode 100644 template/confreg/conference_session_feedback.html
delete mode 100644 template/confreg/confirm_addons.html
delete mode 100644 template/confreg/feedback.html
delete mode 100644 template/confreg/feedback_conference.html
delete mode 100644 template/confreg/feedback_index.html
delete mode 100644 template/confreg/feedbackclosed.html
delete mode 100644 template/confreg/feedbacknotyet.html
delete mode 100644 template/confreg/invoice.html
delete mode 100644 template/confreg/invoicecancel.html
delete mode 100644 template/confreg/invoiceexists.html
delete mode 100644 template/confreg/nopay.html
delete mode 100644 template/confreg/noregtype.html
delete mode 100644 template/confreg/offer_waitlist.html
delete mode 100644 template/confreg/regform.html
delete mode 100644 template/confreg/regform_completed.html
delete mode 100644 template/confreg/regform_confirm.html
delete mode 100644 template/confreg/registration_dashboard.html
delete mode 100644 template/confreg/schedule.html
delete mode 100644 template/confreg/scheduleclosed.html
delete mode 100644 template/confreg/session.html
delete mode 100644 template/confreg/session_feedback.html
delete mode 100644 template/confreg/sessionlist.html
delete mode 100644 template/confreg/sessionsclosed.html
delete mode 100644 template/confreg/speaker.html
delete mode 100644 template/confreg/speakerprofile.html
delete mode 100644 template/confreg/specialregtypeconfirm.html
delete mode 100644 template/confreg/waitlist_status.html
diff --git a/postgresqleu/confreg/admin.py b/postgresqleu/confreg/admin.py
index d617798..70cab56 100644
--- a/postgresqleu/confreg/admin.py
+++ b/postgresqleu/confreg/admin.py
@@ -97,11 +97,6 @@ class ConferenceAdminForm(SelectableWidgetAdminFormMixin, ConcurrentProtectedMod
def clean(self):
data = super(ConferenceAdminForm, self).clean()
- if data['jinjadir']:
- for f in ('basetemplate', 'templatemodule', 'templateoverridedir', 'templatemediabase', 'badgemodule'):
- if data[f]:
- raise ValidationError('Cannot use {0} together with jinjadir'.format(f))
-
return data
class ConferenceAdmin(admin.ModelAdmin):
diff --git a/postgresqleu/confreg/badges.py b/postgresqleu/confreg/badges.py
index 99623a1..72fe3a0 100644
--- a/postgresqleu/confreg/badges.py
+++ b/postgresqleu/confreg/badges.py
@@ -113,37 +113,12 @@ class BadgeBuilder(object):
self.registrations = registrations
if not self.conference.jinjadir:
- self.initialize_legacy()
-
- # Shared initialization
+ raise Exception("No jinja template directory defined")
# Register truetype fonts that we're going to end up embedding
registerFont(TTFont('DejaVu Serif', "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif.ttf"))
registerFont(TTFont('DejaVu Serif Bold', "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSerif-Bold.ttf"))
- def initialize_legacy(self):
- # Instantiate the class we need to build things with
- if not self.conference.badgemodule:
- raise Exception("Badge module not specified!")
- if self.conference.badgemodule.find('/') < 0:
- # No slash means it's a class from this file
- try:
- self.badgetype = getattr(badgetypes, conference.badgemodule)()
- except:
- raise Exception("Module class not found in main system")
- else:
- # Load this from an external module.
- modfile = os.path.dirname(self.conference.badgemodule)
- classname = os.path.basename(self.conference.badgemodule)
-
- # First check if the module already exists
- modname = "conference_badges_%s" % self.conference.id
- if not modname in sys.modules:
- # We need to import the module
- import imp
- imp.load_source(modname, '%s.py' % modfile)
- # Ok, module exists now, so instantiate the class
- self.badgetype = getattr(sys.modules[modname], classname)()
# Render of a specific type
def render(self, output):
diff --git a/postgresqleu/confreg/jinjafunc.py b/postgresqleu/confreg/jinjafunc.py
index 6920373..286d63b 100644
--- a/postgresqleu/confreg/jinjafunc.py
+++ b/postgresqleu/confreg/jinjafunc.py
@@ -23,7 +23,7 @@ from postgresqleu.confreg.templatetags.leadingnbsp import leadingnbsp
# We use a separate root directory for jinja2 templates, so find that
# directory by searching relative to ourselves.
-TEMPLATE_ROOT=os.path.abspath(os.path.join(os.path.dirname(__file__), '../../template.jinja'))
+JINJA_TEMPLATE_ROOT=os.path.abspath(os.path.join(os.path.dirname(__file__), '../../template.jinja'))
# Locate the git revision for a repository in the given path, including
@@ -64,13 +64,20 @@ class ConfTemplateLoader(jinja2.FileSystemLoader):
def __init__(self, conference, roottemplate):
self.conference = conference
self.roottemplate = roottemplate
- super(ConfTemplateLoader, self).__init__([os.path.join(conference.jinjadir, 'templates'), TEMPLATE_ROOT])
+ if conference and conference.jinjadir:
+ pathlist = [os.path.join(conference.jinjadir, 'templates'), JINJA_TEMPLATE_ROOT]
+ else:
+ pathlist = [JINJA_TEMPLATE_ROOT,]
+
+ super(ConfTemplateLoader, self).__init__(pathlist)
def get_source(self, environment, template):
# Only allow loading of the root template from confreg. Everything else we allow
# only from the conference specific directory. This is so we don't end up
# loading a template with the wrong parameters passed to it.
- if template != self.roottemplate:
+ # If no conference is specified, then we allow loading all entries from the root,
+ # for obvious reasons.
+ if self.conference and self.conference.jinjadir and template != self.roottemplate:
if not os.path.exists(os.path.join(self.conference.jinjadir, 'templates', template)):
# This template may exist in pgeu, so reject it unless it's specifically
# whitelisted as something we want to load.
@@ -183,7 +190,7 @@ def filter_datetimeformat(value, fmt):
def render_jinja_conference_response(request, conference, pagemagic, templatename, dictionary):
# It all starts from the base template for this conference. If it
# does not exist, just throw a 404 early.
- if not os.path.exists(os.path.join(conference.jinjadir, 'templates/base.html')):
+ if conference and conference.jinjadir and not os.path.exists(os.path.join(conference.jinjadir, 'templates/base.html')):
raise Http404()
env = ConfSandbox(loader=ConfTemplateLoader(conference, templatename),
@@ -208,7 +215,7 @@ def render_jinja_conference_response(request, conference, pagemagic, templatenam
t = env.get_template(templatename)
# Optionally load the JSON context with template-specific data
- if os.path.exists(os.path.join(conference.jinjadir, 'templates/context.json')):
+ if conference and conference.jinjadir and os.path.exists(os.path.join(conference.jinjadir, 'templates/context.json')):
try:
with open(os.path.join(conference.jinjadir, 'templates/context.json')) as f:
c = json.load(f)
@@ -224,14 +231,16 @@ def render_jinja_conference_response(request, conference, pagemagic, templatenam
'conference': conference,
'pagemagic': pagemagic,
'username': request.user and request.user.username or None,
- 'githash': find_git_revision(conference.jinjadir),
'csrf_input': csrf_input_lazy(request),
'csrf_token': csrf_token_lazy(request),
'messages': get_messages(request),
})
+ if conference and conference.jinjadir:
+ c['githash'] = find_git_revision(conference.jinjadir)
+
# For local testing, there may also be a context.override.json
- if os.path.exists(os.path.join(conference.jinjadir, 'templates/context.override.json')):
+ if conference and conference.jinjadir and os.path.exists(os.path.join(conference.jinjadir, 'templates/context.override.json')):
try:
with open(os.path.join(conference.jinjadir, 'templates/context.override.json')) as f:
c.update(json.load(f))
diff --git a/postgresqleu/confreg/migrations/0015_remove_non_jinja_conferences.py b/postgresqleu/confreg/migrations/0015_remove_non_jinja_conferences.py
new file mode 100644
index 0000000..95f39ff
--- /dev/null
+++ b/postgresqleu/confreg/migrations/0015_remove_non_jinja_conferences.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('confreg', '0014_check_constraint_token'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='conference',
+ name='badgemodule',
+ ),
+ migrations.RemoveField(
+ model_name='conference',
+ name='basetemplate',
+ ),
+ migrations.RemoveField(
+ model_name='conference',
+ name='templatemediabase',
+ ),
+ migrations.RemoveField(
+ model_name='conference',
+ name='templatemodule',
+ ),
+ migrations.RemoveField(
+ model_name='conference',
+ name='templateoverridedir',
+ ),
+ ]
diff --git a/postgresqleu/confreg/models.py b/postgresqleu/confreg/models.py
index 49de8aa..46b4797 100644
--- a/postgresqleu/confreg/models.py
+++ b/postgresqleu/confreg/models.py
@@ -120,11 +120,6 @@ class Conference(models.Model):
askshareemail = models.BooleanField(null=False, blank=False, default=False)
skill_levels = models.BooleanField(blank=False, null=False, default=True)
additionalintro = models.TextField(blank=True, null=False, help_text="Additional text shown just before the list of available additional options")
- basetemplate = models.CharField(max_length=128, blank=True, null=True, default=None, help_text="Relative name to template used as base to extend any default templates from")
- templatemodule = models.CharField(max_length=128, blank=True, null=True, default=None, help_text="Full path to python module containing a 'templateextra.py' submodule")
- templateoverridedir = models.CharField(max_length=128, blank=True, null=True, default=None, help_text="Full path to a directory with override templates in")
- badgemodule = models.CharField(max_length=128, blank=True, null=True, default=None, help_text="Full path to python module *and class* used to render badges")
- templatemediabase = models.CharField(max_length=128, blank=True, null=True, default=None, help_text="Relative location to template media (must be local to avoid https/http errors)")
jinjadir = models.CharField(max_length=200, blank=True, null=True, default=None, help_text="Full path to new style jinja repository root")
callforpapersintro = models.TextField(blank=True, null=False)
@@ -162,18 +157,6 @@ class Conference(models.Model):
else:
return self.startdate.strftime("%Y-%m-%d")
- @property
- def template_override(self):
- if self.basetemplate and len(self.basetemplate) > 0:
- return self.basetemplate
- return None
-
- @property
- def mediabase_override(self):
- if self.templatemediabase and len(self.templatemediabase) > 0:
- return self.templatemediabase
- return None
-
@property
def pending_session_notifications(self):
# How many speaker notifications are currently pending for this
diff --git a/postgresqleu/confreg/views.py b/postgresqleu/confreg/views.py
index f06a2ba..b8b615e 100644
--- a/postgresqleu/confreg/views.py
+++ b/postgresqleu/confreg/views.py
@@ -39,7 +39,7 @@ from util import get_invoice_autocancel
from models import get_status_string
from regtypes import confirm_special_reg_type, validate_special_reg_type
-from jinjafunc import render_jinja_conference_response
+from jinjafunc import render_jinja_conference_response, JINJA_TEMPLATE_ROOT
from postgresqleu.util.decorators import user_passes_test_or_error
from postgresqleu.util.random import generate_random_token
@@ -67,73 +67,27 @@ from StringIO import StringIO
import json
#
-# The ConferenceContext allows overriding of the 'conftemplbase' variable,
-# which is used to control the base template of all the confreg web pages.
-# This allows a single conference to override the "framework" template
-# around itself, while retaining all the contents.
-#
-def ConferenceContext(request, conference):
- d = RequestContext(request)
- if conference and conference.template_override:
- conftemplbase = conference.template_override
- else:
- conftemplbase = "nav_events.html"
- d.update({
- 'conftemplbase': conftemplbase,
- 'conference': conference,
- })
- if conference and conference.mediabase_override:
- d['mediabase'] = conference.mediabase_override
-
- # Check if there is any additional data to put into the context
- if conference and conference.templatemodule:
- try:
- modname = 'conference_templateextra_%s' % conference.id
- if modname in sys.modules:
- m = sys.modules[modname]
- else:
- # Not loaded, so try to load it!
- m = imp.load_source(modname, '%s/templateextra.py' % conference.templatemodule)
- d.update(m.context_template_additions())
- except Exception:
- # Ignore problems, because we're lazy. Better render without the
- # data than not render at all.
- pass
-
- return d
-
-#
-# Render a conference page. This automatically attaches the ConferenceContext.
-# It will also load the template from the override directory if one is configured
-# on the conference.
+# Render a conference page. It will load the template using the jinja system
+# if the conference is configured for jinja templates.
#
def render_conference_response(request, conference, pagemagic, templatename, dictionary=None):
# Conference can be None for pages that can be both inside and outside
# the framework, such as the speaker profile.
if conference and conference.jinjadir:
- # Use the cleaner (?) jinja based rendering system
+ # If a jinjadir is defined, then *always* use jinja.
return render_jinja_conference_response(request, conference, pagemagic, templatename, dictionary)
- context = ConferenceContext(request, conference)
- context['pagemagic'] = pagemagic
- if conference and conference.templateoverridedir:
- try:
- if request.GET.has_key('test') and request.GET['test'] == '1':
- # If we append the test=1 parameter to the URL, we get a test version of
- # the templates. Basically we just append ".test" to the end of the template
- # name, making it possible to play interesting symlink tricks and such things
- # to do testing in production env.
- templatename += ".test"
-
- tmpl = get_template(templatename, [conference.templateoverridedir,])
-
- if dictionary:
- context.update(dictionary)
- return HttpResponse(tmpl.render(context))
- except TemplateDoesNotExist:
- # Template not found, so fall through to the default and load the template
- # from our main directory.
- pass
+ # If a jinjadir is not defined, then use jinja only for specific templates. This is somewhat ugly,
+ # but it's better than maintaining duplicate templates.
+ if os.path.exists(os.path.join(JINJA_TEMPLATE_ROOT, templatename)):
+ return render_jinja_conference_response(request, conference, pagemagic, templatename, dictionary)
+
+ context = RequestContext(request)
+ context.update({
+ 'conftemplbase': "nav_events.html",
+ 'conference': conference,
+ 'pagemagic': pagemagic,
+ })
# Either no override configured, or override not found
return render_to_response(templatename, dictionary, context_instance=context)
diff --git a/postgresqleu/settings.py b/postgresqleu/settings.py
index fd7d7db..f02ab77 100644
--- a/postgresqleu/settings.py
+++ b/postgresqleu/settings.py
@@ -83,7 +83,6 @@ ROOT_URLCONF = 'postgresqleu.urls'
TEMPLATE_DIRS = [
'template',
- 'conference_template_links',
]
INSTALLED_APPS = [
diff --git a/template.jinja/base.html b/template.jinja/base.html
new file mode 100644
index 0000000..8ab1510
--- /dev/null
+++ b/template.jinja/base.html
@@ -0,0 +1,51 @@
+
+
+
+ {%block title%}{%endblock%} - PostgreSQL Europe
+
+
+
+
+{%block extrahead%}{%endblock%}
+
+
+
-{%else%}
-You currently have no bulk payments registered for {{conference}}.
-{%endif%}
-
-
-{%if activewaitlist%}
-
Waitlist available
-
-This conference is unfortunately sold out. There is currently a waitlist
-available, but this is only available for individual registrations and not
-for bulk payments. No new bulk payments can be generated.
-
-{%else%}
-
New bulk payment
-
-To create a new bulk payment for {{conference}}, list the email
-addresses of all the users you wish to pay for below, one on each line.
-Note that each of the users must have already registered him/herself,
-and entered all the details - once a registration is attached to a
-bulk payment, it can no longer be modified.
-
-
-Make sure you enter the invoice information for you. This
-information will be put as the recipient on the invoice, and cannot
-be edited once the invoice has been issued.
-
-
-Once you have entered all emails, click the Check email button.
-This will collect all the registrations and show you how much they cost
-with the current options enabled. Once you have verified that they are all
-correct, click the button to confirm the registrations and generate the
-invoice.
-
-
-Note! The invoice that's generated is due upon receipt, so please
-make sure that you have all the payment details, such as credit card number,
-ready. The registrations will not be confirmed until the invoice
-has been paid.
-
This bulk payment was completed {{bulkpayment.paidat}}.
-{%else%}
-
-This bulk payment is associated with the following invoice. Note that
-since this invoice has been created, there is no longer any way to
-modify the contents of it.
-
-You have made the following submissions to this conference:
-
-
-{%for s in sessions%}
-
- {{s.title}} ({{s.status_string_long}}{%ifequal s.status 3 %} - confirm{%endifequal%}{%if s.status == 1 and s.has_feedback and not conference.feedbackopen%} - View feedback{%endif%})
- {%ifequal s.status 1 %}{%comment%}Approved - so link to the public description{%endcomment%}
- (public view)
- {%endifequal%}
-
-{%endfor%}
-
-{%endif%}
-
-{%if conference.callforpapersopen or is_tester%}
-
New submission
-
- Click here to make a new submission to {{conference}}.
-
-Your session {{session.title}} is currently
-in state pending. This means that the session has been
-selected by the organizers, and all that is required is that you
-confirm your attendance.
-
-
-
-Please do not do this until you are fully certain that
-you can attend and deliver your session. For example, if you
-need to clear travel budget or similar things, please do so before
-you confirm the session.
-
-
-
-As always, if you have any questions at all about your session,
-don't hesitate to contact
-the organizers!
-
-The details below will be included on your invoice, as entered on your
-registration. If this is in any way incorrect, please contact
-{{conference.contactaddr}}.
-
Please rate the following aspects of the talk that you have been to, on a
-scale from 1-5, with 5 being the highest or "best".
-
If you wish to leave any comments for the speaker or the conference
-organizers, please do so in the text boxes below. Note that all your data
-will be anonymised before being presented, so if you want the speaker/organiser
-to know who you are, you must put your name and contact information in the
-text field.
-
-{% if form.errors %}
-
Note! This form contains errors and has not been saved!
-Please rate and comment on the following aspects of the conference. For
-questions taking rating, use a scale from 1-5, with 5 being the highest or "best".
-
-
-
-Note that all your data
-will be anonymised before begin presented, so if you want the organisers
-to know who you are, you must put your name and contact information in the
-text field.
-
-
-{% if form.errors %}
-
Note! This form contains errors and has not been saved!
On this page you can leave feedback for sessions at {{conference}}.
-You can return to this page at any time during the conference to
-view or edit your feedback.
-
-{%if conference.conferencefeedbackopen or is_tester %}
-
-An invoice has been prepared for your conference registration. This
-invoice is due for immediate payment.
-
-
-If there is something wrong on this invoice, or if it was generated
-in error (for example in case the registration was supposed to be part
-of a bulk registration paid for by somebody else), you can
-cancel the invoice and it will be possible
-to make modifications to the registration again.
-
-Are you sure that you want to cancel the invoice for this registration? Not that
-by canceling your invoice, you may lose your seat if the event is full!
-
-This conference is unfortunately sold out at this time.
-
-
-
-At this time we are unable to offer you a registration. However, there
-is a waitlist available which you can sign up for. The waitlist process
-works like this:
-
-
-
-
You accept being waitlisted by confirming in the form below
-
As soon as a seat becomes available, we will send you an email
- to {{reg.email}}. This email will be sent from
- {{reg.conference.contactaddr}}, so make sure you whitelist that
- address in any spam filters.
-
After receiving this email you will have a limited amount of time
- (depending on how close to the conference it is sent - the time will
- be specified in the email) to confirm that you want the seat
-
If you confirm that you still want the seat, you will be able to
- generate an invoice, which will be due for immediate payment.
-
If you do not meet either of these timelines, your registration will
- automaticaly be moved back to the waitlist, and will be given another
- try later.
-
Finally, at any given time you will be able to take yourself off the
- waitlist. If you are no longer interested in attending the conference,
- we ask you to do this, in order to give other people a better chance
- on the waitlist.
-
We make no guarantees about the ability to offer people off the waitlist
- seats at the conference, but we will do our best to accommodate as many
- as possible!
-
-
-
Sign up on waitlist
-
-If you wish to sign up on the waitlist, please confirm this below.
-
-Note! if you wish to register multiple people,
-you must log out and back in (with a different account)
-between each registration to avoid conflicts.
-
-
-{%if reg.registrationwaitlistentry%}
-
Waitlist
-
-Your registration is currently on the waitlist.
-
-{%if reg.registrationwaitlistentry.offeredon%}
-
-Good news - you have been offered a seat from the waitlist. Please
-complete the form below and click "Save and finish" to
-complete the process! The process must be completed before
-{{reg.registrationwaitlistentry.offerexpires|date:"Y-m-d H:i"}} or
-this offer will expire!
-
-{%else%}
-
-We will let you know as soon as a seat shows up!
-
-NOTE! if you wish to register multiple people,
-you must log out and back in (with a different account)
-between each registration to avoid conflicts.
-
-
-{%comment%}Payment not confirmed, so either invoice pending or bulk{%endcomment%}
-{%if reg.invoice%}
-
Invoice
-
- An invoice has been created for your registration, but we have not yet
- received a payment for it.
-
-
- If there is something wrong on this invoice, or if it was generated
- in error (for example in case the registration was supposed to be part
- of a bulk registration paid for by somebody else), you can
- cancel the invoice and it will be possible
- to make modifications to the registration again.
-
- {%include "invoices/userinvoice_spec.html"%}
-
- Note! Your registration is not confirmed until the invoice
- has been paid and confirmed!
-
-{%else%}{%comment%}must mean reg.bulkpayment{%endcomment%}
-
- Your registration has been made part of a bulk payment invoice owned by
- {{reg.bulkpayment.user.email}}. Once this invoice has been paid by the
- owner, your registration will automatically be approved.
-
-{%endif%}
-
-
Your registration details
-
-Since your registration has been finalized, you can no longer make modifications
-to it. If you need to adjust anything, please contact the conference organizers
-at {{conference.contactaddr}}.
-
-Your registration (for {{reg.firstname}} {{reg.lastname}}) has been
-completed on {{reg.payconfirmedat}}. Welcome to {{conference}}!
-
-
-On this page you will find all necessary information for attendees
-of the event. We also recommend that you regularly check the
-main event website for public
-news!
-
-The following emails have been sent to attendees of this conference.
-Any future messages sent will both be sent to {{reg.email}} and
-listed here. To ensure that messages are not filtered, we suggest that you
-white-list the address {{conference.contactaddr}} in your
-spamfilters.
-
{{s.title}}{%if s.closed%} (closed){%elif s.deadline%} (closes {{s.deadline|date:"Y-m-d H:i"}}){%endif%}{%if s.savedat%} - you responded on {{s.savedat|date:"Y-m-d H:i"}}{%endif%}
-{%endfor%}
-
-{%endif%}
-
-
-
Registration summary
-
-
-
Registration type
-
Your registration type is {{reg.regtype}}.
-{%if reg.regtype.days.count %}
-This registration type gives you access to the conference on {{reg.regtype.days.all|join_days}}.
-{%endif%}
-
-
-{%if reg.additionaloptions.all%}
-
Additional options
-
You are registered for the following additional options:
-
-{%for a in reg.additionaloptions.all%}
-
{{a.name}}
-{%endfor%}
-
-
-{%endif%}
-
-{%if invoices%}
-
Invoice and receipts
-
You can download a copy of your invoices and receipts:
-
-If you have made any additional orders, you can always find a copy of all
-invoices and receipts in the invoice section.
-
-{%endif%}
-
-
-
-
-
-{%if availableoptions%}
-
-
Additional options
-{%if pendingadditional%}
-
-You have a pending order for additional options, wich has not yet been
-paid. Please pay this invoice as soon as possible to ensure your
-registration is completed!
-
-There are additional options that you can add to your registration. Note
-that many of these have limited availability, so if you want to register
-for one of them, we suggest you do so as soon as possible. Note that some
-options may not be available due to being sold out or due to an existing
-registration being mutually exlusive.
-
-You can find the full conference information at the
-conference website.
-This schedule is subject to changes. This page will be updated when any
-changes occur.
-
-The following list contains all the talks that have been approved so far
-for {{conference}}.
-Note that they may not yet have been scheduled!
-You can find the full conference information at the
-conference website.
-
-
-{%for session in sessions%}
-{%ifchanged session.track%}
-{%if not forloop.first%}
-
-{%endif%}
-
-You can edit the contents of your speaker profile here. Please note that
-any changes made here will affect your pages on all conferences
-you are a speaker.
-
-
-{% if form.errors %}
-
Note! This form contains errors and has not been saved!
-You are currently on the waitlist to attend this conference. We will
-let you know as soon as a seat shows up.
-
-
-
-Remember to whitelist {{reg.conference.contactaddr}} in any spam
-filters, so you do not miss the notification if you are accepted from
-the waitlist!
-
-
-
Cancel waitlist
-
-If you ae no longer interested in attending the conference, we ask you
-to cancel your waitlist position, in order to make it easier for others
-to use the seats that may show up. If so, plase do it using the form
-below:
-