add support for enabling Mastodon 4.2 search indexing

This commit is contained in:
Osma Ahvenlampi 2023-11-16 16:07:28 +02:00
parent 2f546dfa74
commit 05ec6cbe74
10 changed files with 48 additions and 0 deletions

View File

@ -71,6 +71,7 @@ class Account(Schema):
bot: bool
group: bool
discoverable: bool
indexable: bool
moved: Union[None, bool, "Account"]
suspended: bool = False
limited: bool = False

View File

@ -557,6 +557,7 @@ schemas = {
"@context": {
"toot": "http://joinmastodon.org/ns#",
"discoverable": "toot:discoverable",
"indexable": "toot:indexable",
"devices": "toot:devices",
"featured": "toot:featured",
"featuredTags": "toot:featuredTags",

View File

@ -31,6 +31,7 @@
{% include "forms/_field.html" with field=form.domain %}
{% include "forms/_field.html" with field=form.name %}
{% include "forms/_field.html" with field=form.discoverable %}
{% include "forms/_field.html" with field=form.indexable %}
</fieldset>
<div class="buttons">
<button>Create</button>

View File

@ -24,6 +24,7 @@
<fieldset>
<legend>Privacy</legend>
{% include "forms/_field.html" with field=form.discoverable %}
{% include "forms/_field.html" with field=form.indexable %}
{% include "forms/_field.html" with field=form.visible_follows %}
{% include "forms/_field.html" with field=form.search_enabled %}
</fieldset>

View File

@ -204,6 +204,8 @@ def test_fetch_actor(httpx_mock, config_system):
assert identity.image_uri == "https://example.com/image.jpg"
assert identity.summary == "<p>A test user</p>"
assert "ts-a-faaaake" in identity.public_key
# convention is that indexability should be opt-in
assert not identity.indexable
@pytest.mark.django_db

View File

@ -0,0 +1,18 @@
# Generated by Django 4.2.3 on 2023-11-16 13:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("users", "0022_follow_request"),
]
operations = [
migrations.AddField(
model_name="identity",
name="indexable",
field=models.BooleanField(default=False),
),
]

View File

@ -195,6 +195,7 @@ class Identity(StatorModel):
summary = models.TextField(blank=True, null=True)
manually_approves_followers = models.BooleanField(blank=True, null=True)
discoverable = models.BooleanField(default=True)
indexable = models.BooleanField(default=False)
profile_uri = models.CharField(max_length=500, blank=True, null=True)
inbox_uri = models.CharField(max_length=500, blank=True, null=True)
@ -557,6 +558,7 @@ class Identity(StatorModel):
"published": self.created.strftime("%Y-%m-%dT%H:%M:%SZ"),
"url": self.absolute_profile_uri(),
"toot:discoverable": self.discoverable,
"toot:indexable": self.indexable,
}
if self.name:
response["name"] = self.name
@ -914,6 +916,7 @@ class Identity(StatorModel):
self.icon_uri = get_first_image_url(document.get("icon", None))
self.image_uri = get_first_image_url(document.get("image", None))
self.discoverable = document.get("toot:discoverable", True)
self.indexable = document.get("toot:indexable", False)
# Profile links/metadata
self.metadata = []
for attachment in get_list(document, "attachment"):
@ -1051,6 +1054,7 @@ class Identity(StatorModel):
"bot": self.actor_type.lower() in ["service", "application"],
"group": self.actor_type.lower() == "group",
"discoverable": self.discoverable,
"indexable": self.indexable,
"suspended": False,
"limited": False,
"created_at": format_ld_date(

View File

@ -36,6 +36,7 @@ class IdentityService:
domain: Domain,
name: str,
discoverable: bool = True,
indexable: bool = False,
) -> Identity:
identity = Identity.objects.create(
actor_uri=f"https://{domain.uri_domain}/@{username}@{domain.domain}/",
@ -44,6 +45,7 @@ class IdentityService:
name=name,
local=True,
discoverable=discoverable,
indexable=indexable,
)
identity.users.add(user)
identity.generate_keypair()

View File

@ -313,6 +313,14 @@ class CreateIdentity(FormView):
),
required=False,
)
indexable = forms.BooleanField(
help_text="Should this user's activities be indexable on other servers.",
initial=False,
widget=forms.Select(
choices=[(True, "Indexable"), (False, "Not Indexable")]
),
required=False,
)
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
@ -385,6 +393,7 @@ class CreateIdentity(FormView):
domain=domain_instance,
name=form.cleaned_data["name"],
discoverable=form.cleaned_data["discoverable"],
indexable=form.cleaned_data["indexable"],
)
self.request.session["identity_id"] = identity.id
return redirect(identity.urls.view)

View File

@ -43,6 +43,13 @@ class ProfilePage(FormView):
),
required=False,
)
indexable = forms.BooleanField(
help_text="Opt-in to be indexed for search on other servers.\n(Disabling this does not guarantee third-party servers won't index your posts without permission)",
widget=forms.Select(
choices=[(True, "Indexable"), (False, "Not Indexable")]
),
required=False,
)
visible_follows = forms.BooleanField(
help_text="Whether or not to show your following and follower counts in your profile",
widget=forms.Select(choices=[(True, "Visible"), (False, "Hidden")]),
@ -93,6 +100,7 @@ class ProfilePage(FormView):
"icon": self.identity.icon and self.identity.icon.url,
"image": self.identity.image and self.identity.image.url,
"discoverable": self.identity.discoverable,
"indexable": self.identity.indexable,
"visible_follows": self.identity.config_identity.visible_follows,
"metadata": self.identity.metadata or [],
"search_enabled": self.identity.config_identity.search_enabled,
@ -104,6 +112,7 @@ class ProfilePage(FormView):
service = IdentityService(self.identity)
self.identity.name = form.cleaned_data["name"]
self.identity.discoverable = form.cleaned_data["discoverable"]
self.identity.indexable = form.cleaned_data["indexable"]
service.set_summary(form.cleaned_data["summary"])
# Resize images
icon = form.cleaned_data.get("icon")