From 4f03f35bdc4edbc9802b0e7367f69572f44f88d3 Mon Sep 17 00:00:00 2001 From: Martin Stolle Date: Wed, 25 Sep 2024 08:15:55 +0200 Subject: [PATCH] WCM-285: move Converter back to filesystem --- core/src/zeit/connector/converter.py | 68 ----------------------- core/src/zeit/connector/filesystem.py | 77 ++++++++++++++++++++++++++- core/src/zeit/connector/interfaces.py | 10 ---- core/src/zeit/connector/mock.py | 4 +- core/src/zeit/connector/models.py | 2 - 5 files changed, 78 insertions(+), 83 deletions(-) delete mode 100644 core/src/zeit/connector/converter.py diff --git a/core/src/zeit/connector/converter.py b/core/src/zeit/connector/converter.py deleted file mode 100644 index 49c26f6901..0000000000 --- a/core/src/zeit/connector/converter.py +++ /dev/null @@ -1,68 +0,0 @@ -from sqlalchemy.dialects.postgresql import JSONB -import grokcore.component as grok -import sqlalchemy -import zope.interface - -import zeit.connector.interfaces - - -@grok.implementer(zeit.connector.interfaces.IConverter) -@grok.adapter(sqlalchemy.Column) -def converter_from_column_type(column): - return zeit.connector.interfaces.IConverter(column.type) - - -@grok.implementer(zeit.connector.interfaces.IConverter) -class DefaultConverter(grok.Adapter): - grok.context(zope.interface.Interface) - - def serialize(self, value): - return value - - def deserialize(self, value): - return value - - -class BoolConverter(DefaultConverter): - grok.context(sqlalchemy.Boolean) - - def serialize(self, value): - return zeit.cms.content.dav.BoolProperty._toProperty(value) - - def deserialize(self, value): - return zeit.cms.content.dav.BoolProperty._fromProperty(value) - - -class IntConverter(DefaultConverter): - grok.context(sqlalchemy.Integer) - - def serialize(self, value): - return str(value) - - def deserialize(self, value): - return int(value) - - -class DatetimeConverter(DefaultConverter): - grok.context(sqlalchemy.TIMESTAMP) - - def serialize(self, value): - return zeit.cms.content.dav.DatetimeProperty._toProperty(value) - - def deserialize(self, value): - return zeit.cms.content.dav.DatetimeProperty._fromProperty(value) - - -@grok.implementer(zeit.connector.interfaces.IConverter) -class DictConverter(grok.Adapter): - grok.context(JSONB) - - def serialize(self, value): - if not value: - return {} - return value - - def deserialize(self, value): - if not value: - return {} - return value diff --git a/core/src/zeit/connector/filesystem.py b/core/src/zeit/connector/filesystem.py index 031af1a473..bc2cfb95a4 100644 --- a/core/src/zeit/connector/filesystem.py +++ b/core/src/zeit/connector/filesystem.py @@ -6,8 +6,11 @@ import os import os.path +from sqlalchemy.dialects.postgresql import JSONB import gocept.cache.property +import grokcore.component as grok import lxml.etree +import sqlalchemy import zope.app.file.image import zope.interface @@ -268,7 +271,7 @@ def _convert_sql_types(self, properties): column = Content.column_by_name(*key) if column is None: continue - converter = zeit.connector.interfaces.IConverter(column) + converter = IConverter(column) properties[key] = converter.deserialize(value) def _guess_type(self, id): @@ -316,3 +319,75 @@ def parse_properties(xml): value += '' properties[('keywords', 'http://namespaces.zeit.de/CMS/tagging')] = value return properties + + +class IConverter(zope.interface.Interface): + """Converts webdav values to and from the postgresql database.""" + + def serialize(value): + pass + + def deserialize(value): + pass + + +@grok.implementer(IConverter) +@grok.adapter(sqlalchemy.Column) +def converter_from_column_type(column): + return IConverter(column.type) + + +@grok.implementer(IConverter) +class DefaultConverter(grok.Adapter): + grok.context(zope.interface.Interface) + + def serialize(self, value): + return value + + def deserialize(self, value): + return value + + +class BoolConverter(DefaultConverter): + grok.context(sqlalchemy.Boolean) + + def serialize(self, value): + return zeit.cms.content.dav.BoolProperty._toProperty(value) + + def deserialize(self, value): + return zeit.cms.content.dav.BoolProperty._fromProperty(value) + + +class IntConverter(DefaultConverter): + grok.context(sqlalchemy.Integer) + + def serialize(self, value): + return str(value) + + def deserialize(self, value): + return int(value) + + +class DatetimeConverter(DefaultConverter): + grok.context(sqlalchemy.TIMESTAMP) + + def serialize(self, value): + return zeit.cms.content.dav.DatetimeProperty._toProperty(value) + + def deserialize(self, value): + return zeit.cms.content.dav.DatetimeProperty._fromProperty(value) + + +@grok.implementer(IConverter) +class DictConverter(grok.Adapter): + grok.context(JSONB) + + def serialize(self, value): + if not value: + return {} + return value + + def deserialize(self, value): + if not value: + return {} + return value diff --git a/core/src/zeit/connector/interfaces.py b/core/src/zeit/connector/interfaces.py index 2bc264fd47..251cef6a70 100644 --- a/core/src/zeit/connector/interfaces.py +++ b/core/src/zeit/connector/interfaces.py @@ -354,16 +354,6 @@ class IResourceInvalidatedEvent(zope.interface.Interface): id = zope.interface.Attribute('Unique id of resource') -class IConverter(zope.interface.Interface): - """Converts webdav values to and from the postgresql database.""" - - def serialize(value): - pass - - def deserialize(value): - pass - - @zope.interface.implementer(IResourceInvalidatedEvent) class ResourceInvalidatedEvent: def __init__(self, id): diff --git a/core/src/zeit/connector/mock.py b/core/src/zeit/connector/mock.py index a12125152b..eddef24d38 100644 --- a/core/src/zeit/connector/mock.py +++ b/core/src/zeit/connector/mock.py @@ -15,7 +15,7 @@ import zope.event from zeit.cms.content.sources import FEATURE_TOGGLES -from zeit.connector.converter import DefaultConverter +from zeit.connector.filesystem import DefaultConverter from zeit.connector.interfaces import ( ID_NAMESPACE, UUID_PROPERTY, @@ -388,7 +388,7 @@ def _set_properties(self, id, properties): if FEATURE_TOGGLES.find('write_metadata_columns'): column = Content.column_by_name(name, namespace) - converter = zeit.connector.interfaces.IConverter(column) + converter = zeit.connector.filesystem.IConverter(column) value = converter.serialize(value) else: converter = DefaultConverter(None) diff --git a/core/src/zeit/connector/models.py b/core/src/zeit/connector/models.py index 0669e3afbd..83b8ae6b6d 100644 --- a/core/src/zeit/connector/models.py +++ b/core/src/zeit/connector/models.py @@ -223,8 +223,6 @@ def from_webdav(self, props): continue if ns == INTERNAL_PROPERTY: continue - if isinstance(v, datetime): - continue unsorted[ns.replace(self.NS, '', 1)][k] = v self.unsorted = unsorted