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,653 @@
1
+ # Generated by Django 4.1.7 on 2023-04-19 05:26
2
+
3
+ import django.db.models.deletion
4
+ import django.utils.timezone
5
+ import django_fsm
6
+ from django.db import migrations, models
7
+
8
+
9
+ class Migration(migrations.Migration):
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ("tags", "0001_initial"),
14
+ ("directory", "0001_initial"),
15
+ ("wbcore", "0001_initial_squashed_squashed_0010_preset_appliedpreset"),
16
+ ("contenttypes", "0002_remove_content_type_name"),
17
+ ]
18
+
19
+ operations = [
20
+ migrations.CreateModel(
21
+ name="Style",
22
+ fields=[
23
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
24
+ ("title", models.CharField(max_length=255, unique=True)),
25
+ ("style", models.TextField(default="")),
26
+ ],
27
+ ),
28
+ migrations.CreateModel(
29
+ name="Template",
30
+ fields=[
31
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
32
+ ("title", models.CharField(max_length=255, unique=True)),
33
+ ("template", models.TextField(default="")),
34
+ ("styles", models.ManyToManyField(blank=True, related_name="templates", to="wbwriter.style")),
35
+ (
36
+ "footer_template",
37
+ models.ForeignKey(
38
+ blank=True,
39
+ null=True,
40
+ on_delete=django.db.models.deletion.SET_NULL,
41
+ related_name="footer_templates",
42
+ to="wbwriter.template",
43
+ ),
44
+ ),
45
+ (
46
+ "header_template",
47
+ models.ForeignKey(
48
+ blank=True,
49
+ null=True,
50
+ on_delete=django.db.models.deletion.SET_NULL,
51
+ related_name="header_templates",
52
+ to="wbwriter.template",
53
+ ),
54
+ ),
55
+ ("extra_vertical_margin", models.FloatField(default=10)),
56
+ ("side_margin", models.FloatField(default=2.5)),
57
+ ],
58
+ ),
59
+ migrations.CreateModel(
60
+ name="Block",
61
+ fields=[
62
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
63
+ ("title", models.CharField(max_length=512)),
64
+ ("html", models.TextField(default="")),
65
+ ("key", models.CharField(blank=True, max_length=512, null=True)),
66
+ ],
67
+ ),
68
+ migrations.CreateModel(
69
+ name="BlockParameter",
70
+ fields=[
71
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
72
+ ("order", models.PositiveIntegerField()),
73
+ ("title", models.CharField(max_length=255)),
74
+ ("many", models.BooleanField(default=False)),
75
+ (
76
+ "block",
77
+ models.ForeignKey(
78
+ on_delete=django.db.models.deletion.CASCADE, related_name="parameters", to="wbwriter.block"
79
+ ),
80
+ ),
81
+ ],
82
+ ),
83
+ migrations.CreateModel(
84
+ name="InEditorTemplate",
85
+ fields=[
86
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
87
+ ("uuid", models.CharField(max_length=255, unique=True)),
88
+ (
89
+ "title",
90
+ models.CharField(
91
+ help_text="The title should be unique but doesn't need to be.",
92
+ max_length=255,
93
+ verbose_name="Title",
94
+ ),
95
+ ),
96
+ (
97
+ "description",
98
+ models.TextField(
99
+ default="",
100
+ help_text="A brief text that describes the use case for this template.",
101
+ verbose_name="Description",
102
+ ),
103
+ ),
104
+ (
105
+ "style",
106
+ models.TextField(
107
+ blank=True,
108
+ default="",
109
+ help_text="The CSS that styles the templates HTML.",
110
+ null=True,
111
+ verbose_name="Template CSS",
112
+ ),
113
+ ),
114
+ (
115
+ "template",
116
+ models.TextField(
117
+ default="", help_text="The HTML code of the template.", verbose_name="Template HTML"
118
+ ),
119
+ ),
120
+ ("is_stand_alone_template", models.BooleanField(default=True)),
121
+ (
122
+ "modified",
123
+ models.DateTimeField(
124
+ auto_now=True,
125
+ help_text="The last time this template has been edited.",
126
+ verbose_name="Last modification date and time",
127
+ ),
128
+ ),
129
+ ],
130
+ ),
131
+ migrations.CreateModel(
132
+ name="PublicationParser",
133
+ fields=[
134
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
135
+ ("title", models.CharField(max_length=1024, unique=True)),
136
+ ("slug", models.CharField(blank=True, max_length=1024)),
137
+ ("parser_path", models.CharField(max_length=1024, unique=True)),
138
+ ],
139
+ options={
140
+ "verbose_name": "PublicationParser",
141
+ "verbose_name_plural": "PublicationParsers",
142
+ },
143
+ ),
144
+ migrations.CreateModel(
145
+ name="ArticleType",
146
+ fields=[
147
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
148
+ ("label", models.CharField(max_length=255, unique=True)),
149
+ ("slug", models.SlugField(blank=True, max_length=255, null=True, unique=True)),
150
+ (
151
+ "parsers",
152
+ models.ManyToManyField(
153
+ blank=True, related_name="publication_parsers", to="wbwriter.publicationparser"
154
+ ),
155
+ ),
156
+ ],
157
+ options={
158
+ "verbose_name": "Article Type",
159
+ "verbose_name_plural": "Article Types",
160
+ },
161
+ ),
162
+ migrations.CreateModel(
163
+ name="Article",
164
+ fields=[
165
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
166
+ (
167
+ "title",
168
+ models.CharField(
169
+ blank=True,
170
+ help_text="The title of the article that is going to be used when imported into other articles. Defaults to the name of the article when not set.",
171
+ max_length=1024,
172
+ null=True,
173
+ ),
174
+ ),
175
+ ("slug", models.CharField(blank=True, max_length=1024, null=True)),
176
+ ("content", models.TextField(default="")),
177
+ (
178
+ "status",
179
+ django_fsm.FSMField(
180
+ choices=[
181
+ ("draft", "Draft"),
182
+ ("feedback", "Feedback"),
183
+ ("peer_review", "Peer Review"),
184
+ ("qa_review", "QA Review"),
185
+ ("approved", "Approved"),
186
+ ],
187
+ default="draft",
188
+ max_length=50,
189
+ ),
190
+ ),
191
+ (
192
+ "template",
193
+ models.ForeignKey(
194
+ blank=True,
195
+ null=True,
196
+ on_delete=django.db.models.deletion.SET_NULL,
197
+ related_name="articles",
198
+ to="wbwriter.template",
199
+ ),
200
+ ),
201
+ (
202
+ "name",
203
+ models.CharField(
204
+ help_text="A unique name to reference this article.", max_length=1024, unique=True
205
+ ),
206
+ ),
207
+ ("tag_detail_endpoint", models.CharField(blank=True, max_length=255, null=True)),
208
+ ("tag_representation", models.CharField(blank=True, max_length=255, null=True)),
209
+ (
210
+ "access_level",
211
+ models.TextField(
212
+ choices=[("All", "All"), ("Employee", "Employee")], default="Employee", max_length=16
213
+ ),
214
+ ),
215
+ ("article_structure", models.JSONField(blank=True, null=True)),
216
+ (
217
+ "created",
218
+ models.DateField(
219
+ auto_now_add=True,
220
+ default=django.utils.timezone.now,
221
+ help_text="The date on which this article has been created.",
222
+ verbose_name="Creation Date",
223
+ ),
224
+ ),
225
+ (
226
+ "modified",
227
+ models.DateTimeField(
228
+ auto_now=True,
229
+ help_text="The last time this article has been edited.",
230
+ verbose_name="Last modification date and time",
231
+ ),
232
+ ),
233
+ (
234
+ "published",
235
+ models.DateTimeField(
236
+ blank=True,
237
+ help_text="The date and time on which this article has been/will be published.",
238
+ null=True,
239
+ verbose_name="Publication Date and Time",
240
+ ),
241
+ ),
242
+ (
243
+ "type",
244
+ models.ForeignKey(
245
+ blank=True,
246
+ null=True,
247
+ on_delete=django.db.models.deletion.PROTECT,
248
+ related_name="article",
249
+ to="wbwriter.articletype",
250
+ ),
251
+ ),
252
+ (
253
+ "raw_content",
254
+ models.JSONField(
255
+ default=dict,
256
+ help_text="Maps content IDs to content and configurations to sections.",
257
+ verbose_name="Raw Content",
258
+ ),
259
+ ),
260
+ (
261
+ "in_editor_templates",
262
+ models.ManyToManyField(
263
+ blank=True, related_name="templated_articles", to="wbwriter.ineditortemplate"
264
+ ),
265
+ ),
266
+ ("peer_reviewer_approved", models.BooleanField(default=False)),
267
+ ("qa_reviewer_approved", models.BooleanField(default=False)),
268
+ ("teaser_image", models.ImageField(blank=True, null=True, upload_to="wbwriter/teaser_images")),
269
+ ],
270
+ options={
271
+ "permissions": [("administrate_article", "Can administrate Articles.")],
272
+ "verbose_name": "Article",
273
+ "verbose_name_plural": "Articles",
274
+ },
275
+ ),
276
+ migrations.CreateModel(
277
+ name="Publication",
278
+ fields=[
279
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
280
+ ("title", models.CharField(max_length=1024)),
281
+ ("slug", models.CharField(blank=True, max_length=1024)),
282
+ (
283
+ "created",
284
+ models.DateField(
285
+ auto_now_add=True,
286
+ help_text="The date on which this has been created.",
287
+ verbose_name="Creation Date",
288
+ ),
289
+ ),
290
+ ("content", models.TextField(default="")),
291
+ ("content_file", models.FileField(blank=True, null=True, upload_to="")),
292
+ (
293
+ "parser",
294
+ models.ForeignKey(
295
+ on_delete=django.db.models.deletion.PROTECT,
296
+ related_name="parsed_publication",
297
+ to="wbwriter.publicationparser",
298
+ ),
299
+ ),
300
+ (
301
+ "content_type",
302
+ models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"),
303
+ ),
304
+ ("object_id", models.PositiveIntegerField()),
305
+ ("tag_detail_endpoint", models.CharField(blank=True, max_length=255, null=True)),
306
+ ("tag_representation", models.CharField(blank=True, max_length=255, null=True)),
307
+ ("teaser_image", models.ImageField(blank=True, null=True, upload_to="wbwriter/publication/assets")),
308
+ ],
309
+ options={
310
+ "verbose_name": "Publication",
311
+ "verbose_name_plural": "Publications",
312
+ },
313
+ ),
314
+ migrations.CreateModel(
315
+ name="MetaInformation",
316
+ fields=[
317
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
318
+ ("name", models.CharField(max_length=255)),
319
+ (
320
+ "meta_information_type",
321
+ models.CharField(choices=[("BOOLEAN", "Boolean")], default="BOOLEAN", max_length=24),
322
+ ),
323
+ ("boolean_default", models.BooleanField(blank=True, null=True)),
324
+ ("article_type", models.ManyToManyField(related_name="meta_information", to="wbwriter.articletype")),
325
+ ],
326
+ options={
327
+ "verbose_name": "Meta Information",
328
+ "verbose_name_plural": "MetaInformation",
329
+ },
330
+ ),
331
+ migrations.CreateModel(
332
+ name="MetaInformationInstance",
333
+ fields=[
334
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
335
+ ("boolean_value", models.BooleanField(blank=True, null=True)),
336
+ (
337
+ "article",
338
+ models.ForeignKey(
339
+ on_delete=django.db.models.deletion.CASCADE,
340
+ related_name="meta_information",
341
+ to="wbwriter.article",
342
+ ),
343
+ ),
344
+ (
345
+ "meta_information",
346
+ models.ForeignKey(
347
+ on_delete=django.db.models.deletion.CASCADE,
348
+ related_name="instances",
349
+ to="wbwriter.metainformation",
350
+ ),
351
+ ),
352
+ ],
353
+ options={
354
+ "verbose_name": "Meta Information Instance",
355
+ "verbose_name_plural": "Meta Information Instances",
356
+ },
357
+ ),
358
+ migrations.AddConstraint(
359
+ model_name="metainformationinstance",
360
+ constraint=models.UniqueConstraint(
361
+ fields=("meta_information", "article"), name="unique_meta_information_article"
362
+ ),
363
+ ),
364
+ migrations.AlterModelOptions(
365
+ name="metainformation",
366
+ options={"verbose_name": "Meta Information", "verbose_name_plural": "Meta Information"},
367
+ ),
368
+ migrations.AddField(
369
+ model_name="metainformation",
370
+ name="key",
371
+ field=models.CharField(default=None, max_length=255, unique=True),
372
+ preserve_default=False,
373
+ ),
374
+ migrations.AlterField(
375
+ model_name="metainformation",
376
+ name="name",
377
+ field=models.CharField(max_length=255, unique=True),
378
+ ),
379
+ migrations.AddField(
380
+ model_name="publication",
381
+ name="additional_information",
382
+ field=models.JSONField(blank=True, default=dict, null=True),
383
+ ),
384
+ migrations.AlterModelOptions(
385
+ name="article",
386
+ options={
387
+ "permissions": [
388
+ ("administrate_article", "Can administrate Articles."),
389
+ ("publish_article", "Can publish Articles."),
390
+ ("peer_review_article", "Can peer review Articles."),
391
+ ("qa_review_article", "Can QA review Articles."),
392
+ ],
393
+ "verbose_name": "Article",
394
+ "verbose_name_plural": "Articles",
395
+ },
396
+ ),
397
+ migrations.AlterField(
398
+ model_name="article",
399
+ name="status",
400
+ field=django_fsm.FSMField(
401
+ choices=[
402
+ ("draft", "Draft"),
403
+ ("feedback", "Feedback"),
404
+ ("peer_review", "Peer Review"),
405
+ ("qa_review", "QA Review"),
406
+ ("approved", "Approved"),
407
+ ("published", "Published"),
408
+ ],
409
+ default="draft",
410
+ max_length=50,
411
+ ),
412
+ ),
413
+ migrations.AlterField(
414
+ model_name="article",
415
+ name="status",
416
+ field=django_fsm.FSMField(
417
+ choices=[
418
+ ("draft", "Draft"),
419
+ ("feedback", "Feedback"),
420
+ ("peer_review", "Peer Review"),
421
+ ("qa_review", "QA Review"),
422
+ ("author_approval", "Author approval"),
423
+ ("approved", "Approved"),
424
+ ("published", "Published"),
425
+ ],
426
+ default="draft",
427
+ max_length=50,
428
+ ),
429
+ ),
430
+ migrations.RemoveField(
431
+ model_name="article",
432
+ name="template",
433
+ ),
434
+ migrations.AddField(
435
+ model_name="publication",
436
+ name="target",
437
+ field=models.CharField(default="website", max_length=256),
438
+ preserve_default=False,
439
+ ),
440
+ migrations.RemoveField(
441
+ model_name="article",
442
+ name="qa_reviewer_approved",
443
+ ),
444
+ migrations.AlterField(
445
+ model_name="article",
446
+ name="type",
447
+ field=models.ForeignKey(
448
+ on_delete=django.db.models.deletion.PROTECT, related_name="article", to="wbwriter.articletype"
449
+ ),
450
+ ),
451
+ migrations.AddField(
452
+ model_name="article",
453
+ name="template",
454
+ field=models.ForeignKey(
455
+ blank=True,
456
+ null=True,
457
+ on_delete=django.db.models.deletion.SET_NULL,
458
+ related_name="articles",
459
+ to="wbwriter.template",
460
+ ),
461
+ ),
462
+ migrations.RemoveField(
463
+ model_name="article",
464
+ name="access_level",
465
+ ),
466
+ migrations.AddField(
467
+ model_name="article",
468
+ name="is_private",
469
+ field=models.BooleanField(
470
+ default=False, help_text="Signifies whether this article can be seen by all customers on the homepage."
471
+ ),
472
+ ),
473
+ migrations.RemoveField(
474
+ model_name="article",
475
+ name="in_editor_templates",
476
+ ),
477
+ migrations.RemoveField(
478
+ model_name="article",
479
+ name="content",
480
+ ),
481
+ migrations.RenameField(
482
+ model_name="article",
483
+ old_name="raw_content",
484
+ new_name="content",
485
+ ),
486
+ migrations.AlterField(
487
+ model_name="article",
488
+ name="content",
489
+ field=models.JSONField(default=dict, verbose_name="Content"),
490
+ ),
491
+ migrations.AddField(
492
+ model_name="publication",
493
+ name="modified",
494
+ field=models.DateTimeField(
495
+ auto_now=True,
496
+ help_text="The date and time on which this has been modified last.",
497
+ verbose_name="Last Modification Datetime",
498
+ ),
499
+ ),
500
+ migrations.RemoveField(
501
+ model_name="article",
502
+ name="published",
503
+ ),
504
+ migrations.AddField(
505
+ model_name="publication",
506
+ name="description",
507
+ field=models.TextField(blank=True, default=""),
508
+ ),
509
+ migrations.AlterField(
510
+ model_name="article",
511
+ name="teaser_image",
512
+ field=models.ImageField(blank=True, null=True, upload_to="writer/article/teasers"),
513
+ ),
514
+ migrations.AlterField(
515
+ model_name="publication",
516
+ name="content_file",
517
+ field=models.FileField(
518
+ blank=True, max_length=256, null=True, upload_to="writer/publication/content_files"
519
+ ),
520
+ ),
521
+ migrations.AlterField(
522
+ model_name="publication",
523
+ name="teaser_image",
524
+ field=models.ImageField(blank=True, null=True, upload_to="writer/publication/teasers"),
525
+ ),
526
+ migrations.AddField(
527
+ model_name="publication",
528
+ name="thumbnail_image",
529
+ field=models.ImageField(blank=True, null=True, upload_to="writer/publication/thumbnails"),
530
+ ),
531
+ migrations.AlterField(
532
+ model_name="article",
533
+ name="tag_representation",
534
+ field=models.CharField(blank=True, max_length=512, null=True),
535
+ ),
536
+ migrations.AlterField(
537
+ model_name="publication",
538
+ name="tag_representation",
539
+ field=models.CharField(blank=True, max_length=512, null=True),
540
+ ),
541
+ migrations.AlterModelOptions(
542
+ name="article",
543
+ options={
544
+ "permissions": [
545
+ ("administrate_article", "Can administrate Articles."),
546
+ ("assign_article_reviewers", "Can assign Articles' peer and QA reviewers."),
547
+ ("publish_article", "Can publish Articles."),
548
+ ("peer_review_article", "Can peer review Articles."),
549
+ ("qa_review_article", "Can QA review Articles."),
550
+ ],
551
+ "verbose_name": "Article",
552
+ "verbose_name_plural": "Articles",
553
+ },
554
+ ),
555
+ migrations.AddField(
556
+ model_name="article",
557
+ name="tags",
558
+ field=models.ManyToManyField(blank=True, related_name="%(app_label)s_%(class)s_items", to="tags.tag"),
559
+ ),
560
+ migrations.AddField(
561
+ model_name="publication",
562
+ name="tags",
563
+ field=models.ManyToManyField(blank=True, related_name="%(app_label)s_%(class)s_items", to="tags.tag"),
564
+ ),
565
+ migrations.AddField(
566
+ model_name="article",
567
+ name="author",
568
+ field=models.ForeignKey(
569
+ blank=True,
570
+ null=True,
571
+ on_delete=django.db.models.deletion.PROTECT,
572
+ related_name="author_articles",
573
+ to="directory.person",
574
+ ),
575
+ ),
576
+ migrations.AddField(
577
+ model_name="article",
578
+ name="feedback_contact",
579
+ field=models.ForeignKey(
580
+ blank=True,
581
+ null=True,
582
+ on_delete=django.db.models.deletion.SET_NULL,
583
+ related_name="feedback_contact_articles",
584
+ to="directory.person",
585
+ ),
586
+ ),
587
+ migrations.AddField(
588
+ model_name="article",
589
+ name="peer_reviewer",
590
+ field=models.ForeignKey(
591
+ blank=True,
592
+ help_text="The peer reviewer who reviewed this article.",
593
+ null=True,
594
+ on_delete=django.db.models.deletion.SET_NULL,
595
+ related_name="peer_review_articles",
596
+ to="directory.person",
597
+ ),
598
+ ),
599
+ migrations.AddField(
600
+ model_name="article",
601
+ name="qa_reviewer",
602
+ field=models.ForeignKey(
603
+ blank=True,
604
+ help_text="The quality assurance (QA) reviewer who reviewed this article.",
605
+ null=True,
606
+ on_delete=django.db.models.deletion.PROTECT,
607
+ related_name="qa_review_articles",
608
+ to="directory.person",
609
+ ),
610
+ ),
611
+ migrations.AddField(
612
+ model_name="article",
613
+ name="reviewer",
614
+ field=models.ForeignKey(
615
+ blank=True,
616
+ help_text="The contact that is currently working on feedback.",
617
+ null=True,
618
+ on_delete=django.db.models.deletion.SET_NULL,
619
+ related_name="review_articles",
620
+ to="directory.person",
621
+ ),
622
+ ),
623
+ migrations.AddField(
624
+ model_name="articletype",
625
+ name="peer_reviewers",
626
+ field=models.ManyToManyField(related_name="article_type_peer_reviewers", to="directory.person"),
627
+ ),
628
+ migrations.AddField(
629
+ model_name="articletype",
630
+ name="qa_reviewers",
631
+ field=models.ManyToManyField(related_name="article_type_qa_reviewers", to="directory.person"),
632
+ ),
633
+ migrations.AddField(
634
+ model_name="publication",
635
+ name="author",
636
+ field=models.ForeignKey(
637
+ blank=True,
638
+ null=True,
639
+ on_delete=django.db.models.deletion.PROTECT,
640
+ related_name="publication",
641
+ to="directory.person",
642
+ ),
643
+ ),
644
+ migrations.AlterField(
645
+ model_name="article",
646
+ name="created",
647
+ field=models.DateField(
648
+ auto_now_add=True,
649
+ help_text="The date on which this article has been created.",
650
+ verbose_name="Creation Date",
651
+ ),
652
+ ),
653
+ ]
@@ -0,0 +1,41 @@
1
+ # Generated by Django 4.2.6 on 2023-10-26 13:54
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+ dependencies = [
9
+ (
10
+ "wbwriter",
11
+ "0001_initial_squashed_squashed_0008_alter_article_author_alter_article_feedback_contact_and_more",
12
+ ),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.CreateModel(
17
+ name="DependantArticle",
18
+ fields=[
19
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
20
+ (
21
+ "article",
22
+ models.ForeignKey(
23
+ on_delete=django.db.models.deletion.CASCADE,
24
+ related_name="dependant_article_connections",
25
+ to="wbwriter.article",
26
+ ),
27
+ ),
28
+ (
29
+ "dependant_article",
30
+ models.ForeignKey(
31
+ on_delete=django.db.models.deletion.PROTECT,
32
+ related_name="used_article_connections",
33
+ to="wbwriter.article",
34
+ ),
35
+ ),
36
+ ],
37
+ options={
38
+ "abstract": False,
39
+ },
40
+ ),
41
+ ]