django-camomilla-cms 6.0.0b2__py2.py3-none-any.whl → 6.0.0b4__py2.py3-none-any.whl

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 (53) hide show
  1. camomilla/__init__.py +1 -1
  2. camomilla/apps.py +3 -0
  3. camomilla/contrib/modeltranslation/hvad_migration.py +1 -2
  4. camomilla/contrib/rest_framework/serializer.py +31 -1
  5. camomilla/dynamic_pages_urls.py +7 -1
  6. camomilla/fields/json.py +12 -9
  7. camomilla/management/commands/regenerate_thumbnails.py +0 -1
  8. camomilla/model_api.py +6 -4
  9. camomilla/models/__init__.py +5 -5
  10. camomilla/models/article.py +0 -1
  11. camomilla/models/media.py +1 -2
  12. camomilla/models/menu.py +44 -42
  13. camomilla/models/mixins/__init__.py +0 -1
  14. camomilla/models/page.py +66 -32
  15. camomilla/openapi/schema.py +27 -0
  16. camomilla/parsers.py +0 -1
  17. camomilla/serializers/fields/json.py +7 -75
  18. camomilla/serializers/mixins/__init__.py +16 -2
  19. camomilla/serializers/page.py +47 -0
  20. camomilla/serializers/user.py +2 -3
  21. camomilla/serializers/utils.py +22 -17
  22. camomilla/settings.py +21 -1
  23. camomilla/storages/optimize.py +1 -1
  24. camomilla/structured/__init__.py +90 -75
  25. camomilla/structured/cache.py +193 -0
  26. camomilla/structured/fields.py +132 -275
  27. camomilla/structured/models.py +45 -138
  28. camomilla/structured/utils.py +114 -0
  29. camomilla/templatetags/camomilla_filters.py +0 -1
  30. camomilla/theme/__init__.py +1 -1
  31. camomilla/theme/admin.py +96 -0
  32. camomilla/theme/apps.py +12 -1
  33. camomilla/translation.py +4 -2
  34. camomilla/urls.py +13 -6
  35. camomilla/utils/__init__.py +1 -1
  36. camomilla/utils/getters.py +11 -1
  37. camomilla/utils/templates.py +2 -2
  38. camomilla/utils/translation.py +9 -6
  39. camomilla/views/__init__.py +1 -1
  40. camomilla/views/articles.py +0 -1
  41. camomilla/views/contents.py +0 -1
  42. camomilla/views/decorators.py +26 -0
  43. camomilla/views/medias.py +1 -2
  44. camomilla/views/menus.py +45 -1
  45. camomilla/views/pages.py +13 -1
  46. camomilla/views/tags.py +0 -1
  47. camomilla/views/users.py +0 -2
  48. {django_camomilla_cms-6.0.0b2.dist-info → django_camomilla_cms-6.0.0b4.dist-info}/METADATA +4 -3
  49. {django_camomilla_cms-6.0.0b2.dist-info → django_camomilla_cms-6.0.0b4.dist-info}/RECORD +53 -49
  50. tests/test_api.py +1 -0
  51. {django_camomilla_cms-6.0.0b2.dist-info → django_camomilla_cms-6.0.0b4.dist-info}/LICENSE +0 -0
  52. {django_camomilla_cms-6.0.0b2.dist-info → django_camomilla_cms-6.0.0b4.dist-info}/WHEEL +0 -0
  53. {django_camomilla_cms-6.0.0b2.dist-info → django_camomilla_cms-6.0.0b4.dist-info}/top_level.txt +0 -0
camomilla/views/menus.py CHANGED
@@ -1,13 +1,19 @@
1
1
  from django.contrib.contenttypes.models import ContentType
2
+ from django.db.models import Q
2
3
  from django.http import Http404
4
+ from django.shortcuts import get_object_or_404
3
5
  from rest_framework.decorators import action
4
6
  from rest_framework.response import Response
5
7
 
6
8
  from camomilla.models import AbstractPage, Menu
9
+ from camomilla.models.page import UrlNode
7
10
  from camomilla.permissions import CamomillaBasePermissions
8
11
  from camomilla.serializers import ContentTypeSerializer, MenuSerializer
12
+ from camomilla.serializers.page import BasicUrlNodeSerializer
9
13
  from camomilla.views.base import BaseModelViewset
14
+ from camomilla.views.decorators import active_lang
10
15
 
16
+ from django.utils.translation import get_language
11
17
 
12
18
  class MenuViewSet(BaseModelViewset):
