Skip to content
Snippets Groups Projects
Commit 5d7b2a6a authored by Andreas Hubel's avatar Andreas Hubel
Browse files

chore(api): expose slug + links on room

parent ab6ca6bd
Branches
Tags
1 merge request!1116Rooms API improvments & Schedule Importer foo
...@@ -11,6 +11,7 @@ from core.models.assemblies import Assembly ...@@ -11,6 +11,7 @@ from core.models.assemblies import Assembly
from core.models.badges import Badge, BadgeToken, BadgeTokenTimeConstraint from core.models.badges import Badge, BadgeToken, BadgeTokenTimeConstraint
from core.models.conference import Conference, ConferenceMember, ConferenceTrack from core.models.conference import Conference, ConferenceMember, ConferenceTrack
from core.models.events import Event from core.models.events import Event
from core.models.links import Link
from core.models.messages import DirectMessage from core.models.messages import DirectMessage
from core.models.metanavi import MetaNavItem from core.models.metanavi import MetaNavItem
from core.models.rooms import Room from core.models.rooms import Room
...@@ -50,6 +51,20 @@ class ParameterisedHyperlinkedIdentityField(HyperlinkedIdentityField): ...@@ -50,6 +51,20 @@ class ParameterisedHyperlinkedIdentityField(HyperlinkedIdentityField):
return reverse(view_name, kwargs=kwargs, request=request, format=format) return reverse(view_name, kwargs=kwargs, request=request, format=format)
class LinkRelatedField(serializers.RelatedField):
"""
A read only field that represents its targets using their
plain string representation.
"""
def __init__(self, **kwargs):
kwargs['read_only'] = True
super().__init__(**kwargs)
def to_representation(self, value: Link):
return value.to_dict()
class ValidatingModelSerializer(serializers.ModelSerializer): class ValidatingModelSerializer(serializers.ModelSerializer):
def validate(self, data): def validate(self, data):
instance = self.Meta.model(**{field: value for field, value in data.items() if field in self.Meta.model._meta.fields}) instance = self.Meta.model(**{field: value for field, value in data.items() if field in self.Meta.model._meta.fields})
...@@ -217,7 +232,7 @@ class BadgeTokenUpdateSerializer(BadgeTokenSerializer): ...@@ -217,7 +232,7 @@ class BadgeTokenUpdateSerializer(BadgeTokenSerializer):
class RoomSerializer(HubModelSerializer): class RoomSerializer(HubModelSerializer):
assembly = serializers.SlugRelatedField(read_only=True, slug_field='slug') assembly = serializers.SlugRelatedField(read_only=True, slug_field='slug')
links = serializers.StringRelatedField( links = LinkRelatedField(
many=True, many=True,
read_only=True, read_only=True,
) )
...@@ -228,6 +243,7 @@ class RoomSerializer(HubModelSerializer): ...@@ -228,6 +243,7 @@ class RoomSerializer(HubModelSerializer):
fields = [ fields = [
'id', 'id',
'name', 'name',
'slug',
'blocked', 'blocked',
'room_type', 'room_type',
'capacity', 'capacity',
......
...@@ -62,6 +62,14 @@ class Link(models.Model): ...@@ -62,6 +62,14 @@ class Link(models.Model):
except ValidationError: except ValidationError:
raise ValidationError({'link': _('Link__link__must_be_url')}) raise ValidationError({'link': _('Link__link__must_be_url')})
def to_dict(self):
return {
'type': self.link_type,
'name': self.name,
'uri': self.link,
'url': self.link,
}
def __str__(self) -> str: def __str__(self) -> str:
return self.name return self.name
......
...@@ -501,5 +501,13 @@ class RoomLink(models.Model): ...@@ -501,5 +501,13 @@ class RoomLink(models.Model):
if not resolve_internal_url(self.link, fallback_as_is=False): if not resolve_internal_url(self.link, fallback_as_is=False):
raise ValidationError({'link': _('RoomLink__link__must_be_url')}) raise ValidationError({'link': _('RoomLink__link__must_be_url')})
def to_dict(self):
return {
'type': self.link_type,
'name': self.name,
'uri': self.link,
'url': self.link, # TODO rendered URL without local hub specific prefixes
}
def __str__(self): def __str__(self):
return self.name return self.name
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment