django-camomilla-cms 6.0.0b17__tar.gz → 6.0.0b18__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 (143) hide show
  1. {django_camomilla_cms-6.0.0b17/django_camomilla_cms.egg-info → django_camomilla_cms-6.0.0b18}/PKG-INFO +1 -1
  2. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/__init__.py +1 -1
  3. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/settings.py +6 -0
  4. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/base.html +60 -4
  5. django_camomilla_cms-6.0.0b18/camomilla/templatetags/model_extras.py +73 -0
  6. django_camomilla_cms-6.0.0b18/camomilla/theme/__init__.py +1 -0
  7. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/apps.py +1 -0
  8. django_camomilla_cms-6.0.0b18/camomilla/utils/templates.py +33 -0
  9. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18/django_camomilla_cms.egg-info}/PKG-INFO +1 -1
  10. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/django_camomilla_cms.egg-info/SOURCES.txt +1 -0
  11. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/setup.py +1 -1
  12. django_camomilla_cms-6.0.0b18/tests/utils/media.py +10 -0
  13. django_camomilla_cms-6.0.0b17/camomilla/theme/__init__.py +0 -1
  14. django_camomilla_cms-6.0.0b17/camomilla/utils/templates.py +0 -20
  15. django_camomilla_cms-6.0.0b17/tests/utils/media.py +0 -9
  16. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/LICENSE +0 -0
  17. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/MANIFEST.in +0 -0
  18. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/README.md +0 -0
  19. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/apps.py +0 -0
  20. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/authentication.py +0 -0
  21. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/context_processors.py +0 -0
  22. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/contrib/__init__.py +0 -0
  23. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/contrib/modeltranslation/__init__.py +0 -0
  24. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/contrib/modeltranslation/hvad_migration.py +0 -0
  25. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/defaults.py +0 -0
  26. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/dynamic_pages_urls.py +0 -0
  27. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/exceptions.py +0 -0
  28. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/fields/__init__.py +0 -0
  29. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/fields/json.py +0 -0
  30. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/management/__init__.py +0 -0
  31. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/management/commands/__init__.py +0 -0
  32. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/management/commands/regenerate_thumbnails.py +0 -0
  33. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/managers/__init__.py +0 -0
  34. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/managers/pages.py +0 -0
  35. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/model_api.py +0 -0
  36. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/__init__.py +0 -0
  37. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/article.py +0 -0
  38. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/content.py +0 -0
  39. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/media.py +0 -0
  40. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/menu.py +0 -0
  41. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/mixins/__init__.py +0 -0
  42. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/models/page.py +0 -0
  43. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/openapi/__init__.py +0 -0
  44. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/openapi/schema.py +0 -0
  45. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/parsers.py +0 -0
  46. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/permissions.py +0 -0
  47. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/redirects.py +0 -0
  48. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/__init__.py +0 -0
  49. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/article.py +0 -0
  50. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/base/__init__.py +0 -0
  51. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/content_type.py +0 -0
  52. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/fields/__init__.py +0 -0
  53. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/fields/file.py +0 -0
  54. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/fields/related.py +0 -0
  55. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/media.py +0 -0
  56. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/menu.py +0 -0
  57. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/__init__.py +0 -0
  58. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/fields.py +0 -0
  59. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/filter_fields.py +0 -0
  60. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/json.py +0 -0
  61. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/language.py +0 -0
  62. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/nesting.py +0 -0
  63. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/optimize.py +0 -0
  64. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/ordering.py +0 -0
  65. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/page.py +0 -0
  66. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/mixins/translation.py +0 -0
  67. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/page.py +0 -0
  68. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/user.py +0 -0
  69. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/utils.py +0 -0
  70. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/serializers/validators.py +0 -0
  71. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/sitemap.py +0 -0
  72. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/storages/__init__.py +0 -0
  73. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/storages/default.py +0 -0
  74. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/storages/optimize.py +0 -0
  75. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/storages/overwrite.py +0 -0
  76. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/admin/camomilla/page/change_form.html +0 -0
  77. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/articles/default.html +0 -0
  78. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/pages/default.html +0 -0
  79. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/parts/langswitch.html +0 -0
  80. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/parts/menu.html +0 -0
  81. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates/defaults/widgets/media_select_multiple.html +0 -0
  82. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates_context/__init__.py +0 -0
  83. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates_context/autodiscover.py +0 -0
  84. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templates_context/rendering.py +0 -0
  85. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templatetags/__init__.py +0 -0
  86. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templatetags/camomilla_filters.py +0 -0
  87. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/templatetags/menus.py +0 -0
  88. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/admin/__init__.py +0 -0
  89. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/admin/pages.py +0 -0
  90. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/admin/translations.py +0 -0
  91. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/static/admin/css/responsive.css +0 -0
  92. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/static/admin/img/favicon.ico +0 -0
  93. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/static/admin/img/logo.svg +0 -0
  94. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/templates/admin/base.html +0 -0
  95. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/theme/templates/rosetta/base.html +0 -0
  96. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/translation.py +0 -0
  97. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/urls.py +0 -0
  98. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/__init__.py +0 -0
  99. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/getters.py +0 -0
  100. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/normalization.py +0 -0
  101. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/query_parser.py +0 -0
  102. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/seo.py +0 -0
  103. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/setters.py +0 -0
  104. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/utils/translation.py +0 -0
  105. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/__init__.py +0 -0
  106. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/articles.py +0 -0
  107. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/base/__init__.py +0 -0
  108. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/contents.py +0 -0
  109. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/decorators.py +0 -0
  110. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/languages.py +0 -0
  111. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/medias.py +0 -0
  112. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/menus.py +0 -0
  113. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/__init__.py +0 -0
  114. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/bulk_actions.py +0 -0
  115. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/language.py +0 -0
  116. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/optimize.py +0 -0
  117. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/ordering.py +0 -0
  118. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/pagination.py +0 -0
  119. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/mixins/permissions.py +0 -0
  120. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/pages.py +0 -0
  121. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/tags.py +0 -0
  122. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/camomilla/views/users.py +0 -0
  123. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/django_camomilla_cms.egg-info/dependency_links.txt +0 -0
  124. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/django_camomilla_cms.egg-info/requires.txt +0 -0
  125. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/django_camomilla_cms.egg-info/top_level.txt +0 -0
  126. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/pyproject.toml +0 -0
  127. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/setup.cfg +0 -0
  128. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/__init__.py +0 -0
  129. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/fixtures/__init__.py +0 -0
  130. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_api.py +0 -0
  131. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_camomilla_filters.py +0 -0
  132. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_media.py +0 -0
  133. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_menu.py +0 -0
  134. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_model_api.py +0 -0
  135. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_model_api_permissions.py +0 -0
  136. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_model_api_register.py +0 -0
  137. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_models.py +0 -0
  138. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_pages.py +0 -0
  139. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_query_parser.py +0 -0
  140. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_templates_context.py +0 -0
  141. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/test_utils.py +0 -0
  142. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/utils/__init__.py +0 -0
  143. {django_camomilla_cms-6.0.0b17 → django_camomilla_cms-6.0.0b18}/tests/utils/api.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-camomilla-cms
