import re
from zope.interface import Interface
from zope.interface import implements
from zope.component import adapts
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary
from zope.schema import Bool, Text, Choice, Tuple, List
from zope.app.form.browser import RadioWidget
from zope.formlib.form import FormFields
from zope.app.component.hooks import getSite
from zope.app.form.browser import TextAreaWidget
from plone.app.controlpanel.form import ControlPanelForm
from plone.app.controlpanel.widgets import MultiCheckBoxThreeColumnWidget
from Products.CMFCore.utils import getToolByName
from Products.CMFDefault.formlib.schema import ProxyFieldProperty
from Products.CMFDefault.formlib.schema import SchemaAdapterBase
from Products.CMFPlone.interfaces import IPloneSiteRoot
from quintagroup.seoptimizer import SeoptimizerMessageFactory as _
# Configlet schema
class ISEOConfigletSchema(Interface):
exposeDCMetaTags = Bool(
title=_("label_exposeDCMetaTags",
default='Expose DC meta tags'),
description=_("description_seo_dc_metatags",
default='Controls if DC '
'metatags are exposed to page header. They include '
'DC.description, DC.type, DC.format, DC.creator and '
'others.'),
default=True,
required=False)
default_custom_metatags = List(
title=_("label_default_custom_metatags", default='Default custom metatags.'),
description=_("help_default_custom_metatags",
default='Fill in custom metatag names (one per line) which will'
'appear on qseo_properties edit tab. Example: '
'"metaname|metacontent" or "metaname".'),
required=False)
metatags_order = List(
title=_("label_metatags_order",
default='Meta tags order in the page.'),
description=_("help_metatags_order",
default='Fill in meta tags (one per line) in the order in which'
' they will appear on site source pages. Example: '
'"metaname accessor".'),
required=False)
types_seo_enabled = Tuple(
title=_("label_content_type_title", default='Content Types'),
description=_("description_seo_content_types",
default='Select content types that will have SEO properties '
'enabled.'),
required=False,
missing_value=tuple(),
value_type=Choice(
vocabulary="plone.app.vocabularies.ReallyUserFriendlyTypes"))
class SEOConfigletAdapter(SchemaAdapterBase):
adapts(IPloneSiteRoot)
implements(ISEOConfigletSchema)
def __init__(self, context):
super(SEOConfigletAdapter, self).__init__(context)
self.portal = getSite()
pprop = getToolByName(self.portal, 'portal_properties')
self.context = pprop.seo_properties
self.siteprops = pprop.site_properties
self.ttool = getToolByName(context, 'portal_types')
def getExposeDC(self):
return self.siteprops.getProperty('exposeDCMetaTags')
def setExposeDC(self, value):
return self.siteprops._updateProperty('exposeDCMetaTags', bool(value))
def getTypesSEOEnabled(self):
ct_with_seo = self.context.content_types_with_seoproperties
return [t for t in self.ttool.listContentTypes() if t in ct_with_seo]
def setTypesSEOEnabled(self, value):
value = [t for t in self.ttool.listContentTypes() if t in value]
self.context._updateProperty('content_types_with_seoproperties', value)
exposeDCMetaTags = property(getExposeDC, setExposeDC)
default_custom_metatags = ProxyFieldProperty(ISEOConfigletSchema['default_custom_metatags'])
metatags_order = ProxyFieldProperty(ISEOConfigletSchema['metatags_order'])
types_seo_enabled = property(getTypesSEOEnabled, setTypesSEOEnabled)
class SmallTextAreaWidget(TextAreaWidget):
height = 5
splitter = re.compile(u'\\r?\\n', re.S|re.U)
def _toFieldValue(self, value):
return filter(None, self.splitter.split(value))
def _toFormValue(self, value):
return u'\r\n'.join(list(value))
class SEOConfiglet(ControlPanelForm):
form_fields = FormFields(ISEOConfigletSchema)
form_fields['default_custom_metatags'].custom_widget = SmallTextAreaWidget
form_fields['metatags_order'].custom_widget = SmallTextAreaWidget
form_fields['types_seo_enabled'].custom_widget = MultiCheckBoxThreeColumnWidget
form_fields['types_seo_enabled'].custom_widget.cssClass='label'
label = _("Search Engine Optimizer configuration")
description = _("seo_configlet_description", default="You can select what "
"content types are qSEOptimizer-enabled, and control if "
"Dublin Core metatags are exposed in the header of content "
"pages.")
form_name = _("")