def generate_xhtml_operator_code(js_files, base_url, request, requirements, mode): api_bootstrap = get_absolute_static_url( 'js/WirecloudAPI/WirecloudAPIBootstrap.js', request=request, versioned=True) api_url = get_absolute_static_url( 'js/WirecloudAPI/WirecloudOperatorAPI.js', request=request, versioned=True) api_common_url = get_absolute_static_url( 'js/WirecloudAPI/WirecloudAPICommon.js', request=request, versioned=True) api_closure_url = get_absolute_static_url( 'js/WirecloudAPI/WirecloudAPIClosure.js', request=request, versioned=True) api_js_files = [ get_absolute_static_url(url, request=request, versioned=True) for url in get_operator_api_extensions(mode, requirements) ] api_js = [api_bootstrap, api_url, api_common_url ] + api_js_files + [api_closure_url] t = loader.get_template('wirecloud/operator_xhtml.html') c = Context({'base_url': base_url, 'js_files': api_js + js_files}) xhtml = t.render(c) return xhtml
def fix_widget_code(widget_code, content_type, request, encoding, use_platform_style, requirements, mode, theme): # This line is here for raising UnicodeDecodeError in case the widget_code is not encoded using the expecified encoding widget_code.decode(encoding) if content_type in ('text/html', 'application/xhtml+xml') and widget_code.strip() == b'': widget_code = b'<html></html>' if content_type == 'text/html': parser = etree.HTMLParser(encoding=encoding) serialization_options = {'method': 'html'} elif content_type == 'application/xhtml+xml': parser = etree.XMLParser(encoding=encoding) serialization_options = {'method': 'xml', 'xml_declaration': False} else: return widget_code xmltree = etree.parse(BytesIO(widget_code), parser) prefix = xmltree.getroot().prefix xmlns = None if prefix in xmltree.getroot().nsmap: xmlns = xmltree.getroot().nsmap[prefix] # Fix head element head_elements = xpath(xmltree, '/xhtml:html/xhtml:head', xmlns) if len(head_elements) == 0: head_element = etree.Element("head") xmltree.getroot().insert(0, head_element) else: head_element = head_elements[0] # Fix base element base_elements = xpath(xmltree, '/xhtml:html/xhtml:head/xhtml:base', xmlns) for base_element in base_elements[1:]: base_element.getparent().remove(base_element) # Fix scripts scripts = xpath(xmltree, '/xhtml:html//xhtml:script', xmlns) for script in scripts: if 'src' in script.attrib: script.text = '' head_element.insert(0, etree.Element('script', type="text/javascript", src=get_absolute_static_url('js/WirecloudAPI/WirecloudAPIClosure.js', request=request, versioned=True))) files = get_widget_api_extensions(mode, requirements) files.reverse() for file in files: head_element.insert(0, etree.Element('script', type="text/javascript", src=get_absolute_static_url(file, request=request, versioned=True))) for file in get_widget_api_files(request): head_element.insert(0, etree.Element('script', type="text/javascript", src=file)) if use_platform_style: for file in get_widget_platform_style(theme): head_element.insert(0, etree.Element('link', rel="stylesheet", type="text/css", href=file)) # return modified code return etree.tostring(xmltree, pretty_print=False, encoding=encoding, **serialization_options)
def generate_xhtml_operator_code(js_files, base_url, request, requirements, mode): api_closure_url = get_absolute_static_url('js/WirecloudAPI/WirecloudAPIClosure.js', request=request, versioned=True) extra_api_js_files = [get_absolute_static_url(url, request=request, versioned=True) for url in get_operator_api_extensions(mode, requirements)] api_js = get_operator_api_files(request) + extra_api_js_files + [api_closure_url] template = loader.get_template('wirecloud/operator_xhtml.html') context = {'base_url': base_url, 'js_files': api_js + js_files} xhtml = template.render(context) return xhtml
def generate_xhtml_operator_code(js_files, base_url, request, requirements, mode): api_closure_url = get_absolute_static_url('js/WirecloudAPI/WirecloudAPIClosure.js', request=request, versioned=True) extra_api_js_files = [get_absolute_static_url(url, request=request, versioned=True) for url in get_operator_api_extensions(mode, requirements)] api_js = get_operator_api_files(request) + extra_api_js_files + [api_closure_url] t = loader.get_template('wirecloud/operator_xhtml.html') c = Context({'base_url': base_url, 'js_files': api_js + js_files}) xhtml = t.render(c) return xhtml
def generate_xhtml_operator_code(js_files, base_url, request): api_url = get_absolute_static_url('js/WirecloudAPI/WirecloudOperatorAPI.js', request=request) api_closure_url = get_absolute_static_url('js/WirecloudAPI/WirecloudAPIClosure.js', request=request) api_js_files = [get_absolute_static_url(url, request=request) for url in get_operator_api_extensions('index')] api_js = [api_url] + api_js_files + [api_closure_url] t = loader.get_template('wirecloud/operator_xhtml.html') c = Context({'base_url': base_url, 'js_files': api_js + js_files}) xhtml = t.render(c) return xhtml
def get_widget_api_files(request): from wirecloud.platform.core.plugins import get_version_hash key = 'widget_api_files/%s?v=%s' % (get_current_domain(request), get_version_hash()) widget_api_files = cache.get(key) if widget_api_files is None or settings.DEBUG is True: code = '''{% load compress %}{% load static from staticfiles %}{% compress js %} <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudAPIBootstrap.js" %}"></script> <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudWidgetAPI.js" %}"></script> <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudAPICommon.js" %}"></script> {% endcompress %}''' result = Template(code).render(Context()) doc = etree.parse( BytesIO(('<files>' + result + '</files>').encode('utf-8')), etree.XMLParser()) files = [script.get('src') for script in doc.getroot()] files.reverse() widget_api_files = tuple([ get_absolute_static_url(file, request=request, versioned=True) for file in files ]) cache.set(key, widget_api_files) return list(widget_api_files)
def test_get_absolute_static_url_versioned(self, get_current_domain, get_current_scheme): request = self._prepare_request_mock() get_current_scheme.return_value = "http" get_current_domain.return_value = "dashboards.example.org" self.assertEqual(get_absolute_static_url("/path", request=request, versioned=True), 'http://dashboards.example.org/path?v=' + get_version_hash()) get_current_scheme.assert_called_once_with(request) get_current_domain.assert_called_once_with(request)
def get_widget_api_files(request): from wirecloud.platform.core.plugins import get_version_hash key = 'widget_api_files/%s?v=%s' % (get_current_domain(request), get_version_hash()) widget_api_files = cache.get(key) if widget_api_files is None or settings.DEBUG is True: code = '''{% load compress %}{% load static from staticfiles %}{% compress js %} <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudAPIBootstrap.js" %}"></script> <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudWidgetAPI.js" %}"></script> <script type="text/javascript" src="{% static "js/WirecloudAPI/WirecloudAPICommon.js" %}"></script> {% endcompress %}''' result = Template(code).render(Context({})) doc = etree.parse(BytesIO(('<files>' + result + '</files>').encode('utf-8')), etree.XMLParser()) files = [script.get('src') for script in doc.getroot()] files.reverse() widget_api_files = tuple([get_absolute_static_url(file, request=request, versioned=True) for file in files]) cache.set(key, widget_api_files) return list(widget_api_files)
def read(self, request, name): try: theme_info = get_theme_metadata(name) except ValueError: raise Http404 desc = { "name": name, "label": theme_info.label, "baseurl": get_absolute_static_url("theme/%s/" % name, request), "templates": {} } for template_id in get_templates('classic'): template_file = template_id + '.html' try: template = get_template("%s:%s" % (name, template_file)) except TemplateDoesNotExist: template = get_template(template_file) desc["templates"][template_id] = template.render({}) return HttpResponse(json.dumps(desc, cls=LazyEncoder, sort_keys=True), 'application/json')
def read(self, request, name): context = RequestContext(request) try: theme_info = get_theme_metadata(name) except ValueError: raise Http404 desc = { "name": name, "label": theme_info.label, "baseurl": get_absolute_static_url("theme/%s/" % name, request), "templates": {} } for template_id in get_templates('classic'): template_file = template_id + '.html' try: template = get_template("%s:%s" % (name, template_file)) except TemplateDoesNotExist: template = get_template(template_file) desc["templates"][template_id] = template.render(context) return HttpResponse(json.dumps(desc, cls=LazyEncoder, sort_keys=True), 'application/json')
def fix_widget_code(widget_code, base_url, content_type, request, use_platform_style, force_base=False): if content_type == 'text/html': parser = etree.HTMLParser() xmltree = etree.parse(StringIO(str(widget_code)), parser) serialization_method = 'html' elif content_type == 'application/xhtml+xml': xmltree = etree.fromstring(widget_code).getroottree() serialization_method = 'xml' else: return widget_code prefix = xmltree.getroot().prefix xmlns = None if prefix in xmltree.getroot().nsmap: xmlns = xmltree.getroot().nsmap[prefix] # Fix head element head_elements = xpath(xmltree, '/xhtml:html/xhtml:head', xmlns) if len(head_elements) == 0: head_element = etree.Element("head") xmltree.getroot().insert(0, head_element) else: head_element = head_elements[0] # Fix base element base_elements = xpath(xmltree, '/xhtml:html/xhtml:head/xhtml:base', xmlns) for base_element in base_elements[1:]: base_element.parent.remove(base_element) if len(base_elements) >= 1 and force_base: base_elements[0].set('href', base_url) elif len(base_elements) == 0: head_element.insert(0, etree.Element('base', href=base_url)) # Fix scripts uses_old_api = False scripts = xpath(xmltree, '/xhtml:html//xhtml:script', xmlns) for script in scripts: if 'src' in script.attrib: script.text = '' if script.get('src', '') == '/ezweb/js/WirecloudAPI/WirecloudAPI.js': script.getparent().remove(script) elif script.get('src', '') == '/ezweb/js/EzWebAPI/EzWebAPI.js': uses_old_api = True script.set('src', get_absolute_static_url('js/EzWebAPI/EzWebAPI.js', request=request)) files = get_old_widget_api_extensions('index') files.reverse() for file in files: script.addnext(etree.Element('script', type="text/javascript", src=get_absolute_static_url(file, request=request))) if not uses_old_api: head_element.insert(0, etree.Element('script', type="text/javascript", src=get_absolute_static_url('js/WirecloudAPI/WirecloudAPIClosure.js', request=request))) files = get_widget_api_extensions('index') files.reverse() for file in files: head_element.insert(0, etree.Element('script', type="text/javascript", src=get_absolute_static_url(file, request=request))) head_element.insert(0, etree.Element('script', type="text/javascript", src=get_absolute_static_url('js/WirecloudAPI/WirecloudAPI.js', request=request))) if use_platform_style: head_element.insert(0, etree.Element('link', rel="stylesheet", type="text/css", href=get_absolute_static_url('js/EzWebAPI_ext/EzWebGadgets.css', request=request))) head_element.insert(0, etree.Element('link', rel="stylesheet", type="text/css", href=get_absolute_static_url('css/gadget.css', request=request))) else: # Redirect all script starting with /ezweb/ to the platform only when using the old api version for script in scripts: if script.get('src', '').startswith('/ezweb/'): script.set('src', get_absolute_static_url(script.get('src')[7:], request=request)) # return modified code return etree.tostring(xmltree, pretty_print=False, method=serialization_method)
def fix_widget_code( widget_code, base_url, content_type, request, encoding, use_platform_style, requirements, force_base, mode ): # This line is here for raising UnicodeDecodeError in case the widget_code is not encoded using the expecified encoding widget_code.decode(encoding) if content_type in ("text/html", "application/xhtml+xml") and widget_code.strip() == b"": widget_code = b"<html></html>" if content_type == "text/html": parser = etree.HTMLParser(encoding=encoding) serialization_options = {"method": "html"} elif content_type == "application/xhtml+xml": parser = etree.XMLParser(encoding=encoding) serialization_options = {"method": "xml", "xml_declaration": False} else: return widget_code xmltree = etree.parse(BytesIO(widget_code), parser) prefix = xmltree.getroot().prefix xmlns = None if prefix in xmltree.getroot().nsmap: xmlns = xmltree.getroot().nsmap[prefix] # Fix head element head_elements = xpath(xmltree, "/xhtml:html/xhtml:head", xmlns) if len(head_elements) == 0: head_element = etree.Element("head") xmltree.getroot().insert(0, head_element) else: head_element = head_elements[0] # Fix base element base_elements = xpath(xmltree, "/xhtml:html/xhtml:head/xhtml:base", xmlns) for base_element in base_elements[1:]: base_element.getparent().remove(base_element) if len(base_elements) >= 1 and force_base: base_elements[0].set("href", base_url) elif len(base_elements) == 0: head_element.insert(0, etree.Element("base", href=base_url)) # Fix scripts scripts = xpath(xmltree, "/xhtml:html//xhtml:script", xmlns) for script in scripts: if "src" in script.attrib: script.text = "" head_element.insert( 0, etree.Element( "script", type="text/javascript", src=get_absolute_static_url("js/WirecloudAPI/WirecloudAPIClosure.js", request=request, versioned=True), ), ) files = get_widget_api_extensions(mode, requirements) files.reverse() for file in files: head_element.insert( 0, etree.Element( "script", type="text/javascript", src=get_absolute_static_url(file, request=request, versioned=True) ), ) head_element.insert( 0, etree.Element( "script", type="text/javascript", src=get_absolute_static_url("js/WirecloudAPI/WirecloudAPICommon.js", request=request, versioned=True), ), ) head_element.insert( 0, etree.Element( "script", type="text/javascript", src=get_absolute_static_url("js/WirecloudAPI/WirecloudWidgetAPI.js", request=request, versioned=True), ), ) head_element.insert( 0, etree.Element( "script", type="text/javascript", src=get_absolute_static_url("js/WirecloudAPI/WirecloudAPIBootstrap.js", request=request, versioned=True), ), ) if use_platform_style: for file in get_widget_platform_style(): head_element.insert(0, etree.Element("link", rel="stylesheet", type="text/css", href=file)) # return modified code return etree.tostring(xmltree, pretty_print=False, encoding=encoding, **serialization_options)