From 3aead8ad956006dc1bf9f8226b20e03a5258d165 Mon Sep 17 00:00:00 2001 From: Sourcery AI <> Date: Wed, 1 Dec 2021 02:14:03 +0000 Subject: [PATCH] 'Refactored by Sourcery' --- denorm/daemon.py | 10 +-- denorm/db/base.py | 22 ++--- denorm/db/mysql/triggers.py | 2 +- denorm/denorms.py | 121 +++++++++++++++----------- denorm/dependencies.py | 5 +- denorm/fields.py | 8 +- test_denorm_project/test_app/tests.py | 14 --- 7 files changed, 85 insertions(+), 97 deletions(-) diff --git a/denorm/daemon.py b/denorm/daemon.py index a0589372..d27b86b6 100644 --- a/denorm/daemon.py +++ b/denorm/daemon.py @@ -29,6 +29,7 @@ Stevens, W. Richard. I{Unix Network Programming} (Addison-Wesley, 1990). """ + __version__ = "1.0.1" __author__ = "Brian Clapper, bmc@clapper.org" __url__ = "http://www.clapper.org/software/python/daemon/" @@ -60,12 +61,7 @@ MAXFD = 1024 # The standard I/O file descriptors are redirected to /dev/null by default. -if (hasattr(os, "devnull")): - NULL_DEVICE = os.devnull -else: - NULL_DEVICE = "/dev/null" - - +NULL_DEVICE = os.devnull if (hasattr(os, "devnull")) else "/dev/null" # --------------------------------------------------------------------------- # Logging # --------------------------------------------------------------------------- @@ -196,7 +192,7 @@ def _redirectFileDescriptors(): # Close all file descriptors. - for fd in range(0, maxfd): + for fd in range(maxfd): # Only close TTYs. try: os.ttyname(fd) diff --git a/denorm/db/base.py b/denorm/db/base.py index 9d1c7e42..d0022afc 100644 --- a/denorm/db/base.py +++ b/denorm/db/base.py @@ -76,11 +76,7 @@ def __init__(self, subject, time, event, actions, content_type, using=None, skip self.append(actions) self.using = using - if self.using: - self.connection = connections[self.using] - else: - self.connection = connection - + self.connection = connections[self.using] if self.using else connection try: from django.contrib.contenttypes.fields import GenericRelation except ImportError: @@ -115,11 +111,12 @@ def __init__(self, subject, time, event, actions, content_type, using=None, skip except: from django.db.models.related import RelatedObject as ForeignObjectRel for k, v in get_fields_with_model(subject, self.model._meta): - if isinstance(k, ForeignObjectRel): - pass - else: - if not v and k.attname not in skip: - self.fields.append((k.attname, k.db_type(connection=self.connection))) + if ( + not isinstance(k, ForeignObjectRel) + and not v + and k.attname not in skip + ): + self.fields.append((k.attname, k.db_type(connection=self.connection))) else: raise NotImplementedError @@ -149,10 +146,7 @@ class TriggerSet(object): def __init__(self, using=None): self.using = using self.triggers = {} - if self.using: - self.connection = connections[self.using] - else: - self.connection = connection + self.connection = connections[self.using] if self.using else connection def cursor(self): return self.connection.cursor() diff --git a/denorm/db/mysql/triggers.py b/denorm/db/mysql/triggers.py index 7ad85b78..f9bef683 100644 --- a/denorm/db/mysql/triggers.py +++ b/denorm/db/mysql/triggers.py @@ -22,10 +22,10 @@ class TriggerActionInsert(base.TriggerActionInsert): def sql(self): table = self.model._meta.db_table columns = "(" + ", ".join(self.columns) + ")" - params = [] if isinstance(self.values, TriggerNestedSelect): sql, nested_params = self.values.sql() values = "(" + sql + ")" + params = [] params.extend(nested_params) else: values = "VALUES (" + ", ".join(self.values) + ")" diff --git a/denorm/denorms.py b/denorm/denorms.py index b8a14038..8a65f886 100644 --- a/denorm/denorms.py +++ b/denorm/denorms.py @@ -25,42 +25,40 @@ def many_to_many_pre_save(sender, instance, **kwargs): """ Updates denormalised many-to-many fields for the model """ - if instance.pk: + if not instance.pk: + return # Need a primary key to do m2m stuff - for m2m in sender._meta.local_many_to_many: + for m2m in sender._meta.local_many_to_many: # This gets us all m2m fields, so limit it to just those that are denormed - if hasattr(m2m, 'denorm'): - # Does some extra jiggery-pokery for "through" m2m models. - # May not work under lots of conditions. - try: - remote = m2m.remote_field # Django>=1.10 - except AttributeError: - remote = m2m.rel - if hasattr(remote, 'through_model'): - # Clear exisiting through records (bit heavy handed?) - kwargs = {m2m.related.var_name: instance} - - # Can't use m2m_column_name in a filter - # kwargs = { m2m.m2m_column_name(): instance.pk, } - remote.through_model.objects.filter(**kwargs).delete() - - values = m2m.denorm.func(instance) - for value in values: - kwargs.update({m2m.m2m_reverse_name(): value.pk}) - remote.through_model.objects.create(**kwargs) + if hasattr(m2m, 'denorm'): + # Does some extra jiggery-pokery for "through" m2m models. + # May not work under lots of conditions. + try: + remote = m2m.remote_field # Django>=1.10 + except AttributeError: + remote = m2m.rel + if hasattr(remote, 'through_model'): + # Clear exisiting through records (bit heavy handed?) + kwargs = {m2m.related.var_name: instance} + + # Can't use m2m_column_name in a filter + # kwargs = { m2m.m2m_column_name(): instance.pk, } + remote.through_model.objects.filter(**kwargs).delete() + + values = m2m.denorm.func(instance) + for value in values: + kwargs[m2m.m2m_reverse_name()] = value.pk + remote.through_model.objects.create(**kwargs) - else: - values = m2m.denorm.func(instance) - setattr(instance, m2m.attname, values) + else: + values = m2m.denorm.func(instance) + setattr(instance, m2m.attname, values) def many_to_many_post_save(sender, instance, created, **kwargs): if created: def check_resave(): - for m2m in sender._meta.local_many_to_many: - if hasattr(m2m, 'denorm'): - return True - return False + return any(hasattr(m2m, 'denorm') for m2m in sender._meta.local_many_to_many) if check_resave(): instance.save() @@ -74,9 +72,11 @@ def get_alldenorms(): for model in gmodels.get_models(include_auto_created=True): if not model._meta.proxy: for field in model._meta.fields: - if hasattr(field, 'denorm'): - if not field.denorm.model._meta.swapped: - alldenorms.append(field.denorm) + if ( + hasattr(field, 'denorm') + and not field.denorm.model._meta.swapped + ): + alldenorms.append(field.denorm) return alldenorms @@ -86,10 +86,7 @@ def __init__(self, skip=None): self.skip = skip def get_quote_name(self, using): - if using: - cconnection = connections[using] - else: - cconnection = connection + cconnection = connections[using] if using else connection return cconnection.ops.quote_name def setup(self, **kwargs): @@ -117,7 +114,7 @@ def update(self, instance): # for a many to many field the decorated # function should return a list of either model instances # or primary keys - old_pks = set([x.pk for x in attr.all()]) + old_pks = {x.pk for x in attr.all()} new_pks = set([]) for x in new_value: @@ -164,7 +161,7 @@ def get_triggers(self, using): Creates a list of all triggers needed to keep track of changes to fields this denorm depends on. """ - trigger_list = list() + trigger_list = [] # Get the triggers of all DenormDependency instances attached # to our callback. @@ -227,7 +224,7 @@ def get_triggers(self, using): Creates a list of all triggers needed to keep track of changes to fields this denorm depends on. """ - trigger_list = list() + trigger_list = [] # Get the triggers of all DenormDependency instances attached # to our callback. @@ -362,22 +359,39 @@ def m2m_triggers(self, content_type, fk_name, related_field, using): values=(self.get_related_decrement_value(using),), where=(' AND '.join(related_dec_where), related_where_params), ) - trigger_list = [ - triggers.Trigger(related_field, "after", "update", [related_increment, related_decrement], content_type, + return [ + triggers.Trigger( + related_field, + "after", + "update", + [related_increment, related_decrement], + content_type, + using, + self.skip, + ), + triggers.Trigger( + related_field, + "after", + "insert", + [related_increment], + content_type, using, - self.skip), - triggers.Trigger(related_field, "after", "insert", [related_increment], content_type, using, self.skip), - triggers.Trigger(related_field, "after", "delete", [related_decrement], content_type, using, self.skip), + self.skip, + ), + triggers.Trigger( + related_field, + "after", + "delete", + [related_decrement], + content_type, + using, + self.skip, + ), ] - return trigger_list def get_triggers(self, using): from .db import triggers - if using: - cconnection = connections[using] - else: - cconnection = connection - + cconnection = connections[using] if using else connection qn = self.get_quote_name(using) try: # Django>=1.9 @@ -559,9 +573,12 @@ def rebuildall(verbose=False, model_name=None, field_name=None): except AttributeError: # In Django 1.5 current_model_name = denorm.model.__name__ current_app_model = '%s.%s' % (current_app_label, current_model_name) - if model_name is None or model_name in (current_app_label, current_model_name, current_app_model): - if field_name is None or field_name == denorm.fieldname: - models.setdefault(denorm.model, []).append(denorm) + if ( + model_name is None + or model_name + in (current_app_label, current_model_name, current_app_model) + ) and (field_name is None or field_name == denorm.fieldname): + models.setdefault(denorm.model, []).append(denorm) i = 0 for model, denorms in models.items(): diff --git a/denorm/dependencies.py b/denorm/dependencies.py index dbd1b5ef..d6451382 100644 --- a/denorm/dependencies.py +++ b/denorm/dependencies.py @@ -21,10 +21,7 @@ def get_triggers(self, using): return [] def get_quote_name(self, using): - if using: - cconnection = connections[using] - else: - cconnection = connection + cconnection = connections[using] if using else connection return cconnection.ops.quote_name def setup(self, this_model): diff --git a/denorm/fields.py b/denorm/fields.py index fa8c18d4..1384edfe 100644 --- a/denorm/fields.py +++ b/denorm/fields.py @@ -95,8 +95,7 @@ def deconstruct(self): return name, super_path, args, kwargs def deco(func): - dbfield = DenormDBField(func, *args, **kwargs) - return dbfield + return DenormDBField(func, *args, **kwargs) return deco @@ -315,7 +314,7 @@ def __set__(self, obj, value): cached = self.field.cache.get(key) if not cached: cached = self.field.func(obj) - self.field.cache.set(key, cached, 60 * 60 * 24 * 30) + self.field.cache.set(key, cached, 60**2 * 24 * 30) obj.__dict__[self.field.name] = cached @@ -335,6 +334,5 @@ def contribute_to_class(self, cls, name, *args, **kwargs): def cached(cache, *args, **kwargs): def deco(func): - dbfield = CachedField(func, cache, *args, **kwargs) - return dbfield + return CachedField(func, cache, *args, **kwargs) return deco diff --git a/test_denorm_project/test_app/tests.py b/test_denorm_project/test_app/tests.py index b17256ca..890f4630 100644 --- a/test_denorm_project/test_app/tests.py +++ b/test_denorm_project/test_app/tests.py @@ -314,20 +314,6 @@ def test_middleware(self): # FIXME, this test currently does not work with a transactional # database, so it's skipped for now. return - # FIXME, set and de-set middleware values - f1 = models.Forum.objects.create(title="forumone") - m1 = models.Member.objects.create(first_name="first1", name="last1") - p1 = models.Post.objects.create(forum=f1, author=m1) - - self.assertEqual(models.Post.objects.get(id=p1.id).author_name, "last1") - - self.client.login(username="testuser", password="testuser") - self.client.post("/admin/denorm_testapp/member/%s/" % (m1.pk), { - 'name': 'last2', - 'first_name': 'first2', - }) - - self.assertEqual(models.Post.objects.get(id=p1.id).author_name, "last2") def test_countfield(self): f1 = models.Forum.objects.create(title="forumone")