Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WCM-456: Write toggle must not break checkin #889

Merged
merged 4 commits into from
Oct 22, 2024

Conversation

louika
Copy link
Contributor

@louika louika commented Oct 16, 2024

Die API Änderung des DAVPropertyConverters ist das Problem, dass sich durch das Zurückdrehen des write_metadata_columns Toggles gezeigt hat.

Der Toggle hat dafür gesorgt, dass nicht nur die Daten in die neuen Spalten geschrieben werden, sondern auch, dass in den Properties der Resource keine Strings, sondern Python Objekte drin stehen. Beispielsweise PropertyKey(name='year', namespace='http://namespaces.zeit.de/CMS/document'): 2008 statt PropertyKey(name='year', namespace='http://namespaces.zeit.de/CMS/document'): '2008'. Oder PropertyKey(name='date_created', namespace='http://namespaces.zeit.de/CMS/document'): DateTime(2024, 10, 16, 15, 5, 32, 67016, tzinfo=Timezone('Europe/Berlin')) statt PropertyKey(name='date_created', namespace='http://namespaces.zeit.de/CMS/document'): '2024-10-16T15:56:36.967542+02:00'.

Damit kann aber weder die unsorted Spalte, noch der IDAVPropertyConverter umgehen.
siehe

  File "/Users/louisa.huelsen/Projects/vivi-deployment/work/source/vivi/core/src/zeit/cms/content/dav.py", line 85, in __fetch__
    value = converter.fromProperty(dav_value)
   - __traceback_info__: (<zeit.content.article.article.Article http://xml.zeit.de/08e96b04-bcff-4c54-9a3e-39c32237ecdf.tmp>, <zope.schema._field.Tuple object at 0x13ab3f350 zeit.cms.content.interfaces.ICommonMetadata.channels>, 'channels', (('Kultur', None),))
  File "/Users/louisa.huelsen/Projects/vivi-deployment/work/source/vivi/core/src/zeit/cms/content/dav.py", line 430, in fromProperty
    found = value.find(';', start)

Deshalb darf sich die API des IDAVPropertyConverters erst ändern, wenn sich sowohl read, als auch write einig über den Datentyp sind, mit dem sie hantieren.

Jetzt ist der Write-Toggle wirklich nur darauf beschränkt im Connector in die neuen Spalten zu schreiben. Das schien mir sinnvoller als ein Pflaster in from_webdav in Richtung:

if not isinstance(v, str):
    # Support unsetting write_metadata_columns toggle. Must write json serializable
    # values to unsorted
    column = self.column_by_name(k, ns)
    if column is not None:
        converter = zeit.connector.interfaces.IConverter(column)
        unsorted[ns.replace(self.NS, '', 1)][k] = converter.serialize(v)
else:
    unsorted[ns.replace(self.NS, '', 1)][k] = v

Checklist

  • Documentation
  • Changelog
  • Tests
  • Translations

gif

monday

@louika louika requested review from wosc and stollero October 16, 2024 16:51
Copy link
Member

@wosc wosc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich stimme Dir zu, im Connector-Code Typkonvertierungs-Geschichten zu machen, ohne dass irgendein Toggle aktiv ist, klingt erstmal eher verwirrend, und wollen wir vmtl lieber vermeiden.

Wenn ich das richtig verstehe, funktioniert der Ansatz hier deshalb, weil 3912aba bei aktivem Toggle write die Properties "notfalls" sowieso deserialisiert. Und dann frage ich mich (auch wenn man zb noch 3309064 mit anschaut), ob wir nicht sogar noch etwas weiter gehen sollten, bzw. umgekehrt, ob wir grade zu viel auf einmal wollen.

Also ja, perspektivisch wollen wir, dass die DAVPropertyConverter so weit möglich rausfliegen, weil wir uns auf sql(alchemy) stützen können&wollen. Aber wäre es für die Übergangszeit (also während wir noch hin und her togglen) nicht evtl doch einfacher, als API stabil zu halten, IWebDAVProperties enthält nur Strings als Werte? Also ja, das wäre etwas ineffizient, weil dann die DAVProperties alles immer erst serialisieren, und der Connector es dann wieder deserialisiert, und umgekehrt. Damit könnten wir aber vmtl. leben, soo teuer ist das denke ich nicht. Aber wenn wir jetzt eh schon halb da sind, würde es nicht das Verständnis erheblich erleichtern, es durchzuziehen?

@louika louika force-pushed the WCM-456_change_toggle_does_not_break_checkin branch 2 times, most recently from 47fe731 to 5eb61c3 Compare October 21, 2024 13:30
Copy link
Member

@wosc wosc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die Richtung stimmt zwar, der Ansatz ist aber leider noch nicht vollständig umgesetzt.

@@ -899,13 +899,16 @@ def test_converts_scalar_types_on_read(self):
example_date = datetime(2010, 1, 1, 0, 0, tzinfo=pytz.UTC)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Die gesamten ContractProperties Test müssen hiermit entfallen. Deren einziger Punkt war, dass Typkonvertierung stattfindet -- was wir jetzt ja genau nicht mehr wollen. (Einzig test_delete_property_from_column ist noch relevant, der muss dann nach test_postgresql.PropertiesColumnTest umziehen.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wenn dieser PR dann fertig ist, muss man die storage-api entsprechend anpassen, siehe auch WCM-446

core/src/zeit/connector/tests/test_postgresql.py Outdated Show resolved Hide resolved
core/src/zeit/connector/models.py Show resolved Hide resolved
@louika louika force-pushed the WCM-456_change_toggle_does_not_break_checkin branch from 1f10978 to 434d8d6 Compare October 22, 2024 11:50
@louika
Copy link
Contributor Author

louika commented Oct 22, 2024

entschuldigung? was ist denn nun kaputt?

@louika
Copy link
Contributor Author

louika commented Oct 22, 2024

jetzt ist der PropertiesColumnTest lokal auch manchmal kaputt, je nachdem, ob ich ihn im Set oder einzeln laufen lasse 😬

@louika louika force-pushed the WCM-456_change_toggle_does_not_break_checkin branch from 0db0bd1 to fbbae7c Compare October 22, 2024 13:01
Even though I don't think it should do that, we have to be prepared
that zope.pytestlayer uses several instances of the same layer in
sequence (in this case: stopping and then starting a psql docker
container several times)
Copy link
Member

@wosc wosc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wosc wosc merged commit 655c2f0 into main Oct 22, 2024
4 checks passed
@wosc wosc deleted the WCM-456_change_toggle_does_not_break_checkin branch October 22, 2024 13:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants