# main/views.py from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from .models import Project, Task, RegisteredUser from .forms import ProjectForm, TaskForm from rest_framework import status from rest_framework.views import APIView from rest_framework.response import Response class UserRegistrationView(APIView): def post(self, request): serializer = UserRegistrationSerializer(data=request.data) if serializer.is_valid(): user = serializer.save() return Response({"id": user.id, "username": user.username}, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) class UserLoginView(APIView): def post(self, request): username = request.data.get('username') password = request.data.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return Response({"message": "Login successful"}, status=status.HTTP_200_OK) return Response({error: "Invalid credentials"}, status=status.HTTP_401_UNAUTHORIZED) class UserLogoutView(APIView): def post(self, request): logout(request) return Response({"message": "Logout successful"}, status=status.HTTP_200_OK) # create project @login_required def create_project(request): if request.method == 'POST': form = ProjectForm(request.POST) if form.is_valid(): project = form.save(commit=False) project.initiator = request.user project.save() # Notify PMO Admins pmo_admins = User.objects.filter(profile__role='PMO Admin') for admin in pmo_admins: send_mail( 'New Project Created', f'A new project "{project.name}" has been created and requires a project manager assignment.', 'admin@example.com', [admin.email], fail_silently=False, ) return redirect('project_dashboard', project_id=project.id) else: form = ProjectForm() return render(request, 'create_project.html', {'form': form}) # Load project as current focus @login_required def load_project(request): if request.method == 'POST': project_id = request.POST['project_id'] return redirect('project_dashboard', project_id=project_id) projects = Project.objects.all() return render(request, 'load_project.html', {'projects': projects}) # Active projects @login_required def project_dashboard(request, project_id): project = get_object_or_404(Project, id=project_id) tasks = project.tasks.all() return render(request, 'project_dashboard.html', {'project': project, 'tasks': tasks}) # Create task in current focus project - if no project chosen default project for user is focus @login_required def create_task(request, project_id): project = get_object_or_404(Project, id=project_id) if request.method == 'POST': form = TaskForm(request.POST) if form.is_valid(): task = form.save(commit=False) task.project = project task.save() return redirect('project_dashboard', project_id=project.id) else: form = TaskForm() return render(request, 'create_task.html', {'form': form, 'project': project})