diff options
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'} | 