13
19
  queryset = Menu.objects.all()
@@ -15,6 +21,31 @@ class MenuViewSet(BaseModelViewset):
15
21
  permission_classes = (CamomillaBasePermissions,)
16
22
  model = Menu
17
23
 
24
+ lookup_field = "key"
25
+
26
+ def get_object(self):
27
+ queryset = self.filter_queryset(self.get_queryset())
28
+ lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field
29
+ assert lookup_url_kwarg in self.kwargs, (
30
+ "Expected view %s to be called with a URL keyword argument "
31
+ 'named "%s". Fix your URL conf, or set the `.lookup_field` '
32
+ "attribute on the view correctly."
33
+ % (self.__class__.__name__, lookup_url_kwarg)
34
+ )
35
+ filter = Q(**{self.lookup_field: self.kwargs[lookup_url_kwarg]})
36
+ if (
37
+ isinstance(self.kwargs[lookup_url_kwarg], str)
38
+ and self.kwargs[lookup_url_kwarg].isnumeric()
39
+ or isinstance(self.kwargs[lookup_url_kwarg], int)
40
+ ):
41
+ filter |= Q(pk=self.kwargs[lookup_url_kwarg])
42
+
43
+ obj = get_object_or_404(queryset, filter)
44
+ # May raise a permission denied
45
+ self.check_object_permissions(self.request, obj)
46
+
47
+ return obj
48
+
18
49
  @action(detail=False, methods=["get"], url_path="page_types")
19
50
  def page_types(self, request, *args, **kwargs):
20
51
  return Response(
@@ -37,6 +68,19 @@ class MenuViewSet(BaseModelViewset):
37
68
  return Response(
38
69
  [
39
70
  {"id": obj.pk, "name": str(obj), "url_node_id": obj.url_node.pk}
40
- for obj in content_type.model_class().objects.exclude(url_node__isnull=True)
71
+ for obj in content_type.model_class().objects.exclude(
72
+ url_node__isnull=True
73
+ )
41
74
  ]
42
75
  )
76
+
77
+ @active_lang()
78
+ @action(detail=False, methods=["get"], url_path="search_urlnode")
79
+ def search_urlnode(self, request, *args, **kwargs):
80
+ url_node = request.GET.get("q", "")
81
+ qs = UrlNode.objects.filter(permalink__icontains=url_node).order_by("permalink")
82
+ print(get_language())
83
+ return Response(BasicUrlNodeSerializer(qs, many=True).data)
84
+
85
+
86
+
camomilla/views/pages.py CHANGED
@@ -1,13 +1,25 @@
1
1
  from camomilla.models import Page
2
+ from camomilla.models.page import UrlNode
2
3
  from camomilla.permissions import CamomillaBasePermissions
3
4
  from camomilla.serializers import PageSerializer
5
+ from camomilla.serializers.page import UrlNodeSerializer
4
6
  from camomilla.views.base import BaseModelViewset
7
+ from camomilla.views.decorators import active_lang
5
8
  from camomilla.views.mixins import BulkDeleteMixin, GetUserLanguageMixin
9
+ from rest_framework.decorators import api_view
10
+ from rest_framework.response import Response
11
+ from django.shortcuts import get_object_or_404
6
12
 
7
13
 
8
14
  class PageViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):
9
-
10
15
  queryset = Page.objects.all()
11
16
  serializer_class = PageSerializer
12
17
  permission_classes = (CamomillaBasePermissions,)
13
18
  model = Page
19
+
20
+
21
+ @active_lang()
22
+ @api_view(["GET"])
23
+ def fetch_page(request, permalink=""):
24
+ node = get_object_or_404(UrlNode, permalink=f"/{permalink}")
25
+ return Response(UrlNodeSerializer(node, context={"request": request}).data)
camomilla/views/tags.py CHANGED
@@ -6,7 +6,6 @@ from camomilla.views.mixins import BulkDeleteMixin, GetUserLanguageMixin
6
6
 
7
7
 
8
8
  class TagViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):
9
-
10
9
  queryset = Tag.objects.all()
11
10
  serializer_class = TagSerializer
12
11
  permission_classes = (CamomillaBasePermissions,)
camomilla/views/users.py CHANGED
@@ -27,7 +27,6 @@ class CamomillaObtainAuthToken(ObtainAuthToken):
27
27
 
28
28
 
29
29
  class UserViewSet(BaseModelViewset):
30
-
31
30
  queryset = get_user_model().objects.all()
32
31
  serializer_class = UserSerializer
33
32
  model = get_user_model()
@@ -55,7 +54,6 @@ class UserViewSet(BaseModelViewset):
55
54
 
56
55
 
57
56
  class PermissionViewSet(BaseModelViewset):
58
-
59
57
  queryset = Permission.objects.all()
60
58
  serializer_class = PermissionSerializer
61
59
  model = Permission
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-camomilla-cms
3
- Version: 6.0.0b2
3
+ Version: 6.0.0b4
4
4
  Summary: Django powered cms
5
5
  Home-page: https://github.com/lotrekagency/camomilla
6
6
  Author: Lotrèk
@@ -15,15 +15,16 @@ Classifier: Programming Language :: Python :: 3
15
15
  Requires-Python: >=3.6
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: django-modeltranslation (>=0.18.7)
18
+ Requires-Dist: django-modeltranslation (~=0.18.11)
19
19
  Requires-Dist: djsuperadmin (<1.0.0,>=0.9)
20
20
  Requires-Dist: djangorestframework (<4.0.0,>=3.10.0)
21
21
  Requires-Dist: django-admin-interface (<1.0.0,>=0.26.0)
22
22
  Requires-Dist: Pillow (<10.0.0,>=6.2.0)
23
23
  Requires-Dist: django-ckeditor (<7.0.0,>=5.7.1)
24
24
  Requires-Dist: python-magic (<0.5,>=0.4)
25
- Requires-Dist: jsonmodels (==2.6.0)
25
+ Requires-Dist: django-jsonform (~=2.19.0)
26
26
  Requires-Dist: Django (>=3.2)
27
+ Requires-Dist: pydantic (~=2.2.1)
27
28
 
28
29
  # camomilla django cms [![PyPI](https://img.shields.io/pypi/v/django-camomilla-cms?style=flat-square)](https://pypi.org/project/django-camomilla-cms) ![Codecov](https://img.shields.io/codecov/c/github/lotrekagency/camomilla?style=flat-square) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/lotrekagency/camomilla/Test,%20Coverage%20and%20Release?style=flat-square) [![GitHub](https://img.shields.io/github/license/lotrekagency/camomilla?style=flat-square)](./LICENSE)
29
30
 
@@ -1,57 +1,59 @@
1
- camomilla/__init__.py,sha256=o_zP_Srt7THBKad0fh0HTnXRBssYMAHpKIWuktfPGFM,110
1
+ camomilla/__init__.py,sha256=wVhoGvi01rvXZOw0ziUQNg1TXbgdk1Z-4cFT16iGgj4,110
2
2
  camomilla/admin.py,sha256=lfQqY_puhUkTXDQWGbhX9a0hosMo6UlX3K-BvgB-2a4,2404
3
- camomilla/apps.py,sha256=d5S4CdHc25ot1DxOqAmKjfxyZyiKcj3aF5TgCdDfGBg,497
3
+ camomilla/apps.py,sha256=hjfJBL47JqX3Z8D2Okzmw0jtbVPAInB2fYQVNzszyko,605
4
4
  camomilla/authentication.py,sha256=jz6tQT4PPEu-_JLox1LZrOy7EiWBb9MWaObK63MJGus,855
5
5
  camomilla/context_processors.py,sha256=cGowjDZ-oDGYn1j2Pj5QDGCqnzXAOdOwp5dmzin_FTc,165
6
6
  camomilla/defaults.py,sha256=VNQ_sbxu09AyFGNpUUYypIAyhlBhEORD36BBNj7e73I,1220
7
- camomilla/dynamic_pages_urls.py,sha256=y3P22_aAUJfAaLBBhSkpew3WU3lm4ysOrTuAIyMPbdM,605
7
+ camomilla/dynamic_pages_urls.py,sha256=VC1cESk6SS7ixsq6-LevnpPOk1Xjphhd4r3vzvy17O0,781
8
8
  camomilla/exceptions.py,sha256=gLniAsK_pmsNNKGMv5Z384LXVbM8oeHcOwz4F91u1LY,111
