Skip to content

Commit

Permalink
Merge dc222db into f12ef29
Browse files Browse the repository at this point in the history
  • Loading branch information
charettes committed Mar 30, 2021
2 parents f12ef29 + dc222db commit 9715dbe
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 6 deletions.
13 changes: 13 additions & 0 deletions seal/descriptors.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,3 +206,16 @@ def related_manager_cls(self):
GenericForeignKey: SealableGenericForeignKey,
ReverseGenericManyToOneDescriptor: SealableReverseGenericManyToOneDescriptor,
}

# XXX: Remove import error handling when dropping support for Django < 3.0.
try:
from django.db.models.fields.related_descriptors import (
ForeignKeyDeferredAttribute,
)
except ImportError:
pass
else:
class SealableForeignKeyDeferredAttribute(SealableDeferredAttribute, ForeignKeyDeferredAttribute):
pass

sealable_descriptor_classes[ForeignKeyDeferredAttribute] = SealableForeignKeyDeferredAttribute
5 changes: 4 additions & 1 deletion seal/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,10 @@ def make_model_sealable(model):
"""
opts = model._meta
for field in (opts.local_fields + opts.local_many_to_many + opts.private_fields):
make_descriptor_sealable(model, field.name)
name = field.name
attnames = {name, getattr(field, 'attname', name)}
for attname in attnames:
make_descriptor_sealable(model, attname)
remote_field = field.remote_field
if remote_field:
# Use lazy_related_operation because lazy relationships might not
Expand Down
7 changes: 7 additions & 0 deletions tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,13 @@ def test_sealed_instance_deferred_attribute_access(self):
with self.assertRaisesMessage(UnsealedAttributeAccess, message):
instance.weight

def test_sealed_instance_deferred_foreign_key_attribute_access(self):
instance = SeaLion.from_db('default', ['id'], [1])
instance.seal()
message = 'Attempt to fetch deferred field "location_id" on sealed <SeaLion instance>'
with self.assertRaisesMessage(UnsealedAttributeAccess, message):
instance.location_id

def test_sealed_instance_foreign_key_access(self):
instance = SeaLion.from_db('default', ['id', 'location_id'], [1, 1])
instance.seal()
Expand Down
10 changes: 5 additions & 5 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ args_are_paths = false
envlist =
flake8,
isort,
py36-{2.2,3.0,3.1,3.2,master},
py37-{2.2,3.0,3.1,3.2,master},
py38-{2.2,3.1,3.2,master},
py39-{2.2,3.1,3.2,master},
py36-{2.2,3.0,3.1,3.2},
py37-{2.2,3.0,3.1,3.2},
py38-{2.2,3.1,3.2,main},
py39-{2.2,3.1,3.2,main},

[gh-actions]
python =
Expand All @@ -32,7 +32,7 @@ deps =
3.0: Django>=3.0,<3.1
3.1: Django>=3.1,<3.2
3.2: Django>=3.2a1,<4
master: https://github.com/django/django/archive/master.tar.gz
main: https://github.com/django/django/archive/main.tar.gz
passenv =
GITHUB_*

Expand Down

0 comments on commit 9715dbe

Please sign in to comment.