From 29db3b5a0c5365ca7ee82b04ecc32e0df9879016 Mon Sep 17 00:00:00 2001 From: FreneticScribbler Date: Wed, 28 Jun 2023 11:53:15 +0100 Subject: [PATCH] Another stab at error-tolerant versioning --- versioning/versioning.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/versioning/versioning.py b/versioning/versioning.py index 68eb008c..adf8a579 100644 --- a/versioning/versioning.py +++ b/versioning/versioning.py @@ -104,6 +104,9 @@ def diff(self): class ModelComparison: def __init__(self, old=None, new=None, version=None, follow=False, excluded_keys=['date_joined']): + if new is None and old is None: + logging.warning("Both new and old are none, this won't work") + pass # recieves two objects of the same model, and compares them. Returns an array of FieldCompare objects try: self.fields = old._meta.get_fields() @@ -152,19 +155,20 @@ def item_changes(self): from training.models import TrainingLevelQualification, TrainingItemQualification if self.follow and self.version.object is not None: item_type = ContentType.objects.get_for_model(self.version.object) - old_item_versions = self.version.parent.revision.version_set.exclude(content_type=item_type).exclude(content_type=ContentType.objects.get_for_model(TrainingItemQualification)) \ - .exclude(content_type=ContentType.objects.get_for_model(TrainingLevelQualification)) new_item_versions = self.version.revision.version_set.exclude(content_type=item_type).exclude(content_type=ContentType.objects.get_for_model(EventAuthorisation)) comparisonParams = {'excluded_keys': ['id', 'event', 'order', 'checklist', 'level', '_order', 'date_joined']} # Build some dicts of what we have item_dict = {} # build a list of items, key is the item_pk - for version in old_item_versions: # put all the old versions in a list - if version is None or version._object_version is None: - logging.warning(f"Something was null when it really shouldn't be! {old_item_versions}") - compare = ModelComparison(old=version._object_version.object, **comparisonParams) - item_dict[version.object_id] = compare + if self.version.parent is not None: + old_item_versions = self.version.parent.revision.version_set.exclude(content_type=item_type).exclude(content_type=ContentType.objects.get_for_model(TrainingItemQualification)) \ + .exclude(content_type=ContentType.objects.get_for_model(TrainingLevelQualification)) + for version in old_item_versions: # put all the old versions in a list + if version is None or version._object_version is None: + logging.warning(f"Something was null when it really shouldn't be! {old_item_versions}") + compare = ModelComparison(old=version._object_version.object, **comparisonParams) + item_dict[version.object_id] = compare for version in new_item_versions: # go through the new versions try: @@ -227,7 +231,7 @@ def parent(self): try: previousVersion = versions.filter(revision_id__lt=self.revision_id).latest('revision__date_created') except ObjectDoesNotExist: - return False + return None return previousVersion @@ -236,7 +240,7 @@ def changes(self): return ModelComparison( version=self, new=self._object_version.object, - old=self.parent._object_version.object if self.parent else None, + old=self.parent._object_version.object, follow=True )