diff options
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 |
commit | a2d4d2cf2561c4dfe926ab03f4dbcfb3409310c7 (patch) | |
tree | 81714ce5e159dcdd06faed1b44b2fa4ccdf22e1a /ishtar_common/wizards.py | |
parent | bbde20e66cf624a7919050548cbfa8248173c49f (diff) | |
download | Ishtar-a2d4d2cf2561c4dfe926ab03f4dbcfb3409310c7.tar.bz2 Ishtar-a2d4d2cf2561c4dfe926ab03f4dbcfb3409310c7.zip |
Muliple person deletion wizard
Diffstat (limited to 'ishtar_common/wizards.py')
-rw-r--r-- | ishtar_common/wizards.py | 109 |
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> ' + 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'} |