2015-08-13 19 views
5

Mam interfejs o nazwie IReportSettings dla klucza rejestru, który ma krotkę, która przechowuje PersistantObjects, które używają interfejsu IUserSetting, który jest implementowany przez typ obiektu o nazwie UserSetting. Adapter fabryczny dla IUserSetting i UserSetting jest zarejestrowany w registerFactoryAdapter. Kiedy próbuję ustawić IReportSettings kluczu rejestru z krotką UserSettings, otrzymuję błąd:Plone - Dlaczego otrzymuję błąd WrongContainedType?

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

Oto niektóre z moich kodu:

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=(), 
    ) 

W klasie forma:

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 jest właściwym typem od kiedy go wydrukowałem. Jakie dane mogą być błędne?

W moim pliku registry.xml, dodałem:

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

Również Mój kod jest na podstawie tego artykułu: http://blog.redturtle.it/plone.app.registry-how-to-use-it-and-love-it

Odpowiedz

4

Jestem autor artykułu, ale myślę, że Twój problem nie jest do niego przypisany.

Dane przechowywane wewnątrz twojego user_name muszą być unikodem, ale wywołanie api.user.get_current().id (prawdopodobnie) zwróci ciąg 8-bitowy.

Więc spróbuj zmienić linię do:

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

Dziękuję. To działa. Byłem zdezorientowany przez błąd, ponieważ myślałem, że daje mi ciąg znaków Unicode. Będę musiał sprawdzić kodowanie podczas pobierania informacji z api w ten sposób. To był naprawdę dobry artykuł, który napisałeś. Pomogło mi to lepiej zrozumieć pracę z rejestrem plonów. –