diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-11-24 13:13:23 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2022-12-12 12:20:59 +0100 |
commit | e39f05ef095d9b74853fa177d8ce2a566478dae2 (patch) | |
tree | f94ba77a7ebd80312cc03258a5f69d3e67aa8bd2 /ishtar_common/models_common.py | |
parent | fa4b00372209425b18c57fe9af29a416ce36b39f (diff) | |
download | Ishtar-e39f05ef095d9b74853fa177d8ce2a566478dae2.tar.bz2 Ishtar-e39f05ef095d9b74853fa177d8ce2a566478dae2.zip |
Syndication - serialization - display sheet find
Diffstat (limited to 'ishtar_common/models_common.py')
-rw-r--r-- | ishtar_common/models_common.py | 98 |
1 files changed, 73 insertions, 25 deletions
diff --git a/ishtar_common/models_common.py b/ishtar_common/models_common.py index 3138cecc6..bf1d10b5a 100644 --- a/ishtar_common/models_common.py +++ b/ishtar_common/models_common.py @@ -40,8 +40,12 @@ from django.db.models.signals import post_save, post_delete, m2m_changed from django.template.defaultfilters import slugify from django.utils.safestring import SafeText, mark_safe from django.utils.translation import activate, deactivate -from ishtar_common.utils import ugettext_lazy as _, pgettext_lazy, get_image_path, \ - human_date +from ishtar_common.utils import ( + ugettext_lazy as _, + pgettext_lazy, + get_image_path, + human_date, +) from simple_history.models import HistoricalRecords as BaseHistoricalRecords from simple_history.signals import ( post_create_historical_record, @@ -1209,7 +1213,7 @@ class HistoricalRecords(BaseHistoricalRecords): history_type=history_type, history_user=history_user, history_change_reason=history_change_reason, - **attrs + **attrs, ) pre_create_historical_record.send( @@ -3245,19 +3249,15 @@ class ShortMenuItem: return "" -class MainItem(ShortMenuItem): - """ - Item with quick actions available from tables - Extra actions are available from sheets - """ - - QUICK_ACTIONS = [] +class SerializeItem: SERIALIZE_EXCLUDE = ["search_vector"] SERIALIZE_PROPERTIES = ["external_id", "multi_polygon_geojson", "point_2d_geojson"] SERIALIZE_CALL = {} SERIALIZE_DATES = [] + SERIALIZATION_FILES = [] + SERIALIZE_STRING = [] - def full_serialize(self) -> dict: + def full_serialize(self, recursion=False) -> dict: """ API serialization :return: data dict @@ -3265,36 +3265,75 @@ class MainItem(ShortMenuItem): full_result = {} serialize_fields = [] for field in self._meta.get_fields(): - if field.name in self.SERIALIZE_EXCLUDE: + field_name = field.name + if field_name in self.SERIALIZE_EXCLUDE: continue if field.many_to_one or field.one_to_one: try: - value = getattr(self, field.name) + value = getattr(self, field_name) except (MultipleObjectsReturned, ObjectDoesNotExist): value = None if value: - value = str(value) + if ( + field_name not in self.SERIALIZE_STRING + and hasattr(value, "full_serialize") + and not recursion + ): + # print(field.name) + value = value.full_serialize(recursion=True) + elif field_name in self.SERIALIZATION_FILES: + try: + value = {"url": value.url} + except ValueError: + value = None + else: + value = str(value) else: value = None - full_result[field.name] = value + full_result[field_name] = value elif field.many_to_many: - values = getattr(self, field.name) + values = getattr(self, field_name) if values.count(): - values = [str(v) for v in values.all()] + first_value = values.all()[0] + if ( + field_name not in self.SERIALIZE_STRING + and hasattr(first_value, "full_serialize") + and not recursion + ): + # print(field.name) + values = [ + v.full_serialize(recursion=True) for v in values.all() + ] + else: + if first_value in self.SERIALIZATION_FILES: + values = [] + for v in values: + try: + values.append({"url": value.url}) + except ValueError: + pass + else: + values = [str(v) for v in values.all()] else: values = [] - full_result[field.name] = values + full_result[field_name] = values else: - serialize_fields.append(field.name) + if field_name in self.SERIALIZATION_FILES: + value = getattr(self, field_name) + try: + value = {"url": value.url} + except ValueError: + value = None + full_result[field.name] = value + else: + serialize_fields.append(field_name) - result = json.loads(serialize( - "json", - [self], - fields=serialize_fields - )) + result = json.loads(serialize("json", [self], fields=serialize_fields)) full_result.update(result[0]["fields"]) + if "main_image" in full_result: + print(full_result["main_image"]) for prop in self.SERIALIZE_PROPERTIES: - if prop not in full_result: + if hasattr(self, prop) and prop not in full_result: full_result[prop] = getattr(self, prop) if "point_2d_geojson" in full_result: full_result["point_2d"] = True @@ -3330,6 +3369,15 @@ class MainItem(ShortMenuItem): lst.append(["-" if v is None else v for v in values]) return lst + +class MainItem(ShortMenuItem, SerializeItem): + """ + Item with quick actions available from tables + Extra actions are available from sheets + """ + + QUICK_ACTIONS = [] + @classmethod def class_verbose_name(cls): return cls._meta.verbose_name |