From b6f9df6831c45ebcf1825585d06a40d0d98419cd Mon Sep 17 00:00:00 2001 From: Christof Dorner Date: Tue, 6 Jun 2023 19:51:01 +0200 Subject: [PATCH] allow any length language and default to empty string --- activities/migrations/0017_post_language.py | 2 +- activities/models/post.py | 15 +++++++++------ api/schemas.py | 8 +++++++- core/models/config.py | 2 +- tests/activities/models/test_post.py | 4 ++-- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/activities/migrations/0017_post_language.py b/activities/migrations/0017_post_language.py index 64966fc04..4774d0d77 100644 --- a/activities/migrations/0017_post_language.py +++ b/activities/migrations/0017_post_language.py @@ -13,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name="post", name="language", - field=models.CharField(max_length=50, null=True), + field=models.CharField(default=""), ), ] diff --git a/activities/models/post.py b/activities/models/post.py index 827a6de22..6138ad652 100644 --- a/activities/models/post.py +++ b/activities/models/post.py @@ -254,7 +254,7 @@ class Types(models.TextChoices): content = models.TextField() # The language of the content - language = models.CharField(max_length=50, null=True) + language = models.CharField(default="") type = models.CharField( max_length=20, @@ -497,7 +497,7 @@ def create_local( sorted([tag[: Hashtag.MAXIMUM_LENGTH] for tag in parser.hashtags]) or None ) - if language is None: + if language is None or language == "": language = author.config_identity.preferred_posting_language # Make the Post object @@ -548,7 +548,7 @@ def edit_local( self.summary = summary or None self.sensitive = bool(summary) if sensitive is None else sensitive self.visibility = visibility - if language is None: + if language is None or language == "": language = self.author.config_identity.preferred_posting_language self.language = language self.edited = timezone.now() @@ -662,7 +662,7 @@ def to_ap(self) -> dict: "tag": [], "attachment": [], } - if self.language is not None: + if self.language != "": value["contentMap"] = { self.language: value["content"], } @@ -889,7 +889,7 @@ def by_ap(cls, data, create=False, update=False, fetch_author=False) -> "Post": post.published = parse_ld_date(data.get("published")) post.edited = parse_ld_date(data.get("updated")) post.in_reply_to = data.get("inReplyTo") - post.language = get_language(data) + post.language = get_language(data) or "" # Mentions and hashtags post.hashtags = [] for tag in get_list(data, "tag"): @@ -1124,13 +1124,16 @@ def to_mastodon_json(self, interactions=None, bookmarks=None, identity=None): self.Visibilities.mentioned: "direct", self.Visibilities.local_only: "public", } + language = self.language + if self.language == "": + language = None value = { "id": self.pk, "uri": self.object_uri, "created_at": format_ld_date(self.published), "account": self.author.to_mastodon_json(include_counts=False), "content": self.safe_content_remote(), - "language": self.language, + "language": language, "visibility": visibility_mapping[self.visibility], "sensitive": self.sensitive, "spoiler_text": self.summary or "", diff --git a/api/schemas.py b/api/schemas.py index 55e9ce863..f2996b728 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -422,13 +422,19 @@ def from_identity( activities_models.Post.Visibilities.mentioned: "direct", activities_models.Post.Visibilities.local_only: "public", } + preferred_posting_language = None + if identity.config_identity.preferred_posting_language != "": + preferred_posting_language = ( + identity.config_identity.preferred_posting_language + ) + return cls.parse_obj( { "posting:default:visibility": visibility_mapping[ identity.config_identity.default_post_visibility ], "posting:default:sensitive": False, - "posting:default:language": identity.config_identity.preferred_posting_language, + "posting:default:language": preferred_posting_language, "reading:expand:media": "default", "reading:expand:spoilers": identity.config_identity.expand_content_warnings, } diff --git a/core/models/config.py b/core/models/config.py index b3e322cb7..89f706102 100644 --- a/core/models/config.py +++ b/core/models/config.py @@ -286,7 +286,7 @@ class IdentityOptions(pydantic.BaseModel): visible_reaction_counts: bool = True expand_content_warnings: bool = False boosts_on_profile: bool = True - preferred_posting_language: str | None = None + preferred_posting_language: str = "" class DomainOptions(pydantic.BaseModel): site_name: str = "" diff --git a/tests/activities/models/test_post.py b/tests/activities/models/test_post.py index 4aa6d9bc5..4a13fee0f 100644 --- a/tests/activities/models/test_post.py +++ b/tests/activities/models/test_post.py @@ -259,7 +259,7 @@ def test_content_map(remote_identity): create=True, ) assert post.content == "Hi World" - assert post.language is None + assert post.language == "" post2 = Post.by_ap( data={ @@ -272,7 +272,7 @@ def test_content_map(remote_identity): create=True, ) assert post2.content == "Hey World" - assert post2.language is None + assert post2.language == "" post3 = Post.by_ap( data={