Fakultas Ilmu Komputer UI
Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
PMPL
Class Project
Kape
Commits
778e9df8
Commit
778e9df8
authored
Dec 06, 2019
by
Khoirul Khuluqi Abdulloh
Browse files
Merge branch 'master' of
https://gitlab.cs.ui.ac.id/pmpl/class-project/kape
parents
003cab02
1471acce
Pipeline
#26867
passed with stages
in 14 minutes and 40 seconds
Changes
8
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
assets/css/custom.css
View file @
778e9df8
...
...
@@ -71,7 +71,20 @@ img {
-moz-background-size
:
cover
;
-o-background-size
:
cover
;
background-size
:
cover
;
padding-bottom
:
80px
;
min-height
:
100vh
;
display
:
flex
;
flex-flow
:
column
;
}
.register-card
{
width
:
calc
(
100%
-
2rem
)
!important
;
margin
:
1rem
!important
;
padding
:
1rem
!important
;
}
.auth-page-content
{
flex-grow
:
1
;
padding-bottom
:
30px
;
}
.headerLoginform
{
...
...
assets/js/CompanyRegisterPage.jsx
0 → 100644
View file @
778e9df8
import
React
from
'
react
'
;
import
PropTypes
from
'
prop-types
'
;
import
CompanyRegisterModal
from
'
./components/CompanyRegisterModal
'
;
import
Footer
from
'
./components/Footer
'
;
import
{
Grid
,
Header
,
Image
}
from
'
semantic-ui-react
'
;
const
CompanyRegisterPage
=
()
=>
{
return
(
<
div
class
=
"halamanLogin"
>
<
div
class
=
"auth-page-content"
>
<
div
class
=
"headerLogin"
>
<
Header
as
=
"h2"
icon
textAlign
=
"center"
>
<
Image
src
=
"/assets/img/logo.png"
size
=
"medium"
centered
/>
<
Header
.
Content
>
Kanal Akses Pendaftaran KP Elektronik
</
Header
.
Content
>
</
Header
>
</
div
>
<
Grid
stackable
columns
=
{
2
}
padded
style
=
{
{
display
:
'
flex
'
,
justifyContent
:
'
center
'
}
}
>
<
Grid
.
Column
width
=
"seven"
style
=
{
{
backgroundColor
:
'
white
'
,
border
:
'
1px solid #aeaeae
'
,
borderRadius
:
'
6px
'
}
}
>
<
CompanyRegisterModal
/>
</
Grid
.
Column
>
</
Grid
>
</
div
>
<
Footer
/>
</
div
>
);
};
CompanyRegisterPage
.
propTypes
=
{
children
:
PropTypes
.
node
,
};
CompanyRegisterPage
.
defaultProps
=
{
children
:
null
,
};
export
default
CompanyRegisterPage
;
assets/js/Login.jsx
View file @
778e9df8
...
...
@@ -4,7 +4,6 @@ import {
Grid
,
Segment
,
Header
,
Card
,
Image
,
Button
,
}
from
'
semantic-ui-react
'
;
import
LoginForm
from
'
./components/LoginForm
'
;
import
CompanyRegisterModal
from
'
./components/CompanyRegisterModal
'
;
import
Footer
from
'
./components/Footer
'
;
import
InfoModal
from
'
./components/InfoModal
'
;
...
...
@@ -66,46 +65,46 @@ const Login = ({ children }) => {
return
(
<
div
className
=
"halamanLogin"
>
<
div
className
=
"headerLogin"
>
<
Header
as
=
"h2"
icon
textAlign
=
"center"
>
<
Image
src
=
"/assets/img/logo.png"
size
=
"medium"
centered
/>
<
Header
.
Content
>
Kanal Akses Pendaftaran KP Elektronik
</
Header
.
Content
>
<
InfoModal
>
KAPE INFO
</
InfoModal
>
</
Header
>
</
div
>
<
div
className
=
"auth-page-content"
>
<
div
className
=
"headerLogin"
>
<
Header
as
=
"h2"
icon
textAlign
=
"center"
>
<
Image
src
=
"/assets/img/logo.png"
size
=
"medium"
centered
/>
<
Header
.
Content
>
Kanal Akses Pendaftaran KP Elektronik
</
Header
.
Content
>
<
InfoModal
>
KAPE INFO
</
InfoModal
>
</
Header
>
</
div
>
<
Grid
stackable
columns
=
{
2
}
padded
style
=
{
{
display
:
'
flex
'
,
justifyContent
:
'
center
'
}
}
>
<
Grid
.
Column
width
=
"seven"
>
{
activeForm
===
'
user
'
?
(
<
UserForm
onChange
=
{
(
role
)
=>
setActiveForm
(
role
)
}
>
{
children
}
</
UserForm
>
)
:
(
<
CompanyForm
onChange
=
{
(
role
)
=>
setActiveForm
(
role
)
}
>
{
children
}
</
CompanyForm
>
)
}
<
div
className
=
"register"
>
<
Card
centered
className
=
"register"
>
<
Card
.
Content
>
<
Grid
columns
=
{
2
}
relaxed
>
<
Grid
.
Column
>
<
Header
as
=
"h3"
>
New to us ?
</
Header
>
</
Grid
.
Column
>
<
Grid
.
Column
>
<
CompanyRegisterModal
/>
</
Grid
.
Column
>
</
Grid
>
</
Card
.
Content
>
<
Grid
stackable
columns
=
{
2
}
padded
style
=
{
{
display
:
'
flex
'
,
justifyContent
:
'
center
'
}
}
>
<
Grid
.
Column
width
=
"seven"
>
{
activeForm
===
'
user
'
?
(
<
UserForm
onChange
=
{
(
role
)
=>
setActiveForm
(
role
)
}
>
{
children
}
</
UserForm
>
)
:
(
<
CompanyForm
onChange
=
{
(
role
)
=>
setActiveForm
(
role
)
}
>
{
children
}
</
CompanyForm
>
)
}
{
activeForm
!==
'
user
'
?
(
<
Card
className
=
"register register-card"
>
<
Grid
columns
=
{
2
}
relaxed
>
<
Grid
.
Column
>
<
Header
as
=
"h3"
>
New to us ?
</
Header
>
</
Grid
.
Column
>
<
Grid
.
Column
>
<
a
className
=
"ui primary button"
href
=
"/register-perusahaan"
>
Register Your Company
</
a
>
</
Grid
.
Column
>
</
Grid
>
</
Card
>
</
div
>
</
Grid
.
Column
>
</
Grid
>
)
:
""
}
</
Grid
.
Column
>
</
Grid
>
</
div
>
<
Footer
/>
</
div
>
);
...
...
assets/js/__test__/CompanyRegisterPage-test.jsx
0 → 100644
View file @
778e9df8
import
React
from
'
react
'
;
import
CompanyRegisterPage
from
'
../CompanyRegisterPage
'
;
import
CompanyRegisterModal
from
'
../components/CompanyRegisterModal
'
;
import
{
shallow
}
from
'
enzyme
'
;
describe
(
'
CompanyRegisterPage
'
,
()
=>
{
it
(
'
renders main form component
'
,
()
=>
{
const
wrapper
=
shallow
(<
CompanyRegisterPage
/>);
expect
(
wrapper
.
find
(
CompanyRegisterModal
)).
to
.
exist
;
});
});
\ No newline at end of file
assets/js/components/CompanyRegisterModal.jsx
View file @
778e9df8
...
...
@@ -129,7 +129,7 @@ export default class CompanyRegisterModal extends React.Component {
benefitViews
.
push
(
benefitView
);
});
return
(
<
Modal
trigger
=
{
<
Button
primary
floated
=
"right"
>
Register
</
Button
>
}
closeIcon
=
"close"
>
<
div
>
<
Header
icon
=
"archive"
content
=
"Register for More Benefits"
/>
<
ul
>
{
benefitViews
}
</
ul
>
<
Modal
.
Content
>
...
...
@@ -238,7 +238,7 @@ Submit
</
Form
>
</
Modal
.
Content
>
</
Modal
>
</
div
>
);
}
}
assets/js/index.jsx
View file @
778e9df8
...
...
@@ -12,6 +12,7 @@ import CreateVacancy from './CreateVacancy';
import
Server
from
'
./lib/Server
'
;
import
Storage
from
'
./lib/Storage
'
;
import
ApplicantPage
from
'
./ApplicantPage
'
;
import
CompanyRegisterPage
from
'
./CompanyRegisterPage
'
;
import
TranscriptPage
from
'
./TranscriptPage
'
;
import
AdminVacancyPage
from
'
./AdminVacancyPage
'
;
import
CompanyPage
from
'
./CompanyPage
'
;
...
...
@@ -82,7 +83,8 @@ export default class App extends React.Component {
};
handleAuth
=
(
nextState
,
replace
)
=>
{
if
(
!
Server
.
isLoggedIn
())
replace
({
pathname
:
'
/login
'
});
const
EXCLUDED_PATHS
=
[
'
register-perusahaan
'
,
'
login
'
]
if
(
!
Server
.
isLoggedIn
()
&&
EXCLUDED_PATHS
.
indexOf
(
nextState
.
pathname
)
<
0
)
replace
({
pathname
:
'
/login
'
});
Storage
.
getUserData
();
};
...
...
@@ -126,6 +128,7 @@ export default class App extends React.Component {
return
(
<
Router
history
=
{
browserHistory
}
>
<
Route
path
=
"/login"
component
=
{
Login
}
/>
<
Route
path
=
"/register-perusahaan"
component
=
{
CompanyRegisterPage
}
/>
<
Route
component
=
{
all
(
Dashboard
)
}
onEnter
=
{
this
.
handleAuth
}
>
<
Route
path
=
"/transkrip/:id"
component
=
{
commonUser
(
TranscriptPage
)
}
/>
<
Route
path
=
"/lowongan"
component
=
{
all
(
VacancyPage
)
}
/>
...
...
core/tests/test_account_serializers.py
0 → 100644
View file @
778e9df8
from
django.test
import
TestCase
from
django.contrib.auth.models
import
User
from
core.models.accounts
import
Company
,
Student
,
Supervisor
from
core.serializers.accounts
import
StudentSerializer
,
StudentUpdateSerializer
,
CompanyUpdateSerializer
import
datetime
class
TestAccountSerializers
(
TestCase
):
def
test_accepted_no
(
self
):
user
=
User
.
objects
.
create_user
(
'dummy.login.student'
,
'dummy.login.student@student.com'
,
'lalala123'
)
student
=
Student
.
objects
.
create
(
user
=
user
,
npm
=
1606837631
,
resume
=
None
,
sertifikat
=
None
,
phone_number
=
"081291693790"
,
gender
=
"laki-laki"
,
birth_place
=
"Jakarta"
,
birth_date
=
datetime
.
datetime
.
now
())
self
.
assertEqual
(
StudentSerializer
.
get_accepted_no
(
student
),
0
)
def
test_read_no
(
self
):
user
=
User
.
objects
.
create_user
(
'dummy.login.student'
,
'dummy.login.student@student.com'
,
'lalala123'
)
student
=
Student
.
objects
.
create
(
user
=
user
,
npm
=
1606837631
,
resume
=
None
,
sertifikat
=
None
,
phone_number
=
"081291693790"
,
gender
=
"laki-laki"
,
birth_place
=
"Jakarta"
,
birth_date
=
datetime
.
datetime
.
now
())
self
.
assertEqual
(
StudentSerializer
.
get_read_no
(
student
),
0
)
def
test_student_update_serializers
(
self
):
user
=
User
.
objects
.
create_user
(
'dummy.login.student'
,
'dummy.login.student@student.com'
,
'lalala123'
)
student
=
Student
.
objects
.
create
(
user
=
user
,
npm
=
1606837631
,
resume
=
None
,
sertifikat
=
None
,
phone_number
=
"081291693790"
,
gender
=
"laki-laki"
,
birth_place
=
"Jakarta"
,
birth_date
=
datetime
.
datetime
.
now
())
self
.
assertEqual
(
StudentUpdateSerializer
.
to_representation
(
self
,
student
),
{
'resume'
:
None
,
'email'
:
student
.
user
.
email
,
'phone_number'
:
student
.
phone_number
,
'gender'
:
student
.
gender
,
'region'
:
student
.
region
,
'photo'
:
None
,
'show_transcript'
:
student
.
show_transcript
,
'portfolio_link'
:
student
.
portfolio_link
,
'self_description'
:
student
.
self_description
,
'intro'
:
student
.
intro
,
'expected_salary'
:
student
.
expected_salary
,
'job_seeking_status'
:
student
.
job_seeking_status
,
'website_url'
:
student
.
website_url
,
'student_gpa'
:
student
.
student_gpa
,
'student_toefl'
:
student
.
student_toefl
,
'student_toefl_file'
:
None
,
'volunteer'
:
student
.
volunteer
,
'linkedin_url'
:
student
.
linkedin_url
,
'hackerrank_url'
:
student
.
hackerrank_url
,
'work_experience'
:
student
.
work_experience
,
'latest_work'
:
student
.
latest_work
,
'latest_work_desc'
:
student
.
latest_work_desc
,
'alamat'
:
student
.
alamat
,
'skills'
:
student
.
skills
,
'github_url'
:
student
.
github_url
,
'gitlab_url'
:
student
.
gitlab_url
,
'awards'
:
student
.
awards
,
'projects'
:
student
.
projects
,
'certification'
:
student
.
certification
,
'languages'
:
student
.
languages
,
'seminar'
:
student
.
seminar
,
'interests'
:
student
.
interests
,
'dependants'
:
student
.
dependants
,
'related_course'
:
student
.
related_course
,
'ielts'
:
student
.
ielts
,
})
def
test_company_update_serializers
(
self
):
user
=
User
.
objects
.
create_user
(
'dummy.login.company'
,
'dummy.login.company@company.com'
,
'lalala123'
)
company
=
Company
.
objects
.
create
(
user
=
user
,
description
=
"lalalala"
,
status
=
Company
.
VERIFIED
,
logo
=
None
,
address
=
None
,
category
=
"perusahaan listrik"
,
size
=
"20"
,
website
=
"www.www"
,
linkedin_url
=
None
)
self
.
assertEqual
(
CompanyUpdateSerializer
.
to_representation
(
self
,
company
),
{
'address'
:
company
.
address
,
'description'
:
company
.
description
,
'founded'
:
company
.
founded
,
'name'
:
company
.
user
.
first_name
,
'website'
:
company
.
website
,
'linkedin_url'
:
company
.
linkedin_url
,
'size'
:
company
.
size
,
})
core/tests/test_vacancies.py
View file @
778e9df8
...
...
@@ -167,6 +167,28 @@ class ApplicationTests(APITestCase):
format
=
'json'
)
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_400_BAD_REQUEST
)
def
test_get_applicant_transcript_denied
(
self
):
company_user
=
User
.
objects
.
create_user
(
'dummy.company'
,
'dummy.company@company.com'
,
'lalala123'
)
student_user
=
User
.
objects
.
create_user
(
'dummy.student'
,
'dummy.student@student.com'
,
'lalala123'
)
self
.
client
.
force_authenticate
(
student_user
)
self
.
client
.
force_authenticate
(
company_user
)
new_student
=
Student
.
objects
.
create
(
user
=
student_user
,
npm
=
1234123412
)
new_company
=
Company
.
objects
.
create
(
user
=
company_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
(),
max_accepted_applicants
=
3
,
working_period
=
"3 Bulan"
)
new_application
=
Application
.
objects
.
create
(
student
=
new_student
,
vacancy
=
new_vacancy
,
cover_letter
=
"lorem ipsum"
)
url
=
'/api/applications/'
+
str
(
new_application
.
pk
)
+
'/transcript/'
response
=
self
.
client
.
get
(
url
,
format
=
'json'
)
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
self
.
assertEqual
(
response
.
json
()[
'error'
],
'student does not allow transcript to be shown'
)
class
BookmarkApplicationTests
(
APITestCase
):
@
requests_mock
.
Mocker
()
...
...
@@ -496,6 +518,30 @@ class VacancyTest(APITestCase):
self
.
assertRaisesMessage
(
status
.
HTTP_400_BAD_REQUEST
,
date_validator
(
str
(
datetime
.
today
()),
str
(
datetime
.
today
()))[
'status'
])
def
test_count_vacancy
(
self
):
company_user
=
User
.
objects
.
create_user
(
'dummy.company'
,
'dummy.company@company.com'
,
'lalala123'
)
student_user
=
User
.
objects
.
create_user
(
'dummy.student'
,
'dummy.student@student.com'
,
'lalala123'
)
self
.
client
.
force_authenticate
(
company_user
)
new_company
=
Company
.
objects
.
create
(
user
=
company_user
,
description
=
"lalala"
,
status
=
Company
.
VERIFIED
,
logo
=
None
,
address
=
None
)
new_student
=
Student
.
objects
.
create
(
user
=
student_user
,
npm
=
1234123412
)
new_vacancy
=
Vacancy
.
objects
.
create
(
company
=
new_company
,
verified
=
True
,
open_time
=
datetime
.
fromtimestamp
(
0
),
description
=
"lalala"
,
close_time
=
datetime
.
today
(),
max_accepted_applicants
=
3
,
working_period
=
"3 Bulan"
)
Application
.
objects
.
create
(
student
=
new_student
,
vacancy
=
new_vacancy
,
cover_letter
=
"lorem ipsum"
)
url
=
'/api/vacancies/'
+
str
(
new_vacancy
.
pk
)
+
'/count/'
response
=
self
.
client
.
get
(
url
,
format
=
'json'
)
self
.
assertEqual
(
response
.
status_code
,
status
.
HTTP_200_OK
)
self
.
assertEqual
(
response
.
json
()[
'count'
],
1
)
self
.
assertEqual
(
response
.
json
()[
'count_new'
],
1
)
class
CompanyListsTests
(
APITestCase
):
def
test_company_vacancy_list
(
self
):
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment