##########################################################################
#                                                                        #
#           copyright (c) 2003 ITB, Humboldt-University Berlin           #
#           written by: Raphael Ritz, r.ritz@biologie.hu-berlin.de       #
#                                                                        #
##########################################################################
 
"""Preprint reference main class"""
 
from zope.interface import implements
from Products.CMFBibliographyAT.interface import IPreprintReference
 
from AccessControl import ClassSecurityInfo
from Products.CMFCore.permissions import View
from Products.CMFCore.utils import getToolByName
 
from Products.CMFBibliographyAT.config import CMFBAT_USES_LINGUAPLONE
if CMFBAT_USES_LINGUAPLONE:
    from Products.LinguaPlone.public import Schema
    from Products.LinguaPlone.public import StringField, SelectionWidget
    from Products.LinguaPlone.public import DisplayList
else:
    from Products.Archetypes.public import Schema
    from Products.Archetypes.public import StringField, SelectionWidget
    from Products.Archetypes.public import DisplayList
 
from Products.ATContentTypes.content.base import registerATCT as registerType
from Products.ATContentTypes.content.schemata import finalizeATCTSchema
 
 
from Products.CMFBibliographyAT.config import PROJECTNAME
from Products.CMFBibliographyAT.content.base import BaseEntry
from Products.CMFBibliographyAT.content.schemata \
    import HeaderSchema, AuthorSchema, CoreSchema, TrailingSchema
 
 
SourceSchema = Schema((
    StringField('preprint_server',
        searchable=1,
        required=0,
        vocabulary="PreprintServers",
        widget=SelectionWidget(label="Preprint server",
                label_msgid="label_preprint_server",
                description="If the preprint is available from one of the following preprint servers, you can indicate that here. Contact the site's admin if you want a server to be added to the list.",
                description_msgid="help_preprint_server",
                i18n_domain="cmfbibliographyat",),
                ),
    ))
 
PreprintSchema = HeaderSchema.copy() + AuthorSchema.copy() + CoreSchema.copy() +  \
                 SourceSchema.copy() + TrailingSchema.copy()
 
# the default AT 'description' field shall be invisible, it is kept in sync with the 'abstract' field
PreprintSchema.get('description').widget.visible = {'view': 'invisible', 'edit': 'invisible', }
 
finalizeATCTSchema(PreprintSchema)
 
class PreprintReference(BaseEntry):
    """ content type to make reference to a preprint
    """
 
    implements(IPreprintReference)
 
 
    security = ClassSecurityInfo()
    archetype_name = "Preprint Reference"
    source_fields = ('preprint_server', )
 
    schema = PreprintSchema
 
    security.declareProtected(View, 'PreprintServers')
    def PreprintServers(self):
        """ return a display list of the preprint servers as
            defined in the tool properties.
        """
        bib_tool = getToolByName(self, 'portal_bibliography')
        servers = bib_tool.getProperty('preprint_servers', [])
        values = []
        for server in servers:
            if ':' in server:
                text = server.split(':')[0]
            else:
                text = server
            values.append([server, text])
        return DisplayList(tuple(values))
 
    security.declareProtected(View, 'Source')
    def Source(self):
        """ the default preprint server source format
        """
        try:
            return self.PreprintSource()
        except AttributeError:
            source = "Preprint"
            preprint_server = self.getPreprint_server()
            if preprint_server:
                if ':' in preprint_server:
                    text, link = preprint_server.split(':', 1)
                    if text != 'None':
                        source += ' at <a href="%s">%s</a>' % (link, text)
                else:
                    source += " at %s" % preprint_server
            return source + "."
 
    security.declareProtected(View, 'getCoinsDict')
    def getCoinsDict(self):
        """ Select which values to display in the COinS tag for this item """
        coinsData = BaseEntry.getCoinsDict(self)
        coinsData['rft.genre'] = "document"
        coinsData['rft.btitle'] = self.Title()
        coinsData['rft_val_fmt'] = "info:ofi/fmt:kev:mtx:book"
        return coinsData
 
registerType(PreprintReference, PROJECTNAME)