From 17c8d84295b05da24d455467d607ebd9c192030a Mon Sep 17 00:00:00 2001 From: Iwo Herka Date: Fri, 6 Apr 2018 13:59:51 +0200 Subject: [PATCH] Make tests runnable with Python 3 --- eav/__init__.py | 7 ++++--- eav/managers.py | 16 ++++++++-------- eav/models.py | 11 +++++++++-- eav/validators.py | 2 +- tests/misc_models.py | 4 ++-- tests/models.py | 2 +- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/eav/__init__.py b/eav/__init__.py index 73a21be..70e91d0 100644 --- a/eav/__init__.py +++ b/eav/__init__.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # vim: ai ts=4 sts=4 et sw=4 coding=utf-8 # -# This software is derived from EAV-Django originally written and +# This software is derived from EAV-Django originally written and # copyrighted by Andrey Mikhaylenko # # This is free software: you can redistribute it and/or modify @@ -26,10 +26,11 @@ def get_version(): __version__ = get_version() + def register(model_cls, config_cls=None): - from registry import Registry + from .registry import Registry Registry.register(model_cls, config_cls) def unregister(model_cls): - from registry import Registry + from .registry import Registry Registry.unregister(model_cls) diff --git a/eav/managers.py b/eav/managers.py index c041957..f6a0a1e 100644 --- a/eav/managers.py +++ b/eav/managers.py @@ -40,7 +40,7 @@ def eav_filter(func): ''' @wraps(func) - def wrapper(self, *args, **kwargs): + def wrapper(self, *args, **kwargs): nargs = [] for arg in args: if isinstance(arg, models.Q): @@ -52,7 +52,7 @@ def eav_filter(func): for key, value in kwargs.items(): # Modify kwargs (warning: recursion ahead). nkey, nval = expand_eav_filter(self.model, key, value) - + if nkey in nkwargs: # Apply AND to both querysets. nkwargs[nkey] = (nkwargs[nkey] & nval).distinct() @@ -60,10 +60,10 @@ def eav_filter(func): nkwargs.update({nkey: nval}) return func(self, *nargs, **nkwargs) - + return wrapper - + def expand_q_filters(q, root_cls): ''' Takes a Q object and a model class. @@ -71,7 +71,7 @@ def expand_q_filters(q, root_cls): through expand_eav_filter ''' new_children = [] - + for qi in q.children: if type(qi) is tuple: # this child is a leaf node: in Q this is a 2-tuple of: @@ -81,7 +81,7 @@ def expand_q_filters(q, root_cls): else: # this child is another Q node: recursify! new_children.append(expand_q_filters(qi, root_cls)) - + q.children = new_children return q @@ -174,7 +174,7 @@ class EntityManager(models.Manager): new_kwargs = {} eav_kwargs = {} - for key, value in kwargs.iteritems(): + for key, value in kwargs.items(): if key.startswith(prefix): eav_kwargs.update({key[len(prefix):]: value}) else: @@ -182,7 +182,7 @@ class EntityManager(models.Manager): obj = self.model(**new_kwargs) obj_eav = getattr(obj, config_cls.eav_attr) - for key, value in eav_kwargs.iteritems(): + for key, value in eav_kwargs.items(): setattr(obj_eav, key, value) obj.save() return obj diff --git a/eav/models.py b/eav/models.py index 06f2df9..643da85 100644 --- a/eav/models.py +++ b/eav/models.py @@ -177,10 +177,13 @@ class Attribute(models.Model): help_text=_(u"User-friendly attribute name")) content_type = models.ForeignKey(ContentType, + on_delete=models.PROTECT, blank=True, null=True, verbose_name=_(u"content type")) site = models.ForeignKey(Site, verbose_name=_(u"site"), + on_delete=models.PROTECT, + blank=True, null=True, default=settings.SITE_ID) slug = EavSlugField(_(u"slug"), max_length=50, db_index=True, @@ -191,6 +194,7 @@ class Attribute(models.Model): help_text=_(u"Short description")) enum_group = models.ForeignKey(EnumGroup, verbose_name=_(u"choice group"), + on_delete=models.PROTECT, blank=True, null=True) type = models.CharField(_(u"type"), max_length=20, blank=True, null=True) @@ -233,7 +237,7 @@ class Attribute(models.Model): 'object': validate_object, 'enum': validate_enum, } - + validation_function = DATATYPE_VALIDATORS[self.datatype] return [validation_function] @@ -341,7 +345,7 @@ class Value(models.Model): ''' - entity_ct = models.ForeignKey(ContentType, related_name='value_entities') + entity_ct = models.ForeignKey(ContentType, on_delete=models.PROTECT, related_name='value_entities') entity_id = models.IntegerField() entity = generic.GenericForeignKey(ct_field='entity_ct', fk_field='entity_id') @@ -352,10 +356,12 @@ class Value(models.Model): value_date = models.DateTimeField(blank=True, null=True) value_bool = models.NullBooleanField(blank=True, null=True) value_enum = models.ForeignKey(EnumValue, blank=True, null=True, + on_delete=models.PROTECT, related_name='eav_values') generic_value_id = models.IntegerField(blank=True, null=True) generic_value_ct = models.ForeignKey(ContentType, blank=True, null=True, + on_delete=models.PROTECT, related_name='value_values') value_object = generic.GenericForeignKey(ct_field='generic_value_ct', fk_field='generic_value_id') @@ -364,6 +370,7 @@ class Value(models.Model): modified = models.DateTimeField(_(u"modified"), auto_now=True) attribute = models.ForeignKey(Attribute, db_index=True, + on_delete=models.PROTECT, verbose_name=_(u"attribute")) def save(self, *args, **kwargs): diff --git a/eav/validators.py b/eav/validators.py index b5afed1..02ec3e8 100644 --- a/eav/validators.py +++ b/eav/validators.py @@ -45,7 +45,7 @@ def validate_text(value): ''' Raises ``ValidationError`` unless *value* type is ``str`` or ``unicode`` ''' - if not (type(value) == unicode or type(value) == str): + if not type(value) == str: raise ValidationError(_(u"Must be str or unicode")) diff --git a/tests/misc_models.py b/tests/misc_models.py index 4aba248..4f28512 100644 --- a/tests/misc_models.py +++ b/tests/misc_models.py @@ -8,10 +8,10 @@ from .models import Patient class MiscModels(TestCase): - def test_enumgroup_unicode(self): + def test_enumgroup_str(self): name = 'Yes / No' e = EnumGroup.objects.create(name=name) - self.assertEqual(unicode(e), name) + self.assertEqual(str(e), name) def test_attribute_help_text(self): desc = 'Patient Age' diff --git a/tests/models.py b/tests/models.py index a0754de..a42fd66 100644 --- a/tests/models.py +++ b/tests/models.py @@ -10,7 +10,7 @@ class Patient(models.Model): class Encounter(models.Model): num = models.PositiveSmallIntegerField() - patient = models.ForeignKey(Patient) + patient = models.ForeignKey(Patient, on_delete=models.PROTECT) def __unicode__(self): return '%s: encounter num %d' % (self.patient, self.num)