OpenSlides/openslides/agenda/mixins.py
FinnStutzenstein 9f12763f8b Split AgendaItem and ListOfSpeakers
Server:
- ListOfSpeakers (LOS) is now a speprate model, containing of an id,
speakers, closed and a content_object.
- Moved all speaker related views from ItemViewSet to the new
ListOfSpeakersViewSet.
- Make Mixins for content objects of items and lists of speakers.
- Migrations: Move the lists of speakers from items to the LOS model.

Client:
- Removed the speaker repo and moved functionality to the new
ListOfSpeakersRepositoryService.
- Splitted base classes for agenda item content objects to items and
LOS.
- CurrentAgendaItemService -> CurrentListOfSpeakersSerivce
- Cleaned up the list of speakers component.
2019-05-24 08:21:59 +02:00

114 lines
3.1 KiB
Python

from typing import Any, Dict
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from .models import Item, ListOfSpeakers
# See https://github.com/python/mypy/issues/3855
Unsafe: Any = object
class AgendaItemMixin(models.Model):
"""
A mixin for every model that should have an agenda item associated.
"""
# In theory there could be one then more agenda_item. But we support only one.
agenda_items = GenericRelation(Item)
class Meta(Unsafe):
abstract = True
"""
Container for runtime information for agenda app (on create or update of this instance).
"""
agenda_item_update_information: Dict[str, Any] = {}
agenda_item_skip_autoupdate = False
@property
def agenda_item(self):
"""
Returns the related agenda item.
"""
# We support only one agenda item so just return the first element of
# the queryset.
return self.agenda_items.all()[0]
@property
def agenda_item_id(self):
"""
Returns the id of the agenda item object related to this object.
"""
return self.agenda_item.pk
def get_agenda_title_information(self):
raise NotImplementedError(
"An agenda content object has to provide title information"
)
class ListOfSpeakersMixin(models.Model):
"""
A mixin for every model that should have a list of speakers associated.
"""
# In theory there could be one then more list of speakers. But we support only one.
lists_of_speakers = GenericRelation(ListOfSpeakers)
class Meta(Unsafe):
abstract = True
list_of_speakers_skip_autoupdate = False
@property
def list_of_speakers(self):
"""
Returns the related list of speakers object.
"""
# We support only one list of speakers so just return the first element of
# the queryset.
return self.lists_of_speakers.all()[0]
@property
def list_of_speakers_id(self):
"""
Returns the id of the list of speakers object related to this object.
"""
return self.list_of_speakers.pk
def get_list_of_speakers_title_information(self):
raise NotImplementedError(
"An agenda content object has to provide title information"
)
class AgendaItemWithListOfSpeakersMixin(AgendaItemMixin, ListOfSpeakersMixin):
"""
A combined mixin for agenda items and list of speakers.
"""
class Meta(Unsafe):
abstract = True
def set_skip_autoupdate_agenda_item_and_list_of_speakers(
self, skip_autoupdate=True
):
self.agenda_item_skip_autoupdate = skip_autoupdate
self.list_of_speakers_skip_autoupdate = skip_autoupdate
def get_title_information(self):
raise NotImplementedError(
"An agenda content object has to provide title information"
)
def get_agenda_title_information(self):
# TODO: See issue #4738
return self.get_title_information()
def get_list_of_speakers_title_information(self):
# TODO: See issue #4738
return self.get_title_information()