9
- camomilla/model_api.py,sha256=yIxGgofQ_dfcMDRUYsm2GKEXfZa2LBG8hfCPSofdAqA,2222
10
- camomilla/parsers.py,sha256=H6AicoSYeldGYgJcak0JKnjso07lOC9F4vHaMrxhQ3U,1976
9
+ camomilla/model_api.py,sha256=VC3tNQucS3-KVtdZNWkkbkJn8vtl_cBKYTcC3QU6PpU,2253
10
+ camomilla/parsers.py,sha256=fL8XGCGPxJIZNZkPdGtnPSbDP-6-yzGOCVMuLPjkx9Y,1975
11
11
  camomilla/permissions.py,sha256=9NlBO4JMmg36vXCUjPNyq6uZxhkdrnXyIbJVLtWhGWE,1813
12
- camomilla/settings.py,sha256=8xrmRdBlCfILF6DcsFY8xRStpRaA_xjT1Bg13AWUHPc,2699
13
- camomilla/translation.py,sha256=HxyNLTjPdXHfZFK24gbZKaww684G6bxtTvOR-cr9gAg,1261
14
- camomilla/urls.py,sha256=ZZ5AP5nJuvQzNzY6_enmFIH3mNaBtgn4AsLPJ9CiH30,2026
12
+ camomilla/settings.py,sha256=T9lJB8qagQ1lLknmrFA-Mo46yxZbZuPhevd3IBE-D7Y,3294
13
+ camomilla/translation.py,sha256=IDoC48xhH49lFAbOq19kOskgjECv4kRCm7bEI80jOL4,1260
14
+ camomilla/urls.py,sha256=YFUYcPuvnNSTnfJa_JByRWAPLgc4_R4LgqCMrmkbFpE,2217
15
15
  camomilla/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  camomilla/contrib/modeltranslation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- camomilla/contrib/modeltranslation/hvad_migration.py,sha256=9hFAY4vmLBgAoImbDg4Os3eO8InKASnANs9TCKL83Dg,4883
17
+ camomilla/contrib/modeltranslation/hvad_migration.py,sha256=e4628zm8Z1VYOuqheLg4aD_NF8gqtkQDxpTmdtDid2o,4882
18
18
  camomilla/contrib/rest_framework/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- camomilla/contrib/rest_framework/serializer.py,sha256=7ttB4pPsfR6tuf0o_l1iNGhP5Djp9owkCKbu9mwSoJI,2834
19
+ camomilla/contrib/rest_framework/serializer.py,sha256=3Hmzl2F6lpfUzEfN4lXypgNbKEUdWcer9Et8VMy_2Fo,4105
20
20
  camomilla/fields/__init__.py,sha256=VTCKK0PsJxpcgWrcqPYtWaSFhOOO2ZL56UIdla2IxF8,400
21
- camomilla/fields/json.py,sha256=WIdGgFqNH9B72tB1f_kl3ckgvI61pqkvq6iZ49ck8Bw,1867
21
+ camomilla/fields/json.py,sha256=tWEDn6kwTP6pNB53djxuVPu2d57m9cIDc4ccCEfUbDQ,1938
22
22
  camomilla/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  camomilla/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- camomilla/management/commands/regenerate_thumbnails.py,sha256=M_Lqk5yxoG0TwVmcKWqCFPFJPcdnL4OgqLXui-UFdm8,497
25
- camomilla/models/__init__.py,sha256=q1u-mMaKNfXpZSzBzN6nlcvguXrCTDDt0sgGIMBezYI,151
26
- camomilla/models/article.py,sha256=dYspOAX3bCFK8SU31XbDAVOp0vAKFC-x0Q5yUJPgHVE,1194
24
+ camomilla/management/commands/regenerate_thumbnails.py,sha256=pKToASR8p8TJezGpFfuylsAHtriNueJ7xqJJxq55adY,496
25
+ camomilla/models/__init__.py,sha256=y7Q34AGhQ1weJUKWb6XjiyUbwRnJeylOBGMErU0wqYg,147
26
+ camomilla/models/article.py,sha256=LgkZgRsubtDV6NwBz8E2bIgKD6H3I-1QLAxEan5TYYs,1139
27
27
  camomilla/models/content.py,sha256=mIgtifb_WMIt58we5u6qWZemHvuDN1zZaBeCyzHL78A,956
