wbwriter 2.2.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.

Potentially problematic release.


This version of wbwriter might be problematic. Click here for more details.

Files changed (70) hide show
  1. wbwriter/__init__.py +1 -0
  2. wbwriter/admin.py +142 -0
  3. wbwriter/apps.py +5 -0
  4. wbwriter/dynamic_preferences_registry.py +15 -0
  5. wbwriter/factories/__init__.py +13 -0
  6. wbwriter/factories/article.py +181 -0
  7. wbwriter/factories/meta_information.py +29 -0
  8. wbwriter/filters/__init__.py +2 -0
  9. wbwriter/filters/article.py +47 -0
  10. wbwriter/filters/metainformationinstance.py +24 -0
  11. wbwriter/migrations/0001_initial_squashed_squashed_0008_alter_article_author_alter_article_feedback_contact_and_more.py +653 -0
  12. wbwriter/migrations/0009_dependantarticle.py +41 -0
  13. wbwriter/migrations/0010_alter_article_options.py +20 -0
  14. wbwriter/migrations/0011_auto_20240103_0953.py +39 -0
  15. wbwriter/migrations/__init__.py +0 -0
  16. wbwriter/models/__init__.py +9 -0
  17. wbwriter/models/article.py +1179 -0
  18. wbwriter/models/article_type.py +59 -0
  19. wbwriter/models/block.py +24 -0
  20. wbwriter/models/block_parameter.py +19 -0
  21. wbwriter/models/in_editor_template.py +102 -0
  22. wbwriter/models/meta_information.py +87 -0
  23. wbwriter/models/mixins.py +9 -0
  24. wbwriter/models/publication_models.py +170 -0
  25. wbwriter/models/style.py +13 -0
  26. wbwriter/models/template.py +34 -0
  27. wbwriter/pdf_generator.py +172 -0
  28. wbwriter/publication_parser.py +258 -0
  29. wbwriter/serializers/__init__.py +28 -0
  30. wbwriter/serializers/article.py +359 -0
  31. wbwriter/serializers/article_type.py +14 -0
  32. wbwriter/serializers/in_editor_template.py +37 -0
  33. wbwriter/serializers/meta_information.py +67 -0
  34. wbwriter/serializers/publication.py +82 -0
  35. wbwriter/templatetags/__init__.py +0 -0
  36. wbwriter/templatetags/writer.py +72 -0
  37. wbwriter/tests/__init__.py +0 -0
  38. wbwriter/tests/conftest.py +32 -0
  39. wbwriter/tests/signals.py +23 -0
  40. wbwriter/tests/test_filter.py +58 -0
  41. wbwriter/tests/test_model.py +591 -0
  42. wbwriter/tests/test_writer.py +38 -0
  43. wbwriter/tests/tests.py +18 -0
  44. wbwriter/typings.py +23 -0
  45. wbwriter/urls.py +83 -0
  46. wbwriter/viewsets/__init__.py +22 -0
  47. wbwriter/viewsets/article.py +270 -0
  48. wbwriter/viewsets/article_type.py +49 -0
  49. wbwriter/viewsets/buttons.py +61 -0
  50. wbwriter/viewsets/display/__init__.py +6 -0
  51. wbwriter/viewsets/display/article.py +404 -0
  52. wbwriter/viewsets/display/article_type.py +27 -0
  53. wbwriter/viewsets/display/in_editor_template.py +39 -0
  54. wbwriter/viewsets/display/meta_information.py +37 -0
  55. wbwriter/viewsets/display/meta_information_instance.py +28 -0
  56. wbwriter/viewsets/display/publication.py +55 -0
  57. wbwriter/viewsets/endpoints/__init__.py +2 -0
  58. wbwriter/viewsets/endpoints/article.py +12 -0
  59. wbwriter/viewsets/endpoints/meta_information.py +14 -0
  60. wbwriter/viewsets/in_editor_template.py +68 -0
  61. wbwriter/viewsets/menu.py +42 -0
  62. wbwriter/viewsets/meta_information.py +51 -0
  63. wbwriter/viewsets/meta_information_instance.py +48 -0
  64. wbwriter/viewsets/publication.py +117 -0
  65. wbwriter/viewsets/titles/__init__.py +2 -0
  66. wbwriter/viewsets/titles/publication_title_config.py +18 -0
  67. wbwriter/viewsets/titles/reviewer_article_title_config.py +6 -0
  68. wbwriter-2.2.1.dist-info/METADATA +8 -0
  69. wbwriter-2.2.1.dist-info/RECORD +70 -0
  70. wbwriter-2.2.1.dist-info/WHEEL +5 -0
