from zope.component import getMultiAdapter
from zope.viewlet.interfaces import IViewlet
from Products.CMFPlone.utils import safe_unicode
from plone.app.layout.viewlets.common import ViewletBase
from Products.CMFCore.utils import getToolByName
from AccessControl import Unauthorized
from quintagroup.seoptimizer.util import SortedDict
from quintagroup.seoptimizer.interfaces import IKeywords
class TitleCommentViewlet(ViewletBase):
def update(self):
self.portal_state = getMultiAdapter((self.context, self.request),
name=u'plone_portal_state')
self.context_state = getMultiAdapter((self.context, self.request),
name=u'plone_context_state')
self.page_title = self.context_state.object_title
self.portal_title = self.portal_state.portal_title
self.override_title = self.context.hasProperty('qSEO_title')
self.override_comments = self.context.hasProperty('qSEO_html_comment')
def render(self):
std_title = u"
%s — %s" % ( safe_unicode(self.page_title()),
safe_unicode(self.portal_title())
)
seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
if not self.override_title:
if not self.override_comments:
return std_title
else:
qseo_comments = u""%safe_unicode(seo_context.seo_html_comment())
return u"%s\n%s"%(std_title, qseo_comments)
else:
qseo_title = u"%s" % safe_unicode(seo_context.seo_title())
if not self.override_comments:
return qseo_title
else:
qseo_comments = u""%safe_unicode(seo_context.seo_html_comment())
return u"%s\n%s"%(qseo_title, qseo_comments)
class HTTPEquiv(ViewletBase):
def charset( self ):
context = self.context.aq_inner
site_properties = getToolByName( context, 'portal_properties').site_properties
return site_properties.getProperty('default_charset', 'utf-8')
def render( self ):
return """"""%self.charset()
class BaseUrlViewlet( ViewletBase ):
"""
simpel viewlet for base href rendering
"""
def renderBase( self ):
# returns correct base href
context = self.context.aq_inner
isFolder = getattr(context.aq_explicit, 'isPrincipiaFolderish', 0)
base_url = context.absolute_url()
# when accessing via WEBDAV you're not allowed to access aq_explicit
try:
return isFolder and '%s/'%base_url or base_url
except (Unauthorized, 'Unauthorized'):
pass
def render( self ):
return """"""% self.renderBase()
class MetaTagsViewlet( ViewletBase ):
def listMetaTags( self ):
context = self.context.aq_inner
portal_props = getToolByName(context, 'portal_properties')
pu = getToolByName(context, 'plone_utils')
seo_props = getToolByName(portal_props, 'seo_properties', None)
if seo_props is None:
return pu.listMetaTags(context)
site_props = getToolByName(portal_props, 'site_properties')
exposeDCMetaTags = site_props.exposeDCMetaTags
metaTags = SortedDict()
metaTags.update(pu.listMetaTags(context))
metadataList = [
('seo_description', 'description'),
('seo_keywords', 'keywords'),
('seo_robots', 'robots'),
('seo_distribution','distribution')]
if exposeDCMetaTags:
metadataList.append(('qSEO_Distribution', 'DC.distribution'))
seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
for accessor, key in metadataList:
method = getattr(seo_context, accessor, None)
if not callable(method):
# ups
continue
# Catch AttributeErrors raised by some AT applications
try:
value = method()
except AttributeError:
value = None
if not value:
continue
if isinstance(value, (tuple, list)):
value = ', '.join(value)
metaTags[key] = value
# add custom meta tags (added from qseo tab by user) for given context
property_prefix = 'qSEO_custom_'
for property, value in context.propertyItems():
idx = property.find(property_prefix)
if idx == 0 and len(property) > len(property_prefix):
metaTags[property[len(property_prefix):]] = value
# Set the additional matching keywords, if any
adapter = IKeywords(context, None)
if adapter is not None:
keywords = adapter.listKeywords()
if keywords:
metaTags['keywords'] = keywords
return metaTags
def render( self ):
return '\n'.join([safe_unicode(""""""%(name, content)) \
for name, content in self.listMetaTags().items()])
class CustomScriptViewlet( ViewletBase ):
def getCustomScript( self ):
context = self.context.aq_inner
portal_props = getToolByName(context, 'portal_properties')
seo_props = getToolByName(portal_props, 'seo_properties', None)
if seo_props is None:
return ''
return seo_props.getProperty('custom_script', '')
def render( self ):
return safe_unicode("""%s"""% self.getCustomScript())
class CanonicalUrlViewlet( ViewletBase ):
"""
simple viewlet for canonical url link rendering
"""
def render( self ):
seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
return """""" % seo_context.seo_canonical()