From 03a94f57eeccdec20e2660144afe11e5eca9bc40 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:02:37 +0700 Subject: [PATCH 1/7] add test application request will return 400 if vacancy is closed --- core/tests/test_vacancies.py | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 1667ac1..b45d3fa 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta import requests_mock from django.contrib.auth.models import User @@ -81,7 +81,42 @@ class ApplicationTests(APITestCase): url = '/api/students/' + str(student_id) + '/applied-vacancies/' + str(new_vacancy.pk) + '/' response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_200_OK) + + @requests_mock.Mocker() + def test_cannot_create_application_if_vacancy_is_closed(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.company', 'dummy.company@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(0), + description="lalala", close_time=datetime.today() - timedelta(days=1)) + url = '/api/students/' + str(student_id) + '/applied-vacancies/' + response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, + format='json') + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) class BookmarkApplicationTests(APITestCase): @requests_mock.Mocker() -- GitLab From 46845b6c570610f775ec890b35701b580d826b5c Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:48:33 +0700 Subject: [PATCH 2/7] modify commit, return 400 when vacancy close_time less than today --- core/tests/test_vacancies.py | 8 ++++---- core/views/vacancies.py | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index b45d3fa..bada03a 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -1,5 +1,5 @@ from datetime import datetime, timedelta - +from django.utils import timezone import requests_mock from django.contrib.auth.models import User from rest_framework import status @@ -71,7 +71,7 @@ class ApplicationTests(APITestCase): 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(0), - description="lalala", close_time=datetime.today()) + description="lalala", close_time=(timezone.now() + timedelta(days=1))) url = '/api/students/' + str(student_id) + '/applied-vacancies/' response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, @@ -81,7 +81,7 @@ class ApplicationTests(APITestCase): url = '/api/students/' + str(student_id) + '/applied-vacancies/' + str(new_vacancy.pk) + '/' response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_200_OK) - + @requests_mock.Mocker() def test_cannot_create_application_if_vacancy_is_closed(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) @@ -112,7 +112,7 @@ class ApplicationTests(APITestCase): 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(0), - description="lalala", close_time=datetime.today() - timedelta(days=1)) + description="lalala", close_time=(timezone.now() - timedelta(days=1))) url = '/api/students/' + str(student_id) + '/applied-vacancies/' response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, format='json') diff --git a/core/views/vacancies.py b/core/views/vacancies.py index e4b8b98..7ce8c39 100644 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -1,4 +1,5 @@ import requests +from django.utils import timezone from django.conf import settings from rest_framework import viewsets, status from rest_framework.decorators import detail_route @@ -137,6 +138,9 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): """ cover_letter = request.data.get('cover_letter') vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get('vacancy_id')) + if vacancy.close_time < timezone.now(): + return Response({"error": "vacancy is closed"}, \ + status=status.HTTP_400_BAD_REQUEST) student = get_object_or_404(Student.objects.all(), pk=student_id) if Application.objects.filter(vacancy=vacancy, student=student).exists(): raise ValidationError("You have already applied for the vacancy") -- GitLab From 0955dd709fb9bfbfddd56cbdc08ddf7ec5f9d548 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:57:28 +0700 Subject: [PATCH 3/7] disable Daftar button if application is overdue --- assets/js/components/ApplyModal.jsx | 4 +++- assets/js/components/Vacancy.jsx | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/js/components/ApplyModal.jsx b/assets/js/components/ApplyModal.jsx index fbd6d62..acb63cc 100644 --- a/assets/js/components/ApplyModal.jsx +++ b/assets/js/components/ApplyModal.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import moment from 'moment'; import { Icon, Modal, Button, TextArea, Form, Message } from 'semantic-ui-react'; import ModalAlert from './../components/ModalAlert'; import Server from './../lib/Server'; @@ -65,6 +66,7 @@ export default class ApplyModal extends React.Component { }; render() { + const isApplicationClosed = moment(this.props.data.close_time) < moment.now() return ( {this.props.buttonTitle}} @@ -104,7 +106,7 @@ export default class ApplyModal extends React.Component { )} - diff --git a/assets/js/components/Vacancy.jsx b/assets/js/components/Vacancy.jsx index a755cca..51e3921 100644 --- a/assets/js/components/Vacancy.jsx +++ b/assets/js/components/Vacancy.jsx @@ -89,6 +89,7 @@ export default class Vacancy extends React.Component { header: this.props.data.name, description: this.props.data.description, id: this.props.data.id, + close_time: this.props.data.close_time }} resume={this.props.user.data.student.resume} buttonTitle="Detail" -- GitLab From ea879d493a60b4a4366b3349d88e9a72b075a538 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:02:37 +0700 Subject: [PATCH 4/7] add test application request will return 400 if vacancy is closed --- core/tests/test_vacancies.py | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index ef5126e..ba989fb 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from django.utils import timezone import json @@ -84,7 +84,42 @@ class ApplicationTests(APITestCase): url = '/api/students/' + str(student_id) + '/applied-vacancies/' + str(new_vacancy.pk) + '/' response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_200_OK) + + @requests_mock.Mocker() + def test_cannot_create_application_if_vacancy_is_closed(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.company', 'dummy.company@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(0), + description="lalala", close_time=datetime.today() - timedelta(days=1)) + url = '/api/students/' + str(student_id) + '/applied-vacancies/' + response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, + format='json') + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) class BookmarkApplicationTests(APITestCase): @requests_mock.Mocker() -- GitLab From bc1e8bb14ef3ad44ad91c0a8c8c785f54fccca80 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:48:33 +0700 Subject: [PATCH 5/7] modify commit, return 400 when vacancy close_time less than today --- core/tests/test_vacancies.py | 10 +++++++--- core/views/vacancies.py | 4 ++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index ba989fb..2ca06ff 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -1,6 +1,5 @@ from datetime import datetime, timedelta from django.utils import timezone - import json import requests_mock from django.contrib.auth.models import User @@ -73,8 +72,13 @@ class ApplicationTests(APITestCase): new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123') new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, address=None) +<<<<<<< HEAD new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0), description="lalala", close_time=timezone.now()) +======= + new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0), + description="lalala", close_time=(timezone.now() + timedelta(days=1))) +>>>>>>> modify commit, return 400 when vacancy close_time less than today url = '/api/students/' + str(student_id) + '/applied-vacancies/' response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, @@ -84,7 +88,7 @@ class ApplicationTests(APITestCase): url = '/api/students/' + str(student_id) + '/applied-vacancies/' + str(new_vacancy.pk) + '/' response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_200_OK) - + @requests_mock.Mocker() def test_cannot_create_application_if_vacancy_is_closed(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) @@ -115,7 +119,7 @@ class ApplicationTests(APITestCase): 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(0), - description="lalala", close_time=datetime.today() - timedelta(days=1)) + description="lalala", close_time=(timezone.now() - timedelta(days=1))) url = '/api/students/' + str(student_id) + '/applied-vacancies/' response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, format='json') diff --git a/core/views/vacancies.py b/core/views/vacancies.py index a81a1be..18d7727 100644 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -1,4 +1,5 @@ import requests +from django.utils import timezone from django.conf import settings from rest_framework import viewsets, status from rest_framework.decorators import detail_route @@ -194,6 +195,9 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): """ cover_letter = request.data.get('cover_letter') vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get('vacancy_id')) + if vacancy.close_time < timezone.now(): + return Response({"error": "vacancy is closed"}, \ + status=status.HTTP_400_BAD_REQUEST) student = get_object_or_404(Student.objects.all(), pk=student_id) if Application.objects.filter(vacancy=vacancy, student=student).exists(): raise ValidationError("You have already applied for the vacancy") -- GitLab From fee3cf866a8bf0d086625f5ceebab5735c0b23a1 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Wed, 2 Oct 2019 11:57:28 +0700 Subject: [PATCH 6/7] disable Daftar button if application is overdue --- assets/js/components/ApplyModal.jsx | 4 +++- assets/js/components/Vacancy.jsx | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/js/components/ApplyModal.jsx b/assets/js/components/ApplyModal.jsx index fbd6d62..acb63cc 100644 --- a/assets/js/components/ApplyModal.jsx +++ b/assets/js/components/ApplyModal.jsx @@ -1,4 +1,5 @@ import React from 'react'; +import moment from 'moment'; import { Icon, Modal, Button, TextArea, Form, Message } from 'semantic-ui-react'; import ModalAlert from './../components/ModalAlert'; import Server from './../lib/Server'; @@ -65,6 +66,7 @@ export default class ApplyModal extends React.Component { }; render() { + const isApplicationClosed = moment(this.props.data.close_time) < moment.now() return ( {this.props.buttonTitle}} @@ -104,7 +106,7 @@ export default class ApplyModal extends React.Component { )} - diff --git a/assets/js/components/Vacancy.jsx b/assets/js/components/Vacancy.jsx index 283bc46..3180a4c 100644 --- a/assets/js/components/Vacancy.jsx +++ b/assets/js/components/Vacancy.jsx @@ -89,6 +89,7 @@ export default class Vacancy extends React.Component { header: this.props.data.name, description: this.props.data.description, id: this.props.data.id, + close_time: this.props.data.close_time }} resume={this.props.user.data.student.resume} buttonTitle="Detail" -- GitLab From d436e522c227655cadfccb3a2a09f73ae6067264 Mon Sep 17 00:00:00 2001 From: Ivana Irene Thomas Date: Mon, 7 Oct 2019 13:23:58 +0700 Subject: [PATCH 7/7] resolve conflicts with master --- core/tests/test_vacancies.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 2ca06ff..0d0e1c3 100644 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -72,13 +72,8 @@ class ApplicationTests(APITestCase): new_user = User.objects.create_user('dummy.company', 'dummy.company@company.com', 'lalala123') new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, address=None) -<<<<<<< HEAD new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(1541319300.0), - description="lalala", close_time=timezone.now()) -======= - new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0), description="lalala", close_time=(timezone.now() + timedelta(days=1))) ->>>>>>> modify commit, return 400 when vacancy close_time less than today url = '/api/students/' + str(student_id) + '/applied-vacancies/' response = self.client.post(url, {'vacancy_id': new_vacancy.pk, 'cover_letter': 'this is a cover letter.'}, -- GitLab