diff --git a/README.md b/README.md index 3734ba0a5f9c94947bcea0145748b6214280794a..20458ca9df4737a909f848aec0677d5583fb815c 100755 --- a/README.md +++ b/README.md @@ -166,3 +166,4 @@ container. Thus, you can see the app via Web browser by opening Copyright (c) 2017 PPLA1 Team & Faculty of Computer Science Universitas Indonesia. This project is licensed under [ISC](LICENSE) license. + diff --git a/assets/js/VacancyPage.jsx b/assets/js/VacancyPage.jsx index 28e3f52cadeffc3b6ed6ca0402655052ba91c5e9..a4a2bee04c97abdf8e320e362a3ffb657934a6f9 100644 --- a/assets/js/VacancyPage.jsx +++ b/assets/js/VacancyPage.jsx @@ -78,6 +78,19 @@ export default class VacancyPage extends React.Component { } /> </Pane> + <Pane label="Lowongan Tersedia" > + <Pagination + key={4} + url="/vacancies/opened_only=1" + child={ + <VacancyList + user={this.props.user} + key={4} + userId={this.state.id} + /> + } + /> + </Pane> </Tabs> ); } else if ((this.props.user.role === 'admin' && this.props.user.data.company != null) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 70bcc648c8fc7cdb7abed912cff15eec118d0ce6..5b38221642e579d98754a8b9175926062ddc6c16 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -206,6 +206,58 @@ class VacancyTest(APITestCase): response = self.client.post(url, format='json') self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + def test_opened_only_vacancy_list(self): + superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123') + self.client.force_authenticate(user=superuser) + + url = '/api/vacancies/?opened_only=true' + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_opened_and_unopened_vacancy_list(self): + superuser = User.objects.create_superuser('dummy.company', 'dummy.company@company.com', 'lalala123') + self.client.force_authenticate(user=superuser) + + url = '/api/vacancies/?opened_only=false' + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + @requests_mock.Mocker() + def test_closed_vacancy_not_included(self, m): + m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200) + m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={ + "username": "dummy.mahasiswa", + "nama": "Dummy Mahasiswa", + "state": 1, + "kode_org": "01.00.12.01:mahasiswa", + "kodeidentitas": "1234567890", + "nama_role": "mahasiswa" + }, status_code=200) + m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={ + "kota_lahir": "kota_kota", + "tgl_lahir": "2017-12-31", + "program": [{ + "nm_org": "Ilmu Informasi", + "angkatan": "2017" + }] + }, status_code=200) + + url = '/api/login/' + + response = self.client.post(url, {'username': 'dummy.mahasiswa', 'password': 'lalala', 'login-type': 'sso-ui'}, + format='json') + student_id = response.data.get('student').get('id') + + new_user = User.objects.create_user('dummy.company2', 'dummy.compan2y@company.com', 'lalala123') + new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, + address=None) + new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0), + description="expired vacancy", close_time=datetime.fromtimestamp(1541319301.0)) + + url = '/api/vacancies/?opened_only=true' + response = self.client.get(url, format='json') + self.assertEqual("expired vacancy" in response, False) + class CompanyListsTests(APITestCase): def test_company_vacancy_list(self): diff --git a/core/views/vacancies.py b/core/views/vacancies.py index f51cfd3ae9064cbee6c8f97c29071d8541bc1845..a0dfca9e8a5ff6eab4dad719225022900900a9ee 100644 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -17,6 +17,7 @@ from core.serializers.vacancies import VacancySerializer, ApplicationSerializer, PostVacancySerializer, VacancyVerifiedSerializer, SupervisorStudentApplicationSerializer from core.views.accounts import StudentViewSet +from datetime import datetime, timedelta, time class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): queryset = Vacancy.objects.all() @@ -40,8 +41,16 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): vacancies = vacancies.filter(verified=True) if verified.lower() in {"no", "false", "f", "0"}: vacancies = vacancies.filter(verified=False) + + opened_only = str(request.query_params['opened_only']) \ + if 'opened_only' in request.query_params else "False" + if opened_only.lower() in ("yes", "true", "t", "1"): + today = datetime.combine(datetime.now().date(), time()) + vacancies = vacancies.filter(close_time__gte=today) + if len(companies) > 0: vacancies = vacancies.filter(company__id__in=companies) + page = self.paginate_queryset(vacancies) if page is not None: return self.get_paginated_response(VacancySerializer(page, many=True, context={'request': request}).data)