Skip to content

Commit 0d84170

Browse files
ref: get proper base manager typing
1 parent 3dc95d7 commit 0d84170

File tree

9 files changed

+23
-19
lines changed

9 files changed

+23
-19
lines changed

requirements-dev-frozen.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ selenium==4.16.0
180180
sentry-arroyo==2.16.5
181181
sentry-cli==2.16.0
182182
sentry-devenv==1.7.0
183-
sentry-forked-django-stubs==5.0.2.post7
183+
sentry-forked-django-stubs==5.0.2.post8
184184
sentry-forked-djangorestframework-stubs==3.15.0.post1
185185
sentry-kafka-schemas==0.1.101
186186
sentry-ophio==0.2.7

requirements-dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ pip-tools>=7.1.0
3535
packaging>=21.3
3636

3737
# for type checking
38-
sentry-forked-django-stubs>=5.0.2.post7
38+
sentry-forked-django-stubs>=5.0.2.post8
3939
sentry-forked-djangorestframework-stubs>=3.15.0.post1
4040
lxml-stubs
4141
msgpack-types>=0.2.0

src/sentry/backup/imports.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def _clear_model_tables_before_import():
7272
for model in reversed:
7373
using = router.db_for_write(model)
7474
manager = model.with_deleted if issubclass(model, ParanoidModel) else model.objects
75-
manager.all().delete() # type: ignore[attr-defined]
75+
manager.all().delete()
7676

7777
# TODO(getsentry/team-ospo#190): Remove the "Node" kludge below in favor of a more permanent
7878
# solution.

src/sentry/db/models/manager/base.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
from collections.abc import Callable, Collection, Generator, Mapping, MutableMapping, Sequence
77
from contextlib import contextmanager
88
from enum import IntEnum, auto
9-
from typing import Any, Generic
9+
from typing import Any
1010

1111
from django.conf import settings
1212
from django.db import models, router
1313
from django.db.models import Model
1414
from django.db.models.fields import Field
15-
from django.db.models.manager import BaseManager as DjangoBaseManager
15+
from django.db.models.manager import Manager as DjangoBaseManager
1616
from django.db.models.signals import class_prepared, post_delete, post_init, post_save
1717
from django.utils.encoding import smart_str
1818

@@ -69,7 +69,10 @@ def make_key(model: Any, prefix: str, kwargs: Mapping[str, Model | int | str]) -
6969
return f"{prefix}:{model.__name__}:{md5_text(kwargs_bits_str).hexdigest()}"
7070

7171

72-
class BaseManager(DjangoBaseManager.from_queryset(BaseQuerySet), Generic[M]): # type: ignore[misc]
72+
_base_manager_base = DjangoBaseManager.from_queryset(BaseQuerySet, "_base_manager_base")
73+
74+
75+
class BaseManager(_base_manager_base[M]):
7376
lookup_handlers = {"iexact": lambda x: x.upper()}
7477
use_for_related_fields = True
7578

src/sentry/models/files/abstractfile.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,8 @@ class Meta:
219219

