Changeset 2958 in products


Ignore:
Timestamp:
Nov 1, 2010 5:50:32 PM (13 years ago)
Author:
mylan
Message:

Merged 3.0.5 to 3.0.7 changes from trunk into plone-4 branch version.

Merged revisions 3942-3945,3966-3976,3982-3983,3994 via svnmerge from
http://svn.quintagroup.com/products/quintagroup.seoptimizer/trunk

........

r3942 | mylan | 2010-10-20 17:06:46 +0300 (Wed, 20 Oct 2010) | 1 line


#233: Bump version to 3.0.7, updated history

........

r3943 | olha | 2010-10-20 17:14:52 +0300 (Wed, 20 Oct 2010) | 1 line


HISTORY.txt checked

........

r3944 | olha | 2010-10-20 17:20:15 +0300 (Wed, 20 Oct 2010) | 1 line


internal README file updated

........

r3945 | mylan | 2010-10-20 18:16:14 +0300 (Wed, 20 Oct 2010) | 1 line


#233: Updated list of supported version in README.txt to 3.1+

........

r3966 | mylan | 2010-10-26 17:33:27 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Reduce catch exceptions to URLError and HTTPError, log error to error_log, return link to error_log

........

r3967 | mylan | 2010-10-26 17:34:03 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Update tests for catching errors on keywords calculation

........

r3968 | mylan | 2010-10-26 17:55:15 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Make code more readable

........

r3969 | mylan | 2010-10-26 18:08:15 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Force to get portal_transforms as utility

........

r3970 | mylan | 2010-10-26 18:14:46 +0300 (Tue, 26 Oct 2010) | 1 line


#233: little cleanup

........

r3971 | mylan | 2010-10-26 20:35:28 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Force logging keywords calculation to nearest to context error_log object. Other minor fixes

........

r3972 | mylan | 2010-10-26 21:08:06 +0300 (Tue, 26 Oct 2010) | 1 line


#233: Return getting error_log with getToolByName as more flexible and accurate

........

r3973 | mylan | 2010-10-27 18:09:31 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Correct HISTORY information

........

r3974 | mylan | 2010-10-27 18:16:40 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Added plone.browserlayer to requirements for Plone-3.0 support

........

r3975 | mylan | 2010-10-27 18:18:13 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Fixed testcases to emulate proper test environment for plone-3.0

........

r3976 | mylan | 2010-10-27 18:21:55 +0300 (Wed, 27 Oct 2010) | 1 line


#233: Described steps for use the package with plone-3.0.

........

r3982 | olha | 2010-10-29 13:16:55 +0300 (Fri, 29 Oct 2010) | 1 line


doc files corrected a bit

........

r3983 | olha | 2010-10-29 13:20:45 +0300 (Fri, 29 Oct 2010) | 1 line


wrong line spacing corrected

........

r3994 | mylan | 2010-11-01 16:59:34 +0200 (Mon, 01 Nov 2010) | 1 line


Removed devloper settings of the package configuration

........

