Add relations export and remote full backup/restore.

Expose GET/POST /api/v1/export/ for server dumps and add import UI for relations (CSV/JSON) plus remote backup controls.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
gitrusprus
2026-07-06 17:05:13 +03:00
co-authored by Cursor
parent f5937040fa
commit f6eff89642
9 changed files with 865 additions and 9 deletions
+29
View File
@@ -4,9 +4,38 @@ from rest_framework.views import APIView
from core.access import use_jwt_auth
from core.drf_mixins import JwtAuthMixin
from .dump_services import build_owner_dump, import_owner_dump, is_data_dump, parse_dump_request
from .services import parse_upload_file, import_contacts_from_rows
class ExportDumpView(JwtAuthMixin, APIView):
def get(self, request):
owner = request.user if use_jwt_auth() and request.user.is_authenticated else None
return Response(build_owner_dump(owner))
def post(self, request):
data, error = parse_dump_request(request)
if error:
return Response({'error': error}, status=status.HTTP_400_BAD_REQUEST)
if not is_data_dump(data):
return Response(
{'error': 'Некорректный формат бэкапа: ожидаются массивы contacts и relations.'},
status=status.HTTP_400_BAD_REQUEST,
)
replace = str(request.query_params.get('replace', '')).lower() in ('1', 'true', 'yes')
owner = request.user if use_jwt_auth() and request.user.is_authenticated else None
try:
summary = import_owner_dump(owner, data, replace=replace)
return Response(summary)
except ValueError as exc:
return Response({'error': str(exc)}, status=status.HTTP_400_BAD_REQUEST)
except Exception as exc:
return Response(
{'error': f'Ошибка импорта бэкапа: {exc}'},
status=status.HTTP_400_BAD_REQUEST,
)
class ImportContactsView(JwtAuthMixin, APIView):
def post(self, request):
file = request.FILES.get('file')