wbwriter 1.43.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 (75) 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/templates/wbwriter/article_pdf.html +5 -0
  36. wbwriter/templates/wbwriter/templatetags/cite_article.html +1 -0
  37. wbwriter/templates/wbwriter/templatetags/table_of_contents.html +12 -0
  38. wbwriter/templates/wbwriter/templatetags/table_of_contents_articles.html +8 -0
  39. wbwriter/templatetags/__init__.py +0 -0
  40. wbwriter/templatetags/writer.py +72 -0
  41. wbwriter/tests/__init__.py +0 -0
  42. wbwriter/tests/conftest.py +32 -0
  43. wbwriter/tests/signals.py +23 -0
  44. wbwriter/tests/test_filter.py +58 -0
  45. wbwriter/tests/test_model.py +591 -0
  46. wbwriter/tests/test_writer.py +38 -0
  47. wbwriter/tests/tests.py +18 -0
  48. wbwriter/typings.py +23 -0
  49. wbwriter/urls.py +83 -0
  50. wbwriter/viewsets/__init__.py +22 -0
  51. wbwriter/viewsets/article.py +270 -0
  52. wbwriter/viewsets/article_type.py +49 -0
  53. wbwriter/viewsets/buttons.py +61 -0
  54. wbwriter/viewsets/display/__init__.py +6 -0
  55. wbwriter/viewsets/display/article.py +404 -0
  56. wbwriter/viewsets/display/article_type.py +27 -0
  57. wbwriter/viewsets/display/in_editor_template.py +39 -0
  58. wbwriter/viewsets/display/meta_information.py +37 -0
  59. wbwriter/viewsets/display/meta_information_instance.py +28 -0
  60. wbwriter/viewsets/display/publication.py +55 -0
  61. wbwriter/viewsets/documentation/article.md +1 -0
  62. wbwriter/viewsets/endpoints/__init__.py +2 -0
  63. wbwriter/viewsets/endpoints/article.py +12 -0
  64. wbwriter/viewsets/endpoints/meta_information.py +14 -0
  65. wbwriter/viewsets/in_editor_template.py +68 -0
  66. wbwriter/viewsets/menu.py +42 -0
  67. wbwriter/viewsets/meta_information.py +51 -0
  68. wbwriter/viewsets/meta_information_instance.py +48 -0
  69. wbwriter/viewsets/publication.py +117 -0
  70. wbwriter/viewsets/titles/__init__.py +2 -0
  71. wbwriter/viewsets/titles/publication_title_config.py +18 -0
  72. wbwriter/viewsets/titles/reviewer_article_title_config.py +6 -0
  73. wbwriter-1.43.1.dist-info/METADATA +8 -0
  74. wbwriter-1.43.1.dist-info/RECORD +75 -0
  75. wbwriter-1.43.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.4
