Skip to content

Commit 8ea5499

Browse files
committed
Add missing type hints
1 parent d50ee75 commit 8ea5499

13 files changed

+178
-166
lines changed

django_afip/factories.py

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def get_test_file(filename: str, mode: str = "r") -> Path:
2323
return Path(__file__).parent / "testing" / filename
2424

2525

26-
class UserFactory(DjangoModelFactory):
26+
class UserFactory(DjangoModelFactory[User]):
2727
class Meta:
2828
model = User
2929

@@ -37,7 +37,7 @@ class SuperUserFactory(UserFactory):
3737
is_superuser = True
3838

3939

40-
class ConceptTypeFactory(DjangoModelFactory):
40+
class ConceptTypeFactory(DjangoModelFactory[models.ConceptType]):
4141
class Meta:
4242
model = models.ConceptType
4343
django_get_or_create = ("code",)
@@ -47,7 +47,7 @@ class Meta:
4747
valid_from = date(2010, 9, 17)
4848

4949

50-
class DocumentTypeFactory(DjangoModelFactory):
50+
class DocumentTypeFactory(DjangoModelFactory[models.DocumentType]):
5151
class Meta:
5252
model = models.DocumentType
5353

@@ -56,7 +56,7 @@ class Meta:
5656
valid_from = date(2008, 7, 25)
5757

5858

59-
class CurrencyTypeFactory(DjangoModelFactory):
59+
class CurrencyTypeFactory(DjangoModelFactory[models.CurrencyType]):
6060
class Meta:
6161
model = models.CurrencyType
6262

@@ -65,7 +65,7 @@ class Meta:
6565
valid_from = date(2009, 4, 3)
6666

6767

68-
class ReceiptTypeFactory(DjangoModelFactory):
68+
class ReceiptTypeFactory(DjangoModelFactory[models.ReceiptType]):
6969
class Meta:
7070
model = models.ReceiptType
7171
django_get_or_create = ("code",)
@@ -75,7 +75,7 @@ class Meta:
7575
valid_from = date(2011, 3, 30)
7676

7777

78-
class TaxPayerFactory(DjangoModelFactory):
78+
class TaxPayerFactory(DjangoModelFactory[models.TaxPayer]):
7979
class Meta:
8080
model = models.TaxPayer
8181
django_get_or_create = ("cuit",)
@@ -89,7 +89,7 @@ class Meta:
8989
logo = ImageField(from_path=get_test_file("tiny.png", "rb"))
9090

9191

92-
class AlternateTaxpayerFactory(DjangoModelFactory):
92+
class AlternateTaxpayerFactory(DjangoModelFactory[models.TaxPayer]):
9393
"""A taxpayer with an alternate (valid) keypair."""
9494

9595
class Meta:
@@ -103,7 +103,7 @@ class Meta:
103103
active_since = datetime(2011, 10, 3)
104104

105105

