def get_destination_url_path(request=None): """Get the (effective, sans any "traversal namespace notation" components and other such "traversal processing instruction" url components) target URL path of the (current) request. """ if request is None: request = common.get_request() #_url = request.URL #_url = request.getURL(level=0, path_only=True) # NOTE: both URL and getURL() depend on where we are in the traversal # process i.e. they return the *currently* traversed URL path and not # the full requested path. # # So, we use the request's PATH_INFO but as this may contain: # - (++) any number of Zope "traversal namespace notation" url components # - (@@/) to indicate that the URL is for an object that is a resource # - (@@)) to indicate a view name # we need to get rid of them: _url = "/".join([ url_component for url_component in request.get("PATH_INFO").split("/") if not url_component.startswith("++") and not url_component.startswith("@@") ]) log.debug(" [get_destination_url_path] %s " % _url) return _url
def get_request_language(): request = common.get_request() if IHTTPRequest.providedBy(request): lang = request.locale.getLocaleID() else: lang = capi.default_language return lang
def as_json(self): date_formatter = date.getLocaleFormatter(common.get_request(), "date", "medium" ) items_json = dict( items = [ dict( item_type = self.item_type, item_id = orm.object_mapper(item).primary_key_from_instance( item )[0], item_title = IDCDescriptiveProperties(item).title, status = IWorkflow(item).get_state(item.status).title, status_date = ( date_formatter.format(item.submission_date) if hasattr(item, "submission_date") else None ), registry_number = ( item.registry_number if hasattr(item, "registry_number") else None ), item_mover = ( IDCDescriptiveProperties(item.owner).title if hasattr(item, "owner") else None ), item_uri = IDCDescriptiveProperties(item).uri ) for item in self.query() ] ) return json.dumps(items_json)
def getter(item, formatter): value = getattr(item, name) if value: request = common.get_request() date_formatter = date.getLocaleFormatter(request, category, length) return date_formatter.format(value) return ""
def get_user_context_roles(): """Get the list of user's roles (including whether admin or not)--this is the info needed (in addition to the field's modes) to further filter whether a field is visible or not for a given (user, mode). Wraps common.get_context_roles(context), with the following differcnes: - auto retrieves the context, needed param by common.get_context_roles() - handles case when user is not authenticated - handles case for when user is "admin" """ request = common.get_request() if request is None: context = None principal = None else: context = common.get_traversed_context(request) principal = request.principal if IUnauthenticatedPrincipal.providedBy(principal): roles = ["bungeni.Anonymous"] else: roles = common.get_context_roles(context) if common.is_admin(context): roles.append("bungeni.Admin") log.debug(""" [get_user_context_roles] PRINCIPAL: %s CONTEXT: %s ROLES: %s """ % (principal, context, roles)) return roles
def as_json(self): date_formatter = date.getLocaleFormatter(common.get_request(), "date", "medium" ) items = [ dict( item_type = self.item_type, item_id = orm.object_mapper(item).primary_key_from_instance( item )[0], item_title = IDCDescriptiveProperties(item).title, status = IWorkflow(item).get_state(item.status).title, status_date = ( date_formatter.format(item.submission_date) if (hasattr(item, "submission_date") and getattr(item, "submission_date") ) else None ), registry_number = ( item.registry_number if hasattr(item, "registry_number") else None ), item_mover = ( IDCDescriptiveProperties(item.owner).title if hasattr(item, "owner") else None ), item_uri = "%s-%d" % (self.item_type, orm.object_mapper(item).primary_key_from_instance(item)[0] ) ) for item in self.query() ] items = sorted(items, key=lambda item:item.get("status_date"), reverse=True ) return json.dumps(dict(items=items))
def test_context_roles(self, mode): """EXPERIMENTAL sample code to get a user's roles and whether is_admin or not -- this is the info needed (in addition to the field's modes) to further filter whether a field is visible or not for a given (user, mode). """ request = common.get_request() if request is None: context = None principal = None else: context = common.get_traversed_context(request) principal = request.principal if IUnauthenticatedPrincipal.providedBy(principal): roles = None else: roles = common.get_context_roles(context) print """!+ModelDescriptor TEST_CONTEXT_ROLES [%s] PRINCIPAL: %s CONTEXT: %s MODE: %s ROLES: %s IS ADMIN: %s""" % (self, principal, context, mode, roles, common.is_admin(context) )
def as_json(self): is_text = IScheduleText.implementedBy(self.domain_class) date_formatter = date.getLocaleFormatter(common.get_request(), "date", "medium") items = [ dict( item_type=self.item_type, item_id=orm.object_mapper(item).primary_key_from_instance( item)[0], item_title=IDCDescriptiveProperties(item).title, status=(IWorkflow(item).get_state(item.status).title if not is_text else None), status_date=(date_formatter.format(item.submission_date) if (hasattr(item, "submission_date") and getattr(item, "submission_date")) else None), registry_number=(item.registry_number if hasattr( item, "registry_number") else None), item_mover=(IDCDescriptiveProperties(item.owner).title if hasattr(item, "owner") else None), item_uri="%s-%d" % (self.item_type, orm.object_mapper(item).primary_key_from_instance(item)[0])) for item in self.query() ] items = sorted(items, key=lambda item: item.get("status_date"), reverse=True) return json.dumps(dict(items=items))
def in_edit_mode(): """Is current UI view in mode "edit" i.e. are we modifying bungeni content? As general practice, to avoid user surprises, we do not allow a workflow transition when UI is displaying the doc in "edit" mode (and possibly with unsaved modifications). """ return IFormEditLayer.providedBy(common.get_request())
def items_container(self): """The URL to a container listing documents available for scheduling """ site = getSite() container = site["workspace"]["scheduling"]["documents"] request = common.get_request() app_url = request.getApplicationURL() return url.absoluteURL(container, request).replace(app_url, "")
def _get_change_data(self): """If request defines change_data, use it, else return a dummy dict. """ cd = IAnnotations(common.get_request()).get("change_data") if cd is None: cd = {} cd.setdefault("note", cd.get("note", "")) cd.setdefault("date_active", cd.get("date_active", None)) return cd
def date_input_search_widget(table_id, field_id): form = DateFilterWidget(common.get_application(), common.get_request(), table_id, field_id) html = '<div id="date_input_search_widget_%(table_id)s_%(field_id)s" style="display: none;">%(html)s</div>' \ % {"table_id": table_id, "field_id": field_id, "html": form.render()} script = open("%s/templates/date-input-search-widget.js" % (_path)).read() return html, script % {"table_id": table_id, "field_id": field_id}
def getter(item, formatter): request = common.get_request() start = getattr(item, from_name) if start: start = date.getLocaleFormatter(request, "dateTime", format_length).format(start) end = getattr(item, to_name) if end: end = date.getLocaleFormatter(request, "time", format_length).format(end) return "%s - %s" % (start, end)
def generate_tree(root, context): for element in root.getiterator(): typ = get_attr(element, "type") src = get_attr(element, "source") if typ: if typ=="text": clean_element(element) element.text = get_element_value(context, src) elif typ=="link": clean_element(element) url_source = get_attr(element, "url") if url_source: link_url = get_element_value(context, url_source) else: link_url = url.absoluteURL(context, common.get_request() ) element.attrib["href"] = link_url if src: element.text = get_element_value(context, src) elif typ=="html": clean_element(element) _html = u"<div>%s</div>" % get_element_value(context, src ) new_html = element.insert(0, etree.fromstring(_html)) elif typ=="listing": listing = get_element_value(context, src, default=[]) if IAlchemistContainer.providedBy(listing): _listing = common.list_container_items(listing) listing = [ item for item in _listing ] log.debug("[LISTING] %s @@ %s", src, listing) listing_count = len(listing) new_children = [ deepcopy(element.getchildren()) for x in range(listing_count) ] empty_element(element) clean_element(element) if listing_count == 0: parent = element.getparent() no_items_element = etree.SubElement(element, "p") no_items_element.text = translate_i18n( _(u"No items found") ) else: for (index, item) in enumerate(listing): for child in new_children[index]: generate_tree(child, item) for children in new_children: for descendant in children: element.append(descendant) break return etree.tostring(root)
def renderCell(self, item, formatter): abs_url = url.absoluteURL(item, common.get_request()) title = super(LinkColumn, self).renderCell(item, formatter) if abs_url: link_html = zope.app.form.browser.widget.renderElement( "a", contents=title, href=abs_url) return zope.app.form.browser.widget.renderElement( "p", contents=link_html) return title
def getLocaleFormatter( request=None, category="date", # "date" | "time" | "dateTime" length="medium" # "short" | "medium" | "long" | "full" | None ): """See: zope.i18n.locales.LocaleDates.getFormatter """ if request is None: request = common.get_request() return request.locale.dates.getFormatter(category, length)
def renderCell(self, item, formatter): abs_url = url.absoluteURL(item, common.get_request()) title = super(LinkColumn, self).renderCell(item, formatter) if abs_url: link_html = zope.app.form.browser.widget.renderElement("a", contents=title, href=abs_url ) return zope.app.form.browser.widget.renderElement("p", contents=link_html ) return title
def getLanguage(self): request = get_request() if request is not None: browser_langs = BrowserLanguages(request) langs = browser_langs.getPreferredLanguages() try: return langs[0] except IndexError: return None else: return None
def get_request_language(request=None, default=capi.default_language): """Get current request's language; if no request use specified default. If the request instance is handy, it may be passed in as a parameter thus avoidng the need to call for it. """ if request is None: request = common.get_request() if IHTTPRequest.providedBy(request): return request.locale.getLocaleID() return default
def get_base_direction(): request = get_request() ui_lang = request.getCookies().get("I18N_LANGUAGE") if ui_lang is not None: language = ui_lang else: language = capi.default_language if language[:2] in capi.right_to_left_languages: return "rtl" else: return "ltr"
def response_allow_submit(context): # The "submit_response" workflow transition should NOT be displayed when # the UI is displaying the question in "edit" mode (as this transition # will cause deny of bungeni.Question.Edit to the Minister). request = common.get_request() if IFormEditLayer.providedBy(request): return False if context.response_text is None: return False else: return True
def generate_tree(root, context): for element in root.getiterator(): typ = get_attr(element, "type") src = get_attr(element, "source") if typ: if typ == "text": clean_element(element) element.text = get_element_value(context, src) elif typ == "link": clean_element(element) url_source = get_attr(element, "url") if url_source: link_url = get_element_value(context, url_source) else: link_url = url.absoluteURL(context, common.get_request()) element.attrib["href"] = link_url if src: element.text = get_element_value(context, src) elif typ == "html": clean_element(element) _html = u"<div>%s</div>" % get_element_value( context, src) new_html = element.insert(0, etree.fromstring(_html)) elif typ == "listing": listing = get_element_value(context, src, default=[]) if IAlchemistContainer.providedBy(listing): _listing = common.list_container_items(listing) listing = [item for item in _listing] log.debug("[LISTING] %s @@ %s", src, listing) listing_count = len(listing) new_children = [ deepcopy(element.getchildren()) for x in range(listing_count) ] empty_element(element) clean_element(element) if listing_count == 0: parent = element.getparent() no_items_element = etree.SubElement(element, "p") no_items_element.text = translate_i18n( _(u"No items found")) else: for (index, item) in enumerate(listing): for child in new_children[index]: generate_tree(child, item) for children in new_children: for descendant in children: element.append(descendant) break return etree.tostring(root)
def _get_change_data(self): """If request defines change_data, use it, else return a dummy dict. """ try: cd = IAnnotations(common.get_request()).get("change_data") assert cd is not None, "change_data dict is None." except (TypeError, AssertionError): # Could not adapt... under testing, the "request" is a # participation that has no IAnnotations. cd = {} cd.setdefault("note", cd.get("note", "")) cd.setdefault("date_active", cd.get("date_active", None)) return cd
def make_admin_url(obj_id, type_name, status, context, chamber_id): """Use traversal to find parent parliament """ url = None chamber = get_parl_container(context, chamber_id) if chamber: items_container = get_type_container(chamber, type_name) if items_container: url = "/".join([ absoluteURL(items_container, common.get_request()), container_obj_key(obj_id) ]) return url
def getLanguage(self): try: request = get_request() except zope.security.interfaces.NoInteraction: request=None if request is not None: browser_langs = BrowserLanguages(request) langs = browser_langs.getPreferredLanguages() try: return langs[0] except IndexError: return None else: return None
def translate_obj(context): """ translate a ITranslatable content object (context) into the language defined in the request -> copy of the object translated into language of the request """ trusted = removeSecurityProxy(context) request = common.get_request() lang = request.locale.getLocaleID() # !+ get_browser_language() translation = get_translation_for(context, lang) obj = copy(trusted) for field_translation in translation: setattr(obj, field_translation.field_name, field_translation.field_text) return obj
def getter(item, formatter): state_title = get_wf_state(item) request = common.get_request() state_title = translate(state_title, domain="bungeni", context=request) # !+MY_LISTING_ROWS(mr, aug-2012) the following is a (exploratory) # mechanism to add a distinction between what rows are owned by the # current user and others. Here it is added only to "status" columns # but a generic "row-level" means to mark such rows as different # from the others may be a useful feature. if IWorkspaceSectionLayer.providedBy(request) and IOwned.providedBy(item): # !+delegation? if item.owner == get_login_user(): state_title = "<b>%s</b> *" % (state_title) return state_title
def getter(item, formatter): state_title = get_wf_state(item) request = common.get_request() state_title = translate(state_title, domain="bungeni", context=request) # !+MY_LISTING_ROWS(mr, aug-2012) the following is a (exploratory) # mechanism to add a distinction between what rows are owned by the # current user and others. Here it is added only to "status" columns # but a generic "row-level" means to mark such rows as different # from the others may be a useful feature. if IWorkspaceSectionLayer.providedBy(request) and IOwned.providedBy(item): # !+delegation? if item.owner == get_db_user(): state_title = "<b>%s</b> *" % (state_title) return state_title
def getLanguage(self): try: request = get_request() except zope.security.interfaces.NoInteraction: request = None if request is not None: browser_langs = BrowserLanguages(request) langs = browser_langs.getPreferredLanguages() try: return langs[0] except IndexError: return None else: return None
def translate_obj(context): """Translate a ITranslatable content object (context, that may NOT be None) into the language defined in the request -> copy of the object translated into language of the request """ trusted = removeSecurityProxy(context) request = common.get_request() lang = request.locale.getLocaleID() # !+ get_browser_language() translation = get_translation_for(context, lang) obj = copy(trusted) for field_translation in translation: setattr(obj, field_translation.field_name, field_translation.field_text) return obj
def __call__(self, context): request = common.get_request() def get_locale_lang(code): if hasattr(request, "locale"): return request.locale.displayNames.languages.get(code) return None languages = get_all_languages() items = [(lang, (request and get_locale_lang(lang) or languages[lang]['name'])) for lang in languages.keys()] items.sort(key=lambda language: language[1]) items = [SimpleTerm(i[0], i[0], i[1]) for i in items] return SimpleVocabulary(items)
def getLocaleFormatter( request=None, category="date", # "date" | "time" | "dateTime" length="medium" # "short" | "medium" | "long" | "full" | None ): """See: zope.i18n.locales.LocaleDates.getFormatter """ if request is None: try: request = common.get_request() except NoInteraction: request = None if request and hasattr(request, "locale"): return request.locale.dates.getFormatter(category, length) else: return locales.getLocale(capi.default_language).dates.getFormatter( category, length)
def __call__(self, context): request = common.get_request() def get_locale_lang(code): if hasattr(request, "locale"): return request.locale.displayNames.languages.get(code) return None languages = get_all_languages() items = [ ( lang, (request and get_locale_lang(lang) or languages[lang]['name']) ) for lang in languages.keys() ] items.sort(key=lambda language: language[1]) items = [ SimpleTerm(i[0], i[0], i[1]) for i in items ] return SimpleVocabulary(items)
def columns(self): date_formatter = date.getLocaleFormatter(common.get_request(), "dateTime", "medium") listing_columns = [ column.GetterColumn( title=_("Take start time"), getter=lambda i, f: date_formatter.format(i.start_date)), column.GetterColumn( title=_("Take end time"), getter=lambda i, f: date_formatter.format(i.end_date)), column.GetterColumn(title=_("Take name"), getter=lambda i, f: i.debate_take_name), column.GetterColumn( title=_("Take transcriber"), getter=lambda i, f: IDCDescriptiveProperties(i.user).title), ] return listing_columns
def valid_date_active(comment): request = common.get_request() # recover min_date_active, and adjust it to be 59 secs earlier to # avoid issues of doing 2 transitions in quick succession (within # the same minute) the 2nd of which could be taken to be too old... min_date_active = (IAnnotations(request)["min_date_active"] - timedelta(seconds=59)) if not hasattr(comment, "date_active"): # !+ because of a BUG in the datetime widget (probably) : # after a server restart, resubmitting a previously loaded # form -- that displays valid data_active value results in a # form.NoDataInput("date_active") error... thus causing: # (comment.date_active<min_date_active) to be False ! raise zope.interface.Invalid(_("NoDataInput for Active Date.")) elif comment.date_active < min_date_active: raise zope.interface.Invalid(_("Active Date is too old.")) elif comment.date_active > datetime.now(): raise zope.interface.Invalid(_("Active Date is in the future."))
def as_json(self): date_formatter = date.getLocaleFormatter(common.get_request(), "date", "medium") items_json = dict(items=[ dict(item_type=self.item_type, item_id=orm.object_mapper(item).primary_key_from_instance( item)[0], item_title=IDCDescriptiveProperties(item).title, status=IWorkflow(item).get_state(item.status).title, status_date=(date_formatter.format(item.submission_date) if hasattr(item, "submission_date") else None), registry_number=(item.registry_number if hasattr( item, "registry_number") else None), item_mover=(IDCDescriptiveProperties(item.owner). title if hasattr(item, "owner") else None), item_uri=IDCDescriptiveProperties(item).uri) for item in self.query() ]) return json.dumps(items_json)
def valid_date_active(comment): request = common.get_request() # recover min_date_active, and adjust it to be 59 secs earlier to # avoid issues of doing 2 transitions in quick succession (within # the same minute) the 2nd of which could be taken to be too old... min_date_active = (IAnnotations(request)["min_date_active"] - timedelta(seconds=59)) if not hasattr(comment, "date_active"): # !+ because of a BUG in the datetime widget (probably) : # after a server restart, resubmitting a previously loaded # form -- that displays valid data_active value results in a # form.NoDataInput("date_active") error... thus causing: # (comment.date_active<min_date_active) to be False ! raise zope.interface.Invalid(_("NoDataInput for Active Date.")) elif comment.date_active < min_date_active: raise zope.interface.Invalid(_("Active Date is too old.")) elif comment.date_active > datetime.now(): raise zope.interface.Invalid( _("Active Date is in the future."))
def format_change_description(change): """Format/i18n a document's change object description for timeline listing """ description = change.description if change.action == "new-version": version = change.origin.versions.get( int(change.extras.get("version_id"))) chg_url = url.absoluteURL(version, common.get_request()) if chg_url: description = "<a href='%s'>%s</a>" % (chg_url, (translate_i18n( change.description) or translate_i18n(u"New Version"))) elif change.action == "workflow": description = translate_i18n(change.description) if not description: # use principal effecting the change as description as a fallback dc = IDCDescriptiveProperties(change.user, None) if dc: description = translate_i18n(dc.title_member) return description
def getter(item_user, formatter): related_user = _get_related_user(item_user, related_user_attribute_name) request = common.get_request() # !+ replace with: bungeni.ui.widgets._render_link_to_mp_or_user ? if IAdminSectionLayer.providedBy(request): # under admin, we link to the natural "view" of the schema relation parent = item_user while parent and not IAlchemistContainer.providedBy(parent): parent = removeSecurityProxy(parent.__parent__) item_user.__parent__ = parent href = url.absoluteURL(item_user, request) else: #!+BUSINESS(mb, feb-2013) is deprecated # else we link direct to the MP's "public" view # mp = get_member_of_parliament(related_user.user_id) # href = "/members/current/obj-%s/" % (mp.membership_id) return related_user.combined_name return zope.formlib.widget.renderElement( "a", contents=related_user.combined_name, href=href # User.combined_name derived property )
def getter(item_user, formatter): related_user = _get_related_user(item_user, related_user_attribute_name) request = common.get_request() # !+ replace with: bungeni.ui.widgets._render_link_to_mp_or_user ? if IAdminSectionLayer.providedBy(request): # under admin, we link to the natural "view" of the schema relation parent = item_user while parent and not IAlchemistContainer.providedBy(parent): parent = removeSecurityProxy(parent.__parent__) item_user.__parent__ = parent href = url.absoluteURL(item_user, request) else: #!+BUSINESS(mb, feb-2013) is deprecated # else we link direct to the MP's "public" view #mp = get_member_of_parliament(related_user.user_id) #href = "/members/current/obj-%s/" % (mp.membership_id) return related_user.combined_name return zope.formlib.widget.renderElement("a", contents=related_user.combined_name, # User.combined_name derived property href=href )
def columns(self): date_formatter = date.getLocaleFormatter(common.get_request(), "dateTime", "medium") listing_columns = [ column.GetterColumn( title=_("Take start time"), getter=lambda i,f: date_formatter.format(i.start_date) ), column.GetterColumn( title=_("Take end time"), getter=lambda i,f: date_formatter.format(i.end_date) ), column.GetterColumn( title=_("Take name"), getter=lambda i,f: i.debate_take_name ), column.GetterColumn( title=_("Take transcriber"), getter=lambda i,f: IDCDescriptiveProperties(i.user).title ), ] return listing_columns
def test_context_roles(self, mode): """EXPERIMENTAL sample code to get a user's roles and whether is_admin or not -- this is the info needed (in addition to the field's modes) to further filter whether a field is visible or not for a given (user, mode). """ request = common.get_request() if request is None: context = None principal = None else: context = common.get_traversed_context(request) principal = request.principal if IUnauthenticatedPrincipal.providedBy(principal): roles = None else: roles = common.get_context_roles(context) print """!+ModelDescriptor TEST_CONTEXT_ROLES [%s] PRINCIPAL: %s CONTEXT: %s MODE: %s ROLES: %s IS ADMIN: %s""" % (self, principal, context, mode, roles, common.is_admin(context))
def format_change_description(change): """Format/i18n a document's change object description for timeline listing """ description = change.description if change.action == "new-version": version = change.origin.versions.get( int(change.extras.get("version_id")) ) chg_url = url.absoluteURL(version, common.get_request()) if chg_url: description = "<a href='%s'>%s</a>" % ( chg_url, (translate_i18n(change.description) or translate_i18n(u"New Version") ) ) elif change.action == "workflow": description = translate_i18n(change.description) if not description: # use principal effecting the change as description as a fallback dc = IDCDescriptiveProperties(change.user, None) if dc: description = translate_i18n(dc.title_member) return description