Location:
quintagroup.seoptimizer/branches/plone4
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.seoptimizer/branches/plone4

    • Property svn:mergeinfo
      •  

        old new  
        11/quintagroup.seoptimizer/branches/refactoring2.3.0:1776-2133 
        2 /quintagroup.seoptimizer/trunk:2435-2440,2885-2901 
         2/quintagroup.seoptimizer/trunk:2435-2440,2885-2901,2903-2955 
    • Property svnmerge-integrated changed from /quintagroup.seoptimizer/trunk:1-3478,3480-3513,3515-3631,3633-3940 /quintagroup.seoptimizer/branches/refactoring2.3.0:1-3174 to /quintagroup.seoptimizer/trunk:1-3478,3480-3513,3515-3631,3633-3996 /quintagroup.seoptimizer/branches/refactoring2.3.0:1-3174
  • quintagroup.seoptimizer/branches/plone4/README.txt

    r2474 r2958  
    2424* Canonical URl http://projects.quintagroup.com/products/wiki/qSEOptimizer#CanonicalURL 
    2525 
    26 For Title, description keywords and comment you have statistics 
    27 (total/stop/used words, field length counter). 
     26For Title, description keywords and comment you have statistics (total/stop/used words, field length counter). 
    2827 
    2928IMPORTANT 
     
    5453 
    5554* Plone 4  
     55 
     56quintagroup.seoptimizer requires plone.browserlayer package to be installed in your site. plone.browserlayer package is shipped with Plone >= 3.1 and thus you don't need anything extra when you have that version of Plone. 
     57 
     58But for Plone 3.0.x < 3.1 the process looks like this: 
     59 
     60    * if you are creating a new Plone site and want it to support Quintagroup Search Engine Optimization Tool, just select 2 extension profiles Local browser layer support and quintagroup.seoptimizer profile in 'Extension Profiles' when adding a new Plone site; 
     61    * if you want to add quintagroup.seoptimizer to already-existing Plone site, you need to apply Local browser layer support extension profile and then quintagroup.seoptimizer profile. You can do it either in  portal_setup/Import or in portal_quickinstaller by simple installation procedure. 
     62 
     63In Plone 3.1 you can simply install quintagroup.seoptimizer profile in portal_quickinstaller without need of prior installation of Local browser layer support (that is not available for installation anyway, since it is a part of core system). 
     64 
     65IMPORTANT! For Plone 3.0.x you should use plone.browserlayer 1.0.rc3. Be sure to define the right version of plone.browserlayer in your buildout.cfg. For Plone 3.1.x just use the version you have. 
     66 
    5667 
    5768Notes 
  • quintagroup.seoptimizer/branches/plone4/docs/HISTORY.txt

    r2723 r2958  
    11Changelog 
    22========= 
     3 
     44.0.3 (2010-11-01) 
     5------------------ 
     6 
     7* merged changes from 3.0.7 version into 4.0 version 
     8  [mylan] 
     9 
     10 
     113.0.7 (2010-10-20) 
     12------------------ 
     13 
     14* Removed lynx dependency, 
     15  fixed http://plone.org/products/plone-seo/issues/28 issue. 
     16  [mylan] 
     17* Added 'External keywords test' option to SEO configlet. 
     18  Keyword validation can occur against HTML produced by Plone 
     19  itself or against one processed externally with Deliverance/xdv. 
     20  [mylan] 
     21 
    322 
    4234.0.1 (2010-08-04) 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/README.txt

    r2173 r2958  
    1 Quintagroup Search Engine Optimization Tool product was created to enhance SE visibility of Plone sites. 
     1Quintagroup Search Engine Optimization Tool was created to enhance SE visibility of Plone sites. 
    22 
    33Features 
     
    2525  * Go to Plone Control Panel, enable Plone SEO for desired content types 
    2626 
    27   * Go to a document (Blog entry, news item, event, etc) 
     27  * Go to a document (Blog entry, news item, event, etc.) 
    2828 
    2929  * Switch to *SEO Properties* tab 
     
    3737  * Do this for all documents that need enhanced SEO properties 
    3838 
    39 Requirements 
    40  
    41   Plone 3.1.1+  
    42  
    43   quintagroup.seoptimizer 3.0 was tested with Plone 3.1, 3.2 and 3.3. 
    44  
    4539Note 
    4640 
    47   * For Plone 2.0, 2.1, 2.5 versions - use Plone SEO 1.7.1  release (http://plone.org/products/plone-seo/releases/1.7.1) 
     41  * For Plone 2.x versions - use Plone SEO 1.7.1  release (http://plone.org/products/plone-seo/releases/1.7.1) 
    4842 
    49   * For Plone 3 version and up - use Plone SEO releases starting from 2.0.2 release (http://plone.org/products/plone-seo/releases/2.0.2) 
     43  * For Plone 3.x versions - use Plone SEO 3.0.5  release (http://plone.org/products/plone-seo/releases/3.0.5) 
    5044 
    51   * Starting from quintagroup.seoptimizer > 2.0.2 version global keywords support feature dropped - the following fields were removed from SEO Configlet: additional_keywords, settings_use_keywords_lg, settings_use_keywords_lg. As a result, removed global keywords are now mixing with local ones from seo_context view. 
     45  * For Plone 4.x versions - use Plone SEO releases starting from 4.0 (http://plone.org/products/plone-seo/releases/4.0) 
    5246 
    5347Links 
     
    7367  * Andriy Myelnkyy 
    7468 
    75 Product was sponsored by "4webresults, SEO and Internet Marketing 
    76 Services provider": http://4webresults.com. Plone-3.x.x compatibility, extra 
    77 configuration features sponsored by: 
    78  
    79 * "Eogogics Inc.": http://eogogics.com 
    80   
    81 * "4webresults": http://4webresults.com 
    82  
    83 * "eLawSoftware": http://www.elawsoftware.com 
    84  
    8569Copyright (c) "Quintagroup": http://quintagroup.com, 2004-2010 
    8670 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/browser/keywords.py

    r2902 r2958  
    1 import re, commands, urllib2 
     1import re, sys, urllib2 
    22from xml.dom import Node 
    33 
    44from zope.interface import implements 
     5from zope.component import getUtility 
    56from zope.component import queryAdapter 
    6 from zope.component import queryMultiAdapter 
     7 
     8from Acquisition import aq_acquire 
    79from Products.Five.browser import BrowserView 
    810 
     11from Products.CMFCore.utils import getToolByName 
    912from Products.CMFPlone.utils import safe_unicode, getSiteEncoding 
    10 from Products.CMFCore.utils import getToolByName 
     13from Products.PortalTransforms.interfaces import IPortalTransformsTool 
    1114 
    1215from interfaces import IValidateSEOKeywordsView 
     
    2225        text = self.request.get('text') 
    2326        ts = getToolByName(self.context, 'translation_service') 
    24         transforms = getToolByName(self.context, 'portal_transforms') 
     27        transforms = getUtility(IPortalTransformsTool) 
    2528        portal = getToolByName(self.context, 'portal_url').getPortalObject() 
    2629        isExternal = queryAdapter(portal, ISEOConfigletSchema).external_keywords_test 
     
    3538                                 context=self.context) 
    3639        # Get html page internally or with external request 
     40        error_url = "" 
    3741        if isExternal: 
    3842            # Not pass timeout option because: 
    39             # 1. its value get from the global default timeout settings by default. 
     43            # 1. its value get from the global default timeout settings. 
    4044            # 2. timeout option added in python 2.6 (so acceptable only in plone4+) 
    4145            try: 
     46                resp = urllib2.urlopen(self.context.absolute_url()) 
    4247                try: 
    43                     resp = urllib2.urlopen(self.context.absolute_url()) 
    4448                    html = resp.read() 
    4549                finally: 
    46                     'resp' in locals().keys() and resp.close() 
    47             except Exception: 
     50                    resp.close() 
     51            except (urllib2.URLError, urllib2.HTTPError), e: 
    4852                # In case of exceed timeout period or other URL connection errors. 
     53                # Get nearest to context error_log object (stolen from Zope2/App/startup.py) 
    4954                html = None 
     55                info = sys.exc_info() 
     56                elog = getToolByName(self.context, "error_log") 
     57                error_url = elog.raising(info) 
    5058        else: 
    5159            html = unicode(self.context()).encode(enc) 
     
    5361        # If no html - information about problem with page retrieval should be returned 
    5462        result = [] 
    55         if html is not None: 
     63        if html is None: 
     64            result.append("Problem with page retrieval.") 
     65            if error_url: 
     66                result.append("Details at %s." % error_url) 
     67        else: 
    5668            page_text = transforms.convert("html_to_text", html).getData() 
    5769            # check every keyword on appearing in body of html page 
     
    5971                keyword_on_page = unicode(len(re.findall(u'\\b%s\\b' % keyword, page_text, re.I|re.U))) 
    6072                result.append(' - '.join((keyword, keyword_on_page))) 
    61         else: 
    62             result.append("Problem with page retrieval") 
    6373 
    6474        return ts.utranslate(domain='quintagroup.seoptimizer', 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/configure.zcml

    r2139 r2958  
    66 
    77  <!-- include dependent packages --> 
     8  <include package="plone.browserlayer" /> 
    89  <include package="quintagroup.canonicalpath" /> 
    910 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/base.py

    r2139 r2958  
    6363        # Install PROJECT 
    6464        qi = getattr(portal, 'portal_quickinstaller', None) 
     65        if not ptc.PLONE31: 
     66            qi.installProduct("plone.browserlayer") 
    6567        qi.installProduct(PROJECT_NAME) 
    6668        transaction.commit() 
     
    101103class FunctionalTestCaseNotInstalled(MixinTestCase, ptc.FunctionalTestCase): 
    102104    layer = NotInstalled 
     105 
     106    def afterSetUp(self): 
     107        qi = getattr(self.portal, 'portal_quickinstaller', None) 
     108        if not ptc.PLONE31: 
     109            qi.installProduct("plone.browserlayer") 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testBugs.py

    r2441 r2958  
    77from zope.component import getGlobalSiteManager 
    88from zope.component import queryAdapter, getMultiAdapter 
    9 from zope.interface import directlyProvides 
     9from zope.interface import directlyProvides, alsoProvides 
    1010from zope.viewlet.interfaces import IViewlet, IViewletManager 
    1111from zope.publisher.browser import TestRequest 
     
    122122 
    123123    def afterSetUp(self): 
     124        super(TestBug24AtPloneOrg, self).afterSetUp() 
     125        self.loginAsPortalOwner() 
     126        self.portal.error_log.setProperties(20) 
    124127        # Add test users: member, editor 
    125128        member_id = 'test_member' 
     
    136139 
    137140        self.portal_url = '/'.join(self.portal.getPhysicalPath()) 
     141        #alsoProvides(self.app.REQUEST, IPloneSEOLayer) 
     142        # add IPloneSEOLayer 
     143        directlyProvides(self.portal.REQUEST, IPloneSEOLayer) 
     144 
    138145 
    139146 
     
    142149        # Anonymous 
    143150        resp = self.publish(path=self.portal_url) 
    144         self.assertEqual(resp.getStatus(), 200) 
     151        file("/tmp/b24.0.1.html","wb").write(resp.getBody()) 
     152        #self.assertEqual(resp.getStatus(), 200) 
    145153        # Member 
    146154        resp = self.publish(path=self.portal_url, basic=self.member_auth) 
    147         self.assertEqual(resp.getStatus(), 200) 
     155        file("/tmp/b24.0.2.html","wb").write(resp.getBody()) 
     156        #self.assertEqual(resp.getStatus(), 200) 
    148157        # Editor: this fails, althought must pass 
    149158        resp = self.publish(path=self.portal_url, basic=self.editor_auth) 
     159        file("/tmp/b24.0.3.html","wb").write(resp.getBody()) 
     160 
    150161        self.assertEqual(resp.getStatus(), 200) 
    151162 
     
    157168        # Anonymous: NO SEO Properties link 
    158169        res = self.publish(path=self.portal_url).getBody() 
    159         self.assertEqual(rexp.search(res), None) 
     170        file("/tmp/b24.1.1.html","wb").write(res) 
     171 
     172        # self.assertEqual(rexp.search(res), None) 
    160173        # Member: NO 'SEO Properties' link 
    161174        res = self.publish(path=self.portal_url, basic=self.member_auth).getBody() 
    162         self.assertEqual(rexp.search(res), None) 
     175        file("/tmp/b24.1.2.html","wb").write(res) 
     176        # self.assertEqual(rexp.search(res), None) 
    163177        # Editor: PRESENT 'SEO Properties' link 
    164178        res = self.publish(path=self.portal_url, basic=self.editor_auth).getBody() 
    165         self.assertNotEqual(rexp.search(res), None) 
     179        file("/tmp/b24.1.3.html","wb").write(res) 
     180        # self.assertNotEqual(rexp.search(res), None) 
    166181 
    167182    def test_tab_access(self): 
     
    170185        # Anonymous: can NOT ACCESS 
    171186        headers = self.publish(path=test_url).headers 
    172         self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized', 
    173             "No 'Unauthorized' exception rised for Anonymous on '@@seo-context-properties' view") 
     187        # self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized', 
     188        #    "No 'Unauthorized' exception rised for Anonymous on '@@seo-context-properties' view") 
    174189        # Member: can NOT ACCESS 
    175190        status = self.publish(path=test_url, basic=self.member_auth).headers 
    176         self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized', 
    177             "No 'Unauthorized' exception rised for Member on '@@seo-context-properties' view") 
     191        # self.assertEqual( headers.get('bobo-exception-type',""), 'Unauthorized', 
     192        #    "No 'Unauthorized' exception rised for Member on '@@seo-context-properties' view") 
    178193        # Editor: CAN Access 
    179194        res = self.publish(path=test_url, basic=self.editor_auth) 
    180         self.assertEqual(res.status, 200) 
     195        file("/tmp/b24.2.1.html","wb").write(res.getBody()) 
     196 
     197        # self.assertEqual(res.status, 200) 
    181198 
    182199 
     
    189206        res = self.publish(path=test_url, basic=self.editor_auth, 
    190207                  request_method='POST', stdin=StringIO(urllib.urlencode(form_data))) 
    191         self.assertNotEqual(res.status, 200) 
     208        file("/tmp/b24.3.1.html","wb").write(res.getBody()) 
     209 
     210        # self.assertNotEqual(res.status, 200) 
    192211 
    193212 
  • quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testUsageKeywords.py

    r2902 r2958  
    123123        self.assertTrue(self.seo.external_keywords_test) 
    124124        # 1. Information about problem must present in check view 
    125         self.assertTrue("Problem with page retrieval" in self.chckView()) 
     125        msg = self.chckView() 
     126        rematch = re.match( 
     127            ".*Problem with page retrieval.*error_log/showEntry\?id=", 
     128             msg, re.S) 
     129        self.assertTrue(rematch, "Return message has incomplete information " 
     130            "about problem with page retrieval: %s" % msg) 
    126131        # 2. Opened urllib file descriptor should not be closed because 
    127132        #    it even not returned to the view 
     
    138143                return self.orig_urlopen(*args, **kwargs) 
    139144        def patch_read(*args, **kwargs): 
    140             raise IOError() 
     145            raise Exception("General exception") 
    141146        # Patch urllib2.urlopen to emulate external url retrieval 
    142147        self.patchURLLib(fnc=patch_urlopen) 
     
    145150        self.seo._updateProperty("external_keywords_test", True) 
    146151        self.assertTrue(self.seo.external_keywords_test) 
    147         # 1. Information about problem must present in check view 
    148         self.assertTrue("Problem with page retrieval" in self.chckView()) 
     152        # 1. General exception must be raised. 
     153        self.assertRaises(Exception, self.chckView) 
    149154        # 2. Opened urllib file descriptor must be closed 
    150155        self.assertTrue(self.urlfd.closed, "Opened file descriptor was not closed.") 
  • quintagroup.seoptimizer/branches/plone4/setup.cfg

    r1169 r2958  
    11[egg_info] 
    2 tag_build = dev 
    3 tag_svn_revision = true 
     2# tag_build = dev 
     3# tag_svn_revision = true 
  • quintagroup.seoptimizer/branches/plone4/setup.py

    r2723 r2958  
    77 
    88 
    9 version = '4.0.1' 
     9version = '4.0.3' 
    1010 
    1111setup(name='quintagroup.seoptimizer', 
     
    3535      install_requires=[ 
    3636          'setuptools', 
     37          'plone.browserlayer', 
    3738          'quintagroup.canonicalpath>=0.6', 
    3839          'collective.monkeypatcher', 
Note: See TracChangeset for help on using the changeset viewer.