Newer
Older
import os
from django.contrib.auth.models import User
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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)