@@ -0,0 +1,68 @@
1
+ from wbcore.viewsets import ModelViewSet, RepresentationViewSet
2
+ from wbwriter.models import InEditorTemplate
3
+ from wbwriter.serializers import (
4
+ InEditorTemplateModelSerializer,
5
+ InEditorTemplateRepresentationSerializer,
6
+ )
7
+
8
+ from .display import InEditorTemplateDisplayConfig
9
+
10
+
11
+ class InEditorTemplateModelViewSet(ModelViewSet):
12
+ ENDPOINT = "wbwriter:in-editor-template-list"
13
+ IDENTIFIER = "wbwriter:in-editor-template"
14
+
15
+ serializer_class = InEditorTemplateModelSerializer
16
+ queryset = InEditorTemplate.objects.all()
17
+
18
+ display_config_class = InEditorTemplateDisplayConfig
19
+
20
+ search_fields = (
21
+ "uuid",
22
+ "title",
23
+ "description",
24
+ )
25
+ filter_fields = {
26
+ "uuid": ["icontains", "exact"],
27
+ "title": ["icontains", "exact"],
28
+ "description": [
29
+ "icontains",
30
+ ],
31
+ "is_stand_alone_template": [
32
+ "exact",
33
+ ],
34
+ }
35
+ ordering_fields = (
36
+ "uuid",
37
+ "title",
38
+ "is_stand_alone_template",
39
+ )
40
+
41
+
42
+ class InEditorTemplateRepresentationViewSet(RepresentationViewSet):
43
+ ENDPOINT = "wbwriter:in-editor-template-list"
44
+ IDENTIFIER = "wbwriter:in-editor-template"
45
+
46
+ serializer_class = InEditorTemplateRepresentationSerializer
47
+ queryset = InEditorTemplate.objects.all()
48
+
49
+ search_fields = (
50
+ "uuid",
51
+ "title",
52
+ "description",
53
+ )
54
+ filter_fields = {
55
+ "uuid": ["icontains", "exact"],
56
+ "title": ["icontains", "exact"],
57
+ "description": [
58
+ "icontains",
59
+ ],
60
+ "is_stand_alone_template": [
61
+ "exact",
62
+ ],
63
+ }
64
+ ordering_fields = (
65
+ "uuid",
66
+ "title",
67
+ "is_stand_alone_template",
68
+ )
@@ -0,0 +1,42 @@
1
+ from wbcore.menus import ItemPermission, Menu, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ WRITER_MENU = Menu(
5
+ label="Writer",
6
+ items=[
7
+ MenuItem(
8
+ label="Article",
9
+ endpoint="wbwriter:article-list",
10
+ add=MenuItem(
11
+ label="Create an article",
12
+ endpoint="wbwriter:article-list",
13
+ ),
14
+ permission=ItemPermission(
15
+ method=lambda request: is_internal_user(request.user), permissions=["wbwriter.view_article"]
16
+ ),
17
+ ),
18
+ # MenuItem(
19
+ # label="DDQ",
20
+ # endpoint="wbwriter:ddq-list",
21
+ # add=MenuItem(
22
+ # label="Create a DDQ related entry",
23
+ # endpoint="wbwriter:ddq-list",
24
+ # ),
25
+ # permission=ItemPermission(permissions=["wbwriter.view_article"]),
26
+ # ),
27
+ MenuItem(
28
+ label="Articles to review",
29
+ endpoint="wbwriter:review-article-list",
30
+ permission=ItemPermission(
31
+ method=lambda request: is_internal_user(request.user), permissions=["wbwriter.view_article"]
32
+ ),
33
+ ),
34
+ MenuItem(
35
+ label="Publication",
36
+ endpoint="wbwriter:publication-list",
37
+ permission=ItemPermission(
38
+ method=lambda request: is_internal_user(request.user), permissions=["wbwriter.view_publication"]
39
+ ),
40
+ ),
41
+ ],
42
+ )
@@ -0,0 +1,51 @@
1
+ from wbcore.viewsets import ModelViewSet, RepresentationViewSet
2
+ from wbwriter.models import MetaInformation
3
+ from wbwriter.serializers import MetaInformationModelSerializer
4
+ from wbwriter.serializers.meta_information import (
5
+ MetaInformationRepresentationSerializer,
6
+ )
7
+
8
+ from .display import MetaInformationDisplayConfig
9
+
10
+
11
+ class MetaInformationRepresentationViewSet(RepresentationViewSet):
12
+ serializer_class = MetaInformationRepresentationSerializer
13
+ queryset = MetaInformation.objects.all()
14
+
15
+ search_fields = ("name", "key")
16
+ filter_fields = {
17
+ "article_type": ["exact"],
18
+ "name": ["icontains", "exact"],
19
+ "key": ["icontains", "exact"],
20
+ "meta_information_type": ["exact"],
21
+ }
22
+ ordering_fields = ("article_type", "name", "key", "meta_information_type")
23
+
24
+ def get_queryset(self):
25
+ request = self.request
26
+ user = request.user
27
+ profile = user.profile
28
+
29
+ if user.is_superuser or profile.is_internal:
30
+ return MetaInformation.objects.all()
31
+
32
+ return MetaInformation.objects.none()
33
+
34
+
35
+ class MetaInformationModelViewSet(ModelViewSet):
36
+ serializer_class = MetaInformationModelSerializer
37
+ queryset = MetaInformation.objects.all()
38
+
39
+ display_config_class = MetaInformationDisplayConfig
40
+
41
+ search_fields = (
42
+ "name",
43
+ "key",
44
+ )
45
+ filterset_fields = {
46
+ "article_type": ["exact"],
47
+ "name": ["icontains"],
48
+ "key": ["icontains"],
49
+ "meta_information_type": ["exact"],
50
+ }
51
+ ordering_fields = ("article_type", "name", "key", "meta_information_type")
@@ -0,0 +1,48 @@
1
+ from wbcore.viewsets import ModelViewSet, RepresentationViewSet
2
+ from wbwriter.models.meta_information import MetaInformationInstance
3
+ from wbwriter.serializers.meta_information import (
4
+ MetaInformationInstanceModelSerializer,
5
+ MetaInformationInstanceRepresentationSerializer,
6
+ )
7
+
8
+ from .display import MetaInformationInstanceDisplayConfig
9
+ from .endpoints import MetaInformationInstanceEndpointConfig
10
+
11
+
12
+ class MetaInformationInstanceModelViewSet(ModelViewSet):
13
+ serializer_class = MetaInformationInstanceModelSerializer
14
+ queryset = MetaInformationInstance.objects.all()
15
+
16
+ display_config_class = MetaInformationInstanceDisplayConfig
17
+ endpoint_config_class = MetaInformationInstanceEndpointConfig
18
+
19
+ search_fields = None
20
+ ordering_fields = ("boolean_value",)
21
+
22
+ def get_queryset(self):
23
+ qs = super().get_queryset()
24
+ if article_id := self.kwargs.get("article_id", None):
25
+ qs = qs.filter(article_id=article_id)
26
+ return qs.select_related("meta_information")
27
+
28
+
29
+ class MetaInformationInstanceRepresentationViewSet(RepresentationViewSet):
30
+ serializer_class = MetaInformationInstanceRepresentationSerializer
31
+ queryset = MetaInformationInstance.objects.all()
32
+
33
+ filter_fields = {
34
+ # "article": ["exact"],
35
+ "meta_information": ["exact"],
36
+ "boolean_value": ["exact"],
37
+ }
38
+ ordering_fields = ("meta_information__name", "boolean_value")
39
+
40
+ def get_queryset(self):
41
+ request = self.request
42
+ user = request.user
43
+ profile = user.profile
44
+
45
+ if user.is_superuser or profile.is_internal:
46
+ return MetaInformationInstance.objects.all()
47
+
48
+ return MetaInformationInstance.objects.none()
@@ -0,0 +1,117 @@
1
+ from reversion.views import RevisionMixin
2
+ from wbcore.viewsets import ModelViewSet, RepresentationViewSet
3
+ from wbwriter.models import Publication
4
+ from wbwriter.models.publication_models import PublicationParser
5
+ from wbwriter.serializers import (
6
+ PublicationModelSerializer,
7
+ PublicationParserRepresentationSerializer,
8
+ PublicationParserSerializer,
9
+ PublicationRepresentationSerializer,
10
+ )
11
+ from wbwriter.viewsets.buttons import PublicationButtonConfig
12
+ from wbwriter.viewsets.display import (
13
+ PublicationDisplayConfig,
14
+ PublicationParserDisplayConfig,
15
+ )
16
+ from wbwriter.viewsets.titles import PublicationTitleConfig
17
+
18
+
19
+ class PublicationModelViewSet(RevisionMixin, ModelViewSet):
20
+ """Displays all fields of the Publication model."""
21
+
22
+ serializer_class = PublicationModelSerializer
23
+ queryset = Publication.objects.all()
24
+
25
+ button_config_class = PublicationButtonConfig
26
+ display_config_class = PublicationDisplayConfig
27
+ title_config_class = PublicationTitleConfig
28
+
29
+ search_fields = ("title", "author__computed_str", "slug", "content")
30
+ filterset_fields = {
31
+ "title": ["icontains", "exact"],
32
+ "target": ["icontains", "exact"],
33
+ "author": ["exact"],
34
+ "created": ["exact", "lte", "gte"],
35
+ "modified": ["exact", "lte", "gte"],
36
+ }
37
+ ordering_fields = ("title", "author", "created", "modified")
38
+
39
+ def get_queryset(self):
40
+ if self.request.user.has_perm("wbwriter.view_publication"):
41
+ qs = Publication.objects.all()
42
+
43
+ if content_type := self.request.GET.get("content_type"):
44
+ qs = qs.filter(content_type_id=content_type)
45
+
46
+ if object_id := self.request.GET.get("object_id"):
47
+ qs = qs.filter(object_id=object_id)
48
+
49
+ return qs.prefetch_related("tags").select_related("parser", "author")
50
+
51
+ return Publication.objects.none()
52
+
53
+
54
+ class PublicationParserModelViewSet(ModelViewSet):
55
+ display_config_class = PublicationParserDisplayConfig
56
+
57
+ search_fields = ("title", "slug")
58
+ filterset_fields = {
59
+ "title": ["icontains", "exact"],
60
+ }
61
+ ordering_fields = ("title",)
62
+
63
+ serializer_class = PublicationParserSerializer
64
+ queryset = PublicationParser.objects.all()
65
+
66
+ def get_queryset(self):
67
+ if self.request.user.is_superuser or self.request.user.profile.is_internal:
68
+ return PublicationParser.objects.all()
69
+
70
+ return PublicationParser.objects.none()
71
+
72
+
73
+ class PublicationRepresentationViewSet(RepresentationViewSet):
74
+ """Displays the title and the created date of the Publication model."""
75
+
76
+ serializer_class = PublicationRepresentationSerializer
77
+ queryset = Publication.objects.all()
78
+
79
+ display_config_class = PublicationDisplayConfig
80
+ button_config_class = PublicationButtonConfig
81
+
82
+ search_fields = ("title", "author", "slug", "content")
83
+ filterset_fields = {
84
+ "title": ["icontains", "exact"],
85
+ "target": ["icontains", "exact"],
86
+ "author": ["exact"],
87
+ "created": ["exact", "lte", "gte"],
88
+ "modified": ["exact", "lte", "gte"],
89
+ }
90
+ ordering_fields = ("title", "author", "created", "modified")
91
+
92
+ def get_queryset(self):
93
+ if self.request.user.is_superuser or ((person := self.request.user.profile) and person.is_internal):
94
+ return Publication.objects.all()
95
+
96
+ return Publication.objects.none()
97
+
98
+
99
+ class PublicationParserRepresentationViewSet(RepresentationViewSet):
100
+ """Displays the title of the PublicationParser model."""
101
+
102
+ serializer_class = PublicationParserRepresentationSerializer
103
+ queryset = PublicationParser.objects.all()
104
+
105
+ display_config_class = PublicationParserDisplayConfig
106
+
107
+ search_fields = ("title", "slug")
108
+ filterset_fields = {
109
+ "title": ["icontains", "exact"],
110
+ }
111
+ ordering_fields = ("title",)
112
+
113
+ def get_queryset(self):
114
+ if self.request.user.is_superuser or self.request.user.profile.is_internal:
115
+ return PublicationParser.objects.all()
116
+
117
+ return PublicationParser.objects.none()
@@ -0,0 +1,2 @@
1
+ from .publication_title_config import PublicationTitleConfig
2
+ from .reviewer_article_title_config import ReviewerArticleTitleConfig
@@ -0,0 +1,18 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbwriter.models import Publication
3
+
4
+
5
+ class PublicationTitleConfig(TitleViewConfig):
6
+ def get_list_title(self):
7
+ title = "Publications"
8
+ if self.request.GET.get("content_type") and self.request.GET.get("object_id"):
9
+ publications = Publication.objects.filter(
10
+ content_type__id=self.request.GET.get("content_type"), object_id=self.request.GET.get("object_id")
11
+ )
12
+ if publications.exists():
13
+ pub = publications.first()
14
+ content_type_label = pub.content_type.model
15
+ content_title = pub.content_object.get_publication_metadata()["title"]
16
+ title = f"{title} of {content_type_label}: {content_title}"
17
+
18
+ return title
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class ReviewerArticleTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Articles to be reviewed"
@@ -0,0 +1,8 @@
1
+ Metadata-Version: 2.3
2
+ Name: wbwriter
3
+ Version: 2.2.1
4
+ Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
+ Requires-Dist: pillow==9.1.*
6
+ Requires-Dist: reportlab==3.*
7
+ Requires-Dist: wbcore
8
+ Requires-Dist: weasyprint==57.*
@@ -0,0 +1,70 @@
1
+ wbwriter/__init__.py,sha256=J-j-u0itpEFT6irdmWmixQqYMadNl1X91TxUmoiLHMI,22
2
+ wbwriter/admin.py,sha256=Pagj9JgNlRRrwQSn2I63iuzalOHjEtKjqQi5S9N2hdo,3625
3
+ wbwriter/apps.py,sha256=UdEgUQGJaw3f6fkHlbL4kNC4CyksLOBL7ZpDBJmqD_U,91
4
+ wbwriter/dynamic_preferences_registry.py,sha256=yt3PJCuTv5TpHM2hQsTR-aNllRY20_pyo-wcS38DruU,594
5
+ wbwriter/pdf_generator.py,sha256=AYjcVaCnrV2D4lmCSOJUGCPq4wqH9fPFJoCDkNUV0j4,6640
6
+ wbwriter/publication_parser.py,sha256=2GjtCgX9o-zYfzIaNveBqJtPu9bSL_yDn-4u6IBEVWE,9349
7
+ wbwriter/typings.py,sha256=-SsobxnS4-hCOL_44n-QcXXv1FuhZsQAwLj9BybtEVU,501
8
+ wbwriter/urls.py,sha256=uL04HSQ3EuYcA9L0M912GrS7rbXTo2RL3qhj1U_-pbY,2630
9
+ wbwriter/factories/__init__.py,sha256=NrHTM4vUVdLASCeSAYkklmBbtP2B5kQ5gwlZey5lp0o,364
10
+ wbwriter/factories/article.py,sha256=7GIMhpO1DDezlwW226yeIKzLPTlQyFKvq8sVVOMfMVs,5784
11
+ wbwriter/factories/meta_information.py,sha256=cEbMStmq_yNN7cH3ptHGQaWs-4jjwE0fuzZO62lWdI4,923
12
+ wbwriter/filters/__init__.py,sha256=2OTkcXa8veIWN-v_WV5mHvGuw3tIuJzh9qD2zaFrA4M,102
13
+ wbwriter/filters/article.py,sha256=xW8rg6vgRP6_guXO0QcaaopQiOUcV9D5Xs7L3f0iIHQ,1576
14
+ wbwriter/filters/metainformationinstance.py,sha256=oVj2izoG0mj1tPfhzKFJMevGkKxKTW4LBWzaktmy7DM,856
15
+ wbwriter/migrations/0001_initial_squashed_squashed_0008_alter_article_author_alter_article_feedback_contact_and_more.py,sha256=31Fo3O3Azaqe59v1CGWXtj4oLy349PmTnDI7S6oBg2U,26174
16
+ wbwriter/migrations/0009_dependantarticle.py,sha256=OCxWFj68ToPelJJ_Hlrt3PXZy56zvup8YWpCoAjU62g,1314
17
+ wbwriter/migrations/0010_alter_article_options.py,sha256=S2CVb5wVXHpwok3gehyedMrZMVbwj75m6LkrVg5dhv8,520
18
+ wbwriter/migrations/0011_auto_20240103_0953.py,sha256=UnaHFJM7DVOSEfS0wm8rWEh9H2_wDcmKPYFRJYIx1Gs,1321
19
+ wbwriter/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ wbwriter/models/__init__.py,sha256=opUUL36nRzxJypQNupPM8NxUj-u4uuB11IDn5XSkjVE,248
21
+ wbwriter/models/article.py,sha256=P8RsyIPqdRq-BPwNHdJmdiYgiVq7BtWqtIMjJbMzGW0,44416
22
+ wbwriter/models/article_type.py,sha256=hofB200Y11LFanpICNgWYDa5-Qg-K4X2fXv6qccBP_0,1999
23
+ wbwriter/models/block.py,sha256=tn2sklo7s401Y0Ww5M09Y9Wv-yivEvAR1eM5raG7gtc,835
24
+ wbwriter/models/block_parameter.py,sha256=bHBp9bo5EEiZKTzhYfBwkidcS6kZVy81vtcAlx7xzck,524
25
+ wbwriter/models/in_editor_template.py,sha256=1LqnxkAw9Iyh8EmjWnf3O3TUmneng0Zp4OTFpGgSphg,3411
26
+ wbwriter/models/meta_information.py,sha256=8Ipozrv8ndsBUZKIAc-Qcg57xr5IMpjfoSG-DbL_0qQ,3020
27
+ wbwriter/models/mixins.py,sha256=-1P0bQCS76H2D8Mj1Bwhzv3KsNwnkts9f75lGUrcxFU,249
28
+ wbwriter/models/publication_models.py,sha256=u7JHwnsIcrGxqgwsY6WqyDSuOtz5FUy3NYspMKCAPBc,5180
29
+ wbwriter/models/style.py,sha256=b-CnU9K5D6adePdz4LpCdwXjK2750V3QnFv39wK-JLA,262
30
+ wbwriter/models/template.py,sha256=i6b_qmkUJIbrFqNaeld3gSjR7GLeU-EfKJiPsfjFA_Y,928
31
+ wbwriter/serializers/__init__.py,sha256=zPzGMOsxp8yEZ5m2sATEeqlZaktNWbXCx8oZefeiCa4,828
32
+ wbwriter/serializers/article.py,sha256=x67h6XPXKA2szSodccLKoTnKlxjIDwz8q0qDvGucC2w,13494
33
+ wbwriter/serializers/article_type.py,sha256=uEEHQZmf45xw8Lbak9HhBaW9ruZFCMe6WYy27W10D8k,425
34
+ wbwriter/serializers/in_editor_template.py,sha256=lC5ZHbzQHp3raEuHgWpSEtepbYYSrUEyQbOcNMtWxkM,1031
35
+ wbwriter/serializers/meta_information.py,sha256=wSkrMOtX0MzmwUjTE8takluVCZ5cOytFSW44gSbTIjg,2045
36
+ wbwriter/serializers/publication.py,sha256=bMTQoZ_sICymrZ0ZpQnv6Bez1ibFUzfQImwc2hvLRT4,2500
37
+ wbwriter/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ wbwriter/templatetags/writer.py,sha256=YJ6vaqRF22JinE-wcxWE4_-5jWXeL7Ov-puyfoySuds,3050
39
+ wbwriter/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ wbwriter/tests/conftest.py,sha256=1vehReFFD4YZHYbOeCEFIuufIeC1QmbUV0mS4VmAXKU,982
41
+ wbwriter/tests/signals.py,sha256=ay1kQIaHT7a_kymGimdq1MWj_8UjNqlYW-oyN13WK6c,989
42
+ wbwriter/tests/test_filter.py,sha256=dhXiMsjSkwsTdsHMZt2cUt3QzCECvKgN3te5DLee5qM,2663
43
+ wbwriter/tests/test_model.py,sha256=pOdwMkgvEL8kWnT6QT4xCn7GU_jxxL5xgorg5F8jrLk,29216
44
+ wbwriter/tests/test_writer.py,sha256=XRmfaH-o4ItekFjw1dnIyMzw7veTCw6KH_PouQgFRRQ,1584
45
+ wbwriter/tests/tests.py,sha256=9quRn44Xi1XIKKIXKCBRmtSpARJowjm7_Edw40Mutdw,332
46
+ wbwriter/viewsets/__init__.py,sha256=FSoHcwxYukis44flBOwKaoa6fABkNI66lzaTXaYEZxk,722
47
+ wbwriter/viewsets/article.py,sha256=_1ftBoXh0UwqZBZ-CMRSlJ84gRcQhoq9FJ6pnruE2OU,9705
48
+ wbwriter/viewsets/article_type.py,sha256=YgsxYixelO903sFguSSXSOTPMjPkOCoLcKyylZTMJFw,1502
49
+ wbwriter/viewsets/buttons.py,sha256=4XPCOaUYSKur0n2pjVzcWPW8rW0g4bKugJPqWaIp68E,2843
50
+ wbwriter/viewsets/in_editor_template.py,sha256=q0JcJur5wP87aT68HAcg538JwxbzCV6Wgc09Z8tAliI,1712
51
+ wbwriter/viewsets/menu.py,sha256=SE-y6PIeamISF_DOJVCYtTKbTVTZQs0Hk5aSrBYib-Q,1472
52
+ wbwriter/viewsets/meta_information.py,sha256=fazKgKDD0gonnN-RHd4fGcKTXCke3og7DS6kh5lc11Y,1587
53
+ wbwriter/viewsets/meta_information_instance.py,sha256=ZGTxjrupbCjjVBi8BQLXuZ1vNRHjB-dVBVkPapPlK1E,1694
54
+ wbwriter/viewsets/publication.py,sha256=TG_DNlQcYH-lT4owNc1zCSzAB89M_R9dykJGILj7s0A,4032
55
+ wbwriter/viewsets/display/__init__.py,sha256=Jd-MWVcTEko7Ap9pbfURogzIjy5gKeb18KcYJfZjOQs,403
56
+ wbwriter/viewsets/display/article.py,sha256=P8JbmZX6vK7qrRNZCXnolxWK88JLb9Tej7SU52PdRXk,16701
57
+ wbwriter/viewsets/display/article_type.py,sha256=FV8nvnhY7MLaZbmtV59V33b2goH8QCWl9MrFJJ-Acf8,900
58
+ wbwriter/viewsets/display/in_editor_template.py,sha256=jGUb32byyK9KwBd6ZPcJ0m0e2WW-QBm7aP2TkLkQYl0,1490
59
+ wbwriter/viewsets/display/meta_information.py,sha256=jGxMsZHwiY7fmfXz7nktRyQtPdTs3PydkKx0CrNf0qo,1384
60
+ wbwriter/viewsets/display/meta_information_instance.py,sha256=OLwr22j_rSmrrHunJq5bsPaM-WmxHgHXsz-gJbUmlpE,1054
61
+ wbwriter/viewsets/display/publication.py,sha256=VyZ1EpZP7erTbXWeooFIwUWfh_OR8Nbcmpf0MuBawA8,1953
62
+ wbwriter/viewsets/endpoints/__init__.py,sha256=sqNwR-IiHFhX1287fdk27IEUuAPHG0l1V5gcJNDQWaU,160
63
+ wbwriter/viewsets/endpoints/article.py,sha256=QlMbNkKEEZisYdO8burkoJ12rPcNMMonxK5DW7VHiac,515
64
+ wbwriter/viewsets/endpoints/meta_information.py,sha256=m7rVbfTNjsQNibmqtAG4DvXSJhxQMZlFx4fE9YrrgwA,594
65
+ wbwriter/viewsets/titles/__init__.py,sha256=INLTvGeBi5Xro7i3FlJ2fesh-TjKbxRBlfsAyeg3h7k,131
66
+ wbwriter/viewsets/titles/publication_title_config.py,sha256=EzVGhcRvXspGT8MGah1Dj9LmD2_FBZnX0_Li_8Zs8SE,806
67
+ wbwriter/viewsets/titles/reviewer_article_title_config.py,sha256=YzRjuUwbe6vBwWhYLrCe6woGCpQ9c7AwkujKqPh5mLw,183
68
+ wbwriter-2.2.1.dist-info/METADATA,sha256=qE9BcOKWpPjI5De0rqIYo_Lo7nO5sVFERNqmu-Goy8I,229
69
+ wbwriter-2.2.1.dist-info/WHEEL,sha256=aO3RJuuiFXItVSnAUEmQ0yRBvv9e1sbJh68PtuQkyAE,105
70
+ wbwriter-2.2.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.26.3
3
+ Root-Is-Purelib: true
4
+ Tag: py2-none-any
5
+ Tag: py3-none-any