From cb1a238f12d3277067a7825380e1af21255d54bd Mon Sep 17 00:00:00 2001 From: Swastinika Naima Moertadho <swastinika.naima@ui.ac.id> Date: Sat, 12 Oct 2019 18:36:14 +0700 Subject: [PATCH] Sebagai perusahaan, saya ingin bisa mencantumkan alasan saya menolak sebuah lamaran sehingga pelamar tersebut bisa mengetahui kekurangannya dan bisa mengevaluasi diri ketika melamar pekerjaan ke depannya. --- .DS_Store | Bin 10244 -> 0 bytes assets/js/components/ApproveModal.jsx | 14 ++- assets/js/components/ConfirmationModal.jsx | 19 +++- core/migrations/0001_initial.py | 10 +- core/models/vacancies.py | 7 +- core/serializers/vacancies.py | 9 +- core/tests/test_vacancies.py | 96 +++++++++++------- core/views/vacancies.py | 14 ++- .../a78eefaf-9e2f-402a-965d-67b9aa9e6ea6.pdf | Bin 0 -> 14052 bytes .../d62c211d-c5f4-4ab9-afbe-58df4af67789.pdf | Bin 0 -> 14052 bytes 10 files changed, 116 insertions(+), 53 deletions(-) delete mode 100755 .DS_Store create mode 100644 kape/files/student-ui-ux-portofolio/a78eefaf-9e2f-402a-965d-67b9aa9e6ea6.pdf create mode 100644 kape/files/student-ui-ux-portofolio/d62c211d-c5f4-4ab9-afbe-58df4af67789.pdf diff --git a/.DS_Store b/.DS_Store deleted file mode 100755 index 877d8f79f51a6e99addb143fe20b35e312133f9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmZQzU|@7AO)+F(P+(wS;9!8z0z3>@0Z1N%F(jFwBDx^+7#IW?7*ZLE7!n!M8B#rS zpmL+sXb6mkz-S1JhQMeDjE2DA3IRrlb2zvm^e8zR0;3@?8UpYT0F@7*4g!dFfVA-$ z8Xz=Ch=GxT0o(;(WME){X<`KT0~kPZAgv%8q!mPiv@$S)SYR{2S{WFjS{cFJ5Rg6r zuu+WQt_g?_*3Q5PwwZx}5o|L910zH`10&RCMraR(5u%-e5o|jH10zH`*vwI4Gz3ON z05t?aeRoa<J%(h4e1<aQ{(F9MQcivn12{V~wlXj<zW5IYVC}pNdJHKH`3%Vn*<d}H z4CxGc4EYR2pq@X9&d+E%L3X7w6f@*7WHRJ2lrR)ABzxu{>tL{EU|@;>TlF7o7Yl<P zLpnnyLkXI?m1yd?VCoofyG9&M4?A2>4nrbC5~>X#U!%B$4^=gTE<-XyCW9VBB||Pl z4w~N2Xf}a-QNobRP=Klq?AsGazGY)bWGH4RW=LfyVJOB_%b<azmIWMZ7-7z^l7Ruc zx}@^r0%)wBOe)C9EG{uHxX#GL%)-jX&cVsS$-&DJ8=R3}9$b=GQd;bkSQHK71tgYa zBth9B`T03;c4AUkW@>r7fQWN`UP)qRUTP6Yd2nV*YEoiROn7EqN`ARheraAxG1wfa z1jruFcmav(YBNI%9R))J(^?&cYBOVF9R(9hv)Wot4slgOThD~t%Bt#`+PazGL;x@M z8TcW5I5~>}RQrIEZxKUkS#VKaPJUiGxPoC|;9^K&NMg`qC}t=GC%6)ZR0d<zKxGt1 z3oId&gbj+~d{DG8<bxvxdt|qwnZd>2f|NPZ7%~}huw@LCNMdG4WyoVF!*m@=#)GOt zipUcK9g*VI)uzT4ItrE+pm;PlG15^mH8#SC#~F|qgVo;{@d%1%sPE8Xk(B`&f*2VB zR0JSr9u|gdhD3$}^sokHGKLu_83(EkZ#Z&rad7c+(LO_PfU;h^04N*{bQDaDjKSe( zZlI%JVvLy|hzUn{IG}|jFF1UP7;+gBp+$ZkLmGn~Ll(A>MF}x>1|J4b24@CW20w;i z23O2filUkmY(pMoD40Qyp@5+hO$R8)Ajb#~xcW$8NM(p;$Ysc9NMR@i<r#E$fpRMo za*PWy6fh)$t0C~PGlMQe4m9V1eZ`Q^kcVkAiU~YuCg9TdnSlY#j|B`x;7T)-p_m~P z(<V@=W8^?eb({<sI)-Wb!{Sr4l*q{t#Nf){$l$`@%izkO$B@gAf*MbtN(?3Rc+qs^ zGvqL&VABaoBPcorK+O_{LWWX?OfV}KT+)^>6f@{ClrU7FH!MKaK8k*BaLJ#_07{)j zklcb9+l-)w4r*+JD)Ay{qY9j=(0pjkz`$66ls+UFib3WwBr+5+=t9#<7DFmSGD8VC z4}nr!0l2wU!jQ?3ik>&XA%<)o3j?UWE5`62sA+<nhXi2iz#&r3kjjt*&l6bO4Gv#q zdxRKJ_2@DbGn6nSf*LTmLJO2Pm@Sa}E{0}?9zzniA(V<#PJx<r*xUnZoFcnN5W_4` z>i|^J;W7afcgQA)W0(LbRT3F;2)hU5H<UUX({GS+0F-(OxC|Vp$PI5!hDvby$Yaoh zm2_ySY9#{$O2|U0-BEHh1V%$(Gz3sWfEmJ50FD2<GBDtp|A(j=B}YSGGz5la2r#m^ z1iLsv$4s#K5H!{f8c$DvN`l7VL8JMMpz(Q#K9Ca7&^~xLo(Zz3NCTvtk%7SgM1wFR p0|R(Co{<4Enm=%p0i*qY$dE6nRg9%g4Qh9y^ma%4|HG~S4*(8i45R=6 diff --git a/assets/js/components/ApproveModal.jsx b/assets/js/components/ApproveModal.jsx index 2f609b36..a08313c9 100755 --- a/assets/js/components/ApproveModal.jsx +++ b/assets/js/components/ApproveModal.jsx @@ -17,6 +17,7 @@ export default class ApproveModal extends React.Component { modalOpen: false, rejectLoading: false, acceptLoading: false, + formValue: '', finishLoading: false, }; this.handleOpen = this.handleOpen.bind(this); @@ -26,6 +27,7 @@ export default class ApproveModal extends React.Component { this.gotoStudentProfile = this.gotoStudentProfile.bind(this); this.gotoStudentResume = this.gotoStudentResume.bind(this); this.gotoStudentTranscript = this.gotoStudentTranscript.bind(this); + this.formValueHandler = this.formValueHandler.bind(this); } componentWillUpdate() { @@ -47,6 +49,10 @@ export default class ApproveModal extends React.Component { this.setState({ modalOpen: false }); }; + formValueHandler(event) { + this.setState({ formValue: event }); + } + readApplication = () => { const data = { status: Applicant.APPLICATION_STATUS.READ }; return ( @@ -58,7 +64,7 @@ export default class ApproveModal extends React.Component { }; rejectApplication = () => { - const data = { status: Applicant.APPLICATION_STATUS.REJECTED }; + const data = { status: Applicant.APPLICATION_STATUS.REJECTED, reason: this.state.formValue }; this.setState({ rejectLoading: true }); Server.patch(`/applications/${this.props.data.id}/`, data).then((status) => { this.props.updateStatus(this.props.data.id, status.status); @@ -71,6 +77,7 @@ export default class ApproveModal extends React.Component { 'Apakah anda yakin untuk menolak lamaran ini?', 'trash', this.rejectApplication, + true, ); }; @@ -107,6 +114,7 @@ export default class ApproveModal extends React.Component { 'Apakah anda yakin untuk menerima lamaran ini?', 'checkmark', this.acceptApplication, + false, ); }; @@ -131,9 +139,7 @@ export default class ApproveModal extends React.Component { onClose={this.handleClose} > <ConfirmationModal - ref={(modal) => { - this.modal = modal; - }} + ref={(modal) => { this.modal = modal; }} formValueHandler={this.formValueHandler} /> <Modal.Header>Data Lamaran</Modal.Header> <Modal.Content> diff --git a/assets/js/components/ConfirmationModal.jsx b/assets/js/components/ConfirmationModal.jsx index 800e3017..75357a65 100755 --- a/assets/js/components/ConfirmationModal.jsx +++ b/assets/js/components/ConfirmationModal.jsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Modal, Button, Icon, Header } from 'semantic-ui-react'; +import { Modal, Button, Icon, Header, Form } from 'semantic-ui-react'; export default class ConfirmationModal extends React.Component { @@ -10,11 +10,15 @@ export default class ConfirmationModal extends React.Component { modalOpen: false, header: '', content: '', + formValue: '', + formPlaceholder: 'Tulis alasan penolakan', icon: 'trash', + isForm: false, callback: () => {}, }; this.open = this.open.bind(this); this.handleYes = this.handleYes.bind(this); + this.handleChange = this.handleChange.bind(this); } componentWillUpdate() { @@ -34,10 +38,17 @@ export default class ConfirmationModal extends React.Component { modalOpen: false, }); + handleChange = (event) => { + this.setState({ formValue: event.target.value }); + this.props.formValueHandler(this.state.formValue); + }; + handleYes = () => { this.state.callback(); this.handleClose(); } - open = (header = this.state.header, content = this.state.content, icon = this.state.icon, callback = this.state.callback()) => { - this.setState({ modalOpen: true, header, content, callback, icon }); + open = ( + header = this.state.header, content = this.state.content, icon = this.state.icon, + callback = this.state.callback(), isForm = this.state.isForm) => { + this.setState({ modalOpen: true, header, content, callback, icon, isForm }); }; render = () => ( @@ -48,6 +59,8 @@ export default class ConfirmationModal extends React.Component { <Header icon={this.state.icon} content={this.state.header} /> <Modal.Content> <p>{this.state.content}</p> + {this.state.isForm ? + <Form.Input style={{ width: '650px', height: '100px' }} type="text" placeholder={this.state.formPlaceholder} value={this.state.value} onChange={this.handleChange} /> : null } </Modal.Content> <Modal.Actions> <Button onClick={this.handleClose} basic color="red" inverted> diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index 0476aef6..5ab7aa38 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.17 on 2019-10-12 08:21 +# Generated by Django 1.11.17 on 2019-10-12 09:54 from __future__ import unicode_literals import core.lib.validators @@ -76,6 +76,7 @@ class Migration(migrations.Migration): ('photo', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_photo_file_path, validators=[core.lib.validators.validate_image_file_extension])), ('portfolio_link', models.URLField(blank=True, null=True)), ('linkedin_url', models.URLField(blank=True, null=True)), + ('hackerrank_url', models.URLField(blank=True, null=True)), ('website_url', models.URLField(blank=True, null=True)), ('work_experience', models.CharField(blank=True, max_length=500, null=True)), ('region', models.CharField(blank=True, max_length=30, null=True)), @@ -140,6 +141,13 @@ class Migration(migrations.Migration): ('vacancy', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='milestones', to='core.Vacancy')), ], ), + migrations.CreateModel( + name='ReasonRejected', + fields=[ + ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='core.Application')), + ('reason', models.TextField(default=b'Tidak memenuhi kualifikasi perusahaan.')), + ], + ), migrations.AddField( model_name='student', name='applied_vacancies', diff --git a/core/models/vacancies.py b/core/models/vacancies.py index 219c4d8f..6ad88fe5 100755 --- a/core/models/vacancies.py +++ b/core/models/vacancies.py @@ -22,7 +22,7 @@ class Vacancy(models.Model): @property def apply_before(self): if(self.close_time<timezone.now()): - return "Pendaftaran ditutup" + return "Pendaftaran ditutup" return "Daftar sebelum "+self.close_time.strftime('%d')+" "+self.close_time.strftime('%B')+" "+self.close_time.strftime('%Y') class Meta: @@ -47,6 +47,11 @@ class Application(models.Model): unique_together = (("student", "vacancy"),) +class ReasonRejected(models.Model): + application = models.ForeignKey(Application, on_delete=models.CASCADE, primary_key=True) + reason = models.TextField(default='Tidak memenuhi kualifikasi perusahaan.') + + class VacancyMilestone(models.Model): vacancy = models.ForeignKey(Vacancy, on_delete=models.CASCADE, related_name="milestones", null=False) name = models.CharField(max_length=100, null=False) diff --git a/core/serializers/vacancies.py b/core/serializers/vacancies.py index aca8891b..911afdf7 100755 --- a/core/serializers/vacancies.py +++ b/core/serializers/vacancies.py @@ -1,7 +1,7 @@ from rest_framework import serializers from core.models import Company -from core.models.vacancies import Vacancy, Application, VacancyMilestone +from core.models.vacancies import Vacancy, Application, VacancyMilestone, ReasonRejected from core.serializers.accounts import StudentSerializer, CompanySerializer @@ -65,6 +65,13 @@ class ApplicationStatusSerializer(serializers.ModelSerializer): model = Application fields = ['status'] +class ReasonRejectedSerializer(serializers.ModelSerializer): + application = ApplicationSerializer() + + class Meta: + model = ReasonRejected + fields = '__all__' + class SupervisorStudentApplicationSerializer(serializers.ModelSerializer): def to_representation(self, instance): status_map = ["new", "read", "bookmarked", "rejected", "accepted","aborted" ] diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py index 119521ee..6050ff6a 100755 --- a/core/tests/test_vacancies.py +++ b/core/tests/test_vacancies.py @@ -14,7 +14,9 @@ from core.serializers.vacancies import VacancySerializer class ApplicationTests(APITestCase): @requests_mock.Mocker() def test_application_list(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.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", @@ -23,14 +25,16 @@ class ApplicationTests(APITestCase): "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) + 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/' @@ -76,7 +80,9 @@ class ApplicationTests(APITestCase): @requests_mock.Mocker() def test_application_create_and_delete(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.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", @@ -85,14 +91,16 @@ class ApplicationTests(APITestCase): "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) + 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/' @@ -197,7 +205,9 @@ class ApplicationTests(APITestCase): class BookmarkApplicationTests(APITestCase): @requests_mock.Mocker() def test_application_list(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.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", @@ -206,14 +216,16 @@ class BookmarkApplicationTests(APITestCase): "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) + 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/' @@ -264,7 +276,9 @@ class BookmarkApplicationTests(APITestCase): @requests_mock.Mocker() def test_application_create_and_delete(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.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", @@ -273,14 +287,16 @@ class BookmarkApplicationTests(APITestCase): "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) + 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/' @@ -675,7 +691,8 @@ class CompanyListsTests(APITestCase): def test_company_application_list_with_major(self): new_user = User.objects.create_user('dummy.company4', 'dummy.company4@company.com', 'lalala123') - new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, address=None) + new_company = Company.objects.create(user=new_user, description="lalala", status=Company.VERIFIED, logo=None, + address=None) self.client.force_authenticate(new_user) @@ -683,6 +700,7 @@ class CompanyListsTests(APITestCase): response = self.client.get(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') @@ -983,7 +1001,7 @@ class AcceptOneOfferTests(APITestCase): new_user2 = User.objects.create_user('dummy.company2', 'dummy.company2@company.com', 'lalala123') new_company2 = Company.objects.create(user=new_user2, description="lalala", status=Company.VERIFIED, logo=None, - address=None) + address=None) new_vacancy = Vacancy.objects.create(company=new_company, verified=True, open_time=datetime.fromtimestamp(0), description="lalala", requirements= "requirements", close_time=datetime.today()) @@ -1021,7 +1039,7 @@ class AcceptOneOfferTests(APITestCase): self.assertTrue('aborted' in status_response) def test_student_not_exist_given_auth(self): - new_user3,new_vacancy, new_vacancy2, new_student = self.generateObject() + new_user3, new_vacancy, new_vacancy2, new_student = self.generateObject() self.client.force_authenticate(new_user3) diff --git a/core/views/vacancies.py b/core/views/vacancies.py index 0ee98338..29382c6b 100755 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -16,7 +16,7 @@ from core.lib.mixins import MultiSerializerViewSetMixin from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany, IsAdminOrVacancyOwner, AsAdminOrSupervisor, \ VacancyApprovalPermission, IsAdminOrVacancyOwnerOrAuthenticatedReadOnly from core.models import Student, Company -from core.models.vacancies import Vacancy, Application, VacancyMilestone +from core.models.vacancies import Vacancy, Application, VacancyMilestone, ReasonRejected from core.serializers.vacancies import VacancySerializer, ApplicationSerializer, ApplicationStatusSerializer, \ PostVacancySerializer, VacancyVerifiedSerializer, SupervisorStudentApplicationSerializer, \ VacancyMilestoneSerializer @@ -186,6 +186,8 @@ class ApplicationViewSet(MultiSerializerViewSetMixin, viewsets.GenericViewSet): serializer = self.get_serializer_class()(application, data=request.data, partial=True) if serializer.is_valid(): serializer.save() + if request.data['status'] == 3: + ReasonRejected.objects.create(application=application, reason=request.data['reason']) return Response(serializer.data, status=status.HTTP_202_ACCEPTED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -261,12 +263,15 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): application.delete() return Response(ApplicationSerializer(application, context={'request': request}).data) + class StatusError(Exception): pass + class UnauthorizeError(Exception): pass + class CompanyApplicationViewSet(viewsets.GenericViewSet): queryset = Application.objects.all() permission_classes = [IsAdminOrCompany] @@ -295,7 +300,7 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): return Response({"error": "forbidden"}, status=status.HTTP_403_FORBIDDEN) except (StatusError, ValueError): return Response({"error": "status must be an integer between 0 and 4"}, \ - status=status.HTTP_400_BAD_REQUEST) + status=status.HTTP_400_BAD_REQUEST) @detail_route(methods=["get"]) def by_vacancy(self, request, company_id, pk=None): @@ -323,7 +328,7 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): return Response({"error": "forbidden"}, status=status.HTTP_403_FORBIDDEN) except (StatusError, ValueError): return Response({"error": "status must be an integer between 0 and 4"}, \ - status=status.HTTP_400_BAD_REQUEST) + status=status.HTTP_400_BAD_REQUEST) def __get_company_list_by_company_id(self, request, company_id): company = get_object_or_404(Company.objects.all().order_by('-updated'), pk=company_id) @@ -335,7 +340,7 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): return request.user.is_superuser or request.user == company.user def __get_vacancy_list_by_pk(self, pk, company): - vacancy = get_object_or_404(Vacancy.objects.all(), pk=pk) + vacancy = get_object_or_404(Vacancy.objects.all(), pk=pk) if not self.__validating_vacancy(vacancy, company): raise UnauthorizeError return vacancy @@ -361,6 +366,7 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): raise StatusError return True + class CompanyVacanciesViewSet(viewsets.GenericViewSet): queryset = Vacancy.objects.all() pagination_class = PageNumberPagination diff --git a/kape/files/student-ui-ux-portofolio/a78eefaf-9e2f-402a-965d-67b9aa9e6ea6.pdf b/kape/files/student-ui-ux-portofolio/a78eefaf-9e2f-402a-965d-67b9aa9e6ea6.pdf new file mode 100644 index 0000000000000000000000000000000000000000..379cb93fd41385e7ea21e9f02d44b2fb84fd860d GIT binary patch literal 14052 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 XC5c5P6-B9OTt<dwT&k+B{%%|V*fYM^ literal 0 HcmV?d00001 diff --git a/kape/files/student-ui-ux-portofolio/d62c211d-c5f4-4ab9-afbe-58df4af67789.pdf b/kape/files/student-ui-ux-portofolio/d62c211d-c5f4-4ab9-afbe-58df4af67789.pdf new file mode 100644 index 0000000000000000000000000000000000000000..379cb93fd41385e7ea21e9f02d44b2fb84fd860d GIT binary patch literal 14052 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 XC5c5P6-B9OTt<dwT&k+B{%%|V*fYM^ literal 0 HcmV?d00001 -- GitLab