[Zope-CMF] Re: Overriding title from DefaultDublinCoreImpl

Rainer Thaden Rainer Thaden <Thadi@gmx.de>
Mon, 22 Jul 2002 22:26:27 +0200


Florent,

Florent Guillaume wrote:

>Your whole description of what you do is not very clear. Show us some
>precise code.
  
of course you're right. I was not sure if i could post long code into
the list. I try to specify my problem:

I have a product with several classes, all derived from
LocalPropertyManager, PortalFolder, PortalContent and
DefaultDublinCoreImpl.
These classes have a folderish behaviour and support Metadata and all
the typical CMF-stuff. Localizer is used to have multilingual
properties, where the number of languages is fixed. Only german and
english will be used, so there is no need to provide a method to add a
language by the user. I use the default metadata_edit_form and my own
edit form for the properties which is shown below.
The localizer stuff works fine, except for the 'title' property,
because it is already defined and used in DefaultDublinCoreImpl.

Here a snippet of the class definition for the class 'Kolloquium'

def addKolloquium(self,
                id,
                title='Titel des Vortrags',
                Abstract='Kurze Zusammenfassung',
                languages=('de','en')
        ):
    """ Create an empty Kolloquium """
    kolloquium_object = Kolloquium(id,
                                       title,
                                       Abstract,
                                       tuple(languages)
                                    )
    self._setObject(id, kolloquium_object)

class Kolloquium(LocalPropertyManager, PortalFolder, PortalContent, DefaultDublinCoreImpl):

    meta_type = 'Kolloquium'

    security = ClassSecurityInfo()
    security.declareObjectPublic()

    title = LocalProperty('title')
    Abstract = LocalProperty('Abstract')
    # LocalPropertyManager needs some metadata,
    # this is similar to the PropertyManager mixin class.
    _local_properties_metadata = ({'id': 'title', 'type': 'string'},
                                  {'id': 'Abstract', 'type': 'text'}
                                 )

    def __init__(self,
                id,              
                title='',           
                Abstract='',
                languages=''
            ):

        ## parents constructors
        DefaultDublinCoreImpl.__init__(self)

        ## set infos
        self.id = id
        for language in languages:
            self.manage_addLanguage(language)
            self._setLocalPropValue('title', language, title)
            self._setLocalPropValue('Abstract', language, Abstract)

    security.declarePrivate( '_edit' )
    def _edit( self,
               title=None,
               Abstract=None,
               language=None,
              ):

        if title is not None:
          self._setLocalPropValue('title', language, title)
        if Abstract is not None:
          self._setLocalPropValue('Abstract', language, Abstract)

    security.declareProtected( CMFCorePermissions.ModifyPortalContent, 'edit' )
    edit = WorkflowAction( _edit )

    # Override some methods to be sure that Kolloquium objects are
    # reindexed when changed.
    def _setLocalPropValue(self, id, lang, value):
        Kolloquium.inheritedAttribute('_setLocalPropValue')(self, id, lang, value)
        self.reindexObject()

    # Override setTitle from DefaultDublinCoreImpl and let it do nothin
    # otherwise _editMetadata would call setTitle and override the LocalProperty('title')
    def setTitle( self, title ):
        "Dublin Core element - resource name"
        return

--- end snippet ---

I left some things out, like the other properties, which are not
multilingual and code like manage_afterAdd etc. which seem to have no
influence here.

The property-edit form looks like this:

<form action="Kolloquium_edit" method="post"
      tal:attributes="action string:${here/absolute_url}/Kolloquium_edit">
<table class="FormLayout">
 <input type="hidden" name="language" value="de"
        tal:attributes="value request/cookies/LOCALIZER_LANGUAGE">

 <tr valign="top">
  <th align="right"> title </th>
  <td colspan="3">
   <input type="text" name="title" value="" size="65"
          tal:attributes="value here/title">
  </td>
 </tr>
  ...

So the problem is, that the title which i defined in my class and
which uses LocalPropertyManager and is multilingual is overridden by
the _editMetadata method of DefaultDublinCoreImpl, when the standard
metadata_edit_form is used or by the
DefaultDublinCoreImpl.__init__(self). 

So i try to override the setTitle method as you can see above. But
then of course, the title can't be edited in in the
metadata_edit_form.

I think i also have to override Title(), because it just delivers
self.title instead of the localized property.

The next step would be to make the metadata multilingual. I think it
would be necessary to override all methods like Subject, Description,
etc. from DublinCore.py. Seems to be a lot of work ...

I should provide a language selection box in the metadata_edit_form
and need to tell setTitle the current language. But can i override the
method and pass an additional parameter (language) like this:

    def setTitle( self, title, language ):
        if title is not None:
          self._setLocalPropValue('title', language, title)

I think this wouldn't override the original function from
DefaultDublinCoreImpl but create a new one with one more argument to
pass?!?

This is getting too complex and needs a simpler solution, right?

So, this was a lot too read. Hope it's more clear now.

-- 
Regards,
 Rainer                          Thadi@gmx.de