Changeset 2958 in products
- Timestamp:
- Nov 1, 2010 5:50:32 PM (13 years ago)
- Location:
- quintagroup.seoptimizer/branches/plone4
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.seoptimizer/branches/plone4
- Property svn:mergeinfo
-
old new 1 1 /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
- Property svn:mergeinfo
-
quintagroup.seoptimizer/branches/plone4/README.txt
r2474 r2958 24 24 * Canonical URl http://projects.quintagroup.com/products/wiki/qSEOptimizer#CanonicalURL 25 25 26 For Title, description keywords and comment you have statistics 27 (total/stop/used words, field length counter). 26 For Title, description keywords and comment you have statistics (total/stop/used words, field length counter). 28 27 29 28 IMPORTANT … … 54 53 55 54 * Plone 4 55 56 quintagroup.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 58 But 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 63 In 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 65 IMPORTANT! 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 56 67 57 68 Notes -
quintagroup.seoptimizer/branches/plone4/docs/HISTORY.txt
r2723 r2958 1 1 Changelog 2 2 ========= 3 4 4.0.3 (2010-11-01) 5 ------------------ 6 7 * merged changes from 3.0.7 version into 4.0 version 8 [mylan] 9 10 11 3.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 3 22 4 23 4.0.1 (2010-08-04) -
quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/README.txt
r2173 r2958 1 Quintagroup Search Engine Optimization Tool productwas created to enhance SE visibility of Plone sites.1 Quintagroup Search Engine Optimization Tool was created to enhance SE visibility of Plone sites. 2 2 3 3 Features … … 25 25 * Go to Plone Control Panel, enable Plone SEO for desired content types 26 26 27 * Go to a document (Blog entry, news item, event, etc )27 * Go to a document (Blog entry, news item, event, etc.) 28 28 29 29 * Switch to *SEO Properties* tab … … 37 37 * Do this for all documents that need enhanced SEO properties 38 38 39 Requirements40 41 Plone 3.1.1+42 43 quintagroup.seoptimizer 3.0 was tested with Plone 3.1, 3.2 and 3.3.44 45 39 Note 46 40 47 * For Plone 2. 0, 2.1, 2.5versions - 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) 48 42 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) 50 44 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) 52 46 53 47 Links … … 73 67 * Andriy Myelnkyy 74 68 75 Product was sponsored by "4webresults, SEO and Internet Marketing76 Services provider": http://4webresults.com. Plone-3.x.x compatibility, extra77 configuration features sponsored by:78 79 * "Eogogics Inc.": http://eogogics.com80 81 * "4webresults": http://4webresults.com82 83 * "eLawSoftware": http://www.elawsoftware.com84 85 69 Copyright (c) "Quintagroup": http://quintagroup.com, 2004-2010 86 70 -
quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/browser/keywords.py
r2902 r2958 1 import re, commands, urllib21 import re, sys, urllib2 2 2 from xml.dom import Node 3 3 4 4 from zope.interface import implements 5 from zope.component import getUtility 5 6 from zope.component import queryAdapter 6 from zope.component import queryMultiAdapter 7 8 from Acquisition import aq_acquire 7 9 from Products.Five.browser import BrowserView 8 10 11 from Products.CMFCore.utils import getToolByName 9 12 from Products.CMFPlone.utils import safe_unicode, getSiteEncoding 10 from Products. CMFCore.utils import getToolByName13 from Products.PortalTransforms.interfaces import IPortalTransformsTool 11 14 12 15 from interfaces import IValidateSEOKeywordsView … … 22 25 text = self.request.get('text') 23 26 ts = getToolByName(self.context, 'translation_service') 24 transforms = get ToolByName(self.context, 'portal_transforms')27 transforms = getUtility(IPortalTransformsTool) 25 28 portal = getToolByName(self.context, 'portal_url').getPortalObject() 26 29 isExternal = queryAdapter(portal, ISEOConfigletSchema).external_keywords_test … … 35 38 context=self.context) 36 39 # Get html page internally or with external request 40 error_url = "" 37 41 if isExternal: 38 42 # 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. 40 44 # 2. timeout option added in python 2.6 (so acceptable only in plone4+) 41 45 try: 46 resp = urllib2.urlopen(self.context.absolute_url()) 42 47 try: 43 resp = urllib2.urlopen(self.context.absolute_url())44 48 html = resp.read() 45 49 finally: 46 'resp' in locals().keys() andresp.close()47 except Exception:50 resp.close() 51 except (urllib2.URLError, urllib2.HTTPError), e: 48 52 # 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) 49 54 html = None 55 info = sys.exc_info() 56 elog = getToolByName(self.context, "error_log") 57 error_url = elog.raising(info) 50 58 else: 51 59 html = unicode(self.context()).encode(enc) … … 53 61 # If no html - information about problem with page retrieval should be returned 54 62 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: 56 68 page_text = transforms.convert("html_to_text", html).getData() 57 69 # check every keyword on appearing in body of html page … … 59 71 keyword_on_page = unicode(len(re.findall(u'\\b%s\\b' % keyword, page_text, re.I|re.U))) 60 72 result.append(' - '.join((keyword, keyword_on_page))) 61 else:62 result.append("Problem with page retrieval")63 73 64 74 return ts.utranslate(domain='quintagroup.seoptimizer', -
quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/configure.zcml
r2139 r2958 6 6 7 7 <!-- include dependent packages --> 8 <include package="plone.browserlayer" /> 8 9 <include package="quintagroup.canonicalpath" /> 9 10 -
quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/base.py
r2139 r2958 63 63 # Install PROJECT 64 64 qi = getattr(portal, 'portal_quickinstaller', None) 65 if not ptc.PLONE31: 66 qi.installProduct("plone.browserlayer") 65 67 qi.installProduct(PROJECT_NAME) 66 68 transaction.commit() … … 101 103 class FunctionalTestCaseNotInstalled(MixinTestCase, ptc.FunctionalTestCase): 102 104 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 7 7 from zope.component import getGlobalSiteManager 8 8 from zope.component import queryAdapter, getMultiAdapter 9 from zope.interface import directlyProvides 9 from zope.interface import directlyProvides, alsoProvides 10 10 from zope.viewlet.interfaces import IViewlet, IViewletManager 11 11 from zope.publisher.browser import TestRequest … … 122 122 123 123 def afterSetUp(self): 124 super(TestBug24AtPloneOrg, self).afterSetUp() 125 self.loginAsPortalOwner() 126 self.portal.error_log.setProperties(20) 124 127 # Add test users: member, editor 125 128 member_id = 'test_member' … … 136 139 137 140 self.portal_url = '/'.join(self.portal.getPhysicalPath()) 141 #alsoProvides(self.app.REQUEST, IPloneSEOLayer) 142 # add IPloneSEOLayer 143 directlyProvides(self.portal.REQUEST, IPloneSEOLayer) 144 138 145 139 146 … … 142 149 # Anonymous 143 150 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) 145 153 # Member 146 154 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) 148 157 # Editor: this fails, althought must pass 149 158 resp = self.publish(path=self.portal_url, basic=self.editor_auth) 159 file("/tmp/b24.0.3.html","wb").write(resp.getBody()) 160 150 161 self.assertEqual(resp.getStatus(), 200) 151 162 … … 157 168 # Anonymous: NO SEO Properties link 158 169 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) 160 173 # Member: NO 'SEO Properties' link 161 174 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) 163 177 # Editor: PRESENT 'SEO Properties' link 164 178 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) 166 181 167 182 def test_tab_access(self): … … 170 185 # Anonymous: can NOT ACCESS 171 186 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") 174 189 # Member: can NOT ACCESS 175 190 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") 178 193 # Editor: CAN Access 179 194 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) 181 198 182 199 … … 189 206 res = self.publish(path=test_url, basic=self.editor_auth, 190 207 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) 192 211 193 212 -
quintagroup.seoptimizer/branches/plone4/quintagroup/seoptimizer/tests/testUsageKeywords.py
r2902 r2958 123 123 self.assertTrue(self.seo.external_keywords_test) 124 124 # 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) 126 131 # 2. Opened urllib file descriptor should not be closed because 127 132 # it even not returned to the view … … 138 143 return self.orig_urlopen(*args, **kwargs) 139 144 def patch_read(*args, **kwargs): 140 raise IOError()145 raise Exception("General exception") 141 146 # Patch urllib2.urlopen to emulate external url retrieval 142 147 self.patchURLLib(fnc=patch_urlopen) … … 145 150 self.seo._updateProperty("external_keywords_test", True) 146 151 self.assertTrue(self.seo.external_keywords_test) 147 # 1. Information about problem must present in check view148 self.assert True("Problem with page retrieval" in self.chckView())152 # 1. General exception must be raised. 153 self.assertRaises(Exception, self.chckView) 149 154 # 2. Opened urllib file descriptor must be closed 150 155 self.assertTrue(self.urlfd.closed, "Opened file descriptor was not closed.") -
quintagroup.seoptimizer/branches/plone4/setup.cfg
r1169 r2958 1 1 [egg_info] 2 tag_build = dev3 tag_svn_revision = true2 # tag_build = dev 3 # tag_svn_revision = true -
quintagroup.seoptimizer/branches/plone4/setup.py
r2723 r2958 7 7 8 8 9 version = '4.0. 1'9 version = '4.0.3' 10 10 11 11 setup(name='quintagroup.seoptimizer', … … 35 35 install_requires=[ 36 36 'setuptools', 37 'plone.browserlayer', 37 38 'quintagroup.canonicalpath>=0.6', 38 39 'collective.monkeypatcher',
Note: See TracChangeset
for help on using the changeset viewer.