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

GS can't eat its own dog food. #16

Closed
iham opened this issue Oct 13, 2016 · 1 comment
Closed

GS can't eat its own dog food. #16

iham opened this issue Oct 13, 2016 · 1 comment

Comments

@iham
Copy link
Member

iham commented Oct 13, 2016

situation:
set up a plone 5.1a2 site;.
create a snapshot in portal_setup.
change the day the week should start with in the control panel "Date and Time Settings"
create a snapshot in portal_setup again and make a diff between those two.

i then safed this changed settings to my registry.xml

  <record name="plone.first_weekday" interface="Products.CMFPlone.interfaces.controlpanel.IDateAndTimeSchema" field="first_weekday">
    <field type="plone.registry.field.Choice">
      <description xmlns:ns0="http://xml.zope.org/namespaces/i18n" ns0:domain="plone" ns0:translate="help_first_weekday">First day in the week.</description>
      <title xmlns:ns0="http://xml.zope.org/namespaces/i18n" ns0:domain="plone" ns0:translate="label_first_weekday">First weekday</title>
      <vocabulary>plone.app.vocabularies.Weekdays</vocabulary>
    </field>
    <value>3</value>
  </record>

now i set up another plone site and also install my package with this settings stored inside and get an error:

Traceback (innermost last):
  Module ZPublisher.Publish, line 138, in publish
  Module ZPublisher.mapply, line 77, in mapply
  Module ZPublisher.Publish, line 48, in call_object
  Module Products.CMFPlone.browser.admin, line 272, in __call__
  Module Products.CMFPlone.factory, line 168, in addPloneSite
  Module Products.GenericSetup.tool, line 379, in runAllImportStepsFromProfile
   - __traceback_info__: profile-akbild.site:default
  Module Products.GenericSetup.tool, line 1414, in _runImportStepsFromContext
  Module Products.GenericSetup.tool, line 1226, in _doRunImportStep
   - __traceback_info__: plone.app.registry
  Module plone.app.registry.exportimport.handler, line 47, in importRegistry
  Module plone.app.registry.exportimport.handler, line 90, in importDocument
  Module plone.app.registry.exportimport.handler, line 246, in importRecord
   - __traceback_info__: record name: plone.first_weekday
  Module plone.supermodel.utils, line 144, in elementToValue
  Module zope.schema._field, line 322, in fromUnicode
  Module zope.schema._bootstrapfields, line 183, in validate
  Module zope.schema._field, line 338, in _validate
ConstraintNotSatisfied: (u'0', '')

0 -> Monday (Europe), but every other number from 0 (monday) to 6 (sunday) generates the same error.

why is that happening?
as far as i can tell, the choice-field validates a given value (the one from the xml file) against a given vocabulary, which is a dict of number(keys) and simpleterms (values). see zope.schema._field.Choice._validate() for that. but the value from the xml is a unicode string, not an int. -> so its not in the vocabulary.

further down the rabbit hole:
the value is represented as unicode as it is returned from this method before: see plone.supermodel.utils.elementToValue(). this method converts everything thats not an ICollection or an IDict to unicode. big problem, as the vocabulary of an IChoice can hold ints or strings as keys (maybe even more other types i am not thinking of right now*)

solution(s)

  1. rewrite the vocabulary to have better key/value consistency. or
  2. extend the choice field to also handle value_type, as IDict and ICollection does. or
  3. change the elementToValue method to handle text as integers if it only consists of digits
  4. make all GS setup files JSON instead of XML (no just kidding... but would be awesome)

i will implement the third solution, as i am not able (too heavy) to "fix" the Choice field and add value_types to it or reimplement the whole GS-setup infrastructure.

iham pushed a commit that referenced this issue Oct 14, 2016
iham pushed a commit that referenced this issue Oct 14, 2016
@davisagli
Copy link
Sponsor Member

As I said on the pull request -- it's impossible for plone.supermodel to anticipate how arbitrary vocabulary values should be deserialized. There is already an IFromUnicode adapter so you can customize how values are interpreted.

iham pushed a commit that referenced this issue Oct 24, 2016
jensens added a commit that referenced this issue Jun 1, 2017
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

No branches or pull requests

2 participants