Move copying of previous sponsorship levels to backend editor
authorMagnus Hagander <magnus@hagander.net>
Sat, 16 Jun 2018 22:47:44 +0000 (00:47 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 20 Jun 2018 11:47:59 +0000 (13:47 +0200)
Cleaner implementation making it possible to copy more than one level at
a time (which is the most likely usecase).

postgresqleu/confsponsor/backendforms.py
postgresqleu/confsponsor/views.py
postgresqleu/urls.py
template/confsponsor/admin_copy_level.html [deleted file]

index 693f125d6702b64d2b2d486790cd96c381d5314d..a2976c8aed4ad70e64ee75ca37c58495d50cacd4 100644 (file)
@@ -57,6 +57,7 @@ class BackendSponsorshipLevelForm(BackendForm):
        linked_objects = OrderedDict({
                'benefit': BackendSponsorshipLevelBenefitManager(),
        })
+       allow_copy_previous = True
        class Meta:
                model = SponsorshipLevel
                fields = ['levelname', 'urlname', 'levelcost', 'available', 'instantbuy',
@@ -67,6 +68,29 @@ class BackendSponsorshipLevelForm(BackendForm):
                self.fields['paymentmethods'].label_from_instance = lambda x: x.internaldescription
 
 
+       @classmethod
+       def copy_from_conference(self, targetconf, sourceconf, idlist):
+               for id in idlist:
+                       level = SponsorshipLevel.objects.get(pk=id, conference=sourceconf)
+                       if SponsorshipLevel.objects.filter(conference=targetconf, urlname=level.urlname).exists():
+                               yield 'A sponsorship level with urlname {0} already exists.'.format(level.urlname)
+                               continue
+
+                       # Get a separate instance that we will modify
+                       newlevel = SponsorshipLevel.objects.get(pk=id, conference=sourceconf)
+                       # Set pk to None to make a copy
+                       newlevel.pk = None
+                       newlevel.conference = targetconf
+                       newlevel.contract = None
+                       newlevel.save()
+                       for pm in level.paymentmethods.all():
+                               newlevel.paymentmethods.add(pm)
+                       newlevel.save()
+                       for b in level.sponsorshipbenefit_set.all():
+                               b.pk = None
+                               b.level = newlevel
+                               b.save()
+
 class BackendSponsorshipContractForm(BackendForm):
        list_fields = ['contractname', ]
        file_fields = ['contractpdf', ]
index 4678736111e537f03b06f2e7e7d7381cd2ff1d05..ff39aeedd27d61eab74710cda4dce08c7f7ee756 100644 (file)
@@ -679,43 +679,6 @@ def sponsor_admin_imageview(request, benefitid):
        resp.write(f.read())
        return resp
 
-@login_required
-@transaction.atomic
-def admin_copy_level(request, levelid):
-       if not request.user.is_superuser:
-               raise Exception("Sorry, at this point only superusers can do this")
-
-       level = get_object_or_404(SponsorshipLevel, id=levelid)
-
-       if request.method == 'POST':
-               form = AdminCopySponsorshipLevelForm(data=request.POST)
-               if form.is_valid():
-                       targetconf = Conference.objects.get(pk=form.data['targetconference'])
-                       newlevel = get_object_or_404(SponsorshipLevel, id=levelid)
-                       # Set pk to none to copy object
-                       newlevel.pk = None
-                       if targetconf == level.conference:
-                               newlevel.levelname = 'Copy of {0}'.format(level.levelname)
-                               newlevel.urlname = 'copy_of_{0}'.format(level.urlname)
-                       else:
-                               newlevel.conference = targetconf
-                       newlevel.save()
-                       for pm in level.paymentmethods.all():
-                               newlevel.paymentmethods.add(pm)
-                       newlevel.save()
-                       for b in level.sponsorshipbenefit_set.all():
-                               b.pk = None
-                               b.level = newlevel
-                               b.save()
-                       return HttpResponseRedirect("/admin/confsponsor/sponsorshiplevel/{0}/".format(newlevel.id))
-       else:
-               form = AdminCopySponsorshipLevelForm()
-
-       return render(request, 'confsponsor/admin_copy_level.html', {
-               'form': form,
-               'sourcelevel': level,
-       })
-
 @login_required
 @user_passes_test_or_error(lambda u: u.is_superuser)
 def sponsor_admin_test_vat(request, confurlname):
index f755691da37b6b40af0017655fbe53fe90b45492..53d68cf474af385301ac2d1160aad4b9dc5f943f 100644 (file)
@@ -172,7 +172,6 @@ urlpatterns = [
        # Conference admin
        url(r'^admin/confreg/_email/$', postgresqleu.confreg.views.admin_email),
        url(r'^admin/confreg/_email_session_speaker/([,\d]+)/$', postgresqleu.confreg.views.admin_email_session),
-       url(r'^admin/confsponsor/sponsorshiplevel/(\d+)/copy/$', postgresqleu.confsponsor.views.admin_copy_level),
 
        # Legacy event URLs
        url(r'^events/(register|bulkpay|feedback|schedule|sessions|talkvote|speakerprofile|callforpapers|reports)/([^/]+)/(.*)?$', postgresqleu.confreg.views.legacy_redirect),
diff --git a/template/confsponsor/admin_copy_level.html b/template/confsponsor/admin_copy_level.html
deleted file mode 100644 (file)
index 732bc41..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{% extends "admin/base_site.html" %}
-{% block title %}Copy sponsorship level{% endblock %}
-{% block content%}
-<h1>Copy sponsorship level</h1>
-
-<form method="post" action=".">{% csrf_token %}
-<table>
-<tr>
- <td><b>Source conference</b></td>
- <td>{{sourcelevel.conference}}</td>
-</tr>
-<tr>
- <td><b>Source level</b></td>
- <td>{{sourcelevel}}</td>
-</tr>
-{{form.as_table}}
-<tr>
- <td colspan="2">
-  <input type="submit" value="Copy level">
- </td>
-</tr>
-</table>
-</form>
-{%endblock%}