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.
Files changed (65) hide show
  1. camomilla/__init__.py +1 -1
  2. camomilla/contrib/modeltranslation/hvad_migration.py +9 -9
  3. camomilla/dynamic_pages_urls.py +6 -2
  4. camomilla/managers/pages.py +87 -2
  5. camomilla/model_api.py +6 -4
  6. camomilla/models/menu.py +9 -4
  7. camomilla/models/page.py +178 -117
  8. camomilla/openapi/schema.py +15 -10
  9. camomilla/redirects.py +10 -0
  10. camomilla/serializers/base/__init__.py +4 -4
  11. camomilla/serializers/fields/__init__.py +5 -17
  12. camomilla/serializers/fields/related.py +5 -3
  13. camomilla/serializers/mixins/__init__.py +23 -240
  14. camomilla/serializers/mixins/fields.py +20 -0
  15. camomilla/serializers/mixins/filter_fields.py +9 -8
  16. camomilla/serializers/mixins/json.py +34 -0
  17. camomilla/serializers/mixins/language.py +32 -0
  18. camomilla/serializers/mixins/nesting.py +35 -0
  19. camomilla/serializers/mixins/optimize.py +91 -0
  20. camomilla/serializers/mixins/ordering.py +34 -0
  21. camomilla/serializers/mixins/page.py +58 -0
  22. camomilla/{contrib/rest_framework/serializer.py → serializers/mixins/translation.py} +16 -56
  23. camomilla/serializers/utils.py +3 -3
  24. camomilla/serializers/validators.py +6 -2
  25. camomilla/settings.py +16 -2
  26. camomilla/storages/default.py +7 -1
  27. camomilla/templates/defaults/base.html +60 -4
  28. camomilla/templates/defaults/parts/menu.html +1 -1
  29. camomilla/templatetags/menus.py +3 -0
  30. camomilla/templatetags/model_extras.py +73 -0
  31. camomilla/theme/__init__.py +1 -1
  32. camomilla/theme/{admin.py → admin/__init__.py} +22 -20
  33. camomilla/theme/admin/pages.py +46 -0
  34. camomilla/theme/admin/translations.py +13 -0
  35. camomilla/theme/apps.py +2 -5
  36. camomilla/translation.py +7 -1
  37. camomilla/urls.py +2 -5
  38. camomilla/utils/query_parser.py +42 -23
  39. camomilla/utils/templates.py +23 -10
  40. camomilla/utils/translation.py +47 -5
  41. camomilla/views/base/__init__.py +35 -5
  42. camomilla/views/medias.py +1 -1
  43. camomilla/views/mixins/__init__.py +17 -76
  44. camomilla/views/mixins/bulk_actions.py +22 -0
  45. camomilla/views/mixins/language.py +33 -0
  46. camomilla/views/mixins/optimize.py +18 -0
  47. camomilla/views/mixins/pagination.py +11 -8
  48. camomilla/views/mixins/permissions.py +6 -0
  49. camomilla/views/pages.py +12 -2
  50. {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/METADATA +23 -16
  51. {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/RECORD +63 -45
  52. {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info}/WHEEL +1 -1
  53. tests/test_camomilla_filters.py +1 -1
  54. tests/test_media.py +98 -65
  55. tests/test_menu.py +97 -0
  56. tests/test_model_api_register.py +393 -0
  57. tests/test_pages.py +343 -0
  58. tests/test_query_parser.py +1 -2
  59. tests/test_templates_context.py +111 -0
  60. tests/utils/api.py +0 -1
  61. tests/utils/media.py +10 -0
  62. camomilla/contrib/rest_framework/__init__.py +0 -0
  63. camomilla/serializers/fields/json.py +0 -48
  64. {django_camomilla_cms-6.0.0b16.dist-info → django_camomilla_cms-6.0.0b18.dist-info/licenses}/LICENSE +0 -0
  65. {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=zHhnT2CrQaDldn3CyDbBxGqY4L0nbxsbMQLr6arZrLs,251
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=14H47KlSxmINoJyrsul0KR7Qvk6-1uoXrD1ReV_W4h8,1056
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=1xQxDWGPQNVqa_c87pLq4gj1ZHta2IFqdeEbzErHZX8,2447
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/settings.py,sha256=GDJXDcEmyobGrP4MmEH3MAt1KBK74gXmmRR8kFuJzp0,3306
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=-Y0Toy1D__wxMovipWVIuNx3TrfhDGffrduWYFUmYA4,1269
14
- camomilla/urls.py,sha256=YFUYcPuvnNSTnfJa_JByRWAPLgc4_R4LgqCMrmkbFpE,2217
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=UanLVSlYYd_ykMC4STtYkkUMJqlFQQYhbWkoV47alM0,5403
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=ifwYuOCaX8pf1-mR71IXuE5KDl2UWtcuwmGV26Hi9EU,1129
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=zXL644mQLRxt5aLZKv66l4RGlEi-a33cwmq7xpD9S5E,3661
32
- camomilla/models/page.py,sha256=jMtnJ_leps6hnpZ52Ot_nXlgqUO5lUFshUzpYJtrRjk,17237
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=08HaV3-X-96b15Bo1X9IJmT2bv-bCqOkVrmWpz-fesM,2381
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=uPQNNkIMZyoPP4umWTgFHNM7KyabBZgs5r5AJyfgtJI,1105
44
- camomilla/serializers/validators.py,sha256=EX-EFg6afFr8viPKq-LHeEtRAKPVtO4kIlEymY1j2HA,2043
45
- camomilla/serializers/base/__init__.py,sha256=P2153u7T4yQSbgwIC9LJxJFnVSle3H9oEuTUNrnz9x4,869
46
- camomilla/serializers/fields/__init__.py,sha256=T_ONowldBTPfgbwFmoefY1r3TQiB2sbWQPpFvBSnzqE,681
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/json.py,sha256=epuvDkKqDHuXAH0jVpOkeljz7LnMJVg7RoWYioPgCNs,1873
49
- camomilla/serializers/fields/related.py,sha256=kG5_q1ckm33BVUIgPLZFa6IjL5lQ5DT8_83fUe9plc8,4989
50
- camomilla/serializers/mixins/__init__.py,sha256=lDfeIoaMqKH11QHzBNs4hA5aHBV7sJsjzGLew6tdcXU,9367
51
- camomilla/serializers/mixins/filter_fields.py,sha256=AwdV5iG-r0JFy4Wtywczu7bqA8Fb6NZyy60Y79Z6cWo,2214
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=KVuGPIpkM9tDHc0cYG385xkiKOwIvage5IBmdrv2uOk,188
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=pklt7Pif3g9d7gwgRxCQj7gniJaHD14ZqZID_xIlC0A,6638
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=CSRPx78Z6D6pGtRqqaLmJetUaADrTh9rx_gqS4myndc,381
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=pLFeJ1UAm3flsU9TNo2iQk4otSwZuJPr86Nf408dZ-8,862
69
- camomilla/theme/__init__.py,sha256=ZTc6bQJ8jCuKWUOkNmYh8qHpCpZ6iN55XQS_wWviAis,30
70
- camomilla/theme/admin.py,sha256=7TgNXOfIy4awtV-KkGEKsmai94qhBiykB0uJWwTZy8U,2461
71
- camomilla/theme/apps.py,sha256=ecqG8ntWdOighYOEHQOMVQpa5g_1WEzzpaaGjnOi9uA,1195
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=STNUfoKENcRM_joIKh5AVvYADppsURj9Jpf9OkUQrJU,5818
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=Lv4-5019cnM30HmdZnYWiU5gxry-eFZVAhwOofGQRDs,598
84
- camomilla/utils/translation.py,sha256=HG70ki9MTBVTdAYgi6lqqFQtNm30VTvGSYepXpyb3_Y,2477
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=S4Ak4JI6XCSu3BCZx8KOotX7TBfrIU82GPXgyP3KcZA,3001
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=KrBsKT0Z-rkBha8K3P6fVDt4vArQBxsc9rZ28j8XW9w,994
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=dWiyyRpvOWXMmBeLsfLDOCK_ZesYzBBniH71zAu6hu4,282
96
- camomilla/views/mixins/__init__.py,sha256=MEZiQf-wkY80J-f9c6GnLD2o97YefCKyn5PXW9jj8bc,2672
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=8BY4T5aWw50LSgIbwM4X0_HWm8GFgKWKn1TUrY028No,5519
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=9tHdxhU-Qk5c3ZWbhLQE3g1VrWKS-cGlRG258D1T9hI,1535
102
- tests/test_media.py,sha256=bBFUFWEKWIWgDxclOyAfLW5wUCERSfONtxD_OOz9KBg,2523
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/test_query_parser.py,sha256=ebHQwjGINHy84JZZXUxrdutXtlHBhoqq7keLr5GHFik,2098
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=vnj6W3PG5a-R_uF43nv3UushpMfyG_HbqlsBXH9Ysg0,910
111
- django_camomilla_cms-6.0.0b16.dist-info/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
112
- django_camomilla_cms-6.0.0b16.dist-info/METADATA,sha256=pwvWq5hO3tSBO2Qmt0TgoKJy5QY5Kko2yeaXYjubXAw,2390
113
- django_camomilla_cms-6.0.0b16.dist-info/WHEEL,sha256=OpXWERl2xLPRHTvd2ZXo_iluPEQd8uSbYkJ53NAER_Y,109
114
- django_camomilla_cms-6.0.0b16.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
115
- django_camomilla_cms-6.0.0b16.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -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 os
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
- def load_asset_and_remove_media(filename):
14
- asset = load_asset(filename)
15
- if os.path.exists(f"{settings.MEDIA_ROOT}/{filename}"):
16
- os.remove(f"{settings.MEDIA_ROOT}/{filename}")
17
- return asset
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
- @pytest.mark.django_db
21
- def test_media_api_creation():
22
- token = login_superuser()
23
- client.credentials(HTTP_AUTHORIZATION='Token ' + token)
24
- asset = load_asset_and_remove_media("10595073.png")
25
- response = client.post(
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
- @pytest.mark.django_db
43
- def test_media_compression():
44
- token = login_superuser()
45
- client.credentials(HTTP_AUTHORIZATION='Token ' + token)
46
- asset = load_asset_and_remove_media("Sample-jpg-image-10mb.jpg")
47
- asset_size = asset.size
48
- response = client.post(
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 test_inflating_prevent():
65
- token = login_superuser()
66
- client.credentials(HTTP_AUTHORIZATION='Token ' + token)
67
- asset = load_asset_and_remove_media("optimized.jpg")
68
- asset_size = asset.size
69
- response = client.post(
70
- "/api/camomilla/media/",
71
- {
72
- "file": asset,
73
- "data": json.dumps({"translations": {"en": {"alt_text": "Test", "title": "Test", "description": "Test"}}}),
74
- },
75
- format="multipart",
76
- )
77
- assert response.status_code == 201
78
- assert Media.objects.count() == 1
79
- media = Media.objects.first()
80
- assert media.file.size < asset_size
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}