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

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

fixes pyflakes

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