Add backend forms for editing superuser parameters on confs
authorMagnus Hagander <magnus@hagander.net>
Thu, 28 Jun 2018 10:34:11 +0000 (12:34 +0200)
committerMagnus Hagander <magnus@hagander.net>
Thu, 28 Jun 2018 10:34:34 +0000 (12:34 +0200)
This includes a proper "backend interface" to create a new conference, so no
more messing about in the raw admin interface.

postgresqleu/confreg/backendforms.py
postgresqleu/confreg/backendviews.py
postgresqleu/urls.py
template/confreg/admin_dashboard.html
template/confreg/admin_dashboard_single.html

index 3d93bc54d41ca63d32ddfd99a83b6057727fc366..10281fd5ec012f02eb658f4e63bf9155086a6adb 100644 (file)
@@ -17,6 +17,7 @@ from postgresqleu.util.random import generate_random_token
 
 from postgresqleu.accountinfo.lookups import UserLookup
 from postgresqleu.confreg.lookups import RegistrationLookup
+import postgresqleu.accounting.models
 
 from postgresqleu.confreg.models import Conference, ConferenceRegistration, ConferenceAdditionalOption
 from postgresqleu.confreg.models import RegistrationClass, RegistrationType, RegistrationDay
@@ -135,6 +136,28 @@ class BackendConferenceForm(BackendForm):
                self.fields['volunteers'].queryset = ConferenceRegistration.objects.filter(conference=self.conference)
 
 
+class BackendSuperConferenceForm(BackendForm):
+       class Meta:
+               model = Conference
+               fields = ['conferencename', 'urlname', 'series', 'startdate', 'enddate', 'location',
+                                 'timediff', 'contactaddr', 'sponsoraddr', 'confurl', 'administrators',
+                                 'jinjadir', 'accounting_object', 'vat_registrations', 'vat_sponsorship', ]
+       selectize_multiple_fields = ['administrators', ]
+       accounting_object = django.forms.ChoiceField(choices=[], required=False)
+       exclude_date_validators = ['startdate', 'enddate']
+
+       def fix_fields(self):
+               self.fields['administrators'].label_from_instance = lambda x: u'{0} {1} ({2})'.format(x.first_name, x.last_name, x.username)
+               self.fields['accounting_object'].choices = [('', '----'),] + [(o.name, o.name) for o in postgresqleu.accounting.models.Object.objects.filter(active=True)]
+               if not self.instance.id:
+                       del self.fields['accounting_object']
+
+       def pre_create_item(self):
+               # Create a new accounting object automatically if one does not exist already
+               (obj, created) = postgresqleu.accounting.models.Object.objects.get_or_create(name=self.instance.urlname,
+                                                                                                                                                                        defaults={'active': True})
+               self.instance.accounting_object = obj
+
 class BackendRegistrationForm(BackendForm):
        class Meta:
                model = ConferenceRegistration
index 7801f196839dd71979fc8843f686712267ff083b..4628244d77563d6426d3a2e90b0b0e09de6f9624 100644 (file)
@@ -2,6 +2,7 @@ from django.shortcuts import render, get_object_or_404
 from django.db import transaction
 from django import forms
 from django.core import urlresolvers
+from django.core.exceptions import PermissionDenied
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.contrib.admin.utils import NestedObjects
 from django.contrib import messages
@@ -24,7 +25,7 @@ from postgresqleu.invoices.models import Invoice
 from postgresqleu.confsponsor.util import get_sponsor_dashboard_data
 
 from backendforms import BackendCopySelectConferenceForm
-from backendforms import BackendConferenceForm, BackendRegistrationForm
+from backendforms import BackendConferenceForm, BackendSuperConferenceForm, BackendRegistrationForm
 from backendforms import BackendRegistrationTypeForm, BackendRegistrationClassForm
 from backendforms import BackendRegistrationDayForm, BackendAdditionalOptionForm
 from backendforms import BackendTrackForm, BackendRoomForm, BackendConferenceSessionForm
