def __init__(self, server=None, path="/", title=None, templates_dir=None, **kwargs): """ :param server: the component that handles the basic connection and protocol management. If not provided, the Portal creates its own :class:`~circuits.web.server.BaseServer` component that listens on port 4444. :type server: :class:`circuits.web.server.BaseServer` :param path: a path for URLs used by the portal. This allows the portal to co-exist with other content on the same web server. If specified, only requests starting with the given path are handled by the portal dispatcher and the path is prepended to all generated URLs. The value must start with a slash and must not end with a slash. :type path: string :param title: The title of the portal (displayed in the browser's title bar) :type title: string :param templates_dir: a directory with templates that override the portal's standard templates. Any template and localization resource is first searched for in this directory, then in the portal's built-in default directory. :type templates_dir: string """ super(Portal, self).__init__(**kwargs) self._path = path or "" self._title = title self._portlets = [] if server is None: server = BaseServer(("", 4444), channel=self.channel) else: self.channel = server.channel self.server = server if templates_dir: self._templates_dir = [os.path.abspath(templates_dir)] else: self._templates_dir = [] self._templates_dir \ += [os.path.join(dirname(dirname(__file__)), "templates")] LanguagePreferences(channel = server.channel).register(server) ThemeSelection(channel = server.channel).register(server) view = PortalView(self, channel = server.channel).register(server) self._url_generator_factory = view.url_generator_factory self._supported_locales = [] for locale in rbtranslations.available_translations\ ("l10n", self._templates_dir, "en"): trans = rbtranslations.translation\ ("l10n", self._templates_dir, [locale], "en") locale_name = trans.ugettext("language_" + locale) self._supported_locales.append((locale, locale_name)) self._supported_locales.sort(key=lambda x: x[1])
def __init__(self, view, req_evt, request, response): super(RenderThread, self).__init__() self.daemon = True self._view = view self._req_evt = req_evt self._request = request self._response = response self._locales = LanguagePreferences.preferred(request.session) self._translation = rbtranslations.translation\ ("l10n", view._portal._templates_dir, self._locales, "en") if self._translation.language: response.headers["Content-Language"] \ = self._translation.language.replace("_", "-") self._portal = PortalSessionFacade(self._view, self._request.session) self._portlet_counter = 0
def _on_request_1(self, event, request, response, peer_cert=None): """ First request handler. This handler handles resource requests directed at the portal or a portlet. """ if not self._is_portal_request(request): return if peer_cert: event.peer_cert = peer_cert # Decode query parameters and body event.kwargs = parse_qs(request.qs) parse_body(request, response, event.kwargs) session = request.session # Is this a portal portal request? if request.path.startswith(self._portal_resource): res = os.path.join(os.path.join\ (self._portal_resource_dir, request.path[len(self._portal_resource):])) if os.path.exists(res): event.stop() return tools.serve_file(request, response, res) return # Is this a portal theme resource request? if request.path.startswith(self._theme_resource): for directory in self._portal._templates_dir: res = os.path.join \ (directory, "themes", ThemeSelection.selected(session), request.path[len(self._theme_resource):]) if os.path.exists(res): event.stop() return tools.serve_file(request, response, res) return # Is this a portlet resource request? if request.path.startswith(self._portlet_resource): segs = request.path[len(self._portlet_resource):].split("/") if len(segs) >= 2: request.path = "/".join(segs[1:]) event.kwargs.update\ ({ "theme": ThemeSelection.selected(session), "locales": LanguagePreferences.preferred(session)}) return self.fire (portlet_resource(*event.args, **event.kwargs), segs[0])