def localize_descriptor(type_key, descriptor_elem, scope="system"): """Localize descriptor from descriptor XML element. Return the created/modified descriptor class. """ ti = capi.get_type_info(type_key) # !+ ensure domain_model has already been set assert ti.domain_model, type_key order = xai(descriptor_elem, "order") fields = new_descriptor_fields(descriptor_elem) info_containers = [] for c_elem in descriptor_elem.findall("container"): # !+ @view_title:i18n_key, @view_id:token, @weight:int ? target_type_key, rel_attr_name = xas(c_elem, "match").split(".", 1) container_attr_name = xas(c_elem, "name") or naming.plural(target_type_key) indirect_key = xas(c_elem, "indirect_key") viewlet = xab(c_elem, "viewlet", False) add_info_container(type_key, info_containers, container_attr_name, target_type_key, rel_attr_name, indirect_key, viewlet=viewlet, _origin="container") integrity = descriptor_elem.find("integrity") if integrity is not None: constraints = [ capi.get_form_constraint(c) for c in xas(integrity, "constraints", "").split() ] validations = [ capi.get_form_validator(v) for v in xas(integrity, "validations", "").split() ] else: constraints, validations = (), () if scope=="custom": try: cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) except AttributeError: # first time around, no such descriptor - so create a new custom descriptor archetype_key = naming.polymorphic_identity(ti.archetype) cls = new_descriptor_cls(type_key, archetype_key, order, fields, info_containers, constraints, validations) if xas(descriptor_elem, "sort_on"): cls.sort_on = xas(descriptor_elem, "sort_on").split() # !+ assert each name is a field in the descriptor if xas(descriptor_elem, "sort_dir"): # default cls.sort_dir: "desc" cls.sort_dir = xas(descriptor_elem, "sort_dir") update_new_descriptor_cls_from_ti(ti) else: # non-custom cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) # finish model/descriptor setup from feature configuration if ti.workflow: for feature in ti.workflow.features: feature.setup_ui(ti.domain_model) # custom container order - re-sort info_containers such that "container" # ones precede all "feature" ones, plus make the list immutable i.e. no # further changes allowed. ics = ti.descriptor_model.info_containers ti.descriptor_model.info_containers = tuple(sorted(ics, # False sorts before True (as 0 sorts before 1) key=lambda ic: ic._origin == "feature" )) log.debug("Localized descriptor [%s] %s", type_key, ti) return cls
def localize_descriptor(descriptor_elem, is_init, scope="system"): """Localize descriptor from descriptor XML element. Return the created/modified descriptor class. """ type_key = xas(descriptor_elem, "name") ti = capi.get_type_info(type_key) # !+ ensure domain_model has already been set assert ti.domain_model, type_key order = xai(descriptor_elem, "order") fields = new_descriptor_fields(descriptor_elem) info_containers = [ parse_container(c_elem) for c_elem in descriptor_elem.findall("container") ] integrity = descriptor_elem.find("integrity") if integrity is not None: constraints = [ capi.get_form_constraint(c) for c in xas(integrity, "constraints", "").split() ] validations = [ capi.get_form_validator(v) for v in xas(integrity, "validations", "").split() ] else: constraints, validations = (), () domain_model = ti.domain_model if scope == "custom": try: cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) except AttributeError: # first time around, no such descriptor - so create a new custom descriptor archetype_key = naming.polymorphic_identity(ti.archetype) cls = new_descriptor_cls(type_key, archetype_key, order, fields, info_containers, constraints, validations) # only "push" onto cls (hiding same-named properties or overriding # inherited setting) if set in the descriptor AND only on cls creation: if xas(descriptor_elem, "label"): cls.display_name = xas(descriptor_elem, "label") if xas(descriptor_elem, "container_label"): cls.container_name = xas(descriptor_elem, "container_label") if xas(descriptor_elem, "sort_on"): cls.sort_on = xas(descriptor_elem, "sort_on").split() # !+ assert each name is a field in the descriptor if xas(descriptor_elem, "sort_dir"): # default cls.sort_dir: "desc" cls.sort_dir = xas(descriptor_elem, "sort_dir") naming.MSGIDS.add(cls.display_name) naming.MSGIDS.add(cls.container_name) # this is guarenteed to execute maximum once per type_key alchemist.model.localize_domain_model_from_descriptor_class( domain_model, cls) #!+CATALYSE_SYSTEM_DESCRIPTORS -- all custom types are catalysed here! alchemist.catalyst.catalyse(ti) else: # non-custom cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) # ensures that this executes a maximum once per type_key if type_key in alchemist.model.localize_domain_model_from_descriptor_class.DONE: log.warn( "Ignoring attempt to re-localize model [scope=%r] " "from descriptor for type %r", scope, type_key) else: alchemist.model.localize_domain_model_from_descriptor_class( domain_model, cls) #!+CATALYSE_SYSTEM_DESCRIPTORS -- all non-custom types have already # catalysed on import of ui.descriptor, and may not "catalyse twice" # so just working around it by "calling" less of alchemist.catalyst.catalyse(ti) # Make ui.descriptor.catalyse_system_descriptors to be more selective, # and then catalyse remaining support types here? #alchemist.catalyst.catalyse(ti) #!+re-apply_security breaks edit event view (fields shown in view mode!) #alchemist.catalyst.apply_security(ti) alchemist.catalyst.generate_collection_traversal(ti) log.debug("Localized [init=%s] descriptor [%s] %s", is_init, type_key, ti) return cls
def localize_descriptor(descriptor_elem, is_init, scope="system"): """Localize descriptor from descriptor XML element. Return the created/modified descriptor class. """ type_key = xas(descriptor_elem, "name") ti = capi.get_type_info(type_key) # !+ ensure domain_model has already been set assert ti.domain_model, type_key order = xai(descriptor_elem, "order") fields = new_descriptor_fields(descriptor_elem) info_containers = [ parse_container(c_elem) for c_elem in descriptor_elem.findall("container") ] integrity = descriptor_elem.find("integrity") if integrity is not None: constraints = [ capi.get_form_constraint(c) for c in xas(integrity, "constraints", "").split() ] validations = [ capi.get_form_validator(v) for v in xas(integrity, "validations", "").split() ] else: constraints, validations = (), () domain_model = ti.domain_model if scope=="custom": try: cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) except AttributeError: # first time around, no such descriptor - so create a new custom descriptor archetype_key = naming.polymorphic_identity(ti.archetype) cls = new_descriptor_cls(type_key, archetype_key, order, fields, info_containers, constraints, validations) # only "push" onto cls (hiding same-named properties or overriding # inherited setting) if set in the descriptor AND only on cls creation: if xas(descriptor_elem, "label"): cls.display_name = xas(descriptor_elem, "label") if xas(descriptor_elem, "container_label"): cls.container_name = xas(descriptor_elem, "container_label") if xas(descriptor_elem, "sort_on"): cls.sort_on = xas(descriptor_elem, "sort_on").split() # !+ assert each name is a field in the descriptor if xas(descriptor_elem, "sort_dir"): # default cls.sort_dir: "desc" cls.sort_dir = xas(descriptor_elem, "sort_dir") naming.MSGIDS.add(cls.display_name) naming.MSGIDS.add(cls.container_name) # this is guarenteed to execute maximum once per type_key alchemist.model.localize_domain_model_from_descriptor_class(domain_model, cls) #!+CATALYSE_SYSTEM_DESCRIPTORS -- all custom types are catalysed here! alchemist.catalyst.catalyse(ti) else: # non-custom cls = update_descriptor_cls(type_key, order, fields, info_containers, constraints, validations) # ensures that this executes a maximum once per type_key if type_key in alchemist.model.localize_domain_model_from_descriptor_class.DONE: log.warn("Ignoring attempt to re-localize model [scope=%r] " "from descriptor for type %r", scope, type_key) else: alchemist.model.localize_domain_model_from_descriptor_class(domain_model, cls) #!+CATALYSE_SYSTEM_DESCRIPTORS -- all non-custom types have already # catalysed on import of ui.descriptor, and may not "catalyse twice" # so just working around it by "calling" less of alchemist.catalyst.catalyse(ti) # Make ui.descriptor.catalyse_system_descriptors to be more selective, # and then catalyse remaining support types here? #alchemist.catalyst.catalyse(ti) #!+re-apply_security breaks edit event view (fields shown in view mode!) #alchemist.catalyst.apply_security(ti) alchemist.catalyst.generate_collection_traversal(ti) log.debug("Localized [init=%s] descriptor [%s] %s", is_init, type_key, ti) return cls