summaryrefslogtreecommitdiff
path: root/postgresqleu
diff options
context:
space:
mode:
authorMagnus Hagander2024-05-06 14:15:32 +0000
committerMagnus Hagander2024-05-06 14:15:32 +0000
commit64642edd1129243c7225e65ec493f8da9ead6208 (patch)
tree3eda3c944103dcd4592ed65a583a48565dec65e6 /postgresqleu
parent774c893f419527b2902453b7d1d680fbaa855481 (diff)
Add ability to copy linked objects in backend forms
And use this to make it possible to copy individual sponsorship benefits inside a conference.
Diffstat (limited to 'postgresqleu')
-rw-r--r--postgresqleu/confsponsor/backendforms.py30
-rw-r--r--postgresqleu/util/backendviews.py22
2 files changed, 52 insertions, 0 deletions
diff --git a/postgresqleu/confsponsor/backendforms.py b/postgresqleu/confsponsor/backendforms.py
index 5ffdf283..9c06dc8c 100644
--- a/postgresqleu/confsponsor/backendforms.py
+++ b/postgresqleu/confsponsor/backendforms.py
@@ -1,5 +1,6 @@
from django.forms import ValidationError
import django.forms
+from django.shortcuts import get_object_or_404
from django.conf import settings
from collections import OrderedDict
@@ -219,6 +220,7 @@ class BackendSponsorshipLevelBenefitManager(object):
title = 'Benefits'
singular = 'benefit'
can_add = True
+ can_copy = True
fieldset = {
'id': 'benefits',
'legend': 'Benefits',
@@ -240,6 +242,9 @@ class BackendSponsorshipLevelBenefitManager(object):
return bc.get_backend_form()
return BackendSponsorshipLevelBenefitForm
+ def get_copy_form(self):
+ return BackendSponsorshipLevelBenefitCopyForm
+
def get_object(self, masterobj, subjid):
try:
return SponsorshipBenefit.objects.get(level=masterobj, pk=subjid)
@@ -249,6 +254,31 @@ class BackendSponsorshipLevelBenefitManager(object):
def get_instancemaker(self, masterobj):
return lambda: SponsorshipBenefit(level=masterobj, class_parameters={})
+ def copy_instance(self, masterobj, cleaned_form):
+ b = get_object_or_404(SponsorshipBenefit, pk=cleaned_form['copyfrom'].value())
+
+ # Create a copy of the existing benefit
+ b.pk = None
+ b._state.adding = True
+
+ # Override the level and save
+ b.level = masterobj
+ b.save()
+
+ return b.pk
+
+
+class BackendSponsorshipLevelBenefitCopyForm(django.forms.Form):
+ helplink = 'sponsors#benefit'
+ copyfrom = django.forms.ModelChoiceField(label="Copy beneift", queryset=SponsorshipBenefit.objects.all())
+
+ def __init__(self, conference, *args, **kwargs):
+ self.conference = conference
+ super().__init__(*args, **kwargs)
+
+ self.fields['copyfrom'].queryset = SponsorshipBenefit.objects.select_related('level').filter(level__conference=conference).order_by('level__levelcost', 'level__levelname', 'sortkey', 'benefitname')
+ self.fields['copyfrom'].label_from_instance = lambda x: '{}: {}'.format(x.level.levelname, x.benefitname)
+
class BackendSponsorshipLevelForm(BackendForm):
helplink = 'sponsors#level'
diff --git a/postgresqleu/util/backendviews.py b/postgresqleu/util/backendviews.py
index 72836633..371e8c29 100644
--- a/postgresqleu/util/backendviews.py
+++ b/postgresqleu/util/backendviews.py
@@ -373,6 +373,28 @@ def backend_list_editor(request, urlname, formclass, resturl, allow_new=True, al
if restpieces[2] == 'new':
subid = None
subobj = None
+ elif restpieces[2] == 'copy':
+ if request.method == 'POST':
+ form = handler.get_copy_form()(conference, request.POST)
+ if form.is_valid():
+ id = handler.copy_instance(masterobj, form)
+ return HttpResponseRedirect("../{}/".format(id))
+ else:
+ form = handler.get_copy_form()(conference)
+ return render(request, 'confreg/admin_backend_form.html', {
+ 'conference': conference,
+ 'basetemplate': basetemplate,
+ 'topadmin': topadmin,
+ 'form': form,
+ 'whatverb': 'Copy',
+ 'what': formclass._verbose_name(),
+ 'savebutton': 'Copy',
+ 'cancelurl': '../../',
+ 'breadcrumbs': breadcrumbs + [
+ ('../../../', formclass._verbose_name_plural().capitalize()),
+ ('../../', masterobj),
+ ],
+ })
else:
try:
subid = int(restpieces[2])