mirror of
https://github.com/jointakahe/takahe.git
synced 2024-11-25 00:30:59 +00:00
focalpoints are floats between -1..1, not int (#648)
This commit is contained in:
parent
039adae797
commit
24577761ed
3 changed files with 141 additions and 3 deletions
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 4.2.3 on 2023-10-30 07:44
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("activities", "0018_timelineevent_dismissed"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="postattachment",
|
||||||
|
name="focal_x",
|
||||||
|
field=models.FloatField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name="postattachment",
|
||||||
|
name="focal_y",
|
||||||
|
field=models.FloatField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
]
|
|
@ -57,8 +57,8 @@ class PostAttachment(StatorModel):
|
||||||
|
|
||||||
width = models.IntegerField(null=True, blank=True)
|
width = models.IntegerField(null=True, blank=True)
|
||||||
height = models.IntegerField(null=True, blank=True)
|
height = models.IntegerField(null=True, blank=True)
|
||||||
focal_x = models.IntegerField(null=True, blank=True)
|
focal_x = models.FloatField(null=True, blank=True)
|
||||||
focal_y = models.IntegerField(null=True, blank=True)
|
focal_y = models.FloatField(null=True, blank=True)
|
||||||
blurhash = models.TextField(null=True, blank=True)
|
blurhash = models.TextField(null=True, blank=True)
|
||||||
|
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
@ -113,7 +113,7 @@ class PostAttachment(StatorModel):
|
||||||
### ActivityPub ###
|
### ActivityPub ###
|
||||||
|
|
||||||
def to_ap(self):
|
def to_ap(self):
|
||||||
return {
|
ap = {
|
||||||
"url": self.file.url,
|
"url": self.file.url,
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
"type": "Document",
|
"type": "Document",
|
||||||
|
@ -122,6 +122,10 @@ class PostAttachment(StatorModel):
|
||||||
"mediaType": self.mimetype,
|
"mediaType": self.mimetype,
|
||||||
"blurhash": self.blurhash,
|
"blurhash": self.blurhash,
|
||||||
}
|
}
|
||||||
|
if self.is_image() and self.focal_x and self.focal_y:
|
||||||
|
ap["type"] = "Image"
|
||||||
|
ap["focalPoint"] = [self.focal_x, self.focal_y]
|
||||||
|
return ap
|
||||||
|
|
||||||
### Mastodon Client API ###
|
### Mastodon Client API ###
|
||||||
|
|
||||||
|
|
111
tests/activities/models/test_post_attachment.py
Normal file
111
tests/activities/models/test_post_attachment.py
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
import pytest
|
||||||
|
from django.core.files.base import ContentFile
|
||||||
|
|
||||||
|
from activities.models import Post, PostAttachment, PostAttachmentStates
|
||||||
|
from core.files import resize_image
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_remote_attachment(remote_identity, config_system):
|
||||||
|
"""
|
||||||
|
Tests that remote post attachments and their metadata work
|
||||||
|
"""
|
||||||
|
|
||||||
|
post = Post.by_ap(
|
||||||
|
data={
|
||||||
|
"id": "https://remote.test/posts/1",
|
||||||
|
"type": "Note",
|
||||||
|
"content": "Hi World",
|
||||||
|
"attributedTo": remote_identity.actor_uri,
|
||||||
|
"published": "2022-12-23T10:50:54Z",
|
||||||
|
"attachment": {
|
||||||
|
"type": "Image",
|
||||||
|
"url": "https://remote.test/posts/1/attachment/1",
|
||||||
|
"focalPoint": [-0.5, 0.25],
|
||||||
|
"mediaType": "image/png",
|
||||||
|
"name": "Test attachment",
|
||||||
|
"width": 100,
|
||||||
|
"height": 100,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
create=True,
|
||||||
|
)
|
||||||
|
attachment = post.attachments.first()
|
||||||
|
assert attachment.remote_url == "https://remote.test/posts/1/attachment/1"
|
||||||
|
assert attachment.name == "Test attachment"
|
||||||
|
assert attachment.focal_x == -0.5
|
||||||
|
assert attachment.focal_y == 0.25
|
||||||
|
|
||||||
|
mastodon = post.to_mastodon_json()
|
||||||
|
|
||||||
|
assert mastodon["media_attachments"][0]["description"] == "Test attachment"
|
||||||
|
assert mastodon["media_attachments"][0]["meta"]["focus"]["x"] == -0.5
|
||||||
|
assert mastodon["media_attachments"][0]["meta"]["focus"]["y"] == 0.25
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.django_db
|
||||||
|
def test_local_attachment(identity, config_system):
|
||||||
|
"""
|
||||||
|
Tests that local post attachments and their metadata work
|
||||||
|
"""
|
||||||
|
attachments = []
|
||||||
|
attachment = PostAttachment.objects.create(
|
||||||
|
mimetype="image/png",
|
||||||
|
name="Test attachment",
|
||||||
|
author=identity,
|
||||||
|
width=100,
|
||||||
|
height=100,
|
||||||
|
focal_x=-0.5,
|
||||||
|
focal_y=0.25,
|
||||||
|
state=PostAttachmentStates.fetched,
|
||||||
|
)
|
||||||
|
# 1x1 PNG
|
||||||
|
file = resize_image(
|
||||||
|
# 1x1 PNG
|
||||||
|
ContentFile(
|
||||||
|
b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x00\x00%\xdbV\xca\x00\x00\x00\x03PLTE\x00\x00\x00\xa7z=\xda\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x00\nIDAT\x08\xd7c`\x00\x00\x00\x02\x00\x01\xe2!\xbc3\x00\x00\x00\x00IEND\xaeB`\x82"
|
||||||
|
),
|
||||||
|
size=(100, 100),
|
||||||
|
cover=False,
|
||||||
|
)
|
||||||
|
attachment.file.save(file.name, file)
|
||||||
|
attachments.append(attachment)
|
||||||
|
# another copy of the attachment without a focal point
|
||||||
|
attachment2 = PostAttachment.objects.create(
|
||||||
|
mimetype="image/png",
|
||||||
|
name="Test attachment 2",
|
||||||
|
author=identity,
|
||||||
|
width=100,
|
||||||
|
height=100,
|
||||||
|
state=PostAttachmentStates.fetched,
|
||||||
|
)
|
||||||
|
attachment2.file.save(file.name, file)
|
||||||
|
attachments.append(attachment2)
|
||||||
|
# Create the post
|
||||||
|
post = Post.create_local(
|
||||||
|
author=identity,
|
||||||
|
content="Hi World",
|
||||||
|
attachments=attachments,
|
||||||
|
)
|
||||||
|
|
||||||
|
attachments = post.attachments.all()
|
||||||
|
# first attachment has a focal point
|
||||||
|
assert attachments[0].name == "Test attachment"
|
||||||
|
assert attachments[0].focal_x == -0.5
|
||||||
|
assert attachments[0].focal_y == 0.25
|
||||||
|
# second attachment doesn't have a focal point
|
||||||
|
assert attachments[1].name == "Test attachment 2"
|
||||||
|
assert attachments[1].focal_x is None
|
||||||
|
assert attachments[1].focal_y is None
|
||||||
|
|
||||||
|
# same in the AP JSON
|
||||||
|
ap = post.to_ap()
|
||||||
|
|
||||||
|
# first attachment has a focal point
|
||||||
|
assert ap["attachment"][0]["name"] == "Test attachment"
|
||||||
|
assert ap["attachment"][0]["focalPoint"][0] == -0.5
|
||||||
|
assert ap["attachment"][0]["focalPoint"][1] == 0.25
|
||||||
|
|
||||||
|
# second attachment doesn't have a focal point
|
||||||
|
assert ap["attachment"][1]["name"] == "Test attachment 2"
|
||||||
|
assert "focalPoint" not in ap["attachment"][1]
|
Loading…
Reference in a new issue