OpenSlides/openslides/mediafiles/models.py

113 lines
3.5 KiB
Python
Raw Normal View History

from django.conf import settings
from django.db import models
from django.utils.translation import ugettext as _
2017-09-26 09:00:34 +02:00
from ..core.config import config
from ..core.models import Projector
from ..utils.autoupdate import inform_changed_data
from ..utils.models import RESTModelMixin
from .access_permissions import MediafileAccessPermissions
2015-06-29 13:31:07 +02:00
class Mediafile(RESTModelMixin, models.Model):
2013-03-19 00:51:52 +01:00
"""
Class for uploaded files which can be delivered under a certain url.
"""
2019-01-06 16:22:33 +01:00
access_permissions = MediafileAccessPermissions()
2019-01-06 16:22:33 +01:00
can_see_permission = "mediafiles.can_see"
2019-01-06 16:22:33 +01:00
mediafile = models.FileField(upload_to="file")
2013-03-19 00:51:52 +01:00
"""
See https://docs.djangoproject.com/en/dev/ref/models/fields/#filefield
for more information.
"""
2013-03-19 00:51:52 +01:00
2016-01-10 00:20:32 +01:00
title = models.CharField(max_length=255, unique=True)
"""A string representing the title of the file."""
uploader = models.ForeignKey(
2019-01-06 16:22:33 +01:00
settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True
)
"""A user the uploader of a file."""
hidden = models.BooleanField(default=False)
"""Whether or not this mediafile should be marked as hidden"""
timestamp = models.DateTimeField(auto_now_add=True)
"""A DateTimeField to save the upload date and time."""
class Meta:
2013-03-19 00:51:52 +01:00
"""
Meta class for the mediafile model.
"""
2019-01-06 16:22:33 +01:00
ordering = ["title"]
2015-12-10 00:20:59 +01:00
default_permissions = ()
permissions = (
2019-01-06 16:22:33 +01:00
("can_see", "Can see the list of files"),
("can_see_hidden", "Can see hidden files"),
("can_upload", "Can upload files"),
("can_manage", "Can manage files"),
)
def __str__(self):
2013-03-19 00:51:52 +01:00
"""
Method for representation.
"""
return self.title
def save(self, *args, **kwargs):
"""
Saves mediafile (mainly on create and update requests).
"""
result = super().save(*args, **kwargs)
# Send uploader via autoupdate because users without permission
# to see users may not have it but can get it now.
inform_changed_data(self.uploader)
return result
def delete(self, skip_autoupdate=False, *args, **kwargs):
"""
Customized method to delete a mediafile. Ensures that a respective
mediafile projector element is disabled.
"""
Projector.remove_any(
2019-01-06 16:22:33 +01:00
skip_autoupdate=skip_autoupdate, name="mediafiles/mediafile", id=self.pk
)
return super().delete( # type: ignore
skip_autoupdate=skip_autoupdate, *args, **kwargs
)
def get_filesize(self):
2013-03-19 00:51:52 +01:00
"""
Transforms bytes to kilobytes or megabytes. Returns the size as string.
2013-03-19 00:51:52 +01:00
"""
# TODO: Read http://stackoverflow.com/a/1094933 and think about it.
try:
size = self.mediafile.size
except OSError:
2019-01-06 16:22:33 +01:00
size_string = _("unknown")
else:
if size < 1024:
2019-01-06 16:22:33 +01:00
size_string = "< 1 kB"
elif size >= 1024 * 1024:
mB = size / 1024 / 1024
2019-01-06 16:22:33 +01:00
size_string = "%d MB" % mB
else:
kB = size / 1024
2019-01-06 16:22:33 +01:00
size_string = "%d kB" % kB
return size_string
2017-09-26 09:00:34 +02:00
def is_logo(self):
2019-01-06 16:22:33 +01:00
for key in config["logos_available"]:
if config[key]["path"] == self.mediafile.url:
2017-09-26 09:00:34 +02:00
return True
return False
2018-04-04 11:25:45 +02:00
def is_font(self):
2019-01-06 16:22:33 +01:00
for key in config["fonts_available"]:
if config[key]["path"] == self.mediafile.url:
2018-04-04 11:25:45 +02:00
return True
return False