118 lines
4.3 KiB
Python
118 lines
4.3 KiB
Python
from django import forms
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from catalog.models import *
|
|
from common.forms import PreviewImageInput
|
|
from common.models import SITE_DEFAULT_LANGUAGE, detect_language, uniq
|
|
|
|
CatalogForms = {}
|
|
|
|
|
|
def _EditForm(item_model):
|
|
item_fields = (
|
|
["id"]
|
|
+ item_model.METADATA_COPY_LIST
|
|
+ ["cover"]
|
|
+ ["primary_lookup_id_type", "primary_lookup_id_value"]
|
|
)
|
|
if "media" in item_fields:
|
|
# FIXME not sure why this field is always duplicated
|
|
item_fields.remove("media")
|
|
|
|
class EditForm(forms.ModelForm):
|
|
id = forms.IntegerField(required=False, widget=forms.HiddenInput())
|
|
primary_lookup_id_type = forms.ChoiceField(
|
|
required=False,
|
|
choices=item_model.lookup_id_type_choices(),
|
|
label=_("Primary ID Type"),
|
|
help_text="automatically detected, usually no change necessary",
|
|
)
|
|
primary_lookup_id_value = forms.CharField(
|
|
required=False,
|
|
label=_("Primary ID Value"),
|
|
help_text="automatically detected, usually no change necessary, left empty if unsure",
|
|
)
|
|
|
|
class Meta:
|
|
model = item_model
|
|
fields = item_fields
|
|
widgets = {
|
|
"cover": PreviewImageInput(),
|
|
}
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.migrate_initial()
|
|
|
|
def migrate_initial(self):
|
|
if self.initial and self.instance and self.instance.pk:
|
|
if (
|
|
"localized_title" in self.Meta.fields
|
|
and not self.initial["localized_title"]
|
|
):
|
|
titles = []
|
|
if self.instance.title:
|
|
titles.append(
|
|
{
|
|
"lang": detect_language(self.instance.title),
|
|
"text": self.instance.title,
|
|
}
|
|
)
|
|
if (
|
|
hasattr(self.instance, "orig_title")
|
|
and self.instance.orig_title
|
|
):
|
|
titles.append(
|
|
{
|
|
"lang": detect_language(self.instance.orig_title),
|
|
"text": self.instance.orig_title,
|
|
}
|
|
)
|
|
if (
|
|
hasattr(self.instance, "other_title")
|
|
and self.instance.other_title
|
|
):
|
|
for t in self.instance.other_title:
|
|
titles.append({"lang": detect_language(t), "text": t})
|
|
if not titles:
|
|
titles = [{"lang": SITE_DEFAULT_LANGUAGE, "text": "<no title>"}]
|
|
self.initial["localized_title"] = uniq(titles) # type:ignore
|
|
if (
|
|
"localized_description" in self.Meta.fields
|
|
and not self.initial["localized_description"]
|
|
):
|
|
if self.instance.brief:
|
|
d = {
|
|
"lang": detect_language(self.instance.brief),
|
|
"text": self.instance.brief,
|
|
}
|
|
else:
|
|
d = {
|
|
"lang": self.initial["localized_title"][0]["lang"],
|
|
"text": "",
|
|
}
|
|
self.initial["localized_description"] = [d] # type:ignore
|
|
# if (
|
|
# "language" in self.Meta.fields
|
|
# and self.initial["language"]
|
|
# ):
|
|
# if isinstance(self.initial["language"], str):
|
|
|
|
def clean(self):
|
|
data = super().clean() or {}
|
|
t, v = self.Meta.model.lookup_id_cleanup(
|
|
data.get("primary_lookup_id_type"), data.get("primary_lookup_id_value")
|
|
)
|
|
data["primary_lookup_id_type"] = t
|
|
data["primary_lookup_id_value"] = v
|
|
return data
|
|
|
|
return EditForm
|
|
|
|
|
|
def init_forms():
|
|
for cls in Item.__subclasses__():
|
|
CatalogForms[cls.__name__] = _EditForm(cls)
|
|
|
|
|
|
init_forms()
|