diff --git a/core/lib/permissions.py b/core/lib/permissions.py index 78091c84eef10e28d0119a2b0868bf810f53805b..3cd5342c95b0dbf711c7a4ab42e1c14e54bb2cf4 100644 --- a/core/lib/permissions.py +++ b/core/lib/permissions.py @@ -145,3 +145,8 @@ class IsAdminOrVacancyOwner(permissions.BasePermission): raise PermissionDenied( "Checking owner permission on non-application object" ) + + +class AsAdminOrSupervisor(permissions.BasePermission): + def has_permission(self, request, view): + return is_admin_or_supervisor(request.user) diff --git a/core/serializers/vacancies.py b/core/serializers/vacancies.py index 1b4f15dd69bc02e42d009f32064312a6ddf2a36b..da3d5b101e4e6433a326c6a1e9bd46aa970e642d 100644 --- a/core/serializers/vacancies.py +++ b/core/serializers/vacancies.py @@ -58,3 +58,21 @@ class ApplicationStatusSerializer(serializers.ModelSerializer): class Meta: model = Application fields = ['status'] + + +class SupervisorStudentApplicationSerializer(serializers.ModelSerializer): + def to_representation(self, instance): + status_map = ["new", "read", "bookmarked", "rejected", "accepted" ] + return { + 'name' : instance.student.full_name, + 'npm' : instance.student.npm, + 'vacancy_name' : instance.vacancy.name, + 'company_name' : instance.vacancy.company.name, + 'status' : status_map[instance.status] + } + + class Meta: + model = Application + fields = ['name', 'npm', 'vacancy_name', 'company_name', 'status'] + read_only_fields = ['name', 'npm', 'vacancy_name', 'company_name', 'status'] + diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 82a1b07bb91a566814d9b7eae5ebefae8b50ae52..14da0a242baf57ab719354b35600778a2580c2ec 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -5,7 +5,7 @@ from django.contrib.auth.models import User from rest_framework import status from rest_framework.test import APITestCase -from core.models.accounts import Company +from core.models.accounts import Company, Supervisor from core.models.vacancies import Vacancy @@ -186,3 +186,23 @@ class CompanyListsTests(APITestCase): url = '/api/companies/' + str(new_company.pk) + '/applications' response = self.client.post(url, format='json') self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class SupervisorStudentApplicationTests(APITestCase): + + def test_list_student_application(self): + new_user = User.objects.create_user('dummy.supervisor', 'dummy.supervisor@asd.asd', 'lalala123') + new_supervisor = Supervisor.objects.create(user=new_user, nip=1212121212) + self.client.force_authenticate(user=new_user) + + url = '/api/student-applications/' + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_list_student_application_unauthorized(self): + new_user = User.objects.create_user('dummy.supervisor', 'dummy.supervisor@asd.asd', 'lalala123') + self.client.force_authenticate(user=new_user) + + url = '/api/student-applications/' + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) diff --git a/core/views/vacancies.py b/core/views/vacancies.py index 354f3a84434689b87a0f4f98150c8d871e942698..66c8429323ac5b8734d98f6a017a70d14b121b38 100644 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -8,11 +8,11 @@ from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination from core.lib.mixins import MultiSerializerViewSetMixin -from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany, IsAdminOrVacancyOwner +from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany, IsAdminOrVacancyOwner, AsAdminOrSupervisor from core.models import Student, Company from core.models.vacancies import Vacancy, Application from core.serializers.vacancies import VacancySerializer, ApplicationSerializer, ApplicationStatusSerializer, \ - PostVacancySerializer + PostVacancySerializer, SupervisorStudentApplicationSerializer class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): @@ -206,3 +206,17 @@ class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): 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) + + +class SupervisorStudentApplicationViewSet(viewsets.GenericViewSet): + queryset = Student.objects.all() + serializer_class = SupervisorStudentApplicationSerializer + pagination_class = PageNumberPagination + permission_classes = [AsAdminOrSupervisor] + + def list(self, request): + applications = Application.objects.order_by('student') + page = self.paginate_queryset(applications) + if page is not None: + return self.get_paginated_response(self.serializer_class(applications, many=True, context={'request': request}).data) + return Response(self.serializer_class(applications, many=True, context={'request': request}).data) diff --git a/kape/urls.py b/kape/urls.py index da59e3aa14b08d2ed1e43f55f6f1a985d66cd6e4..0a398fecd42e05caa1eb96333c05f1a862875929 100755 --- a/kape/urls.py +++ b/kape/urls.py @@ -25,7 +25,8 @@ from core import apps from core.views.accounts import StudentViewSet, CompanyViewSet, SupervisorViewSet, UserViewSet, LoginViewSet, \ CompanyRegisterViewSet, StudentProfileViewSet from core.views.vacancies import VacancyViewSet, BookmarkedVacancyByStudentViewSet, ApplicationViewSet, \ - CompanyApplicationViewSet, CompanyVacanciesViewSet, CompanyApplicationStatusViewSet + CompanyApplicationViewSet, CompanyVacanciesViewSet, CompanyApplicationStatusViewSet, \ + SupervisorStudentApplicationViewSet schema_view = get_swagger_view() router = routers.DefaultRouter() @@ -38,6 +39,7 @@ router.register(r'register', CompanyRegisterViewSet) router.register(r'vacancies', VacancyViewSet) router.register(r'profiles/students', StudentProfileViewSet) router.register(r'applications', CompanyApplicationStatusViewSet) +router.register(r'student-applications', SupervisorStudentApplicationViewSet) router.register(r'students/(?P<student_id>\d+)/bookmarked-vacancies', BookmarkedVacancyByStudentViewSet, base_name='bookmarked-vacancy-list') router.register(r'students/(?P<student_id>\d+)/applied-vacancies', ApplicationViewSet,