From 6291fa0f5c4d30139c23c2e2f2a1daa49852c105 Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Sun, 4 Dec 2022 20:22:24 -0700 Subject: [PATCH] Fix mentions in replies/capitalisation --- activities/models/post.py | 3 ++- activities/views/compose.py | 7 ++++++- docs/installation.rst | 22 ++++++++++++---------- tests/activities/models/test_post.py | 11 +++++++++++ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/activities/models/post.py b/activities/models/post.py index d3365e7..aa4be16 100644 --- a/activities/models/post.py +++ b/activities/models/post.py @@ -276,7 +276,7 @@ class Post(StatorModel): def replacer(match): precursor = match.group(1) - handle = match.group(2) + handle = match.group(2).lower() if handle in possible_matches: return f'{precursor}@{handle}' else: @@ -383,6 +383,7 @@ class Post(StatorModel): mention_hits = cls.mention_regex.findall(content) mentions = set() for precursor, handle in mention_hits: + handle = handle.lower() if "@" in handle: username, domain = handle.split("@", 1) else: diff --git a/activities/views/compose.py b/activities/views/compose.py index 313fe74..b4ddcf5 100644 --- a/activities/views/compose.py +++ b/activities/views/compose.py @@ -84,7 +84,12 @@ class Compose(FormView): initial["visibility"] = Post.Visibilities.unlisted else: initial["visibility"] = self.reply_to.visibility - initial["text"] = f"@{self.reply_to.author.handle} " + # Build a set of mentions for the content to start as + mentioned = {self.reply_to.author} + mentioned.update(self.reply_to.mentions.all()) + initial["text"] = "".join( + f"@{identity.handle} " for identity in mentioned + ) return initial def form_valid(self, form): diff --git a/docs/installation.rst b/docs/installation.rst index 7b5cd11..b268377 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -1,11 +1,14 @@ Installation ============ -We recommend running using the Docker/OCI image; this contains all of the -necessary dependencies and static file handling preconfigured for you. +We've tried to make installing and running Takahē as easy as possible, but +an ActivityPub server does have a minimum level of complexity, so you should +be experienced deploying software in order to run it. -All configuration is done via either environment variables, or online through -the web interface. +Note that getting the technology running is arguably the easiest piece of +running a server - you must also be prepared to support your users, moderate, +defederate, keep on top of security risks, and know how you will +handle illegal content. Prerequisites @@ -22,17 +25,16 @@ Prerequisites * Writable local directory (must be accessible by all running copies!) Note that ActivityPub is a chatty protocol that has a lot of background -activity, so you will need to run *background tasks*, in -order to fetch profiles, retry delivery of posts, and more. - -Ideally, you would choose a platform where you can run our worker process in -the background continuously, but for small installations we have a URL you can -call periodically instead - see "What To Run", below. +activity, so you will need to run *background tasks*, in order to fetch +profiles, retry delivery of posts, and more - see "Preparation", below. The flagship Takahē instance, `takahe.social `_, runs inside of Kubernetes, with one Deployment for the webserver and one for the Stator runner. +All configuration is done via either environment variables, or online through +the web interface. + Preparation ----------- diff --git a/tests/activities/models/test_post.py b/tests/activities/models/test_post.py index baeb55a..d215be0 100644 --- a/tests/activities/models/test_post.py +++ b/tests/activities/models/test_post.py @@ -68,6 +68,17 @@ def test_linkify_mentions_remote(identity, remote_identity): local=True, ) assert post.safe_content_remote() == "

@test@example.com, welcome!

" + # Test case insensitivity (remote) + post = Post.objects.create( + content="

Hey @TeSt

", + author=identity, + local=True, + ) + post.mentions.add(remote_identity) + assert ( + post.safe_content_remote() + == '

Hey @test

' + ) @pytest.mark.django_db