@@ -367,6 +368,35 @@ def edit_conference(request, urlname):
                                                                allow_new=False,
                                                                allow_delete=False)
 
+@login_required
+def superedit_conference(request, urlname):
+       if not request.user.is_superuser:
+               raise PermissionDenied("Superuser only")
+
+       return backend_process_form(request,
+                                                               urlname,
+                                                               BackendSuperConferenceForm,
+                                                               get_object_or_404(Conference, urlname=urlname).pk,
+                                                               bypass_conference_filter=True,
+                                                               allow_new=False,
+                                                               allow_delete=False)
+
+@login_required
+def new_conference(request):
+       if not request.user.is_superuser:
+               raise PermissionDenied("Superuser only")
+
+       return backend_process_form(request,
+                                                               None,
+                                                               BackendSuperConferenceForm,
+                                                               None,
+                                                               bypass_conference_filter=True,
+                                                               allow_new=True,
+                                                               allow_delete=False,
+                                                               conference=Conference(),
+                                                               instancemaker=lambda: Conference(),
+       )
+
 def edit_registration(request, urlname, regid):
        return backend_process_form(request,
                                                                urlname,
index 53d68cf474af385301ac2d1160aad4b9dc5f943f..3282253c185c5eed5eca86817cb28a31c9f6fee2 100644 (file)
@@ -113,8 +113,10 @@ urlpatterns = [
        url(r'^events/admin/([^/]+)/reports/feedback/$', postgresqleu.confreg.feedback.feedback_report),
        url(r'^events/admin/([^/]+)/reports/feedback/session/$', postgresqleu.confreg.feedback.feedback_sessions),
        url(r'^events/admin/([^/]+)/reports/schedule/$', postgresqleu.confreg.pdfschedule.pdfschedule),
+       url(r'^events/admin/newconference/$', postgresqleu.confreg.backendviews.new_conference),
        url(r'^events/admin/(\w+)/$', postgresqleu.confreg.views.admin_dashboard_single),
        url(r'^events/admin/(\w+)/edit/$', postgresqleu.confreg.backendviews.edit_conference),
+       url(r'^events/admin/(\w+)/superedit/$', postgresqleu.confreg.backendviews.superedit_conference),
        url(r'^events/admin/(\w+)/mail/$', postgresqleu.confreg.views.admin_attendeemail),
        url(r'^events/admin/(\w+)/mail/(\d+)/$', postgresqleu.confreg.views.admin_attendeemail_view),
        url(r'^events/admin/(\w+)/regdashboard/$', postgresqleu.confreg.views.admin_registration_dashboard),
index d0903ebec0cbe105e4d30e06fc8bb31444307c77..cc862f8933212f476420520892930d210220b60a 100644 (file)
 </div>
 {%endif%}
 
+{%if user.is_superuser%}
+<h3>New conference</h3>
+<div class="row">
+  <div class="col-md-3 col-sm-6 col-xs-12 buttonrow">
+    <a class="btn btn-default btn-block" href="/events/admin/newconference/">Create new conference</a>
+  </div>
+</div>
+{%endif%}
+
 {%if user.is_superuser%}
 <p>
 Everything should normally be edited through interfaces above. For exceptional cases,
index 0d3422c4012e10c86862f8685e27bd8502746d0f..6e47008c83be7b5c63b54511a2007f992d0f54d4 100644 (file)
@@ -75,6 +75,9 @@
 <h2>Metadata</h2>
 <div class="row">
   <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/edit/">Conference entry</a></div>
+{%if user.is_superuser%}
+  <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/superedit/">Superuser conference entry</a></div>
+{%endif%}
   <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/accesstokens/">Access tokens</a></div>
   <div class="col-md-3 col-sm-6 col-xs-12 buttonrow"><a class="btn btn-default btn-block" href="/events/admin/{{c.urlname}}/feedbackquestions/">Feedback questions</a></div>
 </div>