Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Overview of data structures #5117

Open
viktorvanwijk opened this issue Feb 21, 2025 · 1 comment
Open

Overview of data structures #5117

viktorvanwijk opened this issue Feb 21, 2025 · 1 comment
Assignees
Labels
Milestone

Comments

@viktorvanwijk
Copy link
Contributor

viktorvanwijk commented Feb 21, 2025

---
config:
  layout: elk
---
classDiagram
	%% Classes
    class FormioData:::important{
        %% data
    }

    class Appointment{
    	extract_email_addresses()
    }
    	
	class EvaluateDMNAction{
		eval()
	}
	
	class EditGridField{
		run_child_validation
	}
	
	class ObjectsAPIV2Handler{
		get_record_data()
		get_update_payment_status_data()
	}
	
	class SubmissionStepViewSet{
		logic_check()
	}
	
	class DataContainer:::important{
		data
		initial_data
		update()
		get_updated_step_data()
	}
	
	class SubmissionValueVariablesState{
		get_data()
		set_values()
		get_variables_in_submission_step()
	}
	
	class SubmissionValueVariableManager{
		bulk_create_or_update_form_data()
	}
	
	class JSONDumpRegistration{
		register_submission()
		post_process() (not a class method, but closely related)
		process_component () (not a class method, but closely related)
	}
	
 	class CosignState{
 		_find_component()
	}
	
	class ComponentRegistry{
		update_config()
	}
	
	class BasePlugin{
		mutate_config_dynamically()
	}
	
	class FormioConfigurationWrapper:::important{
		configuration
		component_map
		is_visible_in_frontend()
	}
	
	class StepDataSerializer{
		apply_hidden_state()
	}
	
	class FormDefinition{
		configuration_wrapper
	}
	
	class Submission{
		data
		total_configuration_wrapper
	}
	
	class SubmissionStep{
		data
	}
	
	class SubmissionCompletionSerializer{
		validate()
	}
	
	class FormVariableSerializer{
		validate()
	}
	
	class FormDefinitionSerializer{
		to_representation()
	}
	
	class FormVariable{
		as_json_schema()
		derive_info_from_component()
	}
	
	class SubmissionFileAttachment{
		_get_formio_config_property
	}
	
	class EmailVerificationSerializer{
		validate()
	}

    class iter_evaluate_rules{
        accesses DataContainer.data
    }

    class Camunda{
    	get_process_variables() (not a class method, but closely related)
	}
	
	class MSGraphRegistration{
		register_submission()
	}
	
	class SubmissionStepSerializer{
		to_representation()
	}
	
	class SubmissionViewSet{
		get_object()
	}
	
	class Renderer{
		get_children()
	}
	
	class FormioNode{
		get_children()
	}
	
	class ComponentNode{
		build_node()
	}

    %% Class definitions
    classDef important fill:red

	%% FormioData
    FormioData <..o get_variables_for_context : \_\_init\_\_(Submission.data)
    FormioData <..o Appointment
    FormioData <..o EvaluateDMNAction
    FormioData <..o EditGridField
    FormioData <..o transform_editgrid_values
    FormioData <..o ObjectsAPIV2Handler
    FormioData <..o SubmissionStepViewSet : \_\_init_\_(Submission.data)
    FormioData <..o evaluate_form_logic
    FormioData <..o DataContainer
    FormioData <..o SubmissionValueVariablesState
    FormioData <..o SubmissionValueVariableManager
    
    SubmissionStepViewSet ..> evaluate_form_logic :  \_\_call\_\_(FormioData, Submission.data)
    evaluate_form_logic ..> SubmissionValueVariablesState : .set_values(FormioData)
    
    %% DataContainer
    DataContainer <..o JSONDumpRegistration : \_\_init\_\_
    DataContainer <..o CosignState : \_\_init\_\_
    DataContainer <..o evaluate_form_logic : \_\_init\_\_, .data, .initial_data, .update, .get_updated_step_data
    DataContainer <..o check_submission_logic : \_\_init\_\_

    JSONDumpRegistration o..> rewrite_formio_components : \_\_call\_\_(FormDefinition.configuration_wrapper, DataContainer.data)
    rewrite_formio_components o..> ComponentRegistry : .update_config(DataContainer.data)
    ComponentRegistry o..> BasePlugin : .mutate_config_dynamically(DataContainer.data)
    
    CosignState o..> FormioConfigurationWrapper : .is_visible_in_frontend(DataContainer.data)
    %% TODO: would be nice if the specific method of FormioConfigurationWrapper is listed here (.is_visible_in_frontend)
    FormioConfigurationWrapper o..> is_visible_in_frontend : \_\_call\_\_(DataContainer.data)
    
    evaluate_form_logic o..> iter_evaluate_rules : \_\_call\_\_(DataContainer)
    evaluate_form_logic o..> get_dynamic_configuration : \_\_call\_\_(DataContainer.data)
    evaluate_form_logic o..> FormioData : \_\_init\_\_(DataContainer.initial_data)
    evaluate_form_logic o..> FormioConfigurationWrapper : .is_visible_in_frontend(DataContainer.data)

    check_submission_logic o..> iter_evaluate_rules : \_\_call\_\_(DataContainer)
    
    %% FormioConfigurationWrapper
    FormioConfigurationWrapper <..o convert_simple_conditionals
    FormioConfigurationWrapper <..o StepDataSerializer
    FormioConfigurationWrapper <..o FormDefinition
    FormioConfigurationWrapper <..o Submission

    %% FormDefinition
    FormDefinition <..o SubmissionCompletionSerializer : .configuration_wrapper
    FormDefinition <..o FormVariableSerializer : .configuration_wrapper
    FormDefinition <..o FormDefinitionSerializer : .configuration_wrapper
    FormDefinition <..o objects_api._lookup_component : .configuration_wrapper
    FormDefinition <..o FormVariable : .configuration_wrapper
    FormDefinition <..o evaluate_form_logic : .configuration_wrapper
    FormDefinition <..o check_submission_logic : .configuration_wrapper
    FormDefinition <..o Submission : .configuration_wrapper
    FormDefinition <..o SubmissionFileAttachment : .configuration_wrapper
    FormDefinition <..o SubmissionValueVariablesState : .configuration_wrapper
    
    SubmissionCompletionSerializer o..> get_dynamic_configuration : \_\_call\_\_(FormDefinition.configuration_wrapper, Submission.data)
    get_dynamic_configuration o..> get_translated_custom_error_messages : \_\_call\_\_(FormDefinition.confguration_wrapper)
    get_dynamic_configuration o..> localize_components : \_\_call\_\_(FormDefinition.configuration_wrapper)
    get_dynamic_configuration o..> inject_prefill : \_\_call\_\_(FormDefinition.configuration_wrapper)
    get_dynamic_configuration o..> rewrite_formio_components : \_\_call\_\_(FormDefinition.configuration_wrapper, DataContainer.data)

    FormDefinitionSerializer o..> rewrite_formio_components_for_request : \_\_call\_\_(FormDefinition.confguration_wrapper)
    
    %% SubmissionValueVariablesState
    SubmissionValueVariablesState <..o CosignState : .get_data()
    SubmissionValueVariablesState <..o JSONDumpRegistration : .get_data()
    SubmissionValueVariablesState <..o ObjectsAPIV2Handler : .get_data()
    SubmissionValueVariablesState <..o Submission : .get_data()
    SubmissionValueVariablesState <..o SubmissionStep : .get_data()
    
    %% Submission
    Submission <..o JSONDumpRegistration : .total_configuration_wrapper
    Submission <..o EmailVerificationSerializer : .total_configuration_wrapper
    Submission <..o CosignState : .total_configuration_wrapper
    Submission <..o prefill_variables : .total_configuration_wrapper

    %% Submission <..o Submission : .data
    Submission <..o SubmissionCompletionSerializer : .data
    Submission <..o Camunda : .data
    Submission <..o MSGraphRegistration : .data
    Submission <..o SubmissionStepSerializer : .data
    Submission <..o SubmissionViewSet : .data
    Submission <..o SubmissionStepViewSet : .data
    Submission <..o Renderer : .data
    Submission <..o send_confirmation_email : .data
    Submission <..o persist_user_defined_variables : .data
    Submission <..o get_variables_for_context : .data
    
    Camunda o..> get_process_variables : \_\_call\_\_(Submission.data)
    SubmissionStepSerializer o..> evaluate_form_logic : \_\_call\_\_(Submission.data)
    SubmissionViewSet o..> check_submission_logic : \_\_call\_\_(Submission.data)
   	Renderer o..> evaluate_form_logic : \_\_call\_\_(Submission.data)
   	persist_user_defined_variables o..> check_submission_logic : \_\_call\_\_(Submission.data)

	%% SubmissionStep
	SubmissionStep <..o iter_step_uploads : .data
	SubmissionStep <..o FormioNode : .data
	
	iter_step_uploads o..> resolve_uploads_from_data : \_\_call\_\_(SubmissionStep.data)
	resolve_uploads_from_data o..> iterate_data_with_components : \_\_call\_\_(SubmissionStep.data)
	FormioNode o..> ComponentNode : .build_node(SubmissionStep.data)





Loading

It looks like not all mermaid features (styling and layout) are supported in the Github markdown. Also, it is not possible to pan and zoom with a mouse here, so use the mermaid live editor for the best result

@viktorvanwijk
Copy link
Contributor Author

viktorvanwijk commented Mar 4, 2025

Meeting notes 28-02-2025

Entry point will be evaluate_form_logic as it is arguably the most complex case where all the data structures come together.
Plan of attack (main goal is to remove DataContainer):

  1. Extend PropertyAction with an eval() method so we can address the clearOnHide property directly while evaluating all the logic rules. (Something to take into account Hidden component unexpectedly set in submission data if clearOnHide is set and the default value differs from the empty value #4324?)
  2. Step 1. will enable tracking of the variable values that where changed during the evaluation of all logic rules, instead of creating a diff afterwards, which is currently the case.
  3. Replace DataContainer with FormioData
  4. Remove glom from the implementation details of FormioData, and replace it with a 'light' version.

Possible next steps:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Todo
Development

No branches or pull requests

2 participants