106-
class PointOfSalesFactory(DjangoModelFactory):
106+
class PointOfSalesFactory(DjangoModelFactory[models.PointOfSales]):
107107
class Meta:
108108
model = models.PointOfSales
109109
django_get_or_create = (
@@ -124,7 +124,7 @@ class Meta:
124124
sales_terms = "Credit Card"
125125

126126

127-
class ClientVatConditionFactory(DjangoModelFactory):
127+
class ClientVatConditionFactory(DjangoModelFactory[models.ClientVatCondition]):
128128
class Meta:
129129
model = models.ClientVatCondition
130130
django_get_or_create = ("code",)
@@ -134,7 +134,7 @@ class Meta:
134134
cmp_clase = "B,C"
135135

136136

137-
class ReceiptFactory(DjangoModelFactory):
137+
class ReceiptFactory(DjangoModelFactory[models.Receipt]):
138138
class Meta:
139139
model = models.Receipt
140140

@@ -155,7 +155,7 @@ class Meta:
155155
class ReceiptWithVatAndTaxFactory(ReceiptFactory):
156156
"""Receipt with a valid Vat and Tax, ready to validate."""
157157

158-
point_of_sales = LazyFunction(lambda: models.PointOfSales.objects.first())
158+
point_of_sales = LazyFunction(lambda: models.PointOfSales.objects.first()) # type: ignore[assignment]
159159
client_vat_condition = SubFactory(ClientVatConditionFactory)
160160

161161
@post_generation
@@ -222,7 +222,7 @@ def post(obj: models.Receipt, create: bool, extracted: None, **kwargs) -> None:
222222
ReceiptValidationFactory(receipt=obj)
223223

224224

225-
class ReceiptValidationFactory(DjangoModelFactory):
225+
class ReceiptValidationFactory(DjangoModelFactory[models.ReceiptValidation]):
226226
class Meta:
227227
model = models.ReceiptValidation
228228

@@ -233,7 +233,7 @@ class Meta:
233233
receipt = SubFactory(ReceiptFactory, receipt_number=17)
234234

235235

236-
class ReceiptPDFFactory(DjangoModelFactory):
236+
class ReceiptPDFFactory(DjangoModelFactory[models.ReceiptPDF]):
237237
class Meta:
238238
model = models.ReceiptPDF
239239

@@ -256,7 +256,7 @@ def post(obj: models.ReceiptPDF, create: bool, extracted: None, **kwargs) -> Non
256256
obj.save_pdf(save_model=True)
257257

258258

259-
class GenericAfipTypeFactory(DjangoModelFactory):
259+
class GenericAfipTypeFactory(DjangoModelFactory[models.GenericAfipType]):
260260
class Meta:
261261
model = models.GenericAfipType
262262

@@ -265,28 +265,34 @@ class Meta:
265265
valid_from = datetime(2017, 8, 10)
266266

267267

268-
class VatTypeFactory(GenericAfipTypeFactory):
268+
class VatTypeFactory(DjangoModelFactory[models.VatType]):
269269
class Meta:
270270
model = models.VatType
271271

272272
code = 5
273273
description = "21%"
274+
valid_from = datetime(2017, 8, 10)
274275

275276

276-
class TaxTypeFactory(GenericAfipTypeFactory):
277+
class TaxTypeFactory(DjangoModelFactory[models.TaxType]):
277278
class Meta:
278279
model = models.TaxType
279280

281+
code = 80
282+
description = "CUIT"
283+
valid_from = datetime(2017, 8, 10)
284+
280285

281-
class OptionalTypeFactory(GenericAfipTypeFactory):
286+
class OptionalTypeFactory(DjangoModelFactory[models.OptionalType]):
282287
class Meta:
283288
model = models.OptionalType
284289

285290
code = 2101
286291
description = "Excepcion computo IVA Credito Fiscal"
292+
valid_from = datetime(2017, 8, 10)
287293

288294

289-
class VatFactory(DjangoModelFactory):
295+
class VatFactory(DjangoModelFactory[models.Vat]):
290296
class Meta:
291297
model = models.Vat
292298

@@ -296,7 +302,7 @@ class Meta:
296302
vat_type = SubFactory(VatTypeFactory)
297303

298304

299-
class TaxFactory(DjangoModelFactory):
305+
class TaxFactory(DjangoModelFactory[models.Tax]):
300306
class Meta:
301307
model = models.Tax
302308

@@ -308,7 +314,7 @@ class Meta:
308314
tax_type = SubFactory(TaxTypeFactory)
309315

310316

311-
class OptionalFactory(DjangoModelFactory):
317+
class OptionalFactory(DjangoModelFactory[models.Optional]):
312318
class Meta:
313319
model = models.Optional
314320

@@ -318,7 +324,7 @@ class Meta:
318324
optional_type = SubFactory(OptionalTypeFactory)
319325

320326

321-
class ReceiptEntryFactory(DjangoModelFactory):
327+
class ReceiptEntryFactory(DjangoModelFactory[models.ReceiptEntry]):
322328
class Meta:
323329
model = models.ReceiptEntry
324330

django_afip/migrations/0001_squashed_0036_receiptpdf__client_address__blank.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from __future__ import annotations
22

3+
from typing import ClassVar
4+
35
import django.db.models.deletion
46
from django.db import migrations
57
from django.db import models
@@ -49,7 +51,7 @@ class Migration(migrations.Migration):
4951

5052
initial = True
5153

52-
dependencies: list = []
54+
dependencies: ClassVar[list] = []
5355

5456
operations = [
5557
migrations.CreateModel(

django_afip/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1890,7 +1890,7 @@ class Meta:
18901890
verbose_name_plural = _("receipt validations")
18911891

18921892

1893-
class ClientVatConditionManager(models.Manager):
1893+
class ClientVatConditionManager(models.Manager["ClientVatCondition"]):
18941894
"""Manager for ClientVatCondition.
18951895
18961896
This class is only used to provide natural key support for the

tests/conftest.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
def disable_durability_check() -> Generator[None, None, None]:
2525
with patch(
2626
"django_afip.models.ReceiptQuerySet._ensure_durability",
27-
False,
28-
spec=True,
27+
new=False,
2928
):
3029
yield
3130

@@ -54,7 +53,7 @@ def expired_key() -> bytes:
5453
@pytest.fixture
5554
def live_taxpayer(db: None) -> models.TaxPayer:
5655
"""Return a taxpayer usable with AFIP's test servers."""
57-
return TaxPayerFactory(pk=1)
56+
return TaxPayerFactory.create(pk=1)
5857

5958

6059
@pytest.fixture

tests/test_admin.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def test_certificate_auth_error() -> None:
8484

8585

8686
def test_without_key(admin_client: Client) -> None:
87-
taxpayer = factories.TaxPayerFactory(key=None)
87+
taxpayer = factories.TaxPayerFactory.create(key=None)
8888

8989
response = admin_client.post(
9090
"/admin/afip/taxpayer/",
@@ -101,7 +101,7 @@ def test_without_key(admin_client: Client) -> None:
101101

102102

103103
def test_with_key(admin_client: Client) -> None:
104-
taxpayer = factories.TaxPayerFactory(key=FileField(data=b"Blah"))
104+
taxpayer = factories.TaxPayerFactory.create(key=FileField(data=b"Blah"))
105105

106106
response = admin_client.post(
107107
"/admin/afip/taxpayer/",
@@ -121,7 +121,7 @@ def test_with_key(admin_client: Client) -> None:
121121

122122

123123
def test_admin_taxpayer_request_generation_with_csr(admin_client: Client) -> None:
124-
taxpayer = factories.TaxPayerFactory(key=None)
124+
taxpayer = factories.TaxPayerFactory.create(key=None)
125125
taxpayer.generate_key()
126126

127127
response = admin_client.post(
@@ -139,7 +139,7 @@ def test_admin_taxpayer_request_generation_with_csr(admin_client: Client) -> Non
139139

140140

141141
def test_admin_taxpayer_request_generation_without_key(admin_client: Client) -> None:
142-
taxpayer = factories.TaxPayerFactory(key=None)
142+
taxpayer = factories.TaxPayerFactory.create(key=None)
143143
taxpayer.generate_key()
144144

145145
response = admin_client.post(
@@ -159,8 +159,8 @@ def test_admin_taxpayer_request_generation_without_key(admin_client: Client) ->
159159
def test_admin_taxpayer_request_generation_multiple_taxpayers(
160160
admin_client: Client,
161161
) -> None:
162-
taxpayer1 = factories.TaxPayerFactory(key__data=b"Blah")
163-
taxpayer2 = factories.TaxPayerFactory(key__data=b"Blah", cuit="20401231230")
162+
taxpayer1 = factories.TaxPayerFactory.create(key__data=b"Blah")
163+
taxpayer2 = factories.TaxPayerFactory.create(key__data=b"Blah", cuit="20401231230")
164164

165165
response = admin_client.post(
166166
"/admin/afip/taxpayer/",
@@ -181,12 +181,12 @@ def test_validation_filters(admin_client: Client) -> None:
181181
182182
This filters receipts by the validation status.
183183
"""
184-
validated_receipt = factories.ReceiptFactory()
185-
failed_validation_receipt = factories.ReceiptFactory()
186-
not_validated_receipt = factories.ReceiptFactory()
184+
validated_receipt = factories.ReceiptFactory.create()
185+
failed_validation_receipt = factories.ReceiptFactory.create()
186+
not_validated_receipt = factories.ReceiptFactory.create()
187187

188-
factories.ReceiptValidationFactory(receipt=validated_receipt)
189-
factories.ReceiptValidationFactory(
188+
factories.ReceiptValidationFactory.create(receipt=validated_receipt)
189+
factories.ReceiptValidationFactory.create(
190190
result=models.ReceiptValidation.RESULT_REJECTED,
191191
receipt=failed_validation_receipt,
192192
)
@@ -258,15 +258,15 @@ def test_validation_filters(admin_client: Client) -> None:
258258
def test_receipt_admin_get_exclude() -> None:
259259
admin = ReceiptAdmin(models.Receipt, site)
260260
request = RequestFactory().get("/admin/afip/receipt")
261-
request.user = factories.UserFactory()
261+
request.user = factories.UserFactory.create()
262262

263263
assert "related_receipts" in admin.get_fields(request)
264264

265265

266266
@pytest.mark.django_db
267267
def test_receipt_pdf_factories_and_files() -> None:
268-
with_file = factories.ReceiptPDFWithFileFactory()
269-
without_file = factories.ReceiptPDFFactory()
268+
with_file = factories.ReceiptPDFWithFileFactory.create()
269+
without_file = factories.ReceiptPDFFactory.create()
270270

271271
assert not without_file.pdf_file
272272
assert with_file.pdf_file
@@ -279,8 +279,8 @@ def test_has_file_filter_all(admin_client: Client) -> None:
279279
object's change page is present, since no matter how we reformat the rows,
280280
this will always be present as long as the object is listed.
281281
"""
282-
with_file = factories.ReceiptPDFWithFileFactory()
283-
without_file = factories.ReceiptPDFFactory()
282+
with_file = factories.ReceiptPDFWithFileFactory.create()
283+
without_file = factories.ReceiptPDFFactory.create()
284284

285285
response = admin_client.get("/admin/afip/receiptpdf/")
286286
assert isinstance(response, HttpResponse)
@@ -289,8 +289,8 @@ def test_has_file_filter_all(admin_client: Client) -> None:
289289

290290

291291
def test_has_file_filter_with_file(admin_client: Client) -> None:
292-
with_file = factories.ReceiptPDFWithFileFactory()
293-
without_file = factories.ReceiptPDFFactory()
292+
with_file = factories.ReceiptPDFWithFileFactory.create()
293+
without_file = factories.ReceiptPDFFactory.create()
294294

295295
response = admin_client.get("/admin/afip/receiptpdf/?has_file=yes")
296296
assert isinstance(response, HttpResponse)
@@ -299,8 +299,8 @@ def test_has_file_filter_with_file(admin_client: Client) -> None:
299299

300300

301301
def test_has_file_filter_without_file(admin_client: Client) -> None:
302-
with_file = factories.ReceiptPDFWithFileFactory()
303-
without_file = factories.ReceiptPDFFactory()
302+
with_file = factories.ReceiptPDFWithFileFactory.create()
303+
without_file = factories.ReceiptPDFFactory.create()
304304

305305
response = admin_client.get("/admin/afip/receiptpdf/?has_file=no")
306306
assert isinstance(response, HttpResponse)
@@ -309,7 +309,7 @@ def test_has_file_filter_without_file(admin_client: Client) -> None:
309309

310310

311311
def test_validate_certs_action_success(admin_client: Client) -> None:
312-
receipt = factories.ReceiptFactory()
312+
receipt = factories.ReceiptFactory.create()
313313

314314
with patch(
315315
"django_afip.models.ReceiptQuerySet.validate", spec=True, return_value=[]
@@ -326,7 +326,7 @@ def test_validate_certs_action_success(admin_client: Client) -> None:
326326

327327

328328
def test_validate_certs_action_errors(admin_client: Client) -> None:
329-
receipt = factories.ReceiptFactory()
329+
receipt = factories.ReceiptFactory.create()
330330

331331
with patch(
332332
"django_afip.models.ReceiptQuerySet.validate",
@@ -350,8 +350,8 @@ def test_validate_certs_action_errors(admin_client: Client) -> None:
350350

351351

352352
def test_admin_fetch_points_of_sales(admin_client: Client) -> None:
353-
taxpayer1 = factories.TaxPayerFactory()
354-
taxpayer2 = factories.TaxPayerFactory(cuit="20401231230")
353+
taxpayer1 = factories.TaxPayerFactory.create()
354+
taxpayer2 = factories.TaxPayerFactory.create(cuit="20401231230")
355355
with patch(
356356
"django_afip.models.TaxPayer.fetch_points_of_sales",
357357
spec=True,

tests/test_gentestkey.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def test_generate_test_csr() -> None:
1818
"""
1919

2020
# This one is used for most tests.
21-
taxpayer = factories.TaxPayerFactory(is_sandboxed=True)
21+
taxpayer = factories.TaxPayerFactory.create(is_sandboxed=True)
2222

2323
csr = taxpayer.generate_csr("wsfe")
2424
with open("test.csr", "wb") as f:
2525
f.write(csr.read())
2626

2727
# This one is used for the `test_authentication_with_bad` test.
28-
taxpayer = factories.AlternateTaxpayerFactory(is_sandboxed=True)
28+
taxpayer = factories.AlternateTaxpayerFactory.create(is_sandboxed=True)
2929

3030
csr = taxpayer.generate_csr("wsfe")
3131
with open("test2.csr", "wb") as f:

0 commit comments

Comments
 (0)