Skip to content

Commit e8e21ef

Browse files
authored
Upgrade django 3.2.25 (#22)
* Added deprecations command to makefile * Fixed assertDictContainsSubset deprecation warning * Generated openapi schema * Added flake8 file * 120 line length editorconfig file * Fix old docker-compose examples
1 parent ae3e8a3 commit e8e21ef

File tree

7 files changed

+797
-50
lines changed

7 files changed

+797
-50
lines changed

.editorconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ insert_final_newline = true
2323
indent_size = 2
2424
# Python config
2525
[*.py]
26-
max_line_length = 100
26+
max_line_length = 120

.flake8

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[flake8]
2+
exclude =
3+
.git,
4+
.github
5+
.vscode
6+
__pycache__,
7+
build
8+
environment
9+
max-complexity = 10
10+
max-line-length = 120

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
.PHONY: shell, test, dev, start, build, migrate, shell_plus
22

33
PROJECT_NAME=django_atomic_transactions
4-
DOCKER_COMPOSE=docker-compose -p ${PROJECT_NAME} -f environment/docker-compose.yml
4+
DOCKER_COMPOSE=docker compose -p ${PROJECT_NAME} -f environment/docker-compose.yml
55
DOCKER_COMPOSE_RUN_WEB=${DOCKER_COMPOSE} run --rm
66

77
default: build
@@ -27,6 +27,9 @@ uvicorn:
2727
test: build
2828
${DOCKER_COMPOSE_RUN_WEB} web python manage.py test --failfast api
2929

30+
deprecations: build migrate
31+
${DOCKER_COMPOSE_RUN_WEB} web python -Wa manage.py test --failfast api
32+
3033
shell:
3134
${DOCKER_COMPOSE_RUN_WEB} web ash
3235

README.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ Only superusers could change wallet balance.
88

99
## Requirements
1010

11+
### Old docker implementations
12+
1113
* docker engine >= 19.03.
1214
* docker-compose >= 1.27.
1315

14-
## Tested on
16+
### New docker with docker-compose integrated
1517

16-
* Ubuntu 18.04 (Bionic).
17-
* docker engine == 20.10.9.
18-
* docker-compose == 1.28.4.
18+
* docker version >= 28.3.3
1919

2020
## How to use this project?
2121

@@ -69,20 +69,20 @@ make loaddata
6969
make tests
7070
```
7171

72-
### Using docker-compose
72+
### Using docker compose
7373

7474
#### Step 1: Build
7575

7676
```shell
77-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml build
77+
docker compose -p django_atomic_transactions -f environment/docker compose.yml build
7878
```
7979

8080
#### Step 2: Migrate
8181

8282
Apply django migrations:
8383

8484
```shell
85-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml run --rm --service-ports web migrate
85+
docker compose -p django_atomic_transactions -f environment/docker compose.yml run --rm --service-ports web migrate
8686
```
8787

8888
#### Step 3: Run service
@@ -92,29 +92,29 @@ docker-compose -p django_atomic_transactions -f environment/docker-compose.yml r
9292
Run django runserver command:
9393

9494
```shell
95-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml run --rm --service-ports web dev
95+
docker compose -p django_atomic_transactions -f environment/docker compose.yml run --rm --service-ports web dev
9696
```
9797

9898
* **Uvicorn**
9999

100100
Run uvicorn server:
101101

102102
```shell
103-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml run --rm --service-ports web uvicorn
103+
docker compose -p django_atomic_transactions -f environment/docker compose.yml run --rm --service-ports web uvicorn
104104
```
105105

106106
#### Step 4: Load sample data
107107

108108
Apply `initial_data.json` fixture. This action will erase all previous data:
109109

110110
```shell
111-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml run --rm --service-ports web loaddata
111+
docker compose -p django_atomic_transactions -f environment/docker compose.yml run --rm --service-ports web loaddata
112112
```
113113

114114
#### Step 5: Run tests
115115

116116
```shell
117-
docker-compose -p django_atomic_transactions -f environment/docker-compose.yml run --rm --service-ports web python manage.py test --failfast api
117+
docker compose -p django_atomic_transactions -f environment/docker compose.yml run --rm --service-ports web python manage.py test --failfast api
118118
```
119119

120120
## Know issues
@@ -154,4 +154,4 @@ This will improve performance.
154154
...
155155

156156
Are you here yet? OK, nice one. I should invite you to a cup of coffee.
157-
Just give me your wallet username and password to get in touch hehehe (yep, a simple joke).
157+
Just give me your wallet username and password to get in touch hehehe (yep, a silly joke).

src/api/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ class ClientAccountSerializer(serializers.ModelSerializer):
2626

2727
def __init__(self, instance=None, data=empty, **kwargs):
2828
super().__init__(instance, data, **kwargs)
29-
if self.context.get('request').user.is_staff:
29+
request = self.context.get('request')
30+
31+
if request and request.user.is_staff:
3032
self.Meta.exclude = ()
3133
else:
3234
self.Meta.exclude = ('user_account',)

src/api/tests.py

Lines changed: 71 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
1-
from typing import Optional, List
2-
31
import re
2+
from typing import List, Optional
3+
44
from django.contrib.auth.models import User
55
from django.test import TransactionTestCase
6+
from faker import Faker
67
from rest_framework.reverse import reverse
78
from rest_framework.test import APITestCase
89

910
from api.models import ClientAccount, ClientWallet, ClientWalletTransaction
1011

11-
from faker import Faker
12-
1312

1413
# api.tests.ClientAccountApiTests.test_create_regular_user_and_sign_in
1514
class CommonApiTests(APITestCase):
@@ -31,11 +30,6 @@ def create_user_auth(
3130
user.save()
3231
return user
3332

34-
# group, is_created = Group.objects.get_or_create(name='testgroup')
35-
# user.groups.add(group)
36-
# for perm in Permission.objects.all():
37-
# group.permissions.add(perm)
38-
3933
def create_client_account(
4034
self, name: Optional[str] = default_user_username,
4135
surname: Optional[str] = default_user_username,
@@ -62,18 +56,6 @@ def create_client_transaction(
6256
amount=amount,
6357
client_wallet_account=client_wallet, **kwargs
6458
)
65-
# def create_user_auth(cls):
66-
# user, is_created = User.objects.get_or_create(username='testuser')
67-
# user.set_password('aaa')
68-
# user.is_staff = True
69-
# user.is_active = True
70-
# user.is_superuser = True
71-
# user.save()
72-
#
73-
# group, is_created = Group.objects.get_or_create(name='testgroup')
74-
# user.groups.add(group)
75-
# for perm in Permission.objects.all():
76-
# group.permissions.add(perm)
7759

7860
def set_url(self, name: str, kwargs: object = None) -> None:
7961
self.url = reverse(name, kwargs=kwargs)
@@ -128,7 +110,11 @@ def test_create_regular_user_and_sign_in(self):
128110
self.set_url('api:user_api-list')
129111
response = self.client.post(self.url, data=payload, format='json')
130112
self.assertEqual(201, response.status_code)
131-
self.assertDictContainsSubset(response_data, response.json())
113+
114+
response_data_unique_items = set(response_data.items())
115+
response_json_unique_items = set(response.json().items())
116+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
117+
132118
self.assertTrue(
133119
self.client.login(username=payload.get('username'), password=payload.get('password')),
134120
msg='Login error'
@@ -151,7 +137,11 @@ def test_create_staff_user_and_sign_in(self):
151137
self.set_url('api:user_api-list')
152138
response = self.client.post(self.url, data=payload, format='json')
153139
self.assertEqual(201, response.status_code)
154-
self.assertDictContainsSubset(response_data, response.json())
140+
141+
response_data_unique_items = set(response_data.items())
142+
response_json_unique_items = set(response.json().items())
143+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
144+
155145
self.assertTrue(
156146
self.client.login(username=payload.get('username'), password=payload.get('password')),
157147
msg='Login error'
@@ -183,7 +173,10 @@ def test_update_regular_user(self):
183173
self.set_url('api:user_api-detail', kwargs=api_url_params)
184174
response = self.client.patch(self.url, data=payload, format='json')
185175
self.assertEqual(200, response.status_code)
186-
self.assertDictContainsSubset(response_data, response.json())
176+
177+
response_data_unique_items = set(response_data.items())
178+
response_json_unique_items = set(response.json().items())
179+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
187180

188181
def test_update_staff_user(self):
189182
username_password = self.fake.unique.name().lower().replace(' ', '_')
@@ -212,7 +205,10 @@ def test_update_staff_user(self):
212205

213206
response = self.client.patch(self.url, data=payload, format='json')
214207
self.assertEqual(200, response.status_code)
215-
self.assertDictContainsSubset(response_data, response.json())
208+
209+
response_data_unique_items = set(response_data.items())
210+
response_json_unique_items = set(response.json().items())
211+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
216212

217213

218214
class ClientAccountApiTests(CommonApiTests):
@@ -261,7 +257,11 @@ def test_create_as_regular_user(self):
261257
self.set_url('api:client_api-list')
262258
response = self.client.post(self.url, data=payload, format='json')
263259
self.assertEqual(201, response.status_code)
264-
self.assertDictContainsSubset(payload, response.json())
260+
261+
payload_unique_items = set(payload.items())
262+
response_json_unique_items = set(response.json().items())
263+
self.assertTrue(payload_unique_items.issubset(response_json_unique_items))
264+
265265
self.assertTrue(ClientAccount.objects.get(user_account=user.id))
266266
self.client.logout()
267267

@@ -283,7 +283,11 @@ def test_create_a_regular_user_as_staff_user(self):
283283
self.set_url('api:client_api-list')
284284
response = self.client.post(self.url, data=payload, format='json')
285285
self.assertEqual(201, response.status_code)
286-
self.assertDictContainsSubset(payload, response.json())
286+
287+
payload_unique_items = set(payload.items())
288+
response_json_unique_items = set(response.json().items())
289+
self.assertTrue(payload_unique_items.issubset(response_json_unique_items))
290+
287291
self.client.logout()
288292

289293
def test_partial_update(self):
@@ -298,7 +302,11 @@ def test_partial_update(self):
298302
self.set_url('api:client_api-detail', kwargs=api_url_params)
299303
response = self.client.patch(self.url, data=payload, format='json')
300304
self.assertEqual(200, response.status_code)
301-
self.assertDictContainsSubset(payload, response.json())
305+
306+
payload_unique_items = set(payload.items())
307+
response_json_unique_items = set(response.json().items())
308+
self.assertTrue(payload_unique_items.issubset(response_json_unique_items))
309+
302310
self.client.logout()
303311

304312
def test_staff_updates_regular_user_account(self):
@@ -313,7 +321,11 @@ def test_staff_updates_regular_user_account(self):
313321
self.set_url('api:client_api-detail', kwargs=api_url_params)
314322
response = self.client.patch(self.url, data=payload, format='json')
315323
self.assertEqual(200, response.status_code)
316-
self.assertDictContainsSubset(payload, response.json())
324+
325+
payload_unique_items = set(payload.items())
326+
response_json_unique_items = set(response.json().items())
327+
self.assertTrue(payload_unique_items.issubset(response_json_unique_items))
328+
317329
self.client.logout()
318330

319331
def test_regular_user_can_not_update_staff_account(self):
@@ -418,7 +430,11 @@ def test_create_regular_user_wallets_as_regular_user(self):
418430
self.set_url(f'{self.api_reverse_url}-list')
419431
response = self.client.post(self.url, data=payload, format='json')
420432
self.assertEqual(201, response.status_code)
421-
self.assertDictContainsSubset(response_data, response.json())
433+
434+
response_data_unique_items = set(response_data.items())
435+
response_json_unique_items = set(response.json().items())
436+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
437+
422438
print(f'{num_iterations} wallets done')
423439
self.client.logout()
424440

@@ -464,7 +480,11 @@ def test_create_regular_user_wallets_as_staff_user(self):
464480
self.set_url(f'{self.api_reverse_url}-list')
465481
response = self.client.post(self.url, data=payload, format='json')
466482
self.assertEqual(201, response.status_code)
467-
self.assertDictContainsSubset(response_data, response.json())
483+
484+
response_data_unique_items = set(response_data.items())
485+
response_json_unique_items = set(response.json().items())
486+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
487+
468488
print(f'{num_iterations} transactions done')
469489
self.client.logout()
470490

@@ -494,7 +514,11 @@ def test_create_staff_user_wallets_as_staff_user(self):
494514
self.set_url(f'{self.api_reverse_url}-list')
495515
response = self.client.post(self.url, data=payload, format='json')
496516
self.assertEqual(201, response.status_code)
497-
self.assertDictContainsSubset(response_data, response.json())
517+
518+
response_data_unique_items = set(response_data.items())
519+
response_json_unique_items = set(response.json().items())
520+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
521+
498522
print(f'{num_iterations} transactions done')
499523
self.client.logout()
500524

@@ -660,7 +684,11 @@ def test_create_regular_user_transactions_as_regular_user(self):
660684
self.set_url('api:client_wallet_transaction_api-list')
661685
response = self.client.post(self.url, data=payload, format='json')
662686
self.assertEqual(201, response.status_code)
663-
self.assertDictContainsSubset(response_data, response.json())
687+
688+
response_data_unique_items = set(response_data.items())
689+
response_json_unique_items = set(response.json().items())
690+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
691+
664692
print(f'{num_iterations} transactions done')
665693
self.client.logout()
666694

@@ -720,7 +748,11 @@ def test_create_regular_user_transactions_as_staff_user(self):
720748
self.set_url('api:client_wallet_transaction_api-list')
721749
response = self.client.post(self.url, data=payload, format='json')
722750
self.assertEqual(201, response.status_code)
723-
self.assertDictContainsSubset(response_data, response.json())
751+
752+
response_data_unique_items = set(response_data.items())
753+
response_json_unique_items = set(response.json().items())
754+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
755+
724756
print(f'{num_iterations} transactions done')
725757
self.client.logout()
726758

@@ -760,7 +792,11 @@ def test_create_staff_user_transactions_as_staff_user(self):
760792
self.set_url('api:client_wallet_transaction_api-list')
761793
response = self.client.post(self.url, data=payload, format='json')
762794
self.assertEqual(201, response.status_code)
763-
self.assertDictContainsSubset(response_data, response.json())
795+
796+
response_data_unique_items = set(response_data.items())
797+
response_json_unique_items = set(response.json().items())
798+
self.assertTrue(response_data_unique_items.issubset(response_json_unique_items))
799+
764800
print(f'{num_iterations} transactions done')
765801
self.client.logout()
766802

0 commit comments

Comments
 (0)