Add wallet balance to User model and implement Atoll/Island management

- Added `wallet_balance` field to the User model.
- Updated UserAdmin to include `wallet_balance` in the admin interface.
- Created serializers and views for Atoll and Island management.
- Implemented endpoints for listing, creating, and updating Atolls and Islands.
- Enhanced payment processing with UUIDs for Payment and Topup models.
- Added migration files for new fields and constraints.
- Improved error handling and validation in various views.
- Updated email templates for better responsiveness and SEO.
This commit is contained in:
2025-01-20 20:59:16 +05:00
parent 4d0eb86478
commit f6f77bb0e5
19 changed files with 513 additions and 108 deletions

View File

@ -2,7 +2,11 @@ from rest_framework import generics, status
from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend
from .models import Device
from .serializers import CreateDeviceSerializer, DeviceSerializer, ReadOnlyDeviceSerializer
from .serializers import (
CreateDeviceSerializer,
DeviceSerializer,
ReadOnlyDeviceSerializer,
)
from api.mixins import StaffEditorPermissionMixin
from .filters import DeviceFilter
import re
@ -27,16 +31,17 @@ class DeviceListCreateAPIView(
def create(self, request, *args, **kwargs):
mac = request.data.get("mac", None)
if not re.match(r"^([0-9A-Fa-f]{2}([.:-]?)){5}[0-9A-Fa-f]{2}$", mac):
return Response({"error": "Invalid mac address"}, status=400)
return Response({"message": "Invalid mac address."}, status=400)
if Device.objects.filter(mac=mac).exists():
return Response({"error": "Device with this mac already exists"}, status=400)
return Response(
{"message": "Device with this mac address already exists."}, status=400
)
return super().create(request, *args, **kwargs)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
class DeviceDetailAPIView(StaffEditorPermissionMixin, generics.RetrieveAPIView):
queryset = Device.objects.select_related("user").all()
serializer_class = ReadOnlyDeviceSerializer
@ -52,6 +57,9 @@ class DeviceUpdateAPIView(StaffEditorPermissionMixin, generics.UpdateAPIView):
# Pass 'partial=True' to allow partial updates
partial = kwargs.pop("partial", True)
instance = self.get_object()
mac = request.data.get("mac", None)
if not re.match(r"^([0-9A-Fa-f]{2}([.:-]?)){5}[0-9A-Fa-f]{2}$", mac):
return Response({"message": "Invalid mac address"}, status=400)
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
@ -73,4 +81,3 @@ class DeviceDestroyAPIView(StaffEditorPermissionMixin, generics.DestroyAPIView):
{"message": f"Device '{device_name}' deleted."},
status=status.HTTP_200_OK,
)