formkit-ninja 2.2__tar.gz → 2.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {formkit_ninja-2.2 → formkit_ninja-2.3}/PKG-INFO +3 -3
- {formkit_ninja-2.2 → formkit_ninja-2.3}/README.md +2 -2
- formkit_ninja-2.3/docs/ADMIN_DESIGN_EVALUATION.md +164 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/admin.py +65 -81
- formkit_ninja-2.3/formkit_ninja/migrations/0042_formkitschemanode_list_filter.py +61 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/models.py +30 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/class_index.html +192 -192
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/function_index.html +287 -287
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/index.html +67 -67
- formkit_ninja-2.3/htmlcov/status.json +1 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_apps_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_import_monitoring_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_models_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_querysets_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_signals_py.html +4 -4
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_utils_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_add_schema_field_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_bootstrap_app_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_check_valid_names_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_create_schema_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_generate_all_schemas_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_generate_code_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_import_forms_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_336430bde916e5dc___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_336430bde916e5dc_schema_import_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_converters_examples_py.html +19 -19
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_converters_py.html +34 -34
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_database_node_path_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_formatter_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generation_pipeline_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generator_config_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generator_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_logger_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_node_factory_py.html +23 -23
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_node_registry_py.html +7 -7
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_plugins_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_schema_walker_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_template_loader_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_type_convert_py.html +80 -80
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_49d1c7cc3d8927e8___init___py.html +7 -7
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_49d1c7cc3d8927e8_schemas_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1___main___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_admin_code_generation_py.html +146 -146
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_admin_py.html +813 -829
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_api_py.html +202 -202
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_code_generation_config_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_fields_py.html +40 -40
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_formkit_schema_py.html +14 -14
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_models_py.html +492 -462
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_notifications_py.html +21 -21
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_triggers_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_urls_py.html +4 -4
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_utils_py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_c3b4d83f5f06a6a6___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_f16099ef8f43d13f___init___py.html +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/pyproject.toml +1 -1
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/settings.py +6 -6
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin.py +19 -1
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_complex_nodes.py +2 -2
- {formkit_ninja-2.2 → formkit_ninja-2.3}/uv.lock +1 -1
- formkit_ninja-2.2/formkit_ninja/migrations/0042_formkitschemanode_list_filter.py +0 -41
- formkit_ninja-2.2/htmlcov/status.json +0 -1
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.agent/workflows/conventions.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/001-github-issues.mdc +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/002-issue-creation-guide.mdc +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/003-commit-messages.mdc +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/004-pytest-requirements.mdc +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/005-database-container.mdc +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursorrules +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.flake8 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.github/workflows/ci.yml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.github/workflows/docs.yml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.gitignore +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.pre-commit-config.yaml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/extensions.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/launch.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/settings.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/CHANGELOG.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/DEVELOPMENT.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/FEATURES_COMPARISON.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/NEW_USER_WORKFLOW_SUMMARY.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/SCHEMA_CONVERSION_SUMMARY.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/TEST_COVERAGE_ANALYSIS.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/debug_naming.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/debug_partisipa.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/demo_workflow.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/admin.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/classes.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/code_generation.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/database_code_generation.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/feature_matrix.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/index.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/inputs.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/multiple_schemas_options.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/options.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/quick_start.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/submission_architecture.md +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/__main__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/admin_code_generation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/api.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/code_generation_config.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fields.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fixtures/partisipa_contenttypes.json.gz +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fixtures/partisipa_formkit_data.json.gz +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/apps.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/import_monitoring.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/querysets.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/signals.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/utils.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/formkit_schema.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/.gitignore +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/__init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/__main___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/admin_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/api_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/class_index.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/coverage_html_cb_dd2e7eb5.js +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/favicon_32_cb_c827f16f.png +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/fields_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/formkit_schema_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/function_index.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/index.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/models_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/status.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/style_cb_9ff733b0.css +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/triggers_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/urls_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_51fcec635d35c76c___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_51fcec635d35c76c_schemas_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720_logger_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720_type_convert_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_d0f9da560d0d1331___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0001_initial_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0002_alter_formcomponents_label_alter_formkitschema_key_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0003_delete_translatable_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0004_remove_formkitschema_key_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0005_option_last_updated_option_object_id_optionlabel_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0006_option_group_option_unique_option_id_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0007_alter_option_field_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0008_remove_option_label_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0009_formkitschemanode_text_content_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0010_alter_option_options_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0011_nodechildren_formkitschemanode_children_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0012_remove_formkitschemanode_group_remove_option_field_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0013_formkitschemanode_option_group_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0014_schemalabel_schemadescription_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0015_alter_formkitschema_label_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0016_alter_nodechildren_options_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0017_nodechildren_change_id_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0018_remove_formcomponents_order_on_insert_option_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0019_formkitschemanode_track_change_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0020_remove_formcomponents_order_on_update_option_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0021_formkitschemanode_is_active_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0022_formkitschemanode_soft_delete_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0023_formkitschemanodeevent_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0024_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0025_remove_formkitschemanode_protect_deletes_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0026_remove_formkitschemanode_protect_node_deletes_and_updates_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0027_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0028_migrate_additional_props_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0029_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0030_migrate_more_props_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0031_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0032_migrate_repeater_props_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0033_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19_check_valid_names_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19_import_forms_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_fd003194bc69d7fb___init___py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/add_schema_field.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/bootstrap_app.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/check_valid_names.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/create_schema.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/generate_all_schemas.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/generate_code.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/import_forms.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0001_initial.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0002_alter_formcomponents_label_alter_formkitschema_key.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0003_delete_translatable.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0004_remove_formkitschema_key_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0005_option_last_updated_option_object_id_optionlabel_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0006_option_group_option_unique_option_id.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0007_alter_option_field.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0008_remove_option_label.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0009_formkitschemanode_text_content_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0010_alter_option_options_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0011_nodechildren_formkitschemanode_children.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0012_remove_formkitschemanode_group_remove_option_field_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0013_formkitschemanode_option_group.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0014_schemalabel_schemadescription.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0015_alter_formkitschema_label.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0016_alter_nodechildren_options_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0017_nodechildren_change_id.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0018_remove_formcomponents_order_on_insert_option_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0019_formkitschemanode_track_change_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0020_remove_formcomponents_order_on_update_option_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0021_formkitschemanode_is_active.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0022_formkitschemanode_soft_delete.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0023_formkitschemanodeevent_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0024_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0025_remove_formkitschemanode_protect_deletes_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0026_remove_formkitschemanode_protect_node_deletes_and_updates_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0027_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0028_migrate_additional_props.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0029_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0030_migrate_more_props.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0031_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0032_migrate_repeater_props.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0033_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0034_codegenerationconfig_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0035_alter_codegenerationconfig_priority_submission_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0036_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0037_alter_formkitschemanode_django_field_args_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0038_separatedsubmissionevent_submissionevent_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0039_remove_formkitschemanode_insert_insert_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0040_submissionfile_separatedsubmissionimport_and_more.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0041_flag.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/notifications.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/converters.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/converters_examples.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/database_node_path.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/formatter.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generation_pipeline.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generator.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generator_config.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/logger.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/node_factory.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/node_registry.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/plugins.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/schema_walker.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/template_loader.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/abstract_model.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/admin.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/admin.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/api.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/api.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/basemodel.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/model.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/models.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schema.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schemas.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schemas_in.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/signals.py.jinja2 +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/type_convert.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/button-with-slot.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/color_input.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/date_input.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/element.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/form_generation_example.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/meeting_type_node.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/raw_values.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Balansu.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/CFM_12_FF_12.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/CFM_2_FF_4.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Dateofexitfromthecommittee.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Enterasensiblenumber.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_3_4.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_6.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_10.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_11.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_14.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_1_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_1_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_33_Finance_check.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_3_3_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_3_3_5.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_5_3_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS5.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS_4_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS_4_6.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Fathersname.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Formulariu_koko.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/HowmanyDollars.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/MoneyTestgroup.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Monitorizasaun_Projetu_teste.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Mothersname.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/NewGroup.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/None.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Numberofhousehold.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/NumeruBI.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/POM_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/POM_5.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Project.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF2_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_6_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Sex_father.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_4.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_3_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_1_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_1_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_2_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_2_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_3_2.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_4_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TestForm.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Tests.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Testu.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Thisisanumericinput.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/_dad.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/active_status.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/date_exit_committee.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/dfadfa.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/exit_details.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/ff1_2_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/fs_4_3.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextAdministrativePost.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextAldeia.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextMunicipality.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextPostuAdministrativu.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextProjectname.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextSuco.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/idayesno.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/koko_1.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/my_testing.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/name.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/project_name.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/round.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/schemas.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/set.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/test.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/services/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/services/schema_import.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/triggers.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/urls.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/utils.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/PKG-INFO +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/SOURCES.txt +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/dependency_links.txt +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/requires.txt +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/top_level.txt +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/formkitninja.yaml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/.gitignore +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/coverage_html_cb_dd2e7eb5.js +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/favicon_32_cb_c827f16f.png +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/style_cb_9ff733b0.css +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_handlers_py.html +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/issue_22.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/manage.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/mkdocs.yml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/test_generator_real_data.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/test_generator_with_data.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/test_output.txt +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/api.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/asgi.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin/mainform.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/api/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/api/mainform.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/apps.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/migrations/0001_initial.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/migrations/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models/mainform.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas/mainform.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas_in/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas_in/mainform.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/signals.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/tests.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/views.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/manage.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/admin/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/admin/tf611.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/api/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/api/tf611.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/apps.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/migrations/0001_initial_tf611_models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/migrations/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models/tf611.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas/tf611.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas_in/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas_in/tf611.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/signals.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin/personalinfo.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/api/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/api/personalinfo.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/apps.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/migrations/0001_initial.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/migrations/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models/personalinfo.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas/personalinfo.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas_in/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas_in/personalinfo.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/signals.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/tests.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/views.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/urls.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/wsgi.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/conftest.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/factories.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures/partisipa_complex_form.yaml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures/partisipa_sample.yaml +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_flag.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_models_new.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_separated_submission_annotations.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_submission_annotations.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/helpers/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/helpers/schema_reproduction.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/admin.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/api.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/schemas.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/schemas_in.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/__init__.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/admin.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/api.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/schemas.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/schemas_in.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/partisipanodepath.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/partisipanodepath_rewritten.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_api_to_codegen.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_ast_validation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_backward_compatibility.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters_examples.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters_extended.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_database_generation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_database_node_path.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_default_converters.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_end_to_end_generation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_extensions.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_formatter.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generation_pipeline.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator_config.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator_config_database.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_integration_generator.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_management_generate_code.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_node_factory.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_node_registry.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_partisipa_architecture.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_partisipanodepath_rewritten.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_plugins.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_repeater_config.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_schema_walker.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_template_loader.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_tf611_database_driven.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/services/test_schema_import_service.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_best_practice.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_code_generation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_node_creation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_preview.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_api_errors.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_autocomplete.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_conditional_logic.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_data_loss_roundtrip.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_database_source_of_truth.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_datepicker.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_extracted_schemas.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_fields.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_formkit_in.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_group.json +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_hidden_node.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_integration.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_issue_22.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_jinja_template.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_make_name_valid.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_management.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_management_commands.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_migrations.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_nested_structures.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_notifications.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_parser.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_partisipa_reproduction.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_partisipa_yaml.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_positional_args.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_pw.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_python_models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_repeater_generation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_repeater_nested.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_signals.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_submission_models.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_textarea.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_tf611_api_creation.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_type_convert.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_utils.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_valid_django_id.py +0 -0
- {formkit_ninja-2.2 → formkit_ninja-2.3}/tox.ini +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: formkit-ninja
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.3
|
|
4
4
|
Summary: A Django-Ninja backend to specify FormKit schemas
|
|
5
5
|
Author-email: Josh Brooks <josh@catalpa.io>
|
|
6
6
|
Requires-Python: <3.15,>=3.10
|
|
@@ -213,10 +213,10 @@ Tests and submission queryset annotations (e.g. `with_unresolved_flags()`, `with
|
|
|
213
213
|
|
|
214
214
|
```bash
|
|
215
215
|
# Using Podman (recommended)
|
|
216
|
-
podman run --replace -d --name formkit-postgres -p
|
|
216
|
+
podman run --replace -d --name formkit-postgres -p 5435:5432 -e POSTGRES_HOST_AUTH_METHOD=trust docker.io/library/postgres:14-alpine
|
|
217
217
|
|
|
218
218
|
# OR using Docker
|
|
219
|
-
docker run -d --name formkit-postgres -p
|
|
219
|
+
docker run -d --name formkit-postgres -p 5435:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14-alpine
|
|
220
220
|
```
|
|
221
221
|
|
|
222
222
|
Then run tests:
|
|
@@ -199,10 +199,10 @@ Tests and submission queryset annotations (e.g. `with_unresolved_flags()`, `with
|
|
|
199
199
|
|
|
200
200
|
```bash
|
|
201
201
|
# Using Podman (recommended)
|
|
202
|
-
podman run --replace -d --name formkit-postgres -p
|
|
202
|
+
podman run --replace -d --name formkit-postgres -p 5435:5432 -e POSTGRES_HOST_AUTH_METHOD=trust docker.io/library/postgres:14-alpine
|
|
203
203
|
|
|
204
204
|
# OR using Docker
|
|
205
|
-
docker run -d --name formkit-postgres -p
|
|
205
|
+
docker run -d --name formkit-postgres -p 5435:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14-alpine
|
|
206
206
|
```
|
|
207
207
|
|
|
208
208
|
Then run tests:
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# FormKitSchemaNode Admin: Design Pattern Evaluation
|
|
2
|
+
|
|
3
|
+
This document evaluates the current admin/form design for `FormKitSchemaNode` and suggests refactors that could improve maintainability, reduce duplication, and clarify the dual storage model.
|
|
4
|
+
|
|
5
|
+
**Status:** Refactors 1–4 below have been applied (shared field constants, centralised code-gen fieldset, consistency test, Repeater unified to model field names; model syncs promoted columns back to `node` on save).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Current Architecture (Summary)
|
|
10
|
+
|
|
11
|
+
```mermaid
|
|
12
|
+
flowchart TB
|
|
13
|
+
subgraph forms [Admin Forms]
|
|
14
|
+
Base[FormKitBaseForm]
|
|
15
|
+
NodeForm[FormKitNodeForm]
|
|
16
|
+
GroupForm[FormKitNodeGroupForm]
|
|
17
|
+
RepeaterForm[FormKitNodeRepeaterForm]
|
|
18
|
+
ElementForm[FormKitElementForm]
|
|
19
|
+
TextForm[FormKitTextNode]
|
|
20
|
+
ConditionForm[FormKitConditionForm]
|
|
21
|
+
ComponentForm[FormKitComponentForm]
|
|
22
|
+
Base --> NodeForm
|
|
23
|
+
Base --> GroupForm
|
|
24
|
+
Base --> ElementForm
|
|
25
|
+
Base --> TextForm
|
|
26
|
+
Base --> ConditionForm
|
|
27
|
+
Base --> ComponentForm
|
|
28
|
+
NodeForm --> RepeaterForm
|
|
29
|
+
end
|
|
30
|
+
subgraph config [NODE_CONFIG]
|
|
31
|
+
Registry["pydantic type -> form + fieldsets"]
|
|
32
|
+
end
|
|
33
|
+
subgraph model [FormKitSchemaNode]
|
|
34
|
+
NodeJSON[node JSONField]
|
|
35
|
+
ModelCols[Promoted columns: icon, title, readonly, etc.]
|
|
36
|
+
end
|
|
37
|
+
forms --> config
|
|
38
|
+
forms --> model
|
|
39
|
+
NodeJSON -->|promote on save| ModelCols
|
|
40
|
+
ModelCols -->|get_node_values| NodeJSON
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- **Type-specific forms**: `get_form()` picks a form class from `NODE_CONFIG` based on `obj.get_node()` (pydantic type).
|
|
44
|
+
- **Dual storage**: Many props live both in `node` (JSON) and as model columns (e.g. `icon`, `title`, `readonly`). Model `save()` promotes from `node`/`additional_props` into those columns; `get_node_values()` writes them back into the emitted schema.
|
|
45
|
+
- **JSONMappingMixin**: Forms that edit `node` use flat form fields plus `_json_fields` to read/write the JSON; the mixin also preserves unrecognized keys in `additional_props`.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## What Works Well
|
|
50
|
+
|
|
51
|
+
1. **NODE_CONFIG registry**
|
|
52
|
+
Central mapping from pydantic node type to form and optional fieldsets keeps the “which form for which node” logic in one place. Adding a new node type (e.g. a new formkit widget) is a single registry entry.
|
|
53
|
+
|
|
54
|
+
2. **Form inheritance**
|
|
55
|
+
`FormKitBaseForm` holds shared fields (label, description, code-gen, common props). Subclasses add only what’s different (e.g. `_json_fields`, node-specific form fields). That’s a clear split.
|
|
56
|
+
|
|
57
|
+
3. **Fieldset grouping**
|
|
58
|
+
`get_fieldsets()` builds a default fieldset from “all form fields not already in a named fieldset” plus code-gen at the end. NODE_CONFIG can add extra fieldsets (e.g. “Display & behaviour”, “Repeater field properties”). That keeps the UI organized without hardcoding every field.
|
|
59
|
+
|
|
60
|
+
4. **Promotion in model**
|
|
61
|
+
Having the model own the promotion logic (JSON → columns on save) and re-export (columns → schema in `get_node_values()`) keeps a single source of truth for the list of promoted fields and their naming (camelCase vs snake_case).
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Pain Points and Risks
|
|
66
|
+
|
|
67
|
+
### 1. Duplicated `Meta.fields` across forms
|
|
68
|
+
|
|
69
|
+
**Issue:** `FormKitBaseForm`, `FormKitNodeForm`, and `FormKitNodeGroupForm` each declare a long `Meta.fields` tuple. Shared fields (e.g. `icon`, `title`, `readonly`, `sections_schema`, code-gen, `created_by`, `updated_by`) are repeated. Adding a new shared field requires updating multiple form classes.
|
|
70
|
+
|
|
71
|
+
**Risk:** Forgetting one form leads to inconsistent admin UX (e.g. “title” missing until we added it everywhere).
|
|
72
|
+
|
|
73
|
+
**Refactor option:** Define a single constant (or base tuple) for “common” and “code-gen” fields, and compose in each form:
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
# e.g. in admin.py
|
|
77
|
+
COMMON_NODE_FIELDS = (
|
|
78
|
+
"label", "description", "icon", "title", "readonly", "sections_schema",
|
|
79
|
+
"is_active", "protected",
|
|
80
|
+
)
|
|
81
|
+
CODE_GEN_FIELDS = (
|
|
82
|
+
"django_field_type", "django_field_args", "django_field_positional_args",
|
|
83
|
+
"pydantic_field_type", "extra_imports", "validators", "list_filter",
|
|
84
|
+
)
|
|
85
|
+
AUDIT_FIELDS = ("created_by", "updated_by")
|
|
86
|
+
|
|
87
|
+
class FormKitBaseForm(JSONMappingMixin, forms.ModelForm):
|
|
88
|
+
class Meta:
|
|
89
|
+
model = models.FormKitSchemaNode
|
|
90
|
+
fields = COMMON_NODE_FIELDS + CODE_GEN_FIELDS + AUDIT_FIELDS
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Then `FormKitNodeForm` could be `COMMON_NODE_FIELDS + ("additional_props", "option_group", "add_label", "up_control", "down_control") + CODE_GEN_FIELDS + AUDIT_FIELDS`, and `FormKitNodeGroupForm` could add only `"additional_props", "option_group"`. New shared fields get added in one place.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
### 2. Two sources of truth for “node” props (form vs model)
|
|
98
|
+
|
|
99
|
+
**Issue:** Some props are edited via:
|
|
100
|
+
- **Model fields only** (e.g. `title`, `icon`, `readonly`, `sections_schema`): form shows them, they’re saved to model columns, and `get_node_values()` pushes them into the output.
|
|
101
|
+
- **Form fields that write into `node`** (e.g. `addLabel`, `upControl`, `downControl` in RepeaterForm): the form writes to `node`; on save the model promotes from `node` into `add_label`, `up_control`, `down_control`.
|
|
102
|
+
|
|
103
|
+
So the same logical prop can be reached either as a model field or via `_json_fields` + promotion. For Repeater, the form uses `addLabel`/`upControl`/`downControl` (camelCase, node) rather than `add_label`/`up_control`/`down_control` (model). The mixin’s fallback in `_populate_form_fields` maps camelCase → model for initial values. It works but is easy to get wrong when adding new props.
|
|
104
|
+
|
|
105
|
+
**Risk:** New “common” props might be added to the model and to `get_node_values()` but forgotten in the form’s `Meta.fields` (as happened with `title`), or the other way around (in form but not in promotion/get_node_values).
|
|
106
|
+
|
|
107
|
+
**Refactor option (medium effort):**
|
|
108
|
+
- Prefer **model columns as the single source** for all promoted props. Forms only expose the model fields (e.g. `add_label`, `up_control`, `down_control`); do not duplicate them as node-only form fields.
|
|
109
|
+
- In `save()`, after `super().save()`, have the model (or a small helper) write from those columns back into `node` for the known keys (e.g. `addLabel`, `upControl`, `downControl`) so the stored `node` JSON stays in sync. That way the form doesn’t need to know camelCase and the promotion logic lives in one place (the model).
|
|
110
|
+
- Then `_json_fields` is only for props that are **not** promoted (e.g. `name`, `$formkit`, `placeholder`, `help`). That clarifies “what comes from node only” vs “what is promoted and edited as model”.
|
|
111
|
+
|
|
112
|
+
**Lighter option:** At least document the rule (“promoted props = model fields only in forms; node-only form fields only for non-promoted keys”) and add a test or assertion that the set of promoted keys in the model matches the set of form model fields used for those props.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 3. JSONMappingMixin responsibilities and fallback mapping
|
|
117
|
+
|
|
118
|
+
**Issue:** The mixin (a) populates form from `node` (and optionally model fallback), (b) writes form data back into `node`, (c) preserves unrecognized keys into `additional_props`, and (d) validates `name` for Django-safe identifiers. The fallback mapping in `_populate_form_fields` is partial (e.g. `addLabel` → `add_label`, `sectionsSchema` → `sections_schema`); we didn’t add `title`/`icon`/`readonly` because those are now model-only in the form. If someone later adds node-backed form fields for them, they’d need to extend the mapping.
|
|
119
|
+
|
|
120
|
+
**Risk:** The mixin is doing a lot; small changes (e.g. new key or new form field) can require touching both the form and the mixin.
|
|
121
|
+
|
|
122
|
+
**Refactor option:**
|
|
123
|
+
- Keep the mixin focused on “read/write JSON field from/to flat form fields” and “preserve unknown keys”.
|
|
124
|
+
- Move “initial from model when not in node” into a single place: either a shared mapping (e.g. `JSON_KEY_TO_MODEL_ATTR`) used by the mixin, or a small helper on the model (e.g. `get_node_related_initial()`) that the form calls.
|
|
125
|
+
- Document that for “promoted” props, forms should use model fields only and not add them to `_json_fields`; then the mixin’s fallback is only for legacy or node-only form fields.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### 4. Fieldset definitions split across NODE_CONFIG and get_fieldsets()
|
|
130
|
+
|
|
131
|
+
**Issue:**
|
|
132
|
+
- NODE_CONFIG holds type-specific fieldsets (e.g. “Repeater field properties”, “Display & behaviour”).
|
|
133
|
+
- The “Code Generation (Source of Truth)” fieldset and the set of `code_gen_fields` used to exclude from the default fieldset are hardcoded in `get_fieldsets()`.
|
|
134
|
+
- So “which fields are code-gen” is duplicated (form `Meta.fields` + `get_fieldsets()` + possibly NODE_CONFIG if we ever put code-gen there).
|
|
135
|
+
|
|
136
|
+
**Risk:** Adding a new code-gen field could require updating both the form and `get_fieldsets()`.
|
|
137
|
+
|
|
138
|
+
**Refactor option:** Define `CODE_GEN_FIELDS` (and optionally a single “Code Generation” fieldset spec) in one place (e.g. at module level or on the admin class), and have `get_fieldsets()` and, if needed, base form `Meta.fields` reference it. Then new code-gen fields are added once.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### 5. Repeater: form uses camelCase node keys, others use model names
|
|
143
|
+
|
|
144
|
+
**Issue:** Repeater form fields are `addLabel`, `upControl`, `downControl` (and in fieldset the same names). Other forms use model names `add_label`, `up_control`, `down_control`. So the admin shows different naming by node type, and Repeater relies on the mixin’s fallback to fill from model.
|
|
145
|
+
|
|
146
|
+
**Refactor option:** If we move to “model columns as source of truth” (above), RepeaterForm would use `add_label`, `up_control`, `down_control` in both `Meta.fields` and fieldset, and drop the camelCase form fields and their `_json_fields` entries for those three. The model would still write `addLabel`/`upControl`/`downControl` into `node` in `get_node_values()` (and optionally on save). That would make all forms consistent and avoid the mixin fallback for these.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Recommended Order of Refactors
|
|
151
|
+
|
|
152
|
+
| Priority | Refactor | Effort | Impact |
|
|
153
|
+
|----------|----------|--------|--------|
|
|
154
|
+
| 1 | Introduce `COMMON_NODE_FIELDS` / `CODE_GEN_FIELDS` (and optionally `AUDIT_FIELDS`) and compose form `Meta.fields` from them | Low | Removes duplication and prevents “missing field” regressions when adding shared fields. |
|
|
155
|
+
| 2 | Centralise code-gen fieldset and `code_gen_fields` in one constant or admin attribute | Low | Single place to add new code-gen fields. |
|
|
156
|
+
| 3 | Document the rule “promoted props = model fields in forms; node form fields only for non-promoted” and add a test or consistency check | Low | Reduces risk of drift between model and forms. |
|
|
157
|
+
| 4 | (Optional) Unify Repeater to use model field names in the form and let the model sync to `node`; simplify mixin fallback | Medium | Clearer mental model and consistent UX. |
|
|
158
|
+
| 5 | (Optional) Move “initial from model” fallback into a shared mapping or model helper | Medium | Clearer mixin responsibility and easier to extend. |
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Conclusion
|
|
163
|
+
|
|
164
|
+
The current design is workable and the registry + inheritance structure is sound. The main improvements are: **reducing duplication** (shared field tuples, code-gen fieldset), **clarifying the dual storage model** (document and optionally enforce “promoted = model only in forms”), and **optionally unifying Repeater and the mixin** so that all promoted props are edited only via model fields and the model is the single place that syncs to `node`. Implementing the low-effort refactors (1–3) would already improve maintainability and make it less likely that a future “title”-like field is missed in the admin.
|
|
@@ -32,6 +32,40 @@ logger = logging.getLogger(__name__)
|
|
|
32
32
|
# The key of the dict provided is a JSON field on the model
|
|
33
33
|
JsonFieldDefn = dict[str, tuple[str | tuple[str, str], ...]]
|
|
34
34
|
|
|
35
|
+
# Composable field sets for FormKitSchemaNode admin forms.
|
|
36
|
+
# Rule: promoted props (icon, title, readonly, etc.) are model fields only in forms;
|
|
37
|
+
# _json_fields is for node-only keys (e.g. name, $formkit, placeholder). The model
|
|
38
|
+
# syncs promoted columns to/from node on save and in get_node_values().
|
|
39
|
+
COMMON_NODE_FIELDS = (
|
|
40
|
+
"label",
|
|
41
|
+
"description",
|
|
42
|
+
"icon",
|
|
43
|
+
"title",
|
|
44
|
+
"readonly",
|
|
45
|
+
"sections_schema",
|
|
46
|
+
"is_active",
|
|
47
|
+
"protected",
|
|
48
|
+
)
|
|
49
|
+
CODE_GEN_FIELDS = (
|
|
50
|
+
"django_field_type",
|
|
51
|
+
"django_field_args",
|
|
52
|
+
"django_field_positional_args",
|
|
53
|
+
"pydantic_field_type",
|
|
54
|
+
"extra_imports",
|
|
55
|
+
"validators",
|
|
56
|
+
"list_filter",
|
|
57
|
+
)
|
|
58
|
+
AUDIT_FIELDS = ("created_by", "updated_by")
|
|
59
|
+
|
|
60
|
+
# Code generation fieldset shown at bottom of change form; also used to exclude from default fieldset
|
|
61
|
+
CODE_GEN_FIELDSET_TITLE = "Code Generation (Source of Truth)"
|
|
62
|
+
CODE_GEN_FIELDSET_FIELDS = CODE_GEN_FIELDS + (
|
|
63
|
+
"django_code_preview",
|
|
64
|
+
"pydantic_code_preview",
|
|
65
|
+
"formkit_node_preview",
|
|
66
|
+
)
|
|
67
|
+
CODE_GEN_GROUPED_FIELDS = frozenset(CODE_GEN_FIELDSET_FIELDS)
|
|
68
|
+
|
|
35
69
|
|
|
36
70
|
class ItemAdmin(admin.ModelAdmin):
|
|
37
71
|
list_display = ("name",)
|
|
@@ -163,19 +197,7 @@ class FormKitBaseForm(JSONMappingMixin, forms.ModelForm):
|
|
|
163
197
|
|
|
164
198
|
class Meta:
|
|
165
199
|
model = models.FormKitSchemaNode
|
|
166
|
-
fields =
|
|
167
|
-
"label",
|
|
168
|
-
"description",
|
|
169
|
-
"is_active",
|
|
170
|
-
"protected",
|
|
171
|
-
"django_field_type",
|
|
172
|
-
"django_field_args",
|
|
173
|
-
"django_field_positional_args",
|
|
174
|
-
"pydantic_field_type",
|
|
175
|
-
"extra_imports",
|
|
176
|
-
"validators",
|
|
177
|
-
"list_filter",
|
|
178
|
-
)
|
|
200
|
+
fields = COMMON_NODE_FIELDS + CODE_GEN_FIELDS + AUDIT_FIELDS
|
|
179
201
|
|
|
180
202
|
# Code Generation Overrides
|
|
181
203
|
django_field_type = forms.CharField(required=False)
|
|
@@ -231,20 +253,7 @@ class FormKitSchemaComponentInline(admin.TabularInline):
|
|
|
231
253
|
class FormKitNodeGroupForm(FormKitBaseForm):
|
|
232
254
|
class Meta:
|
|
233
255
|
model = models.FormKitSchemaNode
|
|
234
|
-
fields = (
|
|
235
|
-
"label",
|
|
236
|
-
"description",
|
|
237
|
-
"additional_props",
|
|
238
|
-
"is_active",
|
|
239
|
-
"protected",
|
|
240
|
-
"django_field_type",
|
|
241
|
-
"django_field_args",
|
|
242
|
-
"django_field_positional_args",
|
|
243
|
-
"pydantic_field_type",
|
|
244
|
-
"extra_imports",
|
|
245
|
-
"validators",
|
|
246
|
-
"list_filter",
|
|
247
|
-
)
|
|
256
|
+
fields = COMMON_NODE_FIELDS + ("additional_props", "option_group") + CODE_GEN_FIELDS + AUDIT_FIELDS
|
|
248
257
|
|
|
249
258
|
_json_fields = {
|
|
250
259
|
"node": ("name", ("formkit", "$formkit"), "if_condition", ("html_id", "id")),
|
|
@@ -258,21 +267,7 @@ class FormKitNodeGroupForm(FormKitBaseForm):
|
|
|
258
267
|
class FormKitNodeForm(FormKitBaseForm):
|
|
259
268
|
class Meta:
|
|
260
269
|
model = models.FormKitSchemaNode
|
|
261
|
-
fields = (
|
|
262
|
-
"label",
|
|
263
|
-
"description",
|
|
264
|
-
"additional_props",
|
|
265
|
-
"option_group",
|
|
266
|
-
"is_active",
|
|
267
|
-
"protected",
|
|
268
|
-
"django_field_type",
|
|
269
|
-
"django_field_args",
|
|
270
|
-
"django_field_positional_args",
|
|
271
|
-
"pydantic_field_type",
|
|
272
|
-
"extra_imports",
|
|
273
|
-
"validators",
|
|
274
|
-
"list_filter",
|
|
275
|
-
)
|
|
270
|
+
fields = COMMON_NODE_FIELDS + ("additional_props", "option_group", "add_label", "up_control", "down_control") + CODE_GEN_FIELDS + AUDIT_FIELDS
|
|
276
271
|
|
|
277
272
|
_json_fields = {
|
|
278
273
|
"node": (
|
|
@@ -325,21 +320,18 @@ class FormKitNodeForm(FormKitBaseForm):
|
|
|
325
320
|
|
|
326
321
|
|
|
327
322
|
class FormKitNodeRepeaterForm(FormKitNodeForm):
|
|
323
|
+
"""Repeater node form. add_label, up_control, down_control are model fields (parent);
|
|
324
|
+
itemsClass/itemClass are node-only and mapped here."""
|
|
325
|
+
|
|
328
326
|
def get_json_fields(self) -> JsonFieldDefn:
|
|
329
327
|
return {
|
|
330
328
|
"node": (
|
|
331
|
-
*(super().
|
|
332
|
-
"addLabel",
|
|
333
|
-
"upControl",
|
|
334
|
-
"downControl",
|
|
329
|
+
*(super().get_json_fields()["node"]),
|
|
335
330
|
"itemsClass",
|
|
336
331
|
"itemClass",
|
|
337
332
|
)
|
|
338
333
|
}
|
|
339
334
|
|
|
340
|
-
addLabel = forms.CharField(required=False)
|
|
341
|
-
upControl = forms.BooleanField(required=False)
|
|
342
|
-
downControl = forms.BooleanField(required=False)
|
|
343
335
|
itemsClass = forms.CharField(required=False)
|
|
344
336
|
itemClass = forms.CharField(required=False)
|
|
345
337
|
max = forms.IntegerField(required=False)
|
|
@@ -441,14 +433,22 @@ NODE_CONFIG: dict[type | str, dict[str, Any]] = {
|
|
|
441
433
|
"fieldsets": [
|
|
442
434
|
(
|
|
443
435
|
"Repeater field properties",
|
|
444
|
-
{"fields": ("
|
|
436
|
+
{"fields": ("add_label", "up_control", "down_control", "itemsClass", "itemClass")},
|
|
445
437
|
)
|
|
446
438
|
],
|
|
447
439
|
},
|
|
448
440
|
formkit_schema.FormKitSchemaDOMNode: {"form": FormKitElementForm},
|
|
449
441
|
formkit_schema.FormKitSchemaComponent: {"form": FormKitComponentForm},
|
|
450
442
|
formkit_schema.FormKitSchemaCondition: {"form": FormKitConditionForm},
|
|
451
|
-
formkit_schema.FormKitSchemaProps: {
|
|
443
|
+
formkit_schema.FormKitSchemaProps: {
|
|
444
|
+
"form": FormKitNodeForm,
|
|
445
|
+
"fieldsets": [
|
|
446
|
+
(
|
|
447
|
+
"Display & behaviour",
|
|
448
|
+
{"fields": ("icon", "title", "readonly", "sections_schema")},
|
|
449
|
+
),
|
|
450
|
+
],
|
|
451
|
+
},
|
|
452
452
|
}
|
|
453
453
|
|
|
454
454
|
# Admin site registration continues below...
|
|
@@ -458,6 +458,7 @@ NODE_CONFIG: dict[type | str, dict[str, Any]] = {
|
|
|
458
458
|
class FormKitSchemaNodeAdmin(admin.ModelAdmin):
|
|
459
459
|
list_display = (
|
|
460
460
|
"label",
|
|
461
|
+
"title",
|
|
461
462
|
"is_active",
|
|
462
463
|
"short_id",
|
|
463
464
|
"node_type",
|
|
@@ -468,7 +469,15 @@ class FormKitSchemaNodeAdmin(admin.ModelAdmin):
|
|
|
468
469
|
"protected",
|
|
469
470
|
"created",
|
|
470
471
|
)
|
|
471
|
-
readonly_fields = (
|
|
472
|
+
readonly_fields = (
|
|
473
|
+
"django_code_preview",
|
|
474
|
+
"pydantic_code_preview",
|
|
475
|
+
"formkit_node_preview",
|
|
476
|
+
"created",
|
|
477
|
+
"updated",
|
|
478
|
+
"created_by",
|
|
479
|
+
"updated_by",
|
|
480
|
+
)
|
|
472
481
|
search_fields = ["label", "description", "id"]
|
|
473
482
|
list_filter = ("is_active", "node_type", "protected", "option_group", "created", "updated")
|
|
474
483
|
list_select_related = ("option_group",)
|
|
@@ -518,40 +527,15 @@ class FormKitSchemaNodeAdmin(admin.ModelAdmin):
|
|
|
518
527
|
break
|
|
519
528
|
|
|
520
529
|
grouped_fields: set[str] = reduce(operator.or_, (set(opts["fields"]) for _, opts in fieldsets), set())
|
|
521
|
-
|
|
522
|
-
code_gen_fields = {
|
|
523
|
-
"django_field_type",
|
|
524
|
-
"django_field_args",
|
|
525
|
-
"django_field_positional_args",
|
|
526
|
-
"pydantic_field_type",
|
|
527
|
-
"extra_imports",
|
|
528
|
-
"validators",
|
|
529
|
-
"list_filter",
|
|
530
|
-
"django_code_preview",
|
|
531
|
-
"pydantic_code_preview",
|
|
532
|
-
"formkit_node_preview",
|
|
533
|
-
}
|
|
534
|
-
grouped_fields.update(code_gen_fields)
|
|
530
|
+
grouped_fields.update(CODE_GEN_GROUPED_FIELDS)
|
|
535
531
|
fieldsets.insert(0, (None, {"fields": [f for f in self.get_fields(request, obj) if f not in grouped_fields]}))
|
|
536
532
|
|
|
537
|
-
# Add Code Generation Source of Truth fieldset
|
|
538
533
|
fieldsets.append(
|
|
539
534
|
(
|
|
540
|
-
|
|
535
|
+
CODE_GEN_FIELDSET_TITLE,
|
|
541
536
|
{
|
|
542
|
-
"fields":
|
|
543
|
-
|
|
544
|
-
"django_field_args",
|
|
545
|
-
"django_field_positional_args",
|
|
546
|
-
"pydantic_field_type",
|
|
547
|
-
"extra_imports",
|
|
548
|
-
"validators",
|
|
549
|
-
"list_filter",
|
|
550
|
-
"django_code_preview",
|
|
551
|
-
"pydantic_code_preview",
|
|
552
|
-
"formkit_node_preview",
|
|
553
|
-
),
|
|
554
|
-
"description": ("These values are the source of truth for code generation. If empty, they are auto-resolved on save from global configs."),
|
|
537
|
+
"fields": CODE_GEN_FIELDSET_FIELDS,
|
|
538
|
+
"description": "These values are the source of truth for code generation. If empty, they are auto-resolved on save from global configs.",
|
|
555
539
|
},
|
|
556
540
|
)
|
|
557
541
|
)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Generated by Django 4.2.27 on 2026-03-03 09:19
|
|
2
|
+
|
|
3
|
+
import pgtrigger.compiler
|
|
4
|
+
import pgtrigger.migrations
|
|
5
|
+
from django.db import migrations, models
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Migration(migrations.Migration):
|
|
9
|
+
dependencies = [
|
|
10
|
+
("formkit_ninja", "0041_flag"),
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
operations = [
|
|
14
|
+
pgtrigger.migrations.RemoveTrigger(
|
|
15
|
+
model_name="formkitschemanode",
|
|
16
|
+
name="insert_insert",
|
|
17
|
+
),
|
|
18
|
+
pgtrigger.migrations.RemoveTrigger(
|
|
19
|
+
model_name="formkitschemanode",
|
|
20
|
+
name="update_update",
|
|
21
|
+
),
|
|
22
|
+
migrations.AddField(
|
|
23
|
+
model_name="formkitschemanode",
|
|
24
|
+
name="list_filter",
|
|
25
|
+
field=models.BooleanField(default=False, help_text="Include this field in generated ModelAdmin.list_filter."),
|
|
26
|
+
),
|
|
27
|
+
migrations.AddField(
|
|
28
|
+
model_name="formkitschemanodeevent",
|
|
29
|
+
name="list_filter",
|
|
30
|
+
field=models.BooleanField(default=False, help_text="Include this field in generated ModelAdmin.list_filter."),
|
|
31
|
+
),
|
|
32
|
+
pgtrigger.migrations.AddTrigger(
|
|
33
|
+
model_name="formkitschemanode",
|
|
34
|
+
trigger=pgtrigger.compiler.Trigger(
|
|
35
|
+
name="insert_insert",
|
|
36
|
+
sql=pgtrigger.compiler.UpsertTriggerSql(
|
|
37
|
+
func='INSERT INTO "formkit_ninja_formkitschemanodeevent" ("add_label", "additional_props", "created", "created_by_id", "description", "django_field_args", "django_field_positional_args", "django_field_type", "down_control", "extra_imports", "icon", "id", "is_active", "label", "list_filter", "max", "min", "node", "node_type", "option_group_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "protected", "pydantic_field_type", "readonly", "sections_schema", "step", "text_content", "title", "track_change", "up_control", "updated", "updated_by_id", "validators") VALUES (NEW."add_label", NEW."additional_props", NEW."created", NEW."created_by_id", NEW."description", NEW."django_field_args", NEW."django_field_positional_args", NEW."django_field_type", NEW."down_control", NEW."extra_imports", NEW."icon", NEW."id", NEW."is_active", NEW."label", NEW."list_filter", NEW."max", NEW."min", NEW."node", NEW."node_type", NEW."option_group_id", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."protected", NEW."pydantic_field_type", NEW."readonly", NEW."sections_schema", NEW."step", NEW."text_content", NEW."title", NEW."track_change", NEW."up_control", NEW."updated", NEW."updated_by_id", NEW."validators"); RETURN NULL;',
|
|
38
|
+
hash="ca97f0a9bb68ffec610387b7dbb092bb006f4522",
|
|
39
|
+
operation="INSERT",
|
|
40
|
+
pgid="pgtrigger_insert_insert_72c4c",
|
|
41
|
+
table="formkit_ninja_formkitschemanode",
|
|
42
|
+
when="AFTER",
|
|
43
|
+
),
|
|
44
|
+
),
|
|
45
|
+
),
|
|
46
|
+
pgtrigger.migrations.AddTrigger(
|
|
47
|
+
model_name="formkitschemanode",
|
|
48
|
+
trigger=pgtrigger.compiler.Trigger(
|
|
49
|
+
name="update_update",
|
|
50
|
+
sql=pgtrigger.compiler.UpsertTriggerSql(
|
|
51
|
+
condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)",
|
|
52
|
+
func='INSERT INTO "formkit_ninja_formkitschemanodeevent" ("add_label", "additional_props", "created", "created_by_id", "description", "django_field_args", "django_field_positional_args", "django_field_type", "down_control", "extra_imports", "icon", "id", "is_active", "label", "list_filter", "max", "min", "node", "node_type", "option_group_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "protected", "pydantic_field_type", "readonly", "sections_schema", "step", "text_content", "title", "track_change", "up_control", "updated", "updated_by_id", "validators") VALUES (NEW."add_label", NEW."additional_props", NEW."created", NEW."created_by_id", NEW."description", NEW."django_field_args", NEW."django_field_positional_args", NEW."django_field_type", NEW."down_control", NEW."extra_imports", NEW."icon", NEW."id", NEW."is_active", NEW."label", NEW."list_filter", NEW."max", NEW."min", NEW."node", NEW."node_type", NEW."option_group_id", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."protected", NEW."pydantic_field_type", NEW."readonly", NEW."sections_schema", NEW."step", NEW."text_content", NEW."title", NEW."track_change", NEW."up_control", NEW."updated", NEW."updated_by_id", NEW."validators"); RETURN NULL;',
|
|
53
|
+
hash="2e35d6535c17e41582d263abff78490ad83436e1",
|
|
54
|
+
operation="UPDATE",
|
|
55
|
+
pgid="pgtrigger_update_update_d7c99",
|
|
56
|
+
table="formkit_ninja_formkitschemanode",
|
|
57
|
+
when="AFTER",
|
|
58
|
+
),
|
|
59
|
+
),
|
|
60
|
+
),
|
|
61
|
+
]
|
|
@@ -489,6 +489,36 @@ class FormKitSchemaNode(UuidIdModel):
|
|
|
489
489
|
val = str(val)
|
|
490
490
|
setattr(self, target_field, val)
|
|
491
491
|
|
|
492
|
+
# Sync promoted columns back into node so stored JSON stays in sync when
|
|
493
|
+
# admin edits model fields (e.g. add_label, up_control) rather than node.
|
|
494
|
+
# Only write non-default values (or when key already in node) to avoid
|
|
495
|
+
# adding keys that weren't in the original schema (round-trip fidelity).
|
|
496
|
+
if isinstance(self.node, dict):
|
|
497
|
+
_promoted_to_node = (
|
|
498
|
+
("icon", "icon", None),
|
|
499
|
+
("title", "title", None),
|
|
500
|
+
("readonly", "readonly", False),
|
|
501
|
+
("sections_schema", "sectionsSchema", None),
|
|
502
|
+
("min", "min", None),
|
|
503
|
+
("max", "max", None),
|
|
504
|
+
("step", "step", None),
|
|
505
|
+
("add_label", "addLabel", None),
|
|
506
|
+
("up_control", "upControl", True),
|
|
507
|
+
("down_control", "downControl", True),
|
|
508
|
+
)
|
|
509
|
+
for attr, key, default in _promoted_to_node:
|
|
510
|
+
val = getattr(self, attr, None)
|
|
511
|
+
already_in_node = key in self.node
|
|
512
|
+
if isinstance(val, bool):
|
|
513
|
+
if already_in_node or val != default:
|
|
514
|
+
self.node[key] = val
|
|
515
|
+
elif key in self.node:
|
|
516
|
+
self.node.pop(key, None)
|
|
517
|
+
elif val not in (None, ""):
|
|
518
|
+
self.node[key] = val
|
|
519
|
+
elif already_in_node:
|
|
520
|
+
self.node.pop(key, None)
|
|
521
|
+
|
|
492
522
|
# Resolve code generation defaults if not set
|
|
493
523
|
self.resolve_code_generation_defaults()
|
|
494
524
|
|