django-camomilla-cms 6.0.0b16__py2.py3-none-any.whl → 6.0.0b18__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.
- camomilla/__init__.py +1 -1
- camomilla/contrib/modeltranslation/hvad_migration.py +9 -9
- camomilla/dynamic_pages_urls.py +6 -2
- camomilla/managers/pages.py +87 -2
- camomilla/model_api.py +6 -4
- camomilla/models/menu.py +9 -4
- camomilla/models/page.py +178 -117
- camomilla/openapi/schema.py +15 -10
- camomilla/redirects.py +10 -0
- camomilla/serializers/base/__init__.py +4 -4
- camomilla/serializers/fields/__init__.py +5 -17
- camomilla/serializers/fields/related.py +5 -3
- camomilla/serializers/mixins/__init__.py +23 -240
- camomilla/serializers/mixins/fields.py +20 -0
- camomilla/serializers/mixins/filter_fields.py +9 -8
- camomilla/serializers/mixins/json.py +34 -0
- camomilla/serializers/mixins/language.py +32 -0
- camomilla/serializers/mixins/nesting.py +35 -0
- camomilla/serializers/mixins/optimize.py +91 -0
- camomilla/serializers/mixins/ordering.py +34 -0
- camomilla/serializers/mixins/page.py +58 -0
- camomilla/{contrib/rest_framework/serializer.py → serializers/mixins/translation.py} +16 -56
- camomilla/serializers/utils.py +3 -3
- camomilla/serializers/validators.py +6 -2
- camomilla/settings.py +16 -2
- camomilla/storages/default.py +7 -1
- camomilla/templates/defaults/base.html +60 -4
- camomilla/templates/defaults/parts/menu.html +1 -1
- camomilla/templatetags/menus.py +3 -0
- camomilla/templatetags/model_extras.py +73 -0
- camomilla/theme/__init__.py +1 -1
- camomilla/theme/{admin.py → admin/__init__.py} +22 -20
- camomilla/theme/admin/pages.py +46 -0
- camomilla/theme/admin/translations.py +13 -0
- camomilla/theme/apps.py +2 -5
- camomilla/translation.py +7 -1
- camomilla/urls.py +2 -5
- camomilla/utils/query_parser.py +42 -23
- camomilla/utils/templates.py +23 -10
- camomilla/utils/translation.py +47 -5
- camomilla/views/base/__init__.py +35 -5
- camomilla/views/medias.py +1 -1
- camomilla/views/mixins/__init__.py +17 -76
- camomilla/views/mixins/bulk_actions.py +22 -0
- camomilla/views/mixins/language.py +33 -0
- camomilla/views/mixins/optimize.py +18 -0
- camomilla/views/mixins/pagination.py +11 -8
- camomilla/views/mixins/permissions.py +6 -0
- camomilla/views/pages.py +12 -2
- {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/METADATA +23 -16
- {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/RECORD +63 -45
- {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/WHEEL +1 -1
- tests/test_camomilla_filters.py +1 -1
- tests/test_media.py +98 -65
- tests/test_menu.py +97 -0
- tests/test_model_api_register.py +393 -0
- tests/test_pages.py +343 -0
- tests/test_query_parser.py +1 -2
- tests/test_templates_context.py +111 -0
- tests/utils/api.py +0 -1
- tests/utils/media.py +10 -0
- camomilla/contrib/rest_framework/__init__.py +0 -0
- camomilla/serializers/fields/json.py +0 -48
- {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info/licenses}/LICENSE +0 -0
- {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/top_level.txt +0 -0
@@ -1,38 +1,37 @@
|
|
1
|
-
camomilla/__init__.py,sha256=
|
1
|
+
camomilla/__init__.py,sha256=rVNwuy2J-skWorDHQHY5RbR836EfOwG8yJmEDdWPZEE,251
|
2
2
|
camomilla/apps.py,sha256=eUwb9ynyiRAc5OXgt7ZsAdhsCOnPCpNdIFYMheNeN-o,532
|
3
3
|
camomilla/authentication.py,sha256=jz6tQT4PPEu-_JLox1LZrOy7EiWBb9MWaObK63MJGus,855
|
4
4
|
camomilla/context_processors.py,sha256=cGowjDZ-oDGYn1j2Pj5QDGCqnzXAOdOwp5dmzin_FTc,165
|
5
5
|
camomilla/defaults.py,sha256=VNQ_sbxu09AyFGNpUUYypIAyhlBhEORD36BBNj7e73I,1220
|
6
|
-
camomilla/dynamic_pages_urls.py,sha256=
|
6
|
+
camomilla/dynamic_pages_urls.py,sha256=wd52ktpY_LH24jTW77vII7XZ25p_Kz5MSjes8s_94-A,1278
|
7
7
|
camomilla/exceptions.py,sha256=gLniAsK_pmsNNKGMv5Z384LXVbM8oeHcOwz4F91u1LY,111
|
8
|
-
camomilla/model_api.py,sha256
|
8
|
+
camomilla/model_api.py,sha256=-7l3fc2eN1itCMzkWA8nFaQXMmz0vs7IlGlShF-gSuo,2487
|
9
9
|
camomilla/parsers.py,sha256=fL8XGCGPxJIZNZkPdGtnPSbDP-6-yzGOCVMuLPjkx9Y,1975
|
10
10
|
camomilla/permissions.py,sha256=9NlBO4JMmg36vXCUjPNyq6uZxhkdrnXyIbJVLtWhGWE,1813
|
11
|
-
camomilla/
|
11
|
+
camomilla/redirects.py,sha256=ilcyHidb5Iw3jTrXMnPntr50kkl_WB3QOB0VNkIxP7A,263
|
12
|
+
camomilla/settings.py,sha256=V9rf42MSAwJoGlJS-yAW5pzgGcu5J1g7rrVCAmRtMJU,3763
|
12
13
|
camomilla/sitemap.py,sha256=U2t5TwhB_-sEscmQZ69PZ5st3bIap8NRxzWEvCgB130,786
|
13
|
-
camomilla/translation.py,sha256
|
14
|
-
camomilla/urls.py,sha256=
|
14
|
+
camomilla/translation.py,sha256=_QyfTlKG6hQ_ClRfxzeJ-3oI3Nu5peJN9xFkO9Ib3As,1316
|
15
|
+
camomilla/urls.py,sha256=XgaeFoG2eXlJQve3KmFKlD-74CMLW1ziaY1mq-lrAiA,2095
|
15
16
|
camomilla/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
16
17
|
camomilla/contrib/modeltranslation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
-
camomilla/contrib/modeltranslation/hvad_migration.py,sha256=
|
18
|
-
camomilla/contrib/rest_framework/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
19
|
-
camomilla/contrib/rest_framework/serializer.py,sha256=G6SKes-8RkJKDupCNN0B2B1BQuYqS0y820oGYotxPcY,5924
|
18
|
+
camomilla/contrib/modeltranslation/hvad_migration.py,sha256=3j_q_Q85eF4iHbU4LG1Zr3LOmfmGmFiVSL-C8KvPsJQ,5409
|
20
19
|
camomilla/fields/__init__.py,sha256=gKrJwHvUA3q_wu-OVV0hrRZmFkT4znMHrmZtpriDumw,323
|
21
20
|
camomilla/fields/json.py,sha256=tWEDn6kwTP6pNB53djxuVPu2d57m9cIDc4ccCEfUbDQ,1938
|
22
21
|
camomilla/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
22
|
camomilla/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
24
23
|
camomilla/management/commands/regenerate_thumbnails.py,sha256=pKToASR8p8TJezGpFfuylsAHtriNueJ7xqJJxq55adY,496
|
25
24
|
camomilla/managers/__init__.py,sha256=Zwp28E1RKafIl0FqcUi1YNHxF19IsMIvhlhS-Njg9Mw,60
|
26
|
-
camomilla/managers/pages.py,sha256=
|
25
|
+
camomilla/managers/pages.py,sha256=DYV1i5vPgxn1YzJlY3kSlsVCRgsiojLxjs2O0LylxEI,3925
|
27
26
|
camomilla/models/__init__.py,sha256=y7Q34AGhQ1weJUKWb6XjiyUbwRnJeylOBGMErU0wqYg,147
|
28
27
|
camomilla/models/article.py,sha256=LgkZgRsubtDV6NwBz8E2bIgKD6H3I-1QLAxEan5TYYs,1139
|
29
28
|
camomilla/models/content.py,sha256=mIgtifb_WMIt58we5u6qWZemHvuDN1zZaBeCyzHL78A,956
|
30
29
|
camomilla/models/media.py,sha256=pD-qldiHDOOHgux4lsivQLBcOJJrRx3a4Bg8ODNx7r0,6852
|
31
|
-
camomilla/models/menu.py,sha256=
|
32
|
-
camomilla/models/page.py,sha256=
|
30
|
+
camomilla/models/menu.py,sha256=hUszPcn1prWCDhk4RPvbITmyhsB2CjFkaerx9t1GWnc,3766
|
31
|
+
camomilla/models/page.py,sha256=lkZPdPkl8Yxpz_NfYrpr7Myp8hB3bEAGtdJwKBR7_cg,19385
|
33
32
|
camomilla/models/mixins/__init__.py,sha256=c2NixqvrIX4E9WGRqQbylXlqBWDXEqN9mzs_dpB0hFQ,1248
|
34
33
|
camomilla/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
-
camomilla/openapi/schema.py,sha256=
|
34
|
+
camomilla/openapi/schema.py,sha256=C22dhKjaJ2DTK4KWFjyMJXiwe8NLy7ZTW5d-I1dqZ7g,2546
|
36
35
|
camomilla/serializers/__init__.py,sha256=8v1GsJ_YZ6T72VnKBb5l-8K93oaLf4PIsMt-yFtK-Gk,176
|
37
36
|
camomilla/serializers/article.py,sha256=pYVcS0KztzjzSqgruElQMMEZcqTzmQUqXrdv_Sx5Az4,401
|
38
37
|
camomilla/serializers/content_type.py,sha256=qB2wkmkvQI6LHxfSI6auEh6M9cJRFBaHnpmkBCCzeYo,557
|
@@ -40,35 +39,45 @@ camomilla/serializers/media.py,sha256=H4JVpRVxXVmn_BiqrjihKXpfLm9fLmHDFIICRDGJU4
|
|
40
39
|
camomilla/serializers/menu.py,sha256=TdoyXs40PqxNevnRbBbYOOX9rUv9zQGiHFNduspaZnw,552
|
41
40
|
camomilla/serializers/page.py,sha256=NNjEypVYu_9iKqdHV_-61ea37gxiHlDP5gsloV_i6yg,1834
|
42
41
|
camomilla/serializers/user.py,sha256=CzrHiVRvYYWNE4eNpCNKtJB7DjVqHHwIcP4NUBXMHSo,3706
|
43
|
-
camomilla/serializers/utils.py,sha256=
|
44
|
-
camomilla/serializers/validators.py,sha256=
|
45
|
-
camomilla/serializers/base/__init__.py,sha256=
|
46
|
-
camomilla/serializers/fields/__init__.py,sha256=
|
42
|
+
camomilla/serializers/utils.py,sha256=XRL4CNwQDBNpX8xT7365Dw2Cyx8Kvh18GaadgjS9awk,968
|
43
|
+
camomilla/serializers/validators.py,sha256=X2uBlh348nJjUWHPtiu9XKCD7Etsdg0811a4xHLAUzU,2103
|
44
|
+
camomilla/serializers/base/__init__.py,sha256=maaL3y6tvc5Ph9y07KVcMvZVYTkzh_3aBiBnGCoi1EA,799
|
45
|
+
camomilla/serializers/fields/__init__.py,sha256=0I_E9oMtlC0H48LjStMQZiZ-Ycoy49nWK9GvA5JWxN8,145
|
47
46
|
camomilla/serializers/fields/file.py,sha256=yjKMho2ti9TIAzo6nwyLnNPJ6GVUumL2wxhegvYqI2o,800
|
48
|
-
camomilla/serializers/fields/
|
49
|
-
camomilla/serializers/
|
50
|
-
camomilla/serializers/mixins/
|
51
|
-
camomilla/serializers/mixins/filter_fields.py,sha256=
|
47
|
+
camomilla/serializers/fields/related.py,sha256=qQQeUxIZSNqnVRHsXocLGmBNHjAvrlr0eDY9K2uCjWk,5069
|
48
|
+
camomilla/serializers/mixins/__init__.py,sha256=gMyFpSWHLtLTlKucP1Xk-GtBNX48CwwyY6_wEN3L9vA,640
|
49
|
+
camomilla/serializers/mixins/fields.py,sha256=h-YBHBITLGHsrXRgSYP3NBoUzJqmQ_5HhhftoFFNsKs,711
|
50
|
+
camomilla/serializers/mixins/filter_fields.py,sha256=sqnCG1hi_qfISFJvwgh37BLyQoNDifR0pU7zmJn_MW8,2236
|
51
|
+
camomilla/serializers/mixins/json.py,sha256=Iq5S7mUg5_Y4bsm6XN3ECJR07NGjCAQ21_wdxj6RgyY,1193
|
52
|
+
camomilla/serializers/mixins/language.py,sha256=VukEvPzTpKQfwB-z_RtoNIJ43N3OEgfjLpHvn9KuZDU,1205
|
53
|
+
camomilla/serializers/mixins/nesting.py,sha256=gCEU2UE_Y8e4VRnvT0AExFgwTfJm_jnSqa6l2SwZ3Mg,1432
|
54
|
+
camomilla/serializers/mixins/optimize.py,sha256=zAtbtk6kfGq9FnapqI8tVYOuMKd1IkHbAV6LffL61Z4,3845
|
55
|
+
camomilla/serializers/mixins/ordering.py,sha256=rXQOz47_U4IsMT6IBhySghcmJWMZgpPWHovDcZQG88k,1172
|
56
|
+
camomilla/serializers/mixins/page.py,sha256=Ida7dY9MQTv747_dpPGpo6u3iL5GX87z4zeVct-C36s,2132
|
57
|
+
camomilla/serializers/mixins/translation.py,sha256=Om2UT2EB4Xvp8SrIEvraY0kJXR9H54AsYBr9DKjsay8,4323
|
52
58
|
camomilla/storages/__init__.py,sha256=ytGgX59Ar8vFfYz7eV8z-j5yO_5FqxdZM25iyLnJuSA,131
|
53
|
-
camomilla/storages/default.py,sha256=
|
59
|
+
camomilla/storages/default.py,sha256=GNzvV_JZpXMcfTkyXjw5CfK8EIBi3o-NXYBO0KAxD5M,351
|
54
60
|
camomilla/storages/optimize.py,sha256=VGSXZigzZC8LnPTqyTOpPA2Ba9EJB_KC5bcACoRs4GA,2762
|
55
61
|
camomilla/storages/overwrite.py,sha256=jvW3zHvXNzH9dIjeZmmfXo_O3K1ZQmLQzmlSKAOE8ZA,360
|
56
62
|
camomilla/templates/admin/camomilla/page/change_form.html,sha256=ig7rRUtylDZMINBQuVPpZLmeB4sOTV_VtqnTgzAyxEo,251
|
57
|
-
camomilla/templates/defaults/base.html,sha256=
|
63
|
+
camomilla/templates/defaults/base.html,sha256=C2gCnQP1AkERPv5w00nVhZdfg2h_8DMoIkmdf2I-VVY,8166
|
58
64
|
camomilla/templates/defaults/articles/default.html,sha256=1f89jBvNtTa1mPAbC91yy8CzeAjTWO3hhQsTuQW5OKg,239
|
59
65
|
camomilla/templates/defaults/pages/default.html,sha256=bP81Qb6M56I-fBJMywWwEu_cnERtWIX28UkGrUSRU6M,144
|
60
66
|
camomilla/templates/defaults/parts/langswitch.html,sha256=AkaQzb2KNjRYCMLUn_jE31V36rwBIwp4MneirWPiBcI,3424
|
61
|
-
camomilla/templates/defaults/parts/menu.html,sha256=
|
67
|
+
camomilla/templates/defaults/parts/menu.html,sha256=ReE-FfmfCNuNkJI33QqIfmMgLSBl3FTkWAhEa59aD3A,381
|
62
68
|
camomilla/templates/defaults/widgets/media_select_multiple.html,sha256=k2XYou8KkPuFLnPMkPJAFJ-zGJj2Xvu6R3ZmiKa3g7Q,3727
|
63
69
|
camomilla/templates_context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
70
|
camomilla/templates_context/autodiscover.py,sha256=td7SCsqg3iNPnv1HDEDEpwWgWLjy5Zmc8Nbze1_J46I,1907
|
65
71
|
camomilla/templates_context/rendering.py,sha256=GfTR45_gC7WT7zTKPVXkBDwe22uF63A-DfZUW31woAU,3194
|
66
72
|
camomilla/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
67
73
|
camomilla/templatetags/camomilla_filters.py,sha256=35x0-cWrRHeLhqypSLlJzEFY_fQDcRHiwZQpFgIsspE,692
|
68
|
-
camomilla/templatetags/menus.py,sha256=
|
69
|
-
camomilla/
|
70
|
-
camomilla/theme/
|
71
|
-
camomilla/theme/apps.py,sha256=
|
74
|
+
camomilla/templatetags/menus.py,sha256=7fc4f9DDqtqG6wNb5_Q0km-fq0mqvGnbpR21qO1TJUw,960
|
75
|
+
camomilla/templatetags/model_extras.py,sha256=mfPab5wQwAiBud4PWyn4lRumdqdniz3OhZy433zm4KQ,2180
|
76
|
+
camomilla/theme/__init__.py,sha256=-G_a31a_XYZrR-sYH8Ect9skMQcf0vEfDEKXexJXOIw,30
|
77
|
+
camomilla/theme/apps.py,sha256=Ue2H80fbFgxkQyHeU2H0fWs9Y6d-EnHYv4zz824FSRk,1066
|
78
|
+
camomilla/theme/admin/__init__.py,sha256=TALAZaE-gWshSeGc6yy7VahdX5UfeCeoOE9Q5kJCEpM,2270
|
79
|
+
camomilla/theme/admin/pages.py,sha256=y3rL1nwZlytyD-YR_qqLiBAmjCAjkBY3v56V6JdhBvY,1908
|
80
|
+
camomilla/theme/admin/translations.py,sha256=iAjGM1A1aYrsz1FpeybROk6rn3Ddl_oUCwgU5oD8nSw,308
|
72
81
|
camomilla/theme/static/admin/css/responsive.css,sha256=yGq6qXrr8xEVsXTnprIBgkX-sMGZrNf0Kkh-xDxf6yE,157
|
73
82
|
camomilla/theme/static/admin/img/favicon.ico,sha256=qpKv_2MaGILvyihnD1Vq9Yk-ZXGkxWTW26ciMeBFMYU,15406
|
74
83
|
camomilla/theme/static/admin/img/logo.svg,sha256=WBAORIV_LzEOdcpq7iU6d0Nu3omgk2gn05f6LnPjfWg,3238
|
@@ -77,39 +86,48 @@ camomilla/theme/templates/rosetta/base.html,sha256=s9Ijf1nZx8um30R5Gk3g-w-RwFGv2
|
|
77
86
|
camomilla/utils/__init__.py,sha256=Ui7nzSh45UMMFtCGF1xFHKyJMNWflG_Nx72HAJHJHFM,100
|
78
87
|
camomilla/utils/getters.py,sha256=6j18grFAZ8BC70SriycFDTQFxTnudGn0uKGA83_Rclk,798
|
79
88
|
camomilla/utils/normalization.py,sha256=RDCZtjwpEEwjvfUjQl2bEWFKw7NxTzkXco72VeO2M9w,255
|
80
|
-
camomilla/utils/query_parser.py,sha256=
|
89
|
+
camomilla/utils/query_parser.py,sha256=TUScPzPVVJzaKdqy5NqtMOft3H5Bx6liXTVPM1yjH24,6303
|
81
90
|
camomilla/utils/seo.py,sha256=8p_a_TGgohenpJb094tT4mMxbn2xzW0qDILuTnjNocM,3324
|
82
91
|
camomilla/utils/setters.py,sha256=LV57SM65rL1_ZQkVzk9al_Q13lndVywXLkqgfIvgS0Y,915
|
83
|
-
camomilla/utils/templates.py,sha256=
|
84
|
-
camomilla/utils/translation.py,sha256=
|
92
|
+
camomilla/utils/templates.py,sha256=pgj9vrMypdJEYfvabbWRTu3r498pbjvcLCOSrrsm-sw,924
|
93
|
+
camomilla/utils/translation.py,sha256=w5tvTInDLegWBb1TnDWo09ckKY3K6hajuNNsngZIxPQ,4205
|
85
94
|
camomilla/views/__init__.py,sha256=94QuOnnbfMMb17mruO2ydUt286-8zBmDxEPWrJv5Wog,178
|
86
95
|
camomilla/views/articles.py,sha256=qGxebOA5iTbGGe9PfbH40YBoDPKktH8FJongg6rh2R8,571
|
87
96
|
camomilla/views/contents.py,sha256=JxvnmgeK8JEmCMLzVG8pVq2DwvmjXtgnIdsDnn74tA4,1205
|
88
97
|
camomilla/views/decorators.py,sha256=hR--nTGQn2mMKDrWn-0Ildzbsvp11OfoWAtedKEzmiA,982
|
89
98
|
camomilla/views/languages.py,sha256=Rt_X7s3dbDBv4dxsQ9fnav_u0TAzzo8fGKBBx3esDsg,441
|
90
|
-
camomilla/views/medias.py,sha256=
|
99
|
+
camomilla/views/medias.py,sha256=XYa-NTLLQmSSynpfrFT3av-K_r59aRns3dTGfYMj-0Q,3002
|
91
100
|
camomilla/views/menus.py,sha256=Kpygnf3tMKJ30gcblUES2NW83A37Vy75ecSGSvExGKM,3301
|
92
|
-
camomilla/views/pages.py,sha256=
|
101
|
+
camomilla/views/pages.py,sha256=UL74_u-18QdAkjVl74AVWZbRarEdIPrANTzdcM4iqmE,1338
|
93
102
|
camomilla/views/tags.py,sha256=XcYRlcBFSPPY32lt7POb6fWPJL_8HsTo5JcHcAOiOKw,479
|
94
103
|
camomilla/views/users.py,sha256=_fvsKOEtep4SJLvMva2_q-HdLQT_1KlFNt4wcl3xCJk,3130
|
95
|
-
camomilla/views/base/__init__.py,sha256=
|
96
|
-
camomilla/views/mixins/__init__.py,sha256=
|
104
|
+
camomilla/views/base/__init__.py,sha256=t-7tqY_ep4Xi8YgB1sXDgNWQ5oh2YEUlfQWU5pltwJ0,1063
|
105
|
+
camomilla/views/mixins/__init__.py,sha256=Znv3fLYVy6lgu03Q_D8fTen4zMxI6VSRaLPDU8Cp7Ws,473
|
106
|
+
camomilla/views/mixins/bulk_actions.py,sha256=i0duWW6wey9m7I_V8-gPcHsbJyPEfSdMdj4h2i-CbPw,787
|
107
|
+
camomilla/views/mixins/language.py,sha256=hfnYznlVMrMLBdJ_f8dChJWENg7Kpt9m1yqavrdLm7E,1299
|
108
|
+
camomilla/views/mixins/optimize.py,sha256=iRPNkoeIIlJugk7DjJhDPaqeX7Opi7TxnUoMDnxJxUk,686
|
97
109
|
camomilla/views/mixins/ordering.py,sha256=mh7fqPyVCVJh84Nl2pYFQouzGxa-ANF3Wqv0pCb7OVU,4779
|
98
|
-
camomilla/views/mixins/pagination.py,sha256=
|
110
|
+
camomilla/views/mixins/pagination.py,sha256=NWerBdMyBt4Kswig4fbANqGTzsll8SJdE6a8_UIoueU,5772
|
111
|
+
camomilla/views/mixins/permissions.py,sha256=TPmR3Hoa3BjeJu9rCE_7lpLOAupue4WI42C21HTo6X4,200
|
112
|
+
django_camomilla_cms-6.0.0b18.dist-info/licenses/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
|
99
113
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
114
|
tests/test_api.py,sha256=t03EFDezGgm4UJl8RIVvnTUkAGTB6ptm0G2lHBQ7ljc,1833
|
101
|
-
tests/test_camomilla_filters.py,sha256=
|
102
|
-
tests/test_media.py,sha256=
|
115
|
+
tests/test_camomilla_filters.py,sha256=5LlR3tctGu6qxVmOrY52AGh_ACvEzdAvkwH2v7medpo,1536
|
116
|
+
tests/test_media.py,sha256=IG-cigWxDnsq54DRVaPO2O0lcsnutfKRsqPTTR8W1E8,4183
|
117
|
+
tests/test_menu.py,sha256=HyEdDzTDsLtNzsTNGjjZ6SCrgTXRU3FkKviUOacnYRg,3582
|
103
118
|
tests/test_model_api.py,sha256=Ne8YlXTH2cqP5gzOc8UKjJuh0t-NaKHh5Ol9krpVHQg,3768
|
104
119
|
tests/test_model_api_permissions.py,sha256=7CSb4-yIOfycAL_vXvh1dE2whx7k0gNkWl9LO0yzy4I,1801
|
120
|
+
tests/test_model_api_register.py,sha256=9pqf7fvtniw63ZD4P2JItfDC0brD55vIrqjZ4phm_qs,14016
|
105
121
|
tests/test_models.py,sha256=WJs8lxWZWn1l7X3a_QFVc8fF5LHTsI8bc3uhQe6-o-Q,684
|
106
|
-
tests/
|
122
|
+
tests/test_pages.py,sha256=qIVdfmbtx7GKHyNWHhirR58gGr9zjfrrzXXkvYlLusc,11469
|
123
|
+
tests/test_query_parser.py,sha256=R9l0L2QDEDcm2b6IFUhyf7wMXLzL9RySLkzKTWRtBkE,2097
|
124
|
+
tests/test_templates_context.py,sha256=D72ufRqCGjInGGXHSNVhlJ1HcWG0zMqrAiTuiaU057k,4694
|
107
125
|
tests/test_utils.py,sha256=o_FG7XOxLePOBfwBr4sk09gej0onWNw9t2-gSjGmgNg,3741
|
108
126
|
tests/fixtures/__init__.py,sha256=NGj22kLV65v56IpOrOVqSkPhJePTXD4QjuuZhZSMwfQ,460
|
109
127
|
tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
110
|
-
tests/utils/api.py,sha256=
|
111
|
-
|
112
|
-
django_camomilla_cms-6.0.
|
113
|
-
django_camomilla_cms-6.0.
|
114
|
-
django_camomilla_cms-6.0.
|
115
|
-
django_camomilla_cms-6.0.
|
128
|
+
tests/utils/api.py,sha256=TYcDXeILHtBwzwG0acwPFmiqMZnlF9VnLB0Ydhg55vA,865
|
129
|
+
tests/utils/media.py,sha256=-cnrQzzVuhNSb5rT5xMUs5f3yYpBnS0fVGDcjgsb8lw,291
|
130
|
+
django_camomilla_cms-6.0.0b18.dist-info/METADATA,sha256=BwxjdmoaRTe-4KYk6odNDH53VHDiyBtS5vRA2dHWjIY,2565
|
131
|
+
django_camomilla_cms-6.0.0b18.dist-info/WHEEL,sha256=_z0Kb-VmhLeNt2nZ-PsoQBjD25rP0tBwgAyRYD7oTKI,109
|
132
|
+
django_camomilla_cms-6.0.0b18.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
|
133
|
+
django_camomilla_cms-6.0.0b18.dist-info/RECORD,,
|
tests/test_camomilla_filters.py
CHANGED
@@ -38,4 +38,4 @@ class CamomillaFiltersTestCase(TestCase):
|
|
38
38
|
request.META["HTTP_HOST"] = "localhost"
|
39
39
|
page = Page.get(request)
|
40
40
|
alt_urls = dict(alternate_urls(page, request))
|
41
|
-
self.assertEqual(alt_urls, {'it': None, 'en': '/path/'})
|
41
|
+
self.assertEqual(alt_urls, {'it': None, 'en': '/path/'})
|
tests/test_media.py
CHANGED
@@ -1,80 +1,113 @@
|
|
1
1
|
import pytest
|
2
2
|
import json
|
3
|
-
import
|
3
|
+
from django.test import TestCase
|
4
4
|
from camomilla.models import Media
|
5
|
-
from .fixtures import load_asset
|
6
5
|
from .utils.api import login_superuser
|
6
|
+
from .utils.media import load_asset_and_remove_media
|
7
7
|
from rest_framework.test import APIClient
|
8
|
-
from django.conf import settings
|
9
8
|
|
10
9
|
client = APIClient()
|
11
10
|
|
11
|
+
class MediaTestCase(TestCase):
|
12
|
+
def setUp(self):
|
13
|
+
self.client = APIClient()
|
14
|
+
token = login_superuser()
|
15
|
+
self.client.credentials(HTTP_AUTHORIZATION='Token ' + token)
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
17
|
+
@pytest.mark.django_db
|
18
|
+
def test_media_api_crud(self):
|
19
|
+
# Create media 1
|
20
|
+
asset = load_asset_and_remove_media("10595073.png")
|
21
|
+
response = self.client.post(
|
22
|
+
"/api/camomilla/media/",
|
23
|
+
{
|
24
|
+
"file": asset,
|
25
|
+
"data": json.dumps({"translations": {"en": {"alt_text": "Test 1", "title": "Test 1", "description": "Test 1"}}}),
|
26
|
+
},
|
27
|
+
format="multipart",
|
28
|
+
)
|
29
|
+
assert response.status_code == 201
|
30
|
+
assert Media.objects.count() == 1
|
31
|
+
media = Media.objects.first()
|
32
|
+
assert media.alt_text == "Test 1"
|
33
|
+
assert media.title == "Test 1"
|
34
|
+
assert media.description == "Test 1"
|
35
|
+
assert media.file.name == "10595073.png"
|
18
36
|
|
37
|
+
# Create media 2
|
38
|
+
asset = load_asset_and_remove_media("37059501.png")
|
39
|
+
response = self.client.post(
|
40
|
+
"/api/camomilla/media/",
|
41
|
+
{
|
42
|
+
"file": asset,
|
43
|
+
"data": json.dumps({"translations": {"en": {"alt_text": "Test 2", "title": "Test 2", "description": "Test 2"}}}),
|
44
|
+
},
|
45
|
+
format="multipart",
|
46
|
+
)
|
47
|
+
assert response.status_code == 201
|
48
|
+
assert Media.objects.count() == 2
|
49
|
+
media = Media.objects.first() # Ordering in model is descending -pk
|
50
|
+
assert media.alt_text == "Test 2"
|
51
|
+
assert media.title == "Test 2"
|
52
|
+
assert media.description == "Test 2"
|
53
|
+
assert media.file.name == "37059501.png"
|
19
54
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
"/api/camomilla/media/",
|
27
|
-
{
|
28
|
-
"file": asset,
|
29
|
-
"data": json.dumps({"translations": {"en": {"alt_text": "Test", "title": "Test", "description": "Test"}}}),
|
30
|
-
},
|
31
|
-
format="multipart",
|
32
|
-
)
|
33
|
-
assert response.status_code == 201
|
34
|
-
assert Media.objects.count() == 1
|
35
|
-
media = Media.objects.first()
|
36
|
-
assert media.alt_text == "Test"
|
37
|
-
assert media.title == "Test"
|
38
|
-
assert media.description == "Test"
|
39
|
-
assert media.file.name == "10595073.png"
|
55
|
+
# Read media
|
56
|
+
response = self.client.get("/api/camomilla/media/2/")
|
57
|
+
assert response.status_code == 200
|
58
|
+
assert response.json()['id'] == 2
|
59
|
+
assert response.json()['title'] == "Test 2"
|
60
|
+
assert response.json()['file'] == "http://testserver/media/37059501.png"
|
40
61
|
|
62
|
+
# Read medias
|
63
|
+
response = self.client.get("/api/camomilla/media/")
|
64
|
+
assert response.status_code == 200
|
65
|
+
assert response.json()[0]['id'] == 2 # Ordering in model is descending -pk
|
66
|
+
assert response.json()[0]['title'] == "Test 2"
|
67
|
+
assert response.json()[1]['id'] == 1
|
68
|
+
assert response.json()[1]['title'] == "Test 1"
|
41
69
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
"/api/camomilla/media/",
|
50
|
-
{
|
51
|
-
"file": asset,
|
52
|
-
"data": json.dumps({"translations": {"en": {"alt_text": "Test", "title": "Test", "description": "Test"}}}),
|
53
|
-
},
|
54
|
-
format="multipart",
|
55
|
-
)
|
56
|
-
assert response.status_code == 201
|
57
|
-
assert Media.objects.count() == 1
|
58
|
-
media = Media.objects.first()
|
59
|
-
assert media.file.size < asset_size
|
60
|
-
assert media.file.size < 1000000 # 1MB
|
70
|
+
# Delete media
|
71
|
+
response = self.client.delete("/api/camomilla/media/2/")
|
72
|
+
assert response.status_code == 204
|
73
|
+
assert len(Media.objects.all()) == 1
|
74
|
+
media = Media.objects.last()
|
75
|
+
assert media.id == 1
|
76
|
+
assert media.title == "Test 1"
|
61
77
|
|
62
78
|
|
63
|
-
@pytest.mark.django_db
|
64
|
-
def
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
"
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
@pytest.mark.django_db
|
80
|
+
def test_media_compression(self):
|
81
|
+
asset = load_asset_and_remove_media("Sample-jpg-image-10mb.jpg")
|
82
|
+
asset_size = asset.size
|
83
|
+
response = self.client.post(
|
84
|
+
"/api/camomilla/media/",
|
85
|
+
{
|
86
|
+
"file": asset,
|
87
|
+
"data": json.dumps({"translations": {"en": {"alt_text": "Test", "title": "Test", "description": "Test"}}}),
|
88
|
+
},
|
89
|
+
format="multipart",
|
90
|
+
)
|
91
|
+
assert response.status_code == 201
|
92
|
+
assert Media.objects.count() == 1
|
93
|
+
media = Media.objects.first()
|
94
|
+
assert media.file.size < asset_size
|
95
|
+
assert media.file.size < 1000000 # 1MB
|
96
|
+
|
97
|
+
|
98
|
+
@pytest.mark.django_db
|
99
|
+
def test_inflating_prevent(self):
|
100
|
+
asset = load_asset_and_remove_media("optimized.jpg")
|
101
|
+
asset_size = asset.size
|
102
|
+
response = self.client.post(
|
103
|
+
"/api/camomilla/media/",
|
104
|
+
{
|
105
|
+
"file": asset,
|
106
|
+
"data": json.dumps({"translations": {"en": {"alt_text": "Test", "title": "Test", "description": "Test"}}}),
|
107
|
+
},
|
108
|
+
format="multipart",
|
109
|
+
)
|
110
|
+
assert response.status_code == 201
|
111
|
+
assert Media.objects.count() == 1
|
112
|
+
media = Media.objects.first()
|
113
|
+
assert media.file.size < asset_size
|
tests/test_menu.py
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
import pytest
|
2
|
+
import html
|
3
|
+
from django.test import TestCase
|
4
|
+
from rest_framework.test import APIClient
|
5
|
+
from .utils.api import login_superuser
|
6
|
+
from django.template import Template, Context
|
7
|
+
from camomilla.models import Menu
|
8
|
+
|
9
|
+
|
10
|
+
class MenuTestCase(TestCase):
|
11
|
+
def setUp(self):
|
12
|
+
self.client = APIClient()
|
13
|
+
token = login_superuser()
|
14
|
+
self.client.credentials(HTTP_AUTHORIZATION='Token ' + token)
|
15
|
+
|
16
|
+
def renderTemplate(self, template, context = None):
|
17
|
+
return Template('{% load menus %}' + template).render(Context(context))
|
18
|
+
|
19
|
+
@pytest.mark.django_db
|
20
|
+
def test_template_render_menu(self):
|
21
|
+
assert self.renderTemplate('{% render_menu "key_1" %}') == "\n\n"
|
22
|
+
assert len(Menu.objects.all()) == 1
|
23
|
+
menu = Menu.objects.first()
|
24
|
+
assert menu.id == 1
|
25
|
+
assert menu.key == "key_1"
|
26
|
+
|
27
|
+
assert self.renderTemplate('{% render_menu "key_2" %}') == "\n\n"
|
28
|
+
assert len(Menu.objects.all()) == 2
|
29
|
+
menu = Menu.objects.last()
|
30
|
+
assert menu.id == 2
|
31
|
+
assert menu.key == "key_2"
|
32
|
+
|
33
|
+
@pytest.mark.django_db
|
34
|
+
def test_template_get_menus(self):
|
35
|
+
self.renderTemplate('{% render_menu "key_3" %}')
|
36
|
+
self.renderTemplate('{% render_menu "key_4" %}')
|
37
|
+
|
38
|
+
rendered = html.unescape(self.renderTemplate('{% get_menus %}'))
|
39
|
+
assert rendered == "{'key_3': <Menu: key_3>, 'key_4': <Menu: key_4>}"
|
40
|
+
|
41
|
+
rendered = html.unescape(self.renderTemplate('{% get_menus "arg" %}'))
|
42
|
+
assert rendered == "{}"
|
43
|
+
|
44
|
+
rendered = html.unescape(self.renderTemplate('{% get_menus "key_3" %}'))
|
45
|
+
assert rendered == "{'key_3': <Menu: key_3>}"
|
46
|
+
|
47
|
+
menus = 'test "menus" in context'
|
48
|
+
rendered = html.unescape(self.renderTemplate('{% get_menus %}', {"menus": menus}))
|
49
|
+
assert rendered == menus
|
50
|
+
|
51
|
+
@pytest.mark.django_db
|
52
|
+
def test_template_get_menu_node_url(self):
|
53
|
+
self.renderTemplate('{% render_menu "key_5" %}')
|
54
|
+
|
55
|
+
menu = Menu.objects.first()
|
56
|
+
menu.nodes = [{"title": "key_5_node_title", "link":{"static": "key_5_url_static"}}]
|
57
|
+
menu.save()
|
58
|
+
|
59
|
+
rendered = html.unescape(self.renderTemplate('{% render_menu "key_5" %}'))
|
60
|
+
assert {'<a href="key_5_url_static">key_5_node_title</a>' in rendered}
|
61
|
+
|
62
|
+
@pytest.mark.django_db
|
63
|
+
def test_menu_custom_template(self):
|
64
|
+
self.renderTemplate('{% render_menu "key_6_custom" %}')
|
65
|
+
|
66
|
+
menu = Menu.objects.first()
|
67
|
+
menu.nodes = [{"title": "key_6_node_title", "link":{"static": "key_6_url_static"}}]
|
68
|
+
menu.save()
|
69
|
+
|
70
|
+
rendered = html.unescape(self.renderTemplate('{% render_menu "key_6_custom" "website/menu_custom.html" %}'))
|
71
|
+
assert {'This is custom menu: key_6_node_title' in rendered}
|
72
|
+
|
73
|
+
@pytest.mark.django_db
|
74
|
+
def test_menu_in_page_template(self):
|
75
|
+
self.renderTemplate('{% render_menu "key_7" %}')
|
76
|
+
|
77
|
+
response = self.client.post(
|
78
|
+
"/api/camomilla/pages/",
|
79
|
+
{
|
80
|
+
"translations": {
|
81
|
+
"en": {
|
82
|
+
"title": "title_page_menu_1",
|
83
|
+
"permalink": "permalink_page_menu_en_1",
|
84
|
+
"autopermalink": False
|
85
|
+
}
|
86
|
+
}
|
87
|
+
},
|
88
|
+
format='json'
|
89
|
+
)
|
90
|
+
assert response.status_code == 201
|
91
|
+
|
92
|
+
menu = Menu.objects.first()
|
93
|
+
menu.nodes = [{"title": "key_7_node_title", "link":{"page": { "id": 1, "model":"camomilla.page" }}}]
|
94
|
+
menu.save()
|
95
|
+
|
96
|
+
rendered = html.unescape(self.renderTemplate('{% render_menu "key_7" %}'))
|
97
|
+
assert {'href="permalink_page_menu_en_1"' in rendered}
|