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.
Files changed (524) hide show
  1. {formkit_ninja-2.2 → formkit_ninja-2.3}/PKG-INFO +3 -3
  2. {formkit_ninja-2.2 → formkit_ninja-2.3}/README.md +2 -2
  3. formkit_ninja-2.3/docs/ADMIN_DESIGN_EVALUATION.md +164 -0
  4. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/admin.py +65 -81
  5. formkit_ninja-2.3/formkit_ninja/migrations/0042_formkitschemanode_list_filter.py +61 -0
  6. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/models.py +30 -0
  7. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/class_index.html +192 -192
  8. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/function_index.html +287 -287
  9. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/index.html +67 -67
  10. formkit_ninja-2.3/htmlcov/status.json +1 -0
  11. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b___init___py.html +2 -2
  12. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_apps_py.html +2 -2
  13. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_import_monitoring_py.html +2 -2
  14. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_models_py.html +2 -2
  15. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_querysets_py.html +2 -2
  16. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_signals_py.html +4 -4
  17. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_utils_py.html +2 -2
  18. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8___init___py.html +2 -2
  19. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_add_schema_field_py.html +2 -2
  20. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_bootstrap_app_py.html +2 -2
  21. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_check_valid_names_py.html +2 -2
  22. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_create_schema_py.html +2 -2
  23. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_generate_all_schemas_py.html +2 -2
  24. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_generate_code_py.html +2 -2
  25. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_319c17fd0771b8a8_import_forms_py.html +2 -2
  26. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_336430bde916e5dc___init___py.html +2 -2
  27. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_336430bde916e5dc_schema_import_py.html +2 -2
  28. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c___init___py.html +2 -2
  29. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_converters_examples_py.html +19 -19
  30. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_converters_py.html +34 -34
  31. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_database_node_path_py.html +2 -2
  32. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_formatter_py.html +2 -2
  33. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generation_pipeline_py.html +2 -2
  34. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generator_config_py.html +2 -2
  35. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_generator_py.html +2 -2
  36. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_logger_py.html +2 -2
  37. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_node_factory_py.html +23 -23
  38. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_node_registry_py.html +7 -7
  39. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_plugins_py.html +2 -2
  40. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_schema_walker_py.html +2 -2
  41. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_template_loader_py.html +2 -2
  42. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_3d54085545bd272c_type_convert_py.html +80 -80
  43. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_49d1c7cc3d8927e8___init___py.html +7 -7
  44. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_49d1c7cc3d8927e8_schemas_py.html +2 -2
  45. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1___init___py.html +2 -2
  46. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1___main___py.html +2 -2
  47. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_admin_code_generation_py.html +146 -146
  48. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_admin_py.html +813 -829
  49. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_api_py.html +202 -202
  50. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_code_generation_config_py.html +2 -2
  51. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_fields_py.html +40 -40
  52. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_formkit_schema_py.html +14 -14
  53. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_models_py.html +492 -462
  54. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_notifications_py.html +21 -21
  55. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_triggers_py.html +2 -2
  56. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_urls_py.html +4 -4
  57. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_7688fa66c50fa3b1_utils_py.html +2 -2
  58. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_c3b4d83f5f06a6a6___init___py.html +2 -2
  59. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_f16099ef8f43d13f___init___py.html +2 -2
  60. {formkit_ninja-2.2 → formkit_ninja-2.3}/pyproject.toml +1 -1
  61. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/settings.py +6 -6
  62. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin.py +19 -1
  63. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_complex_nodes.py +2 -2
  64. {formkit_ninja-2.2 → formkit_ninja-2.3}/uv.lock +1 -1
  65. formkit_ninja-2.2/formkit_ninja/migrations/0042_formkitschemanode_list_filter.py +0 -41
  66. formkit_ninja-2.2/htmlcov/status.json +0 -1
  67. {formkit_ninja-2.2 → formkit_ninja-2.3}/.agent/workflows/conventions.md +0 -0
  68. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/001-github-issues.mdc +0 -0
  69. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/002-issue-creation-guide.mdc +0 -0
  70. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/003-commit-messages.mdc +0 -0
  71. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/004-pytest-requirements.mdc +0 -0
  72. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursor/rules/005-database-container.mdc +0 -0
  73. {formkit_ninja-2.2 → formkit_ninja-2.3}/.cursorrules +0 -0
  74. {formkit_ninja-2.2 → formkit_ninja-2.3}/.flake8 +0 -0
  75. {formkit_ninja-2.2 → formkit_ninja-2.3}/.github/workflows/ci.yml +0 -0
  76. {formkit_ninja-2.2 → formkit_ninja-2.3}/.github/workflows/docs.yml +0 -0
  77. {formkit_ninja-2.2 → formkit_ninja-2.3}/.gitignore +0 -0
  78. {formkit_ninja-2.2 → formkit_ninja-2.3}/.pre-commit-config.yaml +0 -0
  79. {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/extensions.json +0 -0
  80. {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/launch.json +0 -0
  81. {formkit_ninja-2.2 → formkit_ninja-2.3}/.vscode/settings.json +0 -0
  82. {formkit_ninja-2.2 → formkit_ninja-2.3}/CHANGELOG.md +0 -0
  83. {formkit_ninja-2.2 → formkit_ninja-2.3}/DEVELOPMENT.md +0 -0
  84. {formkit_ninja-2.2 → formkit_ninja-2.3}/FEATURES_COMPARISON.md +0 -0
  85. {formkit_ninja-2.2 → formkit_ninja-2.3}/NEW_USER_WORKFLOW_SUMMARY.md +0 -0
  86. {formkit_ninja-2.2 → formkit_ninja-2.3}/SCHEMA_CONVERSION_SUMMARY.md +0 -0
  87. {formkit_ninja-2.2 → formkit_ninja-2.3}/TEST_COVERAGE_ANALYSIS.md +0 -0
  88. {formkit_ninja-2.2 → formkit_ninja-2.3}/debug_naming.py +0 -0
  89. {formkit_ninja-2.2 → formkit_ninja-2.3}/debug_partisipa.py +0 -0
  90. {formkit_ninja-2.2 → formkit_ninja-2.3}/demo_workflow.py +0 -0
  91. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/admin.md +0 -0
  92. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/classes.md +0 -0
  93. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/code_generation.md +0 -0
  94. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/database_code_generation.md +0 -0
  95. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/feature_matrix.md +0 -0
  96. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/index.md +0 -0
  97. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/inputs.md +0 -0
  98. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/multiple_schemas_options.md +0 -0
  99. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/options.md +0 -0
  100. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/quick_start.md +0 -0
  101. {formkit_ninja-2.2 → formkit_ninja-2.3}/docs/submission_architecture.md +0 -0
  102. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/__init__.py +0 -0
  103. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/__main__.py +0 -0
  104. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/admin_code_generation.py +0 -0
  105. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/api.py +0 -0
  106. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/code_generation_config.py +0 -0
  107. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fields.py +0 -0
  108. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fixtures/partisipa_contenttypes.json.gz +0 -0
  109. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/fixtures/partisipa_formkit_data.json.gz +0 -0
  110. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/__init__.py +0 -0
  111. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/apps.py +0 -0
  112. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/import_monitoring.py +0 -0
  113. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/models.py +0 -0
  114. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/querysets.py +0 -0
  115. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/signals.py +0 -0
  116. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/form_submission/utils.py +0 -0
  117. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/formkit_schema.py +0 -0
  118. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/.gitignore +0 -0
  119. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/__init___py.html +0 -0
  120. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/__main___py.html +0 -0
  121. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/admin_py.html +0 -0
  122. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/api_py.html +0 -0
  123. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/class_index.html +0 -0
  124. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/coverage_html_cb_dd2e7eb5.js +0 -0
  125. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/favicon_32_cb_c827f16f.png +0 -0
  126. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/fields_py.html +0 -0
  127. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/formkit_schema_py.html +0 -0
  128. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/function_index.html +0 -0
  129. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/index.html +0 -0
  130. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
  131. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/models_py.html +0 -0
  132. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/status.json +0 -0
  133. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/style_cb_9ff733b0.css +0 -0
  134. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/triggers_py.html +0 -0
  135. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/urls_py.html +0 -0
  136. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_51fcec635d35c76c___init___py.html +0 -0
  137. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_51fcec635d35c76c_schemas_py.html +0 -0
  138. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720___init___py.html +0 -0
  139. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720_logger_py.html +0 -0
  140. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_72798c8d109b1720_type_convert_py.html +0 -0
  141. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_d0f9da560d0d1331___init___py.html +0 -0
  142. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0001_initial_py.html +0 -0
  143. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0002_alter_formcomponents_label_alter_formkitschema_key_py.html +0 -0
  144. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0003_delete_translatable_py.html +0 -0
  145. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0004_remove_formkitschema_key_and_more_py.html +0 -0
  146. {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
  147. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0006_option_group_option_unique_option_id_py.html +0 -0
  148. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0007_alter_option_field_py.html +0 -0
  149. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0008_remove_option_label_py.html +0 -0
  150. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0009_formkitschemanode_text_content_and_more_py.html +0 -0
  151. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0010_alter_option_options_and_more_py.html +0 -0
  152. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0011_nodechildren_formkitschemanode_children_py.html +0 -0
  153. {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
  154. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0013_formkitschemanode_option_group_py.html +0 -0
  155. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0014_schemalabel_schemadescription_py.html +0 -0
  156. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0015_alter_formkitschema_label_py.html +0 -0
  157. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0016_alter_nodechildren_options_and_more_py.html +0 -0
  158. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0017_nodechildren_change_id_py.html +0 -0
  159. {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
  160. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0019_formkitschemanode_track_change_and_more_py.html +0 -0
  161. {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
  162. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0021_formkitschemanode_is_active_py.html +0 -0
  163. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0022_formkitschemanode_soft_delete_py.html +0 -0
  164. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0023_formkitschemanodeevent_and_more_py.html +0 -0
  165. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0024_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
  166. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0025_remove_formkitschemanode_protect_deletes_and_more_py.html +0 -0
  167. {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
  168. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0027_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
  169. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0028_migrate_additional_props_py.html +0 -0
  170. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0029_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
  171. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0030_migrate_more_props_py.html +0 -0
  172. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0031_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
  173. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0032_migrate_repeater_props_py.html +0 -0
  174. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9_0033_remove_formkitschemanode_insert_insert_and_more_py.html +0 -0
  175. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_de72b752a94110f9___init___py.html +0 -0
  176. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19___init___py.html +0 -0
  177. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19_check_valid_names_py.html +0 -0
  178. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_ea3808ded160dd19_import_forms_py.html +0 -0
  179. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/htmlcov/z_fd003194bc69d7fb___init___py.html +0 -0
  180. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/__init__.py +0 -0
  181. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/__init__.py +0 -0
  182. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/add_schema_field.py +0 -0
  183. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/bootstrap_app.py +0 -0
  184. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/check_valid_names.py +0 -0
  185. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/create_schema.py +0 -0
  186. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/generate_all_schemas.py +0 -0
  187. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/generate_code.py +0 -0
  188. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/management/commands/import_forms.py +0 -0
  189. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0001_initial.py +0 -0
  190. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0002_alter_formcomponents_label_alter_formkitschema_key.py +0 -0
  191. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0003_delete_translatable.py +0 -0
  192. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0004_remove_formkitschema_key_and_more.py +0 -0
  193. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0005_option_last_updated_option_object_id_optionlabel_and_more.py +0 -0
  194. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0006_option_group_option_unique_option_id.py +0 -0
  195. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0007_alter_option_field.py +0 -0
  196. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0008_remove_option_label.py +0 -0
  197. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0009_formkitschemanode_text_content_and_more.py +0 -0
  198. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0010_alter_option_options_and_more.py +0 -0
  199. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0011_nodechildren_formkitschemanode_children.py +0 -0
  200. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0012_remove_formkitschemanode_group_remove_option_field_and_more.py +0 -0
  201. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0013_formkitschemanode_option_group.py +0 -0
  202. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0014_schemalabel_schemadescription.py +0 -0
  203. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0015_alter_formkitschema_label.py +0 -0
  204. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0016_alter_nodechildren_options_and_more.py +0 -0
  205. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0017_nodechildren_change_id.py +0 -0
  206. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0018_remove_formcomponents_order_on_insert_option_and_more.py +0 -0
  207. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0019_formkitschemanode_track_change_and_more.py +0 -0
  208. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0020_remove_formcomponents_order_on_update_option_and_more.py +0 -0
  209. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0021_formkitschemanode_is_active.py +0 -0
  210. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0022_formkitschemanode_soft_delete.py +0 -0
  211. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0023_formkitschemanodeevent_and_more.py +0 -0
  212. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0024_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  213. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0025_remove_formkitschemanode_protect_deletes_and_more.py +0 -0
  214. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0026_remove_formkitschemanode_protect_node_deletes_and_updates_and_more.py +0 -0
  215. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0027_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  216. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0028_migrate_additional_props.py +0 -0
  217. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0029_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  218. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0030_migrate_more_props.py +0 -0
  219. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0031_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  220. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0032_migrate_repeater_props.py +0 -0
  221. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0033_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  222. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0034_codegenerationconfig_and_more.py +0 -0
  223. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0035_alter_codegenerationconfig_priority_submission_and_more.py +0 -0
  224. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0036_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  225. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0037_alter_formkitschemanode_django_field_args_and_more.py +0 -0
  226. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0038_separatedsubmissionevent_submissionevent_and_more.py +0 -0
  227. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0039_remove_formkitschemanode_insert_insert_and_more.py +0 -0
  228. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0040_submissionfile_separatedsubmissionimport_and_more.py +0 -0
  229. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/0041_flag.py +0 -0
  230. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/migrations/__init__.py +0 -0
  231. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/notifications.py +0 -0
  232. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/__init__.py +0 -0
  233. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/converters.py +0 -0
  234. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/converters_examples.py +0 -0
  235. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/database_node_path.py +0 -0
  236. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/formatter.py +0 -0
  237. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generation_pipeline.py +0 -0
  238. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generator.py +0 -0
  239. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/generator_config.py +0 -0
  240. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/logger.py +0 -0
  241. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/node_factory.py +0 -0
  242. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/node_registry.py +0 -0
  243. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/plugins.py +0 -0
  244. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/schema_walker.py +0 -0
  245. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/template_loader.py +0 -0
  246. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/abstract_model.jinja2 +0 -0
  247. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/admin.jinja2 +0 -0
  248. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/admin.py.jinja2 +0 -0
  249. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/api.jinja2 +0 -0
  250. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/api.py.jinja2 +0 -0
  251. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/basemodel.jinja2 +0 -0
  252. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/model.jinja2 +0 -0
  253. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/models.py.jinja2 +0 -0
  254. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schema.jinja2 +0 -0
  255. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schemas.py.jinja2 +0 -0
  256. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/schemas_in.py.jinja2 +0 -0
  257. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/templates/signals.py.jinja2 +0 -0
  258. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/parser/type_convert.py +0 -0
  259. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/__init__.py +0 -0
  260. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/button-with-slot.html +0 -0
  261. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/color_input.html +0 -0
  262. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/date_input.html +0 -0
  263. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/element.json +0 -0
  264. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/form_generation_example.json +0 -0
  265. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/meeting_type_node.json +0 -0
  266. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/samples/raw_values.json +0 -0
  267. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Balansu.json +0 -0
  268. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/CFM_12_FF_12.json +0 -0
  269. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/CFM_2_FF_4.json +0 -0
  270. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Dateofexitfromthecommittee.json +0 -0
  271. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Enterasensiblenumber.json +0 -0
  272. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_3.json +0 -0
  273. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_3_4.json +0 -0
  274. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF1_2_6.json +0 -0
  275. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_10.json +0 -0
  276. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_11.json +0 -0
  277. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_14.json +0 -0
  278. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_1_1.json +0 -0
  279. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_1_2_3.json +0 -0
  280. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_33_Finance_check.json +0 -0
  281. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_3_3_3.json +0 -0
  282. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_3_3_5.json +0 -0
  283. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FF_5_3_3.json +0 -0
  284. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS5.json +0 -0
  285. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS_4_3.json +0 -0
  286. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/FS_4_6.json +0 -0
  287. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Fathersname.json +0 -0
  288. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Formulariu_koko.json +0 -0
  289. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/HowmanyDollars.json +0 -0
  290. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/MoneyTestgroup.json +0 -0
  291. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Monitorizasaun_Projetu_teste.json +0 -0
  292. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Mothersname.json +0 -0
  293. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/NewGroup.json +0 -0
  294. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/None.json +0 -0
  295. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Numberofhousehold.json +0 -0
  296. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/NumeruBI.json +0 -0
  297. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/POM_1.json +0 -0
  298. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/POM_5.json +0 -0
  299. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Project.json +0 -0
  300. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF2_2_3.json +0 -0
  301. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_1.json +0 -0
  302. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_2.json +0 -0
  303. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_1_3.json +0 -0
  304. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_2_3.json +0 -0
  305. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_1.json +0 -0
  306. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_2.json +0 -0
  307. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_4_3.json +0 -0
  308. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/SF_6_2.json +0 -0
  309. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Sex_father.json +0 -0
  310. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_1.json +0 -0
  311. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_2.json +0 -0
  312. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_3.json +0 -0
  313. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_2_4.json +0 -0
  314. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_13_3_2.json +0 -0
  315. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_1_1.json +0 -0
  316. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_1_2.json +0 -0
  317. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_2_1.json +0 -0
  318. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_2_2.json +0 -0
  319. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_3_2.json +0 -0
  320. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TF_6_4_1.json +0 -0
  321. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/TestForm.json +0 -0
  322. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Tests.json +0 -0
  323. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Testu.json +0 -0
  324. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/Thisisanumericinput.json +0 -0
  325. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/__init__.py +0 -0
  326. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/_dad.json +0 -0
  327. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/active_status.json +0 -0
  328. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/date_exit_committee.json +0 -0
  329. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/dfadfa.json +0 -0
  330. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/exit_details.json +0 -0
  331. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/ff1_2_3.json +0 -0
  332. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/fs_4_3.json +0 -0
  333. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextAdministrativePost.json +0 -0
  334. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextAldeia.json +0 -0
  335. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextMunicipality.json +0 -0
  336. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextPostuAdministrativu.json +0 -0
  337. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextProjectname.json +0 -0
  338. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/gettextSuco.json +0 -0
  339. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/idayesno.json +0 -0
  340. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/koko_1.json +0 -0
  341. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/my_testing.json +0 -0
  342. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/name.json +0 -0
  343. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/project_name.json +0 -0
  344. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/round.json +0 -0
  345. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/schemas.py +0 -0
  346. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/set.json +0 -0
  347. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/schemas/test.json +0 -0
  348. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/services/__init__.py +0 -0
  349. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/services/schema_import.py +0 -0
  350. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/triggers.py +0 -0
  351. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/urls.py +0 -0
  352. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja/utils.py +0 -0
  353. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/PKG-INFO +0 -0
  354. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/SOURCES.txt +0 -0
  355. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/dependency_links.txt +0 -0
  356. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/requires.txt +0 -0
  357. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkit_ninja.egg-info/top_level.txt +0 -0
  358. {formkit_ninja-2.2 → formkit_ninja-2.3}/formkitninja.yaml +0 -0
  359. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/.gitignore +0 -0
  360. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/coverage_html_cb_dd2e7eb5.js +0 -0
  361. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/favicon_32_cb_c827f16f.png +0 -0
  362. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/keybd_closed_cb_900cfef5.png +0 -0
  363. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/style_cb_9ff733b0.css +0 -0
  364. {formkit_ninja-2.2 → formkit_ninja-2.3}/htmlcov/z_2ac3eb8e1401bc8b_handlers_py.html +0 -0
  365. {formkit_ninja-2.2 → formkit_ninja-2.3}/issue_22.json +0 -0
  366. {formkit_ninja-2.2 → formkit_ninja-2.3}/manage.py +0 -0
  367. {formkit_ninja-2.2 → formkit_ninja-2.3}/mkdocs.yml +0 -0
  368. {formkit_ninja-2.2 → formkit_ninja-2.3}/test_generator_real_data.py +0 -0
  369. {formkit_ninja-2.2 → formkit_ninja-2.3}/test_generator_with_data.py +0 -0
  370. {formkit_ninja-2.2 → formkit_ninja-2.3}/test_output.txt +0 -0
  371. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/__init__.py +0 -0
  372. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/api.py +0 -0
  373. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/asgi.py +0 -0
  374. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/__init__.py +0 -0
  375. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin/__init__.py +0 -0
  376. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin/mainform.py +0 -0
  377. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/admin.py +0 -0
  378. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/api/__init__.py +0 -0
  379. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/api/mainform.py +0 -0
  380. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/apps.py +0 -0
  381. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/migrations/0001_initial.py +0 -0
  382. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/migrations/__init__.py +0 -0
  383. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models/__init__.py +0 -0
  384. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models/mainform.py +0 -0
  385. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/models.py +0 -0
  386. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas/__init__.py +0 -0
  387. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas/mainform.py +0 -0
  388. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas_in/__init__.py +0 -0
  389. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/schemas_in/mainform.py +0 -0
  390. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/signals.py +0 -0
  391. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/tests.py +0 -0
  392. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/complex_app/views.py +0 -0
  393. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/manage.py +0 -0
  394. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/__init__.py +0 -0
  395. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/admin/__init__.py +0 -0
  396. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/admin/tf611.py +0 -0
  397. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/api/__init__.py +0 -0
  398. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/api/tf611.py +0 -0
  399. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/apps.py +0 -0
  400. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/migrations/0001_initial_tf611_models.py +0 -0
  401. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/migrations/__init__.py +0 -0
  402. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models/__init__.py +0 -0
  403. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models/tf611.py +0 -0
  404. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/models.py +0 -0
  405. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas/__init__.py +0 -0
  406. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas/tf611.py +0 -0
  407. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas_in/__init__.py +0 -0
  408. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/schemas_in/tf611.py +0 -0
  409. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/partisipa/signals.py +0 -0
  410. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/__init__.py +0 -0
  411. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin/__init__.py +0 -0
  412. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin/personalinfo.py +0 -0
  413. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/admin.py +0 -0
  414. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/api/__init__.py +0 -0
  415. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/api/personalinfo.py +0 -0
  416. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/apps.py +0 -0
  417. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/migrations/0001_initial.py +0 -0
  418. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/migrations/__init__.py +0 -0
  419. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models/__init__.py +0 -0
  420. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models/personalinfo.py +0 -0
  421. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/models.py +0 -0
  422. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas/__init__.py +0 -0
  423. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas/personalinfo.py +0 -0
  424. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas_in/__init__.py +0 -0
  425. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/schemas_in/personalinfo.py +0 -0
  426. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/signals.py +0 -0
  427. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/tests.py +0 -0
  428. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/sample_app/views.py +0 -0
  429. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/urls.py +0 -0
  430. {formkit_ninja-2.2 → formkit_ninja-2.3}/testproject/wsgi.py +0 -0
  431. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/__init__.py +0 -0
  432. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/conftest.py +0 -0
  433. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/factories.py +0 -0
  434. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures/partisipa_complex_form.yaml +0 -0
  435. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures/partisipa_sample.yaml +0 -0
  436. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/fixtures.py +0 -0
  437. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_flag.py +0 -0
  438. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_models_new.py +0 -0
  439. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_separated_submission_annotations.py +0 -0
  440. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/form_submission/test_submission_annotations.py +0 -0
  441. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/helpers/__init__.py +0 -0
  442. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/helpers/schema_reproduction.py +0 -0
  443. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/__init__.py +0 -0
  444. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/admin.py +0 -0
  445. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/api.py +0 -0
  446. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/models.py +0 -0
  447. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/schemas.py +0 -0
  448. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/complex_nested_form/schemas_in.py +0 -0
  449. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/__init__.py +0 -0
  450. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/admin.py +0 -0
  451. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/api.py +0 -0
  452. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/models.py +0 -0
  453. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/schemas.py +0 -0
  454. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/fixtures/expected_output/simple_form/schemas_in.py +0 -0
  455. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/partisipanodepath.py +0 -0
  456. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/partisipanodepath_rewritten.py +0 -0
  457. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_api_to_codegen.py +0 -0
  458. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_ast_validation.py +0 -0
  459. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_backward_compatibility.py +0 -0
  460. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters.py +0 -0
  461. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters_examples.py +0 -0
  462. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_converters_extended.py +0 -0
  463. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_database_generation.py +0 -0
  464. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_database_node_path.py +0 -0
  465. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_default_converters.py +0 -0
  466. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_end_to_end_generation.py +0 -0
  467. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_extensions.py +0 -0
  468. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_formatter.py +0 -0
  469. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generation_pipeline.py +0 -0
  470. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator.py +0 -0
  471. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator_config.py +0 -0
  472. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_generator_config_database.py +0 -0
  473. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_integration_generator.py +0 -0
  474. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_management_generate_code.py +0 -0
  475. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_node_factory.py +0 -0
  476. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_node_registry.py +0 -0
  477. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_partisipa_architecture.py +0 -0
  478. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_partisipanodepath_rewritten.py +0 -0
  479. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_plugins.py +0 -0
  480. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_repeater_config.py +0 -0
  481. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_schema_walker.py +0 -0
  482. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_template_loader.py +0 -0
  483. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/parser/test_tf611_database_driven.py +0 -0
  484. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/services/test_schema_import_service.py +0 -0
  485. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_best_practice.py +0 -0
  486. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_code_generation.py +0 -0
  487. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_node_creation.py +0 -0
  488. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_admin_preview.py +0 -0
  489. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_api_errors.py +0 -0
  490. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_autocomplete.py +0 -0
  491. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_conditional_logic.py +0 -0
  492. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_data_loss_roundtrip.py +0 -0
  493. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_database_source_of_truth.py +0 -0
  494. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_datepicker.py +0 -0
  495. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_extracted_schemas.py +0 -0
  496. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_fields.py +0 -0
  497. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_formkit_in.py +0 -0
  498. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_group.json +0 -0
  499. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_hidden_node.py +0 -0
  500. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_integration.py +0 -0
  501. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_issue_22.py +0 -0
  502. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_jinja_template.py +0 -0
  503. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_make_name_valid.py +0 -0
  504. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_management.py +0 -0
  505. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_management_commands.py +0 -0
  506. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_migrations.py +0 -0
  507. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_nested_structures.py +0 -0
  508. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_notifications.py +0 -0
  509. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_parser.py +0 -0
  510. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_partisipa_reproduction.py +0 -0
  511. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_partisipa_yaml.py +0 -0
  512. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_positional_args.py +0 -0
  513. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_pw.py +0 -0
  514. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_python_models.py +0 -0
  515. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_repeater_generation.py +0 -0
  516. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_repeater_nested.py +0 -0
  517. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_signals.py +0 -0
  518. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_submission_models.py +0 -0
  519. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_textarea.py +0 -0
  520. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_tf611_api_creation.py +0 -0
  521. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_type_convert.py +0 -0
  522. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_utils.py +0 -0
  523. {formkit_ninja-2.2 → formkit_ninja-2.3}/tests/test_valid_django_id.py +0 -0
  524. {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.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 5434:5432 -e POSTGRES_HOST_AUTH_METHOD=trust docker.io/library/postgres:14-alpine
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 5434:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14-alpine
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 5434:5432 -e POSTGRES_HOST_AUTH_METHOD=trust docker.io/library/postgres:14-alpine
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 5434:5432 -e POSTGRES_HOST_AUTH_METHOD=trust postgres:14-alpine
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()._json_fields["node"]),
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": ("addLabel", "upControl", "downControl", "itemsClass", "itemClass")},
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: {"form": FormKitNodeForm},
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 = ("django_code_preview", "pydantic_code_preview", "formkit_node_preview", "created", "updated")
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
- # Also include code generation fields to avoid them being duplicated in the default fieldset
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
- "Code Generation (Source of Truth)",
535
+ CODE_GEN_FIELDSET_TITLE,
541
536
  {
542
- "fields": (
543
- "django_field_type",
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