Fakultas Ilmu Komputer UI

accounts.py 7.86 KB
Newer Older
1
import requests
2
from django.contrib.auth import authenticate, login
3
from django.contrib.auth.models import User
4
5
from django.http import HttpResponseBadRequest
from django.http import HttpResponseNotAllowed
6
from rest_framework import viewsets, status
7
from rest_framework.decorators import list_route
8
from rest_framework.parsers import FormParser,MultiPartParser
9
from rest_framework.permissions import AllowAny
10
from rest_framework.permissions import IsAdminUser, IsAuthenticated
11
from rest_framework.response import Response
12
from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_409_CONFLICT
13

14
15
from core.lib.permissions import IsAdminOrStudent, IsAdminOrSelfOrReadOnly, IsAdminOrCompany, IsAdminOrSupervisor
from core.models.accounts import Student, Company, Supervisor
16
from core.serializers.accounts import UserSerializer, StudentSerializer, CompanySerializer, SupervisorSerializer, \
17
    LoginSerializer, RegisterSerializer
18

19

20
21
22
class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
23
    permission_classes = [IsAdminUser]
24

25
    @list_route(methods=['get'], permission_classes=[IsAuthenticated])
26
    def me(self, request):
27
28
29
        """
        Get current user's details
        """
30
31
32
33
        user = self.request.user
        serializer = UserSerializer(user, context={"request": request})
        return Response(serializer.data)

34
35
36
37
38
39
40
    def get_permissions(self):
        if self.action == "update":
            return [IsAdminOrSelfOrReadOnly(), IsAuthenticated()]
        if self.action == "create":
            return [AllowAny()]
        return super(UserViewSet, self).get_permissions()

41

42
43
44
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
45
46
47
48
49
50
    permission_classes = [IsAdminUser]

    def get_permissions(self):
        if self.action == "update":
            return [IsAdminOrSelfOrReadOnly(), IsAdminOrStudent()]
        return super(StudentViewSet, self).get_permissions()
51

52
53
54
55

class CompanyViewSet(viewsets.ModelViewSet):
    queryset = Company.objects.all()
    serializer_class = CompanySerializer
56
    permission_classes = [IsAdminOrSelfOrReadOnly, IsAdminOrCompany]
57
58
59
60
61


class SupervisorViewSet(viewsets.ModelViewSet):
    queryset = Supervisor.objects.all()
    serializer_class = SupervisorSerializer
62
    permission_classes = [IsAdminOrSelfOrReadOnly, IsAdminOrSupervisor]
63

64

65
66
class LoginViewSet(viewsets.GenericViewSet):
    permission_classes = (AllowAny, )
67
    serializer_class = LoginSerializer
68
69
70
71
    queryset = User.objects.all()

    def create(self, request):
        """
72
        Authentication for user by means of logging in
73
74
        ---
        parameters:
75
76
77
78
79
            - name: body
              description: JSON object containing three strings: username, password and login-type. login-type should be either 'sso-ui' or 'company'.
              required: true
              type: string
              paramType: body
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
        """
        username = request.data.get('username')
        password = request.data.get('password')
        login_type = request.data.get('login-type')
        if username is None or password is None or login_type is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        if login_type == "sso-ui":
            r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
                              json={"username": username, "password": password})
            resp = r.json()
            if resp.get('state') != 0:
                # create user
                name = resp.get('nama').split(" ")
                first_name = name[0]
                name.pop(0)
                last_name = " ".join(name)
                user, created = User.objects.get_or_create(
                    username=username,
                    email=username + "@ui.ac.id",
                    first_name=first_name,
                    last_name=last_name
                )
                user.set_password(password)
                user.save()
                login(request, user)
                if created:
                    if resp.get('nama_role') == "mahasiswa":
                        student = Student.objects.create(
                            user=user,
                            npm=resp.get("kodeidentitas"),
                            resume=None,
                            phone_number=None
                        )
                        student.save()
                    else:
                        supervisor = Supervisor.objects.create(
                            user=user,
                            nip=resp.get("kodeidentitas")
                        )
                        supervisor.save()
120
121
122
123
                    serializer = LoginSerializer(user, context={'request': request})
                    return Response(serializer.data, status=status.HTTP_201_CREATED)
                serializer = LoginSerializer(user, context={'request': request})
                return Response(serializer.data, status=status.HTTP_200_OK)
124
125
            else:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
126
        elif login_type == "company":
127
128
129
            user = authenticate(username = username, password = password)
            if user is not None:
                login(request, user)
130
131
                serializer = LoginSerializer(user, context={'request': request})
                return Response(serializer.data, status=status.HTTP_200_OK)
132
133
            else:
                return Response(status=status.HTTP_401_UNAUTHORIZED)
134
135
        else:
            return Response(status=status.HTTP_400_BAD_REQUEST)
136
137
138
139
140
141
142
143
144


class CompanyRegisterViewSet(viewsets.GenericViewSet):
    permission_classes = (AllowAny,)
    serializer_class = RegisterSerializer
    queryset = Company.objects.all()
    parser_classes = (MultiPartParser, FormParser,)

    def create(self, request):
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
        """
        Create a new company user
        ---
        parameters:
            - name: username
              description: username of the new account 
              required: true
              type: string
            - name: password
              description: password of the new acoount
              required: true
              type: string
            - name: email
              description: email address of the new acoount
              required: true
              type: string
            - name: name
              description: the new company's name
              required: true
              type: string
            - name: description
              description: description of the new company
              required: true
              type: string
            - name: logo
              description: logo of the new company
              required: false
              type: image
            - name: address
              description: address of the new acoount
              required: false
              type: string
        """
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
        data = {}
        for attr in ['password', 'email', 'name', 'description', 'logo', 'address']:
            data[attr] = request.data.get(attr)
            if data[attr] is None:
                return Response({'error': attr+' is required'}, status=HTTP_400_BAD_REQUEST)

        user, created = User.objects.get_or_create(
            username=data['email'],
            email=data['email'],
            first_name=data['name'],
            last_name=""
        )
        if created:
            user.set_password(data['password'])
            company = Company.objects.create(
                user=user,
                description=data['description'],
                logo=data['logo'],
                address=data['address']
197
            )
198
199
200
201
202
203
            user.save()
            company.save()
            serializer = self.serializer_class(user, context={'request': request})
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response({'error': 'Company with email '+data['email']+' already exist'}, status=HTTP_409_CONFLICT)