28
- camomilla/models/media.py,sha256=HTp07uFeMlaZnLC0NRWfOpj1WaG-EuZHv6Nk1_P29hI,6909
29
- camomilla/models/menu.py,sha256=SBS_Chex990QkSLXuNN9vesAsGlR4ZGq1AosuAlHAAA,2901
30
- camomilla/models/page.py,sha256=rSYUkpynXgKTaPl2hvCregthk7rdskax-OfNOxUBL7g,12438
31
- camomilla/models/mixins/__init__.py,sha256=jHJz4yzUMCGvcUygQhh9ffqQ_bCiM8NeUyBTR-NLFIc,1249
28
+ camomilla/models/media.py,sha256=7TD_0nhNoi8P-Gmsr0Kag4eGaxMXuTfQOFl53Mb03cQ,6854
29
+ camomilla/models/menu.py,sha256=GdywN50yp7ezXzy8SF8P-W3ejey31ZPlJYp2cEM38Uk,2835
30
+ camomilla/models/page.py,sha256=25KnH1SRXtM2hzX6Sv-8MW8XgIWCcB4AQWhRy4l_FKQ,13375
31
+ camomilla/models/mixins/__init__.py,sha256=c2NixqvrIX4E9WGRqQbylXlqBWDXEqN9mzs_dpB0hFQ,1248
32
32
  camomilla/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- camomilla/openapi/schema.py,sha256=Bgr5GQlYxkvayhD3_EAprUZ-OssFdGovf1rhyH6Xl8U,1087
33
+ camomilla/openapi/schema.py,sha256=Drua3rV_ME4nGWvqe-ZwuABnheTaUyB4Io7z3cCmSCM,2116
34
34
  camomilla/serializers/__init__.py,sha256=8v1GsJ_YZ6T72VnKBb5l-8K93oaLf4PIsMt-yFtK-Gk,176
35
35
  camomilla/serializers/article.py,sha256=pYVcS0KztzjzSqgruElQMMEZcqTzmQUqXrdv_Sx5Az4,401
36
36
  camomilla/serializers/content_type.py,sha256=qB2wkmkvQI6LHxfSI6auEh6M9cJRFBaHnpmkBCCzeYo,557
37
37
  camomilla/serializers/media.py,sha256=H4JVpRVxXVmn_BiqrjihKXpfLm9fLmHDFIICRDGJU4s,1940
38
38
  camomilla/serializers/menu.py,sha256=TdoyXs40PqxNevnRbBbYOOX9rUv9zQGiHFNduspaZnw,552
39
- camomilla/serializers/page.py,sha256=4NicarwzBVilR75SFuXUzA_4Jmmy7aqFuHlPqgNV7Mg,405
40
- camomilla/serializers/user.py,sha256=ud7G2umFjBNi3JccwxHt9XcwgyilmUAT_tBnd2hZqBs,3707
41
- camomilla/serializers/utils.py,sha256=e3JoJ4kNI4jLBzQPNoNqXYRHAaANbvAj9Kufy-VYc1o,875
39
+ camomilla/serializers/page.py,sha256=NNjEypVYu_9iKqdHV_-61ea37gxiHlDP5gsloV_i6yg,1834
40
+ camomilla/serializers/user.py,sha256=CzrHiVRvYYWNE4eNpCNKtJB7DjVqHHwIcP4NUBXMHSo,3706
41
+ camomilla/serializers/utils.py,sha256=FgO6Eov6rtrLwuZT0QWGSSvLeMmDm6gYK7uFON6qP1c,1000
42
42
  camomilla/serializers/validators.py,sha256=QtlmGyJiKaKyMBqBZ1W2VAjCoLi1vhPUnLOo7DvZpsM,1775
43
43
  camomilla/serializers/base/__init__.py,sha256=RTEHkJttqlxZjKpD75kTYIH42wlBtQI8hhPPb8r-NLw,488
44
44
  camomilla/serializers/fields/__init__.py,sha256=6JX3Dt4mmVXEQy2XN48zzuKyOQOfPgAhBdH6AeED0kk,528
45
45
  camomilla/serializers/fields/file.py,sha256=QRSPhEAB_snT0IyjtKZQk8bKKHmT9hMNB9udzbc_nVw,648
46
- camomilla/serializers/fields/json.py,sha256=lC6kY-xoIi3Kvn4zpaLx6fdNc79nTD0wNAVRIlBvCSE,3474
46
+ camomilla/serializers/fields/json.py,sha256=5bTAODaTzFj_B9w-BN2c2iXoUF0hrnOz-dzebkZN4TQ,968
47
47
  camomilla/serializers/fields/related.py,sha256=Y2SnGWGDAUr3H-Ku7_YQYzbEIXUlsFqw69NCGVEpxSU,4402