220220
def _get_chunked_blob(self, mode=None, prefetch=False, prefetch_to=None, delete=True):
221221
return ChunkedFileBlobIndexWrapper(
222-
self.FILE_BLOB_INDEX_MODEL.objects.filter(file=self)
222+
# TODO: file blob inheritance hierarchy is unsound
223+
self.FILE_BLOB_INDEX_MODEL.objects.filter(file=self) # type: ignore[misc]
223224
.select_related("blob")
224225
.order_by("offset"),
225226
mode=mode,
@@ -295,7 +296,8 @@ def putfile(self, fileobj, blob_size=DEFAULT_BLOB_SIZE, commit=True, logger=noop
295296
blob_fileobj = ContentFile(contents)
296297
blob = self.FILE_BLOB_MODEL.from_file(blob_fileobj, logger=logger)
297298
results.append(
298-
self.FILE_BLOB_INDEX_MODEL.objects.create(file=self, blob=blob, offset=offset)
299+
# TODO: file blob inheritance hierarchy is unsound
300+
self.FILE_BLOB_INDEX_MODEL.objects.create(file=self, blob=blob, offset=offset) # type: ignore[misc]
299301
)
300302
offset += blob.size
301303
self.size = offset
@@ -334,7 +336,8 @@ def assemble_from_file_blob_ids(self, file_blob_ids, checksum):
334336
offset = 0
335337
for blob in file_blobs:
336338
try:
337-
self.FILE_BLOB_INDEX_MODEL.objects.create(file=self, blob=blob, offset=offset)
339+
# TODO: file blob inheritance hierarchy is unsound
340+
self.FILE_BLOB_INDEX_MODEL.objects.create(file=self, blob=blob, offset=offset) # type: ignore[misc]
338341
except IntegrityError:
339342
# Most likely a `ForeignKeyViolation` like `SENTRY-11P5`, because
340343
# the blob we want to link does not exist anymore

src/sentry/models/files/abstractfileblob.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ def _ensure_blob_owned(blob):
9292
return
9393
try:
9494
with atomic_transaction(using=router.db_for_write(cls.FILE_BLOB_OWNER_MODEL)):
95-
cls.FILE_BLOB_OWNER_MODEL.objects.create(
95+
# TODO: file blob inheritance hierarchy is unsound
96+
cls.FILE_BLOB_OWNER_MODEL.objects.create( # type: ignore[misc]
9697
organization_id=organization.id, blob=blob
9798
)
9899
except IntegrityError:

src/sentry/organizations/services/organization/impl.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,7 @@ def get_or_create_team_member(
475475

476476
def update_membership_flags(self, *, organization_member: RpcOrganizationMember) -> None:
477477
model = OrganizationMember.objects.get(id=organization_member.id)
478-
model.flags = self._deserialize_member_flags(organization_member.flags)
478+
model.flags = self._deserialize_member_flags(organization_member.flags) # type: ignore[assignment] # TODO: make BitField a mypy plugin
479479
model.save()
480480

481481
@classmethod
@@ -518,7 +518,7 @@ def merge_users(self, *, organization_id: int, from_user_id: int, to_user_id: in
518518
return
519519

520520
if to_member is None:
521-
to_member = OrganizationMember.objects.create(
521+
to_member = OrganizationMember.objects.create( # type: ignore[misc] # TODO: make BitField a mypy plugin
522522
organization_id=organization_id,
523523
user_id=to_user_id,
524524
role=from_member.role,

src/sentry/reprocessing2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ def start_group_reprocessing(
547547

548548
# Create a duplicate row that has the same attributes by nulling out
549549
# the primary key and saving
550-
group.pk = group.id = None
550+
group.pk = group.id = None # type: ignore[assignment] # XXX: intentional resetting pk
551551
new_group = group # rename variable just to avoid confusion
552552
del group
553553
new_group.status = original_status

tests/sentry/db/test_transactions.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from unittest.mock import patch
33

44
import pytest
5-
from django.db import IntegrityError, router, transaction
5+
from django.db import router, transaction
66
from django.test import override_settings
77

88
from sentry.db.postgres.transactions import (
@@ -30,11 +30,8 @@ def test_collect_transaction_queries(self):
3030
User.objects.filter(username="user1").first()
3131

3232
with transaction.atomic(using=router.db_for_write(Organization)):
33-
try:
34-
with transaction.atomic(using=router.db_for_write(Organization)):
35-
Organization.objects.create(name=None)
36-
except (IntegrityError, MaxSnowflakeRetryError):
37-
pass
33+
with pytest.raises(MaxSnowflakeRetryError):
34+
Organization.objects.create(name=None) # type: ignore[misc] # intentional to trigger error
3835

3936
with transaction.atomic(using=router.db_for_write(Organization)):
4037
Organization.objects.create(name="org3")

0 commit comments

Comments
 (0)