summaryrefslogtreecommitdiff
path: root/ishtar_common/forms.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2024-11-06 12:50:59 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2025-02-19 14:43:49 +0100
commit6a26d7e015b00039f2c6754d828d79915fdc1c23 (patch)
tree74ca481e52d5f14e6270c1d26e33bbd775cd6a02 /ishtar_common/forms.py
parentdd7a0780afceb515959896c5826515bc5ce0efd8 (diff)
downloadIshtar-6a26d7e015b00039f2c6754d828d79915fdc1c23.tar.bz2
Ishtar-6a26d7e015b00039f2c6754d828d79915fdc1c23.zip
✨ permissions refactoring: forms - permission filter (mainly used by search tables)
Diffstat (limited to 'ishtar_common/forms.py')
-rw-r--r--ishtar_common/forms.py72
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)