diff --git a/templates/index.html b/templates/index.html
index 5cda81c1..ba47e550 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -43,7 +43,7 @@
-
My Training Record
+
My Training Record
Trainee List
Level List
Item List
diff --git a/training/management/commands/import_old_db.py b/training/management/commands/import_old_db.py
index 2bfb9c6e..b0491c5a 100644
--- a/training/management/commands/import_old_db.py
+++ b/training/management/commands/import_old_db.py
@@ -128,9 +128,8 @@ class Command(BaseCommand):
for depth, depth_index in depths:
if child.find('{}_Date'.format(depth)) is not None:
if child.find('{}_Assessor_ID'.format(depth)) is None:
- print("Training Record #{} had no supervisor. Hmm.".format(child.find('ID').text))
- tally[2] += 1
- # TODO Assign God/Satan/Unknown here.
+ print("Training Record #{} had no supervisor. Assigning System User.".format(child.find('ID').text))
+ supervisor = Profile.objects.get(first_name="God")
continue
supervisor = Profile.objects.get(pk=self.id_map[child.find('{}_Assessor_ID'.format(depth)).text])
if child.find('Member_ID') is None:
@@ -258,23 +257,25 @@ class Command(BaseCommand):
root = self.parse_xml(self.xml_path('Training Level Requirements.xml'))
for child in root:
- try:
- item = child.find('Item').text.split(".")
- obj, created = models.TrainingLevelRequirement.objects.update_or_create(
- level=models.TrainingLevel.objects.get(
- pk=int(
- child.find('Level').text)), item=models.TrainingItem.objects.get(
- active=True, reference_number=item[1], category=models.TrainingCategory.objects.get(
- reference_number=item[0])), depth=int(
- child.find('Depth').text))
+ items = child.find('Items').text.split(",")
+ for item in items:
+ try:
+ item = item.split('.')
+ obj, created = models.TrainingLevelRequirement.objects.update_or_create(
+ level=models.TrainingLevel.objects.get(
+ pk=int(
+ child.find('Level').text)), item=models.TrainingItem.objects.get(
+ active=True, reference_number=item[1], category=models.TrainingCategory.objects.get(
+ reference_number=item[0])), depth=int(
+ child.find('Depth').text))
- if created:
- tally[1] += 1
- else:
- tally[0] += 1
- except models.TrainingItem.DoesNotExist:
- print("Item with number {} does not exist".format(item))
- except models.TrainingItem.MultipleObjectsReturned:
- print(models.TrainingItem.objects.filter(reference_number=item[1], category=models.TrainingCategory.objects.get(reference_number=item[0])))
+ if created:
+ tally[1] += 1
+ else:
+ tally[0] += 1
+ except models.TrainingItem.DoesNotExist:
+ print("Item with number {} does not exist".format(item))
+ except models.TrainingItem.MultipleObjectsReturned:
+ print(models.TrainingItem.objects.filter(reference_number=item[1], category=models.TrainingCategory.objects.get(reference_number=item[0])))
print('TrainingLevelRequirements - Updated: {}, Created: {}'.format(tally[0], tally[1]))
diff --git a/training/models.py b/training/models.py
index 85e6ba4d..860c0fe2 100644
--- a/training/models.py
+++ b/training/models.py
@@ -6,11 +6,9 @@ from django.urls import reverse
from django.utils.safestring import SafeData, mark_safe
-# 'shim' overtop the profile model to neatly contain all training related fields etc
-
-@reversion.register # profile is already registered, but this triggers my custom versioning logic
-class Trainee(Profile, RevisionMixin):
+@reversion.register(follow=['qualifications_obtained']) # profile is already registered, but this triggers my custom versioning logic
+class Trainee(Profile, RevisionMixin): # 'shim' overtop the profile model to neatly contain all training related fields etc
class Meta:
proxy = True
@@ -20,7 +18,10 @@ class Trainee(Profile, RevisionMixin):
return [level for level in TrainingLevel.objects.all() if level.percentage_complete(self) > 0]
def level_qualifications(self, only_confirmed=False):
- return self.levels.all().filter(confirmed_on__isnull=only_confirmed).select_related('level')
+ levels = self.levels.all()
+ if only_confirmed:
+ levels = levels.exclude(confirmed_on=None)
+ return levels.select_related('level')
@property
def is_supervisor(self):
@@ -61,11 +62,11 @@ class TrainingItem(models.Model):
active = models.BooleanField(default=True)
@property
- def number(self):
+ def display_id(self):
return "{}.{}".format(self.category.reference_number, self.reference_number)
def __str__(self):
- name = "{} {}".format(self.number, self.name)
+ name = "{} {}".format(self.display_id, self.name)
if not self.active:
name += " (inactive)"
return name
@@ -79,6 +80,7 @@ class TrainingItem(models.Model):
ordering = ['category__reference_number', 'reference_number']
+@reversion.register
class TrainingItemQualification(models.Model):
STARTED = 0
COMPLETE = 1
@@ -100,13 +102,9 @@ class TrainingItemQualification(models.Model):
def __str__(self):
return "{} in {} on {}".format(self.depth, self.item, self.date)
- def save(self, *args, **kwargs):
- super().save()
- for level in TrainingLevel.objects.all(): # Mm yes efficiency FIXME
- if level.user_has_requirements(self.trainee):
- with reversion.create_revision():
- level_qualification = TrainingLevelQualification.objects.get_or_create(trainee=self.trainee, level=level)
- reversion.add_to_revision(self.trainee)
+ @property
+ def activity_feed_string(self):
+ return str("qualification for {} in {} ({})".format(self.trainee, self.item, self.get_depth_display()))
@classmethod
def get_colour_from_depth(obj, depth):
diff --git a/training/templates/base_training.html b/training/templates/base_training.html
index 60e655c2..6f5e499e 100644
--- a/training/templates/base_training.html
+++ b/training/templates/base_training.html
@@ -14,7 +14,7 @@
My Record