def build_form(form, form_name, entity=None, request_origin=None, entity2=None): """ The entity parameter can also be a link.""" # Add custom fields custom_list = [] def add_value_type_fields(subs) -> None: for sub_id in subs: sub = g.nodes[sub_id] setattr(form, str(sub.id), ValueFloatField(sub.name, [Optional()])) add_value_type_fields(sub.subs) for id_, node in NodeMapper.get_nodes_for_form(form_name).items(): custom_list.append(id_) setattr( form, str(id_), TreeMultiField(str(id_)) if node.multiple else TreeField(str(id_))) if node.value_type: add_value_type_fields(node.subs) form_instance = form(obj=entity) # Delete custom fields except the ones specified for the form delete_list = [ ] # Can't delete fields in the loop so creating a list for later deletion for field in form_instance: if type(field) in (TreeField, TreeMultiField) and int( field.id) not in custom_list: delete_list.append(field.id) for item in delete_list: delattr(form_instance, item) # Set field data if available and only if it's a GET request if entity and request_origin and request_origin.method == 'GET': # Important to use isinstance instead type check, because can be a sub type (e.g. ActorForm) if isinstance(form_instance, DateForm): form_instance.populate_dates(entity) nodes = entity.nodes if entity2: nodes.update(entity2.nodes) if hasattr(form, 'opened'): form_instance.opened.data = time.time() node_data = {} # type: dict for node, node_value in nodes.items(): root = g.nodes[node.root[-1]] if node.root else node if root.id not in node_data: node_data[root.id] = [] node_data[root.id].append(node.id) if root.value_type: getattr(form_instance, str(node.id)).data = node_value for root_id, nodes in node_data.items(): if hasattr(form_instance, str(root_id)): getattr(form_instance, str(root_id)).data = nodes return form_instance
def build_form(form: Any, form_name: str, selected_object: Union[Entity, Link, None] = None, request_origin: Optional_Type[Request] = None, entity2: Optional_Type[Entity] = None) -> Any: def add_value_type_fields(subs: List[int]) -> None: for sub_id in subs: sub = g.nodes[sub_id] setattr(form, str(sub.id), ValueFloatField(sub.name, [Optional()])) add_value_type_fields(sub.subs) # Add custom fields custom_list = [] for id_, node in NodeMapper.get_nodes_for_form(form_name).items(): custom_list.append(id_) setattr( form, str(id_), TreeMultiField(str(id_)) if node.multiple else TreeField(str(id_))) if node.value_type: add_value_type_fields(node.subs) form_instance = form(obj=selected_object) # Delete custom fields except the ones specified for the form delete_list = [ ] # Can't delete fields in the loop so creating a list for later deletion for field in form_instance: if type(field) in (TreeField, TreeMultiField) and int( field.id) not in custom_list: delete_list.append(field.id) for item in delete_list: delattr(form_instance, item) # Set field data if available and only if it's a GET request if selected_object and request_origin and request_origin.method == 'GET': from openatlas.forms.date import DateForm # Important to use isinstance instead type check, because can be a sub type (e.g. ActorForm) if isinstance(form_instance, DateForm): form_instance.populate_dates(selected_object) nodes = selected_object.nodes if isinstance(entity2, Entity): nodes.update(entity2.nodes) # type: ignore if hasattr(form, 'opened'): form_instance.opened.data = time.time() node_data: Dict[int, List[int]] = {} for node, node_value in nodes.items(): # type: ignore root = g.nodes[node.root[-1]] if node.root else node if root.id not in node_data: node_data[root.id] = [] node_data[root.id].append(node.id) if root.value_type: getattr(form_instance, str(node.id)).data = node_value for root_id, nodes_ in node_data.items(): if hasattr(form_instance, str(root_id)): getattr(form_instance, str(root_id)).data = nodes_ return form_instance
def build_form(form, form_name, entity=None, request_origin=None, entity2=None) -> Form: """ The entity parameter can also be a link.""" # Add custom fields custom_list = [] def add_value_type_fields(subs) -> None: for sub_id in subs: sub = g.nodes[sub_id] setattr(form, str(sub.id), ValueFloatField(sub.name, [Optional()])) add_value_type_fields(sub.subs) for id_, node in NodeMapper.get_nodes_for_form(form_name).items(): custom_list.append(id_) setattr(form, str(id_), TreeMultiField(str(id_)) if node.multiple else TreeField(str(id_))) if node.value_type: add_value_type_fields(node.subs) form_instance = form(obj=entity) # Delete custom fields except the ones specified for the form delete_list = [] # Can't delete fields in the loop so creating a list for later deletion for field in form_instance: if type(field) in (TreeField, TreeMultiField) and int(field.id) not in custom_list: delete_list.append(field.id) for item in delete_list: delattr(form_instance, item) # Set field data if available and only if it's a GET request if entity and request_origin and request_origin.method == 'GET': # Important to use isinstance instead type check, because can be a sub type (e.g. ActorForm) if isinstance(form_instance, DateForm): form_instance.populate_dates(entity) nodes = entity.nodes if entity2: nodes.update(entity2.nodes) if hasattr(form, 'opened'): form_instance.opened.data = time.time() node_data = {} # type: dict for node, node_value in nodes.items(): root = g.nodes[node.root[-1]] if node.root else node if root.id not in node_data: node_data[root.id] = [] node_data[root.id].append(node.id) if root.value_type: getattr(form_instance, str(node.id)).data = node_value for root_id, nodes in node_data.items(): if hasattr(form_instance, str(root_id)): getattr(form_instance, str(root_id)).data = nodes return form_instance