Skip to content

Commit 1ccd78f

Browse files
committed
import export
1 parent c42bb9d commit 1ccd78f

File tree

31 files changed

+472
-36
lines changed

31 files changed

+472
-36
lines changed

application/entrypoint.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ python3 pay_parking/manage.py makemigrations
44
python3 pay_parking/manage.py migrate
55
if [ ! -e $CONTAINER_ALREADY_STARTED ]; then
66
touch $CONTAINER_ALREADY_STARTED
7-
python3 pay_parking/manage.py loaddata pay_parking/db.json
7+
python3 pay_parking/manage.py import pay_parking/db.json
88
fi
99
python3 pay_parking/manage.py collectstatic
1010
cp -r /app/pay_parking/collected_static/. /backend_static/static/

application/pay_parking/db.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

application/pay_parking/import_export/__init__.py

Whitespace-only changes.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from django.contrib import admin
2+
from django.urls import path
3+
from .import_data import import_data
4+
from .export_data import export_data
5+
from django.http import HttpResponse
6+
from rest_framework import status
7+
from rest_framework.response import Response
8+
import json
9+
from .forms import ImportForm
10+
from django.shortcuts import redirect
11+
from django.contrib import messages
12+
13+
14+
class AdminSite(admin.AdminSite):
15+
def get_urls(self):
16+
new_urls = [
17+
path('import/', self.admin_view(self.import_view), name='import'),
18+
path('export/', self.admin_view(self.export_view), name='export')
19+
]
20+
return new_urls + super().get_urls()
21+
22+
def import_view(self, request):
23+
if request.method == 'POST':
24+
form = ImportForm(request.POST, request.FILES)
25+
if form.is_valid():
26+
try:
27+
data = json.load(form.cleaned_data['import_file'])
28+
try:
29+
import_data(data)
30+
messages.success(request, 'Данные загружены и обновлены')
31+
except Exception as e:
32+
messages.error(request, e)
33+
except Exception as e:
34+
messages.error(request, "Ошибка при чтении файла")
35+
return redirect('admin:index')
36+
return Response(status=status.HTTP_400_BAD_REQUEST)
37+
38+
def export_view(self, request):
39+
if request.method == 'GET':
40+
data = export_data()
41+
content = json.dumps(data, ensure_ascii=False)
42+
response = HttpResponse(content, content_type='application/json')
43+
response['Content-Disposition'] = 'attachment; filename="export_data.json"'
44+
return response
45+
return Response(status=status.HTTP_400_BAD_REQUEST)
46+
47+
48+
admin.site = AdminSite('')
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.apps import AppConfig
2+
3+
4+
class ImportExportConfig(AppConfig):
5+
default_auto_field = 'django.db.models.BigAutoField'
6+
name = 'import_export'
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from import_export.serializers import ParkingSerializer, UserSerializer, PaymentSerializer
2+
3+
4+
def export_data():
5+
data = {}
6+
for serializer_class in [
7+
ParkingSerializer,
8+
UserSerializer,
9+
PaymentSerializer
10+
]:
11+
model = serializer_class.Meta.model
12+
db_table = model._meta.db_table
13+
queryset = model.objects.all()
14+
data[db_table] = serializer_class(
15+
queryset, many=True
16+
).data
17+
18+
return data
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from django import forms
2+
# import magic
3+
4+
5+
class ImportForm(forms.Form):
6+
import_file = forms.FileField()
7+
8+
# def clean_import_file(self):
9+
# import_file = self.cleaned_data.get('import_file')
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from .serializers import ParkingSerializer, UserSerializer, PaymentSerializer
2+
3+
4+
def import_data(data: dict):
5+
for serializer_class in [
6+
ParkingSerializer,
7+
UserSerializer,
8+
PaymentSerializer
9+
]:
10+
model = serializer_class.Meta.model
11+
db_table = model._meta.db_table
12+
13+
ids = [item['id'] for item in data.get(db_table)]
14+
existing_objects = model.objects.filter(id__in=ids)
15+
existing_ids = [str(item.id) for item in existing_objects]
16+
non_existing_ids = set(ids) - set(existing_ids)
17+
non_existing_items = [
18+
item for item in data.get(db_table) if item['id'] in non_existing_ids
19+
]
20+
21+
create_serializer = serializer_class(
22+
many=True, data=non_existing_items
23+
)
24+
25+
if create_serializer.is_valid():
26+
# model.objects.bulk_create(
27+
# [model(**item) for item in create_serializer.validated_data]
28+
# )
29+
create_serializer.save()
30+
else:
31+
raise ValueError(
32+
f'Invalid data {db_table}'
33+
)
34+
35+
items_to_update = {
36+
item['id']: item for item in data.get(db_table) if item['id'] in existing_ids
37+
}
38+
for existing_object in existing_objects:
39+
update_serializer = serializer_class(
40+
existing_object,
41+
data=items_to_update[str(existing_object.id)]
42+
)
43+
if update_serializer.is_valid():
44+
update_serializer.save()
45+
pass
46+
else:
47+
raise ValueError(
48+
f'Invalid data {db_table}, pk={existing_object.id}'
49+
)
50+
# for field_name, value in update_serializer.validated_data.items():
51+
# setattr(existing_object, field_name, value)
52+
53+
# fields = serializer_class().get_fields().keys()
54+
# fields = [field for field in fields if field != 'id']
55+
# model.objects.bulk_update(existing_objects, fields)

application/pay_parking/import_export/management/__init__.py

Whitespace-only changes.

application/pay_parking/import_export/management/commands/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)