diff --git a/RIGS/migrations/0044_profile_is_supervisor.py b/RIGS/migrations/0044_profile_is_supervisor.py new file mode 100644 index 00000000..f0f33336 --- /dev/null +++ b/RIGS/migrations/0044_profile_is_supervisor.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-09 14:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('RIGS', '0043_auto_20211027_1519'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='is_supervisor', + field=models.BooleanField(default=False), + ), + ] diff --git a/RIGS/migrations/0045_legacy_supervisors.py b/RIGS/migrations/0045_legacy_supervisors.py new file mode 100644 index 00000000..90ca8fce --- /dev/null +++ b/RIGS/migrations/0045_legacy_supervisors.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.11 on 2022-01-09 15:00 + +from django.db import migrations + +from training.models import TrainingLevel + +def find_existing_supervisors(apps, schema_editor): + Profile = apps.get_model('RIGS', 'Profile') + for person in Profile.objects.all(): + if person.level_qualifications.exclude(confirmed_on=None).select_related('level') \ + .filter(level__level__gte=TrainingLevel.SUPERVISOR) \ + .exclude(level__department=TrainingLevel.HAULAGE) \ + .exclude(level__department__isnull=True).exists(): + person.is_supervisor = True + person.save() + +class Migration(migrations.Migration): + + dependencies = [ + ('RIGS', '0044_profile_is_supervisor'), + ] + + operations = [ + migrations.RunPython(find_existing_supervisors, migrations.RunPython.noop) + ] diff --git a/RIGS/models.py b/RIGS/models.py index 2f5e37d1..90b0c3d5 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -27,6 +27,7 @@ class Profile(AbstractUser): # Currently only populated by the admin approval email. TODO: Populate it each time we send any email, might need that... last_emailed = models.DateTimeField(blank=True, null=True) dark_theme = models.BooleanField(default=False) + is_supervisor = models.BooleanField(default=False) reversion_hide = True @@ -56,11 +57,6 @@ class Profile(AbstractUser): def latest_events(self): return self.event_mic.order_by('-start_date').select_related('person', 'organisation', 'venue', 'mic', 'riskassessment', 'invoice').prefetch_related('checklists') - @cached_property - def as_trainee(self): - from training.models import Trainee - return Trainee.objects.get(pk=self.pk) - @classmethod def admins(cls): return Profile.objects.filter(email__in=[y for x in settings.ADMINS for y in x]) diff --git a/training/decorators.py b/training/decorators.py index e15aca49..070eb29c 100644 --- a/training/decorators.py +++ b/training/decorators.py @@ -2,4 +2,4 @@ from PyRIGS.decorators import user_passes_test_with_403 def has_perm_or_supervisor(perm, login_url=None, oembed_view=None): - return user_passes_test_with_403(lambda u: (hasattr(u, 'as_trainee') and u.as_trainee.is_supervisor) or u.has_perm(perm), login_url=login_url, oembed_view=oembed_view) + return user_passes_test_with_403(lambda u: u.is_supervisor or u.has_perm(perm), login_url=login_url, oembed_view=oembed_view) diff --git a/training/models.py b/training/models.py index 43901c3c..edea755a 100644 --- a/training/models.py +++ b/training/models.py @@ -23,13 +23,6 @@ class Trainee(Profile, RevisionMixin): .exclude(level__department=TrainingLevel.HAULAGE) \ .exclude(level__department__isnull=True).exists() - @property - def is_supervisor(self): - return self.level_qualifications.exclude(confirmed_on=None).select_related('level') \ - .filter(level__level__gte=TrainingLevel.SUPERVISOR) \ - .exclude(level__department=TrainingLevel.HAULAGE) \ - .exclude(level__department__isnull=True).exists() - @property def is_driver(self): return self.level_qualifications.all().exclude(confirmed_on=None).select_related('level').filter(level__department=TrainingLevel.HAULAGE).exists() @@ -266,6 +259,11 @@ class TrainingLevelQualification(models.Model, RevisionMixin): def get_icon(self): return self.level.get_icon + def clean(self): + if level.level >= TrainingLevel.SUPERVISOR and level.department != TrainingLevel.HAULAGE: + trainee.is_supervisor = True + trainee.save() + def __str__(self): if self.level.is_common_competencies: return "{} is qualified in the {}".format(self.trainee, self.level) diff --git a/training/templates/edit_training_record.html b/training/templates/edit_training_record.html index c63b5e88..ad26a047 100644 --- a/training/templates/edit_training_record.html +++ b/training/templates/edit_training_record.html @@ -42,7 +42,7 @@