django-camomilla-cms 6.0.0b18__tar.gz → 6.0.1__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.
- django_camomilla_cms-6.0.1/PKG-INFO +133 -0
- django_camomilla_cms-6.0.1/README.md +102 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/__init__.py +1 -1
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/page.py +1 -8
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/base/__init__.py +9 -5
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/settings.py +15 -2
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templatetags/model_extras.py +8 -4
- django_camomilla_cms-6.0.1/camomilla/theme/__init__.py +1 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/admin/pages.py +20 -0
- django_camomilla_cms-6.0.1/camomilla/utils/templates.py +53 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/base/__init__.py +4 -2
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/pagination.py +1 -1
- django_camomilla_cms-6.0.1/django_camomilla_cms.egg-info/PKG-INFO +133 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/django_camomilla_cms.egg-info/SOURCES.txt +1 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/django_camomilla_cms.egg-info/requires.txt +3 -1
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/pyproject.toml +4 -2
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/setup.py +1 -1
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/fixtures/__init__.py +3 -6
- django_camomilla_cms-6.0.1/tests/test_admin_page_form.py +63 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_camomilla_filters.py +7 -3
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_media.py +54 -15
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_menu.py +33 -18
- django_camomilla_cms-6.0.1/tests/test_model_api.py +113 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_model_api_permissions.py +7 -2
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_model_api_register.py +118 -156
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_pages.py +139 -131
- django_camomilla_cms-6.0.1/tests/test_templates_context.py +149 -0
- django_camomilla_cms-6.0.1/tests/test_utils.py +56 -0
- django_camomilla_cms-6.0.0b18/PKG-INFO +0 -79
- django_camomilla_cms-6.0.0b18/README.md +0 -50
- django_camomilla_cms-6.0.0b18/camomilla/theme/__init__.py +0 -1
- django_camomilla_cms-6.0.0b18/camomilla/utils/templates.py +0 -33
- django_camomilla_cms-6.0.0b18/django_camomilla_cms.egg-info/PKG-INFO +0 -79
- django_camomilla_cms-6.0.0b18/tests/test_model_api.py +0 -68
- django_camomilla_cms-6.0.0b18/tests/test_templates_context.py +0 -111
- django_camomilla_cms-6.0.0b18/tests/test_utils.py +0 -86
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/LICENSE +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/MANIFEST.in +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/apps.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/authentication.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/context_processors.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/contrib/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/contrib/modeltranslation/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/contrib/modeltranslation/hvad_migration.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/defaults.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/dynamic_pages_urls.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/exceptions.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/fields/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/fields/json.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/management/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/management/commands/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/management/commands/regenerate_thumbnails.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/managers/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/managers/pages.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/model_api.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/article.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/content.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/media.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/menu.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/models/mixins/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/openapi/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/openapi/schema.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/parsers.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/permissions.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/redirects.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/article.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/content_type.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/fields/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/fields/file.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/fields/related.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/media.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/menu.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/fields.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/filter_fields.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/json.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/language.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/nesting.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/optimize.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/ordering.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/page.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/mixins/translation.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/page.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/user.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/utils.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/validators.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/sitemap.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/storages/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/storages/default.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/storages/optimize.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/storages/overwrite.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/admin/camomilla/page/change_form.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/articles/default.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/base.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/pages/default.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/parts/langswitch.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/parts/menu.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates/defaults/widgets/media_select_multiple.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates_context/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates_context/autodiscover.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templates_context/rendering.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templatetags/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templatetags/camomilla_filters.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templatetags/menus.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/admin/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/admin/translations.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/apps.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/static/admin/css/responsive.css +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/static/admin/img/favicon.ico +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/static/admin/img/logo.svg +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/templates/admin/base.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/theme/templates/rosetta/base.html +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/translation.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/urls.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/getters.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/normalization.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/query_parser.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/seo.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/setters.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/utils/translation.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/articles.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/contents.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/decorators.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/languages.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/medias.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/menus.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/bulk_actions.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/language.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/optimize.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/ordering.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/permissions.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/pages.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/tags.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/users.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/django_camomilla_cms.egg-info/dependency_links.txt +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/django_camomilla_cms.egg-info/top_level.txt +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/setup.cfg +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_api.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_models.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/test_query_parser.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/utils/__init__.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/utils/api.py +0 -0
- {django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/tests/utils/media.py +0 -0
@@ -0,0 +1,133 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: django-camomilla-cms
|
3
|
+
Version: 6.0.1
|
4
|
+
Summary: Django powered cms
|
5
|
+
Author-email: Lotrèk <dimmitutto@lotrek.it>
|
6
|
+
License: MIT
|
7
|
+
Project-URL: Homepage, https://github.com/camomillacms/camomilla-core
|
8
|
+
Keywords: cms,django,api cms
|
9
|
+
Classifier: Environment :: Web Environment
|
10
|
+
Classifier: Framework :: Django
|
11
|
+
Classifier: Intended Audience :: Developers
|
12
|
+
Classifier: Programming Language :: Python
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Requires-Python: <=3.13,>=3.8
|
15
|
+
Description-Content-Type: text/markdown
|
16
|
+
License-File: LICENSE
|
17
|
+
Requires-Dist: django-modeltranslation<=0.18.12,>=0.18.7
|
18
|
+
Requires-Dist: djsuperadmin<1.0.0,>=0.9
|
19
|
+
Requires-Dist: djangorestframework<=3.14.0,>=3.10.0
|
20
|
+
Requires-Dist: django-structured-json-field>=0.4.2
|
21
|
+
Requires-Dist: Pillow>=10.0.0
|
22
|
+
Requires-Dist: django-admin-interface<1.0.0,>=0.26.0
|
23
|
+
Requires-Dist: django-ckeditor<7.0.0,>=5.7.1
|
24
|
+
Requires-Dist: django-tinymce<5.0.0,>=4.1.0
|
25
|
+
Requires-Dist: python-magic<0.5,>=0.4
|
26
|
+
Requires-Dist: Django<6,>=3.2
|
27
|
+
Requires-Dist: django_jsonform>=2.23
|
28
|
+
Requires-Dist: inflection>=0.5.1
|
29
|
+
Requires-Dist: uritemplate>=4.1.0
|
30
|
+
Dynamic: license-file
|
31
|
+
|
32
|
+
[](https://pypi.org/project/django-camomilla-cms)
|
33
|
+
[](https://www.djangoproject.com/)
|
34
|
+
[](https://github.com/camomillacms/camomilla-core/actions)
|
35
|
+
[](https://github.com/camomillacms/camomilla-core/commits/master)
|
36
|
+
[](https://github.com/camomillacms/camomilla-core/graphs/contributors)
|
37
|
+
[](https://github.com/camomillacms/camomilla-core/issues)
|
38
|
+
[](https://app.codecov.io/gh/camomillacms/camomilla-core/tree/master/camomilla)
|
39
|
+
[](./LICENSE)
|
40
|
+
|
41
|
+
|
42
|
+
<br>
|
43
|
+
<br>
|
44
|
+
<br>
|
45
|
+
<br>
|
46
|
+
<div align="center">
|
47
|
+
<picture>
|
48
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-dark.svg?v=1">
|
49
|
+
<source media="(prefers-color-scheme: light)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1">
|
50
|
+
<img alt="Fallback image description" src="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1" style="width: 250px; height: auto;">
|
51
|
+
</picture>
|
52
|
+
</div>
|
53
|
+
<h3 align="center"">Our beloved Django CMS</h3>
|
54
|
+
<br>
|
55
|
+
|
56
|
+
## ⭐️ Features
|
57
|
+
|
58
|
+
<!-- Highlight some of the features your module provide here -->
|
59
|
+
|
60
|
+
- 🧘♀️ Built on top of the django framework
|
61
|
+
- 🥨 Beaked page abstract model to let you manage everything you need as a page.
|
62
|
+
- 🏞️ Optimized media management with autoresize
|
63
|
+
- 👯 Enable relations inside django JSONFields
|
64
|
+
- ⚡️ AutoCreate api endpoints from models
|
65
|
+
- 🚧 Enable JsonSchema directly in models endpoints
|
66
|
+
|
67
|
+
Camomilla is a Django CMS that allows you to create and manage your website's content with ease. It provides a simple and intuitive interface for managing pages, media, and other content types. Camomilla is built on top of the Django framework, which means it inherits all the features and benefits of Django framework.
|
68
|
+
We try to continuously improve Camomilla by adding new features and fixing bugs. You can check the [CHANGELOG](./CHANGELOG.md) to see what has been added in the latest releases.
|
69
|
+
|
70
|
+
## 📦 Quick Start
|
71
|
+
|
72
|
+
Here you can find some quick setup instructions to get started with Camomilla. For more detailed information, please refer to the [documentation](https://camomillacms.github.io/camomilla-core/).
|
73
|
+
|
74
|
+
> [!TIP]
|
75
|
+
>
|
76
|
+
> #### Env Virtualization 👾
|
77
|
+
>
|
78
|
+
> Use a virtualenv to isolate your project's dependencies from the system's python installation before starting. Check out [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/) for more information.
|
79
|
+
|
80
|
+
Install django-camomilla-cms and django from pip
|
81
|
+
|
82
|
+
```bash
|
83
|
+
$ pip install django
|
84
|
+
$ pip install django-camomilla-cms==6.0.0
|
85
|
+
```
|
86
|
+
|
87
|
+
Create a new django project
|
88
|
+
|
89
|
+
```bash
|
90
|
+
$ django-admin startproject <project_name>
|
91
|
+
$ cd <project_name>
|
92
|
+
```
|
93
|
+
|
94
|
+
Create a dedicated folder for camomilla migrations
|
95
|
+
|
96
|
+
```bash
|
97
|
+
$ mkdir -p camomilla_migrations
|
98
|
+
$ touch camomilla_migrations.__init__.py
|
99
|
+
```
|
100
|
+
|
101
|
+
Create migrations and prepare the database
|
102
|
+
|
103
|
+
```bash
|
104
|
+
$ python manage.py makemigrations camomilla
|
105
|
+
$ python manage.py migrate
|
106
|
+
```
|
107
|
+
|
108
|
+
Add camomilla and camomilla dependencies to your project's INSTALLED_APPS
|
109
|
+
|
110
|
+
```python
|
111
|
+
# <project_name>/settings.py
|
112
|
+
|
113
|
+
INSTALLED_APPS = [
|
114
|
+
...
|
115
|
+
'camomilla', # always needed
|
116
|
+
'camomilla.theme', # needed to customize admin interface
|
117
|
+
'djsuperadmin', # needed if you whant to use djsuperadmin for contents
|
118
|
+
'modeltranslation', # needed if your website is multilanguage (can be added later)
|
119
|
+
'rest_framework', # always needed
|
120
|
+
'rest_framework.authtoken', # always needed
|
121
|
+
...
|
122
|
+
]
|
123
|
+
```
|
124
|
+
|
125
|
+
Run the server
|
126
|
+
|
127
|
+
```bash
|
128
|
+
$ python manage.py runserver
|
129
|
+
```
|
130
|
+
|
131
|
+
## 🧑💻 How to Contribute
|
132
|
+
|
133
|
+
We welcome contributions to Camomilla! If you want to contribute, please read our [contributing guide](./CONTRIBUTING.md) for more information on how to get started.
|
@@ -0,0 +1,102 @@
|
|
1
|
+
[](https://pypi.org/project/django-camomilla-cms)
|
2
|
+
[](https://www.djangoproject.com/)
|
3
|
+
[](https://github.com/camomillacms/camomilla-core/actions)
|
4
|
+
[](https://github.com/camomillacms/camomilla-core/commits/master)
|
5
|
+
[](https://github.com/camomillacms/camomilla-core/graphs/contributors)
|
6
|
+
[](https://github.com/camomillacms/camomilla-core/issues)
|
7
|
+
[](https://app.codecov.io/gh/camomillacms/camomilla-core/tree/master/camomilla)
|
8
|
+
[](./LICENSE)
|
9
|
+
|
10
|
+
|
11
|
+
<br>
|
12
|
+
<br>
|
13
|
+
<br>
|
14
|
+
<br>
|
15
|
+
<div align="center">
|
16
|
+
<picture>
|
17
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-dark.svg?v=1">
|
18
|
+
<source media="(prefers-color-scheme: light)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1">
|
19
|
+
<img alt="Fallback image description" src="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1" style="width: 250px; height: auto;">
|
20
|
+
</picture>
|
21
|
+
</div>
|
22
|
+
<h3 align="center"">Our beloved Django CMS</h3>
|
23
|
+
<br>
|
24
|
+
|
25
|
+
## ⭐️ Features
|
26
|
+
|
27
|
+
<!-- Highlight some of the features your module provide here -->
|
28
|
+
|
29
|
+
- 🧘♀️ Built on top of the django framework
|
30
|
+
- 🥨 Beaked page abstract model to let you manage everything you need as a page.
|
31
|
+
- 🏞️ Optimized media management with autoresize
|
32
|
+
- 👯 Enable relations inside django JSONFields
|
33
|
+
- ⚡️ AutoCreate api endpoints from models
|
34
|
+
- 🚧 Enable JsonSchema directly in models endpoints
|
35
|
+
|
36
|
+
Camomilla is a Django CMS that allows you to create and manage your website's content with ease. It provides a simple and intuitive interface for managing pages, media, and other content types. Camomilla is built on top of the Django framework, which means it inherits all the features and benefits of Django framework.
|
37
|
+
We try to continuously improve Camomilla by adding new features and fixing bugs. You can check the [CHANGELOG](./CHANGELOG.md) to see what has been added in the latest releases.
|
38
|
+
|
39
|
+
## 📦 Quick Start
|
40
|
+
|
41
|
+
Here you can find some quick setup instructions to get started with Camomilla. For more detailed information, please refer to the [documentation](https://camomillacms.github.io/camomilla-core/).
|
42
|
+
|
43
|
+
> [!TIP]
|
44
|
+
>
|
45
|
+
> #### Env Virtualization 👾
|
46
|
+
>
|
47
|
+
> Use a virtualenv to isolate your project's dependencies from the system's python installation before starting. Check out [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/) for more information.
|
48
|
+
|
49
|
+
Install django-camomilla-cms and django from pip
|
50
|
+
|
51
|
+
```bash
|
52
|
+
$ pip install django
|
53
|
+
$ pip install django-camomilla-cms==6.0.0
|
54
|
+
```
|
55
|
+
|
56
|
+
Create a new django project
|
57
|
+
|
58
|
+
```bash
|
59
|
+
$ django-admin startproject <project_name>
|
60
|
+
$ cd <project_name>
|
61
|
+
```
|
62
|
+
|
63
|
+
Create a dedicated folder for camomilla migrations
|
64
|
+
|
65
|
+
```bash
|
66
|
+
$ mkdir -p camomilla_migrations
|
67
|
+
$ touch camomilla_migrations.__init__.py
|
68
|
+
```
|
69
|
+
|
70
|
+
Create migrations and prepare the database
|
71
|
+
|
72
|
+
```bash
|
73
|
+
$ python manage.py makemigrations camomilla
|
74
|
+
$ python manage.py migrate
|
75
|
+
```
|
76
|
+
|
77
|
+
Add camomilla and camomilla dependencies to your project's INSTALLED_APPS
|
78
|
+
|
79
|
+
```python
|
80
|
+
# <project_name>/settings.py
|
81
|
+
|
82
|
+
INSTALLED_APPS = [
|
83
|
+
...
|
84
|
+
'camomilla', # always needed
|
85
|
+
'camomilla.theme', # needed to customize admin interface
|
86
|
+
'djsuperadmin', # needed if you whant to use djsuperadmin for contents
|
87
|
+
'modeltranslation', # needed if your website is multilanguage (can be added later)
|
88
|
+
'rest_framework', # always needed
|
89
|
+
'rest_framework.authtoken', # always needed
|
90
|
+
...
|
91
|
+
]
|
92
|
+
```
|
93
|
+
|
94
|
+
Run the server
|
95
|
+
|
96
|
+
```bash
|
97
|
+
$ python manage.py runserver
|
98
|
+
```
|
99
|
+
|
100
|
+
## 🧑💻 How to Contribute
|
101
|
+
|
102
|
+
We welcome contributions to Camomilla! If you want to contribute, please read our [contributing guide](./CONTRIBUTING.md) for more information on how to get started.
|
@@ -10,7 +10,6 @@ from django.http import Http404, HttpRequest
|
|
10
10
|
from django.shortcuts import redirect
|
11
11
|
from django.urls import NoReverseMatch, reverse
|
12
12
|
from django.utils import timezone
|
13
|
-
from django.utils.functional import lazy
|
14
13
|
from django.utils.text import slugify
|
15
14
|
from django.utils.translation import gettext_lazy as _
|
16
15
|
from django.utils.translation import get_language
|
@@ -24,7 +23,6 @@ from camomilla.utils import (
|
|
24
23
|
lang_fallback_query,
|
25
24
|
set_nofallbacks,
|
26
25
|
url_lang_decompose,
|
27
|
-
get_all_templates_files,
|
28
26
|
)
|
29
27
|
from camomilla.utils.getters import pointed_getter
|
30
28
|
from camomilla import settings
|
@@ -33,10 +31,6 @@ from django.conf import settings as django_settings
|
|
33
31
|
from modeltranslation.utils import build_localized_fieldname
|
34
32
|
|
35
33
|
|
36
|
-
def GET_TEMPLATE_CHOICES():
|
37
|
-
return [(t, t) for t in get_all_templates_files()]
|
38
|
-
|
39
|
-
|
40
34
|
class UrlRedirect(models.Model):
|
41
35
|
language_code = models.CharField(max_length=10, null=True)
|
42
36
|
from_url = models.CharField(max_length=400)
|
@@ -233,7 +227,7 @@ class AbstractPage(SeoMixin, MetaMixin, models.Model, metaclass=PageBase):
|
|
233
227
|
date_created = models.DateTimeField(auto_now_add=True)
|
234
228
|
date_updated_at = models.DateTimeField(auto_now=True)
|
235
229
|
breadcrumbs_title = models.CharField(max_length=128, null=True, blank=True)
|
236
|
-
template = models.CharField(max_length=500, null=True, blank=True
|
230
|
+
template = models.CharField(max_length=500, null=True, blank=True)
|
237
231
|
template_data = models.JSONField(default=dict, null=False, blank=True)
|
238
232
|
ordering = models.PositiveIntegerField(default=0, blank=False, null=False)
|
239
233
|
parent_page = models.ForeignKey(
|
@@ -276,7 +270,6 @@ class AbstractPage(SeoMixin, MetaMixin, models.Model, metaclass=PageBase):
|
|
276
270
|
|
277
271
|
def __init__(self, *args, **kwargs):
|
278
272
|
super(AbstractPage, self).__init__(*args, **kwargs)
|
279
|
-
self._meta.get_field("template").choices = lazy(GET_TEMPLATE_CHOICES, list)()
|
280
273
|
|
281
274
|
def __str__(self) -> str:
|
282
275
|
return "(%s) %s" % (self.__class__.__name__, self.title or self.permalink)
|
{django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/serializers/base/__init__.py
RENAMED
@@ -9,18 +9,22 @@ from camomilla.serializers.mixins import (
|
|
9
9
|
FieldsOverrideMixin,
|
10
10
|
TranslationsMixin,
|
11
11
|
)
|
12
|
+
from camomilla.settings import ENABLE_TRANSLATIONS
|
12
13
|
|
13
|
-
|
14
|
-
class BaseModelSerializer(
|
14
|
+
bases = (
|
15
15
|
SetupEagerLoadingMixin,
|
16
16
|
NestMixin,
|
17
17
|
FilterFieldsMixin,
|
18
18
|
FieldsOverrideMixin,
|
19
19
|
JSONFieldPatchMixin,
|
20
20
|
OrderingMixin,
|
21
|
-
|
22
|
-
|
23
|
-
|
21
|
+
)
|
22
|
+
|
23
|
+
if ENABLE_TRANSLATIONS:
|
24
|
+
bases += (TranslationsMixin,)
|
25
|
+
|
26
|
+
|
27
|
+
class BaseModelSerializer(*bases, serializers.ModelSerializer):
|
24
28
|
"""
|
25
29
|
This is the base serializer for all the models.
|
26
30
|
It adds support for:
|
@@ -88,8 +88,15 @@ API_TRANSLATION_ACCESSOR = pointed_getter(
|
|
88
88
|
)
|
89
89
|
|
90
90
|
REGISTERED_TEMPLATES_APPS = pointed_getter(
|
91
|
-
django_settings,
|
92
|
-
|
91
|
+
django_settings, "CAMOMILLA.RENDER.REGISTERED_TEMPLATES_APPS", None
|
92
|
+
)
|
93
|
+
|
94
|
+
INTEGRATIONS_ASTRO_ENABLE = pointed_getter(
|
95
|
+
django_settings, "CAMOMILLA.INTEGRATIONS.ASTRO.ENABLE", False
|
96
|
+
)
|
97
|
+
|
98
|
+
INTEGRATIONS_ASTRO_URL = pointed_getter(
|
99
|
+
django_settings, "CAMOMILLA.INTEGRATIONS.ASTRO.URL", ""
|
93
100
|
)
|
94
101
|
|
95
102
|
DEBUG = pointed_getter(django_settings, "CAMOMILLA.DEBUG", django_settings.DEBUG)
|
@@ -114,6 +121,12 @@ DEBUG = pointed_getter(django_settings, "CAMOMILLA.DEBUG", django_settings.DEBUG
|
|
114
121
|
# "STRUCTURED_FIELD": {
|
115
122
|
# "CACHE_ENABLED": True
|
116
123
|
# }
|
124
|
+
# "INTEGRATIONS": {
|
125
|
+
# "ASTRO": {
|
126
|
+
# "ENABLE": True,
|
127
|
+
# "URL": "http://localhost:4321"
|
128
|
+
# }
|
129
|
+
# }
|
117
130
|
# "API": {"NESTING_DEPTH": 10, "TRANSLATION_ACCESSOR": "translations"},
|
118
131
|
# "DEBUG": False
|
119
132
|
# }
|
{django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/templatetags/model_extras.py
RENAMED
@@ -42,13 +42,17 @@ def pretty_dict(data, indent_level=0):
|
|
42
42
|
if isinstance(item, dict):
|
43
43
|
result.append(pretty_dict(item, indent_level + 1))
|
44
44
|
else:
|
45
|
-
result.append(
|
45
|
+
result.append(
|
46
|
+
f"{indent} {json.dumps(item, default=custom_json_serializer)},"
|
47
|
+
)
|
46
48
|
result.append(f"{indent}],")
|
47
49
|
|
48
50
|
else:
|
49
|
-
result.append(
|
51
|
+
result.append(
|
52
|
+
f"{indent}'{key}': {json.dumps(value, default=custom_json_serializer)},"
|
53
|
+
)
|
50
54
|
|
51
|
-
return "\n".join(result).rstrip(
|
55
|
+
return "\n".join(result).rstrip(",")
|
52
56
|
|
53
57
|
|
54
58
|
@register.filter
|
@@ -67,7 +71,7 @@ def to_pretty_dict(instance):
|
|
67
71
|
highlighted = re.sub(
|
68
72
|
r"(')([^&#]+?)('):",
|
69
73
|
r"<span style='color:#df3079'>'\2'</span>:",
|
70
|
-
escaped
|
74
|
+
escaped,
|
71
75
|
)
|
72
76
|
|
73
77
|
return mark_safe(f"<pre>{highlighted}</pre>")
|
@@ -0,0 +1 @@
|
|
1
|
+
__version__ = "6.0.1"
|
@@ -3,6 +3,8 @@ from camomilla import settings
|
|
3
3
|
from .translations import TranslationAwareModelAdmin
|
4
4
|
from camomilla.models import UrlNode
|
5
5
|
|
6
|
+
from camomilla.utils import get_templates
|
7
|
+
|
6
8
|
|
7
9
|
class AbstractPageModelFormMeta(forms.models.ModelFormMetaclass):
|
8
10
|
def __new__(mcs, name, bases, attrs):
|
@@ -22,6 +24,12 @@ class AbstractPageModelFormMeta(forms.models.ModelFormMetaclass):
|
|
22
24
|
class AbstractPageModelForm(
|
23
25
|
forms.models.BaseModelForm, metaclass=AbstractPageModelFormMeta
|
24
26
|
):
|
27
|
+
def __init__(self, *args, **kwargs):
|
28
|
+
request = kwargs.pop("request", None)
|
29
|
+
super().__init__(*args, **kwargs)
|
30
|
+
templates = [(t, t) for t in get_templates(request)]
|
31
|
+
templates.insert(0, ("", "---------"))
|
32
|
+
self.fields["template"] = forms.ChoiceField(choices=templates)
|
25
33
|
|
26
34
|
def get_initial_for_field(self, field, field_name):
|
27
35
|
if field_name in UrlNode.LANG_PERMALINK_FIELDS:
|
@@ -43,4 +51,16 @@ class AbstractPageModelForm(
|
|
43
51
|
|
44
52
|
class AbstractPageAdmin(TranslationAwareModelAdmin):
|
45
53
|
form = AbstractPageModelForm
|
54
|
+
|
55
|
+
def get_form(self, request, obj=None, **kwargs):
|
56
|
+
kwargs["form"] = self.form
|
57
|
+
form = super().get_form(request, obj, **kwargs)
|
58
|
+
|
59
|
+
class FormWithRequest(form):
|
60
|
+
def __new__(cls, *args, **kwargs_):
|
61
|
+
kwargs_["request"] = request
|
62
|
+
return form(*args, **kwargs_)
|
63
|
+
|
64
|
+
return FormWithRequest
|
65
|
+
|
46
66
|
change_form_template = "admin/camomilla/page/change_form.html"
|
@@ -0,0 +1,53 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
from typing import Sequence
|
3
|
+
import requests
|
4
|
+
|
5
|
+
from django import template as django_template
|
6
|
+
from os.path import relpath
|
7
|
+
from camomilla.settings import (
|
8
|
+
REGISTERED_TEMPLATES_APPS,
|
9
|
+
INTEGRATIONS_ASTRO_ENABLE,
|
10
|
+
INTEGRATIONS_ASTRO_URL,
|
11
|
+
)
|
12
|
+
|
13
|
+
|
14
|
+
def get_templates(request=None) -> Sequence[str]:
|
15
|
+
files = []
|
16
|
+
|
17
|
+
for engine in django_template.loader.engines.all():
|
18
|
+
|
19
|
+
if REGISTERED_TEMPLATES_APPS:
|
20
|
+
dirs = [
|
21
|
+
d
|
22
|
+
for d in engine.template_dirs
|
23
|
+
if any(app in str(d) for app in REGISTERED_TEMPLATES_APPS)
|
24
|
+
]
|
25
|
+
else:
|
26
|
+
# Exclude pip installed site package template dirs
|
27
|
+
dirs = [
|
28
|
+
d
|
29
|
+
for d in engine.template_dirs
|
30
|
+
if "site-packages" not in str(d) or "camomilla" in str(d)
|
31
|
+
]
|
32
|
+
|
33
|
+
for d in dirs:
|
34
|
+
base = Path(d)
|
35
|
+
files.extend(relpath(f, d) for f in base.rglob("*.html"))
|
36
|
+
|
37
|
+
if INTEGRATIONS_ASTRO_ENABLE and request is not None:
|
38
|
+
try:
|
39
|
+
response = requests.get(
|
40
|
+
INTEGRATIONS_ASTRO_URL + "/api/templates",
|
41
|
+
cookies={
|
42
|
+
"sessionid": request.COOKIES.get("sessionid"),
|
43
|
+
"csrftoken": request.COOKIES.get("csrftoken"),
|
44
|
+
},
|
45
|
+
)
|
46
|
+
if response.status_code == 200:
|
47
|
+
astro_templates = response.json()
|
48
|
+
for template in astro_templates:
|
49
|
+
files.append(template)
|
50
|
+
except:
|
51
|
+
pass
|
52
|
+
|
53
|
+
return files
|
{django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/base/__init__.py
RENAMED
@@ -4,6 +4,8 @@ from ..mixins import (
|
|
4
4
|
OrderingMixin,
|
5
5
|
CamomillaBasePermissionMixin,
|
6
6
|
)
|
7
|
+
from camomilla.serializers.mixins import TranslationsMixin
|
8
|
+
from camomilla.utils.translation import plain_to_nest
|
7
9
|
from rest_framework import viewsets
|
8
10
|
from rest_framework.metadata import SimpleMetadata
|
9
11
|
from structured.contrib.restframework import StructuredJSONField
|
@@ -29,8 +31,8 @@ class BaseViewMetadata(SimpleMetadata):
|
|
29
31
|
|
30
32
|
def get_serializer_info(self, serializer):
|
31
33
|
info = super().get_serializer_info(serializer)
|
32
|
-
if
|
33
|
-
info.update(
|
34
|
+
if isinstance(serializer, TranslationsMixin) and serializer.is_translatable:
|
35
|
+
info.update(plain_to_nest(info, serializer.translation_fields))
|
34
36
|
return info
|
35
37
|
|
36
38
|
|
{django_camomilla_cms-6.0.0b18 → django_camomilla_cms-6.0.1}/camomilla/views/mixins/pagination.py
RENAMED
@@ -86,7 +86,7 @@ class PaginateStackMixin:
|
|
86
86
|
if "sqlite" in settings.DATABASES["default"]["ENGINE"]:
|
87
87
|
filter_statement = Q()
|
88
88
|
for field in search_fields:
|
89
|
-
filter_statement |= Q(**{field +
|
89
|
+
filter_statement |= Q(**{field + "__icontains": search_string})
|
90
90
|
return list_handler.filter(filter_statement)
|
91
91
|
else:
|
92
92
|
return list_handler.annotate(
|
@@ -0,0 +1,133 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: django-camomilla-cms
|
3
|
+
Version: 6.0.1
|
4
|
+
Summary: Django powered cms
|
5
|
+
Author-email: Lotrèk <dimmitutto@lotrek.it>
|
6
|
+
License: MIT
|
7
|
+
Project-URL: Homepage, https://github.com/camomillacms/camomilla-core
|
8
|
+
Keywords: cms,django,api cms
|
9
|
+
Classifier: Environment :: Web Environment
|
10
|
+
Classifier: Framework :: Django
|
11
|
+
Classifier: Intended Audience :: Developers
|
12
|
+
Classifier: Programming Language :: Python
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Requires-Python: <=3.13,>=3.8
|
15
|
+
Description-Content-Type: text/markdown
|
16
|
+
License-File: LICENSE
|
17
|
+
Requires-Dist: django-modeltranslation<=0.18.12,>=0.18.7
|
18
|
+
Requires-Dist: djsuperadmin<1.0.0,>=0.9
|
19
|
+
Requires-Dist: djangorestframework<=3.14.0,>=3.10.0
|
20
|
+
Requires-Dist: django-structured-json-field>=0.4.2
|
21
|
+
Requires-Dist: Pillow>=10.0.0
|
22
|
+
Requires-Dist: django-admin-interface<1.0.0,>=0.26.0
|
23
|
+
Requires-Dist: django-ckeditor<7.0.0,>=5.7.1
|
24
|
+
Requires-Dist: django-tinymce<5.0.0,>=4.1.0
|
25
|
+
Requires-Dist: python-magic<0.5,>=0.4
|
26
|
+
Requires-Dist: Django<6,>=3.2
|
27
|
+
Requires-Dist: django_jsonform>=2.23
|
28
|
+
Requires-Dist: inflection>=0.5.1
|
29
|
+
Requires-Dist: uritemplate>=4.1.0
|
30
|
+
Dynamic: license-file
|
31
|
+
|
32
|
+
[](https://pypi.org/project/django-camomilla-cms)
|
33
|
+
[](https://www.djangoproject.com/)
|
34
|
+
[](https://github.com/camomillacms/camomilla-core/actions)
|
35
|
+
[](https://github.com/camomillacms/camomilla-core/commits/master)
|
36
|
+
[](https://github.com/camomillacms/camomilla-core/graphs/contributors)
|
37
|
+
[](https://github.com/camomillacms/camomilla-core/issues)
|
38
|
+
[](https://app.codecov.io/gh/camomillacms/camomilla-core/tree/master/camomilla)
|
39
|
+
[](./LICENSE)
|
40
|
+
|
41
|
+
|
42
|
+
<br>
|
43
|
+
<br>
|
44
|
+
<br>
|
45
|
+
<br>
|
46
|
+
<div align="center">
|
47
|
+
<picture>
|
48
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-dark.svg?v=1">
|
49
|
+
<source media="(prefers-color-scheme: light)" srcset="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1">
|
50
|
+
<img alt="Fallback image description" src="https://camomillacms.github.io/camomilla-core/images/camomilla-logo-light.svg?v=1" style="width: 250px; height: auto;">
|
51
|
+
</picture>
|
52
|
+
</div>
|
53
|
+
<h3 align="center"">Our beloved Django CMS</h3>
|
54
|
+
<br>
|
55
|
+
|
56
|
+
## ⭐️ Features
|
57
|
+
|
58
|
+
<!-- Highlight some of the features your module provide here -->
|
59
|
+
|
60
|
+
- 🧘♀️ Built on top of the django framework
|
61
|
+
- 🥨 Beaked page abstract model to let you manage everything you need as a page.
|
62
|
+
- 🏞️ Optimized media management with autoresize
|
63
|
+
- 👯 Enable relations inside django JSONFields
|
64
|
+
- ⚡️ AutoCreate api endpoints from models
|
65
|
+
- 🚧 Enable JsonSchema directly in models endpoints
|
66
|
+
|
67
|
+
Camomilla is a Django CMS that allows you to create and manage your website's content with ease. It provides a simple and intuitive interface for managing pages, media, and other content types. Camomilla is built on top of the Django framework, which means it inherits all the features and benefits of Django framework.
|
68
|
+
We try to continuously improve Camomilla by adding new features and fixing bugs. You can check the [CHANGELOG](./CHANGELOG.md) to see what has been added in the latest releases.
|
69
|
+
|
70
|
+
## 📦 Quick Start
|
71
|
+
|
72
|
+
Here you can find some quick setup instructions to get started with Camomilla. For more detailed information, please refer to the [documentation](https://camomillacms.github.io/camomilla-core/).
|
73
|
+
|
74
|
+
> [!TIP]
|
75
|
+
>
|
76
|
+
> #### Env Virtualization 👾
|
77
|
+
>
|
78
|
+
> Use a virtualenv to isolate your project's dependencies from the system's python installation before starting. Check out [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/) for more information.
|
79
|
+
|
80
|
+
Install django-camomilla-cms and django from pip
|
81
|
+
|
82
|
+
```bash
|
83
|
+
$ pip install django
|
84
|
+
$ pip install django-camomilla-cms==6.0.0
|
85
|
+
```
|
86
|
+
|
87
|
+
Create a new django project
|
88
|
+
|
89
|
+
```bash
|
90
|
+
$ django-admin startproject <project_name>
|
91
|
+
$ cd <project_name>
|
92
|
+
```
|
93
|
+
|
94
|
+
Create a dedicated folder for camomilla migrations
|
95
|
+
|
96
|
+
```bash
|
97
|
+
$ mkdir -p camomilla_migrations
|
98
|
+
$ touch camomilla_migrations.__init__.py
|
99
|
+
```
|
100
|
+
|
101
|
+
Create migrations and prepare the database
|
102
|
+
|
103
|
+
```bash
|
104
|
+
$ python manage.py makemigrations camomilla
|
105
|
+
$ python manage.py migrate
|
106
|
+
```
|
107
|
+
|
108
|
+
Add camomilla and camomilla dependencies to your project's INSTALLED_APPS
|
109
|
+
|
110
|
+
```python
|
111
|
+
# <project_name>/settings.py
|
112
|
+
|
113
|
+
INSTALLED_APPS = [
|
114
|
+
...
|
115
|
+
'camomilla', # always needed
|
116
|
+
'camomilla.theme', # needed to customize admin interface
|
117
|
+
'djsuperadmin', # needed if you whant to use djsuperadmin for contents
|
118
|
+
'modeltranslation', # needed if your website is multilanguage (can be added later)
|
119
|
+
'rest_framework', # always needed
|
120
|
+
'rest_framework.authtoken', # always needed
|
121
|
+
...
|
122
|
+
]
|
123
|
+
```
|
124
|
+
|
125
|
+
Run the server
|
126
|
+
|
127
|
+
```bash
|
128
|
+
$ python manage.py runserver
|
129
|
+
```
|
130
|
+
|
131
|
+
## 🧑💻 How to Contribute
|
132
|
+
|
133
|
+
We welcome contributions to Camomilla! If you want to contribute, please read our [contributing guide](./CONTRIBUTING.md) for more information on how to get started.
|
@@ -120,6 +120,7 @@ django_camomilla_cms.egg-info/dependency_links.txt
|
|
120
120
|
django_camomilla_cms.egg-info/requires.txt
|
121
121
|
django_camomilla_cms.egg-info/top_level.txt
|
122
122
|
tests/__init__.py
|
123
|
+
tests/test_admin_page_form.py
|
123
124
|
tests/test_api.py
|
124
125
|
tests/test_camomilla_filters.py
|
125
126
|
tests/test_media.py
|
@@ -1,7 +1,7 @@
|
|
1
1
|
django-modeltranslation<=0.18.12,>=0.18.7
|
2
2
|
djsuperadmin<1.0.0,>=0.9
|
3
3
|
djangorestframework<=3.14.0,>=3.10.0
|
4
|
-
django-structured-json-field>=0.4.
|
4
|
+
django-structured-json-field>=0.4.2
|
5
5
|
Pillow>=10.0.0
|
6
6
|
django-admin-interface<1.0.0,>=0.26.0
|
7
7
|
django-ckeditor<7.0.0,>=5.7.1
|
@@ -9,3 +9,5 @@ django-tinymce<5.0.0,>=4.1.0
|
|
9
9
|
python-magic<0.5,>=0.4
|
10
10
|
Django<6,>=3.2
|
11
11
|
django_jsonform>=2.23
|
12
|
+
inflection>=0.5.1
|
13
|
+
uritemplate>=4.1.0
|