class StylesheetSelectForm(form.Form):
    fields = field.Fields(IStylesheetSelect)
    label = _(u"Citations Style")
    description = _(u"Style for citations.")

    def getContent(self):
        annotations = IAnnotations(self.context)
        curr_style = annotations.get(STYLESHEET_SELECTED_KEY)
        return { 'style': curr_style }

    @button.buttonAndHandler(u'Select Style')
    def handleApply(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        assert IAttributeAnnotatable.providedBy(self.context)
        annotations = IAnnotations(self.context)
        annotations[STYLESHEET_SELECTED_KEY] = data['style']

        self.request.response.redirect(self.context.absolute_url())
        messages = IStatusMessage(self.request)
        messages.add(_(u"Citation style set: ") + data['style'], type=u"info")
class IStylesheetSelect(interface.Interface):
    stylesheet = schema.Choice(
            __name__="style",
            title=_(u'Style'),
            description=_(u'Select the style to use for citations.'),
            required=True,
            vocabulary=u'collective.citationstyles.vocabularies.SelectableStylesheets'
            )
class ISettings(Interface):
    citation_styles = schema.Dict(
        title=_(u'Citation Styles'),
        description=_(u'Specify name/content pairs for citation styles'),
        key_type=schema.TextLine(),
        value_type=schema.Text(),
        default=None)

    default_style = schema.TextLine(
        title=_(u'Default Style'),
        description=_(u'The default citation style to use on the site'),
        default=DEFAULT_CSL)
    def update(self):
        processInputs(self.request)

        self.errors = {}
        submitted = False
        form = self.request.form
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)

        if 'form.button.Cancel' in form:
            IStatusMessage(self.request).add(_(u'Changes canceled.'))
            portal_url = getToolByName(self.context, 'portal_url')()
            self.request.response.redirect("%s/plone_control_panel" %
                                           portal_url)
            return False

        if 'form.button.Save' in form:
            self.authorize()
            submitted = True
            default = form.get('default_style', None)
            settings.default_style = default
            style_file = form.get('csl_file', None)
            if style_file is not None and style_file.filename:
                citation_styles = settings.citation_styles
                if citation_styles is None:
                    citation_styles = {}
                style = etree.parse(style_file).getroot()
                style_info = style.find(
                    '{http://purl.org/net/xbiblio/csl}info')
                style_id = unicode(
                    style_info.find(
                        '{http://purl.org/net/xbiblio/csl}title').text)
                citation_styles[style_id] = unicode(etree.tostring(style))
                settings.citation_styles = citation_styles

        if submitted and not self.errors:
            IStatusMessage(self.request).add(u"Updated citation styles")
        elif submitted:
            IStatusMessage(self.request).add(_(u"There were errors"), 'error')

        return True
    def update(self):
        processInputs(self.request)

        self.errors = {}
        submitted = False
        form = self.request.form
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)

        if 'form.button.Cancel' in form:
            IStatusMessage(self.request).add(_(u'Changes canceled.'))
            portal_url = getToolByName(self.context, 'portal_url')()
            self.request.response.redirect("%s/plone_control_panel"%
                                           portal_url)
            return False

        if 'form.button.Save' in form:
            self.authorize()
            submitted = True
            default = form.get('default_style', None)
            settings.default_style = default
            style_file = form.get('csl_file', None)
            if style_file is not None and style_file.filename:
                citation_styles = settings.citation_styles
                if citation_styles is None:
                    citation_styles = {}
                style = etree.parse(style_file).getroot()
                style_info = style.find('{http://purl.org/net/xbiblio/csl}info')
                style_id = unicode(style_info.find('{http://purl.org/net/xbiblio/csl}title').text)
                citation_styles[style_id] = unicode(etree.tostring(style))
                settings.citation_styles = citation_styles

        if submitted and not self.errors:
            IStatusMessage(self.request).add(u"Updated citation styles")
        elif submitted:
            IStatusMessage(self.request).add(_(u"There were errors"), 'error')

        return True
    def handleApply(self, action):
        data, errors = self.extractData()

        if errors:
            self.status = self.formErrorsMessage
            return

        assert IAttributeAnnotatable.providedBy(self.context)
        annotations = IAnnotations(self.context)
        annotations[STYLESHEET_SELECTED_KEY] = data['style']

        self.request.response.redirect(self.context.absolute_url())
        messages = IStatusMessage(self.request)
        messages.add(_(u"Citation style set: ") + data['style'], type=u"info")
    def __call__(self, context):
        terms = []

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)

        default_label = '%s (%s)' % (_(u'Site default'), settings.default_style)
        terms.append(SimpleVocabulary.createTerm('', '', default_label))

        citation_styles = settings.citation_styles
        for style in citation_styles.keys():
            token_val = style
            if isinstance(token_val, unicode):
                # escape unicode so that the token rendered in the form is
                # guaranteed to be only 7 bits
                token_val = style.encode('unicode_escape')
            terms.append(SimpleVocabulary.createTerm(style, token_val, style))
        return SimpleVocabulary(terms)
