Files
mayan-edms/mayan/apps/common/models.py
Roberto Rosario 7532429b0b Refactor common generic views
Add keyword arguments.

Sort arguments.

Unify the ObjectListPermissionFilterMixin and
ObjectPermissionCheckMixin into the RestrictedQuerysetMixin.

Add MultipleObjectDownloadView.

Update SingleObjectDownloadView to do queryset filtering.

The method that returns the base queryset for views is
now named get_source_queryset().

The views now use .get_object_list as a multi object
homologous of get_object. The queryset returned by
.get_object_list is restricted by access.

Make MultipleObjectMixin a subclass of Django's
SingleObjectMixin to reduce repeated code.

All generic views are now imported from common.generics and not
from common.views.

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
2019-01-28 05:18:33 -04:00

119 lines
3.6 KiB
Python

from __future__ import unicode_literals
import logging
import uuid
from pytz import common_timezones
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _
from .managers import ErrorLogEntryManager, UserLocaleProfileManager
from .storages import storage_sharedupload
logger = logging.getLogger(__name__)
# TODO: move outside of models.py or as a static method of SharedUploadedFile
def upload_to(instance, filename):
return 'shared-file-{}'.format(uuid.uuid4().hex)
class ErrorLogEntry(models.Model):
"""
Class to store an error log for any object. Uses generic foreign keys to
reference the parent object.
"""
namespace = models.CharField(
max_length=128, verbose_name=_('Namespace')
)
content_type = models.ForeignKey(
blank=True, on_delete=models.CASCADE, null=True,
related_name='error_log_content_type', to=ContentType,
)
object_id = models.PositiveIntegerField(blank=True, null=True)
content_object = GenericForeignKey(
ct_field='content_type', fk_field='object_id',
)
datetime = models.DateTimeField(
auto_now_add=True, db_index=True, verbose_name=_('Date time')
)
result = models.TextField(blank=True, null=True, verbose_name=_('Result'))
objects = ErrorLogEntryManager()
class Meta:
ordering = ('datetime',)
verbose_name = _('Error log entry')
verbose_name_plural = _('Error log entries')
@python_2_unicode_compatible
class SharedUploadedFile(models.Model):
"""
Keep a database link to a stored file. Used to share files between code
that runs out of process.
"""
file = models.FileField(
storage=storage_sharedupload, upload_to=upload_to,
verbose_name=_('File')
)
filename = models.CharField(max_length=255, verbose_name=_('Filename'))
datetime = models.DateTimeField(
auto_now_add=True, verbose_name=_('Date time')
)
class Meta:
verbose_name = _('Shared uploaded file')
verbose_name_plural = _('Shared uploaded files')
def __str__(self):
return self.filename
def save(self, *args, **kwargs):
self.filename = force_text(self.file)
super(SharedUploadedFile, self).save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.file.storage.delete(self.file.name)
return super(SharedUploadedFile, self).delete(*args, **kwargs)
def open(self):
return self.file.storage.open(self.file.name)
@python_2_unicode_compatible
class UserLocaleProfile(models.Model):
"""
Stores the locale preferences of an user. Stores timezone and language
at the moment.
"""
user = models.OneToOneField(
on_delete=models.CASCADE, related_name='locale_profile',
to=settings.AUTH_USER_MODEL, verbose_name=_('User')
)
timezone = models.CharField(
choices=zip(common_timezones, common_timezones), max_length=48,
verbose_name=_('Timezone')
)
language = models.CharField(
choices=settings.LANGUAGES, max_length=8, verbose_name=_('Language')
)
objects = UserLocaleProfileManager()
class Meta:
verbose_name = _('User locale profile')
verbose_name_plural = _('User locale profiles')
def __str__(self):
return force_text(self.user)
def natural_key(self):
return self.user.natural_key()
natural_key.dependencies = [settings.AUTH_USER_MODEL]