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)