Skip to content

Commit e09b1bb

Browse files
Merge pull request #7 from sergei-maertens/chore/add-type-checking
🏷️ Add mypy type checking
2 parents 7636d49 + 94e547d commit e09b1bb

File tree

4 files changed

+29
-10
lines changed

4 files changed

+29
-10
lines changed

privates/admin.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional, Sequence, Type
22

33
import django.db.models.options
4+
from django.contrib.admin import AdminSite
45
from django.contrib.auth import get_permission_codename
56
from django.db import models
67
from django.urls import re_path
@@ -39,6 +40,7 @@ class PrivateMediaMixin:
3940
# options passed through to sendfile, as a dict
4041
private_media_view_options: Optional[dict] = None
4142

43+
admin_site: AdminSite
4244
model: Type[models.Model]
4345
opts: django.db.models.options.Options
4446

@@ -99,7 +101,7 @@ def get_private_media_view(self, field: str):
99101
)
100102

101103
def formfield_for_dbfield(self, db_field, request, **kwargs):
102-
field = super().formfield_for_dbfield(db_field, request, **kwargs)
104+
field = super().formfield_for_dbfield(db_field, request, **kwargs) # type: ignore
103105
private_media_fields = self.get_private_media_fields()
104106
if db_field.name in private_media_fields:
105107
# replace the widget
@@ -122,7 +124,7 @@ def _get_private_media_view_name(self, field: str) -> str:
122124
return name
123125

124126
def get_urls(self):
125-
default = super().get_urls()
127+
default = super().get_urls() # type: ignore
126128

127129
extra = []
128130
for field in self.get_private_media_fields():

privates/widgets.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional, Union
1+
from typing import Any, Dict, Optional, Union
22

33
from django.contrib.admin.widgets import AdminFileWidget
44
from django.core.files.uploadedfile import UploadedFile
@@ -13,14 +13,18 @@ def __init__(self, *args, **kwargs):
1313
super().__init__(*args, **kwargs)
1414

1515
def get_context(
16-
self, name: str, value: Optional[Union[FieldFile, UploadedFile]], attrs: dict
16+
self,
17+
name: str,
18+
value: Optional[Union[FieldFile, UploadedFile]],
19+
attrs: Optional[Dict[str, Any]],
1720
):
1821
"""
1922
Return value-related substitutions.
2023
"""
21-
context = super().get_context(name, value, attrs)
22-
if self.is_initial(value):
24+
context = super().get_context(name, value, attrs) # type: ignore
25+
if self.is_initial(value): # type: ignore
2326
if self.download_allowed:
27+
assert isinstance(value, FieldFile)
2428
context["url"] = reverse(
2529
self.url_name, kwargs={"pk": value.instance.pk}
2630
)

setup.cfg

+10-4
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ tests_require =
4242
pyquery
4343
isort
4444
black
45+
django-stubs[compatible-mypy]
4546

4647
[options.extras_require]
4748
tests =
@@ -53,6 +54,7 @@ tests =
5354
pyquery
5455
isort
5556
black
57+
django-stubs[compatible-mypy]
5658
pep8 = flake8
5759
coverage = pytest-cov
5860
docs =
@@ -110,8 +112,12 @@ exclude=env,.tox,doc
110112
max-line-length=119
111113
exclude=env,.tox,doc
112114

113-
[zest.releaser]
114-
create-wheel = True
115+
[mypy]
116+
plugins =
117+
mypy_django_plugin.main
115118

116-
[distutils]
117-
index-servers = pypi
119+
[mypy.plugins.django-stubs]
120+
django_settings_module = "testapp.settings"
121+
122+
[mypy-django_sendfile]
123+
ignore_missing_imports = True

tox.ini

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ envlist =
55
isort
66
black
77
docs
8+
py{38,39,310}-django{32,41,42}-mypy
9+
py311-django{41,42}-mypy
810
skip_missing_interpreters = true
911

1012
[gh-actions]
@@ -59,3 +61,8 @@ commands=
5961
py.test check_sphinx.py -v \
6062
--tb=auto \
6163
{posargs}
64+
65+
[testenv:py{38,39,310,311,312}-django{32,41,42}-mypy]
66+
extras = tests
67+
skipsdist = True
68+
commands = mypy privates

0 commit comments

Comments
 (0)