From a428e7654baa4872f8db15dc74d108065be5584a Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Wed, 13 Jan 2016 13:40:31 +0100 Subject: [PATCH 1/2] Fix Python error when ManyToMany relations didn't exist. This avoids storing an ugettext value in self.version. It's value got parsed in `ids = [int(v) for v in self.value]` causing an `int("F")` call that fails. Instead, a sentinal value is introduced that can be recognized in the code, yet output a meaningful message when it's shown to the user. Fixes #44 --- reversion_compare/compare.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/reversion_compare/compare.py b/reversion_compare/compare.py index 20366e24..4950b0c3 100644 --- a/reversion_compare/compare.py +++ b/reversion_compare/compare.py @@ -14,6 +14,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.db import models +from django.utils.encoding import force_text, python_2_unicode_compatible from django.utils.translation import ugettext as _ @@ -23,6 +24,18 @@ logger = logging.getLogger(__name__) +@python_2_unicode_compatible +class FieldVersionDoesNotExist(object): + """ + Sentinel object to handle missing fields + """ + + def __str__(self): + return force_text(_("Field Didn't exist!")) + +DOES_NOT_EXIST = FieldVersionDoesNotExist() + + class CompareObject(object): def __init__(self, field, field_name, obj, version, has_int_pk, adapter): self.field = field @@ -32,7 +45,7 @@ def __init__(self, field, field_name, obj, version, has_int_pk, adapter): self.has_int_pk = has_int_pk self.adapter = adapter # try and get a value, if none punt - self.value = version.field_dict.get(field_name, _("Field Didn't exist!")) + self.value = version.field_dict.get(field_name, DOES_NOT_EXIST) def _obj_repr(self, obj): # FIXME: How to create a better representation of the current value? @@ -122,6 +135,9 @@ def get_many_to_many(self): """ if self.field.get_internal_type() != "ManyToManyField": # FIXME! return ([], [], [], []) # TODO: refactory that + elif self.value is DOES_NOT_EXIST: + return ([], [], [], []) # TODO: refactory that + ids = None if self.has_int_pk: ids = [int(v) for v in self.value] # is: version.field_dict[field.name] From 1a61c0ba06af88a7246ffa2c33b3e50ac803ed1a Mon Sep 17 00:00:00 2001 From: Diederik van der Boor Date: Tue, 16 Feb 2016 13:23:36 +0100 Subject: [PATCH 2/2] Fix English source text for "Field didn't exist" --- reversion_compare/compare.py | 2 +- reversion_compare/locale/el/LC_MESSAGES/django.po | 2 +- reversion_compare/locale/nl/LC_MESSAGES/django.po | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reversion_compare/compare.py b/reversion_compare/compare.py index 4950b0c3..f0ceeef6 100644 --- a/reversion_compare/compare.py +++ b/reversion_compare/compare.py @@ -31,7 +31,7 @@ class FieldVersionDoesNotExist(object): """ def __str__(self): - return force_text(_("Field Didn't exist!")) + return force_text(_("Field didn't exist!")) DOES_NOT_EXIST = FieldVersionDoesNotExist() diff --git a/reversion_compare/locale/el/LC_MESSAGES/django.po b/reversion_compare/locale/el/LC_MESSAGES/django.po index d48ec467..21b3dfed 100644 --- a/reversion_compare/locale/el/LC_MESSAGES/django.po +++ b/reversion_compare/locale/el/LC_MESSAGES/django.po @@ -24,7 +24,7 @@ msgid "Compare %(name)s" msgstr "Σύγκριση %(name)s" #: .\compare.py:34 -msgid "Field Didn't exist!" +msgid "Field didn't exist!" msgstr "Το πεδίο δεν υπήρχε" #: .\templates\reversion-compare\action_list_partial.html:9 diff --git a/reversion_compare/locale/nl/LC_MESSAGES/django.po b/reversion_compare/locale/nl/LC_MESSAGES/django.po index a9726f5c..a8eb9f2c 100644 --- a/reversion_compare/locale/nl/LC_MESSAGES/django.po +++ b/reversion_compare/locale/nl/LC_MESSAGES/django.po @@ -24,7 +24,7 @@ msgid "Compare %(name)s" msgstr "Vergelijk %(name)s" #: .\compare.py:34 -msgid "Field Didn't exist!" +msgid "Field didn't exist!" msgstr "Veld bestond niet!" #: .\templates\reversion-compare\action_list_partial.html:9