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)
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