48
- camomilla/serializers/mixins/__init__.py,sha256=xc8jznt-dzAEbhPCIKg50jHMOfXOkQpKHIUqsFRE2r0,5503
48
+ camomilla/serializers/mixins/__init__.py,sha256=WHtxyux5CTnpwwWq-zto7K0-GgE1RHTzUC_pKgkLxas,6193
49
49
  camomilla/storages/__init__.py,sha256=ytGgX59Ar8vFfYz7eV8z-j5yO_5FqxdZM25iyLnJuSA,131
50
- camomilla/storages/optimize.py,sha256=0TcYhCchzo45meV_Yy2SC2eNzhvAEGm17Co9QUQnX0Q,1997
50
+ camomilla/storages/optimize.py,sha256=WPFAkMCXub6u68kNsZKpbeqTPDqRlNef534C0DSuOws,2007
51
51
  camomilla/storages/overwrite.py,sha256=CO_zSZxr321eohYFuzPjDMK7WMFnvvwlIigIPabU_eE,343
52
- camomilla/structured/__init__.py,sha256=tSCuYktpSy6Fa5xZbwrNLwAdZvK0mILGHFa0bqVC9Qw,3957
53
- camomilla/structured/fields.py,sha256=xUVE6TRzeJtkVnGmaZryDN_JhOZnlRrgA3qm46EnV8Q,8475
54
- camomilla/structured/models.py,sha256=aBsjWukkC5CWCf3lghQD66ikS312eeTE88Vf88DGdD0,4759
52
+ camomilla/structured/__init__.py,sha256=85GQW6KtzgBQVZlbNHbmkzDqjvK1zglXvuFpv_-JJcU,4163
53
+ camomilla/structured/cache.py,sha256=SJSefLcB86Axvpj8xB9O_IJA2G7jmYhZmbjYR80fgJ8,7589
54
+ camomilla/structured/fields.py,sha256=Pd9J9yxiHmB4xJqlpAQQB_gZqkVPJiIh0aXexJhsfY0,5295
55
+ camomilla/structured/models.py,sha256=us03rOU2VtdhH4MMHIGkb11Wr6ItxPmB7ZUL1QepWmg,1790
56
+ camomilla/structured/utils.py,sha256=h-cfkyGyBKZjZFA53UBbTA7nHAoCN1iKIJBz0ka5_pg,3446
55
57
  camomilla/templates/admin/camomilla/page/change_form.html,sha256=ig7rRUtylDZMINBQuVPpZLmeB4sOTV_VtqnTgzAyxEo,251
56
58
  camomilla/templates/defaults/base.html,sha256=pklt7Pif3g9d7gwgRxCQj7gniJaHD14ZqZID_xIlC0A,6638
57
59
  camomilla/templates/defaults/articles/default.html,sha256=1f89jBvNtTa1mPAbC91yy8CzeAjTWO3hhQsTuQW5OKg,239
@@ -60,10 +62,11 @@ camomilla/templates/defaults/parts/langswitch.html,sha256=i1w5PajZg5aD_lWuuTNBu6
60
62
  camomilla/templates/defaults/parts/menu.html,sha256=KBgXv23dCWW0XM16R5fT0_g-w_qudVfcF-CYSdwl83s,338
61
63
  camomilla/templates/defaults/widgets/media_select_multiple.html,sha256=k2XYou8KkPuFLnPMkPJAFJ-zGJj2Xvu6R3ZmiKa3g7Q,3727
62
64
  camomilla/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
- camomilla/templatetags/camomilla_filters.py,sha256=NfqXWWr-R6MGzVKExKh9diysr6s-jQ_mNAQv4kNO4n4,563
65
+ camomilla/templatetags/camomilla_filters.py,sha256=iOk0sDkdKz5pRuRCocwd_oelaqETAla1kS3siV8ciEE,513
64
66
  camomilla/templatetags/menus.py,sha256=pLFeJ1UAm3flsU9TNo2iQk4otSwZuJPr86Nf408dZ-8,862
65
- camomilla/theme/__init__.py,sha256=oZT3gnasceSZZSACP6NHxA1VLHu3p_tFSj9D_8V0ipw,29
66
- camomilla/theme/apps.py,sha256=L7kMmHEdC9jMdIGPmOUiDd2HMJUVR7RiK0U1Mi6uGFo,991
67
+ camomilla/theme/__init__.py,sha256=PN8A2DB_Z51bzNjN_K5b4hSZNT8fYVdu5odxsFxn7Vg,29
68
+ camomilla/theme/admin.py,sha256=gDSPLAIomp2PqYMb-xNrt-O1rxxTJjHVs4p6Z9G1kpU,2468
69
+ camomilla/theme/apps.py,sha256=_DXntnVQoASOjta2L7_nvTPBXIACASISDITxIGj5rGs,1257
67
70
  camomilla/theme/static/admin/css/responsive.css,sha256=yGq6qXrr8xEVsXTnprIBgkX-sMGZrNf0Kkh-xDxf6yE,157
