Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d67ee13

Browse files
committed
simplify seo code
1 parent 8045b47 commit d67ee13

File tree

9 files changed

+170
-104
lines changed

9 files changed

+170
-104
lines changed

element/plugins/seo/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# vim: set fileencoding=utf-8 :
22

3+
from element.plugins.seo.seo import *

element/plugins/seo/di.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ def load(self, config, container_builder):
66
path = os.path.dirname(os.path.abspath(__file__))
77

88
loader = ioc.loader.YamlLoader()
9-
loader.load("%s/resources/config/handler_seo.yml" % path, container_builder)
10-
loader.load("%s/resources/config/listener_seo.yml" % path, container_builder)
9+
loader.load("%s/resources/config/seo.yml" % path, container_builder)
1110

1211
container_builder.parameters.set('element.seo.page.title_pattern', config.get_all('title_pattern', 'Python Element : %s'))
1312
container_builder.parameters.set('element.seo.page.metas', config.get_all('metas', {}))

element/plugins/seo/listener.py

Lines changed: 0 additions & 61 deletions
This file was deleted.

element/plugins/seo/resources/config/handler_seo.yml

Lines changed: 0 additions & 11 deletions
This file was deleted.

element/plugins/seo/resources/config/listener_seo.yml

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
services:
2+
element.plugins.seo.page:
3+
class: element.plugins.seo.SeoPage
4+
arguments:
5+
- "%element.seo.page.title_pattern%"
6+
- "%element.seo.page.metas%"
7+
- "%element.seo.page.keywords%"
8+
9+
element.plugins.listener.seo:
10+
class: element.plugins.seo.SeoListener
11+
arguments:
12+
- "@element.plugins.seo.page"
13+
tags:
14+
event.listener:
15+
- { name: element.seo.headers, method: listener }
16+
17+
element.plugins.seo:
18+
class: element.plugins.seo.SeoHandler
19+
arguments:
20+
- '@ioc.extra.jinja2'
21+
tags:
22+
element.handler:
23+
- { name: seo.headers }

element/plugins/seo/seo.py

Lines changed: 77 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,81 @@
11
import element.node
2+
from ioc.helper import deepcopy
3+
4+
class SeoPage(object):
5+
def __init__(self, title_pattern="%s", metas=None, keywords=None):
6+
self.title_pattern = title_pattern
7+
self.metas = metas or {}
8+
self.keywords = keywords or []
9+
10+
class SeoListener(object):
11+
def __init__(self, seo_page):
12+
self.seo_page = seo_page
13+
14+
def listener(self, event):
15+
"""
16+
listen to element.seo.headers event and return a node with seo information only
17+
subject should be a NodeContext object
18+
"""
19+
if not event.has('subject'):
20+
return
21+
22+
node = element.node.Node('seo://%s' % event.get('subject').id, {
23+
'type': 'seo.headers',
24+
'seo': self.build_seo(event.get('subject')),
25+
})
26+
27+
event.set('node', node)
28+
29+
def build_seo(self, context):
30+
"""
31+
build the seo information from the provide context
32+
"""
33+
seo = {
34+
'title': None,
35+
'metas': {}
36+
}
37+
38+
self.configure_title(context, seo)
39+
self.configure_metas(context, seo)
40+
41+
return seo
42+
43+
def get_title(self, title):
44+
return self.seo_page.title_pattern % title
45+
46+
def configure_title(self, context, seo):
47+
if 'seo' in context.settings and 'title' in context.settings['seo']:
48+
seo['title'] = self.get_title(context.settings['seo']['title'])
49+
50+
return
51+
52+
for field in ['title', 'name']:
53+
if context[field]:
54+
seo['title'] = self.get_title(context[field])
55+
return
56+
57+
# no title defined!
58+
seo['title'] = self.get_title(u"\u2605")
59+
60+
def configure_metas(self, context, seo):
61+
if 'seo' not in context.settings or 'metas' not in context.settings['seo']:
62+
seo['metas'] = deepcopy(self.seo_page.metas)
63+
64+
return
65+
66+
if 'metas' in context.settings['seo']:
67+
seo['metas'] = deepcopy(context.settings['seo']['metas'])
68+
69+
for pname, pmetas in deepcopy(self.seo_page.metas).iteritems():
70+
if pname not in seo['metas']:
71+
seo['metas'][pname] = pmetas
72+
continue
73+
74+
# merge values
75+
for mname, mvalue in pmetas.iteritems():
76+
if mname not in seo['metas'][pname]:
77+
seo['metas'][pname][mname] = mvalue
78+
279

380
class SeoHandler(element.node.NodeHandler):
481
def __init__(self, templating):
@@ -17,18 +94,3 @@ def execute(self, request_handler, context):
1794
'context': context,
1895
'seo': context.seo
1996
})
20-
21-
def listener(self, event):
22-
"""
23-
listen to element.seo.headers event and return a node with seo information only
24-
subject should be a NodeContext object
25-
"""
26-
if 'seo' not in event.get('subject').settings:
27-
return
28-
29-
node = element.node.Node('seo://%s' % event.get('subject').id, {
30-
'type': 'seo.headers',
31-
'seo': event.get('subject').seo,
32-
})
33-
34-
event.set('node', node)

tests/plugins/seo/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = 'rande'

tests/plugins/seo/test_seo.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# vim: set fileencoding=utf-8 :
2+
import unittest
3+
4+
from element.plugins.seo import SeoListener, SeoPage
5+
from element.node import Node
6+
from element.node import NodeContext
7+
8+
from ioc.event import Event
9+
10+
class SeoListenerTest(unittest.TestCase):
11+
def test_title(self):
12+
page = SeoPage()
13+
listener = SeoListener(page)
14+
15+
self.assertEquals("title", listener.get_title("title"))
16+
17+
def test_event_without_subject(self):
18+
event = Event()
19+
20+
SeoListener(SeoPage()).listener(event)
21+
22+
self.assertFalse(event.has('node'))
23+
24+
def test_event_with_subject(self):
25+
26+
event = Event({
27+
'subject': NodeContext(Node())
28+
})
29+
30+
SeoListener(SeoPage()).listener(event)
31+
32+
self.assertTrue(event.has('node'))
33+
34+
node = event.get('node')
35+
self.assertEquals(node.seo['title'], u"\u2605")
36+
self.assertEquals(node.seo['metas'], {})
37+
38+
def test_event_with_subject_seo(self):
39+
event = Event({
40+
'subject': NodeContext(Node(), {
41+
'name': 'the name',
42+
'seo': {
43+
'metas': {
44+
'name': {
45+
'keywords': 'list, of, keywords'
46+
}
47+
}
48+
}
49+
})
50+
})
51+
52+
SeoListener(SeoPage("site - %s", {
53+
'name': {
54+
'description': 'The description'
55+
}
56+
})).listener(event)
57+
58+
self.assertTrue(event.has('node'))
59+
60+
node = event.get('node')
61+
self.assertEquals(node.seo['title'], "site - the name")
62+
self.assertEquals(node.seo['metas'], {
63+
'name': {
64+
'keywords': 'list, of, keywords',
65+
'description': 'The description'
66+
}
67+
})

0 commit comments

Comments
 (0)