From af344cc2771602ad89ed8b8f4c4f0e0602092031 Mon Sep 17 00:00:00 2001 From: fariqodri <arfixfari@gmail.com> Date: Thu, 14 Nov 2019 14:37:58 +0700 Subject: [PATCH 1/2] Create test for sorting vacancies --- core/tests/test_vacancies.py | 38 +++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 1a58b142..f9e7e857 100755 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -5,11 +5,13 @@ import requests_mock from django.core.exceptions import ValidationError from django.contrib.auth.models import User from rest_framework import status -from rest_framework.test import APITestCase +from rest_framework.test import APITestCase, APIRequestFactory +from rest_framework.response import Response from core.models.accounts import Company, Student, Supervisor from core.models.vacancies import Vacancy, Application, VacancyMilestone from core.views.vacancies import date_validator +from core.serializers.vacancies import VacancySerializer from core.tests.mocks import mock_csui_oauth_verify, mock_csui_ldap_student, mock_csui_siak_student @@ -213,6 +215,40 @@ class VacancyTest(APITestCase): Vacancy.objects.filter(company__id__in=[new_company.id, new_company2.id]) self.assertEqual(dict(response.data)['count'], Vacancy.objects.count()) self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_sort_vacancies(self): + superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123') + self.client.force_authenticate(user=superuser) + + new_user = User.objects.create_user('dummy.company3', 'dummy.company3@company.com', 'lalala123') + new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, + address=None) + open_time = datetime(2019, 10, 20) + close_time = datetime(2019, 12, 20) + Vacancy.objects.create(company=new_company, verified=True, open_time=open_time, salary=3000000, + description='', close_time=close_time, name='vacancy1', max_accepted_applicants=3, working_period="3 Bulan") + Vacancy.objects.create(company=new_company, verified=True, open_time=open_time, salary=3500000, + description='', close_time=close_time, name='vacancy2', max_accepted_applicants=3, working_period="3 Bulan") + factory = APIRequestFactory() + url_name_asc = '/api/vacancies/?sort=name&order=ascending' + request = factory.get(url_name_asc) + response = self.client.get(url_name_asc, format='json') + self.assertEqual(dict(response.data)['results'], VacancySerializer(Vacancy.objects.order_by('name'), many=True, context={'request': request}).data) + + url_salary_asc = '/api/vacancies/?sort=salary' + response = self.client.get(url_salary_asc) + request = factory.get(url_salary_asc) + self.assertEqual(dict(response.data)['results'], VacancySerializer(Vacancy.objects.order_by('salary'), many=True, context={'request': request}).data) + + url_name_desc = '/api/vacancies/?sort=name&order=descending' + response = self.client.get(url_name_desc) + request = factory.get(url_name_desc) + self.assertEqual(dict(response.data)['results'], VacancySerializer(Vacancy.objects.order_by('-name'), many=True, context={'request': request}).data) + + url_salary_desc = '/api/vacancies/?sort=salary&order=descending' + response = self.client.get(url_salary_desc) + request = factory.get(url_salary_desc) + self.assertEqual(dict(response.data)['results'], VacancySerializer(Vacancy.objects.order_by('-salary'), many=True, context={'request': request}).data) def test_fail_on_unverified_user_vacancy_list(self): url = '/api/vacancies/' -- GitLab From 729b5a5d656573969c15a118dfe3f8964be78d93 Mon Sep 17 00:00:00 2001 From: fariqodri <arfixfari@gmail.com> Date: Thu, 14 Nov 2019 14:54:21 +0700 Subject: [PATCH 2/2] implement sort for vacancies --- core/views/vacancies.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/views/vacancies.py b/core/views/vacancies.py index 616da9fd..1407ec7f 100755 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -47,6 +47,9 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): def list(self, request, *args, **kwargs): search = request.query_params['search'] if 'search' in request.query_params else None verified = request.query_params['verified'] if 'verified' in request.query_params else "True" + order_by = request.GET.get('sort', None) + order = request.GET.get('order', 'ascending') + opened_only = str(request.query_params['opened_only']) \ if 'opened_only' in request.query_params else "False" companies = [int(x) for x in request.query_params.getlist('company', [])] @@ -60,6 +63,7 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): vacancies = self.verifiedFilter(vacancies, verified) vacancies = self.openedJobFilter(vacancies, opened_only) vacancies = self.companyFilter(vacancies, companies) + vacancies = self.sort(order_by, vacancies, order) page = self.paginate_queryset(vacancies) print(vacancies) @@ -86,6 +90,15 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): if len(companies) > 0: vacancies = vacancies.filter(company__id__in=companies) return vacancies + + def sort(self, order_by, vacancies, order): + if order_by is not None and order_by in ['name', 'salary']: + if order in ['ascending', 'descending']: + order_query = "" + if order == 'descending': + order_query = "-" + return vacancies.order_by('{}{}'.format(order_query, order_by)) + return vacancies def name_position_validator(self, names): for name in names.split(" "): -- GitLab