Browse Source

transactions views and serializers added for admin panel

master
Mohsen Taba 2 months ago
parent
commit
be2c84af77
  1. 51
      apps/transaction/serializers.py
  2. 9
      apps/transaction/urls.py
  3. 51
      apps/transaction/views.py

51
apps/transaction/serializers.py

@ -94,3 +94,54 @@ class UploadReceiptsSerializer(serializers.Serializer):
raise serializers.ValidationError("You can upload a maximum of 10 files.")
return files
# =============================================================================
# Admin Panel Serializers
# =============================================================================
class AdminTransactionReceiptSerializer(serializers.ModelSerializer):
file = serializers.SerializerMethodField()
class Meta:
model = TransactionReceipt
fields = ['id', 'file', 'description', 'uploaded_at']
def get_file(self, obj):
request = self.context.get('request')
if obj.file:
if request:
return request.build_absolute_uri(obj.file.url)
return obj.file.url
return None
class AdminParticipantInfoSerializer(serializers.ModelSerializer):
phone_number = serializers.CharField(read_only=True)
class Meta:
model = ParticipantInfo
fields = ['id', 'fullname', 'email', 'phone_number', 'gender', 'birthdate']
class AdminTransactionSerializer(serializers.ModelSerializer):
user_name = serializers.CharField(source='user.fullname', read_only=True)
user_email = serializers.CharField(source='user.email', read_only=True)
course_title = serializers.CharField(source='course.title', read_only=True)
receipts = AdminTransactionReceiptSerializer(many=True, read_only=True)
participant_infos = AdminParticipantInfoSerializer(many=True, read_only=True)
class Meta:
model = TransactionParticipant
fields = [
'id', 'user', 'user_name', 'user_email',
'course', 'course_title',
'price', 'status', 'payment_method',
'participant_infos', 'receipts',
'created_at', 'updated_at'
]
read_only_fields = [
'id', 'user', 'user_name', 'user_email',
'course', 'course_title', 'price', 'payment_method',
'participant_infos', 'receipts', 'created_at', 'updated_at'
]

9
apps/transaction/urls.py

@ -1,11 +1,15 @@
from django.urls import path, re_path
from django.urls import path, re_path, include
from rest_framework.routers import DefaultRouter
from . import views
from .views import AdminTransactionViewSet
router = DefaultRouter()
router.register(r'admin/transactions', AdminTransactionViewSet, basename='admin-transactions')
urlpatterns = [
path('', include(router.urls)),
re_path(r'(?P<slug>[\w-]+)/join/$', views.TransactionParticipantCreateView.as_view(), name='transaction-participant-create'),
path('list/', views.TransactiontListView.as_view(), name='transaction-list'),
path('<int:pk>/delete/', views.SoftDeleteTransactionParticipantView.as_view(), name='soft-delete-transaction-participant'),
@ -13,4 +17,3 @@ urlpatterns = [
path('<int:transaction_id>/receipts/', views.TransactionReceiptsListView.as_view(), name='transaction-receipts-list'),
]

51
apps/transaction/views.py

@ -410,3 +410,54 @@ class TransactionReceiptsListView(generics.ListAPIView):
)
return TransactionReceipt.objects.filter(transaction=transaction)
# =============================================================================
# Admin Panel ViewSet
# =============================================================================
from rest_framework.viewsets import ModelViewSet
from rest_framework.permissions import IsAdminUser
from apps.transaction.serializers import AdminTransactionSerializer
from django.db.models import Q
class AdminTransactionViewSet(ModelViewSet):
"""
Admin-only viewset for viewing and updating transactions.
Only GET (list/retrieve) and PATCH (update status) are allowed.
"""
queryset = TransactionParticipant.objects.all()
serializer_class = AdminTransactionSerializer
permission_classes = [IsAuthenticated, IsAdminUser]
authentication_classes = [TokenAuthentication]
http_method_names = ['get', 'patch', 'head', 'options']
def get_queryset(self):
queryset = TransactionParticipant.objects.all().select_related('user', 'course').prefetch_related('receipts', 'participant_infos')
# Search
search_query = self.request.query_params.get('search', None)
if search_query:
queryset = queryset.filter(
Q(user__fullname__icontains=search_query) |
Q(user__email__icontains=search_query) |
Q(course__title__icontains=search_query)
)
# Status filter
status_param = self.request.query_params.get('status', None)
if status_param:
queryset = queryset.filter(status=status_param)
# Course filter
course_id = self.request.query_params.get('course', None)
if course_id:
queryset = queryset.filter(course_id=course_id)
# Payment method filter
payment_method = self.request.query_params.get('payment_method', None)
if payment_method:
queryset = queryset.filter(payment_method=payment_method)
return queryset.order_by('-created_at')
Loading…
Cancel
Save