Ejemplo n.º 8
0
    def __call__(self, context):
        terms = []

        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)

        default_label = '%s (%s)' % (_(u'Site default'),
                                     settings.default_style)
        terms.append(SimpleVocabulary.createTerm('', '', default_label))

        citation_styles = settings.citation_styles
        for style in citation_styles.keys():
            token_val = style
            if isinstance(token_val, unicode):
                # escape unicode so that the token rendered in the form is
                # guaranteed to be only 7 bits
                token_val = style.encode('unicode_escape')
            terms.append(SimpleVocabulary.createTerm(style, token_val, style))
        return SimpleVocabulary(terms)
class SettingsControlPanelView(ControlPanelView):

    label = _(u'Citation Styles')
    description = _(u'Use this control panel to upload '
                    'citation styles in CSL format and '
                    'select the default style for the '
                    'site.')

    def __call__(self):
        if self.update():
            return self.index()
        return ''

    def update(self):
        processInputs(self.request)

        self.errors = {}
        submitted = False
        form = self.request.form
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)

        if 'form.button.Cancel' in form:
            IStatusMessage(self.request).add(_(u'Changes canceled.'))
            portal_url = getToolByName(self.context, 'portal_url')()
            self.request.response.redirect("%s/plone_control_panel" %
                                           portal_url)
            return False

        if 'form.button.Save' in form:
            self.authorize()
            submitted = True
            default = form.get('default_style', None)
            settings.default_style = default
            style_file = form.get('csl_file', None)
            if style_file is not None and style_file.filename:
                citation_styles = settings.citation_styles
                if citation_styles is None:
                    citation_styles = {}
                style = etree.parse(style_file).getroot()
                style_info = style.find(
                    '{http://purl.org/net/xbiblio/csl}info')
                style_id = unicode(
                    style_info.find(
                        '{http://purl.org/net/xbiblio/csl}title').text)
                citation_styles[style_id] = unicode(etree.tostring(style))
                settings.citation_styles = citation_styles

        if submitted and not self.errors:
            IStatusMessage(self.request).add(u"Updated citation styles")
        elif submitted:
            IStatusMessage(self.request).add(_(u"There were errors"), 'error')

        return True

    @property
    def default_style(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)
        return settings.default_style

    @memoize
    def selectable_styles(self):
        registry = getUtility(IRegistry)
        settings = registry.forInterface(ISettings)
        citation_styles = settings.citation_styles
        if citation_styles is None:
            return []
        styles = []
        for style in citation_styles.keys():
            styles.append({'id': style, 'title': style})
        return styles

    def authorize(self):
        authenticator = getMultiAdapter((self.context, self.request),
                                        name=u"authenticator")
        if not authenticator.verify():
            raise Unauthorized