Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
wbfiles / files / models.py
Size: Mime:
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)