diff --git a/backend/ticket/admin.py b/backend/ticket/admin.py index 5ae80c6..1426233 100644 --- a/backend/ticket/admin.py +++ b/backend/ticket/admin.py @@ -58,4 +58,8 @@ class MessageAdmin(ModelAdmin, ImportExportModelAdmin): } def content_display(self, obj): return obj.content[0:35] + '...' - content_display.short_description = 'محتوای پیام' \ No newline at end of file + content_display.short_description = 'محتوای پیام' + +@admin.register(Attachment) +class AttachmentAdmin(ModelAdmin, ImportExportModelAdmin): + list_display = ['name', 'uploaded_by'] \ No newline at end of file diff --git a/backend/ticket/migrations/0014_attachment_uploaded_by.py b/backend/ticket/migrations/0014_attachment_uploaded_by.py new file mode 100644 index 0000000..dc98d04 --- /dev/null +++ b/backend/ticket/migrations/0014_attachment_uploaded_by.py @@ -0,0 +1,21 @@ +# Generated by Django 5.1.2 on 2025-02-23 18:28 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ticket', '0013_attachment_message_attachments_ticket_attachments'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='attachment', + name='uploaded_by', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/backend/ticket/models.py b/backend/ticket/models.py index 72f9502..8ab3b90 100644 --- a/backend/ticket/models.py +++ b/backend/ticket/models.py @@ -10,6 +10,7 @@ class Attachment(models.Model): created_at = models.DateTimeField(auto_now_add=True) size = models.PositiveIntegerField(null=True, blank=True) name = models.CharField(max_length=400, null=True, blank=True) + uploaded_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) def __str__(self): return self.file.name diff --git a/backend/ticket/urls.py b/backend/ticket/urls.py index 759ac06..c3a47f5 100644 --- a/backend/ticket/urls.py +++ b/backend/ticket/urls.py @@ -1,17 +1,11 @@ from django.urls import path -from .views import ( - TicketCreateView, - TicketListView, - TicketDetailView, - MessageCreateView, - UpdateTicketStatusView, - AttachmentUploadView -) +from . import views urlpatterns = [ - path('create', TicketCreateView.as_view(), name='ticket-create'), - path('', TicketListView.as_view(), name='ticket-list'), - path('', TicketDetailView.as_view(), name='ticket-detail'), - path('message/create', MessageCreateView.as_view(), name='message-create'), - path('attachment/create', AttachmentUploadView.as_view(), name='attachment-upload'), + path('create', views.TicketCreateView.as_view(), name='ticket-create'), + path('', views.TicketListView.as_view(), name='ticket-list'), + path('', views.TicketDetailView.as_view(), name='ticket-detail'), + path('message/create', views.MessageCreateView.as_view(), name='message-create'), + path('attachment/create', views.AttachmentUploadView.as_view(), name='attachment-upload'), + path('attachment/delete/', views.AttachmentDeleteView.as_view(), name='attachment-upload'), ] \ No newline at end of file diff --git a/backend/ticket/views.py b/backend/ticket/views.py index 4c3b3d9..292b4f7 100644 --- a/backend/ticket/views.py +++ b/backend/ticket/views.py @@ -1,7 +1,7 @@ from rest_framework import generics, permissions from rest_framework.response import Response from rest_framework.views import APIView -from .models import Ticket, Message +from .models import Ticket, Message, Attachment from .serializers import TicketListSerializer, MessageSerializer, TicketSerializer, AttachmentSerializer from utils.pagination import StructurePagination from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes @@ -9,8 +9,18 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.parsers import MultiPartParser, FormParser from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiExample, OpenApiTypes, OpenApiResponse from rest_framework import status +from django.shortcuts import get_object_or_404 +class AttachmentDeleteView(APIView): + permission_classes = [IsAuthenticated] + serializer_class = [AttachmentSerializer] + def delete(self, request, pk): + attachment_instance = get_object_or_404(Attachment, pk=pk) + if attachment_instance.uploaded_by == request.user: + attachment_instance.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + return Response({'detail': 'این فایل توسط شما اپلود نشده'}) class AttachmentUploadView(APIView): permission_classes = [IsAuthenticated] @@ -24,7 +34,7 @@ class AttachmentUploadView(APIView): def post(self, request, *args, **kwargs): serializer = AttachmentSerializer(data=request.data, context={'request': request}) if serializer.is_valid(): - serializer.save() + serializer.save(uploaded_by=request.user) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)