1- from django .shortcuts import get_object_or_404 , render
1+ from django .shortcuts import render , redirect , get_object_or_404
22from django .contrib .auth .decorators import login_required
3- from rest_framework import generics , permissions , status
3+ from django .contrib import messages
4+ from django .utils .translation import gettext as _
45from rest_framework .decorators import api_view , permission_classes
6+ from rest_framework .permissions import IsAuthenticated
57from rest_framework .response import Response
68from .models import Campaign , Email
79from .serializers import CampaignSerializer , EmailSerializer
8- from . tasks import send_campaign_emails
10+ import uuid
911
10- class CampaignListCreateAPIView (generics .ListCreateAPIView ):
11- """List and create campaigns."""
12- serializer_class = CampaignSerializer
13- permission_classes = [permissions .IsAuthenticated ]
14-
15- def get_queryset (self ):
16- """Return only campaigns belonging to the current user."""
17- return Campaign .objects .filter (user = self .request .user ).order_by ('-created_at' )
18-
19-
20- class CampaignRetrieveUpdateDestroyAPIView (generics .RetrieveUpdateDestroyAPIView ):
21- """Retrieve, update, and delete a campaign."""
22- serializer_class = CampaignSerializer
23- permission_classes = [permissions .IsAuthenticated ]
24-
25- def get_queryset (self ):
26- """Return only campaigns belonging to the current user."""
27- return Campaign .objects .filter (user = self .request .user )
28-
29-
30- class EmailListCreateAPIView (generics .ListCreateAPIView ):
31- """List and create emails for a campaign."""
32- serializer_class = EmailSerializer
33- permission_classes = [permissions .IsAuthenticated ]
34-
35- def get_queryset (self ):
36- """Return only emails for the specified campaign belonging to the current user."""
37- campaign_id = self .kwargs .get ('campaign_id' )
38- return Email .objects .filter (campaign__id = campaign_id , campaign__user = self .request .user ).order_by ('order' )
39-
40- def perform_create (self , serializer ):
41- """Create email and associate with the specified campaign."""
42- campaign_id = self .kwargs .get ('campaign_id' )
43- campaign = get_object_or_404 (Campaign , id = campaign_id , user = self .request .user )
44-
45- # Set order to next available if not provided
46- if 'order' not in serializer .validated_data :
47- next_order = Email .objects .filter (campaign = campaign ).count ()
48- serializer .save (campaign = campaign , order = next_order )
49- else :
50- serializer .save (campaign = campaign )
51-
52-
53- class EmailRetrieveUpdateDestroyAPIView (generics .RetrieveUpdateDestroyAPIView ):
54- """Retrieve, update, and delete an email from a campaign."""
55- serializer_class = EmailSerializer
56- permission_classes = [permissions .IsAuthenticated ]
57-
58- def get_queryset (self ):
59- """Return only emails for the specified campaign belonging to the current user."""
60- campaign_id = self .kwargs .get ('campaign_id' )
61- return Email .objects .filter (campaign__id = campaign_id , campaign__user = self .request .user )
62-
63-
64- @api_view (['POST' ])
65- @permission_classes ([permissions .IsAuthenticated ])
66- def activate_campaign (request , campaign_id ):
67- """Activate a campaign to start sending emails."""
68- campaign = get_object_or_404 (Campaign , id = campaign_id , user = request .user )
69-
70- # Check if campaign has emails
71- if campaign .emails .count () == 0 :
72- return Response (
73- {"error" : "Cannot activate a campaign with no emails." },
74- status = status .HTTP_400_BAD_REQUEST
75- )
76-
77- campaign .is_active = True
78- campaign .save ()
79-
80- # Schedule emails to be sent
81- send_campaign_emails .delay (campaign_id = str (campaign .id ))
82-
83- return Response (
84- {"message" : "Campaign activated successfully. Emails will be sent according to schedule." },
85- status = status .HTTP_200_OK
86- )
87-
88-
89- @api_view (['POST' ])
90- @permission_classes ([permissions .IsAuthenticated ])
91- def deactivate_campaign (request , campaign_id ):
92- """Deactivate a campaign to stop sending emails."""
93- campaign = get_object_or_404 (Campaign , id = campaign_id , user = request .user )
94-
95- campaign .is_active = False
96- campaign .save ()
97-
98- return Response (
99- {"message" : "Campaign deactivated successfully. No more emails will be sent." },
100- status = status .HTTP_200_OK
101- )
12+ @login_required
13+ def campaign_create (request ):
14+ """Render campaign creation page."""
15+ return render (request , 'campaigns/create.html' )
10216
17+ @login_required
18+ def campaign_template (request , campaign_id = None ):
19+ """Render template creation/edit page."""
20+ campaign = None
21+ if campaign_id :
22+ campaign = get_object_or_404 (Campaign , id = campaign_id , user = request .user )
23+ return render (request , 'campaigns/template.html' , {'campaign' : campaign })
10324
10425@login_required
105- def campaign_edit_view (request , pk ):
106- campaign = get_object_or_404 (Campaign , pk = pk , user = request .user )
107- emails = campaign .emails .all () # Emails are already ordered by the 'order' field in the model's Meta
108- context = {
109- 'campaign' : campaign ,
110- 'emails' : emails ,
111- }
112- return render (request , 'campaigns/campaign_edit_page.html' , context )
26+ @api_view (['POST' ])
27+ @permission_classes ([IsAuthenticated ])
28+ def create_campaign (request ):
29+ """Create a new campaign with templates."""
30+ serializer = CampaignSerializer (data = request .data , context = {'request' : request })
31+ if serializer .is_valid ():
32+ campaign = serializer .save ()
33+
34+ # Create email templates
35+ emails_data = request .data .get ('emails' , [])
36+ for email_data in emails_data :
37+ email_data ['campaign' ] = campaign .id
38+ email_serializer = EmailSerializer (data = email_data )
39+ if email_serializer .is_valid ():
40+ email_serializer .save ()
41+
42+ return Response ({
43+ 'id' : campaign .id ,
44+ 'message' : _ ('Campaign created successfully' )
45+ })
46+ return Response (serializer .errors , status = 400 )
0 commit comments