From cd067ca1c1ff81d66d2ed72f1a7a28196b7cf6c8 Mon Sep 17 00:00:00 2001
From: Zamil Majdy <z.majdy1996@gmail.com>
Date: Tue, 28 Mar 2017 06:27:54 +0700
Subject: [PATCH] [#140382397] #11 Add bookmark vacancy API

---
 core/lib/permissions.py |  9 ++++-----
 core/views/accounts.py  | 31 +++++++------------------------
 core/views/vacancies.py | 29 +++++++++++++++++++++++++----
 kape/urls.py            |  6 +++---
 4 files changed, 39 insertions(+), 36 deletions(-)

diff --git a/core/lib/permissions.py b/core/lib/permissions.py
index 662cbbbf..7dbf5205 100644
--- a/core/lib/permissions.py
+++ b/core/lib/permissions.py
@@ -45,8 +45,8 @@ class IsAdminOrStudent(permissions.BasePermission):
             student = obj.student
         else:
             raise APIException(
-                "Checking student permission on object {} not associated with carrier"
-                .format(type(obj.__name__))
+                "Checking student permission on object {} not associated with Student"
+                    .format(type(obj.__name__))
             )
 
         return hasattr(user, "student") and user.student == student
@@ -67,7 +67,7 @@ class IsAdminOrSupervisor(permissions.BasePermission):
             supervisor = obj.supervisor
         else:
             raise APIException(
-                "Checking supervisor permission on object {} not associated with carrier"
+                "Checking supervisor permission on object {} not associated with Supervisor"
                     .format(type(obj.__name__))
             )
 
@@ -89,9 +89,8 @@ class IsAdminOrCompany(permissions.BasePermission):
             company = obj.company
         else:
             raise APIException(
-                "Checking company permission on object {} not associated with carrier"
+                "Checking company permission on object {} not associated with Company"
                     .format(type(obj.__name__))
             )
 
         return hasattr(user, "company") and user.company == company
-
diff --git a/core/views/accounts.py b/core/views/accounts.py
index de96c6dc..a77ad83b 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -1,19 +1,17 @@
 from django.contrib.auth.models import User
-from django.shortcuts import get_object_or_404
-from rest_framework import status
 from rest_framework import viewsets
-from rest_framework.decorators import list_route, detail_route
-from rest_framework.exceptions import ValidationError
+from rest_framework.decorators import list_route
 from rest_framework.response import Response
 
-from core.models import Vacancy
-from core.models.accounts import Student, Company, Supervisor, get_display_name
+from core.lib.permissions import IsAdminOrStudent, IsAdminOrSelfOrReadOnly, IsAdminOrCompany, IsAdminOrSupervisor
+from core.models.accounts import Student, Company, Supervisor
 from core.serializers.accounts import UserSerializer, StudentSerializer, CompanySerializer, SupervisorSerializer
 
 
 class UserViewSet(viewsets.ModelViewSet):
     queryset = User.objects.all()
     serializer_class = UserSerializer
+    permission_classes = [IsAdminOrSelfOrReadOnly]
 
     @list_route(methods=['get'])
     def me(self, request):
@@ -25,34 +23,19 @@ class UserViewSet(viewsets.ModelViewSet):
 class StudentViewSet(viewsets.ModelViewSet):
     queryset = Student.objects.all()
     serializer_class = StudentSerializer
-
-    @detail_route(methods=['post'], url_path='bookmarked-vacancies')
-    def bookmark_vacancies(self, request, pk):
-        user = self.request.user
-        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id'])
-        student = get_object_or_404(Student.objects.all(), pk=pk)
-        if student != user.student and not user.is_staff:
-            raise ValidationError('You must be a student'
-                                  )
-        student.bookmarked_vacancies.add(vacancy)
-        return Response(vacancy, status=status.HTTP_200_OK)
-
-    @detail_route(methods=['delete'], url_path='bookmarked-vacancies')
-    def unbookmark_vacancies(self, request, pk):
-        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id'])
-        student = self.request.user.student
-        student.bookmarked_vacancies.remove(vacancy)
-        return Response(vacancy, status=status.HTTP_200_OK)
+    permission_classes = [IsAdminOrStudent]
 
 
 class CompanyViewSet(viewsets.ModelViewSet):
     queryset = Company.objects.all()
     serializer_class = CompanySerializer
+    permission_classes = [IsAdminOrCompany]
 
 
 class SupervisorViewSet(viewsets.ModelViewSet):
     queryset = Supervisor.objects.all()
     serializer_class = SupervisorSerializer
+    permission_classes = [IsAdminOrSupervisor]
 
 
 
diff --git a/core/views/vacancies.py b/core/views/vacancies.py
index 6b6ba7e9..7ca742e9 100644
--- a/core/views/vacancies.py
+++ b/core/views/vacancies.py
@@ -1,5 +1,9 @@
 from rest_framework import viewsets
+from rest_framework.generics import get_object_or_404
+from rest_framework.response import Response
 
+from core.lib.permissions import IsAdminOrStudent
+from core.models import Student
 from core.models.vacancies import Vacancy, Application
 from core.serializers.vacancies import VacancySerializer, ApplicationSerializer
 
@@ -14,7 +18,24 @@ class ApplicationViewSet(viewsets.ModelViewSet):
     serializer_class = ApplicationSerializer
 
 
-
-
-
-
+class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet):
+    serializer_class = VacancySerializer
+    permission_classes = [IsAdminOrStudent]
+
+    def list(self, request, student_id):
+        student = get_object_or_404(Student.objects.all(), pk=student_id)
+        vacancies = self.serializer_class(student.bookmarked_vacancies, many=True, context={'request': request})
+        return Response(vacancies.data)
+
+    def create(self, request, student_id):
+        print request.data
+        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id'])
+        student = get_object_or_404(Student.objects.all(), pk=student_id)
+        student.bookmarked_vacancies.add(vacancy)
+        return Response(self.serializer_class(student.bookmarked_vacancies, many=True, context={'request': request}).data)
+
+    def destroy(self, request, student_id, pk):
+        vacancy = get_object_or_404(Vacancy.objects.all(), pk=pk)
+        student = get_object_or_404(Student.objects.all(), pk=student_id)
+        student.bookmarked_vacancies.remove(vacancy)
+        return Response(self.serializer_class(student.bookmarked_vacancies, many=True, context={'request': request}).data)
diff --git a/kape/urls.py b/kape/urls.py
index 58a416e7..133d43c2 100755
--- a/kape/urls.py
+++ b/kape/urls.py
@@ -23,12 +23,14 @@ from rest_framework_swagger.views import get_swagger_view
 
 from core import apps
 from core.views.accounts import StudentViewSet, CompanyViewSet, SupervisorViewSet, UserViewSet
-from core.views.vacancies import VacancyViewSet, ApplicationViewSet
+from core.views.vacancies import VacancyViewSet, ApplicationViewSet, BookmarkedVacancyByStudentViewSet
 
 schema_view = get_swagger_view()
 router = routers.DefaultRouter()
 router.register(r'users', UserViewSet)
 router.register(r'students', StudentViewSet)
+router.register(r'students/(?P<student_id>\d+)/bookmarked-vacancies', BookmarkedVacancyByStudentViewSet,
+                base_name='bookmarked-vacancy-list')
 router.register(r'companies', CompanyViewSet)
 router.register(r'supervisors', SupervisorViewSet)
 router.register(r'vacancies', VacancyViewSet)
@@ -43,5 +45,3 @@ urlpatterns += [
     url(r'^admin/', admin.site.urls),
     url(r'', apps.index, name="index"),
 ]
-
-
-- 
GitLab