from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import UserData, AIKey, AppVersion, Contact from django.shortcuts import get_object_or_404 from .serializers import ContactSerializer from rest_framework.generics import CreateAPIView import os import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart class UserDataPostView(APIView): def post(self, request): user_id = request.data.get("user_id") if not user_id: return Response( {"error": "user_id is required"}, status=status.HTTP_400_BAD_REQUEST ) obj, created = UserData.objects.get_or_create(user_id=user_id) # Track if updates were actually made updated = False for key in ["expenses", "salary", "category", "user_data"]: if key in request.data and getattr(obj, key) != request.data[key]: setattr(obj, key, request.data[key]) updated = True if updated: obj.save() if created: obj = get_object_or_404(UserData, user_id=user_id) if obj.has_ai_access: AI_KEY = get_object_or_404(AIKey, isActive=True).aikey else: AI_KEY = None return Response( { "message": "Data created successfull", "app_version": get_object_or_404(AppVersion, isActive=True).version, "has_music_url_access": obj.has_music_url_access, "has_ai_access": obj.has_ai_access, "ai_key": AI_KEY, }, status=status.HTTP_201_CREATED, ) elif updated: obj = get_object_or_404(UserData, user_id=user_id) print(obj.has_ai_access) if obj.has_ai_access: AI_KEY = get_object_or_404(AIKey, isActive=True).aikey else: AI_KEY = None return Response( { "message": "Data updated successfull", "app_version": get_object_or_404(AppVersion, isActive=True).version, "has_music_url_access": obj.has_music_url_access, "has_ai_access": obj.has_ai_access, "ai_key": AI_KEY, }, status=status.HTTP_200_OK, ) else: obj = get_object_or_404(UserData, user_id=user_id) if obj.has_ai_access: AI_KEY = get_object_or_404(AIKey, isActive=True).aikey else: AI_KEY = None return Response( { "message": "No changes made", "app_version": get_object_or_404(AppVersion, isActive=True).version, "has_music_url_access": obj.has_music_url_access, "has_ai_access": obj.has_ai_access, "ai_key": AI_KEY, }, status=status.HTTP_200_OK, ) class GetFieldView(APIView): def get(self, request, field, user_id): obj = get_object_or_404(UserData, user_id=user_id) if field == "all": data = { "userData": obj.user_data, "expenseData": obj.expenses, "categoryData": obj.category, "salaryData": obj.salary, } return Response(data) if hasattr(obj, field): return Response({field: getattr(obj, field)}) return Response({"error": "Invalid field"}, status=status.HTTP_400_BAD_REQUEST) upper_body = """ Contact Form Confirmation Template

THANK YOU!

I've received your message.

Hi """ mid_body = """,

Thanks for reaching out via my portfolio! I wanted to let you know that your message has landed safely in my inbox.

I appreciate your interest. I typically review inquiries within 24 hours and will get back to you as soon as possible.

You wrote:

""" lower_body = """

Best regards,
Dev Namdev

""" EMAIL_HOST = "smtp.gmail.com" EMAIL_PORT = 587 EMAIL_USER = os.getenv("EMAIL_HOST_USER") EMAIL_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") class ContactList1(CreateAPIView): queryset = Contact.objects.all() serializer_class = ContactSerializer def perform_create(self, serializer): instance = serializer.save() user_ip = self.get_client_ip(self.request) email = instance.email name = instance.name message = instance.message try: print("mail sending..") msg = MIMEMultipart() msg["From"] = EMAIL_USER msg["To"] = email msg["Subject"] = "Confirmation: We've Received Your Message" body = upper_body + name + mid_body + message + lower_body msg.attach(MIMEText(body, "html")) # 🔥 IMPORTANT: timeout added server = smtplib.SMTP(EMAIL_HOST, EMAIL_PORT, timeout=10) server.starttls() server.login(EMAIL_USER, EMAIL_PASSWORD) server.sendmail(EMAIL_USER, email, msg.as_string()) print("mail send to user") admin_text = ( f"Subject: Form Submission from {name}\n\n" f"Name: {name}\n" f"Email: {email}\n" f"Message: {message}\n" f"IP Address: {user_ip}" ) server.sendmail(EMAIL_USER, "devnamdevcse@gmail.com", admin_text) print("mail send to devnamdevcse@gmail.com") except Exception as e: # ❗ Prevent worker crash print("Email error:", e) finally: try: server.quit() except: pass def get_client_ip(self, request): x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded_for: ip = x_forwarded_for.split(",")[0] else: ip = request.META.get("REMOTE_ADDR") return ip