wbwriter 1.49.0__py2.py3-none-any.whl → 1.49.2__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.

@@ -13,6 +13,7 @@ from django.core.files.base import ContentFile
13
13
  from django.db import models
14
14
  from django.db.models import Count, Max, OuterRef, Subquery
15
15
  from django.db.models.functions import Coalesce
16
+ from django.utils.translation import gettext_lazy
16
17
  from django_fsm import FSMField, transition
17
18
  from dynamic_preferences.registries import global_preferences_registry
18
19
  from modeltrans.fields import TranslationField
@@ -771,14 +772,14 @@ class Article(CloneMixin, TagModelMixin, PublishableMixin, WBModel):
771
772
  """Allow only one-off and deep-dive articles to be published."""
772
773
  errors = dict()
773
774
  if self.status not in [self.Status.APPROVED, self.Status.PUBLISHED]:
774
- errors["status"] = "Status needs to be approved in order to allow publication"
775
+ errors["status"] = [gettext_lazy("Status needs to be approved in order to allow publication")]
775
776
  if not self.type or self.type.slug not in [
776
777
  "one-off-article",
777
778
  "deep-dive-article",
778
779
  "mid-year-review",
779
780
  "year-s-favorites",
780
781
  ]:
781
- errors["type"] = "unvalid type for publication"
782
+ errors["type"] = [gettext_lazy("unvalid type for publication")]
782
783
  # We ensure the article's parser can be published
783
784
  if article_type := self.type:
784
785
  for parser in article_type.parsers.all():
@@ -788,9 +789,9 @@ class Article(CloneMixin, TagModelMixin, PublishableMixin, WBModel):
788
789
  date.today(),
789
790
  ).is_valid()
790
791
  except ParserValidationException as e:
791
- errors["non_field_errors"] = ", ".join(e.errors)
792
+ errors["non_field_errors"] = e.errors
792
793
  except ModuleNotFoundError:
793
- errors["non_field_errors"] = "invalid parser"
794
+ errors["non_field_errors"] = [gettext_lazy("invalid parser")]
794
795
  return errors
795
796
 
796
797
  def can_be_published(self) -> bool:
@@ -243,6 +243,8 @@ def _get_plugin_configs(request):
243
243
  class ArticleFullModelSerializer(ArticleModelSerializer):
244
244
  """Serializes the full set of the fields of of the Article model."""
245
245
 
