[scrobbles] Add note taking to webpages
This commit is contained in:
@ -1,3 +1,5 @@
|
||||
import re
|
||||
|
||||
from rest_framework import serializers
|
||||
from scrobbles.models import (
|
||||
AudioScrobblerTSVImport,
|
||||
@ -7,10 +9,52 @@ from scrobbles.models import (
|
||||
)
|
||||
|
||||
|
||||
NOTE_POSITION_RE = re.compile(r"\[start:(\d+)\|end:(\d+)\]$")
|
||||
|
||||
|
||||
class ScrobbleSerializer(serializers.HyperlinkedModelSerializer):
|
||||
note = serializers.CharField(required=False, allow_blank=True)
|
||||
note_position = serializers.DictField(required=False)
|
||||
|
||||
class Meta:
|
||||
model = Scrobble
|
||||
fields = "__all__"
|
||||
extra_kwargs = {
|
||||
"url": {"view_name": "scrobble-detail", "lookup_field": "uuid"},
|
||||
}
|
||||
|
||||
def update(self, instance, validated_data):
|
||||
note = validated_data.pop("note", None)
|
||||
note_position = validated_data.pop("note_position", None)
|
||||
|
||||
instance = super().update(instance, validated_data)
|
||||
|
||||
if note is not None:
|
||||
log = instance.log or {}
|
||||
notes = log.get("notes", [])
|
||||
if isinstance(notes, str):
|
||||
notes = [notes]
|
||||
elif notes is None:
|
||||
notes = []
|
||||
|
||||
if note_position:
|
||||
note = f"{note} [start:{note_position['start']}|end:{note_position['end']}]"
|
||||
|
||||
notes.append(note)
|
||||
log["notes"] = notes
|
||||
instance.log = log
|
||||
instance.save(update_fields=["log"])
|
||||
|
||||
return instance
|
||||
|
||||
|
||||
def parse_note_position(note):
|
||||
match = NOTE_POSITION_RE.search(note)
|
||||
if match:
|
||||
start, end = match.groups()
|
||||
text = NOTE_POSITION_RE.sub("", note)
|
||||
return text, {"start": int(start), "end": int(end)}
|
||||
return note, None
|
||||
|
||||
|
||||
class KoReaderImportSerializer(serializers.HyperlinkedModelSerializer):
|
||||
@ -19,9 +63,7 @@ class KoReaderImportSerializer(serializers.HyperlinkedModelSerializer):
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class AudioScrobblerTSVImportSerializer(
|
||||
serializers.HyperlinkedModelSerializer
|
||||
):
|
||||
class AudioScrobblerTSVImportSerializer(serializers.HyperlinkedModelSerializer):
|
||||
class Meta:
|
||||
model = AudioScrobblerTSVImport
|
||||
fields = "__all__"
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
from logging import getLogger
|
||||
|
||||
from rest_framework import permissions, viewsets
|
||||
from scrobbles.api.serializers import (
|
||||
AudioScrobblerTSVImportSerializer,
|
||||
@ -12,11 +14,14 @@ from scrobbles.models import (
|
||||
LastFmImport,
|
||||
)
|
||||
|
||||
logger = getLogger(__name__)
|
||||
|
||||
|
||||
class ScrobbleViewSet(viewsets.ModelViewSet):
|
||||
queryset = Scrobble.objects.all().order_by("-timestamp")
|
||||
serializer_class = ScrobbleSerializer
|
||||
permission_classes = [permissions.IsAuthenticated]
|
||||
lookup_field = "uuid"
|
||||
|
||||
def get_queryset(self):
|
||||
return super().get_queryset().filter(user=self.request.user)
|
||||
|
||||
Reference in New Issue
Block a user