django-camomilla-cms 5.8.5__py2.py3-none-any.whl → 6.0.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.
Files changed (143) hide show
  1. camomilla/__init__.py +8 -2
  2. camomilla/apps.py +9 -1
  3. camomilla/context_processors.py +6 -0
  4. camomilla/contrib/modeltranslation/__init__.py +0 -0
  5. camomilla/contrib/modeltranslation/hvad_migration.py +126 -0
  6. camomilla/dynamic_pages_urls.py +33 -0
  7. camomilla/fields/__init__.py +13 -0
  8. camomilla/{fields.py → fields/json.py} +15 -18
  9. camomilla/management/commands/regenerate_thumbnails.py +0 -1
  10. camomilla/managers/__init__.py +3 -0
  11. camomilla/managers/pages.py +116 -0
  12. camomilla/model_api.py +86 -0
  13. camomilla/models/__init__.py +5 -6
  14. camomilla/models/article.py +26 -44
  15. camomilla/models/content.py +8 -15
  16. camomilla/models/media.py +70 -97
  17. camomilla/models/menu.py +106 -0
  18. camomilla/models/mixins/__init__.py +10 -48
  19. camomilla/models/page.py +521 -20
  20. camomilla/openapi/__init__.py +0 -0
  21. camomilla/openapi/schema.py +67 -0
  22. camomilla/parsers.py +0 -1
  23. camomilla/redirects.py +10 -0
  24. camomilla/serializers/__init__.py +2 -0
  25. camomilla/serializers/article.py +5 -10
  26. camomilla/serializers/base/__init__.py +21 -17
  27. camomilla/serializers/content_type.py +17 -0
  28. camomilla/serializers/fields/__init__.py +6 -20
  29. camomilla/serializers/fields/file.py +5 -0
  30. camomilla/serializers/fields/related.py +24 -4
  31. camomilla/serializers/media.py +6 -8
  32. camomilla/serializers/menu.py +17 -0
  33. camomilla/serializers/mixins/__init__.py +23 -187
  34. camomilla/serializers/mixins/fields.py +20 -0
  35. camomilla/serializers/mixins/filter_fields.py +57 -0
  36. camomilla/serializers/mixins/json.py +34 -0
  37. camomilla/serializers/mixins/language.py +32 -0
  38. camomilla/serializers/mixins/nesting.py +35 -0
  39. camomilla/serializers/mixins/optimize.py +91 -0
  40. camomilla/serializers/mixins/ordering.py +34 -0
  41. camomilla/serializers/mixins/page.py +58 -0
  42. camomilla/serializers/mixins/translation.py +103 -0
  43. camomilla/serializers/page.py +53 -4
  44. camomilla/serializers/user.py +5 -4
  45. camomilla/serializers/utils.py +38 -0
  46. camomilla/serializers/validators.py +51 -0
  47. camomilla/settings.py +118 -0
  48. camomilla/sitemap.py +30 -0
  49. camomilla/storages/__init__.py +4 -0
  50. camomilla/storages/default.py +12 -0
  51. camomilla/storages/optimize.py +71 -0
  52. camomilla/{storages.py → storages/overwrite.py} +2 -2
  53. camomilla/templates/admin/camomilla/page/change_form.html +10 -0
  54. camomilla/templates/defaults/articles/default.html +7 -0
  55. camomilla/templates/defaults/base.html +170 -0
  56. camomilla/templates/defaults/pages/default.html +3 -0
  57. camomilla/templates/defaults/parts/langswitch.html +83 -0
  58. camomilla/templates/defaults/parts/menu.html +15 -0
  59. camomilla/templates_context/__init__.py +0 -0
  60. camomilla/templates_context/autodiscover.py +51 -0
  61. camomilla/templates_context/rendering.py +89 -0
  62. camomilla/templatetags/camomilla_filters.py +6 -5
  63. camomilla/templatetags/menus.py +37 -0
  64. camomilla/templatetags/model_extras.py +77 -0
  65. camomilla/theme/__init__.py +1 -1
  66. camomilla/theme/admin/__init__.py +99 -0
  67. camomilla/theme/admin/pages.py +46 -0
  68. camomilla/theme/admin/translations.py +13 -0
  69. camomilla/theme/apps.py +38 -0
  70. camomilla/theme/static/admin/css/responsive.css +5 -1021
  71. camomilla/theme/static/admin/img/favicon.ico +0 -0
  72. camomilla/theme/static/admin/img/logo.svg +31 -0
  73. camomilla/theme/templates/admin/base.html +7 -0
  74. camomilla/theme/templates/rosetta/base.html +196 -0
  75. camomilla/translation.py +61 -0
  76. camomilla/urls.py +38 -17
  77. camomilla/utils/__init__.py +4 -0
  78. camomilla/utils/getters.py +27 -0
  79. camomilla/utils/normalization.py +7 -0
  80. camomilla/utils/query_parser.py +167 -0
  81. camomilla/{utils.py → utils/seo.py} +13 -15
  82. camomilla/utils/setters.py +37 -0
  83. camomilla/utils/templates.py +32 -0
  84. camomilla/utils/translation.py +114 -0
  85. camomilla/views/__init__.py +1 -1
  86. camomilla/views/articles.py +5 -7
  87. camomilla/views/base/__init__.py +35 -5
  88. camomilla/views/contents.py +6 -11
  89. camomilla/views/decorators.py +26 -0
  90. camomilla/views/medias.py +24 -19
  91. camomilla/views/menus.py +81 -0
  92. camomilla/views/mixins/__init__.py +17 -73
  93. camomilla/views/mixins/bulk_actions.py +22 -0
  94. camomilla/views/mixins/language.py +33 -0
  95. camomilla/views/mixins/optimize.py +18 -0
  96. camomilla/views/mixins/ordering.py +2 -2
  97. camomilla/views/mixins/pagination.py +12 -18
  98. camomilla/views/mixins/permissions.py +6 -0
  99. camomilla/views/pages.py +28 -6
  100. camomilla/views/tags.py +5 -6
  101. camomilla/views/users.py +7 -12
  102. django_camomilla_cms-6.0.0.dist-info/METADATA +123 -0
  103. django_camomilla_cms-6.0.0.dist-info/RECORD +133 -0
  104. {django_camomilla_cms-5.8.5.dist-info → django_camomilla_cms-6.0.0.dist-info}/WHEEL +1 -1
  105. tests/fixtures/__init__.py +14 -0
  106. tests/test_api.py +22 -39
  107. tests/test_camomilla_filters.py +11 -13
  108. tests/test_media.py +152 -0
  109. tests/test_menu.py +112 -0
  110. tests/test_model_api.py +113 -0
  111. tests/test_model_api_permissions.py +44 -0
  112. tests/test_model_api_register.py +355 -0
  113. tests/test_pages.py +351 -0
  114. tests/test_query_parser.py +58 -0
  115. tests/test_templates_context.py +149 -0
  116. tests/test_utils.py +64 -64
  117. tests/utils/__init__.py +0 -0
  118. tests/utils/api.py +28 -0
  119. tests/utils/media.py +10 -0
  120. camomilla/admin.py +0 -98
  121. camomilla/migrations/0001_initial.py +0 -577
  122. camomilla/migrations/0002_auto_20200214_1127.py +0 -33
  123. camomilla/migrations/0003_auto_20210130_1610.py +0 -30
  124. camomilla/migrations/0004_auto_20210511_0937.py +0 -25
  125. camomilla/migrations/0005_media_image_props.py +0 -19
  126. camomilla/migrations/0006_auto_20220103_1845.py +0 -35
  127. camomilla/migrations/0007_auto_20220211_1622.py +0 -18
  128. camomilla/migrations/0008_auto_20220309_1616.py +0 -60
  129. camomilla/migrations/0009_article__hvad_query_category__hvad_query_and_more.py +0 -165
  130. camomilla/migrations/0010_auto_20220802_1406.py +0 -83
  131. camomilla/migrations/0011_auto_20220902_1000.py +0 -15
  132. camomilla/models/category.py +0 -25
  133. camomilla/models/tag.py +0 -19
  134. camomilla/theme/static/admin/img/logo.png +0 -0
  135. camomilla/theme/templates/admin/base_site.html +0 -18
  136. camomilla/views/categories.py +0 -13
  137. django_camomilla_cms-5.8.5.dist-info/METADATA +0 -62
  138. django_camomilla_cms-5.8.5.dist-info/RECORD +0 -76
  139. tests/urls.py +0 -21
  140. /camomilla/{migrations → contrib}/__init__.py +0 -0
  141. /camomilla/templates/{camomilla → defaults}/widgets/media_select_multiple.html +0 -0
  142. {django_camomilla_cms-5.8.5.dist-info → django_camomilla_cms-6.0.0.dist-info/licenses}/LICENSE +0 -0
  143. {django_camomilla_cms-5.8.5.dist-info → django_camomilla_cms-6.0.0.dist-info}/top_level.txt +0 -0
