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

Last change on this file since 1261 was 1261, checked in by liebster, 15 years ago

Fixed bugs in metatags viewlet

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