diff options
Diffstat (limited to 'ishtar_common/forms_common.py')
-rw-r--r-- | ishtar_common/forms_common.py | 70 |
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 \ |