3
- Version: 6.0.0b17
3
+ Version: 6.0.0b18
4
4
  Summary: Django powered cms
5
5
  Author-email: Lotrèk <dimmitutto@lotrek.it>
6
6
  License: MIT
@@ -1,4 +1,4 @@
1
- __version__ = "6.0.0-beta.17"
1
+ __version__ = "6.0.0-beta.18"
2
2
 
3
3
 
4
4
  def get_core_apps():
@@ -87,6 +87,11 @@ API_TRANSLATION_ACCESSOR = pointed_getter(
87
87
  django_settings, "CAMOMILLA.API.TRANSLATION_ACCESSOR", "translations"
88
88
  )
89
89
 
90
+ REGISTERED_TEMPLATES_APPS = pointed_getter(
91
+ django_settings,
92
+ "CAMOMILLA.RENDER.REGISTERED_TEMPLATES_APPS", None
93
+ )
94
+
90
95
  DEBUG = pointed_getter(django_settings, "CAMOMILLA.DEBUG", django_settings.DEBUG)
91
96
 
92
97
  # camomilla settings example
@@ -104,6 +109,7 @@ DEBUG = pointed_getter(django_settings, "CAMOMILLA.DEBUG", django_settings.DEBUG
104
109
  # "AUTO_CREATE_HOMEPAGE": True,
105
110
  # "ARTICLE": {"DEFAULT_TEMPLATE": "", "INJECT_CONTEXT": None },
106
111
  # "PAGE": {"DEFAULT_TEMPLATE": "", "INJECT_CONTEXT": None }
112
+ # "REGISTERED_TEMPLATE_APPS": []
107
113
  # },
108
114
  # "STRUCTURED_FIELD": {
109
115
  # "CACHE_ENABLED": True
@@ -1,5 +1,7 @@
1
1
  {% load menus %}
2
2
  {% load i18n %}
3
+ {% load model_extras %}
4
+
3
5
  {% get_current_language as current_lang %}
4
6
 
5
7
 
@@ -9,9 +11,6 @@
9
11
  <title>Camomilla CMS</title>
10
12
  <style>
11
13
  html,
12
- body {
13
- height: 100%;
14
- }
15
14
 
16
15
  body {
17
16
  background-color: #f7fafc;
@@ -49,6 +48,45 @@
49
48
  font-size: 18px;
50
49
  font-style: italic;
51
50
  }
51
+ .accordion {
52
+ margin: 2rem auto;
53
+ border: 1px solid #000;
54
+ font-family: monospace;
55
+ width: 800px;
56
+ max-width: 800px;
57
+ }
58
+
59
+ .accordion-header {
60
+ display: flex;
61
+ justify-content: space-between;
62
+ align-items: center;
63
+ padding: 0.75rem 1rem;
64
+ cursor: pointer;
65
+ user-select: none;
66
+ }
67
+
68
+ .accordion-icon {
69
+ width: 1rem;
70
+ height: 1rem;
71
+ transition: transform 0.3s ease;
72
+ }
73
+
74
+ .accordion-toggle:checked + .accordion-header .accordion-icon {
75
+ transform: rotate(180deg);
76
+ }
77
+
78
+ .accordion-body {
79
+ max-height: 0;
80
+ overflow: hidden;
81
+ transition: max-height 0.3s ease;
82
+ }
83
+
84
+ .accordion-toggle:checked + .accordion-header + .accordion-body {
85
+ max-height: 30vh;
86
+ padding: 1rem;
87
+ border-top: 1px solid #000;
88
+ overflow-y: auto;
89
+ }
52
90
  </style>
53
91
  </head>
54
92
 
@@ -104,11 +142,29 @@
104
142
  - <b>Module:</b> {{page_model.module}} <br>
105
143
  - <b>Identifier:</b> {{page.pk}} <br>
106
144
  - <b>Permalink:</b> {{page.permalink}} <br>
107
- - <b>Language:</b> {{current_lang}} <br>
145
+ - <b>Language:</b> {{current_lang}} <br>
108
146
  </code>
147
+
109
148
  {% endblock %}
149
+
110
150
  {% block content %}
111
151
  {% endblock %}
152
+
153
+ <div class="accordion">
154
+ <input type="checkbox" id="accordion-toggle" class="accordion-toggle" hidden>
155
+ <label for="accordion-toggle" class="accordion-header">
156
+ <span>Page data</span>
157
+ <svg class="accordion-icon" viewBox="0 0 24 24">
158
+ <path d="M6 9l6 6 6-6" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/>
159
+ </svg>
160
+ </label>
161
+ <div class="accordion-body">
162
+ <pre>{{ page|to_pretty_dict|safe }}</pre>
163
+ </div>
164
+ </div>
165
+
166
+ </div>
167
+
112
168
  </body>
113
169
 
114
170
  </html>
@@ -0,0 +1,73 @@
1
+ from django import template
2
+ from django.utils.safestring import mark_safe
3
+ from django.forms.models import model_to_dict
4
+ from structured.pydantic.models import BaseModel
5
+ import json
6
+ import re
7
+ import html
8
+ from datetime import datetime
9
+
10
+ register = template.Library()
11
+
12
+
13
+ def custom_json_serializer(obj):
14
+ """Serialize custom objects to JSON."""
15
+ if isinstance(obj, datetime):
16
+ return obj.isoformat()
17
+ raise TypeError(f"Type {type(obj)} not serializable")
18
+
19
+
20
+ def pretty_dict(data, indent_level=0):
21
+ """
22
+ Recursive function to format a dictionary into a pretty string.
23
+ Args:
24
+ data (dict): The dictionary to format.
25
+ indent_level (int): The current indentation level.
26
+ Returns:
27
+ str: A pretty-printed string representation of the dictionary.
28
+ """
29
+ indent = " " * indent_level
30
+ result = []
31
+
32
+ for key, value in data.items():
33
+
34
+ if isinstance(value, dict):
35
+ result.append(f"{indent}'{key}': {{")
36
+ result.append(pretty_dict(value, indent_level + 1))
37
+ result.append(f"{indent}}},")
38
+
39
+ elif isinstance(value, list):
40
+ result.append(f"{indent}'{key}': [")
41
+ for item in value:
42
+ if isinstance(item, dict):
43
+ result.append(pretty_dict(item, indent_level + 1))
44
+ else:
45
+ result.append(f"{indent} {json.dumps(item, default=custom_json_serializer)},")
46
+ result.append(f"{indent}],")
47
+
48
+ else:
49
+ result.append(f"{indent}'{key}': {json.dumps(value, default=custom_json_serializer)},")
50
+
51
+ return "\n".join(result).rstrip(',')
52
+
53
+
54
+ @register.filter
55
+ def to_pretty_dict(instance):
56
+ data = model_to_dict(instance)
57
+
58
+ for key, value in data.items():
59
+ if isinstance(value, BaseModel):
60
+ data[key] = value.model_dump()
61
+
62
+ formatted_dict = "{\n" + pretty_dict(data, indent_level=1) + "\n}"
63
+
64
+ escaped = html.escape(formatted_dict)
65
+
66
+ # This to highlight the keys in the JSON
67
+ highlighted = re.sub(
68
+ r"(&#x27;)([^&#]+?)(&#x27;):",
69
+ r"<span style='color:#df3079'>'\2'</span>:",
70
+ escaped
71
+ )
72
+
73
+ return mark_safe(f"<pre>{highlighted}</pre>")
@@ -0,0 +1 @@
1
+ __version__ = "6.0.0-beta.18"
@@ -34,4 +34,5 @@ class CamomillaThemeConfig(AppConfig):
34
34
  "django_jsonform",
35
35
  "admin_interface",
36
36
  "colorfield",
37
+ "structured",
37
38
  )