68
71
  camomilla/theme/static/admin/img/favicon.ico,sha256=qpKv_2MaGILvyihnD1Vq9Yk-ZXGkxWTW26ciMeBFMYU,15406
69
72
  camomilla/theme/static/admin/img/logo.png,sha256=vvC1YE6QgQ1A8i6hRy6ksj3R2HbwNA4jM8qRLaKKTDo,18821
@@ -71,33 +74,34 @@ camomilla/theme/static/admin/img/logo.svg,sha256=WBAORIV_LzEOdcpq7iU6d0Nu3omgk2g
71
74
  camomilla/theme/templates/admin/base.html,sha256=veKZ6KlnUYILeY4I2MYI18BbZMDec9MgzVzUqCHnjDc,254
72
75
  camomilla/theme/templates/admin/base_site.html,sha256=Qlb_J7Erpu7oNSLjjQLWciDUoZLEAE49ASw5g2u4g-I,585
73
76
  camomilla/theme/templates/rosetta/base.html,sha256=s9Ijf1nZx8um30R5Gk3g-w-RwFGv2QGViHufyLLiiDY,16731
74
- camomilla/utils/__init__.py,sha256=fu43Z8Rdj7xPl1kEIJgh8IM6wnvjFlCgwRIvDuBEmm4,99
75
- camomilla/utils/getters.py,sha256=Tv3LhtZB5mATwHWW7Id88Ox9wkn1kYpLQ5sZecH2Pyc,520
77
+ camomilla/utils/__init__.py,sha256=Ui7nzSh45UMMFtCGF1xFHKyJMNWflG_Nx72HAJHJHFM,100
78
+ camomilla/utils/getters.py,sha256=6j18grFAZ8BC70SriycFDTQFxTnudGn0uKGA83_Rclk,798
76
79
  camomilla/utils/normalization.py,sha256=RDCZtjwpEEwjvfUjQl2bEWFKw7NxTzkXco72VeO2M9w,255
77
80
  camomilla/utils/seo.py,sha256=8p_a_TGgohenpJb094tT4mMxbn2xzW0qDILuTnjNocM,3324
78
- camomilla/utils/templates.py,sha256=aEObnrTnBzwxYJd9s2ejCLZZRcRe4vVBzuDf5zFBEwI,598
79
- camomilla/utils/translation.py,sha256=ZSGslSHHf252ZIYRYEcLmranrP0lhHnj2ztByB_UNbM,2426
80
- camomilla/views/__init__.py,sha256=Wk5HScmUCOS4kW65eGwpNgiX410TcyekIQHcFfX2Knk,177
81
- camomilla/views/articles.py,sha256=QQ7-DoYoj4wNl1EZcxqvTc8FmsQj12E6COcAeekMI_4,572
82
- camomilla/views/contents.py,sha256=LAWZ400fuj8v0Ml86T2BxleZmdCIn5Fubom3I1jb_Qc,1206
81
+ camomilla/utils/templates.py,sha256=Lv4-5019cnM30HmdZnYWiU5gxry-eFZVAhwOofGQRDs,598
82
+ camomilla/utils/translation.py,sha256=keld4EWIuMRWOuvnPGs2yGPsU5rln9WxAiA-Y_fqag8,2463
83
+ camomilla/views/__init__.py,sha256=94QuOnnbfMMb17mruO2ydUt286-8zBmDxEPWrJv5Wog,178
84
+ camomilla/views/articles.py,sha256=qGxebOA5iTbGGe9PfbH40YBoDPKktH8FJongg6rh2R8,571
85
+ camomilla/views/contents.py,sha256=JxvnmgeK8JEmCMLzVG8pVq2DwvmjXtgnIdsDnn74tA4,1205
86
+ camomilla/views/decorators.py,sha256=_YptU9Hpe-LQYDi2hztr14OVwBwDC3zTP948pqA2vb8,978
83
87
  camomilla/views/languages.py,sha256=Rt_X7s3dbDBv4dxsQ9fnav_u0TAzzo8fGKBBx3esDsg,441
