source: products/quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py @ 3223

Last change on this file since 3223 was 3141, checked in by zidane, 13 years ago

fixes pyflakes

  • Property svn:eol-style set to native
File size: 3.6 KB
Line 
1import re
2import sys
3import urllib2
4
5from zope.interface import implements
6from zope.component import getUtility
7from zope.component import queryAdapter
8
9from Products.Five.browser import BrowserView
10
11from Products.CMFCore.utils import getToolByName
12from Products.CMFPlone.utils import safe_unicode, getSiteEncoding
13from Products.PortalTransforms.interfaces import IPortalTransformsTool
14
15from interfaces import IValidateSEOKeywordsView
16from quintagroup.seoptimizer import SeoptimizerMessageFactory as _
17from quintagroup.seoptimizer.browser.seo_configlet import ISEOConfigletSchema
18
19
20class ValidateSEOKeywordsView(BrowserView):
21
22    implements(IValidateSEOKeywordsView)
23
24    def validateKeywords(self):
25        """ see interface """
26        text = self.request.get('text')
27        ts = getToolByName(self.context, 'translation_service')
28        transforms = getUtility(IPortalTransformsTool)
29        portal = getToolByName(self.context, 'portal_url').getPortalObject()
30        query_adapter = queryAdapter(portal, ISEOConfigletSchema)
31        isExternal = query_adapter.external_keywords_test
32        # extract keywords from text
33        enc = getSiteEncoding(self.context)
34        if text.lower().strip():
35            keywords = filter(None, map(lambda x: safe_unicode(x.strip(), enc),
36                                         text.lower().strip().split('\n')))
37        else:
38            return ts.utranslate(domain='quintagroup.seoptimizer',
39                                 msgid=_(u'Keywords list is empty!'),
40                                 context=self.context)
41        # Get html page internally or with external request
42        error_url = ""
43        if isExternal:
44            # Not pass timeout option because:
45            # 1. its value get from the global default timeout settings.
46            # 2. timeout option added in python 2.6
47            #    (so acceptable only in plone4+)
48            try:
49                resp = urllib2.urlopen(self.context.absolute_url())
50                try:
51                    html = resp.read()
52                finally:
53                    resp.close()
54            except (urllib2.URLError, urllib2.HTTPError):
55                # In case of exceed timeout period or
56                # other URL connection errors.
57                # Get nearest to context error_log object
58                # (stolen from Zope2/App/startup.py)
59                html = None
60                info = sys.exc_info()
61                elog = getToolByName(self.context, "error_log")
62                error_url = elog.raising(info)
63        else:
64            html = unicode(self.context()).encode(enc)
65
66        # If no html - information about problem with page retrieval
67        # should be returned
68        result = []
69        if html is None:
70            result.append("Problem with page retrieval.")
71            if error_url:
72                result.append("Details at %s." % error_url)
73        else:
74            page_text = transforms.convert("html_to_text", html).getData()
75            # check every keyword on appearing in body of html page
76            for keyword in keywords:
77                keyword_on_page = unicode(len(re.findall(u'\\b%s\\b' % keyword,
78                                              page_text, re.I | re.U)))
79                result.append(' - '.join((keyword, keyword_on_page)))
80
81        return ts.utranslate(domain='quintagroup.seoptimizer',
82                             msgid=_(u'number_keywords',
83                                     default=u'Number of keywords at page:\n'
84                                              '${result}',
85                                     mapping={'result': '\n'.join(result)}),
86                             context=self.context)
Note: See TracBrowser for help on using the repository browser.