mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-25 01:12:16 +00:00
Some attempts at optimising SQL queries
New high score!
This commit is contained in:
@@ -10,12 +10,12 @@ class Trainee(Profile):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_supervisor(self):
|
def is_supervisor(self):
|
||||||
for level_qualification in self.levels.all():
|
for level_qualification in self.levels.select_related('level').all():
|
||||||
if confirmed_on is not None and level_qualification.level.level >= TrainingLevel.SUPERVISOR:
|
if confirmed_on is not None and level_qualification.level.level >= TrainingLevel.SUPERVISOR:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_records_of_depth(self, depth):
|
def get_records_of_depth(self, depth):
|
||||||
return self.qualifications_obtained.filter(depth=depth)
|
return self.qualifications_obtained.filter(depth=depth).select_related('item', 'trainee', 'supervisor')
|
||||||
|
|
||||||
def is_user_qualified_in(self, item, required_depth):
|
def is_user_qualified_in(self, item, required_depth):
|
||||||
qual = self.qualifications_obtained.filter(item=item).first() # this is a somewhat ghetto version of get_or_none
|
qual = self.qualifications_obtained.filter(item=item).first() # this is a somewhat ghetto version of get_or_none
|
||||||
@@ -42,7 +42,7 @@ class TrainingItem(models.Model):
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def user_has_qualification(item, user, depth):
|
def user_has_qualification(item, user, depth):
|
||||||
for q in user.qualifications_obtained.all():
|
for q in user.qualifications_obtained.all().select_related('item'):
|
||||||
if q.item == item and q.depth > depth:
|
if q.item == item and q.depth > depth:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@@ -113,7 +113,7 @@ class TrainingLevel(models.Model, RevisionMixin):
|
|||||||
return self.get_requirements_of_depth(TrainingItemQualification.PASSED_OUT)
|
return self.get_requirements_of_depth(TrainingItemQualification.PASSED_OUT)
|
||||||
|
|
||||||
def percentage_complete(self, user): # FIXME
|
def percentage_complete(self, user): # FIXME
|
||||||
needed_qualifications = self.requirements.all()
|
needed_qualifications = self.requirements.all().select_related()
|
||||||
relavant_qualifications = 0.0
|
relavant_qualifications = 0.0
|
||||||
# TODO Efficiency...
|
# TODO Efficiency...
|
||||||
for req in needed_qualifications:
|
for req in needed_qualifications:
|
||||||
@@ -126,7 +126,7 @@ class TrainingLevel(models.Model, RevisionMixin):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def user_has_requirements(self, user):
|
def user_has_requirements(self, user):
|
||||||
return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all())
|
return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.select_related().all())
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self.department is None: # 2TA
|
if self.department is None: # 2TA
|
||||||
@@ -149,3 +149,6 @@ class TrainingLevelQualification(models.Model):
|
|||||||
level = models.ForeignKey('TrainingLevel', on_delete=models.RESTRICT)
|
level = models.ForeignKey('TrainingLevel', on_delete=models.RESTRICT)
|
||||||
confirmed_on = models.DateTimeField(null=True)
|
confirmed_on = models.DateTimeField(null=True)
|
||||||
confirmed_by = models.ForeignKey('Trainee', related_name='confirmer', on_delete=models.RESTRICT, null=True)
|
confirmed_by = models.ForeignKey('Trainee', related_name='confirmer', on_delete=models.RESTRICT, null=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{} qualified as a {}".format(self.trainee, self.level)
|
||||||
|
|||||||
@@ -50,7 +50,15 @@
|
|||||||
<div class="card-footer">
|
<div class="card-footer">
|
||||||
{% user_level_if_present object level as level_qualification %}
|
{% user_level_if_present object level as level_qualification %}
|
||||||
{% if level_qualification %}
|
{% if level_qualification %}
|
||||||
<button class="btn btn-warning text-right" disabled>Awaiting Confirmation</button>
|
{% if level_qualification.confirmed_by is None %}
|
||||||
|
{% if request.user.is_supervisor or request.user.is_superuser %}
|
||||||
|
<a class="btn btn-info" href="{% url 'confirm_level' object.pk level.pk %}">Confirm</a>
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-warning text-right" disabled>Awaiting Confirmation</button>
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<button class="btn btn-success active">Confirmed</button>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<button class="btn btn-danger text-right" disabled>Incomplete</button>
|
<button class="btn btn-danger text-right" disabled>Incomplete</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|||||||
@@ -19,4 +19,5 @@ urlpatterns = [
|
|||||||
path('level/<int:pk>/', views.LevelDetail.as_view(), name='level_detail'),
|
path('level/<int:pk>/', views.LevelDetail.as_view(), name='level_detail'),
|
||||||
path('level/<int:pk>/add_requirement/', views.AddLevelRequirement.as_view(), name='add_requirement'),
|
path('level/<int:pk>/add_requirement/', views.AddLevelRequirement.as_view(), name='add_requirement'),
|
||||||
path('level/remove_requirement/<int:pk>/', views.RemoveRequirement.as_view(), name='remove_requirement'),
|
path('level/remove_requirement/<int:pk>/', views.RemoveRequirement.as_view(), name='remove_requirement'),
|
||||||
|
path('trainee/<int:pk>/level/<int:level_pk>/confirm', views.ConfirmLevel.as_view(), name='confirm_level'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from django.urls import reverse_lazy
|
|||||||
from django.views import generic
|
from django.views import generic
|
||||||
from PyRIGS.views import OEmbedView, is_ajax
|
from PyRIGS.views import OEmbedView, is_ajax
|
||||||
from training import models, forms
|
from training import models, forms
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from users import views
|
from users import views
|
||||||
|
|
||||||
@@ -120,3 +121,14 @@ class RemoveRequirement(generic.DeleteView):
|
|||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return self.request.POST.get('next')
|
return self.request.POST.get('next')
|
||||||
|
|
||||||
|
|
||||||
|
class ConfirmLevel(generic.RedirectView):
|
||||||
|
def get_redirect_url(self, *args, **kwargs):
|
||||||
|
# TODO Prevent duplicate training level qualifications existing
|
||||||
|
level_qualification = models.TrainingLevelQualification.objects.filter(trainee=kwargs['pk'], level=kwargs['level_pk'])
|
||||||
|
print(level_qualification)
|
||||||
|
#level_qualification.confirmed_by = self.request.user
|
||||||
|
#level_qualification.confirmed_on = timezone.now()
|
||||||
|
#level_qualification.save()
|
||||||
|
return reverse_lazy('trainee_detail', kwargs={'pk': kwargs['pk']})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user