@@ -0,0 +1,33 @@
1
+ from pathlib import Path
2
+ from typing import Sequence
3
+
4
+ from django import template as django_template
5
+ from os.path import relpath
6
+ from camomilla.settings import REGISTERED_TEMPLATES_APPS
7
+
8
+
9
+ def get_all_templates_files() -> Sequence[str]:
10
+ files = []
11
+
12
+ for engine in django_template.loader.engines.all():
13
+
14
+ if REGISTERED_TEMPLATES_APPS:
15
+ dirs = [
16
+ d for d in engine.template_dirs
17
+ if any(app in str(d) for app in REGISTERED_TEMPLATES_APPS)
18
+ ]
19
+ else:
20
+ # Exclude pip installed site package template dirs
21
+ dirs = [
22
+ d for d in engine.template_dirs
23
+ if "site-packages" not in str(d) or "camomilla" in str(d)
24
+ ]
25
+
26
+ for d in dirs:
27
+ base = Path(d)
28
+ files.extend(
29
+ relpath(f, d)
30
+ for f in base.rglob("*.html")
31
+ )
32
+
33
+ return files
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-camomilla-cms
3
- Version: 6.0.0b17
3
+ Version: 6.0.0b18
4
4
  Summary: Django powered cms
5
5
  Author-email: Lotrèk <dimmitutto@lotrek.it>
