def create_sittings_map(sittings, request): """Returns a dictionary that maps: (day, hour) -> { 'record' : sitting database record 'actions' : actions that apply to this sitting 'class' : sitting 'span' : span } (day, hour) -> ``None`` If the mapped value is a sitting, then a sitting begins on that day and hour, if it's ``None``, then a sitting is reaching into this day and hour. The utility of the returned structure is to aid rendering a template with columns spanning several rows. """ mapping = {} for sitting in sittings.values(): day = sitting.start_date.weekday() hour = sitting.start_date.hour start_date = utils.timedict(sitting.start_date.hour, sitting.start_date.minute) end_date = utils.timedict(sitting.end_date.hour, sitting.end_date.minute) status = misc.get_wf_state(sitting) proxied = ProxyFactory(sitting) if checkPermission(u"bungeni.agendaitem.wf.schedule", proxied): link = "%s/schedule" % url.absoluteURL(sitting, request) else: link = url.absoluteURL(sitting, request) if checkPermission("zope.View", proxied): mapping[day, hour] = { "url": link, "record": sitting, "class": u"sitting", "actions": get_sitting_actions(sitting, request), "span": sitting.end_date.hour - sitting.start_date.hour, "formatted_start_time": start_date, "formatted_end_time": end_date, "status": status, } for hour in range(sitting.start_date.hour + 1, sitting.end_date.hour): mapping[day, hour] = None # make sure start- and end-date is the same DAY assert ( (sitting.start_date.day == sitting.end_date.day) and (sitting.start_date.month == sitting.end_date.month) and (sitting.start_date.year == sitting.end_date.year) ) return mapping
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 get_sitting_items(sitting, request, include_actions=False): items = [] if sitting.status in get_states("groupsitting", keys=["draft_agenda", "published_agenda"]): order = "planned_order" else: order = "real_order" schedulings = map(removeSecurityProxy, sitting.items.batch(order_by=order, limit=None)) site_url = url.absoluteURL(getSite(), request) 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_text is not None): # truncate discussion to first hundred characters t_discussion = discussion.body_text[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 + "..." 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, "truncated_discussion": truncated_discussion, "delete_url": "%s/delete" % url.absoluteURL(scheduling, request), "url": url.set_url_context(site_url + ("/business/%ss/obj-%s" % (item.type, item.parliamentary_item_id))), } 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, date, template=None): #need('yui-editor') need('yui-rte') need('yui-resize') need('yui-button') if template is None: template = self.template container = self.context.__parent__ #schedule_url = self.request.getURL() container_url = url.absoluteURL(container, self.request) # determine position in container key = stringKey(self.context) keys = list(container.keys()) pos = keys.index(key) links = {} if pos > 0: links['previous'] = "%s/%s/%s" % (container_url, keys[pos - 1], self.__name__) if pos < len(keys) - 1: links['next'] = "%s/%s/%s" % (container_url, keys[pos + 1], self.__name__) #start_date = utils.datetimedict.fromdatetime(self.context.start_date) #end_date = utils.datetimedict.fromdatetime(self.context.end_date) site_url = url.absoluteURL(getSite(), self.request) return template( display="sitting", #title=_(u"$A $e, $B $Y", mapping=start_date), title="%s: %s - %s" % (self.context.group.short_name, self.context.start_date.strftime('%Y-%m-%d %H:%M'), self.context.end_date.strftime('%H:%M')), description=_( u"$type — ${start}-${end}", mapping={ 'start': self.context.start_date.strftime('%Y-%m-%d %H:%M'), 'end': self.context.end_date.strftime('%H:%M') }), # title = u"", # description = u"", # links=links, actions=get_sitting_actions(self.context, self.request), items=get_sitting_items(self.context, self.request, include_actions=True), #categories=vocabulary.ItemScheduleCategories(self.context), new_category_url="%s/admin/content/categories/add?next_url=..." % site_url, status=self.context.status, )
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 getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" if interfaces.IBusinessWhatsOnSectionLayer.providedBy(request): return () else: if IBungeniApplication.providedBy(context.__parent__): return () wf = IWorkflow(context, None) if wf is None: return () #state = IWorkflowInfo(context).state().getState() wf_info = IWorkflowInfo(context) transitions = wf_info.getManualTransitionIds() # !+ context_workflow menu: the order of transitions is alphabetic, but # should really be order of definition. parliament_id = getCurrentParliamentId() url = ui_url.absoluteURL(context, request) site_url2 = ui_url.absoluteURL(getSite(), request) results = [] for transition in transitions: tid = transition state_transition = wf.getTransitionById(transition) #Compares the current url to homepage to determine whether we are on workspace or not. #Fix for bug 319 #Someone should probably review this. if url == site_url2: transition_url = site_url2 + \ '/archive/browse/parliaments/obj-' + str(parliament_id) + \ '/change_workflow_state?' + \ 'transition=%s&next_url=...' % tid else: transition_url = url + \ '/change_workflow_state?'\ 'transition=%s&next_url=...' % tid extra = { 'id': 'workflow-transition-%s' % tid, 'separator': None, 'class': '' } state_title = translate(str(state_transition.title), domain="bungeni.core", context=request) results.append( dict(title=state_title, description="", action=transition_url, selected=False, transition_id=tid, icon=None, extra=extra, submenu=None)) return results
def __call__(self, timestamp=None): trusted = removeSecurityProxy(self.context) trusted.__name__ = self.__name__ interface.alsoProvides(trusted, ILocation) if IBusinessSectionLayer.providedBy(self.request) and isinstance(trusted, SittingContainerSchedulingContext): self.url = url.absoluteURL(trusted.__parent__.__parent__, self.request) else: self.url = url.absoluteURL(trusted.__parent__, self.request) self.title = ISchedulingContext(self.context).label return self.render()
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" if interfaces.IBusinessWhatsOnSectionLayer.providedBy(request): return () else: if IBungeniApplication.providedBy(context.__parent__): return () wf = IWorkflow(context, None) if wf is None: return () #state = IWorkflowInfo(context).state().getState() wf_info = IWorkflowInfo(context) transitions = wf_info.getManualTransitionIds() # !+ context_workflow menu: the order of transitions is alphabetic, but # should really be order of definition. parliament_id = getCurrentParliamentId() _url = url.absoluteURL(context, request) site_url2 = url.absoluteURL(getSite(), request) results = [] for transition in transitions: tid = transition state_transition = wf.getTransitionById(transition) #Compares the current url to homepage to determine whether we are on workspace or not. #Fix for bug 319 #Someone should probably review this. if _url == site_url2: transition_url = site_url2 + \ "/archive/browse/parliaments/obj-" + str(parliament_id) + \ "/change_workflow_state?" + \ "transition=%s&next_url=..." % tid else: transition_url = _url + \ "/change_workflow_state?"\ "transition=%s&next_url=..." % tid extra = {"id": "workflow-transition-%s" % tid, "separator": None, "class": ""} state_title = translate(str(state_transition.title), domain="bungeni.core", context=request) results.append( dict(title=state_title, description="", action=transition_url, selected=False, transition_id=tid, icon=None, extra=extra, submenu=None)) return results
def render(self, date, template=None): #need('yui-editor') need('yui-connection') need('yui-rte') need('yui-resize') need('yui-button') if template is None: template = self.template container = self.context.__parent__ #schedule_url = self.request.getURL() container_url = url.absoluteURL(container, self.request) # determine position in container key = stringKey(self.context) keys = list(container.keys()) pos = keys.index(key) links = {} if pos > 0: links['previous'] = "%s/%s/%s" % ( container_url, keys[pos-1], self.__name__) if pos < len(keys) - 1: links['next'] = "%s/%s/%s" % ( container_url, keys[pos+1], self.__name__) #start_date = utils.datetimedict.fromdatetime(self.context.start_date) #end_date = utils.datetimedict.fromdatetime(self.context.end_date) site_url = url.absoluteURL(getSite(), self.request) reorder = "reorder" if self.context.status in \ ["draft_agenda", "draft_minutes"] \ else "dont-reorder" return template( display="sitting", #title=_(u"$A $e, $B $Y", mapping=start_date), title = "%s: %s - %s" % (self.context.group.short_name, self.context.start_date.strftime('%Y-%m-%d %H:%M'), self.context.end_date.strftime('%H:%M')), description=_(u"Sitting Info"), # title = u"", # description = u"", # links=links, actions=get_sitting_actions(self.context, self.request), items=get_sitting_items( self.context, self.request, include_actions=True), #categories=vocabulary.ItemScheduleCategories(self.context), new_category_url="%s/admin/content/categories/add?next_url=..." % site_url, status=self.context.status, reorder=reorder, )
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 __call__(self, timestamp=None): trusted = removeSecurityProxy(self.context) trusted.__name__ = self.__name__ interface.alsoProvides(trusted, ILocation) if (IBusinessSectionLayer.providedBy(self.request) and isinstance(trusted, SittingContainerSchedulingContext)): self.url = url.absoluteURL(trusted.__parent__.__parent__, self.request) else: self.url = url.absoluteURL(trusted.__parent__, self.request) self.title = ISchedulingContext(self.context).label return self.render()
def handle_add_and_add_another(self, action, data): ob = self.createAndAdd(data) name = self.domain_model.__name__ if not self._next_url: if IWorkspaceMyDocumentsSectionLayer.providedBy(self.request): item_type = capi.get_type_info(ob).workflow_key self._next_url = url.absoluteURL(self.context, self.request) + \ "/add_%s?portal_status_message=%s Added" % \ (item_type, name) else: self._next_url = url.absoluteURL(self.context, self.request) + \ "/add?portal_status_message=%s Added" % name
def get_actions(name, context, request): menu = component.getUtility(IBrowserMenu, name) items = menu.getMenuItems(context, request) site_url = ui_url.absoluteURL(getSite(), request) url = ui_url.absoluteURL(context, request) for item in items: item['url'] = ui_url.urljoin(url, item['action']) item['id'] = item['title'].lower().replace(' ', '-') item['icon'] = ui_url.urljoin(site_url, item['icon']) return items
def get_actions(name, context, request): menu = component.getUtility(IBrowserMenu, name) items = menu.getMenuItems(context, request) site_url = url.absoluteURL(getSite(), request) _url = url.absoluteURL(context, request) for item in items: item["url"] = url.urljoin(_url, item["action"]) item["id"] = item["title"].lower().replace(" ", "-") item["icon"] = url.urljoin(site_url, item["icon"]) return items
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" if (not interfaces.IWorkspaceOrAdminSectionLayer.providedBy(request) or interfaces.IFormEditLayer.providedBy(request) or IVersion.providedBy(context) ): return () #!+wfc.workflow wf = IWorkflow(context, None) if wf is None: return () #state = IWorkflowController(context).state_controller.get_status() wfc = IWorkflowController(context) wf = wfc.workflow # !+wfc.workflow tids = wfc.getManualTransitionIds() parliament_id = getCurrentParliamentId() _url = url.absoluteURL(context, request) site_url2 = url.absoluteURL(getSite(), request) results = [] for tid in tids: state_transition = wf.get_transition(tid) #Compares the current url to homepage to determine whether #we are on workspace or not. #Fix for bug 319 #Someone should probably review this. if _url == site_url2: transition_url = site_url2 + \ "/archive/browse/parliaments/obj-" + \ str(parliament_id) + \ "/change_workflow_state?" + \ "transition=%s&next_url=..." % tid else: transition_url = _url + \ "/change_workflow_state?"\ "transition=%s&next_url=..." % tid extra = {"id": "workflow-transition-%s" % tid, "separator": None, "class": ""} state_title = translate(str(state_transition.title), domain="bungeni", context=request) results.append( dict(title=state_title, description="", action=transition_url, selected=False, transition_id=tid, icon=None, extra=extra, submenu=None)) return results
def get_sitting_items(sitting, request, include_actions=False): items = [] if sitting.status in get_states("groupsitting", keys=["draft_agenda", "published_agenda"]): order = "planned_order" else: order = "real_order" schedulings = map( removeSecurityProxy, sitting.items.batch(order_by=order, limit=None)) site_url = url.absoluteURL(getSite(), request) 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" % url.absoluteURL(scheduling, request), 'url': url.set_url_context(site_url+('/business/%ss/obj-%s' % (item.type, item.parliamentary_item_id)))} 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 process_form(self, data): class optionsobj(object): """Object that holds all the options.""" self.options = optionsobj() if not hasattr(self, "short_name"): if "short_name" in data: self.short_name = data["short_name"] self.sittings = [] if IGroupSitting.providedBy(self.context): trusted = removeSecurityProxy(self.context) order = "real_order" if self.display_minutes else "planned_order" trusted.item_schedule.sort(key=operator.attrgetter(order)) self.sittings.append(trusted) self.start_date = self.context.start_date self.end_date = self.get_end_date(self.start_date, self.time_span(data)) else: self.start_date = data["date"] if "date" in data else \ datetime.datetime.today().date() self.end_date = self.get_end_date(self.start_date, self.time_span(data)) sittings = ISchedulingContext(self.context).get_sittings( self.start_date, self.end_date).values() self.sittings = map(removeSecurityProxy, sittings) self.ids = "" for sitting in self.sittings: self.ids += str(sitting.group_sitting_id) + "," def cleanup(string): return string.lower().replace(" ", "_") for item_type in data["item_types"]: itemtype = cleanup(item_type) type_key = itemtype.rstrip("s").replace("_", "") setattr(self.options, type_key, True) setattr(self.options, itemtype, True) for option in data[itemtype + "_options"]: opt_key = "".join( (cleanup(itemtype.rstrip("s")).replace("_", ""), "_", cleanup(option))) setattr(self.options, opt_key, True) if self.display_minutes: self.link = url.absoluteURL(self.context, self.request) \ + "/votes-and-proceedings" else: self.link = url.absoluteURL(self.context, self.request) + "/agenda" try: self.group = self.context.group except: self.group = ISchedulingContext(self.context).get_group()
def __call__(self, timestamp=None): log.debug("CalendarView.__call__: %s" % (self.context)) trusted = removeSecurityProxy(self.context) trusted.__name__ = self.__name__ interface.alsoProvides(trusted, ILocation) if (IBusinessSectionLayer.providedBy(self.request) and isinstance(trusted, SittingContainerSchedulingContext)): self.url = url.absoluteURL(trusted.__parent__.__parent__, self.request) else: self.url = url.absoluteURL(trusted.__parent__, self.request) self.title = ISchedulingContext(self.context).label log.debug(debug.interfaces(self)) log.debug(debug.location_stack(self)) return self.render()
def process_form(self, data): class optionsobj(object): '''Object that holds all the options.''' pass self.options = optionsobj() if not hasattr(self, 'doc_type'): if 'doc_type' in data: self.doc_type = data['doc_type'] self.sittings = [] if IGroupSitting.providedBy(self.context): session = Session() st = self.context.sitting_id sitting = session.query(domain.GroupSitting).get(st) self.sittings.append(sitting) back_link = ui_url.absoluteURL(self.context, self.request) + '/schedule' elif ISchedulingContext.providedBy(self.context): self.sittings = self.get_sittings(self.start_date, self.end_date) back_link = ui_url.absoluteURL(self.context, self.request) else: raise NotImplementedError count = 0 self.ids = "" for s in self.sittings: self.ids = self.ids + str(s.sitting_id) + "," def cleanup(string): return string.lower().replace(" ", "_") for item_type in data['item_types']: itemtype = cleanup(item_type) setattr(self.options, itemtype, True) for option in data[itemtype + "_options"]: setattr(self.options, cleanup(itemtype + "_" + option), True) if self.display_minutes: self.link = ui_url.absoluteURL( self.context, self.request) + '/votes-and-proceedings' else: self.link = ui_url.absoluteURL(self.context, self.request) + '/agenda' try: self.group = self.context.get_group() except: session = Session() self.group = session.query(domain.Group).get(self.context.group_id)
def process_form(self, data): class optionsobj(object): """Object that holds all the options.""" self.options = optionsobj() if not hasattr(self, "short_name"): if "short_name" in data: self.short_name = data["short_name"] self.sittings = [] if IGroupSitting.providedBy(self.context): trusted = removeSecurityProxy(self.context) order = "real_order" if self.display_minutes else "planned_order" trusted.item_schedule.sort(key=operator.attrgetter(order)) self.sittings.append(trusted) self.start_date = self.context.start_date self.end_date = self.get_end_date(self.start_date, self.time_span(data)) else: self.start_date = data["date"] if "date" in data else \ datetime.datetime.today().date() self.end_date = self.get_end_date(self.start_date, self.time_span(data)) sittings = ISchedulingContext(self.context).get_sittings( self.start_date, self.end_date).values() self.sittings = map(removeSecurityProxy,sittings) self.ids = "" for sitting in self.sittings: self.ids += str(sitting.group_sitting_id) + "," def cleanup(string): return string.lower().replace(" ", "_") for item_type in data["item_types"]: itemtype = cleanup(item_type) type_key = itemtype.rstrip("s").replace("_", "") setattr(self.options, type_key, True) setattr(self.options, itemtype, True) for option in data[itemtype + "_options"]: opt_key = "".join((cleanup(itemtype.rstrip("s")).replace("_",""), "_", cleanup(option) )) setattr(self.options, opt_key, True) if self.display_minutes: self.link = url.absoluteURL(self.context, self.request) \ + "/votes-and-proceedings" else : self.link = url.absoluteURL(self.context, self.request) + "/agenda" try: self.group = self.context.group except: self.group = ISchedulingContext(self.context).get_group()
def _get_path(self, context): """Return the current path as a list """ descriptor = None name = None path = [] context = proxy.removeSecurityProxy(context) if context is None: return path # Proof-of-concept: support for selective inclusion in breadcrumb trail: # a view marked with an attribute __crumb__=False is NOT included in # the breadcrumb trail (see core/app.py: "workspace" Section) if not getattr(context, "__crumb__", True): return path if context.__parent__ is not None: path.extend(self._get_path(context.__parent__)) _url = url.absoluteURL(context, self.request) # Append a trailing slash to each breadcrumb entry so that # the right context is always maintained when the breadcrumbs # are used for navigation. _url = url.set_url_context(_url) title = _get_title_from_context(context) if title is not None: path.append({ 'name':title, 'url':_url}) return path
def handle_generate_takes(self, action, data): transcribers = self.get_transcribers() sitting = self.context.sitting take_time_delta = datetime.timedelta(seconds=self.get_take_duration()) current_end_time = sitting.start_date current_start_time = sitting.start_date take_count = 0 session = Session() while current_end_time < sitting.end_date: take = domain.DebateTake() take.debate_record_id = self.context.debate_record_id take.start_date = current_start_time if ((current_end_time + take_time_delta) > sitting.end_date): current_end_time = sitting.end_date else: current_end_time = current_end_time + take_time_delta current_start_time = current_end_time + datetime.timedelta( seconds=1) take.end_date = current_end_time take.transcriber_id = transcribers[ take_count % len(transcribers)].user_id take.debate_take_name = self.get_take_name(take_count) take_count = take_count+1 session.add(take) session.flush() next_url = url.absoluteURL(self, self.request) self.request.response.redirect(next_url)
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" group_id = context.get_group().group_id contexts = self.getSchedulingContexts(request) results = [] for context in contexts: group = context.get_group() if group.group_id == group_id: continue _url = url.absoluteURL(context, request) extra = { # !+HTML_ID(mario, may-2011) what is the use of making the # (presumably HTML, used for styling... ) id be derived from # an sql surrogate pk ?! "id": "calendar-link-%s" % group.group_id, "separator": None, "class": "" } #!+(miano. nov-2010) description is set to be the same as title # below because the description of a group is a rich text field # that may have HTML formatting etc thus is not suitable to be # used as a tootip results.append( dict(title=context.label, description=context.label, action=_url, selected=False, icon=None, extra=extra, submenu=None)) # sort on title results.sort(key=operator.itemgetter("title")) return results
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" group_id = context.get_group().group_id contexts = self.getSchedulingContexts() results = [] for context in contexts: group = context.get_group() if group.group_id == group_id: continue url = ui_url.absoluteURL(context, request) extra = { 'id': 'calendar-link-%s' % group.group_id, 'separator': None, 'class': '' } results.append( dict(title=context.label, description=group.description, action=url, selected=False, icon=None, extra=extra, submenu=None)) # sort on title results.sort(key=operator.itemgetter("title")) return results
def handle_cancel(self, action, data): """Cancelling redirects to the listing.""" session = Session() if not self._next_url: self._next_url = url.absoluteURL(self.__parent__, self.request) self.request.response.redirect(self._next_url) session.close()
def handle_add_and_another(self, action, data): self.createAndAdd(data) name = self.domain_model.__name__ if not self._next_url: self._next_url = url.absoluteURL(self.context, self.request) + \ "/add?portal_status_message=%s Added" % name
def getMenuItems(self, context, request): results = [] unproxied = proxy.removeSecurityProxy(context.__parent__) try: items = unproxied.items() except AttributeError: items = [] for key, info in capi.iter_type_info(): if IScheduleContent.implementedBy(info.domain_model): name = naming.plural(key) if hasattr(unproxied, name): items.append((name, getattr(unproxied, name))) for key, item in items: if not IAlchemistContainer.providedBy(item): continue if not IScheduleContent.implementedBy(item.domain_model): continue type_info = capi.get_type_info(item.domain_model) permission = "bungeni.%s.Add" % ( type_info.workflow_key or naming.type_key("model_name", item.domain_model.__name__)) if not checkPermission(permission, context): continue dc_adapter = IDCDescriptiveProperties(item, None) if dc_adapter: _title = dc_adapter.title else: _title = getattr(item, "title", "Unknown") results.append( dict(title=_title, description=_title, action=url.absoluteURL(item, request), selected=False, icon=None, extra={}, submenu=None)) return results
def __call__(self, timestamp=None): trusted = removeSecurityProxy(self.context) trusted.__name__ = self.__name__ interface.alsoProvides(trusted, ILocation) self.url = url.absoluteURL(trusted.__parent__, self.request) self.title = ISchedulingContext(self.context).label return self.render()
def getMenuItems(self, context, request): results = [] try: items = proxy.removeSecurityProxy(context.__parent__).items() except AttributeError: return results for key, item in items: if not IAlchemistContainer.providedBy(item): continue if not IScheduleText.implementedBy(item.domain_model): continue dc_adapter = IDCDescriptiveProperties(item, None) if dc_adapter: _title = dc_adapter.title else: _title = getattr(item, "title", "Unknown") results.append(dict( title=_title, description=_title, action = url.absoluteURL(item, request), selected=False, icon=None, extra={}, submenu=None )) return results
def __new__(cls, context, request, view, manager): chain = _get_context_chain(context) chain.pop() # bungeni_app top_section = chain.pop() if not chain: return # we require the tree to begin with a container object if not IReadContainer.providedBy(chain[-1]): return # remove any views from navigation tree if not(IAlchemistContent.providedBy(chain[0]) or IAlchemistContainer.providedBy(chain[0]) or ISection.providedBy(chain[0]) ): chain.pop(0) subcontext = chain[-1] if (len(chain) > 1 or IReadContainer.providedBy(subcontext) and not IAlchemistContainer.providedBy(subcontext) and len(subcontext) ): inst = object.__new__(cls, context, request, view, manager) inst.chain = chain inst.top_section_url = url.absoluteURL(top_section, request) inst.id_prefix = "nav" return inst
def __init__(self, context, request, view, manager): self.context = context self.request = request self.__parent__= view self.manager = manager self.path = [] self.site_url = url.absoluteURL(getSite(), 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 getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" _url = url.absoluteURL(context, request) if checkPermission("bungeni.translation.Add", context): language = get_language(context) available = get_available_translations(context) results = [] for name, obj in get_all_languages().items(): title = obj["name"] # skip the current language if name == language: continue action_url = "%s/translate?language=%s" % (_url, name) extra = { "id": "translation-action-%s" % name, "separator": None, "class": "" } translation_id = available.get(name) results.append( dict(title=title, description="", action=action_url, selected=translation_id is not None, icon=None, extra=extra, submenu=None)) return results else: return None
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 getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" group_id = context.get_group().group_id contexts = self.getSchedulingContexts(request) results = [] for context in contexts: group = context.get_group() if group.group_id == group_id: continue _url = url.absoluteURL(context, request) extra = { # !+HTML_ID(mario, may-2011) what is the use of making the # (presumably HTML, used for styling... ) id be derived from # an sql surrogate pk ?! "id": "calendar-link-%s" % group.group_id, "separator": None, "class": "" } #!+(miano. nov-2010) description is set to be the same as title # below because the description of a group is a rich text field # that may have HTML formatting etc thus is not suitable to be # used as a tootip results.append(dict( title=context.label, description=context.label, action=_url, selected=False, icon=None, extra=extra, submenu=None )) # sort on title results.sort(key=operator.itemgetter("title")) return results
def __init__(self, context, request, view, manager): self.context = context self.request = request self.__parent__ = view self.manager = manager self.path = [] self.site_url = url.absoluteURL(getSite(), self.request)
def rssItems(self): """Elements of <item> A channel may contain any number of <item>s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed; see examples), and the link and title may be omitted. All elements of an item are optional, however at least one of title or description must be present. title The title of the item. link The URL of the item. description The item synopsis. pubDate Indicates when the item was published. """ bill_id = self.context.bill_id results = queries.execute_sql(statements.sql_bill_timeline, item_id=bill_id) path = url.absoluteURL(self.context, self.request) rlist = [] for result in results: rlist.append({ 'title': result.atype, 'description': result.title, 'date': result.adate.isoformat() }) return rlist
def __new__(cls, context, request, view, manager): chain = _get_context_chain(context) chain.pop() # bungeni_app top_section = chain.pop() if not chain: return # we require the tree to begin with a container object if not IReadContainer.providedBy(chain[-1]): return # remove any views from navigation tree if not (IAlchemistContent.providedBy(chain[0]) or IAlchemistContainer.providedBy(chain[0]) or ISection.providedBy(chain[0])): chain.pop(0) subcontext = chain[-1] if (len(chain) > 1 or IReadContainer.providedBy(subcontext) and not IAlchemistContainer.providedBy(subcontext) and len(subcontext)): inst = object.__new__(cls, context, request, view, manager) inst.chain = chain inst.top_section_url = url.absoluteURL(top_section, request) inst.id_prefix = "nav" return inst
def handle_edit_save_and_view(self, action, data): """Saves the document and redirects to its view page""" self._do_save(data) if not self._next_url: self._next_url = url.absoluteURL(self.context, self.request) + \ "?portal_status_message= Saved" self.request.response.redirect(self._next_url)
def rssItems(self): """Elements of <item> A channel may contain any number of <item>s. An item may represent a "story" -- much like a story in a newspaper or magazine; if so its description is a synopsis of the story, and the link points to the full story. An item may also be complete in itself, if so, the description contains the text (entity-encoded HTML is allowed; see examples), and the link and title may be omitted. All elements of an item are optional, however at least one of title or description must be present. title The title of the item. link The URL of the item. description The item synopsis. pubDate Indicates when the item was published. """ bill_id = self.context.bill_id results = queries.execute_sql( statements.sql_bill_timeline, item_id=bill_id) path = url.absoluteURL(self.context, self.request) rlist = [] for result in results: rlist.append({ 'title': result.atype, 'description': result.title, 'date': result.adate.isoformat() }) return rlist
def handle_add_and_add_another(self, action, data): ob = self.createAndAdd(data) name = self.domain_model.__name__ if not self._next_url: self._next_url = "%s/%s?portal_status_message=%s Added" % ( url.absoluteURL(self.context, self.request), self.add_action_verb, name)
def handle_generate_takes(self, action, data): transcribers = self.get_transcribers() sitting = self.context.sitting take_time_delta = datetime.timedelta(seconds=self.get_take_duration()) current_end_time = sitting.start_date current_start_time = sitting.start_date take_count = 0 session = Session() while current_end_time < sitting.end_date: take = domain.DebateTake() take.debate_record_id = self.context.debate_record_id take.start_date = current_start_time if ((current_end_time + take_time_delta) > sitting.end_date): current_end_time = sitting.end_date else: current_end_time = current_end_time + take_time_delta current_start_time = current_end_time + datetime.timedelta( seconds=1) take.end_date = current_end_time take.transcriber_id = transcribers[take_count % len(transcribers)].user_id take.debate_take_name = self.get_take_name(take_count) take_count = take_count + 1 session.add(take) session.flush() next_url = url.absoluteURL(self, self.request) self.request.response.redirect(next_url)
def _get_path(self, context): """Return the current path as a list """ descriptor = None name = None path = [] context = proxy.removeSecurityProxy(context) if context is None: return path # Proof-of-concept: support for selective inclusion in breadcrumb trail: # a view marked with an attribute __crumb__=False is NOT included in # the breadcrumb trail (see core/app.py: "workspace" Section) if not getattr(context, "__crumb__", True): return path if context.__parent__ is not None: path.extend(self._get_path(context.__parent__)) _url = url.absoluteURL(context, self.request) # Append a trailing slash to each breadcrumb entry so that # the right context is always maintained when the breadcrumbs # are used for navigation. _url = url.set_url_context(_url) title = _get_title_from_context(context) if title is not None: path.append({'name': title, 'url': _url}) return path
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" url = ui_url.absoluteURL(context, request) if checkPermission("bungeni.translation.Add", context): language = get_language(context) available = get_available_translations(context) results = [] for name, obj in get_all_languages().items(): title = obj['name'] # skip the current language if name == language: continue translation_id = available.get(name) selected = translation_id is not None action_url = url + '/translate?language=%s' % name extra = {'id': 'translation-action-%s' % name, 'separator': None, 'class': ''} results.append( dict(title=title, description="", action=action_url, selected=selected, icon=None, extra=extra, submenu=None)) return results else: return None
def render(self, today, template=None): if template is None: template = self.template calendar_url = url.absoluteURL(self.context.__parent__, self.request) cal_date = removeSecurityProxy(self.context.date) sittings = self.context.get_sittings() return template( display="daily", # title=_(u"$B $Y", mapping=date), title = cal_date, # day={ "formatted": datetime.datetime.strftime(cal_date, "%A %d"), "id": datetime.datetime.strftime(cal_date, "%Y-%m-%d"), "today": cal_date == today, "url": "%s/%d" % (calendar_url, cal_date.totimestamp()), }, hours=range(6,21), week_no=date.isocalendar()[1], week_day=date.weekday(), links={ "previous": "%s/%d" % ( calendar_url, (cal_date - timedelta(days=1)).totimestamp()), "next": "%s/%d" % ( calendar_url, (cal_date + timedelta(days=1)).totimestamp()), }, sittings_map = create_sittings_map(sittings, self.request), )
def getMenuItems(self, context, request): """Return menu item entries in a TAL-friendly form.""" group_id = context.get_group().group_id contexts = self.getSchedulingContexts(request) results = [] for context in contexts: group = context.get_group() if group.group_id==group_id: continue url = ui_url.absoluteURL(context, request) extra = {'id': 'calendar-link-%s' % group.group_id, 'separator': None, 'class': ''} results.append( dict(title=context.label, description=group.description, action=url, selected=False, icon=None, extra=extra, submenu=None)) # sort on title results.sort(key=operator.itemgetter("title")) return results
def render(self, today, template=None): if template is None: template = self.template calendar_url = ui_url.absoluteURL(self.context.__parent__, self.request) date = removeSecurityProxy(self.context.date) sittings = self.context.get_sittings() return template( display="daily", # title=_(u"$B $Y", mapping=date), title=date, # day={ 'formatted': datetime.datetime.strftime(date, '%A %d'), 'id': datetime.datetime.strftime(date, '%Y-%m-%d'), 'today': date == today, 'url': "%s/%d" % (calendar_url, date.totimestamp()), }, hours=range(6, 21), week_no=date.isocalendar()[1], week_day=date.weekday(), links={ 'previous': "%s/%d" % (calendar_url, (date - timedelta(days=1)).totimestamp()), 'next': "%s/%d" % (calendar_url, (date + timedelta(days=1)).totimestamp()), }, sittings_map=create_sittings_map(sittings, self.request), )
def process_form(self, data): class optionsobj(object): """Object that holds all the options.""" pass self.options = optionsobj() if not hasattr(self, "short_name"): if "short_name" in data: self.short_name = data["short_name"] self.sittings = [] if IGroupSitting.providedBy(self.context): trusted = removeSecurityProxy(self.context) order = "real_order" if self.display_minutes else "planned_order" trusted.item_schedule.sort(key=operator.attrgetter(order)) self.sittings.append(trusted) back_link = url.absoluteURL(self.context, self.request) + "/schedule" elif ISchedulingContext.providedBy(self.context): self.sittings = self.get_sittings(self.start_date, self.end_date) back_link = url.absoluteURL(self.context, self.request) else: raise NotImplementedError self.ids = "" for s in self.sittings: self.ids = self.ids + str(s.group_sitting_id) + "," def cleanup(string): return string.lower().replace(" ", "_") for item_type in data["item_types"]: itemtype = cleanup(item_type) setattr(self.options, itemtype, True) for option in data[itemtype + "_options"]: setattr(self.options, cleanup(itemtype + "_" + option), True) if self.display_minutes: self.link = url.absoluteURL( self.context, self.request) + "/votes-and-proceedings" else: self.link = url.absoluteURL(self.context, self.request) + "/agenda" try: self.group = self.context.get_group() except: session = Session() self.group = session.query(domain.Group).get(self.context.group_id)
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 getDataTableConfig(self): config = {} config['columns'], config['fields'] = self.getFieldColumns() config['data_url'] = self.getDataSourceURL() config['table_id'] = self.prefix config['link_url'] = ui_url.absoluteURL(self.context, self.request) config['context_name'] = self.context.__name__ return config
def handle_preview(self, action, data): self.process_form(data) #import pdb; pdb.set_trace() self.save_link = ui_url.absoluteURL(self.context, self.request) + "/save_report" self.body_text = self.result_template() #import pdb; pdb.set_trace() return self.main_result_template()