django-camomilla-cms 6.0.0b18__py2.py3-none-any.whl → 6.1.0__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 +22 -10
- camomilla/serializers/base/__init__.py +9 -5
- camomilla/serializers/page.py +4 -3
- camomilla/settings.py +22 -3
- camomilla/templatetags/model_extras.py +8 -4
- camomilla/theme/__init__.py +1 -1
- camomilla/theme/admin/pages.py +20 -0
- camomilla/urls.py +3 -3
- camomilla/utils/templates.py +27 -7
- camomilla/views/base/__init__.py +4 -2
- camomilla/views/menus.py +8 -3
- camomilla/views/mixins/pagination.py +1 -1
- camomilla/views/pages.py +4 -4
- django_camomilla_cms-6.1.0.dist-info/METADATA +133 -0
- {django_camomilla_cms-6.0.0b18.dist-info → django_camomilla_cms-6.1.0.dist-info}/RECORD +32 -29
- {django_camomilla_cms-6.0.0b18.dist-info → django_camomilla_cms-6.1.0.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_page_meta.py +88 -0
- tests/test_page_relation_api.py +77 -0
- tests/test_pages.py +137 -131
- tests/test_templates_context.py +62 -24
- tests/test_utils.py +53 -83
- django_camomilla_cms-6.0.0b18.dist-info/METADATA +0 -79
- {django_camomilla_cms-6.0.0b18.dist-info → django_camomilla_cms-6.1.0.dist-info}/licenses/LICENSE +0 -0
- {django_camomilla_cms-6.0.0b18.dist-info → django_camomilla_cms-6.1.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
camomilla/__init__.py,sha256=
|
1
|
+
camomilla/__init__.py,sha256=R1pWTtcXHHHh0t0eJesB_UA9sQWaAVY2b2JPbeBk_68,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,10 +9,10 @@ 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=lEQPysEJZ_0c9Bkr1P38rO2csPrcNCdqeLqGp1aMS2I,4362
|
13
13
|
camomilla/sitemap.py,sha256=U2t5TwhB_-sEscmQZ69PZ5st3bIap8NRxzWEvCgB130,786
|
14
14
|
camomilla/translation.py,sha256=_QyfTlKG6hQ_ClRfxzeJ-3oI3Nu5peJN9xFkO9Ib3As,1316
|
15
|
-
camomilla/urls.py,sha256=
|
15
|
+
camomilla/urls.py,sha256=umWlVDJ_J4aPkqeSbHJznrGJi0marvWi8TfSmsRT5a0,2101
|
16
16
|
camomilla/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
17
|
camomilla/contrib/modeltranslation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
18
18
|
camomilla/contrib/modeltranslation/hvad_migration.py,sha256=3j_q_Q85eF4iHbU4LG1Zr3LOmfmGmFiVSL-C8KvPsJQ,5409
|
@@ -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=hL2txxJv5MScU-BsphZUYCybllNAEiR3Dd25c_AS35Y,19976
|
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
|
@@ -37,11 +37,11 @@ camomilla/serializers/article.py,sha256=pYVcS0KztzjzSqgruElQMMEZcqTzmQUqXrdv_Sx5
|
|
37
37
|
camomilla/serializers/content_type.py,sha256=qB2wkmkvQI6LHxfSI6auEh6M9cJRFBaHnpmkBCCzeYo,557
|
38
38
|
camomilla/serializers/media.py,sha256=H4JVpRVxXVmn_BiqrjihKXpfLm9fLmHDFIICRDGJU4s,1940
|
39
39
|
camomilla/serializers/menu.py,sha256=TdoyXs40PqxNevnRbBbYOOX9rUv9zQGiHFNduspaZnw,552
|
40
|
-
camomilla/serializers/page.py,sha256=
|
40
|
+
camomilla/serializers/page.py,sha256=n2gfRkKXiQuCHEIGnJ2gC1sFsFitBxZ6WZ3bxpr_C5Q,1885
|
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
|
@@ -72,11 +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/templatetags/model_extras.py,sha256=
|
76
|
-
camomilla/theme/__init__.py,sha256
|
75
|
+
camomilla/templatetags/model_extras.py,sha256=6WfVDYP_OfuVJd3cNGNA55Wj9uWdrbfOZQ0ua9Xt_vc,2257
|
76
|
+
camomilla/theme/__init__.py,sha256=PD5agZ0_DXqsFLMBR0hacZV3LbzGbH8qn-j7MIAm3Xs,22
|
77
77
|
camomilla/theme/apps.py,sha256=Ue2H80fbFgxkQyHeU2H0fWs9Y6d-EnHYv4zz824FSRk,1066
|
78
78
|
camomilla/theme/admin/__init__.py,sha256=TALAZaE-gWshSeGc6yy7VahdX5UfeCeoOE9Q5kJCEpM,2270
|
79
|
-
camomilla/theme/admin/pages.py,sha256=
|
79
|
+
camomilla/theme/admin/pages.py,sha256=HHi8dxjqffjMQGIRpOVNgQZhtKSSx3pFIctbqoZ9J2I,2614
|
80
80
|
camomilla/theme/admin/translations.py,sha256=iAjGM1A1aYrsz1FpeybROk6rn3Ddl_oUCwgU5oD8nSw,308
|
81
81
|
camomilla/theme/static/admin/css/responsive.css,sha256=yGq6qXrr8xEVsXTnprIBgkX-sMGZrNf0Kkh-xDxf6yE,157
|
82
82
|
camomilla/theme/static/admin/img/favicon.ico,sha256=qpKv_2MaGILvyihnD1Vq9Yk-ZXGkxWTW26ciMeBFMYU,15406
|
@@ -89,7 +89,7 @@ camomilla/utils/normalization.py,sha256=RDCZtjwpEEwjvfUjQl2bEWFKw7NxTzkXco72VeO2
|
|
89
89
|
camomilla/utils/query_parser.py,sha256=TUScPzPVVJzaKdqy5NqtMOft3H5Bx6liXTVPM1yjH24,6303
|
90
90
|
camomilla/utils/seo.py,sha256=8p_a_TGgohenpJb094tT4mMxbn2xzW0qDILuTnjNocM,3324
|
91
91
|
camomilla/utils/setters.py,sha256=LV57SM65rL1_ZQkVzk9al_Q13lndVywXLkqgfIvgS0Y,915
|
92
|
-
camomilla/utils/templates.py,sha256=
|
92
|
+
camomilla/utils/templates.py,sha256=NAvvuv-fwu9CIxQY5t0RKs4GiFClOBZa9pOtcH_YP6s,1576
|
93
93
|
camomilla/utils/translation.py,sha256=w5tvTInDLegWBb1TnDWo09ckKY3K6hajuNNsngZIxPQ,4205
|
94
94
|
camomilla/views/__init__.py,sha256=94QuOnnbfMMb17mruO2ydUt286-8zBmDxEPWrJv5Wog,178
|
95
95
|
camomilla/views/articles.py,sha256=qGxebOA5iTbGGe9PfbH40YBoDPKktH8FJongg6rh2R8,571
|
@@ -97,37 +97,40 @@ camomilla/views/contents.py,sha256=JxvnmgeK8JEmCMLzVG8pVq2DwvmjXtgnIdsDnn74tA4,1
|
|
97
97
|
camomilla/views/decorators.py,sha256=hR--nTGQn2mMKDrWn-0Ildzbsvp11OfoWAtedKEzmiA,982
|
98
98
|
camomilla/views/languages.py,sha256=Rt_X7s3dbDBv4dxsQ9fnav_u0TAzzo8fGKBBx3esDsg,441
|
99
99
|
camomilla/views/medias.py,sha256=XYa-NTLLQmSSynpfrFT3av-K_r59aRns3dTGfYMj-0Q,3002
|
100
|
-
camomilla/views/menus.py,sha256=
|
101
|
-
camomilla/views/pages.py,sha256=
|
100
|
+
camomilla/views/menus.py,sha256=2uEeQc68wmmxiQ-mEG9wj1m18uF9f4oq-_5anAVOIbw,3449
|
101
|
+
camomilla/views/pages.py,sha256=GwLRcyrLqL3g4BFcbGQ2b0yspA-osA092zTMgVys56M,1345
|
102
102
|
camomilla/views/tags.py,sha256=XcYRlcBFSPPY32lt7POb6fWPJL_8HsTo5JcHcAOiOKw,479
|
103
103
|
camomilla/views/users.py,sha256=_fvsKOEtep4SJLvMva2_q-HdLQT_1KlFNt4wcl3xCJk,3130
|
104
|
-
camomilla/views/base/__init__.py,sha256=
|
104
|
+
camomilla/views/base/__init__.py,sha256=bpbVBGXLTy7No95XyDNB2U8hVXmwQJrF1VjLAS5WH90,1232
|
105
105
|
camomilla/views/mixins/__init__.py,sha256=Znv3fLYVy6lgu03Q_D8fTen4zMxI6VSRaLPDU8Cp7Ws,473
|
106
106
|
camomilla/views/mixins/bulk_actions.py,sha256=i0duWW6wey9m7I_V8-gPcHsbJyPEfSdMdj4h2i-CbPw,787
|
107
107
|
camomilla/views/mixins/language.py,sha256=hfnYznlVMrMLBdJ_f8dChJWENg7Kpt9m1yqavrdLm7E,1299
|
108
108
|
camomilla/views/mixins/optimize.py,sha256=iRPNkoeIIlJugk7DjJhDPaqeX7Opi7TxnUoMDnxJxUk,686
|
109
109
|
camomilla/views/mixins/ordering.py,sha256=mh7fqPyVCVJh84Nl2pYFQouzGxa-ANF3Wqv0pCb7OVU,4779
|
110
|
-
camomilla/views/mixins/pagination.py,sha256=
|
110
|
+
camomilla/views/mixins/pagination.py,sha256=Ssa5mMgAgyl7sUk0yum2uVifg6esdGmUTqMSJYacE40,5772
|
111
111
|
camomilla/views/mixins/permissions.py,sha256=TPmR3Hoa3BjeJu9rCE_7lpLOAupue4WI42C21HTo6X4,200
|
112
|
-
django_camomilla_cms-6.0.
|
112
|
+
django_camomilla_cms-6.1.0.dist-info/licenses/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
|
113
113
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
114
|
+
tests/test_admin_page_form.py,sha256=DRJxekEKeYMCf9q62ax7iBeJGhEP2NZ8o02krZBR_DA,1971
|
114
115
|
tests/test_api.py,sha256=t03EFDezGgm4UJl8RIVvnTUkAGTB6ptm0G2lHBQ7ljc,1833
|
115
|
-
tests/test_camomilla_filters.py,sha256=
|
116
|
-
tests/test_media.py,sha256=
|
117
|
-
tests/test_menu.py,sha256=
|
118
|
-
tests/test_model_api.py,sha256=
|
119
|
-
tests/test_model_api_permissions.py,sha256=
|
120
|
-
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
|
121
122
|
tests/test_models.py,sha256=WJs8lxWZWn1l7X3a_QFVc8fF5LHTsI8bc3uhQe6-o-Q,684
|
122
|
-
tests/
|
123
|
+
tests/test_page_meta.py,sha256=QFmX97LBYSuHn9vJPM80MWZc3BwfGO5V-sCClk7ExOA,3142
|
124
|
+
tests/test_page_relation_api.py,sha256=PrFY3vuuFal4og8MUq8ba02qITsNOtIP1eNmQ_f9jxk,2760
|
125
|
+
tests/test_pages.py,sha256=Zo1dV6Ie2hPPfc2V7uPbVW9gEtuBWOGypglaVIbTG98,11885
|
123
126
|
tests/test_query_parser.py,sha256=R9l0L2QDEDcm2b6IFUhyf7wMXLzL9RySLkzKTWRtBkE,2097
|
124
|
-
tests/test_templates_context.py,sha256=
|
125
|
-
tests/test_utils.py,sha256=
|
126
|
-
tests/fixtures/__init__.py,sha256=
|
127
|
+
tests/test_templates_context.py,sha256=zGdmbQMGNXB2V_15BaQDIgqFMnVjBAw969n1tu3m7HY,5626
|
128
|
+
tests/test_utils.py,sha256=ow4csGfU5WzMgAT5zWjZIxZwW1-BqnMduDt8hOzf9cE,2166
|
129
|
+
tests/fixtures/__init__.py,sha256=ixyA6ZsmYbiKEsjQGOGoG4KyJmwWrf-qeoQjQG3J66U,426
|
127
130
|
tests/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
128
131
|
tests/utils/api.py,sha256=TYcDXeILHtBwzwG0acwPFmiqMZnlF9VnLB0Ydhg55vA,865
|
129
132
|
tests/utils/media.py,sha256=-cnrQzzVuhNSb5rT5xMUs5f3yYpBnS0fVGDcjgsb8lw,291
|
130
|
-
django_camomilla_cms-6.0.
|
131
|
-
django_camomilla_cms-6.0.
|
132
|
-
django_camomilla_cms-6.0.
|
133
|
-
django_camomilla_cms-6.0.
|
133
|
+
django_camomilla_cms-6.1.0.dist-info/METADATA,sha256=mA_yBZVvW76HuYxBelBObDFK6c7kztUJ67Svwps6gFY,5652
|
134
|
+
django_camomilla_cms-6.1.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
135
|
+
django_camomilla_cms-6.1.0.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
|
136
|
+
django_camomilla_cms-6.1.0.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
|
+
]
|