@@ -1,35 +0,0 @@
1
- # Generated by Django 2.2.25 on 2022-01-03 18:45
2
-
3
- from django.db import migrations, models
4
- from ..models import Media
5
-
6
-
7
- def forwards_func(apps, schema_editor):
8
- db_alias = schema_editor.connection.alias
9
- defer = ["_hvad_query_id"] if hasattr(Media, "_hvad_query_id") else []
10
- for m in Media.objects.using(db_alias).defer(*defer).all():
11
- m.save()
12
-
13
-
14
- def reverse_func(apps, schema_editor):
15
- pass
16
-
17
-
18
- class Migration(migrations.Migration):
19
-
20
- dependencies = [
21
- ("camomilla", "0005_media_image_props"),
22
- ]
23
-
24
- operations = [
25
- migrations.RemoveField(
26
- model_name="media",
27
- name="is_image",
28
- ),
29
- migrations.AddField(
30
- model_name="media",
31
- name="mime_type",
32
- field=models.CharField(blank=True, max_length=128, null=True),
33
- ),
34
- migrations.RunPython(forwards_func, reverse_func),
35
- ]
@@ -1,18 +0,0 @@
1
- # Generated by Django 2.2.25 on 2022-02-11 16:22
2
-
3
- from django.db import migrations, models
4
-
5
-
6
- class Migration(migrations.Migration):
7
-
8
- dependencies = [
9
- ("camomilla", "0006_auto_20220103_1845"),
10
- ]
11
-
12
- operations = [
13
- migrations.AlterField(
14
- model_name="articletranslation",
15
- name="permalink",
16
- field=models.SlugField(max_length=200),
17
- ),
18
- ]
@@ -1,60 +0,0 @@
1
- # Generated by Django 2.2.27 on 2022-03-09 16:16
2
-
3
- import camomilla.fields
4
- from django.db import migrations, models
5
-
6
-
7
- class Migration(migrations.Migration):
8
-
9
- dependencies = [
10
- ("camomilla", "0007_auto_20220211_1622"),
11
- ]
12
-
13
- operations = [
14
- migrations.AlterModelOptions(
15
- name="article",
16
- options={"ordering": ["ordering"]},
17
- ),
18
- migrations.AlterModelOptions(
19
- name="category",
20
- options={"ordering": ["ordering"], "verbose_name_plural": "categories"},
21
- ),
22
- migrations.AlterModelOptions(
23
- name="page",
24
- options={
25
- "ordering": ["ordering"],
26
- "verbose_name": "Page",
27
- "verbose_name_plural": "Pages",
28
- },
29
- ),
30
- migrations.AddField(
31
- model_name="article",
32
- name="meta",
33
- field=camomilla.fields.JSONField(default=dict),
34
- ),
35
- migrations.AddField(
36
- model_name="article",
37
- name="ordering",
38
- field=models.PositiveIntegerField(default=0),
39
- ),
40
- migrations.AddField(
41
- model_name="category",
42
- name="meta",
43
- field=camomilla.fields.JSONField(default=dict),
44
- ),
45
- migrations.AddField(
46
- model_name="category",
47
- name="ordering",
48
- field=models.PositiveIntegerField(default=0),
49
- ),
50
- migrations.AddField(
51
- model_name="page",
52
- name="meta",
53
- field=camomilla.fields.JSONField(default=dict),
54
- ),
55
- migrations.AddField(
56
- model_name="page",
57
- name="ordering",
58
- field=models.PositiveIntegerField(default=0),
59
- ),
60
- ]
@@ -1,165 +0,0 @@
1
- # Generated by Django 4.0.4 on 2022-05-19 17:19
2
-
3
- from django.db import migrations, models
4
- import django.db.models.deletion
5
- import hvad.fields
6
-
7
-
8
- class Migration(migrations.Migration):
9
-
10
- dependencies = [
11
- ('camomilla', '0008_auto_20220309_1616'),
12
- ]
13
-
14
- operations = [
15
- migrations.AddField(
16
- model_name='article',
17
- name='_hvad_query',
18
- field=hvad.fields.SingleTranslationObject('camomilla.Article', 'camomilla.articletranslation'),
19
- ),
20
- migrations.AddField(
21
- model_name='category',
22
- name='_hvad_query',
23
- field=hvad.fields.SingleTranslationObject('camomilla.Category', 'camomilla.categorytranslation'),
24
- ),
25
- migrations.AddField(
26
- model_name='content',
27
- name='_hvad_query',
28
- field=hvad.fields.SingleTranslationObject('camomilla.Content', 'camomilla.contenttranslation'),
29
- ),
30
- migrations.AddField(
31
- model_name='media',
32
- name='_hvad_query',
33
- field=hvad.fields.SingleTranslationObject('camomilla.Media', 'camomilla.mediatranslation'),
34
- ),
35
- migrations.AddField(
36
- model_name='mediafolder',
37
- name='_hvad_query',
38
- field=hvad.fields.SingleTranslationObject('camomilla.MediaFolder', 'camomilla.mediafoldertranslation'),
39
- ),
40
- migrations.AddField(
41
- model_name='page',
42
- name='_hvad_query',
43
- field=hvad.fields.SingleTranslationObject('camomilla.Page', 'camomilla.pagetranslation'),
44
- ),
45
- migrations.AddField(
46
- model_name='tag',
47
- name='_hvad_query',
48
- field=hvad.fields.SingleTranslationObject('camomilla.Tag', 'camomilla.tagtranslation'),
49
- ),
50
- migrations.AlterField(
51
- model_name='article',
52
- name='id',
53
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
54
- ),
55
- migrations.AlterField(
56
- model_name='article',
57
- name='og_image',
58
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_related', to='camomilla.media'),
59
- ),
60
- migrations.AlterField(
61
- model_name='articletranslation',
62
- name='id',
63
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
64
- ),
65
- migrations.AlterField(
66
- model_name='articletranslation',
67
- name='master',
68
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.article'),
69
- ),
70
- migrations.AlterField(
71
- model_name='category',
72
- name='id',
73
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
74
- ),
75
- migrations.AlterField(
76
- model_name='categorytranslation',
77
- name='id',
78
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
79
- ),
80
- migrations.AlterField(
81
- model_name='categorytranslation',
82
- name='master',
83
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.category'),
84
- ),
85
- migrations.AlterField(
86
- model_name='content',
87
- name='id',
88
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
89
- ),
90
- migrations.AlterField(
91
- model_name='contenttranslation',
92
- name='id',
93
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
94
- ),
95
- migrations.AlterField(
96
- model_name='contenttranslation',
97
- name='master',
98
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.content'),
99
- ),
100
- migrations.AlterField(
101
- model_name='media',
102
- name='id',
103
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
104
- ),
105
- migrations.AlterField(
106
- model_name='mediafolder',
107
- name='id',
108
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
109
- ),
110
- migrations.AlterField(
111
- model_name='mediafoldertranslation',
112
- name='id',
113
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
114
- ),
115
- migrations.AlterField(
116
- model_name='mediafoldertranslation',
117
- name='master',
118
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.mediafolder'),
119
- ),
120
- migrations.AlterField(
121
- model_name='mediatranslation',
122
- name='id',
123
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
124
- ),
125
- migrations.AlterField(
126
- model_name='mediatranslation',
127
- name='master',
128
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.media'),
129
- ),
130
- migrations.AlterField(
131
- model_name='page',
132
- name='id',
133
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
134
- ),
135
- migrations.AlterField(
136
- model_name='page',
137
- name='og_image',
138
- field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(app_label)s_%(class)s_related', to='camomilla.media'),
139
- ),
140
- migrations.AlterField(
141
- model_name='pagetranslation',
142
- name='id',
143
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
144
- ),
145
- migrations.AlterField(
146
- model_name='pagetranslation',
147
- name='master',
148
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.page'),
149
- ),
150
- migrations.AlterField(
151
- model_name='tag',
152
- name='id',
153
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
154
- ),
155
- migrations.AlterField(
156
- model_name='tagtranslation',
157
- name='id',
158
- field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
159
- ),
160
- migrations.AlterField(
161
- model_name='tagtranslation',
162
- name='master',
163
- field=hvad.fields.MasterKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='translations', to='camomilla.tag'),
164
- ),
165
- ]
@@ -1,83 +0,0 @@
1
- # Generated by Django 3.0 on 2022-08-02 14:06
2
-
3
- from django.db import migrations, models
4
-
5
-
6
- class Migration(migrations.Migration):
7
-
8
- dependencies = [
9
- ('camomilla', '0009_article__hvad_query_category__hvad_query_and_more'),
10
- ]
11
-
12
- operations = [
13
- migrations.AlterField(
14
- model_name='article',
15
- name='id',
16
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
17
- ),
18
- migrations.AlterField(
19
- model_name='articletranslation',
20
- name='id',
21
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
22
- ),
23
- migrations.AlterField(
24
- model_name='category',
25
- name='id',
26
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
27
- ),
28
- migrations.AlterField(
29
- model_name='categorytranslation',
30
- name='id',
31
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
32
- ),
33
- migrations.AlterField(
34
- model_name='content',
35
- name='id',
36
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
37
- ),
38
- migrations.AlterField(
39
- model_name='contenttranslation',
40
- name='id',
41
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
42
- ),
43
- migrations.AlterField(
44
- model_name='media',
45
- name='id',
46
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
47
- ),
48
- migrations.AlterField(
49
- model_name='mediafolder',
50
- name='id',
51
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
52
- ),
53
- migrations.AlterField(
54
- model_name='mediafoldertranslation',
55
- name='id',
56
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
57
- ),
58
- migrations.AlterField(
59
- model_name='mediatranslation',
60
- name='id',
61
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
62
- ),
63
- migrations.AlterField(
64
- model_name='page',
65
- name='id',
66
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
67
- ),
68
- migrations.AlterField(
69
- model_name='pagetranslation',
70
- name='id',
71
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
72
- ),
73
- migrations.AlterField(
74
- model_name='tag',
75
- name='id',
76
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
77
- ),
78
- migrations.AlterField(
79
- model_name='tagtranslation',
80
- name='id',
81
- field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
82
- ),
83
- ]
@@ -1,15 +0,0 @@
1
- # Generated by Django 3.0 on 2022-09-02 10:00
2
-
3
- from django.db import migrations
4
- from django.contrib.postgres.operations import TrigramExtension
5
-
6
-
7
- class Migration(migrations.Migration):
8
-
9
- dependencies = [
10
- ('camomilla', '0010_auto_20220802_1406'),
11
- ]
12
-
13
- operations = [
14
- TrigramExtension()
15
- ]
@@ -1,25 +0,0 @@
1
- from django.db import models
2
- from hvad.models import TranslatableModel, TranslatedFields
3
- from .mixins import MetaMixin
4
-
5
-
6
- class BaseCategory(TranslatableModel, MetaMixin):
7
- translations = TranslatedFields(
8
- title=models.CharField(max_length=200),
9
- description=models.TextField(blank=True, null=True, default=""),
10
- slug=models.SlugField(),
11
- )
12
- ordering = models.PositiveIntegerField(default=0, blank=False, null=False)
13
-
14
- class Meta:
15
- abstract = True
16
- unique_together = [("title", "language_code")]
17
- verbose_name_plural = "categories"
18
- ordering = ["ordering"]
19
-
20
- def __str__(self):
21
- return self.title
22
-
23
-
24
- class Category(BaseCategory):
25
- translations = TranslatedFields()
camomilla/models/tag.py DELETED
@@ -1,19 +0,0 @@
1
- from django.db import models
2
- from hvad.models import TranslatableModel, TranslatedFields
3
-
4
-
5
- class BaseTag(TranslatableModel):
6
- translations = TranslatedFields(
7
- title=models.CharField(max_length=200),
8
- )
9
-
10
- class Meta:
11
- abstract = True
12
- unique_together = [("title", "language_code")]
13
-
14
- def __str__(self):
15
- return self.title
16
-
17
-
18
- class Tag(BaseTag):
19
- translations = TranslatedFields()
Binary file
@@ -1,18 +0,0 @@
1
- {% extends "admin/base.html" %}
2
- {% load static %}
3
-
4
- {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
5
-
6
- {% block branding %}
7
- <img src='{% static "admin/img/logo.png" %}' class='logo'/>
8
- {% endblock %}
9
-
10
- {% block nav-global %}{% endblock %}
11
-
12
- {% block bodyclass %}flat-theme{% endblock %}
13
-
14
- {% block blockbots %}
15
- {{ block.super }}
16
- <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
17
- <link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}" />
18
- {% endblock %}
@@ -1,13 +0,0 @@
1
- from .base import BaseModelViewset
2
- from .mixins import GetUserLanguageMixin, BulkDeleteMixin
3
- from ..models import Category
4
- from ..serializers import CategorySerializer
5
- from ..permissions import CamomillaBasePermissions
6
-
7
-
8
- class CategoryViewSet(GetUserLanguageMixin, BulkDeleteMixin, BaseModelViewset):
9
-
10
- queryset = Category.objects.all()
11
- serializer_class = CategorySerializer
12
- permission_classes = (CamomillaBasePermissions,)
13
- model = Category
@@ -1,62 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: django-camomilla-cms
3
- Version: 5.8.5
4
- Summary: Django powered cms
5
- Home-page: https://github.com/lotrekagency/camomilla
6
- Author: Lotrèk
7
- Author-email: dimmitutto@lotrek.it
8
- License: MIT
9
- Keywords: cms,django,api cms
10
- Classifier: Environment :: Web Environment
11
- Classifier: Framework :: Django
12
- Classifier: Intended Audience :: Developers
13
- Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3
15
- Requires-Python: >=3.0.*
16
- Description-Content-Type: text/markdown
17
- License-File: LICENSE
18
- Requires-Dist: lotrek-django-hvad (>=2.0.6)
19
- Requires-Dist: djsuperadmin (<1.0.0,>=0.9)
20
- Requires-Dist: djangorestframework (>=3.10.0<4.0.0)
21
- Requires-Dist: djlotrek (<1.0.0,>=0.1.6)
22
- Requires-Dist: Pillow (<7.0.0,>=6.2.0)
23
- Requires-Dist: django-ckeditor (<7.0.0,>=5.7.1)
24
- Requires-Dist: python-magic (>=0.4<0.5)
25
- Requires-Dist: Django (>=1.8)
26
-
27
- # camomilla cms [![PyPI](https://img.shields.io/pypi/v/django-camomilla-cms?style=flat-square)](https://pypi.org/project/django-camomilla-cms) ![Codecov](https://img.shields.io/codecov/c/github/lotrekagency/camomilla?style=flat-square) ![GitHub Workflow Status](https://img.shields.io/github/workflow/status/lotrekagency/camomilla/Test,%20Coverage%20and%20Release?style=flat-square) [![GitHub](https://img.shields.io/github/license/lotrekagency/camomilla?style=flat-square)](./LICENSE)
28
-
29
- ## Install
30
-
31
- $ pip install -r requirements.txt
32
-
33
- ## Settings
34
-
35
- Camomilla brings a lot of default settings you can include in your project's ones
36
-
37
- from camomilla.defaults import *
38
-
39
- Remember to add all the required applications in your project
40
-
41
- INSTALLED_APPS = [
42
- ...
43
- 'rest_framework',
44
- 'rest_framework.authtoken',
45
- 'camomilla',
46
- 'hvad',
47
- ...
48
- ]
49
-
50
- ## Run the server
51
-
52
- $ python manage.py runserver
53
-
54
- ## Run tests
55
-
56
- pip install -r requirements-dev.txt
57
- make test
58
-
59
- ## Don't fear the hvader
60
-
61
- Feel free to make your models untranslatable, [we have a nice solution for them](https://github.com/lotrekagency/hvad-migration)
62
-
@@ -1,76 +0,0 @@
1
- camomilla/__init__.py,sha256=0NYzahh6KmOiEj41rlWNNB1DI2yBOLOoAfInzqbRQDg,111
2
- camomilla/admin.py,sha256=FFsyN07_8HnQgF6LBnKjlZtQRqlz_Zg_re9U0RsfqCk,2362
3
- camomilla/apps.py,sha256=THcQ_2X0cvwec4xxn7DVow42s3P_G3VVL6zGmt6kbQs,188
4
- camomilla/authentication.py,sha256=jz6tQT4PPEu-_JLox1LZrOy7EiWBb9MWaObK63MJGus,855
5
- camomilla/defaults.py,sha256=VNQ_sbxu09AyFGNpUUYypIAyhlBhEORD36BBNj7e73I,1220
6
- camomilla/exceptions.py,sha256=gLniAsK_pmsNNKGMv5Z384LXVbM8oeHcOwz4F91u1LY,111
7
- camomilla/fields.py,sha256=QWZd_ZGEme2nGXrRkfB0I6RAlf0z026K9ubWqmzNCMY,2051
8
- camomilla/parsers.py,sha256=H6AicoSYeldGYgJcak0JKnjso07lOC9F4vHaMrxhQ3U,1976
9
- camomilla/permissions.py,sha256=9NlBO4JMmg36vXCUjPNyq6uZxhkdrnXyIbJVLtWhGWE,1813
10
- camomilla/storages.py,sha256=lpUdt26cj_B2qC8iOhx2An01MBqjxDayjIFVgYrNaEg,341
11
- camomilla/urls.py,sha256=8DKwGqhcuDwUxJ-5Uzl7-ZHqlZ1dYd7crqpmBUdYuxo,1562
12
- camomilla/utils.py,sha256=3RpMV-Z7uhI17iFOOHYq0q7S1FVFjTEoz8dhRyD41Lk,3434
13
- camomilla/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- camomilla/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- camomilla/management/commands/regenerate_thumbnails.py,sha256=M_Lqk5yxoG0TwVmcKWqCFPFJPcdnL4OgqLXui-UFdm8,497
16
- camomilla/migrations/0001_initial.py,sha256=LI0L35ZF5r1sQHNMSQJtX1k4h_1TJmvRnAEf4xnN7hw,21066
17
- camomilla/migrations/0002_auto_20200214_1127.py,sha256=cWq9cJpfTbe8-jEp4kn6_JDmxH37u9LOaHQq79hnEiM,899
18
- camomilla/migrations/0003_auto_20210130_1610.py,sha256=0T2Ai7rhRUlvI8SqfSPs4qy2LGc0TvqTGlMZ6Ryg3VQ,795
19
- camomilla/migrations/0004_auto_20210511_0937.py,sha256=Lc5qVPSg5pFhDvUdZdNs2hP5OueVIh6s0s3U-gFI6ig,616
20
- camomilla/migrations/0005_media_image_props.py,sha256=g6jciEVT-WCVJlNOExNA1YclhITL_WTFavTwuLl03A4,418
21
- camomilla/migrations/0006_auto_20220103_1845.py,sha256=ytlV56nQbn-stAvYGje12Ki9lh1n0fEnemmGdBe5Wxw,896
22
- camomilla/migrations/0007_auto_20220211_1622.py,sha256=iv0PtLw1X9dDxRPvCpXkmwZpKlb4fQQdojFEoJmgiKM,405
23
- camomilla/migrations/0008_auto_20220309_1616.py,sha256=bu2YmUtnEzaj11Jz_zGDfymTqBiCo7Rye3D4Am5E-S4,1745
24
- camomilla/migrations/0009_article__hvad_query_category__hvad_query_and_more.py,sha256=j-PFeJ_Pwqox4m--0mxxqKai6e_o3xi0IxNweJfqKsU,7230
25
- camomilla/migrations/0010_auto_20220802_1406.py,sha256=b19pjry1u0gYe2MfOoneQqNs37oVvx-JH7_6vQmJ5fE,3245
26
- camomilla/migrations/0011_auto_20220902_1000.py,sha256=7_B_XkMxtxsnzWhZ9_SF9VEAyaKSkmv4yOz9z-vN_C0,316
27
- camomilla/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- camomilla/models/__init__.py,sha256=-oT_NcH4YreW_YnUqcr_2Qljci0xlwbAYowTMaU4QZg,130
29
- camomilla/models/article.py,sha256=MVAoY9b_XL6zb_d2o_sIvnjL-q4F6PAE9W_mGq-Tozc,1765
30
- camomilla/models/category.py,sha256=Ghz0I9JMOc4tNtefdJGFsZaa5XI6_MOjnryLsgZzbgg,738
31
- camomilla/models/content.py,sha256=gg2aehIrQKU2d-uW-N9H5Ln4Jkx0YFXKlh-Oo7l1f-M,1229
32
- camomilla/models/media.py,sha256=JPB4R5Pc7M2PdsJz_2kXbj8C9jwH9RfuTviXjjK4NRo,7378
33
- camomilla/models/page.py,sha256=YgsF-Zm2cZeUHfbfqlbIPANmSonFmSDwwvgLNGXr4RQ,865
34
- camomilla/models/tag.py,sha256=jqLRuxifFq6CRTB_59NgC7xrxWVNhkyQKsn5aqk7Tlo,422
35
- camomilla/models/mixins/__init__.py,sha256=tb6ATJWE-X7e5uXuTy2o3eTGsvI1qcmOX-ne-GfF-kc,2273
36
- camomilla/serializers/__init__.py,sha256=wQH2XF9NUytkt7C66UUdxMHZhrPt-y13mWwynJi2SVI,128
37
- camomilla/serializers/article.py,sha256=i_vcDXdBAv3ocMUm1hlKSwV3c7J6jQ-ROQBJn0uS8NA,469
38
- camomilla/serializers/media.py,sha256=Gkrseiial_dGyfMXTeVi-Y9L2G00NhJHtQLF3xLPIII,2041
39
- camomilla/serializers/page.py,sha256=9b2AqrJuUvgi21QpnkkUfhCOBXqhdP6dEklhrC0JFu0,333
40
- camomilla/serializers/user.py,sha256=nUwMjsiJfVEk9b-HecMdykMJYa8wyRzPrJRBKNQgkUs,3608
41
- camomilla/serializers/base/__init__.py,sha256=thkie650KhkkRflGAT4GZW-auC8b-dhEIpwRYh0DDXc,749
42
- camomilla/serializers/fields/__init__.py,sha256=Ufbs26qu3q0l8j1e3lY8tkqEC8rUemb2reetUW1t9qo,703
43
- camomilla/serializers/fields/file.py,sha256=QRSPhEAB_snT0IyjtKZQk8bKKHmT9hMNB9udzbc_nVw,648
44
- camomilla/serializers/fields/related.py,sha256=Y2SnGWGDAUr3H-Ku7_YQYzbEIXUlsFqw69NCGVEpxSU,4402
45
- camomilla/serializers/mixins/__init__.py,sha256=1ac5qYcyCXX82t7d_oK93LybHSPJm1GpWqP7AkHBwl4,6905
46
- camomilla/templates/camomilla/widgets/media_select_multiple.html,sha256=k2XYou8KkPuFLnPMkPJAFJ-zGJj2Xvu6R3ZmiKa3g7Q,3727
47
- camomilla/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- camomilla/templatetags/camomilla_filters.py,sha256=dvEs_d7Rx0szRxNVe_r_0x5Q6A95YaZjB892-D-p1JI,736
49
- camomilla/theme/__init__.py,sha256=4bOCSGC7-D5IZW3ycX5YlHmuGyeOSV-YAZ7jimsLCx0,22
50
- camomilla/theme/static/admin/css/responsive.css,sha256=Hm3Q6nW3_nu4zNahF0iSzpu60AaVMvFwYW8R7OUMIy4,16681
51
- camomilla/theme/static/admin/img/logo.png,sha256=vvC1YE6QgQ1A8i6hRy6ksj3R2HbwNA4jM8qRLaKKTDo,18821
52
- camomilla/theme/templates/admin/base_site.html,sha256=Qlb_J7Erpu7oNSLjjQLWciDUoZLEAE49ASw5g2u4g-I,585
53
- camomilla/views/__init__.py,sha256=LWPZT2GTFltm3GhGkTcvUA3LdLnyj_OIAyc1VN_xhrI,183
54
- camomilla/views/articles.py,sha256=DKCKQqBnw6CxwU4kLmtJyb6Bpi9bfZ1BzG9EWorOZZ8,519
55
- camomilla/views/categories.py,sha256=PMBXhfkVZ7aw7wPVa4PRJhxfgbIp6zrthqH6K9WTipk,456
56
- camomilla/views/contents.py,sha256=ay1z_HPI2H57_EtcU1mXPYWR9rwcL3Z6Vj3UFD8oCUw,1377
57
- camomilla/views/languages.py,sha256=Rt_X7s3dbDBv4dxsQ9fnav_u0TAzzo8fGKBBx3esDsg,441
58
- camomilla/views/medias.py,sha256=EnL5FfFzQmQ1fEw_EpZB-3Pdv_yzPcMdreQMW1hGqPg,2871
59
- camomilla/views/pages.py,sha256=cRAOvOadJCOn-A_Zp5c8HdwJp25fxPoYsnA_q0QbwQ0,432
60
- camomilla/views/tags.py,sha256=BNQXKMxwEF9ieXwQHV3rqNmf0FpVr-J7qY7dmdhXN_c,426
61
- camomilla/views/users.py,sha256=URzge9_MAHQ66O0cBOqpC3AgHrBcSFdxomLvOg5c9jI,3134
62
- camomilla/views/base/__init__.py,sha256=S7KGhVzHM7f0j8XD7cbBY5__66zvKYkphRD9cfl0O1E,222
63
- camomilla/views/mixins/__init__.py,sha256=XCHJ39XiEeKstbMAXNy6nqt_b_0D6S6bM8Lu2h3xScE,2617
64
- camomilla/views/mixins/ordering.py,sha256=cO4wuDA8MmGQDblALnTvWt6K4u6TW2_p0BGdqNUUXKY,4765
65
- camomilla/views/mixins/pagination.py,sha256=vUkfhqhTabeDdoiMwjeVpO6gl534EI0JMrr4TlZ8MRA,5956
66
- tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
67
- tests/test_api.py,sha256=nmjSiiwrc6MUjghKLDSrFcAUPGc4uCPQeb6EW23qsZU,2358
68
- tests/test_camomilla_filters.py,sha256=_W9CcwsEyewMBvnNYKk4CVqrkXxRYejle3mjiBS7hqk,1848
69
- tests/test_models.py,sha256=WJs8lxWZWn1l7X3a_QFVc8fF5LHTsI8bc3uhQe6-o-Q,684
70
- tests/test_utils.py,sha256=0tdEDBaBkyjAXpbqP0SpFcfgO56MV2TWZmk9xpjR7J0,3613
71
- tests/urls.py,sha256=yCnalWqGClQOCrrbHtIj175aC1ufE6QfhSqT0aoWyjA,562
72
- django_camomilla_cms-5.8.5.dist-info/LICENSE,sha256=kVS7zDrNkav2hLLXbOJwVdonY2ToApTK3khyJagGQoQ,1063
73
- django_camomilla_cms-5.8.5.dist-info/METADATA,sha256=vkBdih4R9cGWxTCQPGZF8gSf13RngKbMiMsZ5hs_BIs,2036
74
- django_camomilla_cms-5.8.5.dist-info/WHEEL,sha256=bb2Ot9scclHKMOLDEHY6B2sicWOgugjFKaJsT7vwMQo,110
75
- django_camomilla_cms-5.8.5.dist-info/top_level.txt,sha256=G9VIGBmMMqC7JEckoTgXKmC6T2BR75QRkqRnngw1_lo,16
76
- django_camomilla_cms-5.8.5.dist-info/RECORD,,
tests/urls.py DELETED
@@ -1,21 +0,0 @@
1
- from django.urls import include, path
2
- from django.conf.urls.i18n import i18n_patterns
3
-
4
-
5
- def dummy_view(request):
6
- from django.http import HttpResponse
7
-
8
- return HttpResponse("Here's the text of the Web page.")
9
-
10
-
11
- urlpatterns = [
12
- path("articles/<slug:title>", dummy_view, name="article-detail"),
13
- path("api/camomilla/", include("camomilla.urls")),
14
- ]
15
-
16
-
17
- urlpatterns += i18n_patterns(
18
- path("about", dummy_view, name="about"),
19
- path("international_articles/<slug:title>", dummy_view, name="int-article-detail"),
20
- prefix_default_language=False,
21
- )
File without changes