94 lines
2.7 KiB
Python
94 lines
2.7 KiB
Python
from typing import Any, Dict
|
|
|
|
from django.contrib.contenttypes.fields import GenericRelation
|
|
from django.db import models
|
|
|
|
from ..agenda.models import Item
|
|
from ..core.models import Projector
|
|
from ..mediafiles.models import Mediafile
|
|
from ..utils.models import RESTModelMixin
|
|
from .access_permissions import TopicAccessPermissions
|
|
|
|
|
|
class TopicManager(models.Manager):
|
|
"""
|
|
Customized model manager to support our get_full_queryset method.
|
|
"""
|
|
|
|
def get_full_queryset(self):
|
|
"""
|
|
Returns the normal queryset with all topics. In the background all
|
|
attachments and the related agenda item are prefetched from the
|
|
database.
|
|
"""
|
|
return self.get_queryset().prefetch_related("attachments", "agenda_items")
|
|
|
|
|
|
class Topic(RESTModelMixin, models.Model):
|
|
"""
|
|
Model for slides with custom content. Used to be called custom slide.
|
|
"""
|
|
|
|
access_permissions = TopicAccessPermissions()
|
|
|
|
objects = TopicManager()
|
|
|
|
title = models.CharField(max_length=256)
|
|
text = models.TextField(blank=True)
|
|
attachments = models.ManyToManyField(Mediafile, blank=True)
|
|
|
|
# In theory there could be one then more agenda_item. But we support only
|
|
# one. See the property agenda_item.
|
|
agenda_items = GenericRelation(Item, related_name="topics")
|
|
|
|
class Meta:
|
|
default_permissions = ()
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
def delete(self, skip_autoupdate=False, *args, **kwargs):
|
|
"""
|
|
Customized method to delete a topic. Ensures that a respective
|
|
topic projector element is disabled.
|
|
"""
|
|
Projector.remove_any(
|
|
skip_autoupdate=skip_autoupdate, name="topics/topic", id=self.pk
|
|
)
|
|
return super().delete( # type: ignore
|
|
skip_autoupdate=skip_autoupdate, *args, **kwargs
|
|
)
|
|
|
|
"""
|
|
Container for runtime information for agenda app (on create or update of this instance).
|
|
"""
|
|
agenda_item_update_information: Dict[str, Any] = {}
|
|
|
|
@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(self):
|
|
"""
|
|
Returns the title for the agenda.
|
|
"""
|
|
return self.title
|
|
|
|
def get_agenda_title_with_type(self):
|
|
"""
|
|
Returns the agenda title. Topicy should not get a type postfix.
|
|
"""
|
|
return self.get_agenda_title()
|