summaryrefslogtreecommitdiff
path: root/ishtar_common/wizards.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-13 18:37:06 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-09-13 18:37:29 +0200
commitbddadc1eec4f477ff85e666e009382a274ac1103 (patch)
tree81714ce5e159dcdd06faed1b44b2fa4ccdf22e1a /ishtar_common/wizards.py
parent9bc04754f1a8a01cb7457c335c41a3b2fee0a68c (diff)
downloadIshtar-bddadc1eec4f477ff85e666e009382a274ac1103.tar.bz2
Ishtar-bddadc1eec4f477ff85e666e009382a274ac1103.zip
Muliple person deletion wizard
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r--ishtar_common/wizards.py109
1 files changed, 106 insertions, 3 deletions
diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py
index 3cdcbc63d..65a37a860 100644
--- a/ishtar_common/wizards.py
+++ b/ishtar_common/wizards.py
@@ -38,7 +38,7 @@ from django.db.models.fields import NOT_PROVIDED
from django.http import HttpResponseRedirect, Http404
from django.forms import ValidationError
-from django.shortcuts import redirect, render
+from django.shortcuts import redirect, render, reverse
from django.template import loader
from django.utils.translation import ugettext_lazy as _
from django.utils.safestring import mark_safe
@@ -112,6 +112,7 @@ class Wizard(IshtarWizard):
storage_name = 'formtools.wizard.storage.session.SessionStorage'
wizard_done_template = 'ishtar/wizard/wizard_done.html'
wizard_done_window = ''
+ redirect_url = None
wizard_confirm = 'ishtar/wizard/confirm_wizard.html'
wizard_templates = {}
filter_owns = {}
@@ -1508,7 +1509,7 @@ class DocumentSearch(SearchWizard):
class DeletionWizard(Wizard):
def __init__(self, *args, **kwargs):
if (not hasattr(self, 'fields') or not self.fields) and \
- (hasattr(self, 'model') and hasattr(self.model, 'TABLE_COLS')):
+ (hasattr(self, 'model') and hasattr(self.model, 'TABLE_COLS')):
self.fields = self.model.TABLE_COLS
assert self.model
return super(DeletionWizard, self).__init__(*args, **kwargs)
@@ -1563,6 +1564,107 @@ class DeletionWizard(Wizard):
self.request, 'ishtar/wizard/wizard_delete_done.html', {})
+class MultipleItemWizard(Wizard):
+ main_item_select_keys = ('selec-',)
+ current_object_key = "pks"
+
+ def get_current_objects(self):
+ current_objs = []
+ for key in self.main_item_select_keys:
+ main_form_key = key + self.url_name
+ try:
+ pks = self.session_get_value(main_form_key,
+ self.current_object_key)
+ if pks:
+ for pk in pks.split(","):
+ current_objs.append(self.model.objects.get(pk=int(pk)))
+ except(TypeError, ValueError, ObjectDoesNotExist):
+ pass
+ return current_objs
+
+
+class MultipleDeletionWizard(MultipleItemWizard):
+ def __init__(self, *args, **kwargs):
+ if (not hasattr(self, 'fields') or not self.fields) and \
+ (hasattr(self, 'model') and hasattr(self.model, 'TABLE_COLS')):
+ self.fields = self.model.TABLE_COLS
+ assert self.model
+ return super(MultipleDeletionWizard, self).__init__(*args, **kwargs)
+
+ def get_formated_datas(self, forms):
+ datas = super(MultipleDeletionWizard, self).get_formated_datas(forms)
+ self.current_objs = []
+ for form in forms:
+ if not hasattr(form, "cleaned_data"):
+ continue
+ for key in form.cleaned_data:
+ if key == 'pks':
+ model = form.associated_models['pks']
+ pks = form.cleaned_data["pks"].split(",")
+ for pk in pks:
+ try:
+ self.current_objs.append(model.objects.get(pk=pk))
+ except model.DoesNotExist:
+ continue
+ if not self.current_objs:
+ return datas
+ full_res = []
+ for current_obj in self.current_objs:
+ res = {}
+ for field in self.model._meta.get_fields():
+ if field.name not in self.fields:
+ continue
+ value = getattr(current_obj, field.name)
+ if not value:
+ continue
+ label = ""
+ if hasattr(field, 'verbose_name'):
+ label = field.verbose_name
+ if hasattr(value, 'all'):
+ if not label and hasattr(field, 'related_model'):
+ label = field.related_model._meta.verbose_name_plural
+ value = ", ".join([str(item) for item in value.all()])
+ if not value:
+ continue
+ else:
+ value = str(value)
+ res[field.name] = (label, value, '')
+ full_res.append(res)
+ if not datas and self.fields:
+ datas = [['', []]]
+ datas = []
+ for idx, res in enumerate(full_res):
+ data = []
+ for field in self.fields:
+ if field in res:
+ data.append(res[field])
+ datas.append((str(self.current_objs[idx]), data))
+ return datas
+
+ def get_context_data(self, form, **kwargs):
+ data = super(MultipleDeletionWizard, self).get_context_data(form,
+ **kwargs)
+ data["current_objs"] = self.get_current_objects()
+ return data
+
+ def done(self, form_list, **kwargs):
+ objs = self.get_current_objects()
+ lbls = []
+ for obj in objs:
+ lbls.append(str(obj))
+ try:
+ obj.delete()
+ except ObjectDoesNotExist:
+ pass
+ msg = '<i class="fa fa-trash" aria-hidden="true"></i>&nbsp;&nbsp;'
+ msg += str(_("{} deleted.")).format(" ; ".join(lbls))
+ messages.add_message(self.request, messages.INFO, msg)
+ if self.redirect_url:
+ return HttpResponseRedirect(reverse(self.redirect_url))
+ return render(
+ self.request, 'ishtar/wizard/wizard_delete_done.html', {})
+
+
class ClosingWizard(Wizard):
# "close" an item
# to be define in the overloaded class
@@ -1628,9 +1730,10 @@ class PersonModifWizard(PersonWizard):
'identity-person_modification': "ishtar/wizard/wizard_person.html"}
-class PersonDeletionWizard(DeletionWizard):
+class PersonDeletionWizard(MultipleDeletionWizard):
model = models.Person
fields = model.TABLE_COLS
+ redirect_url = "person_search"
wizard_templates = {
'final-person_deletion': 'ishtar/wizard/wizard_person_deletion.html'}