--- a/web/views/embedding.py Tue May 05 17:18:49 2009 +0200
+++ b/web/views/embedding.py Thu May 14 12:48:11 2009 +0200
@@ -3,7 +3,7 @@
:organization: Logilab
-:copyright: 2001-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
+:copyright: 2001-2009 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
"""
__docformat__ = "restructuredtext en"
@@ -15,11 +15,11 @@
from logilab.mtconverter import guess_encoding
from cubicweb import urlquote # XXX should use view.url_quote method
+from cubicweb.selectors import (one_line_rset, score_entity,
+ match_search_state, implements)
from cubicweb.interfaces import IEmbedable
+from cubicweb.view import NOINDEX, NOFOLLOW
from cubicweb.common.uilib import soup2xhtml
-from cubicweb.common.selectors import (one_line_rset, score_entity_selector,
- match_search_state, implement_interface)
-from cubicweb.common.view import NOINDEX, NOFOLLOW
from cubicweb.web.controller import Controller
from cubicweb.web.action import Action
from cubicweb.web.views import basetemplates
@@ -29,11 +29,10 @@
"""template embeding an external web pages into CubicWeb web interface
"""
id = 'external'
-
+
def call(self, body):
# XXX fallback to HTML 4 mode when embeding ?
self.set_request_content_type()
- self.process_rql(self.req.form.get('rql'))
self.req.search_state = ('normal',)
self.template_header(self.content_type, None, self.req._('external page'),
[NOINDEX, NOFOLLOW])
@@ -72,7 +71,19 @@
except HTTPError, err:
body = '<h2>%s</h2><h3>%s</h3>' % (
_('error while embedding page'), err)
- return self.vreg.main_template(req, self.template, body=body)
+ self.process_rql(req.form.get('rql'))
+ return self.vreg.main_template(req, self.template, rset=self.rset, body=body)
+
+
+def entity_has_embedable_url(entity):
+ """return 1 if the entity provides an allowed embedable url"""
+ url = entity.embeded_url()
+ if not url or not url.strip():
+ return 0
+ allowed = entity.config['embed-allowed']
+ if allowed is None or not allowed.match(url):
+ return 0
+ return 1
class EmbedAction(Action):
@@ -80,26 +91,13 @@
if the returned url match embeding configuration
"""
id = 'embed'
- controller = 'embed'
- __selectors__ = (one_line_rset, match_search_state,
- implement_interface, score_entity_selector)
- accepts_interfaces = (IEmbedable,)
-
+ __select__ = (one_line_rset() & match_search_state('normal')
+ & implements(IEmbedable)
+ & score_entity(entity_has_embedable_url))
+
title = _('embed')
-
- @classmethod
- def score_entity(cls, entity):
- """return a score telling how well I can display the given
- entity instance (required by the value_selector)
- """
- url = entity.embeded_url()
- if not url or not url.strip():
- return 0
- allowed = cls.config['embed-allowed']
- if allowed is None or not allowed.match(url):
- return 0
- return 1
-
+ controller = 'embed'
+
def url(self, row=0):
entity = self.rset.get_entity(row, 0)
url = urljoin(self.req.base_url(), entity.embeded_url())
@@ -121,7 +119,7 @@
def __init__(self, prefix, custom_css=None):
self.prefix = prefix
self.custom_css = custom_css
-
+
def __call__(self, match):
original_url = match.group(1)
url = self.prefix + urlquote(original_url, safe='')
@@ -132,12 +130,13 @@
url = '%s?custom_css=%s' % (url, self.custom_css)
return '<a href="%s"' % url
+
class absolutize_links:
def __init__(self, embedded_url, tag, custom_css=None):
self.embedded_url = embedded_url
self.tag = tag
self.custom_css = custom_css
-
+
def __call__(self, match):
original_url = match.group(1)
if '://' in original_url:
@@ -152,12 +151,13 @@
for rgx, repl in filters:
body = rgx.sub(repl, body)
return body
-
+
+
def embed_external_page(url, prefix, headers=None, custom_css=None):
req = Request(url, headers=(headers or {}))
content = urlopen(req).read()
page_source = unicode(content, guess_encoding(content), 'replace')
- page_source =page_source
+ page_source = page_source
match = BODY_RGX.search(page_source)
if match is None:
return page_source