84
- camomilla/views/medias.py,sha256=qA6GNZM7Wae7g0FklGusaBBL9utTVa_vWHZ8txZARoI,3002
85
- camomilla/views/menus.py,sha256=h6ps221OyfcBL4gnqeA3MHCY10D2693n1umtZADoWOE,1686
86
- camomilla/views/pages.py,sha256=dKmjNKCyHv-s1PWaJijT4skqgpOOAWDKYUNJEqr3EOg,486
87
- camomilla/views/tags.py,sha256=EkeTPLeqd2XIrZjqK0FnaXTCqX4F3KYrc2JFzZUyJnw,480
88
- camomilla/views/users.py,sha256=PNMvqrRPZEqAsGjI-3JCcFLt-rzEfrXOsjrC5qG9Q9g,3132
88
+ camomilla/views/medias.py,sha256=S4Ak4JI6XCSu3BCZx8KOotX7TBfrIU82GPXgyP3KcZA,3001
89
+ camomilla/views/menus.py,sha256=8ddc4ezGvuOgYkC5aElWpPOUIELbCFZ32O2c7-aKD_U,3408
90
+ camomilla/views/pages.py,sha256=KrBsKT0Z-rkBha8K3P6fVDt4vArQBxsc9rZ28j8XW9w,994
91
+ camomilla/views/tags.py,sha256=XcYRlcBFSPPY32lt7POb6fWPJL_8HsTo5JcHcAOiOKw,479
92
+ camomilla/views/users.py,sha256=_fvsKOEtep4SJLvMva2_q-HdLQT_1KlFNt4wcl3xCJk,3130
89
93
  camomilla/views/base/__init__.py,sha256=S7KGhVzHM7f0j8XD7cbBY5__66zvKYkphRD9cfl0O1E,222
90
94
  camomilla/views/mixins/__init__.py,sha256=GeRoznX3wTm6XydOltAIbx_WU7hVS70R-7jyAck0UpE,2438
91
95
  camomilla/views/mixins/ordering.py,sha256=mh7fqPyVCVJh84Nl2pYFQouzGxa-ANF3Wqv0pCb7OVU,4779
92
96
  camomilla/views/mixins/pagination.py,sha256=vUkfhqhTabeDdoiMwjeVpO6gl534EI0JMrr4TlZ8MRA,5956
93
97
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
- tests/test_api.py,sha256=LW58Ck3_SGmzU6yNenmfMKyZQ62hcktJr-vvEHCX__I,2347
98
+ tests/test_api.py,sha256=jn8mUz8S3FxgLE_FX3ETrfhzRVdwMhOh17PFgUWrrB0,2348
95
99
  tests/test_camomilla_filters.py,sha256=_W9CcwsEyewMBvnNYKk4CVqrkXxRYejle3mjiBS7hqk,1848
96
100
  tests/test_models.py,sha256=WJs8lxWZWn1l7X3a_QFVc8fF5LHTsI8bc3uhQe6-o-Q,684
97
101
  tests/test_utils.py,sha256=0tdEDBaBkyjAXpbqP0SpFcfgO56MV2TWZmk9xpjR7J0,3613
98
102
  tests/urls.py,sha256=yCnalWqGClQOCrrbHtIj175aC1ufE6QfhSqT0aoWyjA,562
99
- django_camomilla_cms-6.0.0b2.dist-info/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
100
- django_camomilla_cms-6.0.0b2.dist-info/METADATA,sha256=R5iI5JkF8jBG-NRoNEjfFIlZEMF1LHmr4jCTrgMy8Oo,2382
101
- django_camomilla_cms-6.0.0b2.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
102
- django_camomilla_cms-6.0.0b2.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
103
- django_camomilla_cms-6.0.0b2.dist-info/RECORD,,
103
+ django_camomilla_cms-6.0.0b4.dist-info/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
104
+ django_camomilla_cms-6.0.0b4.dist-info/METADATA,sha256=A2xAcnCXQr50lGJVZ2wbn0lpVv-UgHhDl2g-5oQl_yk,2423
105
+ django_camomilla_cms-6.0.0b4.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
106
+ django_camomilla_cms-6.0.0b4.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
107
+ django_camomilla_cms-6.0.0b4.dist-info/RECORD,,
tests/test_api.py CHANGED
@@ -3,6 +3,7 @@ from django.contrib.auth.models import User
3
3
  from rest_framework.test import APIClient
4
4
 
5
5
  from camomilla.models import Tag
6
+
6
7
  client = APIClient()
7
8
 
8
9