2015-08-13 23 views
5

Ho un'interfaccia chiamata IReportSettings per una chiave di registro con una tupla, che memorizza PersistantObjects che utilizza un'interfaccia IUserSetting, implementata da un tipo di oggetto denominato UserSetting. Un adattatore di fabbrica per IUserSetting e UserSetting è registrato con registerFactoryAdapter. Quando provo a impostare IReportSettings della chiave di registro con una tupla di UserSettings, ottengo un errore:Plone- Perché ricevo un errore WrongContainedType?

WrongContainedType: ([WrongContainedType([WrongType('uname', <type 'unicode'>,'user_name')],'')],'value') 

Ecco alcuni del mio codice:

class PersistentObject(PersistentField, schema.Object): 
    pass 

class IUserSetting(Interface): 
    user_name = schema.TextLine(title=u"User", 
           required=True, 
           default=u"", 
        ) 

    field_a= schema.List(title=u"Field A", 
         value_type=schema.Choice(vocabulary=u'my.product.vocabularies.SomeVocabulary'), 
         required=False, 
         default=None 
      ) 

    field_b = schema.TextLine(title=u"Field B", 
           required=False, 
           default = u"", 
      ) 
    . 
    . 

class UserSetting(object): 
    implements(IUserSetting) 

    def __init__(self, user_name=u'', field_a=None, field_b=u'', ..): 
     self.user_name = user_name 
     self.field_a = field_a 
     if field_a=None: 
      self.field_a = [] 
     self.field_b = field_b 
     .. 

registerFactoryAdapter(IUserSetting, UserSetting) 

class IReportSettings 
    settings = schema.Tuple(
     title=u"User settings for a Report", 
     value_type=PersistentObject(
       IUserSetting, 
       title=u"User Setting", 
       description=u"a Report Setting" 
      ), 
     required=False, 
     default=(), 
     missing_value=(), 
    ) 

In una classe form:

def saveUI(self, data): 
    user_name = api.user.get_current().id 
    field_a = data['field_a'] 
    field_b = data['field_b'] 
    . 
    . 
    registry_util = queryUtility(IRegistry) 
    user_settings = registry_util.forInterface(IReportSettings,check=False) 
    already_exists = False 
    #Iterate through user_settings.settings and check if a setting for the user already exists, update if it exists or add new if it doesn't exist 

    if already_exists == False: 
     #Add new UserSetting - Example Data 
     new_setting = UserSetting(user_name=user_name, field_a= field_a, field_b=field_b) 
     user_settings.settings += (new_setting,) 

new_setting è il tipo corretto da quando lo ho stampato. Quali dati sto passando potrebbe essere sbagliato?

Nel mio file registry.xml, ho aggiunto:

<records interface="my.package.user_settings.IReportSettings" purge="False"/> 

Inoltre, Il mio codice si basa su questo articolo: http://blog.redturtle.it/plone.app.registry-how-to-use-it-and-love-it

risposta

4

Sono l'autore di questo articolo, ma penso che la tua il problema non è realizzato ad esso.

I dati memorizzati all'interno del telefono user_name devono essere unicode ma chiamare api.user.get_current().id restituirà (probabilmente) una stringa a 8 bit.

quindi cercate di cambiare la linea a:

user_name = api.user.get_current().id.decode('utf-8') 
+0

Grazie. Funziona. Sono stato confuso dall'errore perché pensavo che mi stesse dando una stringa Unicode. Sarò sicuro di controllare la codifica quando estraggo informazioni da API come quella. Inoltre, questo è stato davvero un buon articolo che hai scritto. Mi ha aiutato a capire meglio come lavorare con il registro dei plone. –

Problemi correlati