views.py

 avatar
unknown
python
a month ago
3.9 kB
3
Indexable
from rest_framework import generics, permissions, status
from rest_framework.response import Response
from .models import Project, UserProjectAssociation, Task, Activity
from features.serializers import (
    ProjectSerializer,
    UserProjectAssociationSerializer,
    TaskSerializer,
    ActivitySerializer,
    UserSerializer,
    CreateTeamSerializer
)
from core.base_classes import BaseModelViewSet, AdminManagerPermission
from django.contrib.auth import get_user_model
from rest_framework.views import APIView
from accounts.constants import RoleIDs
from django.db import connection


User = get_user_model()


class ProjectViewSet(BaseModelViewSet):
    serializer_class = ProjectSerializer
    permission_classes = [AdminManagerPermission]
    pagination_class = None

    def get_queryset(self):
        user = self.request.user
        if user.role.id in [1,3]:
            return Project.objects.all()
        return Project.objects.filter(project_user__user = user)





class ProjectTeamViewSet(BaseModelViewSet):
    # queryset = UserProjectAssociation.objects.all()
    serializer_class = UserProjectAssociationSerializer
    permission_classes = [permissions.IsAuthenticated]
    pagination_class = None

    def get_queryset(self):
        try:
            user = self.request.user
            pk = self.request.query_params.get('project_id')
            print(self.request.query_params)
            if pk:
                return UserProjectAssociation.objects.filter(project__id=int(pk))
            return UserProjectAssociation.objects.all()
        except Exception as e:
            print(e)


class TaskViewSet(BaseModelViewSet):
    queryset = Task.objects.all()
    serializer_class = TaskSerializer
    permission_classes = [permissions.IsAuthenticated]
    pagination_class = None



class ActivityViewSet(BaseModelViewSet):
    queryset = Activity.objects.all().order_by("-created_at")
    serializer_class = ActivitySerializer
    permission_classes = [permissions.IsAuthenticated]
    pagination_class = None



class ActivityReportViewSet(BaseModelViewSet):
    def list(self, request):
        query = """
        SELECT 
            auth_user.username, 
            task.title AS task_title, 
            SUM(activity.time_spent) AS total_hours
        FROM activity
        JOIN auth_user ON activity.user_id = auth_user.id
        JOIN task ON activity.task_id = task.id
        WHERE activity.activity_type = 'time_log'
        GROUP BY auth_user.username, task.title
        ORDER BY total_hours DESC
        """
        
        with connection.cursor() as cursor:
            cursor.execute(query)
            rows = cursor.fetchall()

        result = [
            {"username": row[0], "task": row[1], "total_hours": row[2]} for row in rows
        ]
        return Response(result, status=status.HTTP_200_OK)


class TaskListView(generics.ListAPIView):
    """Allow Managers to see all users"""
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = UserSerializer
    
    def get_queryset(self):
        project_id = self.request.GET.get("project_id")
        user_role = self.request.user.role
        if project_id: 
            return Task.objects.filter(project=project_id)
        return Task.objects.all()
        

class UserListView(generics.ListAPIView):
    serializer_class = UserSerializer
    permission_classes = [AdminManagerPermission]
    queryset = User.objects.all()
    


class CreateTeamView(APIView):
    permission_classes = [permissions.IsAuthenticated]
    def post(self, request, project_id):
        serializer = CreateTeamSerializer(data=request.data, context={'project_id': project_id})
        if serializer.is_valid():
            serializer.create(serializer.validated_data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Editor is loading...
Leave a Comment