django-camomilla-cms 6.0.0b17__py2.py3-none-any.whl → 6.0.1__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/models/page.py +1 -8
- camomilla/serializers/base/__init__.py +9 -5
- camomilla/settings.py +19 -0
- camomilla/templates/defaults/base.html +60 -4
- camomilla/templatetags/model_extras.py +77 -0
- camomilla/theme/__init__.py +1 -1
- camomilla/theme/admin/pages.py +20 -0
- camomilla/theme/apps.py +1 -0
- camomilla/utils/templates.py +44 -11
- camomilla/views/base/__init__.py +4 -2
- camomilla/views/mixins/pagination.py +1 -1
- django_camomilla_cms-6.0.1.dist-info/METADATA +133 -0
- {django_camomilla_cms-6.0.0b17.dist-info → django_camomilla_cms-6.0.1.dist-info}/RECORD +29 -27
- {django_camomilla_cms-6.0.0b17.dist-info → django_camomilla_cms-6.0.1.dist-info}/WHEEL +1 -1
- tests/fixtures/__init__.py +3 -6
- tests/test_admin_page_form.py +63 -0
- tests/test_camomilla_filters.py +7 -3
- tests/test_media.py +54 -15
- tests/test_menu.py +33 -18
- tests/test_model_api.py +61 -16
- tests/test_model_api_permissions.py +7 -2
- tests/test_model_api_register.py +118 -156
- tests/test_pages.py +139 -131
- tests/test_templates_context.py +62 -24
- tests/test_utils.py +53 -83
- tests/utils/media.py +5 -4
- django_camomilla_cms-6.0.0b17.dist-info/METADATA +0 -79
- {django_camomilla_cms-6.0.0b17.dist-info → django_camomilla_cms-6.0.1.dist-info}/licenses/LICENSE +0 -0
- {django_camomilla_cms-6.0.0b17.dist-info → django_camomilla_cms-6.0.1.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
camomilla/__init__.py,sha256=
|
1
|
+
camomilla/__init__.py,sha256=Chd2aJ9tllc6G4Js9yDbwgQf9Z4QYydv95s0ijUTuIc,243
|
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
|
@@ -9,7 +9,7 @@ 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
11
|
camomilla/redirects.py,sha256=ilcyHidb5Iw3jTrXMnPntr50kkl_WB3QOB0VNkIxP7A,263
|
12
|
-
camomilla/settings.py,sha256=
|
12
|
+
camomilla/settings.py,sha256=yyQFUHAIyzqemWFbwvBCUPGQuB7KmhmnH_Mu9J20SQI,4116
|
13
13
|
camomilla/sitemap.py,sha256=U2t5TwhB_-sEscmQZ69PZ5st3bIap8NRxzWEvCgB130,786
|
14
14
|
camomilla/translation.py,sha256=_QyfTlKG6hQ_ClRfxzeJ-3oI3Nu5peJN9xFkO9Ib3As,1316
|
15
15
|
camomilla/urls.py,sha256=XgaeFoG2eXlJQve3KmFKlD-74CMLW1ziaY1mq-lrAiA,2095
|
@@ -28,7 +28,7 @@ camomilla/models/article.py,sha256=LgkZgRsubtDV6NwBz8E2bIgKD6H3I-1QLAxEan5TYYs,1
|
|
28
28
|
camomilla/models/content.py,sha256=mIgtifb_WMIt58we5u6qWZemHvuDN1zZaBeCyzHL78A,956
|
29
29
|
camomilla/models/media.py,sha256=pD-qldiHDOOHgux4lsivQLBcOJJrRx3a4Bg8ODNx7r0,6852
|
30
30
|
camomilla/models/menu.py,sha256=hUszPcn1prWCDhk4RPvbITmyhsB2CjFkaerx9t1GWnc,3766
|
31
|
-
camomilla/models/page.py,sha256=
|
31
|
+
camomilla/models/page.py,sha256=czbiKiEje4mj229_XsLMv1mOr7JzbnAD-MIMvSb9tF0,19132
|
32
32
|
camomilla/models/mixins/__init__.py,sha256=c2NixqvrIX4E9WGRqQbylXlqBWDXEqN9mzs_dpB0hFQ,1248
|
33
33
|
camomilla/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
34
34
|
camomilla/openapi/schema.py,sha256=C22dhKjaJ2DTK4KWFjyMJXiwe8NLy7ZTW5d-I1dqZ7g,2546
|
@@ -41,7 +41,7 @@ camomilla/serializers/page.py,sha256=NNjEypVYu_9iKqdHV_-61ea37gxiHlDP5gsloV_i6yg
|
|
41
41
|
camomilla/serializers/user.py,sha256=CzrHiVRvYYWNE4eNpCNKtJB7DjVqHHwIcP4NUBXMHSo,3706
|
42
42
|
camomilla/serializers/utils.py,sha256=XRL4CNwQDBNpX8xT7365Dw2Cyx8Kvh18GaadgjS9awk,968
|
43
43
|
camomilla/serializers/validators.py,sha256=X2uBlh348nJjUWHPtiu9XKCD7Etsdg0811a4xHLAUzU,2103
|
44
|
-
camomilla/serializers/base/__init__.py,sha256=
|
44
|
+
camomilla/serializers/base/__init__.py,sha256=fAUS9AZe61Nj_LlqOpImwLsW5QHG7i-SqbdorREmYPc,900
|
45
45
|
camomilla/serializers/fields/__init__.py,sha256=0I_E9oMtlC0H48LjStMQZiZ-Ycoy49nWK9GvA5JWxN8,145
|
46
46
|
camomilla/serializers/fields/file.py,sha256=yjKMho2ti9TIAzo6nwyLnNPJ6GVUumL2wxhegvYqI2o,800
|
47
47
|
camomilla/serializers/fields/related.py,sha256=qQQeUxIZSNqnVRHsXocLGmBNHjAvrlr0eDY9K2uCjWk,5069
|
@@ -60,7 +60,7 @@ camomilla/storages/default.py,sha256=GNzvV_JZpXMcfTkyXjw5CfK8EIBi3o-NXYBO0KAxD5M
|
|
60
60
|
camomilla/storages/optimize.py,sha256=VGSXZigzZC8LnPTqyTOpPA2Ba9EJB_KC5bcACoRs4GA,2762
|
61
61
|
camomilla/storages/overwrite.py,sha256=jvW3zHvXNzH9dIjeZmmfXo_O3K1ZQmLQzmlSKAOE8ZA,360
|
62
62
|
camomilla/templates/admin/camomilla/page/change_form.html,sha256=ig7rRUtylDZMINBQuVPpZLmeB4sOTV_VtqnTgzAyxEo,251
|
63
|
-
camomilla/templates/defaults/base.html,sha256=
|
63
|
+
camomilla/templates/defaults/base.html,sha256=C2gCnQP1AkERPv5w00nVhZdfg2h_8DMoIkmdf2I-VVY,8166
|
64
64
|
camomilla/templates/defaults/articles/default.html,sha256=1f89jBvNtTa1mPAbC91yy8CzeAjTWO3hhQsTuQW5OKg,239
|
65
65
|
camomilla/templates/defaults/pages/default.html,sha256=bP81Qb6M56I-fBJMywWwEu_cnERtWIX28UkGrUSRU6M,144
|
66
66
|
camomilla/templates/defaults/parts/langswitch.html,sha256=AkaQzb2KNjRYCMLUn_jE31V36rwBIwp4MneirWPiBcI,3424
|
@@ -72,10 +72,11 @@ camomilla/templates_context/rendering.py,sha256=GfTR45_gC7WT7zTKPVXkBDwe22uF63A-
|
|
72
72
|
camomilla/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
73
|
camomilla/templatetags/camomilla_filters.py,sha256=35x0-cWrRHeLhqypSLlJzEFY_fQDcRHiwZQpFgIsspE,692
|
74
74
|
camomilla/templatetags/menus.py,sha256=7fc4f9DDqtqG6wNb5_Q0km-fq0mqvGnbpR21qO1TJUw,960
|
75
|
-
camomilla/
|
76
|
-
camomilla/theme/
|
75
|
+
camomilla/templatetags/model_extras.py,sha256=6WfVDYP_OfuVJd3cNGNA55Wj9uWdrbfOZQ0ua9Xt_vc,2257
|
76
|
+
camomilla/theme/__init__.py,sha256=unmO3xtN2S1e9meUbIjG3AZVyKxUe4HSZNXDOcpZRJg,22
|
77
|
+
camomilla/theme/apps.py,sha256=Ue2H80fbFgxkQyHeU2H0fWs9Y6d-EnHYv4zz824FSRk,1066
|
77
78
|
camomilla/theme/admin/__init__.py,sha256=TALAZaE-gWshSeGc6yy7VahdX5UfeCeoOE9Q5kJCEpM,2270
|
78
|
-
camomilla/theme/admin/pages.py,sha256=
|
79
|
+
camomilla/theme/admin/pages.py,sha256=HHi8dxjqffjMQGIRpOVNgQZhtKSSx3pFIctbqoZ9J2I,2614
|
79
80
|
camomilla/theme/admin/translations.py,sha256=iAjGM1A1aYrsz1FpeybROk6rn3Ddl_oUCwgU5oD8nSw,308
|
80
81
|
camomilla/theme/static/admin/css/responsive.css,sha256=yGq6qXrr8xEVsXTnprIBgkX-sMGZrNf0Kkh-xDxf6yE,157
|
81
82
|
camomilla/theme/static/admin/img/favicon.ico,sha256=qpKv_2MaGILvyihnD1Vq9Yk-ZXGkxWTW26ciMeBFMYU,15406
|
@@ -88,7 +89,7 @@ camomilla/utils/normalization.py,sha256=RDCZtjwpEEwjvfUjQl2bEWFKw7NxTzkXco72VeO2
|
|
88
89
|
camomilla/utils/query_parser.py,sha256=TUScPzPVVJzaKdqy5NqtMOft3H5Bx6liXTVPM1yjH24,6303
|
89
90
|
camomilla/utils/seo.py,sha256=8p_a_TGgohenpJb094tT4mMxbn2xzW0qDILuTnjNocM,3324
|
90
91
|
camomilla/utils/setters.py,sha256=LV57SM65rL1_ZQkVzk9al_Q13lndVywXLkqgfIvgS0Y,915
|
91
|
-
camomilla/utils/templates.py,sha256=
|
92
|
+
camomilla/utils/templates.py,sha256=NAvvuv-fwu9CIxQY5t0RKs4GiFClOBZa9pOtcH_YP6s,1576
|
92
93
|
camomilla/utils/translation.py,sha256=w5tvTInDLegWBb1TnDWo09ckKY3K6hajuNNsngZIxPQ,4205
|
93
94
|
camomilla/views/__init__.py,sha256=94QuOnnbfMMb17mruO2ydUt286-8zBmDxEPWrJv5Wog,178
|
94
95
|
camomilla/views/articles.py,sha256=qGxebOA5iTbGGe9PfbH40YBoDPKktH8FJongg6rh2R8,571
|
@@ -100,33 +101,34 @@ camomilla/views/menus.py,sha256=Kpygnf3tMKJ30gcblUES2NW83A37Vy75ecSGSvExGKM,3301
|
|
100
101
|
camomilla/views/pages.py,sha256=UL74_u-18QdAkjVl74AVWZbRarEdIPrANTzdcM4iqmE,1338
|
101
102
|
camomilla/views/tags.py,sha256=XcYRlcBFSPPY32lt7POb6fWPJL_8HsTo5JcHcAOiOKw,479
|
102
103
|
camomilla/views/users.py,sha256=_fvsKOEtep4SJLvMva2_q-HdLQT_1KlFNt4wcl3xCJk,3130
|
103
|
-
camomilla/views/base/__init__.py,sha256=
|
104
|
+
camomilla/views/base/__init__.py,sha256=bpbVBGXLTy7No95XyDNB2U8hVXmwQJrF1VjLAS5WH90,1232
|
104
105
|
camomilla/views/mixins/__init__.py,sha256=Znv3fLYVy6lgu03Q_D8fTen4zMxI6VSRaLPDU8Cp7Ws,473
|
105
106
|
camomilla/views/mixins/bulk_actions.py,sha256=i0duWW6wey9m7I_V8-gPcHsbJyPEfSdMdj4h2i-CbPw,787
|
106
107
|
camomilla/views/mixins/language.py,sha256=hfnYznlVMrMLBdJ_f8dChJWENg7Kpt9m1yqavrdLm7E,1299
|
107
108
|
camomilla/views/mixins/optimize.py,sha256=iRPNkoeIIlJugk7DjJhDPaqeX7Opi7TxnUoMDnxJxUk,686
|
108
109
|
camomilla/views/mixins/ordering.py,sha256=mh7fqPyVCVJh84Nl2pYFQouzGxa-ANF3Wqv0pCb7OVU,4779
|
109
|
-
camomilla/views/mixins/pagination.py,sha256=
|
110
|
+
camomilla/views/mixins/pagination.py,sha256=Ssa5mMgAgyl7sUk0yum2uVifg6esdGmUTqMSJYacE40,5772
|
110
111
|
camomilla/views/mixins/permissions.py,sha256=TPmR3Hoa3BjeJu9rCE_7lpLOAupue4WI42C21HTo6X4,200
|
111
|
-
django_camomilla_cms-6.0.
|
112
|
+
django_camomilla_cms-6.0.1.dist-info/licenses/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
|
112
113
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
|
+
tests/test_admin_page_form.py,sha256=DRJxekEKeYMCf9q62ax7iBeJGhEP2NZ8o02krZBR_DA,1971
|
113
115
|
tests/test_api.py,sha256=t03EFDezGgm4UJl8RIVvnTUkAGTB6ptm0G2lHBQ7ljc,1833
|
114
|
-
tests/test_camomilla_filters.py,sha256=
|
115
|
-
tests/test_media.py,sha256=
|
116
|
-
tests/test_menu.py,sha256=
|
117
|
-
tests/test_model_api.py,sha256=
|
118
|
-
tests/test_model_api_permissions.py,sha256=
|
119
|
-
tests/test_model_api_register.py,sha256=
|
116
|
+
tests/test_camomilla_filters.py,sha256=rUK8iEyUNH28uTd8Ac13OikiH4Xi-V4wbtS-XjJoG24,1580
|
117
|
+
tests/test_media.py,sha256=n5PQmpMvw-a2epmq_60R0X-vVOa4BeyKMZkguGJzKa0,5243
|
118
|
+
tests/test_menu.py,sha256=hrTikgXNnry1bS-t5K7UGYreEJ3m-FU0r4pduumwTd4,3791
|
119
|
+
tests/test_model_api.py,sha256=ml3OlLuBfcnr2EMjwQLvVDPT2adSQ7WS4IxxXKD1InU,4121
|
120
|
+
tests/test_model_api_permissions.py,sha256=lUlcYAOasFFQjMFnqhGXlXriCH-f6xdYSCn1Gqf1eSU,1838
|
121
|
+
tests/test_model_api_register.py,sha256=txKaVTGt-DGrmI-6xcUEluPd7ArNi80VvlqBVXdH8zk,13555
|
120
122
|
tests/test_models.py,sha256=WJs8lxWZWn1l7X3a_QFVc8fF5LHTsI8bc3uhQe6-o-Q,684
|
121
|
-
tests/test_pages.py,sha256=
|
123
|
+
tests/test_pages.py,sha256=aXKI0l12lc6jmY3uJXDNwznVNH7SEIiujANvSo_rhIo,11911
|
122
124
|
tests/test_query_parser.py,sha256=R9l0L2QDEDcm2b6IFUhyf7wMXLzL9RySLkzKTWRtBkE,2097
|
123
|
-
tests/test_templates_context.py,sha256=
|
124
|
-
tests/test_utils.py,sha256=
|
125
|
-
tests/fixtures/__init__.py,sha256=
|
125
|
+
tests/test_templates_context.py,sha256=zGdmbQMGNXB2V_15BaQDIgqFMnVjBAw969n1tu3m7HY,5626
|
126
|
+
tests/test_utils.py,sha256=ow4csGfU5WzMgAT5zWjZIxZwW1-BqnMduDt8hOzf9cE,2166
|
127
|
+
tests/fixtures/__init__.py,sha256=ixyA6ZsmYbiKEsjQGOGoG4KyJmwWrf-qeoQjQG3J66U,426
|
126
128
|
tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
127
129
|
tests/utils/api.py,sha256=TYcDXeILHtBwzwG0acwPFmiqMZnlF9VnLB0Ydhg55vA,865
|
128
|
-
tests/utils/media.py,sha256
|
129
|
-
django_camomilla_cms-6.0.
|
130
|
-
django_camomilla_cms-6.0.
|
131
|
-
django_camomilla_cms-6.0.
|
132
|
-
django_camomilla_cms-6.0.
|
130
|
+
tests/utils/media.py,sha256=-cnrQzzVuhNSb5rT5xMUs5f3yYpBnS0fVGDcjgsb8lw,291
|
131
|
+
django_camomilla_cms-6.0.1.dist-info/METADATA,sha256=JrWJpDNYLZJEirL-izKANrA95xxLSL6go3mHCmeHIMA,5652
|
132
|
+
django_camomilla_cms-6.0.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
133
|
+
django_camomilla_cms-6.0.1.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
|
134
|
+
django_camomilla_cms-6.0.1.dist-info/RECORD,,
|
tests/fixtures/__init__.py
CHANGED
@@ -4,14 +4,11 @@ from django.core.files.uploadedfile import SimpleUploadedFile
|
|
4
4
|
|
5
5
|
|
6
6
|
def load_json_fixture(filename):
|
7
|
-
with open(os.path.join(os.path.dirname(__file__),
|
7
|
+
with open(os.path.join(os.path.dirname(__file__), "json", filename), "r") as f:
|
8
8
|
return json.load(f)
|
9
9
|
|
10
10
|
|
11
11
|
def load_asset(filename):
|
12
|
-
with open(os.path.join(os.path.dirname(__file__),
|
13
|
-
up_file = SimpleUploadedFile(
|
14
|
-
filename,
|
15
|
-
f.read()
|
16
|
-
)
|
12
|
+
with open(os.path.join(os.path.dirname(__file__), "assets", filename), "rb") as f:
|
13
|
+
up_file = SimpleUploadedFile(filename, f.read())
|
17
14
|
return up_file
|
@@ -0,0 +1,63 @@
|
|
1
|
+
import responses
|
2
|
+
from django.test import TestCase
|
3
|
+
from camomilla.models import Page
|
4
|
+
from camomilla.utils.templates import get_templates
|
5
|
+
from camomilla.theme.admin import PageAdmin
|
6
|
+
from django.contrib.admin.sites import AdminSite
|
7
|
+
from camomilla.settings import INTEGRATIONS_ASTRO_URL
|
8
|
+
|
9
|
+
|
10
|
+
class MockRequest:
|
11
|
+
pass
|
12
|
+
|
13
|
+
|
14
|
+
request = MockRequest()
|
15
|
+
|
16
|
+
|
17
|
+
class MockRequestWithCookies:
|
18
|
+
def __init__(self):
|
19
|
+
self.COOKIES = {"sessionid": "mock_session_id", "csrftoken": "mock_csrf_token"}
|
20
|
+
|
21
|
+
|
22
|
+
request_with_cookies = MockRequestWithCookies()
|
23
|
+
|
24
|
+
|
25
|
+
class AdminPageFormTestCase(TestCase):
|
26
|
+
def setUp(self):
|
27
|
+
self.astro_api_url = INTEGRATIONS_ASTRO_URL + "/api/templates"
|
28
|
+
|
29
|
+
@responses.activate
|
30
|
+
def test_admin_page_form_astro_error(self):
|
31
|
+
responses.add(
|
32
|
+
responses.GET,
|
33
|
+
self.astro_api_url,
|
34
|
+
status=500, # Simulating a server error
|
35
|
+
)
|
36
|
+
|
37
|
+
page_admin = PageAdmin(Page, AdminSite())
|
38
|
+
form = page_admin.get_form(request)()
|
39
|
+
self.assertEqual(len(list(form.fields)), 33)
|
40
|
+
self.assertTrue("template" in list(form.fields))
|
41
|
+
self.assertListEqual(
|
42
|
+
form.fields["template"].widget.choices,
|
43
|
+
[("", "---------")] + [(t, t) for t in get_templates(request)],
|
44
|
+
)
|
45
|
+
|
46
|
+
@responses.activate
|
47
|
+
def test_admin_page_form(self):
|
48
|
+
responses.add(
|
49
|
+
responses.GET,
|
50
|
+
self.astro_api_url,
|
51
|
+
json=["mock_template/1", "mock_template/2"],
|
52
|
+
status=200,
|
53
|
+
)
|
54
|
+
|
55
|
+
page_admin = PageAdmin(Page, AdminSite())
|
56
|
+
form = page_admin.get_form(request_with_cookies)()
|
57
|
+
self.assertEqual(len(list(form.fields)), 33)
|
58
|
+
self.assertTrue("template" in list(form.fields))
|
59
|
+
self.assertListEqual(
|
60
|
+
form.fields["template"].widget.choices,
|
61
|
+
[("", "---------")] + [(t, t) for t in get_templates(request_with_cookies)],
|
62
|
+
)
|
63
|
+
self.assertEqual(responses.calls[0].request.url, self.astro_api_url)
|
tests/test_camomilla_filters.py
CHANGED
@@ -17,7 +17,9 @@ class CamomillaFiltersTestCase(TestCase):
|
|
17
17
|
pass
|
18
18
|
|
19
19
|
def test_filter_content(self):
|
20
|
-
Page.objects.create(
|
20
|
+
Page.objects.create(
|
21
|
+
identifier="path", title="Path", permalink="/path", status="PUB"
|
22
|
+
)
|
21
23
|
request_factory = RequestFactory()
|
22
24
|
request = request_factory.get("/path")
|
23
25
|
request.META["HTTP_HOST"] = "localhost"
|
@@ -33,9 +35,11 @@ class CamomillaFiltersTestCase(TestCase):
|
|
33
35
|
self.assertEqual(content.content, "Hello World!")
|
34
36
|
|
35
37
|
def test_filter_alternate_urls(self):
|
36
|
-
Page.objects.create(
|
38
|
+
Page.objects.create(
|
39
|
+
identifier="path", title="Path", permalink="/path", status="PUB"
|
40
|
+
)
|
37
41
|
request = RequestFactory().get("/path")
|
38
42
|
request.META["HTTP_HOST"] = "localhost"
|
39
43
|
page = Page.get(request)
|
40
44
|
alt_urls = dict(alternate_urls(page, request))
|
41
|
-
self.assertEqual(alt_urls, {
|
45
|
+
self.assertEqual(alt_urls, {"it": None, "en": "/path/"})
|
tests/test_media.py
CHANGED
@@ -8,11 +8,12 @@ from rest_framework.test import APIClient
|
|
8
8
|
|
9
9
|
client = APIClient()
|
10
10
|
|
11
|
+
|
11
12
|
class MediaTestCase(TestCase):
|
12
13
|
def setUp(self):
|
13
14
|
self.client = APIClient()
|
14
15
|
token = login_superuser()
|
15
|
-
self.client.credentials(HTTP_AUTHORIZATION=
|
16
|
+
self.client.credentials(HTTP_AUTHORIZATION="Token " + token)
|
16
17
|
|
17
18
|
@pytest.mark.django_db
|
18
19
|
def test_media_api_crud(self):
|
@@ -22,7 +23,17 @@ class MediaTestCase(TestCase):
|
|
22
23
|
"/api/camomilla/media/",
|
23
24
|
{
|
24
25
|
"file": asset,
|
25
|
-
"data": json.dumps(
|
26
|
+
"data": json.dumps(
|
27
|
+
{
|
28
|
+
"translations": {
|
29
|
+
"en": {
|
30
|
+
"alt_text": "Test 1",
|
31
|
+
"title": "Test 1",
|
32
|
+
"description": "Test 1",
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
),
|
26
37
|
},
|
27
38
|
format="multipart",
|
28
39
|
)
|
@@ -40,13 +51,23 @@ class MediaTestCase(TestCase):
|
|
40
51
|
"/api/camomilla/media/",
|
41
52
|
{
|
42
53
|
"file": asset,
|
43
|
-
"data": json.dumps(
|
54
|
+
"data": json.dumps(
|
55
|
+
{
|
56
|
+
"translations": {
|
57
|
+
"en": {
|
58
|
+
"alt_text": "Test 2",
|
59
|
+
"title": "Test 2",
|
60
|
+
"description": "Test 2",
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
),
|
44
65
|
},
|
45
66
|
format="multipart",
|
46
67
|
)
|
47
68
|
assert response.status_code == 201
|
48
69
|
assert Media.objects.count() == 2
|
49
|
-
media = Media.objects.first()
|
70
|
+
media = Media.objects.first() # Ordering in model is descending -pk
|
50
71
|
assert media.alt_text == "Test 2"
|
51
72
|
assert media.title == "Test 2"
|
52
73
|
assert media.description == "Test 2"
|
@@ -55,17 +76,17 @@ class MediaTestCase(TestCase):
|
|
55
76
|
# Read media
|
56
77
|
response = self.client.get("/api/camomilla/media/2/")
|
57
78
|
assert response.status_code == 200
|
58
|
-
assert response.json()[
|
59
|
-
assert response.json()[
|
60
|
-
assert response.json()[
|
79
|
+
assert response.json()["id"] == 2
|
80
|
+
assert response.json()["title"] == "Test 2"
|
81
|
+
assert response.json()["file"] == "http://testserver/media/37059501.png"
|
61
82
|
|
62
83
|
# Read medias
|
63
84
|
response = self.client.get("/api/camomilla/media/")
|
64
85
|
assert response.status_code == 200
|
65
|
-
assert response.json()[0][
|
66
|
-
assert response.json()[0][
|
67
|
-
assert response.json()[1][
|
68
|
-
assert response.json()[1][
|
86
|
+
assert response.json()[0]["id"] == 2 # Ordering in model is descending -pk
|
87
|
+
assert response.json()[0]["title"] == "Test 2"
|
88
|
+
assert response.json()[1]["id"] == 1
|
89
|
+
assert response.json()[1]["title"] == "Test 1"
|
69
90
|
|
70
91
|
# Delete media
|
71
92
|
response = self.client.delete("/api/camomilla/media/2/")
|
@@ -75,7 +96,6 @@ class MediaTestCase(TestCase):
|
|
75
96
|
assert media.id == 1
|
76
97
|
assert media.title == "Test 1"
|
77
98
|
|
78
|
-
|
79
99
|
@pytest.mark.django_db
|
80
100
|
def test_media_compression(self):
|
81
101
|
asset = load_asset_and_remove_media("Sample-jpg-image-10mb.jpg")
|
@@ -84,7 +104,17 @@ class MediaTestCase(TestCase):
|
|
84
104
|
"/api/camomilla/media/",
|
85
105
|
{
|
86
106
|
"file": asset,
|
87
|
-
"data": json.dumps(
|
107
|
+
"data": json.dumps(
|
108
|
+
{
|
109
|
+
"translations": {
|
110
|
+
"en": {
|
111
|
+
"alt_text": "Test",
|
112
|
+
"title": "Test",
|
113
|
+
"description": "Test",
|
114
|
+
}
|
115
|
+
}
|
116
|
+
}
|
117
|
+
),
|
88
118
|
},
|
89
119
|
format="multipart",
|
90
120
|
)
|
@@ -94,7 +124,6 @@ class MediaTestCase(TestCase):
|
|
94
124
|
assert media.file.size < asset_size
|
95
125
|
assert media.file.size < 1000000 # 1MB
|
96
126
|
|
97
|
-
|
98
127
|
@pytest.mark.django_db
|
99
128
|
def test_inflating_prevent(self):
|
100
129
|
asset = load_asset_and_remove_media("optimized.jpg")
|
@@ -103,7 +132,17 @@ class MediaTestCase(TestCase):
|
|
103
132
|
"/api/camomilla/media/",
|
104
133
|
{
|
105
134
|
"file": asset,
|
106
|
-
"data": json.dumps(
|
135
|
+
"data": json.dumps(
|
136
|
+
{
|
137
|
+
"translations": {
|
138
|
+
"en": {
|
139
|
+
"alt_text": "Test",
|
140
|
+
"title": "Test",
|
141
|
+
"description": "Test",
|
142
|
+
}
|
143
|
+
}
|
144
|
+
}
|
145
|
+
),
|
107
146
|
},
|
108
147
|
format="multipart",
|
109
148
|
)
|
tests/test_menu.py
CHANGED
@@ -11,10 +11,10 @@ class MenuTestCase(TestCase):
|
|
11
11
|
def setUp(self):
|
12
12
|
self.client = APIClient()
|
13
13
|
token = login_superuser()
|
14
|
-
self.client.credentials(HTTP_AUTHORIZATION=
|
14
|
+
self.client.credentials(HTTP_AUTHORIZATION="Token " + token)
|
15
15
|
|
16
|
-
def renderTemplate(self, template, context
|
17
|
-
return Template(
|
16
|
+
def renderTemplate(self, template, context=None):
|
17
|
+
return Template("{% load menus %}" + template).render(Context(context))
|
18
18
|
|
19
19
|
@pytest.mark.django_db
|
20
20
|
def test_template_render_menu(self):
|
@@ -35,7 +35,7 @@ class MenuTestCase(TestCase):
|
|
35
35
|
self.renderTemplate('{% render_menu "key_3" %}')
|
36
36
|
self.renderTemplate('{% render_menu "key_4" %}')
|
37
37
|
|
38
|
-
rendered = html.unescape(self.renderTemplate(
|
38
|
+
rendered = html.unescape(self.renderTemplate("{% get_menus %}"))
|
39
39
|
assert rendered == "{'key_3': <Menu: key_3>, 'key_4': <Menu: key_4>}"
|
40
40
|
|
41
41
|
rendered = html.unescape(self.renderTemplate('{% get_menus "arg" %}'))
|
@@ -43,9 +43,11 @@ class MenuTestCase(TestCase):
|
|
43
43
|
|
44
44
|
rendered = html.unescape(self.renderTemplate('{% get_menus "key_3" %}'))
|
45
45
|
assert rendered == "{'key_3': <Menu: key_3>}"
|
46
|
-
|
46
|
+
|
47
47
|
menus = 'test "menus" in context'
|
48
|
-
rendered =
|
48
|
+
rendered = html.unescape(
|
49
|
+
self.renderTemplate("{% get_menus %}", {"menus": menus})
|
50
|
+
)
|
49
51
|
assert rendered == menus
|
50
52
|
|
51
53
|
@pytest.mark.django_db
|
@@ -53,7 +55,9 @@ class MenuTestCase(TestCase):
|
|
53
55
|
self.renderTemplate('{% render_menu "key_5" %}')
|
54
56
|
|
55
57
|
menu = Menu.objects.first()
|
56
|
-
menu.nodes = [
|
58
|
+
menu.nodes = [
|
59
|
+
{"title": "key_5_node_title", "link": {"static": "key_5_url_static"}}
|
60
|
+
]
|
57
61
|
menu.save()
|
58
62
|
|
59
63
|
rendered = html.unescape(self.renderTemplate('{% render_menu "key_5" %}'))
|
@@ -64,11 +68,17 @@ class MenuTestCase(TestCase):
|
|
64
68
|
self.renderTemplate('{% render_menu "key_6_custom" %}')
|
65
69
|
|
66
70
|
menu = Menu.objects.first()
|
67
|
-
menu.nodes = [
|
71
|
+
menu.nodes = [
|
72
|
+
{"title": "key_6_node_title", "link": {"static": "key_6_url_static"}}
|
73
|
+
]
|
68
74
|
menu.save()
|
69
75
|
|
70
|
-
rendered = html.unescape(
|
71
|
-
|
76
|
+
rendered = html.unescape(
|
77
|
+
self.renderTemplate(
|
78
|
+
'{% render_menu "key_6_custom" "website/menu_custom.html" %}'
|
79
|
+
)
|
80
|
+
)
|
81
|
+
assert {"This is custom menu: key_6_node_title" in rendered}
|
72
82
|
|
73
83
|
@pytest.mark.django_db
|
74
84
|
def test_menu_in_page_template(self):
|
@@ -77,20 +87,25 @@ class MenuTestCase(TestCase):
|
|
77
87
|
response = self.client.post(
|
78
88
|
"/api/camomilla/pages/",
|
79
89
|
{
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
90
|
+
"translations": {
|
91
|
+
"en": {
|
92
|
+
"title": "title_page_menu_1",
|
93
|
+
"permalink": "permalink_page_menu_en_1",
|
94
|
+
"autopermalink": False,
|
95
|
+
}
|
85
96
|
}
|
86
|
-
}
|
87
97
|
},
|
88
|
-
format=
|
98
|
+
format="json",
|
89
99
|
)
|
90
100
|
assert response.status_code == 201
|
91
101
|
|
92
102
|
menu = Menu.objects.first()
|
93
|
-
menu.nodes = [
|
103
|
+
menu.nodes = [
|
104
|
+
{
|
105
|
+
"title": "key_7_node_title",
|
106
|
+
"link": {"page": {"id": 1, "model": "camomilla.page"}},
|
107
|
+
}
|
108
|
+
]
|
94
109
|
menu.save()
|
95
110
|
|
96
111
|
rendered = html.unescape(self.renderTemplate('{% render_menu "key_7" %}'))
|
tests/test_model_api.py
CHANGED
@@ -12,7 +12,9 @@ client = APIClient()
|
|
12
12
|
def init_test():
|
13
13
|
token = login_superuser()
|
14
14
|
client.credentials(HTTP_AUTHORIZATION="Token " + token)
|
15
|
-
SimpleRelationModel.objects.bulk_create(
|
15
|
+
SimpleRelationModel.objects.bulk_create(
|
16
|
+
[SimpleRelationModel(name=f"test{i}") for i in range(1, 10)]
|
17
|
+
)
|
16
18
|
|
17
19
|
|
18
20
|
@pytest.mark.django_db
|
@@ -23,7 +25,9 @@ def test_simple_relation_model_api_endpoint():
|
|
23
25
|
response = client.get("/api/models/simple-relation-model/1/")
|
24
26
|
assert response.status_code == 200
|
25
27
|
assert response.json()["name"] == "test1"
|
26
|
-
response = client.patch(
|
28
|
+
response = client.patch(
|
29
|
+
"/api/models/simple-relation-model/1/", {"name": "updated"}, format="json"
|
30
|
+
)
|
27
31
|
assert response.status_code == 200
|
28
32
|
assert response.json()["name"] == "updated"
|
29
33
|
response = client.delete("/api/models/simple-relation-model/1/")
|
@@ -33,7 +37,10 @@ def test_simple_relation_model_api_endpoint():
|
|
33
37
|
assert len(response.json()) == 8
|
34
38
|
response = client.get("/api/models/simple-relation-model/1/")
|
35
39
|
assert response.status_code == 404
|
36
|
-
assert response.json() in [
|
40
|
+
assert response.json() in [
|
41
|
+
{"detail": "Not found."},
|
42
|
+
{"detail": "No SimpleRelationModel matches the given query."},
|
43
|
+
]
|
37
44
|
|
38
45
|
|
39
46
|
@pytest.mark.django_db
|
@@ -45,24 +52,62 @@ def test_test_model_api_endpoint():
|
|
45
52
|
response = client.post("/api/models/test-model/", test_model_data, format="json")
|
46
53
|
assert response.status_code == 201
|
47
54
|
assert response.json()["title"] == test_model_data["title"]
|
48
|
-
assert
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
assert
|
53
|
-
|
55
|
+
assert (
|
56
|
+
response.json()["structured_data"]["name"]
|
57
|
+
== test_model_data["structured_data"]["name"]
|
58
|
+
)
|
59
|
+
assert (
|
60
|
+
response.json()["structured_data"]["age"]
|
61
|
+
== test_model_data["structured_data"]["age"]
|
62
|
+
)
|
63
|
+
assert (
|
64
|
+
response.json()["structured_data"]["child"]["name"]
|
65
|
+
== test_model_data["structured_data"]["child"]["name"]
|
66
|
+
)
|
67
|
+
assert (
|
68
|
+
response.json()["structured_data"]["childs"][0]["name"]
|
69
|
+
== test_model_data["structured_data"]["childs"][0]["name"]
|
70
|
+
)
|
71
|
+
assert (
|
72
|
+
response.json()["structured_data"]["fk_field"]["id"]
|
73
|
+
== test_model_data["structured_data"]["fk_field"]["id"]
|
74
|
+
)
|
75
|
+
assert (
|
76
|
+
response.json()["structured_data"]["qs_field"][0]["id"]
|
77
|
+
== test_model_data["structured_data"]["qs_field"][0]["id"]
|
78
|
+
)
|
54
79
|
response = client.get("/api/models/test-model/")
|
55
80
|
assert response.status_code == 200
|
56
81
|
assert len(response.json()) == 1
|
57
82
|
response = client.get("/api/models/test-model/1/")
|
58
83
|
assert response.status_code == 200
|
59
84
|
assert response.json()["title"] == test_model_data["title"]
|
60
|
-
assert
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
assert
|
65
|
-
|
66
|
-
|
85
|
+
assert (
|
86
|
+
response.json()["structured_data"]["name"]
|
87
|
+
== test_model_data["structured_data"]["name"]
|
88
|
+
)
|
89
|
+
assert (
|
90
|
+
response.json()["structured_data"]["age"]
|
91
|
+
== test_model_data["structured_data"]["age"]
|
92
|
+
)
|
93
|
+
assert (
|
94
|
+
response.json()["structured_data"]["child"]["name"]
|
95
|
+
== test_model_data["structured_data"]["child"]["name"]
|
96
|
+
)
|
97
|
+
assert (
|
98
|
+
response.json()["structured_data"]["childs"][0]["name"]
|
99
|
+
== test_model_data["structured_data"]["childs"][0]["name"]
|
100
|
+
)
|
101
|
+
assert (
|
102
|
+
response.json()["structured_data"]["fk_field"]["id"]
|
103
|
+
== test_model_data["structured_data"]["fk_field"]["id"]
|
104
|
+
)
|
105
|
+
assert (
|
106
|
+
response.json()["structured_data"]["qs_field"][0]["id"]
|
107
|
+
== test_model_data["structured_data"]["qs_field"][0]["id"]
|
108
|
+
)
|
109
|
+
response = client.patch(
|
110
|
+
"/api/models/test-model/1/", {"title": "updated"}, format="json"
|
111
|
+
)
|
67
112
|
assert response.status_code == 200
|
68
113
|
assert response.json()["title"] == "updated"
|
@@ -26,7 +26,9 @@ def test_right_permissions():
|
|
26
26
|
assert len(response.json()) == 1
|
27
27
|
response = client.get("/api/models/test-model/1/")
|
28
28
|
assert response.status_code == 200
|
29
|
-
response = client.patch(
|
29
|
+
response = client.patch(
|
30
|
+
"/api/models/test-model/1/", {"title": "updated"}, format="json"
|
31
|
+
)
|
30
32
|
assert response.status_code == 200
|
31
33
|
assert response.json()["title"] == "updated"
|
32
34
|
response = client.delete("/api/models/test-model/1/")
|
@@ -36,4 +38,7 @@ def test_right_permissions():
|
|
36
38
|
assert len(response.json()) == 0
|
37
39
|
response = client.get("/api/models/test-model/1/")
|
38
40
|
assert response.status_code == 404
|
39
|
-
assert response.json() in [
|
41
|
+
assert response.json() in [
|
42
|
+
{"detail": "Not found."},
|
43
|
+
{"detail": "No TestModel matches the given query."},
|
44
|
+
]
|