2
+ Name: wbwriter
3
+ Version: 1.43.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,75 @@
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=4sfmpOOP2_mIgdhvzHX62wmrmtGSKqhJy9ADIT0yneM,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/templates/wbwriter/article_pdf.html,sha256=odxCwFQpJXBOEmnHwau8ijibNtdteqP8ZlIRV_-KRQs,181
38
+ wbwriter/templates/wbwriter/templatetags/cite_article.html,sha256=OJ7g8sM1ES_S0GpkWC3o12WnmbUm3_R4UemdJHLvTT8,98
39
+ wbwriter/templates/wbwriter/templatetags/table_of_contents.html,sha256=ip4Xz3amxcM2rI8ZNw5_ZuZ6UMuag2E2b-O831aMNN0,287
40
+ wbwriter/templates/wbwriter/templatetags/table_of_contents_articles.html,sha256=1SDRU2qQbfMrLKXVlJ6f34g5CIZJt0aRa17N_2VWZkw,325
41
+ wbwriter/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
+ wbwriter/templatetags/writer.py,sha256=YJ6vaqRF22JinE-wcxWE4_-5jWXeL7Ov-puyfoySuds,3050
43
+ wbwriter/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ wbwriter/tests/conftest.py,sha256=1vehReFFD4YZHYbOeCEFIuufIeC1QmbUV0mS4VmAXKU,982
45
+ wbwriter/tests/signals.py,sha256=ay1kQIaHT7a_kymGimdq1MWj_8UjNqlYW-oyN13WK6c,989
46
+ wbwriter/tests/test_filter.py,sha256=dhXiMsjSkwsTdsHMZt2cUt3QzCECvKgN3te5DLee5qM,2663
47
+ wbwriter/tests/test_model.py,sha256=pOdwMkgvEL8kWnT6QT4xCn7GU_jxxL5xgorg5F8jrLk,29216
48
+ wbwriter/tests/test_writer.py,sha256=XRmfaH-o4ItekFjw1dnIyMzw7veTCw6KH_PouQgFRRQ,1584
49
+ wbwriter/tests/tests.py,sha256=9quRn44Xi1XIKKIXKCBRmtSpARJowjm7_Edw40Mutdw,332
50
+ wbwriter/viewsets/__init__.py,sha256=FSoHcwxYukis44flBOwKaoa6fABkNI66lzaTXaYEZxk,722
51
+ wbwriter/viewsets/article.py,sha256=_1ftBoXh0UwqZBZ-CMRSlJ84gRcQhoq9FJ6pnruE2OU,9705
52
+ wbwriter/viewsets/article_type.py,sha256=YgsxYixelO903sFguSSXSOTPMjPkOCoLcKyylZTMJFw,1502
53
+ wbwriter/viewsets/buttons.py,sha256=4XPCOaUYSKur0n2pjVzcWPW8rW0g4bKugJPqWaIp68E,2843
54
+ wbwriter/viewsets/in_editor_template.py,sha256=q0JcJur5wP87aT68HAcg538JwxbzCV6Wgc09Z8tAliI,1712
55
+ wbwriter/viewsets/menu.py,sha256=SE-y6PIeamISF_DOJVCYtTKbTVTZQs0Hk5aSrBYib-Q,1472
56
+ wbwriter/viewsets/meta_information.py,sha256=fazKgKDD0gonnN-RHd4fGcKTXCke3og7DS6kh5lc11Y,1587
57
+ wbwriter/viewsets/meta_information_instance.py,sha256=ZGTxjrupbCjjVBi8BQLXuZ1vNRHjB-dVBVkPapPlK1E,1694
58
+ wbwriter/viewsets/publication.py,sha256=TG_DNlQcYH-lT4owNc1zCSzAB89M_R9dykJGILj7s0A,4032
59
+ wbwriter/viewsets/display/__init__.py,sha256=Jd-MWVcTEko7Ap9pbfURogzIjy5gKeb18KcYJfZjOQs,403
60
+ wbwriter/viewsets/display/article.py,sha256=P8JbmZX6vK7qrRNZCXnolxWK88JLb9Tej7SU52PdRXk,16701
61
+ wbwriter/viewsets/display/article_type.py,sha256=FV8nvnhY7MLaZbmtV59V33b2goH8QCWl9MrFJJ-Acf8,900
62
+ wbwriter/viewsets/display/in_editor_template.py,sha256=jGUb32byyK9KwBd6ZPcJ0m0e2WW-QBm7aP2TkLkQYl0,1490
63
+ wbwriter/viewsets/display/meta_information.py,sha256=jGxMsZHwiY7fmfXz7nktRyQtPdTs3PydkKx0CrNf0qo,1384
64
+ wbwriter/viewsets/display/meta_information_instance.py,sha256=OLwr22j_rSmrrHunJq5bsPaM-WmxHgHXsz-gJbUmlpE,1054
65
+ wbwriter/viewsets/display/publication.py,sha256=VyZ1EpZP7erTbXWeooFIwUWfh_OR8Nbcmpf0MuBawA8,1953
66
+ wbwriter/viewsets/documentation/article.md,sha256=zha8YbnwwmE_vwvDLZNjoeNbSwOOe0Wo7vOQff5H72w,8
67
+ wbwriter/viewsets/endpoints/__init__.py,sha256=sqNwR-IiHFhX1287fdk27IEUuAPHG0l1V5gcJNDQWaU,160
68
+ wbwriter/viewsets/endpoints/article.py,sha256=QlMbNkKEEZisYdO8burkoJ12rPcNMMonxK5DW7VHiac,515
69
+ wbwriter/viewsets/endpoints/meta_information.py,sha256=m7rVbfTNjsQNibmqtAG4DvXSJhxQMZlFx4fE9YrrgwA,594
70
+ wbwriter/viewsets/titles/__init__.py,sha256=INLTvGeBi5Xro7i3FlJ2fesh-TjKbxRBlfsAyeg3h7k,131
71
+ wbwriter/viewsets/titles/publication_title_config.py,sha256=EzVGhcRvXspGT8MGah1Dj9LmD2_FBZnX0_Li_8Zs8SE,806
72
+ wbwriter/viewsets/titles/reviewer_article_title_config.py,sha256=YzRjuUwbe6vBwWhYLrCe6woGCpQ9c7AwkujKqPh5mLw,183
73
+ wbwriter-1.43.1.dist-info/METADATA,sha256=lJ6-UUe04R6adryDgcT4-r9jZjAobSHDQ9NVzdKdBEE,230
74
+ wbwriter-1.43.1.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
75
+ wbwriter-1.43.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.27.0
3
+ Root-Is-Purelib: true
4
+ Tag: py2-none-any
5
+ Tag: py3-none-any