def form_name(self): parent = self.context.__parent__ if IAlchemistContainer.providedBy(parent): descriptor = queryModelDescriptor(parent.domain_model) elif IAlchemistContent.providedBy(self.context): descriptor = queryModelDescriptor(self.context.__class__) else: raise RuntimeError("Unsupported object: %s." % repr(self.context)) if descriptor: name = getattr(descriptor, "display_name", None) if name is None: name = self.context.__class__.__name__ return name
def __init__(self, context, request): super(ContainerJSONBrowserView, self).__init__(context, request) self.domain_model = proxy.removeSecurityProxy( self.context).domain_model self.domain_interface = model.queryModelInterface(self.domain_model) self.domain_annotation = model.queryModelDescriptor( self.domain_interface) self.fields = tuple(container.getFields( self.context, self.domain_interface, self.domain_annotation)) # table keys self.table = orm.class_mapper(self.domain_model).mapped_table self.utk = dict( [ (column.key, column) for column in self.table.columns ]) # sort_on defaults: [str] self.defaults_sort_on = getattr(self.domain_model, "sort_on", None) # sort_on parameter name: str # pick off request, if necessary setting it from the first name # defined in defaults_sort_on if not self.request.get("sort") and self.defaults_sort_on: self.request.form["sort"] = u"sort_%s" % (self.defaults_sort_on[0]) self.sort_on = request.get("sort") # sort_dir: "desc" | "asc" # pick off request, if necessary setting it from default in # domain model, else "desc" if not self.request.get("dir"): self.request.form["dir"] = unicode( getattr(self.domain_model, "sort_dir", "desc")) self.sort_dir = self.request.get("dir")
def validate(self, action, data): errors = super(AddForm, self).validate(action, data) errors += self.validateUnique(action, data) descriptor = queryModelDescriptor(self.domain_model) for validator in getattr(descriptor, "custom_validators", ()): errors += validator(action, data, None, self.context) return errors
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 type_name(self): descriptor = queryModelDescriptor(self.domain_model) if descriptor: name = getattr(descriptor, "display_name", None) if not name: name = getattr(self.domain_model, "__name__", None) return name
def __init__(self, context, request, view, manager): self.context = context self.request = request self.__parent__ = context.__parent__ self.manager = manager self.query = None md = queryModelDescriptor(domain.User) self.form_fields = md.fields #.select("user_id", "start_date", "end_date")
def validate(self, action, data): errors = super(EditForm, self).validate(action, data) descriptor = queryModelDescriptor(self.context.__class__) for validator in getattr(descriptor, "custom_validators", ()): errors += validator(action, data, self.context, self.context.__parent__) return errors
def form_name(self): parent = self.context.__parent__ #DESCRIPTOR(miano, June 2011) This originally first checked the parent's #descriptor then the item's descriptor. Why??? #This was causing an error in the display pages of items in the #workspace since the workspace containers have no descriptor #defined for them. if IAlchemistContent.providedBy(self.context): descriptor = queryModelDescriptor(self.context.__class__) elif IAlchemistContainer.providedBy(parent): descriptor = queryModelDescriptor(parent.domain_model) else: raise RuntimeError("Unsupported object: %s." % repr(self.context)) if descriptor: name = getattr(descriptor, "display_name", None) if name is None: name = self.context.__class__.__name__ return name
def getFields(context, interface=None, annotation=None): """Generator of all fields that will be displayed in a containerlisting . Redefines alchemist.ui.container.getFields, making use of the listing_columns declaration of the field's descriptor. """ if interface is None: domain_model = proxy.removeSecurityProxy(context.domain_model) interface = model.queryModelInterface(domain_model) if annotation is None: annotation = model.queryModelDescriptor(interface) for column in annotation.listing_columns: yield interface[column]
def getFields(context, interface=None, annotation=None): """Generator of all [zope.schema] fields that will be displayed in a container listing. Redefines alchemist.ui.container.getFields, making use of the @listing_columns property of the ModelDescriptor class. """ if interface is None: domain_model = proxy.removeSecurityProxy(context.domain_model) interface = model.queryModelInterface(domain_model) if annotation is None: annotation = model.queryModelDescriptor(interface) for field_name in annotation.listing_columns: yield interface[field_name]
def __init__(self, context, request, view, manager): super(DisplayViewlet, self).__init__(context, request, view, manager) # set add url before we change context self.add_url = self.get_add_url() target = self.get_target() if target is None: self.status = _(u"No item has been set") else: self.context = target self.has_data = True assert self.factory is not None descriptor = queryModelDescriptor(self.factory) self.form_fields = descriptor.fields
def __init__(self, context, request, view, manager): super(DisplayViewlet, self).__init__( context, request, view, manager) # set add url before we change context self.add_url = self.get_add_url() target = self.get_target() if target is None: self.status = _(u"No item has been set") else: self.context = target self.has_data = True assert self.factory is not None descriptor = queryModelDescriptor(self.factory) self.form_fields = descriptor.fields
def get_sitting_items(self, sitting): s_list = [] if sitting.status in self._agenda_private_state_ids: return s_list else: for schedule in sitting.item_schedule: descriptor = queryModelDescriptor(schedule.item.__class__) s_list.append({ "name": IDCDescriptiveProperties(schedule.item).title, "status": str(misc.get_wf_state(schedule.item)), "url": IDCDescriptiveProperties(schedule.item).uri, "item_type": schedule.item.type, "heading": True if schedule.item.type == "heading" else False, "item_type_title": (descriptor.display_name if descriptor else schedule.item.type), }) return s_list
def expand_containers(self, items, containers, _url, chain=(), context=None): #seen_context = False current = False for key, container in containers: if IAlchemistContainer.providedBy(container): descriptor = queryModelDescriptor( proxy.removeSecurityProxy(container).domain_model) if descriptor: name = getattr(descriptor, "container_name", None) if name is None: name = getattr(descriptor, "display_name", None) if not name: name = container.domain_model.__name__ else: assert IDCDescriptiveProperties.providedBy(container) container = proxy.removeSecurityProxy(container) name = container.title if context is not None: current = container.__name__ == context.__name__ selected = len(chain) == 0 and current if current: #seen_context = True nodes = self.expand(chain) else: nodes = () items.append({ "title": name, "url": "%s/%s" % (_url.rstrip("/"), key), "current": current, "selected": selected, "kind": "container", "nodes": nodes, })
def expand_containers(self, items, containers, _url, chain=(), context=None): #seen_context = False current = False for key, container in containers: if IAlchemistContainer.providedBy(container): descriptor = queryModelDescriptor( proxy.removeSecurityProxy(container).domain_model) if descriptor: name = getattr(descriptor, 'container_name', None) if name is None: name = getattr(descriptor, 'display_name', None) if not name: name = container.domain_model.__name__ else: assert IDCDescriptiveProperties.providedBy(container) container = proxy.removeSecurityProxy(container) name = container.title if context is not None: current = container.__name__ == context.__name__ selected = len(chain) == 0 and current if current: #seen_context = True nodes = self.expand(chain) else: nodes = () items.append({ 'title': name, 'url': "%s/%s" % (_url.rstrip('/'), key), 'current': current, 'selected': selected, 'kind': 'container', 'nodes': nodes, })
def get_item_types(self): workspace_config = component.getUtility(IWorkspaceTabsUtility) roles = get_workspace_roles() + OBJECT_ROLES domains = [] for role in roles: dom = workspace_config.get_role_domains(role, self.context.__name__) if dom: for key in dom: if key not in domains: domains.append(key) result = dict([("", "-")]) for domain in domains: value = workspace_config.get_type(domain) if value: descriptor = queryModelDescriptor(domain) name = descriptor.display_name if descriptor else value result[value] = translate(name, context=self.request) return result
def __init__(self, max_size, model_interface, invalidating_class_names): """ max_size:int - max number of items to cache, 0 implies unlimited, oldest in excess of max are discarded model_interface: interface domain model for this listing invalidating_class_names:[str] - names of domain classes that when modified will invalidate this cache descriptor: descriptor instance for domain model for this listing filter_params: [name:str] - query string filter parameter names """ self.cache = evoque.collection.Cache(max_size) self.descriptor = model.queryModelDescriptor(model_interface) # !+CACHE_INVALIDATION(mr, sep-2010) this should be left open-ended? # sanity check -- ensure every specified (domain) class_name exists for icn in invalidating_class_names: assert getattr(domain, icn), "No such domain class: %s" % (icn) self.invalidating_class_names = invalidating_class_names # dynamically build the incoming (request querystring) filter # parameter names lists from the domain class descriptor self.filter_params = ["filter_%s" % (field_name) for field_name in self.descriptor.listing_columns]
def get_item_types(self): workspace_config = component.getUtility(IWorkspaceTabsUtility) roles = get_workspace_roles() + OBJECT_ROLES domains = [] for role in roles: dom = workspace_config.get_role_domains( role, self.context.__name__ ) if dom: for key in dom: if key not in domains: domains.append(key) result = dict([("", "-")]) for domain in domains: value = workspace_config.get_type(domain) if value: descriptor = queryModelDescriptor(domain) name = descriptor.display_name if descriptor else value result[value] = translate(name, context=self.request) return result
def expand_containers(self, items, containers, _url, chain=(), context=None): # seen_context = False current = False for key, container in containers: if IAlchemistContainer.providedBy(container): descriptor = queryModelDescriptor(proxy.removeSecurityProxy(container).domain_model) if descriptor: name = getattr(descriptor, "container_name", None) if name is None: name = getattr(descriptor, "display_name", None) if not name: name = container.domain_model.__name__ else: assert IDCDescriptiveProperties.providedBy(container) container = proxy.removeSecurityProxy(container) name = container.title if context is not None: current = container.__name__ == context.__name__ selected = len(chain) == 0 and current if current: # seen_context = True nodes = self.expand(chain) else: nodes = () items.append( { "title": name, "url": "%s/%s" % (_url.rstrip("/"), key), "current": current, "selected": selected, "kind": "container", "nodes": nodes, } )
def expand_containers(self, items, containers, _url, chain=(), context=None): #seen_context = False current = False for key, container in containers: if IAlchemistContainer.providedBy(container): descriptor = queryModelDescriptor( proxy.removeSecurityProxy(container).domain_model) if descriptor: name = getattr(descriptor, 'container_name', None) if name is None: name = getattr(descriptor, 'display_name', None) if not name: name = container.domain_model.__name__ else: assert IDCDescriptiveProperties.providedBy(container) container = proxy.removeSecurityProxy(container) name = container.title if context is not None: current = container.__name__ == context.__name__ selected = len(chain) == 0 and current if current: #seen_context = True nodes = self.expand(chain) else: nodes = () items.append( {'title': name, 'url': "%s/%s" % (_url.rstrip('/'), key), 'current': current, 'selected': selected, 'kind': 'container', 'nodes': nodes, })
def get_sitting_items(self, sitting): s_list = [] if sitting.status in get_states('groupsitting',tagged=['agendaprivate']): return s_list else: # !+DCPROPERTIES(murithi, april-2011) Factor out properties+i18n to DC for schedule in sitting.item_schedule: descriptor = queryModelDescriptor(schedule.item.__class__) s_list.append({ 'name': IDCDescriptiveProperties(schedule.item).title, 'status' : str(misc.get_wf_state(schedule.item)) , 'url' : url.set_url_context(('/business/' + schedule.item.type + 's/obj-' + str(schedule.item.parliamentary_item_id))), 'item_type': schedule.item.type, 'item_type_title' : ( descriptor.display_name if descriptor else schedule.item.type ), }) return s_list
def __init__(self, max_size, model_interface, invalidating_class_names): """ max_size:int - max number of items to cache, 0 implies unlimited, oldest in excess of max are discarded model_interface: interface domain model for this listing invalidating_class_names:[str] - names of domain classes that when modified will invalidate this cache descriptor: descriptor instance for domain model for this listing filter_params: [name:str] - query string filter parameter names """ self.cache = evoque.collection.Cache(max_size) self.descriptor = model.queryModelDescriptor(model_interface) # !+CACHE_INVALIDATION(mr, sep-2010) this should be left open-ended? # sanity check -- ensure every specified (domain) class_name exists for icn in invalidating_class_names: assert getattr(domain, icn), "No such domain class: %s" % (icn) self.invalidating_class_names = invalidating_class_names # dynamically build the incoming (request querystring) filter # parameter names lists from the domain class descriptor self.filter_params = [ "filter_%s" % (field_name) for field_name in self.descriptor.listing_columns ]
def get_sitting_items(self, sitting): s_list = [] if sitting.status in get_states('groupsitting', tagged=['agendaprivate']): return s_list else: # !+DCPROPERTIES(murithi, april-2011) Factor out properties+i18n to DC for schedule in sitting.item_schedule: descriptor = queryModelDescriptor(schedule.item.__class__) s_list.append({ 'name': IDCDescriptiveProperties(schedule.item).title, 'status': str(misc.get_wf_state(schedule.item)), 'url': url.set_url_context( ('/business/' + schedule.item.type + 's/obj-' + str(schedule.item.parliamentary_item_id))), 'item_type': schedule.item.type, 'item_type_title': (descriptor.display_name if descriptor else schedule.item.type), }) return s_list
def filterFields(context, form_fields): omit_names = [] if IAlchemistContent.providedBy(context): md = queryModelDescriptor(context.__class__) for field in form_fields: try: can_write = security.canWrite(context, field.__name__) can_read = security.canAccess(context, field.__name__) except AttributeError: can_write = can_read = False if can_write: continue if can_read: field.for_display = True field.custom_widget = md.get(field.__name__).view_widget else: omit_names.append(field.__name__) elif not IAlchemistContainer.providedBy(context): ctx = getattr(context, "context", None) if ctx: filterFields(ctx, form_fields) else: raise NotImplementedError return form_fields.omit(*omit_names)
def __init__(self, max_size, model_interface, invalidating_class_names): """ max_size:int - max number of items to cache, 0 implies unlimited, oldest in excess of max are discarded model_interface: interface domain model for this listing invalidating_class_names:[str] - names of domain classes that when modified will invalidate this cache @descriptor: descriptor instance for domain model for this listing @filter_params: [name:str] - query string filter parameter names """ self.cache = evoque.collection.Cache(max_size) log.debug("JSLCache queryModelDescriptor(%s) -> %s" % ( model_interface.__name__, model.queryModelDescriptor(model_interface))) ''' !+queryModelDescriptor(mr, mar-2011) because of the discrepancy between test and application ZCML code, when running bungeni.ui unittests the call to queryModelDescriptor here (i.e. when importing this module) returns None. To reduce this timing issue, the setting up of the JSLCache attributes descriptor and filter_params is being postponed to when it is needed i.e. when they are actually being called and used--which is why they are implemented as properties. They are themselves cached to minimize the overhead of repeated lookups at runtime. !+queryModelDescriptor(mr, mar-2011) should be renamed, and behaviour changed accordingly (raise an error when None) to getModelDescriptor(). ''' self.model_interface = model_interface self._descriptor = None self._filter_params = None # !+CACHE_INVALIDATION(mr, sep-2010) this should be left open-ended? # sanity check -- ensure every specified (domain) class_name exists for icn in invalidating_class_names: assert getattr(domain, icn), "No such domain class: %s" % (icn) self.invalidating_class_names = invalidating_class_names
def __init__(self, context): self.context = context self.domain_model = removeSecurityProxy(self.context).domain_model self.domain_interface = model.queryModelInterface(self.domain_model) self.domain_annotation = model.queryModelDescriptor(self.domain_interface)
def get_schedulable_types(): return dict([ (name, model.queryModelDescriptor(domain.DOMAIN_CLASSES[name]).container_name) for name in SCHEDULABLE_TYPES ])
def title(self): descriptor = queryModelDescriptor(self.context.domain_model) return descriptor.container_name
def set_untranslatable_fields_for_display(self): md = queryModelDescriptor(self.context.__class__) for field in self.form_fields: if field.__name__ not in self.translatable_field_names(): field.for_display = True field.custom_widget = md.get(field.__name__).view_widget
def __init__(self, context): self.context = context self.domain_model = removeSecurityProxy(self.context).domain_model self.domain_interface = model.queryModelInterface(self.domain_model) self.domain_annotation = model.queryModelDescriptor( self.domain_interface)
def model_descriptor(self): return queryModelDescriptor(self.domain_model)
def descriptor(self): """Get (cached) descriptor instance for self.model_interface. """ if self._descriptor is None: self._descriptor = model.queryModelDescriptor(self.model_interface) return self._descriptor
def form_name(self): dm = self.context.domain_model return getattr(model.queryModelDescriptor(dm), "container_name", dm.__name__)
def form_name(self): descriptor = queryModelDescriptor(self.factory) return descriptor.display_name
def get_schedulable_types(): return dict([(name, model.queryModelDescriptor( domain.DOMAIN_CLASSES[name]).container_name) for name in SCHEDULABLE_TYPES])
def type(self): descriptor = queryModelDescriptor(self.context.__class__) item_type = descriptor.display_name if descriptor \ else self.context.type request = get_request() return translate(item_type, context=request)