def groups_data(self): group_list = [] try: group = self.context.get_group() if model_interfaces.ICommittee.providedBy(group): group_container = group.parent_group.committees else: group = self.context.get_group() group_container = group.committees group_list.append({ "key": self.context.group_id, "label": IDCDescriptiveProperties(group).title, }) group_list += [ { "key": comm.committee_id, "label": IDCDescriptiveProperties(comm).title } for comm in group_container.values() if checkPermission("bungeni.committee_member.Add", comm) ] except AttributeError: log.warn("Context %s has no committees", self.context) return group_list
def group_id(self): if IDoc.providedBy(self.context): if hasattr(self.context, "group_id") and self.context.group is not None: return IDCDescriptiveProperties(self.context.group).short_title elif hasattr(self.context, "chamber_id"): return IDCDescriptiveProperties(self.context.chamber).short_tile return translate("n/a", context=get_request())
def verbose_title(self): context = _merged(self.context) sitting_title = _( "verbose_sitting_title", default=u"Sitting of ${group_name} @ ${sitting_venue}", mapping={ "group_name": IDCDescriptiveProperties(context.group).title, "sitting_venue": IDCDescriptiveProperties(context.venue).title }) return translate_i18n(sitting_title)
def verbose_title(self): session = Session() context = session.merge(removeSecurityProxy(self.context)) sitting_title = _( "verbose_sitting_title", default=u"Sitting of ${group_name} @ ${sitting_venue}", mapping={ "group_name": IDCDescriptiveProperties(context.group).title, "sitting_venue": IDCDescriptiveProperties(context.venue).title }) return translate_i18n(sitting_title)
def generate_doc_for(domain_class, title=None, expand=True): doc = etree.fromstring(SIMPLE_LIST) dc_adapter = None if title: add_sub_element(doc, "li", title) if not isinstance(domain_class, Mapper): dc_adapter = IDCDescriptiveProperties(domain_class(), None) mapped = class_mapper(domain_class) else: mapped = domain_class try: dc_adapter = IDCDescriptiveProperties(mapped.class_(), None) except: logging.error("Unable to get dc adapter for %s", mapped.class_) if dc_adapter: dc_keys = {} dc_keys.update(dc_adapter.__class__.__dict__) for (key, value) in dc_keys.iteritems(): if (not key.startswith("_")) and (not hasattr(value, "__call__")): elx = add_sub_element(doc, "li") elx.text = "dc:%s" % key elx.set("class", "item dcitem") props = [prop for prop in mapped.iterate_properties] if domain_class == domain.Sitting: props.extend(SITTING_EXTRAS) for prop in sorted(props, key=lambda p: str(int(hasattr(p, "mapper"))) + p.key): sub_el = add_sub_element(doc, "li") if hasattr(prop, "mapper") and expand: if prop.key in PROCESSED_PROPS.get(mapped.class_.__name__, []): continue else: try: PROCESSED_PROPS[mapped.class_.__name__].add(prop.key) except KeyError: PROCESSED_PROPS[mapped.class_.__name__] = set([prop.key]) sub_el = add_sub_element(doc, "li") if prop.uselist: sub_title = "+ %s (list)" % (prop.key) else: sub_title = "+ %s" % prop.key add_sub_element(sub_el, "span", sub_title, css_class="sec_title", onclick="toggleBullet(this)") sub_el.append(generate_doc_for(prop.mapper, title, prop.uselist)) else: sub_el.text = prop.key sub_el.set("class", "item") return doc
def groups_data(self): group_list = [{ "key": comm.committee_id, "label": IDCDescriptiveProperties(comm).title } for comm in Session().query(domain.Committee).all() if comm.committee_id is not self.context.group_id] return group_list
def get_sitting_items(sitting, request, include_actions=False): items = [] if (sitting.status in IWorkflow(sitting).get_state_ids( keys=["draft_agenda", "published_agenda"])): order = "planned_order" else: order = "real_order" schedulings = map(removeSecurityProxy, sitting.items.batch(order_by=order, limit=None)) for scheduling in schedulings: item = ProxyFactory(location_wrapped(scheduling.item, sitting)) props = IDCDescriptiveProperties.providedBy(item) and item or \ IDCDescriptiveProperties(item) discussions = tuple(scheduling.discussions.values()) discussion = discussions and discussions[0] or None truncated_discussion = None if ((discussion is not None) and (discussion.body is not None)): #truncate discussion to first hundred characters t_discussion = discussion.body[0:100] try: #truncate discussion to first two lines index = t_discussion.index("<br>") index2 = t_discussion.index("<br>", index + 4) truncated_discussion = t_discussion[0:index2] + "..." except ValueError: truncated_discussion = t_discussion + "..." state_title = IWorkflow(item).get_state(item.status).title item = removeSecurityProxy(item) record = { "title": props.title, "description": props.description, "name": stringKey(scheduling), "status": item.status, "type": item.type.capitalize, "state_title": state_title, "heading": True if item.type == "heading" else False, #"category_id": scheduling.category_id, #"category": scheduling.category, "discussion": discussion, "truncated_discussion": truncated_discussion, "delete_url": "%s/delete" % url.absoluteURL(scheduling, request), "url": url.absoluteURL(item, request), } if include_actions: record["actions"] = get_scheduling_actions(scheduling, request) record["workflow"] = get_workflow_actions(item, request) discussion_actions = get_discussion_actions(discussion, request) if discussion_actions: assert len(discussion_actions) == 1 record["discussion_action"] = discussion_actions[0] else: record["discussion_action"] = None items.append(record) return items
def render(self, template=None): """Render ICAL or send WWW-AUTHENTICATE Header See `bungeni.ui.errors.Unauthorized` """ event_data_list = [ config.ICAL_EVENT_TEMPLATE % dict( event_start=sitting.start_date.strftime("%Y%m%dT%H%M%S"), event_end=sitting.end_date.strftime("%Y%m%dT%H%M%S"), event_venue=(IDCDescriptiveProperties(sitting.venue).title if hasattr(sitting, "venue") else u""), event_summary=IDCDescriptiveProperties(sitting).verbose_title, ) for sitting in self.sittings_and_sessions ] return config.ICAL_DOCUMENT_TEMPLATE % dict( event_data=u"\n".join(event_data_list))
def form_name(self): if IVersion.providedBy(self.context): context = self.context.head props = IDCDescriptiveProperties.providedBy(context) \ and context or IDCDescriptiveProperties(context) if self.is_translation: language = get_language_by_name(self.context.language)['name'] return _(u"edit_translation_legend", default=u'Editing $language translation of "$title"', mapping={ 'title': translate(props.title, context=self.request), 'language': language }) elif IVersion.providedBy(self.context): return _(u"edit_version_legend", default=u'Editing "$title" (version $version)', mapping={ 'title': translate(props.title, context=self.request), 'version': self.context.version_id }) return _( u"edit_item_legend", default=u'Editing "$title"', mapping={'title': translate(props.title, context=self.request)})
def form_name(self): if IVersion.providedBy(self.context): context = self.context.head else: context = self.context props = IDCDescriptiveProperties(context, None) or context if self.is_translation: language = get_language_by_name(self.context.language)["name"] return _(u"edit_translation_legend", default=u"Editing $language translation of '$title'", mapping={ "title": translate(props.title, context=self.request), "language": language }) elif IVersion.providedBy(self.context): return _(u"edit_version_legend", default=u'Editing "$title" (version $version)', mapping={ "title": translate(props.title, context=self.request), "version": self.context.seq }) return _( u"edit_item_legend", default=u'Editing "$title"', mapping={"title": translate(props.title, context=self.request)})
def add_container_menu_items(self, context, container): request = self.request _url = url.absoluteURL(container, request) if IReadContainer.providedBy(container): #XXX should be the same in all containers ? container = proxy.removeSecurityProxy(container) for name, item in container.items(): if context is None: selected = False else: selected = url.same_path_names(context.__name__, name) item = proxy.removeSecurityProxy(item) if IDCDescriptiveProperties.providedBy(item): title = item.title else: props = IDCDescriptiveProperties(item) title = props.title # only items with valid title if title is not None: self.items.append( url.get_menu_item_descriptor(title, selected, _url, name)) default_view_name = queryDefaultViewName(container, self.request) default_view = component.queryMultiAdapter((container, self.request), name=default_view_name) if hasattr(default_view, "title") and default_view.title is not None: self.items.insert( 0, url.get_menu_item_descriptor( default_view.title, sameProxiedObjects(container, self.context), _url))
def _get_title_from_context(context): title = None if IAlchemistContent.providedBy(context): if IDCDescriptiveProperties.providedBy(context): title = context.title else: props = IDCDescriptiveProperties(context, None) if props is not None: title = props.title else: ''' !+ AttributeError: 'GroupAddress' object has no attribute 'short_name': File "/home/undesa/bungeni/cap_installs/bungeni_install/bungeni/releases/20100305100101/src/bungeni.main/bungeni/ui/viewlets/navigation.py", line 59, in _get_title_from_context #title = context.short_name So, we temporarily default the above to the context.__class__.__name__: ''' title = getattr(context, "short_name", context.__class__.__name__) elif IAlchemistContainer.providedBy(context): domain_model = context._class try: descriptor = queryModelDescriptor(domain_model) except: descriptor = None name = "" if descriptor: name = getattr(descriptor, 'container_name', None) if name is None: name = getattr(descriptor, 'display_name', None) if not name: name = getattr(context, '__name__', None) title = name elif ILocation.providedBy(context) and \ IDCDescriptiveProperties.providedBy(context): title = context.title return title
def get_title_from_context(context): title = None if IAlchemistContent.providedBy(context): if IDCDescriptiveProperties.providedBy(context): title = context.title else: props = IDCDescriptiveProperties(context, None) if props is not None: title = props.title else: title = context.short_name elif IAlchemistContainer.providedBy(context): domain_model = context._class try: descriptor = queryModelDescriptor(domain_model) except: descriptor = None name = "" if descriptor: name = getattr(descriptor, 'container_name', None) if name is None: name = getattr(descriptor, 'display_name', None) if not name: name = getattr(context, '__name__', None) title = name elif ILocation.providedBy(context) and \ IDCDescriptiveProperties.providedBy(context): title = context.title return title
def __init__(self, context, request): browser.BungeniBrowserView.__init__(self, context, request) AuditLogMixin.__init__(self) if hasattr(self.context, "title"): dc = IDCDescriptiveProperties(self.context, None) self._page_title = "%s: %s" % (translate( self._page_title), dc and dc.title or self.context.title)
def __init__(self, context, request): super(VersionLogView, self).__init__(context.__parent__, request) # table to display the versions history formatter = date.getLocaleFormatter(self.request, "dateTime", "short") # !+ note this breaks the previous sort-dates-as-strings-hack of # formatting dates, for all locales, as date.strftime("%Y-%m-%d %H:%M") # that, when sorted as a string, gives correct results. self.columns = [ column.SelectionColumn(lambda item: str(item.version_id), name="selection"), column.GetterColumn(title=_(u"version"), getter=lambda i, f: '<a href="%s">%d</a>' % ("%s/versions/obj-%d" % (f.url, i.version_id), i.version_id)), column.GetterColumn(title=_(u"manual"), getter=lambda i, f: i.manual), column.GetterColumn( title=_(u"modified"), getter=lambda i, f: formatter.format(i.change.date_active)), column.GetterColumn(title=_(u"by"), getter=lambda i, f: IDCDescriptiveProperties( i.change.user).title), column.GetterColumn(title=_(u"message"), getter=lambda i, f: i.change.description), ] self.selection_column = self.columns[0]
def title_member(self): session = Session() context = session.merge(removeSecurityProxy(self.context)) mp_user = None try: mp_user = session.query(domain.MemberOfParliament).filter( domain.MemberOfParliament.user_id == context.user_id ).one() except NoResultFound: #this user has no associated MP record pass except MultipleResultsFound: # this should not happen log.error("Multiple MP objects found for : %s", context.__str__()) finally: if mp_user is None: return self.title dc_constituency = IDCDescriptiveProperties(mp_user.constituency) return _("member_title_with_constituency", default=u"Member of Parliament for ${constituency} (${member})", mapping = { "constituency": dc_constituency.title, "member": self.title } )
def __call__(self): data = obj2dict(self.context, 0) data["start_date"] = self.context.sitting.start_date data["end_date"] = self.context.sitting.end_date data["title"] = IDCDescriptiveProperties(self.context).title data["url"] = url.absoluteURL(self.context, self.request) data["media"] = [obj2dict(m, 0) for m in self.context.debate_media] return simplejson.dumps(data, default=dthandler)
def add_container_menu_items(self, context, container): request = self.request # add a menu item for each user workspace, if we are in an # IWorkspaceSectionLayer # !+ if user is logged in or if request.layer_data if (interfaces.IWorkspaceSectionLayer.providedBy(request) or interfaces.IWorkspaceSchedulingSectionLayer.providedBy( request)): try: workspaces = IAnnotations(request)["layer_data"].get( "workspaces") except: workspaces = [] log.info("%s got user workspaces: %s" % (self, workspaces)) base_url_path = "/workspace" for workspace in workspaces: log.info("appending menu item for user workspace: %s" % str(workspace)) self.items.append( url.get_menu_item_descriptor( workspace.full_name, pos_action_in_url( "/workspace/obj-%s" % workspace.group_id, request.getURL()), base_url_path, "obj-%s" % workspace.group_id)) _url = url.absoluteURL(container, request) if IReadContainer.providedBy(container): #XXX should be the same in all containers ? container = proxy.removeSecurityProxy(container) for name, item in container.items(): if context is None: selected = False else: selected = url.same_path_names(context.__name__, name) item = proxy.removeSecurityProxy(item) if IDCDescriptiveProperties.providedBy(item): title = item.title else: props = IDCDescriptiveProperties(item) title = props.title # only items with valid title if title is not None: self.items.append( url.get_menu_item_descriptor(title, selected, _url, name)) default_view_name = queryDefaultViewName(container, self.request) default_view = component.queryMultiAdapter((container, self.request), name=default_view_name) if hasattr(default_view, "title") and default_view.title is not None: self.items.insert( 0, url.get_menu_item_descriptor( default_view.title, sameProxiedObjects(container, self.context), _url))
def get_document_groups(): """Get Document Groups - order by group id """ group_options = [("", "-")] user = model_utils.get_login_user() groups = [g for g in model_utils.get_user_groups(user)] group_values = [(g.group_id, IDCDescriptiveProperties(g).short_title) for g in groups] group_options += sorted(group_values) return group_options
def description(self): context = _merged(self.context) text = "%s %s %s" % (translate_i18n(_("Submitted by")), context.owner.first_name, context.owner.last_name) if context.group: text += " to %s" % IDCDescriptiveProperties(context.group).title if context.admissible_date: text += " (%s %s)" % (translate_i18n( _(u"Approved on")), self.formatDate(context.admissible_date)) return text + "."
def _get_items(self): item_type = capi.get_type_info(self.context).workflow_key query = Session().query(domain.ItemSchedule).filter( sql.and_(domain.ItemSchedule.item_id == self.item_id, domain.ItemSchedule.item_type == item_type)) items = [] for item in query.all(): items.append( dict(sitting_name=IDCDescriptiveProperties(item.sitting).title, sitting_venue=(IDCDescriptiveProperties( item.sitting.venue).title if item.sitting.venue else _(u"Unknown venue")), minutes=[ dict(text=minute.body) for minute in item.itemdiscussions ])) if not items: self.for_display = False return items
def changeTitle(self): """Given a sequence of tuples of old, new ids we rename""" request = self.request id = request.get("retitle_id") new = request.get("new_value") item = self.context[id] dc = IDCDescriptiveProperties(item) dc.title = new notify(ObjectModifiedEvent(item, Attributes(IZopeDublinCore, 'title')))
def get_sitting_items(sitting, request, include_actions=False): items = [] if sitting.status in [ sitting_wf_state[u'draft-agenda'].id, sitting_wf_state[u'published-agenda'].id ]: order = "planned_order" else: order = "real_order" schedulings = map(removeSecurityProxy, sitting.items.batch(order_by=order, limit=None)) for scheduling in schedulings: item = ProxyFactory(location_wrapped(scheduling.item, sitting)) props = IDCDescriptiveProperties.providedBy(item) and item or \ IDCDescriptiveProperties(item) discussions = tuple(scheduling.discussions.values()) discussion = discussions and discussions[0] or None info = IWorkflowInfo(item, None) state_title = info.workflow().workflow.states[item.status].title record = { 'title': props.title, 'description': props.description, 'name': stringKey(scheduling), 'status': item.status, 'type': item.type.capitalize, 't': item.type, 'state_title': state_title, #'category_id': scheduling.category_id, #'category': scheduling.category, 'discussion': discussion, 'delete_url': "%s/delete" % ui_url.absoluteURL(scheduling, request), 'url': ui_url.absoluteURL(item, request) } if include_actions: record['actions'] = get_scheduling_actions(scheduling, request) record['workflow'] = get_workflow_actions(item, request) discussion_actions = get_discussion_actions(discussion, request) if discussion_actions: assert len(discussion_actions) == 1 record['discussion_action'] = discussion_actions[0] else: record['discussion_action'] = None items.append(record) return items
def description(self): session = Session() context = session.merge(removeSecurityProxy(self.context)) text = "%s %s %s" % (_("Submitted by"), context.owner.first_name, context.owner.last_name) if context.ministry: text += " to %s" % IDCDescriptiveProperties(context.ministry).title if context.admissible_date: text += " (%s %s)" % (_(u"Approved on"), self.formatDate(context.admissible_date)) return text + "."
def update(self): need('yui-dragdrop') need('yui-container') session = Session() group_id = self.get_group_id() items = tuple( session.query(self.model).filter( sql.and_(self.model.status.in_(self.states), self.model.group_id == group_id))) sitting = self._parent._parent.context scheduled_item_ids = [item.item_id for item in sitting.item_schedule] # add location to items gsm = component.getSiteManager() adapter = gsm.adapters.lookup( (interface.implementedBy(self.model), interface.providedBy(self)), ILocation) items = [adapter(item, None) for item in items] # for each item, format dictionary for use in template self.items = [ { 'title': properties.title, 'name': item.__class__.__name__, 'description': properties.description, #'date': _(u"$F", mapping={'F': # datetimedict.fromdatetime(item.changes[-1].date)}), 'date': item.changes[-1].date_active, 'state': _(IWorkflow(item).workflow.states[item.status].title), 'id': item.parliamentary_item_id, 'class': (item.parliamentary_item_id in scheduled_item_ids) and "dd-disable" or "", 'url': url.set_url_context(url.absoluteURL(item, self.request)) } for (item, properties) in [(item, (IDCDescriptiveProperties.providedBy(item) and item or IDCDescriptiveProperties(item))) for item in items] ]
def title_member(self): session = Session() context = session.merge(removeSecurityProxy(self.context)) mp_user = session.query(domain.MemberOfParliament).filter( domain.MemberOfParliament.user_id == context.user_id ).one() if mp_user is None: return self.title dc_constituency = IDCDescriptiveProperties(mp_user.constituency) return _("member_title_with_constituency", default=u"Member of Parliament for ${constituency} (${member})", mapping = { "constituency": dc_constituency.title, "member": self.title } )
def columns(self): return [ CustomSelectionColumn( lambda item:str(item.audit_id), name="selection"), column.GetterColumn(title=_("version"), getter=lambda i,f:"%s" % (i.audit_id), cell_formatter=lambda g,i,f:'<a href="%s/version-log/%s">%s</a>' % (f.url, i.__name__, i.seq)), column.GetterColumn(title=_("procedure"), getter=lambda i,f:i.procedure), column.GetterColumn(title=_("modified"), getter=lambda i,f:self.date_formatter.format(i.date_active)), column.GetterColumn(title=_("by"), getter=lambda i,f:IDCDescriptiveProperties(i.user).title), column.GetterColumn(title=_("message"), getter=lambda i,f:i.note), ]
def update(self): need("yui-dragdrop") need("yui-container") sitting = self._parent._parent.context scheduled_item_ids = [item.item_id for item in sitting.item_schedule] # add location to items gsm = component.getSiteManager() adapter = gsm.adapters.lookup( (interface.implementedBy(self.model), interface.providedBy(self)), ILocation) date_formatter = self.get_date_formatter("date", "medium") items = [adapter(item, None) for item in self._query_items()] # for each item, format dictionary for use in template self.items = [ { "title": properties.title, "name": item.__class__.__name__, "description": properties.description, #"date": _(u"$F", mapping={"F": # datetimedict.fromdatetime(item.changes[-1].date)}), #"date":item.changes[-1].date, # not every item has a auditlog (headings) # use last status change instead. "date": self._item_date(item) and date_formatter.format(self._item_date(item)), "state": IWorkflow(item).get_state(item.status).title, "id": self._get_item_key(item), "class": ((self._get_item_key(item) in scheduled_item_ids and "dd-disable") or ""), "url": self._item_url(item), "type": item.type } for item, properties in [( item, (IDCDescriptiveProperties.providedBy(item) and item or IDCDescriptiveProperties(item))) for item in items] ]
def form_description(self): language = get_language_by_name(self.language)["name"] props = IDCDescriptiveProperties.providedBy(self.context) \ and self.context or IDCDescriptiveProperties(self.context) if self.is_translation: return _(u"edit_translation_legend", default=u'Editing $language translation of "$title"', mapping={"title": translate(props.title, context=self.request), "language": language}) else: return _(u"translate_item_help", default=u'The document "$title" has not yet been translated ' \ u'into $language. Use this form to add the translation', mapping={ "title": translate(props.title, context=self.request), "language": language } )
def __init__(self, context, request, view, manager): self.context = context self.request = request self.__parent__ = view self.manager = manager self.wf_status = "new" self.has_status = False # table to display the workflow history formatter = date.getLocaleFormatter(self.request, "dateTime", "short") # !+ note this breaks the previous sort-dates-as-strings-hack of # formatting dates as date.strftime("%Y-%m-%d %H:%M") -- when sorted # as a string -- gives correct results (for all locales). self.columns = [ column.GetterColumn(title=_(u"date"), getter=lambda i,f:formatter.format(i.date_active)), column.GetterColumn(title=_(u"user"), getter=lambda i,f:IDCDescriptiveProperties(i.user).title), column.GetterColumn(title=_(u"description"), getter=lambda i,f:_label(i)), ]