Beispiel #1
0
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
Beispiel #2
0
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