source: products/quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/viewlets.py @ 957

Last change on this file since 957 was 957, checked in by crchemist, 17 years ago

[release] qPloneCaptchas-1.2.3 (Added Spanish translation)

  • Property svn:eol-style set to native
File size: 6.0 KB
Line 
1from zope.component import getMultiAdapter
2from zope.viewlet.interfaces import IViewlet
3from Products.CMFPlone.utils import safe_unicode
4from plone.app.layout.viewlets.common import ViewletBase
5from Products.CMFCore.utils import getToolByName
6from AccessControl import Unauthorized
7from quintagroup.seoptimizer.util import SortedDict
8from quintagroup.seoptimizer.interfaces import IKeywords
9
10class TitleCommentViewlet(ViewletBase):
11
12    def update(self):
13        self.portal_state = getMultiAdapter((self.context, self.request),
14                                            name=u'plone_portal_state')
15        self.context_state = getMultiAdapter((self.context, self.request),
16                                             name=u'plone_context_state')
17        self.page_title = self.context_state.object_title
18        self.portal_title = self.portal_state.portal_title
19
20        self.override_title = self.context.hasProperty('qSEO_title')
21        self.override_comments = self.context.hasProperty('qSEO_html_comment')
22
23    def render(self):
24        std_title = u"<title>%s &mdash; %s</title>" % ( safe_unicode(self.page_title()),
25                                                        safe_unicode(self.portal_title())
26                                                      )
27        seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
28        if not self.override_title:
29            if not self.override_comments:
30                return std_title
31            else:
32                qseo_comments = u"<!--%s-->"%safe_unicode(seo_context.seo_html_comment())
33                return u"%s\n%s"%(std_title, qseo_comments)
34        else:
35            qseo_title = u"<title>%s</title>" % safe_unicode(seo_context.seo_title())
36            if not self.override_comments:
37                return qseo_title
38            else:
39                qseo_comments = u"<!--%s-->"%safe_unicode(seo_context.seo_html_comment())
40                return u"%s\n%s"%(qseo_title, qseo_comments)
41
42class HTTPEquiv(ViewletBase):
43   
44    def charset( self ):
45        context = self.context.aq_inner
46        site_properties = getToolByName( context, 'portal_properties').site_properties
47        return site_properties.getProperty('default_charset', 'utf-8')
48   
49    def render( self ):
50        return """<meta http-equiv="Content-Type" content="text/html; charset=%s" />"""%self.charset()
51         
52class BaseUrlViewlet( ViewletBase ):
53    """
54       simpel viewlet for base href rendering
55    """
56    def renderBase( self ):
57        # returns correct base href
58        context = self.context.aq_inner
59        isFolder = getattr(context.aq_explicit, 'isPrincipiaFolderish', 0)
60        base_url = context.absolute_url()
61
62        # when accessing via WEBDAV you're not allowed to access aq_explicit
63        try:
64            return isFolder and '%s/'%base_url or base_url
65        except (Unauthorized, 'Unauthorized'):
66            pass
67
68    def render( self ):
69        return """<base href="%s" /><!--[if lt IE 7]></base><![endif]-->"""% self.renderBase()
70
71class MetaTagsViewlet( ViewletBase ):
72
73    def listMetaTags( self ):
74        context = self.context.aq_inner
75        portal_props = getToolByName(context, 'portal_properties')
76        pu = getToolByName(context, 'plone_utils')
77        seo_props = getToolByName(portal_props, 'seo_properties', None)
78        if seo_props is None:
79            return pu.listMetaTags(context)
80
81        site_props = getToolByName(portal_props, 'site_properties')
82        exposeDCMetaTags = site_props.exposeDCMetaTags
83
84        metaTags = SortedDict()
85        metaTags.update(pu.listMetaTags(context))
86        metadataList = [
87            ('seo_description', 'description'),
88            ('seo_keywords',    'keywords'),
89            ('seo_robots',      'robots'),
90            ('seo_distribution','distribution')]
91
92        if exposeDCMetaTags:
93            metadataList.append(('qSEO_Distribution', 'DC.distribution'))
94
95        seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
96        for accessor, key in metadataList:
97            method = getattr(seo_context, accessor, None)
98            if not callable(method):
99                # ups
100                continue
101            # Catch AttributeErrors raised by some AT applications
102            try:
103                value = method()
104            except AttributeError:
105                value = None
106
107            if not value:
108                continue
109            if isinstance(value, (tuple, list)):
110                value = ', '.join(value)
111
112            metaTags[key] = value
113
114        # add custom meta tags (added from qseo tab by user) for given context
115        property_prefix = 'qSEO_custom_'
116        for property, value in context.propertyItems():
117            idx = property.find(property_prefix)
118            if idx == 0 and len(property) > len(property_prefix):
119                metaTags[property[len(property_prefix):]] = value
120
121        # Set the additional matching keywords, if any
122        adapter = IKeywords(context, None)
123        if adapter is not None:
124            keywords = adapter.listKeywords()
125            if keywords:
126                metaTags['keywords'] = keywords
127
128        return metaTags
129
130    def render( self ):
131        return '\n'.join([safe_unicode("""<meta name="%s" content="%s" />"""%(name, content)) \
132                                       for name, content in self.listMetaTags().items()])
133
134class CustomScriptViewlet( ViewletBase ):
135
136    def getCustomScript( self ):
137        context = self.context.aq_inner
138        portal_props = getToolByName(context, 'portal_properties')
139        seo_props = getToolByName(portal_props, 'seo_properties', None)
140        if seo_props is None:
141            return '' 
142        return seo_props.getProperty('custom_script', '')
143
144    def render( self ):
145        return safe_unicode("""%s"""% self.getCustomScript())
146
147
148class CanonicalUrlViewlet( ViewletBase ):
149    """
150       simple viewlet for canonical url link rendering
151    """
152
153    def render( self ):
154        seo_context = getMultiAdapter((self.context, self.request), name='seo_context')
155        return """<link rel="canonical" href="%s" />""" % seo_context.seo_canonical()
156
Note: See TracBrowser for help on using the repository browser.