zhongrj
2025-11-25 b89962006164a462404b79a738bee8cbb6d7fe7e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from django.contrib.auth.models import User, Group
from app.models import Profile
from rest_framework import serializers, viewsets, generics, status, exceptions
from rest_framework.decorators import action
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.hashers import make_password
from app import models
 
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model  = User
        fields = '__all__' 
 
class AdminUserViewSet(viewsets.ModelViewSet):
    serializer_class = UserSerializer
    permission_classes = [IsAdminUser]
 
    def get_queryset(self):
        queryset = User.objects.all()
        email = self.request.query_params.get('email', None)
        if email is not None:
            queryset = queryset.filter(email=email)
        return queryset
 
    def create(self, request):
        data = request.data.copy()
        password = data.get('password')
        data['password'] = make_password(password)
        user = UserSerializer(data=data)
        user.is_valid(raise_exception=True)
        user.save()
        return Response(user.data, status=status.HTTP_201_CREATED)
 
class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model  = Group
        fields = '__all__'
 
class AdminGroupViewSet(viewsets.ModelViewSet):
    serializer_class = GroupSerializer
    permission_classes = [IsAdminUser]
 
    def get_queryset(self):
        queryset = Group.objects.all()
        name = self.request.query_params.get('name', None)
        if name is not None:
            queryset = queryset.filter(name=name)
        return queryset
 
 
class ProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model  = Profile
        exclude = ('id', ) 
 
        read_only_fields = ('user', )
 
class AdminProfileViewSet(viewsets.ModelViewSet):
    pagination_class = None
    serializer_class = ProfileSerializer
    permission_classes = [IsAdminUser]
    lookup_field = 'user'
    
    def get_queryset(self):
        return Profile.objects.all()
 
    
    @action(detail=True, methods=['post'])
    def update_quota_deadline(self, request, user=None):
        try:
            hours = float(request.data.get('hours', ''))
            if hours < 0:
                raise ValueError("hours must be >= 0")
        except ValueError as e:
            raise exceptions.ValidationError(str(e))
 
        try:
            p = Profile.objects.get(user=user)
        except ObjectDoesNotExist:
            raise exceptions.NotFound()
        
        return Response({'deadline': p.set_quota_deadline(hours)}, status=status.HTTP_200_OK)