summaryrefslogtreecommitdiff
path: root/ishtar_common/forms_common.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2020-11-27 11:26:55 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2021-02-28 12:15:21 +0100
commit975b971ae6efacbd5614be7f057f32d7c302966b (patch)
tree300713d38252ed0fb9d25e48e8499b29523b7985 /ishtar_common/forms_common.py
parent30bf32d6768f3c013b44e1ed76d94f9954d6e565 (diff)
downloadIshtar-975b971ae6efacbd5614be7f057f32d7c302966b.tar.bz2
Ishtar-975b971ae6efacbd5614be7f057f32d7c302966b.zip
Documents: dynamic filter of support and medium by document type - collapse related fields on edition
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r--ishtar_common/forms_common.py70
1 files changed, 69 insertions, 1 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index c76577e65..c191a2e6e 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -1398,6 +1398,7 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
]
HEADERS = {
+ 'finds': FormHeader(_("Related items")),
'title': FormHeader(_("Identification")),
'format_type': FormHeader(_("Format")),
'image': FormHeader(_("Content")),
@@ -1407,7 +1408,6 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
'source': FormHeader(_("Source"), collapse=True),
'container_id': FormHeader(_("Warehouse"), collapse=True),
'comment': FormHeader(_("Advanced"), collapse=True),
- 'finds': FormHeader(_("Related items")),
}
OPTIONS_PERMISSIONS = [
# field name, permission, options
@@ -1427,6 +1427,7 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
self.user = None
if kwargs.get("user", None):
self.user = kwargs.pop("user")
+ self.is_instancied = bool(kwargs.get('instance', False))
super(DocumentForm, self).__init__(*args, **kwargs)
fields = OrderedDict()
for related_key in models.Document.RELATED_MODELS_ALT:
@@ -1447,6 +1448,73 @@ class DocumentForm(forms.ModelForm, CustomForm, ManageOldType):
fields[k] = self.fields[k]
self.fields = fields
+ def get_headers(self):
+ headers = self.HEADERS.copy()
+ if self.is_instancied:
+ headers["finds"] = FormHeader(headers["finds"].label, collapse=True)
+ return headers
+
+ def get_conditional_filter_fields(self):
+ """
+ Helper to get values for filtering select widget on select by another
+ widget
+ :return: conditional_fields, excluded_fields, all_values
+ * conditional_fields:
+ {input_key: {
+ input_pk: [(output_key1, "pk1,pk2,..."),
+ (output_key2, "pk1,pk2,...")],
+ input_pk2: ...
+ },
+ input_key2: {...}
+ }
+ * excluded_fields: {output_key: "pk1,pk2,...", ...} # list pk for all
+ output_key in condition_fields
+ * all_values: {output_key: [(pk1, label1), (pk2, label2), ...]}
+ """
+ conditional_fields = {}
+ excluded_fields = {}
+ key = 'source_type'
+ for doc_type in models.SourceType.objects.filter(
+ available=True, formats__pk__isnull=False).all():
+ if key not in conditional_fields:
+ conditional_fields[key] = {}
+ sub_key = doc_type.pk
+ if sub_key in conditional_fields[key]:
+ continue
+ lst = [str(f.pk) for f in models.Format.objects.filter(
+ available=True, document_types__pk=doc_type.pk)]
+ if 'format_type' not in excluded_fields:
+ excluded_fields['format_type'] = []
+ for k in lst:
+ if k not in excluded_fields['format_type']:
+ excluded_fields['format_type'].append(k)
+ conditional_fields[key][sub_key] = []
+ conditional_fields[key][sub_key].append(
+ ('format_type', ",".join(lst)))
+ for doc_type in models.SourceType.objects.filter(
+ available=True, supports__pk__isnull=False).all():
+ if key not in conditional_fields:
+ conditional_fields[key] = {}
+ lst = [str(f.pk) for f in models.SupportType.objects.filter(
+ available=True, document_types__pk=doc_type.pk)]
+ if 'support_type' not in excluded_fields:
+ excluded_fields['support_type'] = []
+ for k in lst:
+ if k not in excluded_fields['support_type']:
+ excluded_fields['support_type'].append(k)
+ sub_key = doc_type.pk
+ if sub_key not in conditional_fields[key]:
+ conditional_fields[key][sub_key] = []
+ conditional_fields[key][sub_key].append(
+ ('support_type', ",".join(lst)))
+ for k in excluded_fields:
+ excluded_fields[k] = ",".join(excluded_fields[k])
+ all_values = {
+ "format_type": [list(tp) for tp in models.Format.get_types()],
+ "support_type": [list(tp) for tp in models.SupportType.get_types()]
+ }
+ return conditional_fields, excluded_fields, all_values
+
def clean(self):
cleaned_data = self.cleaned_data
if not cleaned_data.get('title', None) and \