Activity stream representations for user and favorites

This commit is contained in:
Eliot Berriot 2018-02-25 14:44:00 +01:00
parent 93e4a4f123
commit 691665e3cf
No known key found for this signature in database
GPG Key ID: DD6965E2476E5C27
12 changed files with 159 additions and 0 deletions

View File

View File

@ -0,0 +1,9 @@
from rest_framework import serializers
class ModelSerializer(serializers.ModelSerializer):
id = serializers.CharField(source='get_activity_url')
# url = serializers.SerializerMethodField()
def get_url(self, obj):
return self.get_id(obj)

View File

@ -1,8 +1,10 @@
from django.conf import settings
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from funkwhale_api.music.models import Track from funkwhale_api.music.models import Track
class TrackFavorite(models.Model): class TrackFavorite(models.Model):
creation_date = models.DateTimeField(default=timezone.now) creation_date = models.DateTimeField(default=timezone.now)
user = models.ForeignKey( user = models.ForeignKey(
@ -18,3 +20,7 @@ class TrackFavorite(models.Model):
def add(cls, track, user): def add(cls, track, user):
favorite, created = cls.objects.get_or_create(user=user, track=track) favorite, created = cls.objects.get_or_create(user=user, track=track)
return favorite return favorite
def get_activity_url(self):
return '{}/favorites/tracks/{}'.format(
self.user.get_activity_url(), self.pk)

View File

@ -1,10 +1,43 @@
from django.conf import settings
from rest_framework import serializers from rest_framework import serializers
from funkwhale_api.activity import serializers as activity_serializers
from funkwhale_api.music.serializers import TrackSerializerNested from funkwhale_api.music.serializers import TrackSerializerNested
from funkwhale_api.users.serializers import UserActivitySerializer
from . import models from . import models
class TrackFavoriteActivitySerializer(activity_serializers.ModelSerializer):
type = serializers.SerializerMethodField()
object = serializers.CharField(source='track.get_activity_url')
actor = UserActivitySerializer(source='user')
published = serializers.DateTimeField(source='creation_date')
class Meta:
model = models.TrackFavorite
fields = [
'id',
'object',
'type',
'actor',
'published'
]
def get_actor(self, obj):
return UserActivitySerializer(obj.user).data
def get_type(self, obj):
return 'Like'
def get_object(self, obj):
return obj.track.get_activity_url()
class UserTrackFavoriteSerializer(serializers.ModelSerializer): class UserTrackFavoriteSerializer(serializers.ModelSerializer):
# track = TrackSerializerNested(read_only=True) # track = TrackSerializerNested(read_only=True)
class Meta: class Meta:

View File

@ -0,0 +1,17 @@
from funkwhale_api.common.consumers import JsonAuthConsumer
class MyConsumer(JsonAuthConsumer):
groups = ["broadcast"]
def receive_json(self, payload):
print(payload, self.scope["user"])
# Called with either text_data or bytes_data for each frame
# You can call:
self.send_json({'test': 'me'})
# Or, to send a binary frame:
# self.send(bytes_data="{Hello} world!")
# Want to force-close the connection? Call:
# self.close()
# # Or add a custom WebSocket error code!
# self.close(code=4123)

View File

@ -360,6 +360,12 @@ class Track(APIModelMixin):
self.title, self.title,
) )
def get_activity_url(self):
if self.mbid:
return 'https://musicbrainz.org/recording/{}'.format(
self.mbid)
return settings.FUNKWHALE_URL + '/tracks/{}'.format(self.pk)
class TrackFile(models.Model): class TrackFile(models.Model):
track = models.ForeignKey( track = models.ForeignKey(

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals, absolute_import
import uuid import uuid
from django.conf import settings
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.urls import reverse from django.urls import reverse
from django.db import models from django.db import models
@ -43,3 +44,6 @@ class User(AbstractUser):
def set_password(self, raw_password): def set_password(self, raw_password):
super().set_password(raw_password) super().set_password(raw_password)
self.update_secret_key() self.update_secret_key()
def get_activity_url(self):
return settings.FUNKWHALE_URL + '/@{}'.format(self.username)

View File

@ -1,8 +1,26 @@
from rest_framework import serializers from rest_framework import serializers
from funkwhale_api.activity import serializers as activity_serializers
from . import models from . import models
class UserActivitySerializer(activity_serializers.ModelSerializer):
type = serializers.SerializerMethodField()
name = serializers.CharField(source='username')
class Meta:
model = models.User
fields = [
'id',
'name',
'type'
]
def get_type(self, obj):
return 'Person'
class UserBasicSerializer(serializers.ModelSerializer): class UserBasicSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.User model = models.User

View File

@ -0,0 +1,28 @@
from funkwhale_api.users.serializers import UserActivitySerializer
from funkwhale_api.favorites import serializers
def test_get_favorite_activity_url(settings, factories):
favorite = factories['favorites.TrackFavorite']()
user_url = favorite.user.get_activity_url()
expected = '{}/favorites/tracks/{}'.format(
user_url, favorite.pk)
assert favorite.get_activity_url() == expected
def test_activity_favorite_serializer(factories):
favorite = factories['favorites.TrackFavorite']()
actor = UserActivitySerializer(favorite.user).data
field = serializers.serializers.DateTimeField()
expected = {
"type": "Like",
"id": favorite.get_activity_url(),
"actor": actor,
"object": favorite.track.get_activity_url(),
"published": field.to_representation(favorite.creation_date),
}
data = serializers.TrackFavoriteActivitySerializer(favorite).data
assert data == expected

View File

@ -0,0 +1,17 @@
from funkwhale_api.users.serializers import UserActivitySerializer
from funkwhale_api.favorites import serializers
def test_get_track_activity_url_mbid(factories):
track = factories['music.Track']()
expected = 'https://musicbrainz.org/recording/{}'.format(
track.mbid)
assert track.get_activity_url() == expected
def test_get_track_activity_url_no_mbid(settings, factories):
track = factories['music.Track'](mbid=None)
expected = settings.FUNKWHALE_URL + '/tracks/{}'.format(
track.pk)
assert track.get_activity_url() == expected

View File

@ -0,0 +1,21 @@
from funkwhale_api.users import serializers
def test_get_user_activity_url(settings, factories):
user = factories['users.User']()
assert user.get_activity_url() == '{}/@{}'.format(
settings.FUNKWHALE_URL, user.username)
def test_activity_user_serializer(factories):
user = factories['users.User']()
expected = {
"type": "Person",
"id": user.get_activity_url(),
"name": user.username,
}
data = serializers.UserActivitySerializer(user).data
assert data == expected