246
+ is_private_icon = wb_serializers.IconSelectField(read_only=True)
247
+
246
248
  author = wb_serializers.PrimaryKeyRelatedField(
247
249
  many=False,
248
250
  label="Author",
@@ -337,6 +339,7 @@ class ArticleFullModelSerializer(ArticleModelSerializer):
337
339
  model = Article
338
340
  fields = (
339
341
  "id",
342
+ "is_private_icon",
340
343
  "name",
341
344
  "title",
342
345
  "slug",
@@ -1,5 +1,5 @@
1
1
  from django.contrib.contenttypes.models import ContentType
2
- from django.db.models import Q, QuerySet
2
+ from django.db.models import Case, Q, QuerySet, Value, When
3
3
  from django.shortcuts import get_object_or_404
4
4
  from django.utils.functional import cached_property
5
5
  from rest_framework import status
@@ -9,6 +9,7 @@ from reversion.views import RevisionMixin
9
9
  from wbcore.contrib.authentication.authentication import JWTCookieAuthentication
10
10
  from wbcore.contrib.directory.models import Person
11
11
  from wbcore.contrib.i18n.viewsets import ModelTranslateMixin
12
+ from wbcore.contrib.icons import WBIcon
12
13
  from wbcore.utils.views import CloneMixin
13
14
  from wbcore.viewsets import ModelViewSet, RepresentationViewSet
14
15
 
@@ -106,7 +107,9 @@ class ArticleModelViewSet(
106
107
  # LIST_DOCUMENTATION = "wbwriter/viewsets/documentation/article.md"
107
108
 
108
109
  serializer_class = ArticleFullModelSerializer
109
- queryset = Article.objects.all()
110
+ queryset = Article.objects.annotate(
111
+ is_private_icon=Case(When(is_private=False, then=Value(WBIcon.VIEW.icon)), default=Value(WBIcon.IGNORE.icon))
112
+ )
110
113
 
111
114
  button_config_class = ArticleModelButtonConfig
112
115
  display_config_class = ArticleDisplayConfig
@@ -139,10 +142,9 @@ class ArticleModelViewSet(
139
142
  return ContentType.objects.get(app_label="wbwriter", model="article")
140
143
 
141
144
  def get_queryset(self):
142
- if self.request.user.has_perm("wbwriter.administrate_article") or self.profile.is_internal:
143
- qs = Article.objects.all()
144
- else:
145
- qs = Article.objects.filter(is_private=False)
145
+ qs = super().get_queryset()
146
+ if not self.request.user.has_perm("wbwriter.administrate_article") and not self.profile.is_internal:
147
+ qs = qs.filter(is_private=False)
146
148
  return qs.select_related(
147
149
  "type", "feedback_contact", "reviewer", "peer_reviewer", "qa_reviewer", "author"
148
150
  ).prefetch_related("tags")
@@ -3,7 +3,7 @@ from typing import Optional
3
3
  from django.utils.translation import gettext as _
4
4
  from wbcore.contrib.color.enums import WBColor
5
5
  from wbcore.contrib.icons import WBIcon
6
- from wbcore.enums import Operator
6
+ from wbcore.enums import Operator, Unit
7
7
  from wbcore.metadata.configs import display as dp
8
8
  from wbcore.metadata.configs.display.instance_display import (
9
9
  Display,
@@ -264,6 +264,7 @@ class ArticleDisplayConfig(DisplayViewConfig):
264
264
  """Sets up and returns the list display for Article."""
265
265
  return dp.ListDisplay(
266
266
  fields=[
267
+ dp.Field(key="is_private_icon", label=" ", width=Unit.PIXEL(40)),
267
268
  dp.Field(key="id", label=_("ID")),
268
269
  dp.Field(key="title", label=_("Title")),
269
270
  dp.Field(key="teaser_image", label=_("Teaser image")),
@@ -330,20 +331,7 @@ class ArticleDisplayConfig(DisplayViewConfig):
330
331
  ),
331
332
  ],
332
333
  column="status",
333
- ),
334
- dp.Formatting(
335
- formatting_rules=[
336
- dp.FormattingRule(
337
- icon=WBIcon.IGNORE.icon,
338
- condition=("==", True),
339
- ),
340
- dp.FormattingRule(
341
- icon=WBIcon.VIEW.icon,
342
- condition=("==", False),
343
- ),
344
- ],
345
- column="is_private",
346
- ),
334
+ )
347
335
  ],
348
336
  legends=[
349
337
  dp.Legend(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbwriter
3
- Version: 1.49.0
3
+ Version: 1.49.2
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  Requires-Dist: pillow==9.1.*
6
6
  Requires-Dist: reportlab==3.*
@@ -19,7 +19,7 @@ wbwriter/migrations/0011_auto_20240103_0953.py,sha256=UnaHFJM7DVOSEfS0wm8rWEh9H2
19
19
  wbwriter/migrations/0012_i18n.py,sha256=24cClx1sWYh-VEo-IApTiSr5nNvV1CtINiaWRHFztMA,724
20
20
  wbwriter/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  wbwriter/models/__init__.py,sha256=opUUL36nRzxJypQNupPM8NxUj-u4uuB11IDn5XSkjVE,248
22
- wbwriter/models/article.py,sha256=usSEppcSMO2jli2JO1m2gxFwIVSR-NGZm6WYncY74o0,45165
22
+ wbwriter/models/article.py,sha256=wve5_vrEIZMJOmd93TZ6RYNJrAlNgWCSJiOvLNNJMec,45252
23
23
  wbwriter/models/article_type.py,sha256=hofB200Y11LFanpICNgWYDa5-Qg-K4X2fXv6qccBP_0,1999
24
24
  wbwriter/models/block.py,sha256=tn2sklo7s401Y0Ww5M09Y9Wv-yivEvAR1eM5raG7gtc,835
25
25
  wbwriter/models/block_parameter.py,sha256=bHBp9bo5EEiZKTzhYfBwkidcS6kZVy81vtcAlx7xzck,524
@@ -30,7 +30,7 @@ wbwriter/models/publication_models.py,sha256=k6lmyEux7GegtSmBn-X7xXfrFZRASkahXxY
30
30
  wbwriter/models/style.py,sha256=b-CnU9K5D6adePdz4LpCdwXjK2750V3QnFv39wK-JLA,262
31
31
  wbwriter/models/template.py,sha256=i6b_qmkUJIbrFqNaeld3gSjR7GLeU-EfKJiPsfjFA_Y,928
32
32
  wbwriter/serializers/__init__.py,sha256=zPzGMOsxp8yEZ5m2sATEeqlZaktNWbXCx8oZefeiCa4,828
33
- wbwriter/serializers/article.py,sha256=m5lYQP4J7rn_ZNMnyi69IPYs2HTt7tSlYoXmXuKbcrU,13651
33
+ wbwriter/serializers/article.py,sha256=bBtRghL3zZIE0i9gratSk2Yj9vy9fkLfsxd43kyWUIA,13752
34
34
  wbwriter/serializers/article_type.py,sha256=VmMVI0dreuX83GtwtzD0n3-tvmNMnbtc2KIqjAB7beI,426
35
35
  wbwriter/serializers/in_editor_template.py,sha256=hZ0icXVJtiipFSzY3cF0p6X4_0XaKdeMYwjUhgPoDLI,1032
36
36
  wbwriter/serializers/meta_information.py,sha256=zMNU6WYXJVO5L29Depm6FB-FnFMrnAttRI32PmNpt3w,2046
@@ -49,7 +49,7 @@ wbwriter/tests/test_model.py,sha256=kTz68WYfR65x8G9UCXbRRswwQVIPNCQFHRLso-XEd_k,
49
49
  wbwriter/tests/test_writer.py,sha256=XRmfaH-o4ItekFjw1dnIyMzw7veTCw6KH_PouQgFRRQ,1584
50
50
  wbwriter/tests/tests.py,sha256=9quRn44Xi1XIKKIXKCBRmtSpARJowjm7_Edw40Mutdw,332
51
51
  wbwriter/viewsets/__init__.py,sha256=FSoHcwxYukis44flBOwKaoa6fABkNI66lzaTXaYEZxk,722
52
- wbwriter/viewsets/article.py,sha256=hVMRnRpmafv2rpGRQi1d9wvaPP1499XvLnKivJMpTNk,9794
52
+ wbwriter/viewsets/article.py,sha256=w5hig6Z3DulGbVp3RtPax0GHEEDLqw0n4LpS0BzYq60,9960
53
53
  wbwriter/viewsets/article_type.py,sha256=wEeJXy3uPav0ZrV3sD1UHEpKdH37ZjwssKeNfaJJV4s,1503
54
54
  wbwriter/viewsets/buttons.py,sha256=6ClY6ddqiPheulgz2j_kw80YqjMgXBt1G4_sSiYE-Tg,2844
55
55
  wbwriter/viewsets/in_editor_template.py,sha256=6ocFTerOYKrAoVTXKI8yEaDInGVpgiyI0tl1E4otusY,1713
@@ -58,7 +58,7 @@ wbwriter/viewsets/meta_information.py,sha256=W4Vi4BYCGUEZ9ncRY-Unj5jq3AqCMl27gaf
58
58
  wbwriter/viewsets/meta_information_instance.py,sha256=G03z5wNSg-04GA3gF1fejP0EPJiBGIHFhJsMzInBab4,1695
59
59
  wbwriter/viewsets/publication.py,sha256=5z8Hbjt8iTBQ87H4WrJvDFVVWNWefrS0MIIzcgAiCyc,4033
60
60
  wbwriter/viewsets/display/__init__.py,sha256=Jd-MWVcTEko7Ap9pbfURogzIjy5gKeb18KcYJfZjOQs,403
61
- wbwriter/viewsets/display/article.py,sha256=s8vUqOXvyyd89iYI7CBSkX4iDDLg9XSGJj_MrBh3QM0,16702
61
+ wbwriter/viewsets/display/article.py,sha256=naTRIYiHoBYQglAEovTLM66jGZL21Rd-hVcM5DcS7M4,16287
62
62
  wbwriter/viewsets/display/article_type.py,sha256=FV8nvnhY7MLaZbmtV59V33b2goH8QCWl9MrFJJ-Acf8,900
63
63
  wbwriter/viewsets/display/in_editor_template.py,sha256=jGUb32byyK9KwBd6ZPcJ0m0e2WW-QBm7aP2TkLkQYl0,1490
64
64
  wbwriter/viewsets/display/meta_information.py,sha256=jGxMsZHwiY7fmfXz7nktRyQtPdTs3PydkKx0CrNf0qo,1384
@@ -71,6 +71,6 @@ wbwriter/viewsets/endpoints/meta_information.py,sha256=m7rVbfTNjsQNibmqtAG4DvXSJ
71
71
  wbwriter/viewsets/titles/__init__.py,sha256=INLTvGeBi5Xro7i3FlJ2fesh-TjKbxRBlfsAyeg3h7k,131
72
72
  wbwriter/viewsets/titles/publication_title_config.py,sha256=-39C_Enz8J1o-DWgRz89VFMV0r4MReKx-r-Tpf9MlVM,807
73
73
  wbwriter/viewsets/titles/reviewer_article_title_config.py,sha256=YzRjuUwbe6vBwWhYLrCe6woGCpQ9c7AwkujKqPh5mLw,183
74
- wbwriter-1.49.0.dist-info/METADATA,sha256=ru4S5sgGGl90UdP2EmJ67DsxHVG03x7FSKlFWCIMlcY,230
75
- wbwriter-1.49.0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
76
- wbwriter-1.49.0.dist-info/RECORD,,
74
+ wbwriter-1.49.2.dist-info/METADATA,sha256=rk-kaA1NBtTrARrCgAUJRCe1jirGtTh1Lw0nOWoGMY8,230
75
+ wbwriter-1.49.2.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
76
+ wbwriter-1.49.2.dist-info/RECORD,,