Repository URL to install this package:
|
Version:
0.0.4 ▾
|
from functools import reduce
from operator import or_
from django.db import models
from slugify import slugify
from django.db.models.signals import pre_delete, pre_save
from django.dispatch.dispatcher import receiver
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.conf import settings
class DocumentType(models.Model):
''' Model that represents a Document Type for classifying documents '''
name = models.CharField(max_length=255)
slug = models.CharField(max_length=255, null=True, blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Document Type'
verbose_name_plural = 'Document Types'
class DocumentSubType(models.Model):
''' Model that represents a Document Sub-Type for classifying documents '''
name = models.CharField(max_length=255)
slug = models.CharField(max_length=255, null=True, blank=True)
document_type = models.ForeignKey(
DocumentType, related_name='sub_types', on_delete=models.CASCADE
)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Document Sub Type'
verbose_name_plural = 'Document Sub Types'
class Document(models.Model):
''' Model that represents a Document for storing files '''
name = models.CharField(max_length=255)
slug = models.CharField(max_length=255, null=True, blank=True)
description = models.TextField(null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
last_modified = models.DateTimeField(auto_now=True)
file = models.FileField(upload_to='files')
document_type = models.ForeignKey(
DocumentType, null=True, blank=True, related_name='documents', on_delete=models.SET_NULL)
document_sub_type = models.ForeignKey(
DocumentSubType, null=True, blank=True, related_name='documents', on_delete=models.SET_NULL)
content_type = models.ForeignKey(
ContentType, null=True, blank=True, on_delete=models.SET_NULL)
object_id = models.PositiveIntegerField(null=True, blank=True)
linked_model = GenericForeignKey('content_type', 'object_id')
@classmethod
def get_queryset_for_user(cls, user):
queries = list()
for _, model_definition in settings.FILES_LINKED_MODELS.items():
app_label, model, view_permission, _ = model_definition
linked_ct = ContentType.objects.get(app_label=app_label, model=model)
linked_model = linked_ct.model_class()
if user.has_perm(view_permission):
if hasattr(linked_model, 'get_linked_model_ids'):
linked_model_ids = linked_model.get_linked_model_ids(user)
queries.append(
models.Q(content_type=linked_ct) & models.Q(object_id__in=linked_model_ids)
)
else:
queries.append(
models.Q(content_type=linked_ct)
)
if hasattr(settings, 'FILES_UNLINKED_MODELS'):
if settings.FILES_UNLINKED_MODELS(user):
queries.append(models.Q(content_type__isnull=True))
else:
queries.append(models.Q(content_type__isnull=True))
return cls.objects.filter(reduce(or_, queries))
def __str__(self):
return self.name
class Meta:
verbose_name = 'Document'
verbose_name_plural = 'Documents'
@receiver(pre_save, sender=Document)
@receiver(pre_save, sender=DocumentType)
@receiver(pre_save, sender=DocumentSubType)
def slugify_name(sender, instance, **kwargs):
instance.slug = slugify(instance.name)
@receiver(pre_delete, sender=Document)
def delete_file(sender, instance, **kwargs):
instance.file.delete(False)