diff options
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r-- | ishtar_common/forms.py | 72 |
1 files changed, 55 insertions, 17 deletions
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index e5ffeefb5..ca9f37623 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -109,7 +109,24 @@ class FloatField(forms.FloatField): return super(FloatField, self).clean(value) -class FinalForm(forms.Form): +class FormPermissionForm: + """ + Modification, deletion kwargs (for permissions) + """ + + def __init__(self, *args, **kwargs): + if "modification" in kwargs: + self.form_permission = "modification" + kwargs.pop("modification") + elif "deletion" in kwargs: + self.form_permission = "deletion" + kwargs.pop("deletion") + else: + self.form_permission = "view" + super().__init__(*args, **kwargs) + + +class FinalForm(FormPermissionForm, forms.Form): final = True form_label = _("Confirm") @@ -142,7 +159,11 @@ JSON_VALUE_TYPES_FIELDS = { } -class BSForm: +class BSForm(FormPermissionForm): + """ + Bootstrap decoration + """ + def _post_init(self): for k in self.fields: widget = self.fields[k].widget @@ -179,6 +200,11 @@ class BSForm: class CustomForm(BSForm): + """ + Manage: + - form custom fields. + - user kwargs + """ form_admin_name = "" form_slug = "" need_user_for_initialization = True @@ -422,17 +448,23 @@ class CustomForm(BSForm): return sorted(customs, key=lambda x: x[1]) -class CustomFormSearch(forms.Form): +class CustomFormSearch(FormPermissionForm, forms.Form): + """ + Manage: + - user kwargs + - modification, deletion kwargs (for permissions) + """ need_user_for_initialization = True def __init__(self, *args, **kwargs): user = None if "user" in kwargs: user = kwargs.pop("user") - super(CustomFormSearch, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.request_user = user if user and "pk" in self.fields: self.fields["pk"].widget.user = user + self.fields["pk"].widget.form_permission = self.form_permission class LockForm(object): @@ -674,7 +706,7 @@ class FormHeader(object): ) -class IshtarForm(forms.Form, BSForm): +class IshtarForm(BSForm, forms.Form): TYPES = [] # FieldType list CONDITIONAL_FIELDS = [] # dynamic conditions on field display # can be dynamic with "get_conditional_fields" @@ -694,20 +726,11 @@ class IshtarForm(forms.Form, BSForm): profile = models.get_current_profile() if self.PROFILE_FILTER: - for profile_key in self.PROFILE_FILTER: - if not getattr(profile, profile_key): - for field_key in self.PROFILE_FILTER[profile_key]: - if field_key in self.fields.keys(): - self.fields.pop(field_key) + self._profile_filter(profile) if getattr(self, "confirm", False): return if self.SITE_KEYS: - field_keys = list(self.fields.keys()) - for site_key in list(self.SITE_KEYS.keys()): - if site_key in field_keys: - self.fields[site_key].label = profile.get_site_label( - self.SITE_KEYS[site_key] - ) + self._site_keys(profile) user = getattr(self, "user", None) ishtar_user = None if user: @@ -730,6 +753,21 @@ class IshtarForm(forms.Form, BSForm): self._init_types() self._post_init() + def _profile_filter(self, profile): + for profile_key in self.PROFILE_FILTER: + if not getattr(profile, profile_key): + for field_key in self.PROFILE_FILTER[profile_key]: + if field_key in self.fields.keys(): + self.fields.pop(field_key) + + def _site_keys(self, profile): + field_keys = list(self.fields.keys()) + for site_key in list(self.SITE_KEYS.keys()): + if site_key in field_keys: + self.fields[site_key].label = profile.get_site_label( + self.SITE_KEYS[site_key] + ) + def _init_types(self): type_lst = self._types or self.TYPES for field in type_lst: @@ -1123,7 +1161,7 @@ def get_form_selection( attrs["SEARCH_AND_SELECT"] = True if not base_form_select: - base_form_select = forms.Form + base_form_select = (FormPermissionForm, forms.Form) if not isinstance(base_form_select, (tuple, list)): base_form_select = (base_form_select,) return type(class_name, base_form_select, attrs) |