6
6
  License: MIT
@@ -77,6 +77,7 @@ camomilla/templates_context/rendering.py
77
77
  camomilla/templatetags/__init__.py
78
78
  camomilla/templatetags/camomilla_filters.py
79
79
  camomilla/templatetags/menus.py
80
+ camomilla/templatetags/model_extras.py
80
81
  camomilla/theme/__init__.py
81
82
  camomilla/theme/apps.py
82
83
  camomilla/theme/admin/__init__.py
@@ -1,5 +1,5 @@
1
1
  from setuptools import setup
2
2
 
3
- __version__ = "6.0.0-beta.17"
3
+ __version__ = "6.0.0-beta.18"
4
4
 
5
5
  setup(version=__version__)
@@ -0,0 +1,10 @@
1
+ import os
2
+ from tests.fixtures import load_asset
3
+ from django.conf import settings
4
+
5
+
6
+ def load_asset_and_remove_media(filename):
7
+ asset = load_asset(filename)
8
+ if os.path.exists(f"{settings.MEDIA_ROOT}/{filename}"):
9
+ os.remove(f"{settings.MEDIA_ROOT}/{filename}")
10
+ return asset
@@ -1 +0,0 @@
1
- __version__ = "6.0.0-beta.17"
@@ -1,20 +0,0 @@
1
- from pathlib import Path
2
- from typing import Sequence
3
-
4
- from django import template as django_template
5
- from os.path import relpath
6
-
7
-
8
- def get_all_templates_files() -> Sequence[str]:
9
- dirs = []
10
- for engine in django_template.loader.engines.all():
11
- # Exclude pip installed site package template dirs
12
- dirs.extend(
13
- x
14
- for x in engine.template_dirs
15
- if "site-packages" not in str(x) or "camomilla" in str(x)
16
- )
17
- files = []
18
- for dir in dirs:
19
- files.extend(relpath(x, dir) for x in Path(dir).glob("**/*.html") if x)
20
- return files
@@ -1,9 +0,0 @@
1
- import os
2
- from tests.fixtures import load_asset
3
- from django.conf import settings
4
-
5
- def load_asset_and_remove_media(filename):
6
- asset = load_asset(filename)
7
- if os.path.exists(f"{settings.MEDIA_ROOT}/{filename}"):
8
- os.remove(f"{settings.MEDIA_ROOT}/{filename}")
9
- return asset