Skip to content
Snippets Groups Projects
models.py 4.18 KiB
Newer Older
import os

from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import get_language, ugettext_lazy as _

from private_storage.fields import PrivateFileField


class Profile(models.Model):
    """example Documentation:
    https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone
    """
    class Meta:
        ordering = ['user__last_name', 'user__first_name']

    accountname = models.CharField(max_length=150, null=True, blank=True)

    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    labs = models.ManyToManyField('Lab', related_name='members')

    def __str__(self):
        return '{0}, {1} <{2}>'.format(self.user.last_name, self.user.first_name, self.user.email)

    @property
    def fullname(self):
        return '{0}, {1}'.format(self.user.last_name, self.user.first_name)


class Institution(models.Model):
    class Meta:
        unique_together = (('abbr', 'name'))
        ordering = ['name']

    abbr = models.CharField(max_length=64, null=True, blank=True, unique=True, verbose_name=_('Abbreviation'))
    name = models.CharField(max_length=256, unique=True, verbose_name=_('Name'))

    def __str__(self):
        return self.name

    def get_identifier(self):
        if self.abbr:
            return self.abbr
        else:
            return self.name


class Lab(models.Model):
    class Meta:
        ordering = ['name']

    name = models.CharField(max_length=64, verbose_name=_('Name'))
    ldap = models.CharField(max_length=32, null=True, blank=True, verbose_name='LDAP')

    pi = models.OneToOneField(Profile, on_delete=models.SET_NULL, null=True, blank=True, related_name='pi_of')
    institution = models.ForeignKey(Institution, on_delete=models.PROTECT, related_name='labs')

    def __str__(self):
        return self.name


class Project(models.Model):

    name = models.CharField(max_length=128, verbose_name=_('Name'))

    source_lab = models.ForeignKey(Lab, on_delete=models.PROTECT, related_name='lab_projects')
    access_granted_to = models.ManyToManyField(Profile, related_name='projects', verbose_name=_('Grant Access to'))
    open_to_labs = models.ManyToManyField(Lab, related_name='projects', verbose_name=_('Open to these labs'))


class File(models.Model):
    """Base model """
    class Meta:
        abstract = True

    file = models.FileField()

    def __str__(self):
        return self.name()

    def delete(self, using=None, keep_parents=False):
        if self.file:
            self.file.delete()
        super().delete(using, keep_parents)

    def url(self):
        return self.file.url

    def name(self):
        return self.file.name.split('/')[-1]

    def filext(self):
        ext = os.path.splitext(self.name())[-1][1:].lower()
        return ext

    def placeholder_icon(self):
        default = 'fas fa-file-alt'
        assoc = {
            'pdf': 'fas fa-file-pdf',
            'doc': 'fas fa-file-word',
            'xls': 'fas fa-file-excel',
            'ppt': 'fas fa-file-powerpoint',
            'png': 'fas fa-file-image',
            'jpg': 'fas fa-file-image',
            'jpe': 'fas fa-file-image'
        }
        try:
            return assoc[self.filext()[:3]]
        except KeyError:
            return default

    def get_ctime(self):
        return self.file.storage.get_created_time(self.file.name)


def user_directory_path(instance):
    # file will be uploaded to MEDIA_ROOT/lab_<id>/<filename>
    return 'lab_{0}'.format(instance.lab.id)


class LabFile(File):
    file = PrivateFileField(upload_subfolder=user_directory_path, max_length=256, null=True)

    lab = models.ForeignKey(Lab, on_delete=models.CASCADE, related_name='files')


class Alert(models.Model):
    message_fr = models.TextField(null=True)
    message_en = models.TextField(null=True)
    start = models.DateTimeField()
    end = models.DateTimeField()

    @property
    def localized_message(self):
        if get_language() == 'en':
            return self.message_en
        else:
            return self.message_fr

class AppSettings(models.Model):
    home_institution = models.ForeignKey(Institution, null=True, blank=True, on_delete=models.SET_NULL)