├── backend ├── faq │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── admin.py │ ├── urls.py │ ├── views.py │ ├── serializers.py │ └── models.py ├── college │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── admin.cpython-37.pyc │ │ ├── urls.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── urls.py │ ├── serializers.py │ ├── admin.py │ ├── models.py │ └── views.py ├── company │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ ├── 0002_auto_20191221_2137.py │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── admin.cpython-37.pyc │ │ ├── urls.cpython-37.pyc │ │ ├── utils.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── urls.py │ ├── admin.py │ ├── serializers.py │ ├── models.py │ └── utils.py ├── cvparser │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── utils.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializer.cpython-37.pyc │ ├── admin.py │ ├── urls.py │ ├── serializer.py │ ├── utils.py │ └── models.py ├── major │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── utils.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── admin.py │ ├── urls.py │ ├── utils.py │ ├── serializers.py │ ├── models.py │ └── views.py ├── position │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ ├── 0001_initial.cpython-37.pyc │ │ │ ├── 0002_auto_20191220_1858.cpython-37.pyc │ │ │ └── 0003_auto_20191220_1900.cpython-37.pyc │ │ ├── 0002_auto_20191220_1858.py │ │ ├── 0003_auto_20191220_1900.py │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── utils.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── utils.py │ ├── urls.py │ ├── admin.py │ ├── serializers.py │ └── models.py ├── users │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ └── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── admin.py │ └── urls.py ├── utils │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ └── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── logger.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── utils.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ ├── error_codes.cpython-37.pyc │ │ ├── export_csv.cpython-37.pyc │ │ ├── gmail_utils.cpython-37.pyc │ │ ├── serializers.cpython-37.pyc │ │ ├── linkedin_utils.cpython-37.pyc │ │ ├── generic_json_creator.cpython-37.pyc │ │ └── clearbit_company_checker.cpython-37.pyc │ ├── logger.py │ ├── urls.py │ ├── clearbit_company_checker.py │ ├── export_csv.py │ ├── error_codes.py │ ├── admin.py │ ├── serializers.py │ ├── social_auth_credentials.py │ └── gmail_utils.py ├── JH_RestAPI │ ├── __init__.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── wsgi.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ ├── backends.cpython-37.pyc │ │ ├── settings.cpython-37.pyc │ │ └── pagination.cpython-37.pyc │ ├── pagination.py │ ├── wsgi.py │ ├── backends.py │ └── urls.py ├── notifications │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0001_initial.py │ ├── tests.py │ ├── __pycache__ │ │ ├── urls.cpython-37.pyc │ │ ├── admin.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── apps.py │ ├── urls.py │ ├── admin.py │ ├── models.py │ ├── serializers.py │ └── views.py ├── positionapps │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-37.pyc │ │ │ └── 0001_initial.cpython-37.pyc │ │ └── 0002_auto_20191223_1124.py │ ├── tests.py │ ├── apps.py │ ├── __pycache__ │ │ ├── admin.cpython-37.pyc │ │ ├── urls.cpython-37.pyc │ │ ├── views.cpython-37.pyc │ │ ├── models.cpython-37.pyc │ │ ├── __init__.cpython-37.pyc │ │ └── serializers.cpython-37.pyc │ ├── urls.py │ └── admin.py ├── stop.sh ├── start.sh ├── media │ └── c8ccb236-13a1-432d-9d0b-2adb78afb31d.jpg ├── requirements.txt ├── .env_example ├── manage.py └── install.sh ├── frontend ├── start.sh ├── stop.sh ├── src │ ├── utils │ │ ├── constants │ │ │ ├── index.js │ │ │ └── endpoints.js │ │ └── helpers │ │ │ ├── helperFunctions.js │ │ │ └── oAuthHelperFunctions.js │ ├── assets │ │ ├── icons │ │ │ ├── edit.png │ │ │ ├── flags.png │ │ │ ├── user.png │ │ │ ├── XIcon@1x.png │ │ │ ├── XIcon@2x.png │ │ │ ├── XIcon@3x.png │ │ │ ├── edit@2x.png │ │ │ ├── edit@3x.png │ │ │ ├── uparrow.png │ │ │ ├── user@2x.png │ │ │ ├── user@3x.png │ │ │ ├── AlumniIcon.png │ │ │ ├── EventIcon.png │ │ │ ├── SchoolIcon.png │ │ │ ├── beta_flag.png │ │ │ ├── downarrow.png │ │ │ ├── indeedLogo.png │ │ │ ├── leverLogo.png │ │ │ ├── BoardIcon@1x.png │ │ │ ├── BoardIcon@2x.png │ │ │ ├── BoardIcon@3x.png │ │ │ ├── BusinessIcon.png │ │ │ ├── NotifIcon@1x.png │ │ │ ├── NotifIcon@2x.png │ │ │ ├── NotifIcon@3x.png │ │ │ ├── OffersIcon@1x.png │ │ │ ├── OffersIcon@2x.png │ │ │ ├── OffersIcon@3x.png │ │ │ ├── PlusIcon@1x.png │ │ │ ├── PlusIcon@2x.png │ │ │ ├── PlusIcon@3x.png │ │ │ ├── SearchIcon@1x.png │ │ │ ├── SearchIcon@2x.png │ │ │ ├── SearchIcon@3x.png │ │ │ ├── SeyfoIcon@1x.png │ │ │ ├── SeyfoIcon@2x.png │ │ │ ├── SeyfoIcon@3x.png │ │ │ ├── StatsIcon@1x.png │ │ │ ├── StatsIcon@2x.png │ │ │ ├── StatsIcon@3x.png │ │ │ ├── SyncIcon@1x.png │ │ │ ├── SyncIcon@2x.png │ │ │ ├── SyncIcon@3x.png │ │ │ ├── beta_flag_2.png │ │ │ ├── company_icon.png │ │ │ ├── feedback_icon.png │ │ │ ├── glassdoorLogo.png │ │ │ ├── hiredComLogo.png │ │ │ ├── jobviteLogo.jpg │ │ │ ├── linkedInLogo.png │ │ │ ├── vetteryLogo.jpg │ │ │ ├── AppliedIcon@1x.png │ │ │ ├── AppliedIcon@2x.png │ │ │ ├── AppliedIcon@3x.png │ │ │ ├── ExpandArrow@1x.png │ │ │ ├── ExpandArrow@2x.png │ │ │ ├── ExpandArrow@3x.png │ │ │ ├── ToApplyIcon@1x.png │ │ │ ├── ToApplyIcon@2x.png │ │ │ ├── ToApplyIcon@3x.png │ │ │ ├── greenHouseLogo.png │ │ │ ├── AlumniIconDarkBlue.png │ │ │ ├── BusinessIconWhite.png │ │ │ ├── DeleteIconInBtn@1x.png │ │ │ ├── DeleteIconInBtn@2x.png │ │ │ ├── DeleteIconInBtn@3x.png │ │ │ ├── JobHax-logo-black.png │ │ │ ├── OffersIconInBtn@1x.png │ │ │ ├── OffersIconInBtn@2x.png │ │ │ ├── OffersIconInBtn@3x.png │ │ │ ├── OffersIconWhite@1x.png │ │ │ ├── OffersIconWhite@2x.png │ │ │ ├── OffersIconWhite@3x.png │ │ │ ├── PhoneScreenIcon@1x.png │ │ │ ├── PhoneScreenIcon@2x.png │ │ │ ├── PhoneScreenIcon@3x.png │ │ │ ├── smartRecruiterLogo.png │ │ │ ├── zipRecruiterLogo.png │ │ │ ├── AppliedIconInBtn@1x.png │ │ │ ├── AppliedIconInBtn@2x.png │ │ │ ├── AppliedIconInBtn@3x.png │ │ │ ├── AppliedIconWhite@1x.png │ │ │ ├── AppliedIconWhite@2x.png │ │ │ ├── AppliedIconWhite@3x.png │ │ │ ├── RejectedIconInBtn@1x.png │ │ │ ├── RejectedIconInBtn@2x.png │ │ │ ├── RejectedIconInBtn@3x.png │ │ │ ├── RejectedIconWhite@1x.png │ │ │ ├── RejectedIconWhite@2x.png │ │ │ ├── RejectedIconWhite@3x.png │ │ │ ├── ToApplyIconInBtn@1x.png │ │ │ ├── ToApplyIconInBtn@2x.png │ │ │ ├── ToApplyIconInBtn@3x.png │ │ │ ├── ToApplyIconWhite@1x.png │ │ │ ├── ToApplyIconWhite@2x.png │ │ │ ├── ToApplyIconWhite@3x.png │ │ │ ├── OnsiteInterviewIcon@1x.png │ │ │ ├── OnsiteInterviewIcon@2x.png │ │ │ ├── OnsiteInterviewIcon@3x.png │ │ │ ├── PhoneScreenIconInBtn@1x.png │ │ │ ├── PhoneScreenIconInBtn@2x.png │ │ │ ├── PhoneScreenIconInBtn@3x.png │ │ │ ├── PhoneScreenIconWhite@1x.png │ │ │ ├── PhoneScreenIconWhite@2x.png │ │ │ ├── PhoneScreenIconWhite@3x.png │ │ │ ├── OnsiteInterviewIconInBtn@1x.png │ │ │ ├── OnsiteInterviewIconInBtn@2x.png │ │ │ ├── OnsiteInterviewIconInBtn@3x.png │ │ │ ├── OnsiteInterviewIconWhite@1x.png │ │ │ ├── OnsiteInterviewIconWhite@2x.png │ │ │ ├── OnsiteInterviewIconWhite@3x.png │ │ │ ├── btn_google_signin_light_normal_web@2x.png │ │ │ ├── btn_google_signin_light_pressed_web@2x.png │ │ │ ├── JobHax-logo-white.svg │ │ │ └── JobHax-logo-black.svg │ │ └── images │ │ │ ├── joy.png │ │ │ ├── move.png │ │ │ ├── sako.png │ │ │ ├── tali.png │ │ │ ├── egemen.png │ │ │ ├── metrics.png │ │ │ ├── quote.png │ │ │ ├── seyfo.png │ │ │ ├── suhas.png │ │ │ ├── yinan.png │ │ │ ├── homebanner.jpg │ │ │ ├── mail_parse.png │ │ │ ├── dashboard_main.png │ │ │ ├── dashboard&gmail.png │ │ │ ├── gmail_envelopes.png │ │ │ └── mock_permission.png │ ├── components │ │ ├── CreatePosition │ │ │ └── style.scss │ │ ├── StaticPages │ │ │ ├── AboutUs │ │ │ │ └── joon.png │ │ │ ├── UnderConstruction │ │ │ │ └── UnderConstruction.jsx │ │ │ ├── style.scss │ │ │ ├── FAQ │ │ │ │ └── FAQ.jsx │ │ │ ├── UserAgreement │ │ │ │ └── UserAgreement.jsx │ │ │ └── PrivacyPolicy │ │ │ │ └── PrivacyPolicy.jsx │ │ ├── Partials │ │ │ ├── Spinner │ │ │ │ └── Spinner.jsx │ │ │ ├── CompanyStats │ │ │ │ └── style.scss │ │ │ ├── Footer │ │ │ │ ├── Footer.jsx │ │ │ │ └── style.scss │ │ │ ├── NotificationsBox │ │ │ │ └── NotificationsBox.jsx │ │ │ ├── ContactCards │ │ │ │ └── ContactCard.jsx │ │ │ └── FeedBack │ │ │ │ └── style.scss │ │ ├── Metrics │ │ │ ├── CompanyGraphCard │ │ │ │ └── CompanyGraphCard.jsx │ │ │ └── SubComponents │ │ │ │ ├── Containers │ │ │ │ ├── SummaryGroupContainer.jsx │ │ │ │ ├── DetailedGroupContainer.jsx │ │ │ │ └── SummarySingleContainer.jsx │ │ │ │ ├── Map │ │ │ │ └── Map.jsx │ │ │ │ ├── Graphs │ │ │ │ └── PieChart.jsx │ │ │ │ ├── IndividualMetrics │ │ │ │ └── IndividualMetrics.jsx │ │ │ │ └── UniversityMetrics │ │ │ │ └── UniversityMetrics.jsx │ │ ├── UserAuth │ │ │ ├── ChangePassword │ │ │ │ └── style.scss │ │ │ ├── SignIn │ │ │ │ └── style.scss │ │ │ └── Action │ │ │ │ └── Action.jsx │ │ ├── Dashboard │ │ │ ├── CardModal │ │ │ │ └── SubComponents │ │ │ │ │ ├── ModalBody │ │ │ │ │ ├── Body │ │ │ │ │ │ ├── BodyComponents │ │ │ │ │ │ │ ├── Resume │ │ │ │ │ │ │ │ └── style.scss │ │ │ │ │ │ │ ├── CandidateDetails.jsx │ │ │ │ │ │ │ ├── FeedbackInput │ │ │ │ │ │ │ │ └── style.scss │ │ │ │ │ │ │ └── Feedbacks │ │ │ │ │ │ │ │ ├── style.scss │ │ │ │ │ │ │ │ └── Feedbacks.jsx │ │ │ │ │ │ └── BodyComponents.jsx │ │ │ │ │ ├── NavigationPanel │ │ │ │ │ │ └── NavigationPanel.jsx │ │ │ │ │ └── ModalBody.jsx │ │ │ │ │ └── ModalHeader │ │ │ │ │ └── ModalHeader.jsx │ │ │ ├── JobInput │ │ │ │ └── style.scss │ │ │ ├── style.scss │ │ │ └── Card │ │ │ │ └── style.scss │ │ ├── Applicants │ │ │ └── ApplicantTable │ │ │ │ └── style.scss │ │ └── Positions │ │ │ └── PositionCards │ │ │ └── style.scss │ ├── index.js │ ├── config │ │ └── example.js │ └── index.html ├── restart.sh ├── .babelrc ├── package.json └── README.md └── README.md /backend/faq/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/college/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/company/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/cvparser/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/major/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/position/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/users/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/JH_RestAPI/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/notifications/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/positionapps/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/college/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/company/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/faq/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/major/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/users/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/utils/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend/start.sh: -------------------------------------------------------------------------------- 1 | yarn build & 2 | -------------------------------------------------------------------------------- /backend/cvparser/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/position/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/positionapps/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/notifications/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend/faq/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/major/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/users/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/utils/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/college/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/company/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/position/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /frontend/stop.sh: -------------------------------------------------------------------------------- 1 | a=$(lsof -t -i:8081) && kill -9 $a 2 | -------------------------------------------------------------------------------- /backend/notifications/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /backend/positionapps/tests.py: -------------------------------------------------------------------------------- 1 | # Create your tests here. 2 | -------------------------------------------------------------------------------- /frontend/src/utils/constants/index.js: -------------------------------------------------------------------------------- 1 | export * from "./constants"; 2 | -------------------------------------------------------------------------------- /frontend/restart.sh: -------------------------------------------------------------------------------- 1 | a=$(lsof -t -i:8081) && kill -9 $a && yarn build & 2 | -------------------------------------------------------------------------------- /frontend/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env", "@babel/preset-react"], 3 | } -------------------------------------------------------------------------------- /backend/cvparser/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /backend/stop.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | a=$(lsof -t -i:8001) && kill -9 $a 3 | # python3 manage.py process_tasks 4 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/edit.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/flags.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/user.png -------------------------------------------------------------------------------- /frontend/src/assets/images/joy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/joy.png -------------------------------------------------------------------------------- /frontend/src/assets/images/move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/move.png -------------------------------------------------------------------------------- /frontend/src/assets/images/sako.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/sako.png -------------------------------------------------------------------------------- /frontend/src/assets/images/tali.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/tali.png -------------------------------------------------------------------------------- /backend/faq/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class FaqConfig(AppConfig): 5 | name = 'faq' 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/XIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/XIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/XIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/XIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/XIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/XIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/edit@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/edit@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/edit@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/edit@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/uparrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/uparrow.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/user@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/user@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/user@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/user@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/images/egemen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/egemen.png -------------------------------------------------------------------------------- /frontend/src/assets/images/metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/metrics.png -------------------------------------------------------------------------------- /frontend/src/assets/images/quote.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/quote.png -------------------------------------------------------------------------------- /frontend/src/assets/images/seyfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/seyfo.png -------------------------------------------------------------------------------- /frontend/src/assets/images/suhas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/suhas.png -------------------------------------------------------------------------------- /frontend/src/assets/images/yinan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/yinan.png -------------------------------------------------------------------------------- /backend/major/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MajorConfig(AppConfig): 5 | name = 'major' 6 | -------------------------------------------------------------------------------- /backend/start.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | python3 manage.py runserver 0.0.0.0:8001 & 3 | # python3 manage.py process_tasks 4 | -------------------------------------------------------------------------------- /backend/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | name = 'users' 6 | -------------------------------------------------------------------------------- /backend/utils/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UtilsConfig(AppConfig): 5 | name = 'utils' 6 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/AlumniIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AlumniIcon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/EventIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/EventIcon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SchoolIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SchoolIcon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/beta_flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/beta_flag.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/downarrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/downarrow.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/indeedLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/indeedLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/leverLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/leverLogo.png -------------------------------------------------------------------------------- /frontend/src/components/CreatePosition/style.scss: -------------------------------------------------------------------------------- 1 | @import "../App/style.scss"; 2 | 3 | .vbtn{ 4 | float:right; 5 | } 6 | -------------------------------------------------------------------------------- /backend/college/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CollegeConfig(AppConfig): 5 | name = 'college' 6 | -------------------------------------------------------------------------------- /backend/company/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CompanyConfig(AppConfig): 5 | name = 'company' 6 | -------------------------------------------------------------------------------- /backend/faq/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/BoardIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/BoardIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/BoardIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/BoardIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/BoardIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/BoardIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/BusinessIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/BusinessIcon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/NotifIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/NotifIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/NotifIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/NotifIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/NotifIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/NotifIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PlusIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PlusIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PlusIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PlusIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PlusIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PlusIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SearchIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SearchIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SearchIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SearchIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SearchIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SearchIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SeyfoIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SeyfoIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SeyfoIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SeyfoIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SeyfoIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SeyfoIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/StatsIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/StatsIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/StatsIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/StatsIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/StatsIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/StatsIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SyncIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SyncIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SyncIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SyncIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/SyncIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/SyncIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/beta_flag_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/beta_flag_2.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/company_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/company_icon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/feedback_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/feedback_icon.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/glassdoorLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/glassdoorLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/hiredComLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/hiredComLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/jobviteLogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/jobviteLogo.jpg -------------------------------------------------------------------------------- /frontend/src/assets/icons/linkedInLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/linkedInLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/vetteryLogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/vetteryLogo.jpg -------------------------------------------------------------------------------- /frontend/src/assets/images/homebanner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/homebanner.jpg -------------------------------------------------------------------------------- /frontend/src/assets/images/mail_parse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/mail_parse.png -------------------------------------------------------------------------------- /backend/cvparser/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CvparserConfig(AppConfig): 5 | name = 'cvparser' 6 | -------------------------------------------------------------------------------- /backend/faq/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PositionConfig(AppConfig): 5 | name = 'position' 6 | -------------------------------------------------------------------------------- /backend/users/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ExpandArrow@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ExpandArrow@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ExpandArrow@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ExpandArrow@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ExpandArrow@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ExpandArrow@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/greenHouseLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/greenHouseLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/images/dashboard_main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/dashboard_main.png -------------------------------------------------------------------------------- /backend/college/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class JobappsConfig(AppConfig): 5 | name = 'positionapps' 6 | -------------------------------------------------------------------------------- /backend/users/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/logger.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/logger.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/AlumniIconDarkBlue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AlumniIconDarkBlue.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/BusinessIconWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/BusinessIconWhite.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/DeleteIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/DeleteIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/DeleteIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/DeleteIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/DeleteIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/DeleteIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/JobHax-logo-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/JobHax-logo-black.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OffersIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OffersIconWhite@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/smartRecruiterLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/smartRecruiterLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/zipRecruiterLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/zipRecruiterLogo.png -------------------------------------------------------------------------------- /frontend/src/assets/images/dashboard&gmail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/dashboard&gmail.png -------------------------------------------------------------------------------- /frontend/src/assets/images/gmail_envelopes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/gmail_envelopes.png -------------------------------------------------------------------------------- /frontend/src/assets/images/mock_permission.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/images/mock_permission.png -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/AppliedIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/AppliedIconWhite@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/RejectedIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/RejectedIconWhite@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/ToApplyIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/ToApplyIconWhite@3x.png -------------------------------------------------------------------------------- /backend/college/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NotificationsConfig(AppConfig): 5 | name = 'notifications' 6 | -------------------------------------------------------------------------------- /backend/position/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/error_codes.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/error_codes.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/export_csv.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/export_csv.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/gmail_utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/gmail_utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIcon@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIcon@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIcon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIcon@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIcon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIcon@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/PhoneScreenIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/PhoneScreenIconWhite@3x.png -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/AboutUs/joon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/components/StaticPages/AboutUs/joon.png -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/backends.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/backends.cpython-37.pyc -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/__pycache__/serializer.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/__pycache__/serializer.cpython-37.pyc -------------------------------------------------------------------------------- /backend/media/c8ccb236-13a1-432d-9d0b-2adb78afb31d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/media/c8ccb236-13a1-432d-9d0b-2adb78afb31d.jpg -------------------------------------------------------------------------------- /backend/notifications/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/linkedin_utils.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/linkedin_utils.cpython-37.pyc -------------------------------------------------------------------------------- /backend/JH_RestAPI/__pycache__/pagination.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/JH_RestAPI/__pycache__/pagination.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from .models import Resume 5 | 6 | admin.site.register(Resume) -------------------------------------------------------------------------------- /backend/faq/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconInBtn@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconInBtn@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconInBtn@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconInBtn@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconInBtn@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconInBtn@3x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconWhite@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconWhite@1x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconWhite@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconWhite@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/OnsiteInterviewIconWhite@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/OnsiteInterviewIconWhite@3x.png -------------------------------------------------------------------------------- /backend/major/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/__pycache__/serializers.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/__pycache__/serializers.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/faq/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from notifications import views 4 | 5 | urlpatterns = [ 6 | path('', views.notifications), 7 | ] 8 | -------------------------------------------------------------------------------- /backend/position/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/generic_json_creator.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/generic_json_creator.cpython-37.pyc -------------------------------------------------------------------------------- /backend/major/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/major/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/users/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/users/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/__pycache__/clearbit_company_checker.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/__pycache__/clearbit_company_checker.cpython-37.pyc -------------------------------------------------------------------------------- /backend/utils/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/utils/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/college/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/college/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/company/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/company/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/cvparser/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/cvparser/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/notifications/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /frontend/src/assets/icons/btn_google_signin_light_normal_web@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/btn_google_signin_light_normal_web@2x.png -------------------------------------------------------------------------------- /frontend/src/assets/icons/btn_google_signin_light_pressed_web@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/frontend/src/assets/icons/btn_google_signin_light_pressed_web@2x.png -------------------------------------------------------------------------------- /backend/notifications/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/notifications/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/positionapps/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/positionapps/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/migrations/__pycache__/0002_auto_20191220_1858.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/migrations/__pycache__/0002_auto_20191220_1858.cpython-37.pyc -------------------------------------------------------------------------------- /backend/position/migrations/__pycache__/0003_auto_20191220_1900.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/job-hax/ats/HEAD/backend/position/migrations/__pycache__/0003_auto_20191220_1900.cpython-37.pyc -------------------------------------------------------------------------------- /backend/faq/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import * 4 | 5 | @admin.register(Faq) 6 | class FaqAdmin(admin.ModelAdmin): 7 | list_display = ('title', 'is_published') 8 | -------------------------------------------------------------------------------- /backend/major/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from major.models import Major 4 | 5 | 6 | @admin.register(Major) 7 | class MajorAdmin(admin.ModelAdmin): 8 | list_display = ("name", "supported") 9 | -------------------------------------------------------------------------------- /backend/utils/logger.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | 4 | def log(log, type): 5 | with open("inapp_error.log", "a") as text_file: 6 | print(str(datetime.datetime.now()) + ' / ' + str(type) + ' ' + str(log), file=text_file) 7 | -------------------------------------------------------------------------------- /backend/notifications/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Notification 4 | 5 | 6 | @admin.register(Notification) 7 | class NotificationAdmin(admin.ModelAdmin): 8 | list_display = ("title", "created_at") 9 | -------------------------------------------------------------------------------- /backend/position/utils.py: -------------------------------------------------------------------------------- 1 | from position.models import JobPosition 2 | 3 | 4 | def get_or_insert_position(title): 5 | jt, new = JobPosition.objects.all().get_or_create(job_title__iexact=title) 6 | jt.job_title = title 7 | jt.save() 8 | return jt -------------------------------------------------------------------------------- /backend/faq/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from faq import views 5 | 6 | urlpatterns = [ 7 | path('', views.faqs), 8 | ] 9 | urlpatterns = format_suffix_patterns(urlpatterns) 10 | -------------------------------------------------------------------------------- /backend/major/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from major import views 5 | 6 | urlpatterns = [ 7 | path('', views.majors), 8 | ] 9 | urlpatterns = format_suffix_patterns(urlpatterns) 10 | -------------------------------------------------------------------------------- /backend/college/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from college import views 5 | 6 | urlpatterns = [ 7 | path('', views.colleges), 8 | ] 9 | urlpatterns = format_suffix_patterns(urlpatterns) 10 | -------------------------------------------------------------------------------- /backend/major/utils.py: -------------------------------------------------------------------------------- 1 | from .models import Major 2 | 3 | 4 | def insert_or_update_major(name): 5 | majors = Major.objects.filter(name__iexact=name) 6 | if majors.count() == 0: 7 | major = Major.objects.create(name=name) 8 | major.save() 9 | return Major.objects.get(name__iexact=name) 10 | -------------------------------------------------------------------------------- /backend/company/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from company import views 5 | 6 | urlpatterns = [ 7 | path('', views.companies), 8 | path('', views.company) 9 | ] 10 | urlpatterns = format_suffix_patterns(urlpatterns) 11 | -------------------------------------------------------------------------------- /backend/cvparser/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from cvparser import views 5 | 6 | urlpatterns = [ 7 | path('', views.resume_parser), 8 | path('metrics', views.metrics) 9 | 10 | ] 11 | urlpatterns = format_suffix_patterns(urlpatterns) 12 | -------------------------------------------------------------------------------- /backend/position/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from position import views 5 | 6 | urlpatterns = [ 7 | path('', views.positions), 8 | path('company', views.company_positions) 9 | ] 10 | urlpatterns = format_suffix_patterns(urlpatterns) 11 | -------------------------------------------------------------------------------- /frontend/src/utils/helpers/helperFunctions.js: -------------------------------------------------------------------------------- 1 | export function generateCurrentDate() { 2 | const date = new Date(); 3 | const year = date.getFullYear(); 4 | const month = (date.getMonth() + 1).toString(); 5 | const day = date.getDate().toString(); 6 | return `${year}-${month.length === 1 ? '0'+month : month}-${day.length === 1 ? '0'+day : day}` 7 | } -------------------------------------------------------------------------------- /backend/JH_RestAPI/pagination.py: -------------------------------------------------------------------------------- 1 | from rest_framework import pagination 2 | 3 | 4 | class CustomPagination(pagination.PageNumberPagination): 5 | page_size_query_param = 'page_size' 6 | 7 | def get_paginated_response(self, data): 8 | return { 9 | 'count': self.page.paginator.count, 10 | 'results': data 11 | } 12 | -------------------------------------------------------------------------------- /backend/cvparser/serializer.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import Resume 4 | 5 | 6 | class ResumeSerializer(serializers.ModelSerializer): 7 | def create(self, validated_data): 8 | return Resume.objects.create(**validated_data) 9 | 10 | class Meta: 11 | model = Resume 12 | fields = ('__all__') -------------------------------------------------------------------------------- /backend/major/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import Major 4 | 5 | 6 | class MajorSerializer(serializers.ModelSerializer): 7 | 8 | def create(self, validated_data): 9 | return Major.objects.create(**validated_data) 10 | 11 | class Meta: 12 | model = Major 13 | fields = '__all__' 14 | -------------------------------------------------------------------------------- /backend/major/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Major(models.Model): 5 | name = models.CharField(max_length=200, blank=True) 6 | supported = models.BooleanField(default=False) 7 | 8 | class Meta: 9 | ordering = ['name'] 10 | 11 | def __str__(self): 12 | return self.name if self.name is not None else '' 13 | -------------------------------------------------------------------------------- /backend/college/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import College 4 | 5 | 6 | class CollegeSerializer(serializers.ModelSerializer): 7 | 8 | def create(self, validated_data): 9 | return College.objects.create(**validated_data) 10 | 11 | class Meta: 12 | model = College 13 | fields = '__all__' 14 | -------------------------------------------------------------------------------- /backend/college/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | from college.models import College 5 | 6 | 7 | @admin.register(College) 8 | class CollegeAdmin(admin.ModelAdmin): 9 | list_display = ("name", "country", "alpha_two_code", "state_province") 10 | list_filter = ("name", "country", "alpha_two_code", "state_province") 11 | -------------------------------------------------------------------------------- /frontend/src/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import { CookiesProvider } from "react-cookie"; 4 | 5 | import App from "./components/App/App.jsx"; 6 | 7 | const rootElement = document.getElementById("root"); 8 | 9 | ReactDOM.render( 10 | 11 | 12 | , 13 | rootElement 14 | ); 15 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/Spinner/Spinner.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import "./style.scss"; 4 | 5 | const Spinner = props => { 6 | return ( 7 |
8 |
{props.message}
9 |
10 | ); 11 | }; 12 | 13 | Spinner.defaultProps = { 14 | message: "Loading..." 15 | }; 16 | 17 | export default Spinner; 18 | -------------------------------------------------------------------------------- /frontend/src/config/example.js: -------------------------------------------------------------------------------- 1 | export const IS_MOCKING = false; 2 | export const IS_RECAPTCHA_ENABLED = false; 3 | 4 | export const googleClientId = ''; 5 | export const googleApiKey = ''; 6 | 7 | export const jobHaxClientId = ''; 8 | export const jobHaxClientSecret = ''; 9 | 10 | export const reCaptchaV3SiteKey = ''; 11 | 12 | export const linkedInClientId = ''; 13 | export const linkedInClientSecret = ''; 14 | -------------------------------------------------------------------------------- /backend/notifications/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Notification(models.Model): 5 | title = models.CharField(max_length=50) 6 | content = models.CharField(null=True, max_length=250) 7 | image = models.CharField(null=True, max_length=200, blank=True) 8 | created_at = models.DateTimeField(auto_now_add=True) 9 | 10 | class Meta: 11 | ordering = ['-created_at'] 12 | -------------------------------------------------------------------------------- /backend/position/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from utils.export_csv import ExportCsv 4 | from .models import JobPosition 5 | from .models import PositionDetail 6 | 7 | 8 | # Register your models here. 9 | @admin.register(JobPosition) 10 | @admin.register(PositionDetail) 11 | class JobPositionAdmin(admin.ModelAdmin, ExportCsv): 12 | # list_display = ("id", "job_title") 13 | actions = ["export_as_csv"] -------------------------------------------------------------------------------- /frontend/src/components/Metrics/CompanyGraphCard/CompanyGraphCard.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | 4 | // import "./style.scss"; 5 | import { Icon } from "antd"; 6 | 7 | class CompanyGraphCard extends React.Component { 8 | constructor(props) { 9 | super(props); 10 | } 11 | 12 | 13 | render() { 14 | return ( 15 |
Test
16 | ); 17 | } 18 | } 19 | 20 | export default CompanyGraphCard; 21 | -------------------------------------------------------------------------------- /backend/requirements.txt: -------------------------------------------------------------------------------- 1 | requests 2 | Django==2.2.8 3 | social-auth-app-django==3.1.0 4 | psycopg2==2.7.5 5 | psycopg2-binary==2.7.5 6 | django-rest-framework-social-oauth2==1.1.0 7 | djangorestframework 8 | social-auth-core==3.2.0 9 | google-api-python-client==1.7.4 10 | python-dateutil==2.7.5 11 | httplib2 12 | django-cors-headers 13 | oauth2client 14 | django-background-tasks==1.2.0 15 | beautifulsoup4==4.6.3 16 | django-environ 17 | -------------------------------------------------------------------------------- /backend/.env_example: -------------------------------------------------------------------------------- 1 | DJANGO_DEBUG='True' 2 | DB_USER='jobhaxuser' 3 | DB_PWD='thisissupersecret' 4 | DB_HOST='localhost' 5 | DB_NAME='jobhaxdbname' 6 | SECRET_KEY='get me: ' 7 | JOBHAX_CLEARBIT_KEY='get me: ' 8 | EMAIL_HOST_USER='XXX@gmail.com' 9 | EMAIL_HOST_PASSWORD='set me:' 10 | JOBHAX_RECAPTCHA_SECRET='get me: ' 11 | reCaptchaV3SiteKey='get me: ' 12 | JOBHAX_LINKEDIN_CLIENT_KEY='get me: ' 13 | JOBHAX_LINKEDIN_CLIENT_SECRET='get me:' 14 | -------------------------------------------------------------------------------- /backend/company/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from utils.export_csv import ExportCsv 4 | from .models import Company 5 | 6 | 7 | # Register your models here. 8 | @admin.register(Company) 9 | class CompanyAdmin(admin.ModelAdmin, ExportCsv): 10 | list_display = ('company', 'logo', 'domain', 'location_address') 11 | list_filter = ('company', 'logo', 'domain', 'location_address') 12 | actions = ["export_as_csv"] 13 | -------------------------------------------------------------------------------- /backend/faq/views.py: -------------------------------------------------------------------------------- 1 | from django.http import JsonResponse 2 | from django.views.decorators.http import require_GET 3 | 4 | from utils.generic_json_creator import create_response 5 | from .models import Faq 6 | from .serializers import FaqSerializer 7 | 8 | 9 | @require_GET 10 | def faqs(request): 11 | faq = Faq.objects.filter(is_published=True) 12 | list = FaqSerializer(instance=faq, many=True).data 13 | return JsonResponse(create_response(data=list), safe=False) 14 | -------------------------------------------------------------------------------- /backend/JH_RestAPI/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for JH_RestAPI project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'JH_RestAPI.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /backend/notifications/serializers.py: -------------------------------------------------------------------------------- 1 | import pytz 2 | from rest_framework import serializers 3 | 4 | from . import models 5 | 6 | 7 | class NotificationSerializer(serializers.ModelSerializer): 8 | 9 | def get_created_at(self, obj): 10 | if obj.date is None: 11 | return None 12 | return obj.date.astimezone(pytz.timezone('US/Pacific')) 13 | 14 | class Meta: 15 | fields = ('id', 'title', 'content', 'image', 'created_at') 16 | model = models.Notification 17 | -------------------------------------------------------------------------------- /backend/position/migrations/0002_auto_20191220_1858.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:58 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('position', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='positiondetail', 15 | name='job', 16 | field=models.TextField(max_length=200, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /backend/position/migrations/0003_auto_20191220_1900.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 03:00 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('position', '0002_auto_20191220_1858'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='positiondetail', 15 | name='job', 16 | field=models.TextField(blank=True, max_length=200, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /backend/notifications/views.py: -------------------------------------------------------------------------------- 1 | from django.http import JsonResponse 2 | from django.views.decorators.csrf import csrf_exempt 3 | from rest_framework.decorators import api_view 4 | 5 | from utils.generic_json_creator import create_response 6 | from . import models 7 | from .serializers import NotificationSerializer 8 | 9 | 10 | @csrf_exempt 11 | @api_view(["GET"]) 12 | def notifications(request): 13 | queryset = models.Notification.objects.all() 14 | return JsonResponse(create_response(data=NotificationSerializer(instance=queryset, many=True).data), safe=False) 15 | -------------------------------------------------------------------------------- /backend/utils/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from utils import views 5 | 6 | urlpatterns = [ 7 | path('agreements/', views.agreements), 8 | path('demo/', views.demo), 9 | path('countries/', views.countries), 10 | path('countries//states/', 11 | views.states), 12 | path('feedbacks/', views.feedbacks), 13 | path('feedbacks//answer/', 14 | views.answer_feedback), 15 | ] 16 | urlpatterns = format_suffix_patterns(urlpatterns) 17 | -------------------------------------------------------------------------------- /backend/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == '__main__': 6 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'JH_RestAPI.settings') 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError as exc: 10 | raise ImportError( 11 | "Couldn't import Django. Are you sure it's installed and " 12 | "available on your PYTHONPATH environment variable? Did you " 13 | "forget to activate a virtual environment?" 14 | ) from exc 15 | execute_from_command_line(sys.argv) 16 | -------------------------------------------------------------------------------- /backend/positionapps/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from positionapps import views 5 | 6 | urlpatterns = [ 7 | path('statuses/', views.statuses), 8 | path('', views.position_applications), 9 | path('apply/', views.apply), 10 | path('/statusHistory/', views.status_history), 11 | path('/notes/', views.notes), 12 | path('/contacts/', views.contacts), 13 | path('/feedbacks/', views.feedbacks), 14 | ] 15 | urlpatterns = format_suffix_patterns(urlpatterns) 16 | -------------------------------------------------------------------------------- /frontend/src/components/UserAuth/ChangePassword/style.scss: -------------------------------------------------------------------------------- 1 | .change-password-container { 2 | position: fixed; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100%; 7 | 8 | .change-password-form-container { 9 | position: fixed; 10 | background: rgb(255, 255, 255); 11 | width: 500px; 12 | height: 250px; 13 | top: 50%; 14 | left: 50%; 15 | transform: translate(-50%, -50%); 16 | border-radius: 4px; 17 | background-color: white; 18 | border: 1px solid rgba(105, 105, 105, 0.3); 19 | padding: 40px; 20 | } 21 | } -------------------------------------------------------------------------------- /backend/install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Set Postgres 3 | #initdb /usr/local/var/postgres 4 | 5 | # Create db user and database with owner privileges 6 | sudo su - postgres 7 | psql postgres -c "CREATE USER jobhaxdbuser WITH PASSWORD '123456';" 8 | psql postgres -c "CREATE DATABASE jobhaxdb WITH OWNER 'jobhaxdbuser';" 9 | psql postgres -c "ALTER USER jobhaxdbuser CREATEDB;" 10 | 11 | # Install python dependencies for application: 12 | pip3 install -r requirements.txt 13 | 14 | # Migrate application data changes to postgres: 15 | python3 manage.py makemigrations 16 | python3 manage.py migrate 17 | 18 | # Create superuser for admin panel: 19 | python3 manage.py createsuperuser 20 | -------------------------------------------------------------------------------- /backend/utils/clearbit_company_checker.py: -------------------------------------------------------------------------------- 1 | import os 2 | import traceback 3 | 4 | import requests 5 | 6 | from utils.logger import log 7 | 8 | 9 | def get_company_detail(name): 10 | try: 11 | token = os.environ.get('JOBHAX_CLEARBIT_KEY', '') 12 | r = requests.get('https://company.clearbit.com/v1/domains/find?name=' + name, 13 | headers={'Authorization': 'Bearer ' + token}) 14 | data = r.json() 15 | if 'error' not in data: 16 | return data 17 | else: 18 | return None 19 | except Exception as e: 20 | log(traceback.format_exception(None, e, e.__traceback__), 'e') 21 | return None 22 | -------------------------------------------------------------------------------- /backend/utils/export_csv.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | from django.http import HttpResponse 4 | 5 | 6 | class ExportCsv: 7 | def export_as_csv(self, request, queryset): 8 | meta = self.model._meta 9 | field_names = [field.name for field in meta.fields] 10 | 11 | response = HttpResponse(content_type='text/csv') 12 | response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta) 13 | writer = csv.writer(response) 14 | 15 | writer.writerow(field_names) 16 | for obj in queryset: 17 | row = writer.writerow([getattr(obj, field) for field in field_names]) 18 | 19 | return response 20 | 21 | export_as_csv.short_description = "Export Selected" 22 | -------------------------------------------------------------------------------- /backend/company/migrations/0002_auto_20191221_2137.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2019-12-22 05:37 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('company', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='company', 16 | name='phone_number', 17 | field=models.CharField(blank=True, max_length=17, null=True, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/Containers/SummaryGroupContainer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import SummaryMetricSingle from "./SummarySingleContainer.jsx"; 4 | 5 | class SummaryMetricsGroup extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | } 9 | 10 | generateGroup() { 11 | return this.props.data.map(metric => ( 12 |
13 | 14 |
15 | )); 16 | } 17 | 18 | render() { 19 | return ( 20 |
21 |
{this.generateGroup()}
22 |
23 | ); 24 | } 25 | } 26 | 27 | export default SummaryMetricsGroup; 28 | -------------------------------------------------------------------------------- /backend/college/models.py: -------------------------------------------------------------------------------- 1 | from django.contrib.postgres.fields import ArrayField 2 | from django.db import models 3 | 4 | 5 | class College(models.Model): 6 | web_pages = ArrayField(models.TextField(null=True, blank=True)) 7 | domains = ArrayField(models.TextField(null=True, blank=True)) 8 | name = models.CharField(max_length=200, blank=False) 9 | alpha_two_code = models.CharField(max_length=5, blank=True) 10 | state_province = models.CharField(max_length=30, null=True, blank=True) 11 | country = models.CharField(max_length=50, blank=True) 12 | supported = models.BooleanField(default=False) 13 | 14 | class Meta: 15 | ordering = ['name'] 16 | 17 | def __str__(self): 18 | return self.name if self.name is not None else '' 19 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/Containers/DetailedGroupContainer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import DetailedSingleMetric from "./DetailedSingleContainer.jsx"; 4 | 5 | class DetailedMetricsGroup extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | } 9 | 10 | generateGroup() { 11 | return this.props.data.map(metric => ( 12 |
13 | 14 |
15 | )); 16 | } 17 | 18 | render() { 19 | return ( 20 |
21 |
{this.generateGroup()}
22 |
23 | ); 24 | } 25 | } 26 | 27 | export default DetailedMetricsGroup; 28 | -------------------------------------------------------------------------------- /backend/major/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:56 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Major', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('name', models.CharField(blank=True, max_length=200)), 19 | ('supported', models.BooleanField(default=False)), 20 | ], 21 | options={ 22 | 'ordering': ['name'], 23 | }, 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /backend/cvparser/utils.py: -------------------------------------------------------------------------------- 1 | import json 2 | from collections import Counter 3 | 4 | 5 | def top_skills_in(comp, data, top_number): 6 | comp = comp.lower() 7 | target = [] 8 | for line in data: 9 | job = ' '.join(line["position"]).lower() 10 | if comp in job: 11 | target.append(line) 12 | 13 | skills = Counter() 14 | for line in target: 15 | skills.update(Counter(line["top_skills"])) 16 | return skills.most_common(top_number) 17 | 18 | 19 | def common_attr(attr, data, top_number): 20 | attrs = Counter() 21 | for line in data: 22 | if isinstance(line[attr], list): 23 | attrs.update(Counter(line[attr])) 24 | else: 25 | attrs.update(Counter([line[attr]])) 26 | return attrs.most_common((top_number)) 27 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/CompanyStats/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .statistics-container { 4 | display: flex; 5 | justify-content: flex-start; 6 | margin-top: calc(100vh * 2.4/100); 7 | line-height: calc(100% * 18/14) !important; 8 | 9 | .authorization-stat-container { 10 | display: flex; 11 | justify-content: flex-start; 12 | font-size: calc(100% * 16/14) !important; 13 | line-height: calc(100% * 18/14) !important; 14 | 15 | 16 | @media only screen and (max-device-width : 800px) and (-webkit-min-device-pixel-ratio : 2) { 17 | flex-direction: column; 18 | text-align: center; 19 | } 20 | } 21 | 22 | } 23 | 24 | .ant-rate { 25 | line-height: calc(100vh * 20/1440) !important; 26 | } -------------------------------------------------------------------------------- /backend/company/serializers.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Count 2 | from rest_framework import serializers 3 | 4 | from .models import Company 5 | 6 | 7 | class CompanyBasicsSerializer(serializers.ModelSerializer): 8 | 9 | def create(self, validated_data): 10 | return Company.objects.create(**validated_data) 11 | 12 | class Meta: 13 | model = Company 14 | fields = ('id', 'company', 'domain', 'logo', 'location_lat', 15 | 'location_lon', 'location_address', 'description', 'employees_number', 'phone_number') 16 | 17 | 18 | class CompanySerializer(serializers.ModelSerializer): 19 | 20 | def create(self, validated_data): 21 | return Company.objects.create(**validated_data) 22 | 23 | class Meta: 24 | model = Company 25 | fields = ('__all__') 26 | -------------------------------------------------------------------------------- /backend/faq/serializers.py: -------------------------------------------------------------------------------- 1 | import pytz 2 | from rest_framework import serializers 3 | 4 | from .models import Faq 5 | from .models import Item 6 | 7 | 8 | class ItemSerializer(serializers.ModelSerializer): 9 | def create(self, validated_data): 10 | return Item.objects.create(**validated_data) 11 | 12 | class Meta: 13 | model = Item 14 | fields = ('id', 'value', 'position') 15 | 16 | 17 | class FaqSerializer(serializers.ModelSerializer): 18 | def create(self, validated_data): 19 | return Faq.objects.create(**validated_data) 20 | 21 | def get_date(self, obj): 22 | if obj.date is None: 23 | return None 24 | return obj.date.astimezone(pytz.timezone('US/Pacific')) 25 | 26 | class Meta: 27 | model = Faq 28 | fields = ('id', 'title', 'description', 'is_published') 29 | -------------------------------------------------------------------------------- /backend/utils/error_codes.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class ResponseCodes(Enum): 5 | success = 0 6 | invalid_credentials = 1 7 | user_profile_not_found = 2 8 | couldnt_update_google_token = 3 9 | google_token_expired = 4 10 | couldnt_logout_user = 5 11 | couldnt_login = 6 12 | passwords_do_not_match = 7 13 | username_exists = 8 14 | email_exists = 9 15 | invalid_parameters = 10 16 | record_not_found = 11 17 | invalid_username = 12 18 | email_verification_required = 13 19 | email_already_verified = 14 20 | activation_key_expired = 15 21 | account_already_linked = 16 22 | not_supported_user = 17 23 | verify_recaptcha_failed = 99 24 | poll_couldnt_found = 101 25 | missing_item_id_parameter = 102 26 | poll_answer_couldnt_found = 103 27 | blog_couldnt_found = 104 28 | -------------------------------------------------------------------------------- /backend/college/views.py: -------------------------------------------------------------------------------- 1 | from django.http import JsonResponse 2 | from django.views.decorators.csrf import csrf_exempt 3 | from rest_framework.decorators import api_view 4 | 5 | from JH_RestAPI import pagination 6 | from utils.generic_json_creator import create_response 7 | from .models import College 8 | from .serializers import CollegeSerializer 9 | 10 | 11 | @csrf_exempt 12 | @api_view(["GET"]) 13 | def colleges(request): 14 | q = request.GET.get('q') 15 | if q is None: 16 | colleges = College.objects.all() 17 | else: 18 | colleges = College.objects.filter(name__icontains=q) 19 | paginator = pagination.CustomPagination() 20 | colleges = paginator.paginate_queryset(colleges, request) 21 | serialized_colleges = CollegeSerializer( 22 | instance=colleges, many=True, ).data 23 | return JsonResponse(create_response(data=serialized_colleges, paginator=paginator), safe=False) 24 | -------------------------------------------------------------------------------- /backend/major/views.py: -------------------------------------------------------------------------------- 1 | from django.http import JsonResponse 2 | from django.views.decorators.csrf import csrf_exempt 3 | from rest_framework.decorators import api_view 4 | 5 | from JH_RestAPI import pagination 6 | from utils.generic_json_creator import create_response 7 | from .models import Major 8 | from .serializers import MajorSerializer 9 | 10 | 11 | # Create your views here. 12 | 13 | 14 | @csrf_exempt 15 | @api_view(["GET"]) 16 | def majors(request): 17 | q = request.GET.get('q') 18 | if q is None: 19 | majors = Major.objects.all() 20 | else: 21 | majors = Major.objects.filter(name__icontains=q) 22 | paginator = pagination.CustomPagination() 23 | majors = paginator.paginate_queryset(majors, request) 24 | serialized_majors = MajorSerializer( 25 | instance=majors, many=True, ).data 26 | return JsonResponse(create_response(data=serialized_majors, paginator=paginator), safe=False) 27 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents/Resume/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../../../../App/style.scss"; 2 | 3 | .card-resume-container { 4 | 5 | .info { 6 | display: flex; 7 | flex-direction: column; 8 | justify-content: start; 9 | margin-top: 0px; 10 | font-size: 14px; 11 | 12 | .label { 13 | padding: 10px 4px 10px 0px; 14 | width: 100px; 15 | font-weight: 550; 16 | font-size: 16px; 17 | font-variant-caps: all-petite-caps; 18 | } 19 | 20 | .text { 21 | width: 400px; 22 | padding: 4px 0px; 23 | } 24 | } 25 | 26 | .resume-wrapper { 27 | border: 1px solid black; 28 | padding: 8px; 29 | margin: 8px 4px 0; 30 | border-radius: 8px; 31 | 32 | .resume-item { 33 | margin: 4px 0; 34 | 35 | .resume-item-label { 36 | font-weight: 700; 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /backend/notifications/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:56 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | initial = True 9 | 10 | dependencies = [ 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='Notification', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('title', models.CharField(max_length=50)), 19 | ('content', models.CharField(max_length=250, null=True)), 20 | ('image', models.CharField(blank=True, max_length=200, null=True)), 21 | ('created_at', models.DateTimeField(auto_now_add=True)), 22 | ], 23 | options={ 24 | 'ordering': ['-created_at'], 25 | }, 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /frontend/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 17 | 18 | 19 | Jobhax 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/UnderConstruction/UnderConstruction.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Footer from "../../Partials/Footer/Footer.jsx"; 3 | 4 | class UnderConstruction extends Component { 5 | generateHeaderArea() { 6 | return ( 7 |
8 |
9 |

sorry

10 |
11 |
12 | ); 13 | } 14 | 15 | generateInfo() { 16 | return ( 17 |
18 |

This page is under construction!

19 |
20 | ); 21 | } 22 | 23 | render() { 24 | return ( 25 |
26 |
27 | {this.generateHeaderArea()} 28 | {this.generateInfo()} 29 |
30 |
31 |
32 |
33 |
34 | ); 35 | } 36 | } 37 | 38 | export default UnderConstruction; 39 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents/CandidateDetails.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | class CandidateDetails extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | } 7 | 8 | generateInfo(label, data) { 9 | return ( 10 |
11 | 14 |
{data}
15 |
16 | ); 17 | } 18 | 19 | generateAllInfo() { 20 | const { card } = this.props; 21 | return ( 22 |
23 | {this.generateInfo('Email', card.email)} 24 | {this.generateInfo('Number', card.phone_number)} 25 | {this.generateInfo('Reference', card.reference)} 26 |
27 | ); 28 | } 29 | 30 | render() { 31 | return ( 32 |
33 |
{this.generateAllInfo()}
34 |
35 | ); 36 | } 37 | } 38 | 39 | export default CandidateDetails; 40 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/NavigationPanel/NavigationPanel.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | class NavigationPanel extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | } 7 | 8 | generateNavigationPanel() { 9 | const subheaderFixedClassName = "modal-body navigation subheaders"; 10 | return this.props.sections.map(section => ( 11 |
this.props.setDisplaying(section)} 19 | > 20 | {section} 21 |
22 | )); 23 | } 24 | 25 | render() { 26 | return ( 27 |
28 | {this.generateNavigationPanel()} 29 |
30 | ); 31 | } 32 | } 33 | 34 | export default NavigationPanel; 35 | -------------------------------------------------------------------------------- /backend/position/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import JobPosition, PositionDetail 4 | from utils.serializers import StateSerializer, CountrySerializer 5 | from company.serializers import CompanySerializer 6 | 7 | 8 | class JobPositionSerializer(serializers.ModelSerializer): 9 | def create(self, validated_data): 10 | return JobPosition.objects.create(**validated_data) 11 | 12 | class Meta: 13 | model = JobPosition 14 | fields = ('__all__') 15 | 16 | 17 | class PositionDetailSerializer(serializers.ModelSerializer): 18 | # job = JobPositionSerializer(many=False, read_only=False) 19 | state = StateSerializer(many=False, read_only=True) 20 | country = CountrySerializer(many=False, read_only=True) 21 | company = CompanySerializer(many=False, read_only=True) 22 | 23 | def create(self, validated_data): 24 | return PositionDetail.objects.create(**validated_data) 25 | 26 | class Meta: 27 | model = PositionDetail 28 | fields = ('__all__') 29 | -------------------------------------------------------------------------------- /backend/utils/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import * 4 | 5 | 6 | # Register your models here. 7 | @admin.register(Agreement) 8 | class UserAdmin(admin.ModelAdmin): 9 | list_display = ('key', 'is_html') 10 | 11 | 12 | @admin.register(Country) 13 | class CountryAdmin(admin.ModelAdmin): 14 | list_display = ("name", "region", "code2", "code3") 15 | list_filter = ("name", "region", "code2", "code3") 16 | 17 | 18 | class FeedbackQuestionItemInline(admin.TabularInline): 19 | model = FeedbackQuestionItem 20 | extra = 0 21 | max_num = 15 22 | 23 | 24 | @admin.register(FeedbackQuestion) 25 | class FeedbackQuestionAdmin(admin.ModelAdmin): 26 | list_display = ('title', 'date', 'answer_count', 'is_published') 27 | inlines = [FeedbackQuestionItemInline, ] 28 | 29 | 30 | @admin.register(FeedbackAnswer) 31 | class FeedbackAnswerAdmin(admin.ModelAdmin): 32 | list_display = ('feedback_question', 'answer', 'user_input', 'ip', 'datetime') 33 | list_filter = ('feedback_question', 'datetime') 34 | 35 | 36 | -------------------------------------------------------------------------------- /backend/faq/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.translation import gettext as _ 3 | 4 | 5 | class Faq(models.Model): 6 | title = models.CharField(max_length=250, verbose_name=_('faq title')) 7 | description = models.CharField(max_length=250, verbose_name=_('faq description')) 8 | is_published = models.BooleanField(default=True, verbose_name=_('is published')) 9 | 10 | objects = models.Manager() 11 | 12 | class Meta: 13 | ordering = ['pk'] 14 | verbose_name = _('faq') 15 | verbose_name_plural = _('faqs') 16 | 17 | 18 | class Item(models.Model): 19 | faq = models.ForeignKey(Faq, related_name='items', on_delete=models.CASCADE) 20 | value = models.CharField(max_length=250, verbose_name=_('value')) 21 | position = models.SmallIntegerField(default=0, verbose_name=_('position')) 22 | 23 | class Meta: 24 | verbose_name = _('items') 25 | verbose_name_plural = _('items') 26 | ordering = ['position'] 27 | 28 | def __str__(self): 29 | return u'%s' % (self.value,) 30 | -------------------------------------------------------------------------------- /backend/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from utils.export_csv import ExportCsv 4 | from .models import User, EmploymentStatus, Feedback, UserType 5 | 6 | 7 | @admin.register(User) 8 | class UserAdmin(admin.ModelAdmin, ExportCsv): 9 | list_display = ("email", "first_name", "last_name", "username", "user_type", 'signup_flow_completed', "gender", "college", 10 | "student_email", "phone_number", "dob") 11 | list_filter = ("email", "first_name", "last_name", "username", "user_type", 'signup_flow_completed', "gender", "college", 12 | "student_email", "phone_number", "dob") 13 | actions = ["export_as_csv"] 14 | 15 | 16 | @admin.register(Feedback) 17 | class FeedbackAdmin(admin.ModelAdmin, ExportCsv): 18 | list_display = ("user", "text", "star") 19 | list_filter = ("user", "text", "star") 20 | actions = ["export_as_csv"] 21 | 22 | 23 | @admin.register(EmploymentStatus) 24 | class EmploymentStatusAdmin(admin.ModelAdmin, ExportCsv): 25 | list_display = ("id", "value") 26 | 27 | 28 | @admin.register(UserType) 29 | class UserTypeAdmin(admin.ModelAdmin): 30 | list_display = ("id", "name") 31 | -------------------------------------------------------------------------------- /backend/JH_RestAPI/backends.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import backends, get_user_model 2 | from django.db.models import Q 3 | 4 | User = get_user_model() 5 | 6 | 7 | class ModelBackend(backends.ModelBackend): 8 | 9 | def authenticate(self, request, username=None, password=None, **kwargs): 10 | if username is None: 11 | username = kwargs.get(User.USERNAME_FIELD) 12 | try: 13 | # user = User._default_manager.get_by_natural_key(username) 14 | # You can customise what the given username is checked against, here I compare to both username and email fields of the User model 15 | user = User.objects.get(Q(username__iexact=username) | Q(email__iexact=username)) 16 | except User.DoesNotExist: 17 | # Run the default password hasher once to reduce the timing 18 | # difference between an existing and a nonexistent user (#20760). 19 | User().set_password(password) 20 | else: 21 | if user.check_password(password) and self.user_can_authenticate(user): 22 | return user 23 | return super().authenticate(request, username, password, **kwargs) 24 | -------------------------------------------------------------------------------- /backend/positionapps/migrations/0002_auto_20191223_1124.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2 on 2019-12-23 19:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('positionapps', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='positionapplication', 15 | name='candidate_resume', 16 | field=models.FileField(null=True, upload_to=''), 17 | ), 18 | migrations.AddField( 19 | model_name='positionapplication', 20 | name='email', 21 | field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='email address'), 22 | ), 23 | migrations.AddField( 24 | model_name='positionapplication', 25 | name='phone_number', 26 | field=models.CharField(blank=True, max_length=17), 27 | ), 28 | migrations.AddField( 29 | model_name='positionapplication', 30 | name='reference', 31 | field=models.CharField(blank=True, max_length=50, null=True), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /backend/positionapps/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from utils.export_csv import ExportCsv 4 | from .models import PositionApplication, ApplicationStatus, Contact, Feedback 5 | 6 | 7 | # Register your models here. 8 | @admin.register(PositionApplication) 9 | class PositionApplicationAdmin(admin.ModelAdmin, ExportCsv): 10 | list_display = ("user", "first_name", "last_name", "application_status", "position", 11 | 'company_object', 'is_deleted', 'apply_date') 12 | list_filter = ("user", "application_status", "position", 13 | 'company_object', 'apply_date') 14 | actions = ["export_as_csv"] 15 | 16 | 17 | @admin.register(ApplicationStatus) 18 | class ApplicationStatusAdmin(admin.ModelAdmin): 19 | list_display = ("value", "pos", "rejectable", "default") 20 | 21 | 22 | @admin.register(Contact) 23 | class ContactAdmin(admin.ModelAdmin): 24 | list_display = ("id", "created_date", "updated_date") 25 | 26 | 27 | @admin.register(Feedback) 28 | class FeedbackAdmin(admin.ModelAdmin): 29 | list_display = ("id", "interviewer", "rate", "description", 30 | "interview_date", "created_date", "updated_date") 31 | -------------------------------------------------------------------------------- /backend/company/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.core.validators import RegexValidator 3 | 4 | 5 | class Company(models.Model): 6 | company = models.CharField(max_length=200, blank=False) 7 | logo = models.FileField(blank=False, null=False, 8 | default='8af3c0b7-6f12-4d54-8d64-5c49f40f28fb.png') 9 | domain = models.CharField(max_length=50, null=True) 10 | location_lat = models.FloatField(blank=True, null=True) 11 | location_lon = models.FloatField(blank=True, null=True) 12 | location_address = models.CharField(max_length=250, blank=True, null=True) 13 | description = models.TextField(blank=True, null=True) 14 | phone_regex = RegexValidator( 15 | regex=r'^\+?1?\d{9,15}$', 16 | message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.") 17 | phone_number = models.CharField( 18 | validators=[phone_regex], max_length=17, null=True, blank=True) # validators should be a list 19 | employees_number = models.IntegerField(null=True, blank=True) 20 | 21 | class Meta: 22 | ordering = ['company'] 23 | 24 | def __str__(self): 25 | return self.company if self.company is not None else '' 26 | -------------------------------------------------------------------------------- /backend/users/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from rest_framework.urlpatterns import format_suffix_patterns 3 | 4 | from users import views 5 | 6 | urlpatterns = [ 7 | path('authSocialUser/', views.auth_social_user), 8 | path('register/', views.register), 9 | path('login/', views.login), 10 | path('refreshToken/', views.refresh_token), 11 | path('linkSocialAccount/', views.link_social_account), 12 | path('logout/', views.logout), 13 | path('updateGmailToken/', views.update_gmail_token), 14 | path('activate/', views.activate_user), 15 | path('sendActivationCode/', views.send_activation_code), 16 | path('forgotPassword/', views.forgot_password), 17 | path('validateForgotPassword/', views.validate_forgot_password), 18 | path('resetPassword/', views.reset_password), 19 | path('changePassword/', views.change_password), 20 | path('updateProfilePhoto/', views.update_profile_photo), 21 | path('employmentStatuses/', views.employment_statuses), 22 | path('profile/', views.get_profile), 23 | path('updateProfile/', views.update_profile), 24 | path('feedback/', views.feedback), 25 | path('deleteUser/', views.delete_user), 26 | path('verifyRecaptcha/', views.verify_recaptcha), 27 | ] 28 | urlpatterns = format_suffix_patterns(urlpatterns) 29 | -------------------------------------------------------------------------------- /backend/college/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:55 2 | 3 | import django.contrib.postgres.fields 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='College', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('web_pages', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 20 | ('domains', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 21 | ('name', models.CharField(max_length=200)), 22 | ('alpha_two_code', models.CharField(blank=True, max_length=5)), 23 | ('state_province', models.CharField(blank=True, max_length=30, null=True)), 24 | ('country', models.CharField(blank=True, max_length=50)), 25 | ('supported', models.BooleanField(default=False)), 26 | ], 27 | options={ 28 | 'ordering': ['name'], 29 | }, 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/JobHax-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JobHax-logo-white 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/src/assets/icons/JobHax-logo-black.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | JobHax-logo-black 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/src/utils/helpers/oAuthHelperFunctions.js: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { linkedInClientId, linkedInClientSecret } from "../../config/config.js"; 3 | import { IS_CONSOLE_LOG_OPEN } from "../constants/constants.js"; 4 | 5 | export function linkedInOAuth() { 6 | let url = 7 | "https://www.linkedin.com/oauth/v2/authorization" + 8 | "?response_type=code" + 9 | "&client_id=" + 10 | linkedInClientId + 11 | "&redirect_uri=https://jobhax.com/action-linkedin-oauth2" + 12 | "&scope=" + 13 | "r_emailaddress%20" + 14 | "r_liteprofile%20"; 15 | window.open(url); 16 | } 17 | 18 | export async function linkedInAccessTokenRequester(authCode) { 19 | IS_CONSOLE_LOG_OPEN && 20 | console.log("access code will be requested with", authCode); 21 | response = await axios({ 22 | method: "POST", 23 | url: "https://www.linkedin.com/oauth/v2/accessToken", 24 | data: { 25 | grant_type: "authorization_code", 26 | code: authCode, 27 | redirect_uri: "https://jobhax.com/action-linkedin-oauth2", 28 | client_id: linkedInClientId, 29 | client_secret: linkedInClientSecret 30 | }, 31 | headers: { 32 | "Content-Type": "application/x-www-form-urlencoded" 33 | } 34 | }).catch(error => { 35 | IS_CONSOLE_LOG_OPEN && console.log(error); 36 | }); 37 | IS_CONSOLE_LOG_OPEN && console.log("linkedInOAuth response", response); 38 | } 39 | -------------------------------------------------------------------------------- /backend/cvparser/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.postgres.fields import ArrayField 3 | from django.contrib.auth import get_user_model 4 | 5 | from positionapps.models import PositionApplication 6 | 7 | User = get_user_model() 8 | 9 | 10 | # Create your models here. 11 | 12 | class Resume(models.Model): 13 | contact = ArrayField(models.TextField(null=True, blank=True)) 14 | skills = ArrayField(models.TextField(null=True, blank=True)) 15 | linkedin = models.CharField(max_length=200, blank=False) 16 | certifications = ArrayField(models.TextField(null=True, blank=True)) 17 | summary = ArrayField(models.TextField(null=True, blank=True)) 18 | languages = ArrayField(models.TextField(null=True, blank=True)) 19 | school = models.CharField(max_length=200, blank=False) 20 | degree = models.CharField(max_length=200, blank=False) 21 | company = models.CharField(max_length=200, blank=False) 22 | position = models.CharField(max_length=200, blank=False) 23 | startdate = models.CharField(max_length=200, blank=False) 24 | enddate = models.CharField(max_length=200, blank=False) 25 | user = models.ForeignKey( 26 | User, on_delete=models.CASCADE, null=True, blank=True) 27 | pos_app = models.ForeignKey( 28 | PositionApplication, on_delete=models.CASCADE, null=True, blank=True) 29 | 30 | class Meta: 31 | ordering = ['linkedin'] 32 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents/FeedbackInput/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../../../../App/style.scss"; 2 | 3 | .feedback-form-container { 4 | width: 500px; 5 | 6 | .feedback-form { 7 | display: flex; 8 | justify-content: space-between; 9 | 10 | .feedback-header { 11 | font-weight: bolder; 12 | padding-bottom: 8px; 13 | padding-right: 12px; 14 | } 15 | 16 | .label { 17 | font-weight: 450; 18 | margin-top: 8px; 19 | padding-right: 12px; 20 | } 21 | 22 | .text-box { 23 | font-family: exo; 24 | font-size: 90%; 25 | height: 60px; 26 | width: 100%; 27 | max-height: 250px; 28 | min-height: 50px; 29 | border: 1px solid $border_color; 30 | border-radius: 4px; 31 | padding: 8px; 32 | 33 | &.interview-experience { 34 | height: 200px; 35 | } 36 | } 37 | 38 | .interview-reviews { 39 | width: 100%; 40 | } 41 | 42 | .feedback-button-container { 43 | display: flex; 44 | justify-content: flex-end; 45 | padding: 12px 8px 0 0; 46 | } 47 | } 48 | } 49 | 50 | .ant-statistic-content { 51 | font-size: 14px; 52 | width: 80px; 53 | margin: 0px 8px 0px -12px; 54 | } 55 | 56 | .ant-statistic-content-value-decimal { 57 | font-size: 12px; 58 | } 59 | 60 | .ant-statistic-content-suffix { 61 | font-size: 14px; 62 | } 63 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/ModalBody.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import NavigationPanel from "./NavigationPanel/NavigationPanel.jsx"; 4 | import BodyComponents from "./Body/BodyComponents.jsx"; 5 | 6 | class ModalBody extends React.Component { 7 | constructor(props) { 8 | super(props); 9 | 10 | this.state = { 11 | displaying: "Contact" 12 | }; 13 | 14 | this.setDisplaying = this.setDisplaying.bind(this); 15 | } 16 | 17 | setDisplaying(section) { 18 | this.setState({ displaying: section }); 19 | } 20 | 21 | render() { 22 | return ( 23 |
24 | 29 |
30 | 39 |
40 |
41 | ); 42 | } 43 | } 44 | 45 | export default ModalBody; 46 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/JobInput/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .column-addJob-form { 4 | margin: 8px 15px 15px 15px; 5 | padding: 8px 12px; 6 | text-align: center; 7 | max-width: 85%; 8 | height: 168px; 9 | color: rgb(150, 150, 150); 10 | background-color: white; 11 | border-radius: 8px; 12 | box-shadow: 1px 1px 5px 1px rgba(0, 0, 0, 0.1); 13 | font-weight: 600; 14 | 15 | .ant-input, 16 | .ant-select-auto-complete.ant-select .ant-input { 17 | border: none; 18 | outline: none; 19 | background-color: rgb(249, 249, 249); 20 | color: rgb(100, 100, 100); 21 | font-weight: 500; 22 | } 23 | 24 | .ant-select-selection__placeholder { 25 | z-index: 10; 26 | color: rgb(194, 194, 194); 27 | } 28 | 29 | > div { 30 | margin-top: 13px; 31 | } 32 | 33 | .column-addJob-form-buttons-container { 34 | display: flex; 35 | justify-content: space-between; 36 | 37 | .column-addJob-form-button { 38 | border: none; 39 | background-color: transparent; 40 | font-size: 14px; 41 | color: black; 42 | cursor: pointer; 43 | outline: none; 44 | 45 | &.--addJob { 46 | font-weight: bold; 47 | color: rgb(132, 100, 239); 48 | background-color: transparent; 49 | } 50 | 51 | &.--button-disabled { 52 | opacity: 0.5; 53 | cursor: none; 54 | pointer-events: none; 55 | } 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /backend/company/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:55 2 | 3 | import django.core.validators 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Company', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('company', models.CharField(max_length=200)), 20 | ('logo', models.FileField(default='8af3c0b7-6f12-4d54-8d64-5c49f40f28fb.png', upload_to='')), 21 | ('domain', models.CharField(max_length=50, null=True)), 22 | ('location_lat', models.FloatField(blank=True, null=True)), 23 | ('location_lon', models.FloatField(blank=True, null=True)), 24 | ('location_address', models.CharField(blank=True, max_length=250, null=True)), 25 | ('description', models.TextField(blank=True, null=True)), 26 | ('phone_number', models.CharField(blank=True, max_length=17, validators=[django.core.validators.RegexValidator(message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.", regex='^\\+?1?\\d{9,15}$')])), 27 | ('employees_number', models.IntegerField(blank=True, null=True)), 28 | ], 29 | options={ 30 | 'ordering': ['company'], 31 | }, 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/style.scss: -------------------------------------------------------------------------------- 1 | @import "../App/style.scss"; 2 | 3 | 4 | .static-page-container { 5 | height: 96vh; 6 | 7 | .header-area { 8 | background-image: $banner_image; 9 | background-size: 100% 100%; 10 | height: 280px; 11 | text-align: center; 12 | padding-top: 120px; 13 | padding-bottom: 80px; 14 | 15 | h2 { 16 | font-weight: bolder; 17 | color: white; 18 | margin-top: 0px; 19 | font-size: 200%; 20 | } 21 | 22 | .legal-top { 23 | display: flex; 24 | justify-content: space-between; 25 | padding-top: 120px; 26 | 27 | button { 28 | color: white; 29 | font-size: 12pt; 30 | background: rgba(255, 255, 255, 0.05); 31 | border: none; 32 | border-radius: 50px; 33 | padding: 15px 35px; 34 | margin-top: 7.8%; 35 | cursor: pointer; 36 | } 37 | } 38 | } 39 | 40 | .logo { 41 | width: 90px; 42 | } 43 | } 44 | 45 | .info-container { 46 | display: flex; 47 | justify-content: center; 48 | 49 | .info-area { 50 | margin-top: 50px; 51 | margin-bottom: 100px; 52 | text-align: left; 53 | height: fit-content; 54 | height: -moz-fit-content; 55 | width: 80%; 56 | 57 | h2 { 58 | font-weight: bolder; 59 | margin-top: 120px; 60 | color: black; 61 | } 62 | } 63 | } -------------------------------------------------------------------------------- /backend/position/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | from utils.models import Country 4 | from utils.models import State 5 | from company.models import Company 6 | 7 | 8 | class JobPosition(models.Model): 9 | job_title = models.CharField(max_length=200, blank=False) 10 | 11 | class Meta: 12 | ordering = ['job_title'] 13 | 14 | def __str__(self): 15 | return self.job_title if self.job_title is not None else '' 16 | 17 | 18 | class PositionDetail(models.Model): 19 | # job = models.ForeignKey( 20 | # JobPosition, on_delete=models.SET_NULL, null=True, blank=False) 21 | job=models.TextField(max_length=200, null=True, blank=True) 22 | responsibilities = models.TextField(blank=False) 23 | requirements = models.TextField(blank=False) 24 | department = models.CharField(max_length=200, blank=False) 25 | job_type = models.CharField(max_length=200, blank=False) 26 | city = models.CharField(max_length=200, blank=False) 27 | country = models.ForeignKey( 28 | Country, on_delete=models.SET_NULL, null=True, blank=False) 29 | state = models.ForeignKey( 30 | State, on_delete=models.SET_NULL, null=True, blank=False) 31 | company = models.ForeignKey( 32 | Company, on_delete=models.SET_NULL, null=True, related_name='%(class)s_company', blank=False) 33 | is_deleted = models.BooleanField(default=False) 34 | created_date = models.DateTimeField( 35 | default=timezone.now, null=True, blank=False) 36 | updated_date = models.DateTimeField( 37 | default=timezone.now, null=True, blank=False) 38 | 39 | class Meta: 40 | ordering = ['updated_date'] 41 | -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/FAQ/FAQ.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Collapse } from "antd"; 3 | import axios from "axios"; 4 | 5 | import { FAQS } from "../../../utils/constants/endpoints.js"; 6 | import Footer from "../../Partials/Footer/Footer.jsx"; 7 | import Spinner from "../../Partials/Spinner/Spinner.jsx"; 8 | 9 | const Panel = Collapse.Panel; 10 | 11 | class FAQ extends React.Component { 12 | constructor(props) { 13 | super(props); 14 | 15 | this.state = { isRequested: false, faqList: [] }; 16 | } 17 | 18 | async componentDidMount() { 19 | let config = { method: "GET" }; 20 | const response = await axios.get(FAQS, config); 21 | this.setState({ faqList: response.data.data }); 22 | } 23 | 24 | generateHeaderArea() { 25 | return ( 26 |
27 |
28 |

Frequently Asked Questions

29 |
30 |
31 | ); 32 | } 33 | 34 | generateAccordion() { 35 | return ( 36 | 37 | {this.state.faqList.map(faq => ( 38 | 39 |

{faq.description}

40 |
41 | ))} 42 |
43 | ); 44 | } 45 | 46 | render() { 47 | if (this.state.faqList.length == 0) 48 | return ; 49 | return ( 50 |
51 |
{this.generateHeaderArea()}
52 |
{this.generateAccordion()}
53 |
54 |
55 |
56 |
57 | ); 58 | } 59 | } 60 | 61 | export default FAQ; 62 | -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/UserAgreement/UserAgreement.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Footer from "../../Partials/Footer/Footer.jsx"; 3 | import parse from "html-react-parser"; 4 | 5 | import { axiosCaptcha } from "../../../utils/api/fetch_api.js"; 6 | import { AGREEMENTS } from "../../../utils/constants/endpoints.js"; 7 | 8 | class UserAgreement extends Component { 9 | constructor(props) { 10 | super(props); 11 | 12 | this.state = { 13 | user_agreement: "" 14 | }; 15 | } 16 | 17 | componentDidMount() { 18 | let config = { method: "GET" }; 19 | axiosCaptcha(AGREEMENTS, config).then(response => { 20 | if (response.statusText === "OK") { 21 | this.setState({ user_agreement: response.data.data.user_agreement }); 22 | } 23 | }); 24 | } 25 | 26 | generateHeaderArea() { 27 | return ( 28 |
29 |
30 |

User Agreement

31 |
32 |
33 | ); 34 | } 35 | 36 | generateInfo() { 37 | return ( 38 |
39 |
40 | {this.state.user_agreement.is_html === true 41 | ? parse(`${this.state.user_agreement.value}`) 42 | : this.state.user_agreement.value} 43 |
44 |
45 | ); 46 | } 47 | 48 | render() { 49 | return ( 50 |
51 |
52 | {this.generateHeaderArea()} 53 | {this.generateInfo()} 54 |
55 |
56 |
57 |
58 |
59 | ); 60 | } 61 | } 62 | 63 | export default UserAgreement; 64 | -------------------------------------------------------------------------------- /frontend/src/components/StaticPages/PrivacyPolicy/PrivacyPolicy.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import Footer from "../../Partials/Footer/Footer.jsx"; 3 | import parse from "html-react-parser"; 4 | 5 | import { axiosCaptcha } from "../../../utils/api/fetch_api.js"; 6 | import { AGREEMENTS } from "../../../utils/constants/endpoints.js"; 7 | 8 | import "../style.scss"; 9 | 10 | class PrivacyPolicy extends Component { 11 | constructor(props) { 12 | super(props); 13 | 14 | this.state = { 15 | privacy_policy: "" 16 | }; 17 | } 18 | 19 | componentDidMount() { 20 | let config = { method: "GET" }; 21 | axiosCaptcha(AGREEMENTS, config).then(response => { 22 | if (response.statusText === "OK") { 23 | this.setState({ privacy_policy: response.data.data.privacy }); 24 | } 25 | }); 26 | } 27 | 28 | generateHeaderArea() { 29 | return ( 30 |
31 |
32 |

Privacy Policy

33 |
34 |
35 | ); 36 | } 37 | 38 | generateInfo() { 39 | return ( 40 |
41 |
42 | {this.state.privacy_policy.is_html === true 43 | ? parse(`${this.state.privacy_policy.value}`) 44 | : this.state.privacy_policy.value} 45 |
46 |
47 | ); 48 | } 49 | 50 | render() { 51 | return ( 52 |
53 |
{this.generateHeaderArea()}
54 |
{this.generateInfo()}
55 |
56 |
57 |
58 |
59 | ); 60 | } 61 | } 62 | 63 | export default PrivacyPolicy; 64 | -------------------------------------------------------------------------------- /backend/JH_RestAPI/urls.py: -------------------------------------------------------------------------------- 1 | """JH_RestAPI URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/2.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.conf import settings 17 | from django.conf.urls import include 18 | from django.conf.urls.static import static 19 | from django.contrib import admin 20 | from django.urls import path 21 | from django.urls import re_path 22 | 23 | urlpatterns = [ 24 | path('admin/', admin.site.urls), 25 | path('api/users/', include('users.urls')), 26 | path('api/positionapps/', include('positionapps.urls')), 27 | path('api/faqs/', include('faq.urls')), 28 | path('api/notifications/', include('notifications.urls')), 29 | path('api/companies/', include('company.urls')), 30 | path('api/colleges/', include('college.urls')), 31 | path('api/majors/', include('major.urls')), 32 | path('api/positions/', include('position.urls')), 33 | path('api/parser/', include('cvparser.urls')), 34 | path('api/', include('utils.urls')), 35 | re_path(r'^auth/', include('rest_framework_social_oauth2.urls')), 36 | ] 37 | 38 | if settings.DEBUG: 39 | urlpatterns += static(settings.MEDIA_URL, 40 | document_root=settings.MEDIA_ROOT) 41 | -------------------------------------------------------------------------------- /backend/faq/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:55 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Faq', 17 | fields=[ 18 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('title', models.CharField(max_length=250, verbose_name='faq title')), 20 | ('description', models.CharField(max_length=250, verbose_name='faq description')), 21 | ('is_published', models.BooleanField(default=True, verbose_name='is published')), 22 | ], 23 | options={ 24 | 'verbose_name': 'faq', 25 | 'verbose_name_plural': 'faqs', 26 | 'ordering': ['pk'], 27 | }, 28 | ), 29 | migrations.CreateModel( 30 | name='Item', 31 | fields=[ 32 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 33 | ('value', models.CharField(max_length=250, verbose_name='value')), 34 | ('position', models.SmallIntegerField(default=0, verbose_name='position')), 35 | ('faq', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='faq.Faq')), 36 | ], 37 | options={ 38 | 'verbose_name': 'items', 39 | 'verbose_name_plural': 'items', 40 | 'ordering': ['position'], 41 | }, 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents/Feedbacks/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../../../../App/style.scss"; 2 | 3 | .reviews-big-container { 4 | width: 100%; 5 | min-width: 100%; 6 | 7 | .reviews-container { 8 | width: 105%; 9 | min-width: 105%; 10 | max-height: 100%; 11 | overflow-x: hidden; 12 | 13 | .review-container { 14 | width: calc(100% * 100 / 105); 15 | height: fit-content; 16 | height: -moz-fit-content; 17 | margin-bottom: 15px; 18 | padding: 20px; 19 | border-radius: 4px; 20 | border: 1px solid $line_color; 21 | font-weight: normal; 22 | 23 | .review-header { 24 | padding-bottom: 15px; 25 | 26 | .reviewer-name { 27 | font-size: 120%; 28 | } 29 | 30 | .header-bottom { 31 | display: flex; 32 | justify-content: space-between; 33 | width: 100%; 34 | max-height: 20px; 35 | 36 | .date { 37 | font-size: 12px; 38 | color: $gray_text_color; 39 | text-align: end; 40 | } 41 | } 42 | } 43 | 44 | .review-body { 45 | padding: 15px 0px 20px 0px; 46 | border-top: 1px solid $line_color; 47 | 48 | .review-body-interview { 49 | .interview-experience { 50 | margin-top: 12px; 51 | } 52 | } 53 | 54 | label { 55 | font-weight: 450; 56 | margin-right: 5px; 57 | color: $gray_text_color; 58 | } 59 | 60 | .not-specified { 61 | font-size: 90%; 62 | color: rgba(116, 116, 116, 0.4); 63 | font-style: italic; 64 | margin-left: 5px; 65 | } 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/Footer/Footer.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import { Link } from "react-router-dom"; 3 | 4 | import "./style.scss"; 5 | 6 | class Footer extends Component { 7 | render() { 8 | return ( 9 |
10 |
11 | 12 | About Us 13 | 14 | 15 | Docs 16 | 17 | 18 | Privacy Policy 19 | 20 | 21 | FAQ 22 | 23 |
24 |
25 | JobHax 2019, All Rights Reserved 26 |
27 |
28 | {/* 29 | 38 | Blogs 39 | */} 40 | 41 | GitHub 42 | 43 | 44 | Slack 45 | 46 | 47 | Forum 48 | 49 |
50 |
51 | ); 52 | } 53 | } 54 | 55 | export default Footer; 56 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/Footer/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .footer-container { 4 | display: flex; 5 | justify-content: space-between; 6 | padding: 20px 75px; 7 | color: $text_color; 8 | background-color: white; 9 | background-size: 100% 100%; 10 | overflow-y: hidden; 11 | z-index: 0; 12 | box-shadow: 0 .15rem 1.75rem 0 rgba(33,37,41,.15) !important; 13 | 14 | a { 15 | text-decoration: none; 16 | color: $text_color; 17 | cursor: pointer; 18 | transition: color .3s; 19 | -webkit-transition: color .3s; 20 | -moz-transition: color .3s; 21 | -o-transition: color .3s; 22 | -ms-transition: color .3s; 23 | } 24 | 25 | a:hover { 26 | color: $hover_color; 27 | } 28 | 29 | .footer-content { 30 | font-size: 10pt; 31 | 32 | &.footer-social-links { 33 | text-align: end; 34 | 35 | span { 36 | margin-left: 20px; 37 | } 38 | } 39 | 40 | &.footer-inside-links { 41 | text-align: start; 42 | 43 | span { 44 | margin-right: 20px; 45 | } 46 | } 47 | 48 | &.footer-notation { 49 | text-align: center; 50 | } 51 | } 52 | 53 | 54 | @media only screen and (max-device-width : 800px) and (-webkit-min-device-pixel-ratio : 2) { 55 | padding: 20px 24px; 56 | width: 100%; 57 | z-index: 10; 58 | position: absolute; 59 | 60 | .footer-content { 61 | &.footer-social-links { 62 | width: 30%; 63 | display: flex; 64 | flex-direction: column; 65 | } 66 | 67 | &.footer-inside-links { 68 | width: 30%; 69 | display: flex; 70 | flex-direction: column; 71 | } 72 | 73 | &.footer-notation { 74 | width: 40%; 75 | display: flex; 76 | flex-direction: column; 77 | } 78 | } 79 | } 80 | 81 | } -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/style.scss: -------------------------------------------------------------------------------- 1 | @import "../App/style.scss"; 2 | 3 | $multipleContainerAnimationTransitionDuration: 0.5s; 4 | $multipleContainerAnimationFromZeroScale: 1.6; 5 | 6 | .job-input-button { 7 | background-color: #0b6aff !important; 8 | min-height: 50px !important; 9 | max-height: none !important; 10 | } 11 | 12 | .button-inside { 13 | color: white !important; 14 | font-size: 40px !important; 15 | font-weight: bold !important; 16 | } 17 | 18 | .modal .modal-main { 19 | border-radius: 5px !important; 20 | } 21 | 22 | .main-container .main { 23 | margin-left: 12px !important; 24 | } 25 | 26 | .dashboard-container { 27 | height: calc(100%); 28 | width: 100%; 29 | padding: 1%; 30 | display: flex; 31 | overflow-y: hidden; 32 | justify-content: center; 33 | 34 | &.--demo-height { 35 | height: calc(100%); 36 | } 37 | } 38 | 39 | .icon { 40 | min-height: 12px; 41 | min-width: auto; 42 | max-height: 16px; 43 | max-width: auto; 44 | padding: 0 8px 0 0; 45 | cursor: pointer; 46 | } 47 | 48 | .multiple-operation-container { 49 | transition: transform $multipleContainerAnimationTransitionDuration; 50 | -webkit-transition: transform $multipleContainerAnimationTransitionDuration; 51 | -moz-transition: transform $multipleContainerAnimationTransitionDuration; 52 | -o-transition: transform $multipleContainerAnimationTransitionDuration; 53 | -ms-transition: transform $multipleContainerAnimationTransitionDuration; 54 | 55 | &.--animation-from-zoom { 56 | transform: scale($multipleContainerAnimationFromZeroScale); 57 | -webkit-transform: scale($multipleContainerAnimationFromZeroScale); 58 | -moz-transform: scale($multipleContainerAnimationFromZeroScale); 59 | -o-transform: scale($multipleContainerAnimationFromZeroScale); 60 | -ms-transform: scale($multipleContainerAnimationFromZeroScale); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ats 2 | Applicant Tracking System 3 | 4 | 1. Install Postgres and PIP3 for Python package management and NPM for Node and NGINX: 5 | ``` 6 | sudo apt-get update 7 | sudo apt install -y postgresql postgresql-contrib python3-pip npm nginx 8 | ``` 9 | 2. Connect to PostgreSQL: 10 | ``` 11 | sudo su - postgres 12 | psql 13 | ``` 14 | 15 | 3. Check login info: 16 | ``` 17 | postgres-# \conninfo 18 | ``` 19 | 20 | 4. Disconnect from PostgreSQL server: 21 | ``` 22 | postgres-# \q 23 | ``` 24 | 25 | Install backend: 26 | 27 | 1. 28 | sudo su - postgres 29 | 30 | 2. Create : 31 | ``` 32 | psql postgres -c "CREATE USER jobhaxdbuser WITH PASSWORD '123456';" 33 | psql postgres -c "CREATE DATABASE jobhaxdb WITH OWNER 'jobhaxdbuser';" 34 | psql postgres -c "ALTER USER jobhaxdbuser CREATEDB;" 35 | ``` 36 | 37 | 38 | 3. Export Envs in ~/.bashrc file: 39 | export JOBHAX_CLEARBIT_KEY='' 40 | export EMAIL_HOST_USER=jobhaxuser@gmail.com 41 | export EMAIL_HOST_PASSWORD='' 42 | export JOBHAX_RECAPTCHA_SECRET='' 43 | export reCaptchaV3SiteKey='' 44 | export JOBHAX_LINKEDIN_CLIENT_KEY='' 45 | export JOBHAX_LINKEDIN_CLIENT_SECRET='' 46 | 47 | 4. Refresh env file: 48 | ```source ~/.bashrc 49 | ``` 50 | 51 | 5. 52 | 53 | Install frontend 54 | 1. Install yarn 55 | ``` 56 | npm i -g yarn 57 | ``` 58 | 59 | 2. 60 | ``` 61 | yarn install 62 | ``` 63 | 64 | 3. Create config/config.js as in config/example.js: 65 | ``` 66 | 67 | ``` 68 | 69 | Install nginx: 70 | 71 | Add Certbot PPA 72 | sudo apt install -y software-properties-common 73 | sudo add-apt-repository universe 74 | sudo add-apt-repository ppa:certbot/certbot 75 | 76 | Install Certbot 77 | sudo apt install -y certbot python-certbot-nginx 78 | 79 | Renew: 80 | sudo certbot renew --dry-run 81 | 82 | Confirm that Certbot worked: 83 | https://www.ssllabs.com/ssltest/ 84 | 85 | Reference: https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx 86 | 87 | Create JobHax application: 88 | -------------------------------------------------------------------------------- /frontend/src/components/Applicants/ApplicantTable/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .ant-table-body { 4 | // max-height: 355px !important; 5 | // min-height: 335px !important; 6 | background-color: white !important; 7 | } 8 | 9 | .ant-table-thead > tr > th{ 10 | background-color: #0b6aff !important; 11 | color: #ffffff; 12 | border-radius: 0px !important; 13 | height: 45px !important; 14 | } 15 | 16 | .ant-table-tbody > tr > td{ 17 | padding: 15px !important; 18 | } 19 | 20 | .ant-table-footer { 21 | box-shadow: 0 0.46875rem 2.1875rem rgba(4, 9, 20, 0.03), 0 0.9375rem 1.40625rem rgba(4, 9, 20, 0.03), 22 | 0 0.25rem 0.53125rem rgba(4, 9, 20, 0.05), 0 0.125rem 0.1875rem rgba(4, 9, 20, 0.03); 23 | } 24 | .ant-table table{ 25 | padding: 3% !important; 26 | } 27 | .applicant-card { 28 | margin: 24px 0; 29 | border-radius: 8px; 30 | background-color: #eeeeee; 31 | padding: 16px; 32 | display: flex; 33 | 34 | .applicant-card-img { 35 | width: 120px; 36 | img { 37 | width: 50%; 38 | } 39 | } 40 | 41 | .applicant-card-detail { 42 | width: calc(100% - 240px); 43 | // padding: 8px; 44 | display: flex; 45 | justify-content: center; 46 | flex-direction: column; 47 | 48 | .all-caps { 49 | text-transform: uppercase; 50 | font-weight: 600; 51 | } 52 | 53 | .small-text { 54 | font-size: 12px; 55 | color: $gray_text_color; 56 | } 57 | } 58 | 59 | .applicant-card-button { 60 | width: 120px; 61 | display: flex; 62 | align-items: center; 63 | justify-content: center; 64 | } 65 | 66 | .btn-view-edit { 67 | margin-bottom: 10px; 68 | border: 1px solid steelblue; 69 | background-color: #ffffff; 70 | color: black !important; 71 | width: 120px; 72 | } 73 | .btn-delete { 74 | margin-bottom: 10px; 75 | background-color: #d9534f; 76 | width: 120px; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /backend/utils/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | import pytz 3 | from .models import * 4 | 5 | 6 | class AgreementSerializer(serializers.ModelSerializer): 7 | 8 | def create(self, validated_data): 9 | return Agreement.objects.create(**validated_data) 10 | 11 | class Meta: 12 | model = Agreement 13 | fields = ('key', 'is_html', 'value') 14 | 15 | 16 | class CountrySerializer(serializers.ModelSerializer): 17 | 18 | def create(self, validated_data): 19 | return Country.objects.create(**validated_data) 20 | 21 | class Meta: 22 | model = Country 23 | fields = ('id', 'code2', 'name') 24 | 25 | 26 | class StateSerializer(serializers.ModelSerializer): 27 | 28 | def create(self, validated_data): 29 | return State.objects.create(**validated_data) 30 | 31 | class Meta: 32 | model = State 33 | fields = ('id', 'code', 'name') 34 | 35 | 36 | class FeedbackQuestionItemSerializer(serializers.ModelSerializer): 37 | def create(self, validated_data): 38 | return FeedbackQuestionItem.objects.create(**validated_data) 39 | 40 | class Meta: 41 | model = FeedbackQuestionItem 42 | fields = ('id', 'value', 'pos', 'custom_input') 43 | 44 | 45 | class FeedbackQuestionSerializer(serializers.ModelSerializer): 46 | items = serializers.SerializerMethodField() 47 | 48 | def create(self, validated_data): 49 | return FeedbackQuestion.objects.create(**validated_data) 50 | 51 | def get_items(self, obj): 52 | answers = FeedbackQuestionItem.objects.filter(feedback_question=obj) 53 | return FeedbackQuestionItemSerializer(instance=answers, many=True).data 54 | 55 | def get_date(self, obj): 56 | if obj.date is None: 57 | return None 58 | return obj.date.astimezone(pytz.timezone('US/Pacific')) 59 | 60 | class Meta: 61 | model = FeedbackQuestion 62 | fields = ('id', 'title', 'date', 'is_published', 'items') 63 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jobHax-Client", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "webpack-dev-server --mode development --watch --open", 8 | "build": "webpack-dev-server --mode production --watch --open" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "@babel/core": "^7.2.2", 15 | "@babel/plugin-proposal-class-properties": "^7.4.0", 16 | "@babel/preset-env": "^7.2.3", 17 | "@babel/preset-react": "^7.0.0", 18 | "babel-loader": "^8.0.5", 19 | "babel-plugin-import": "^1.12.2", 20 | "babel-polyfill": "^6.26.0", 21 | "compression-webpack-plugin": "^3.0.0", 22 | "css-loader": "^2.1.1", 23 | "file-loader": "^3.0.1", 24 | "html-loader": "^0.5.5", 25 | "html-webpack-plugin": "^3.2.0", 26 | "less": "^3.10.3", 27 | "less-loader": "^5.0.0", 28 | "node-sass": "^4.11.0", 29 | "react": "^16.7.0", 30 | "react-dom": "^16.7.0", 31 | "sass-loader": "^7.1.0", 32 | "style-loader": "^0.23.1", 33 | "uglifyjs-webpack-plugin": "^2.2.0", 34 | "webpack": "^4.28.4", 35 | "webpack-bundle-analyzer": "^3.5.2", 36 | "webpack-cli": "^3.2.1", 37 | "webpack-dev-server": "^3.1.14" 38 | }, 39 | "dependencies": { 40 | "antd": "^3.16.6", 41 | "axios": "^0.18.0", 42 | "classnames": "^2.2.6", 43 | "draft-js": "^0.11.0", 44 | "draftjs-to-html": "^0.8.4", 45 | "echarts": "^4.1.0", 46 | "echarts-for-react": "^2.0.14", 47 | "html-react-parser": "^0.7.0", 48 | "html-to-draftjs": "^1.4.0", 49 | "prop-types": "^15.7.2", 50 | "react-cookie": "^4.0.0", 51 | "react-dnd": "^7.3.1", 52 | "react-dnd-html5-backend": "^7.2.0", 53 | "react-draft-wysiwyg": "^1.13.2", 54 | "react-geosuggest": "^2.12.0", 55 | "react-google-maps": "^9.4.5", 56 | "react-highlight-words": "^0.16.0", 57 | "react-router-dom": "^4.3.1", 58 | "react-telephone-input": "^4.73.4", 59 | "recompose": "^0.30.0" 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /frontend/src/components/Positions/PositionCards/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .positions-filter{ 4 | margin-bottom: 25px; 5 | } 6 | .position-card .position-card-detail { 7 | display: initial !important; 8 | width: -webkit-fill-available !important; 9 | padding: 0px !important; 10 | } 11 | 12 | .position-card-img img { 13 | width: 40% !important; 14 | border-radius: 5px; 15 | } 16 | 17 | .positions-big-container .positions-container { 18 | padding: 2%; 19 | width: 70% !important; 20 | min-width: 576px; 21 | max-width: 70% !important; 22 | background-color: white !important; 23 | box-shadow: 0 0.46875rem 2.1875rem rgba(4, 9, 20, 0.03), 0 0.9375rem 1.40625rem rgba(4, 9, 20, 0.03), 24 | 0 0.25rem 0.53125rem rgba(4, 9, 20, 0.05), 0 0.125rem 0.1875rem rgba(4, 9, 20, 0.03); 25 | } 26 | 27 | .position-card { 28 | margin: 4px 0; 29 | border-radius: 5px; 30 | // background-color: #eeeeee; 31 | padding: 6px; 32 | display: flex; 33 | border-bottom: 1px solid #e8e8e8; 34 | 35 | .position-card-img { 36 | width: 120px; 37 | img { 38 | width: 100%; 39 | } 40 | } 41 | 42 | .position-card-detail { 43 | width: calc(100% - 240px); 44 | padding: 8px; 45 | display: flex; 46 | justify-content: center; 47 | flex-direction: column; 48 | 49 | .all-caps { 50 | text-transform: uppercase; 51 | font-weight: 600; 52 | } 53 | 54 | .small-text { 55 | font-size: 12px; 56 | color: $gray_text_color; 57 | } 58 | } 59 | 60 | .position-card-button { 61 | width: auto; 62 | display: contents; 63 | align-items: center; 64 | justify-content: center; 65 | } 66 | 67 | .btn-view-edit { 68 | margin-bottom: 10px; 69 | border: 1px solid steelblue; 70 | background-color: #ffffff; 71 | color: black !important; 72 | width: 120px; 73 | border: 0px !important; 74 | } 75 | .btn-delete { 76 | margin-bottom: 10px; 77 | // background-color: #d9534f; 78 | width: 120px; 79 | border: 0px !important; 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # JobHax Frontend application 2 | 3 | ![JobHax Website](https://img.shields.io/website?label=jobposting.jobhax.com&up_message=Up%20and%20Running&url=https%3A%2F%2Fjobposting.jobhax.com) 4 | ![Alt text](https://img.shields.io/github/issues-raw/job-hax/capstone.svg) 5 | ![GitHub commit activity](https://img.shields.io/github/commit-activity/w/job-hax/capstone?style=plastic) 6 | ![GitHub contributors](https://img.shields.io/github/contributors/job-hax/capstone.svg) 7 | ![GitHub repo size](https://img.shields.io/github/repo-size/job-hax/capstone.svg) 8 | ![GitHub languages](https://img.shields.io/github/languages/count/job-hax/capstone) 9 | 10 | 11 | ## Prerequisites 12 | 13 | 1. Download nodejs version 10x: 14 | ``` 15 | https://nodejs.org/en/download/ 16 | ``` 17 | 2. Install yarn package manager for JavaScript: 18 | ``` 19 | npm i -g yarn 20 | ``` 21 | 22 | ## Installation 23 | 24 | 1. Clone current repository: 25 | 26 | ``` 27 | git clone https://github.com/job-hax/frontend.git 28 | ``` 29 | 30 | 2. Install project dependencies via yarn: 31 | 32 | ``` 33 | yarn install 34 | ``` 35 | 36 | 3. Create config/config.js in src/ if non-existant with the following contents: 37 | 38 | ``` 39 | export const IS_MOCKING = {boolean}; 40 | 41 | export const IS_RECAPTCHA_ENABLED = {boolean}; 42 | 43 | export const googleClientId = '[TODO]'; 44 | 45 | export const jobHaxClientId = '[TODO]'; 46 | 47 | export const jobHaxClientSecret = '[TODO]'; 48 | 49 | export const reCaptchaV3SiteKey = '[TODO]'; 50 | 51 | export const googleApiKey = '[TODO]'; 52 | 53 | export const googleAnalyticsId = '[TODO]'; 54 | 55 | export const linkedInClientId = '[TODO]'; 56 | 57 | export const linkedInClientSecret = '[TODO]'; 58 | 59 | ``` 60 | 61 | 4. Run: 62 | 63 | a) for local development: 64 | ``` 65 | yarn dev 66 | ``` 67 | b) for production build: 68 | ``` 69 | yarn build 70 | ``` 71 | 72 | Note: Starting file: './src/index.js' 73 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import JobDetails from "./BodyComponents/JobDetails.jsx"; 4 | import Contacts from "./BodyComponents/Contacts.jsx"; 5 | import Notes from "./BodyComponents/Notes.jsx"; 6 | import Feedback from "./BodyComponents/Feedback.jsx"; 7 | import Resume from "./BodyComponents/Resume/Resume.jsx"; 8 | import CandidateDetails from "./BodyComponents/CandidateDetails.jsx"; 9 | 10 | class BodyComponents extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | } 14 | 15 | displaySelector() { 16 | switch (this.props.displaying) { 17 | case "Contact": 18 | return ( 19 | 23 | ); 24 | case "Position": 25 | return ( 26 | 32 | ); 33 | case "Resume": 34 | return ( 35 | 40 | ); 41 | case "Feedbacks": 42 | return ( 43 | 49 | ); 50 | case "Notes": 51 | return ( 52 |
53 | 54 |
55 | ); 56 | } 57 | } 58 | 59 | render() { 60 | return
{this.displaySelector()}
; 61 | } 62 | } 63 | 64 | export default BodyComponents; 65 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/NotificationsBox/NotificationsBox.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import defaultLogo from "../../../assets/icons/JobHax-logo-black.svg"; 4 | import { makeTimeBeautiful } from "../../../utils/constants/constants.js"; 5 | 6 | import "./style.scss"; 7 | 8 | class NotificationsBox extends React.Component { 9 | constructor(props) { 10 | super(props); 11 | } 12 | 13 | generateNotifications() { 14 | return this.props.notificationsList.map(notification => ( 15 |
16 |
17 | 18 |
19 |
20 |
21 |
{notification.title}
22 |
23 | {makeTimeBeautiful(notification.created_at, "dateandtime")} 24 |
25 |
26 |
{notification.content}
27 |
28 |
29 | )); 30 | } 31 | 32 | render() { 33 | return ( 34 |
38 |
39 |
Notifications
40 | 44 |
45 | {this.props.notificationsList.length == 0 ? ( 46 |
47 | {" "} 48 | You do not have any notifications at the moment!{" "} 49 |
50 | ) : ( 51 |
52 | {this.generateNotifications()} 53 |
54 | )} 55 |
56 | ); 57 | } 58 | } 59 | 60 | export default NotificationsBox; 61 | -------------------------------------------------------------------------------- /backend/cvparser/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:55 2 | 3 | from django.conf import settings 4 | import django.contrib.postgres.fields 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ('positionapps', '__first__'), 15 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 16 | ] 17 | 18 | operations = [ 19 | migrations.CreateModel( 20 | name='Resume', 21 | fields=[ 22 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 23 | ('contact', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 24 | ('skills', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 25 | ('linkedin', models.CharField(max_length=200)), 26 | ('certifications', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 27 | ('summary', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 28 | ('languages', django.contrib.postgres.fields.ArrayField(base_field=models.TextField(blank=True, null=True), size=None)), 29 | ('school', models.CharField(max_length=200)), 30 | ('degree', models.CharField(max_length=200)), 31 | ('company', models.CharField(max_length=200)), 32 | ('position', models.CharField(max_length=200)), 33 | ('startdate', models.CharField(max_length=200)), 34 | ('enddate', models.CharField(max_length=200)), 35 | ('pos_app', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='positionapps.PositionApplication')), 36 | ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 37 | ], 38 | options={ 39 | 'ordering': ['linkedin'], 40 | }, 41 | ), 42 | ] 43 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/Map/Map.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { compose, withProps } from "recompose"; 3 | import { 4 | withScriptjs, 5 | withGoogleMap, 6 | GoogleMap, 7 | Marker 8 | } from "react-google-maps"; 9 | import MarkerClusterer from "react-google-maps/lib/components/addons/MarkerClusterer"; 10 | 11 | import { googleApiKey } from "../../../../config/config.js"; 12 | 13 | const MapComponent = compose( 14 | withProps({ 15 | googleMapURL: 16 | "https://maps.googleapis.com/maps/api/js?key=" + 17 | googleApiKey + 18 | "&v=3.exp&libraries=geometry,drawing,places", 19 | loadingElement:
, 20 | containerElement:
, 21 | mapElement:
22 | }), 23 | withScriptjs, 24 | withGoogleMap 25 | )(props => ( 26 | 35 | {props.isMarkerShown && ( 36 | 37 | {props.positions.map((location, i) => ( 38 | 39 | ))} 40 | 41 | )} 42 | 43 | )); 44 | 45 | class Map extends React.PureComponent { 46 | constructor(props) { 47 | super(props); 48 | 49 | this.state = { 50 | isMarkerShown: false 51 | }; 52 | 53 | this.handleMarkerClick = this.handleMarkerClick.bind(this); 54 | this.delayedShowMarker = this.delayedShowMarker.bind(this); 55 | } 56 | 57 | componentDidMount() { 58 | this.delayedShowMarker(); 59 | } 60 | 61 | delayedShowMarker() { 62 | setTimeout(() => { 63 | this.setState({ isMarkerShown: false }); 64 | }, 3000); 65 | } 66 | 67 | handleMarkerClick() { 68 | this.setState({ isMarkerShown: false }); 69 | this.delayedShowMarker(); 70 | } 71 | 72 | render() { 73 | return ( 74 | 80 | ); 81 | } 82 | } 83 | 84 | export default Map; 85 | -------------------------------------------------------------------------------- /backend/position/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.1 on 2019-12-21 02:57 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | import django.utils.timezone 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ('utils', '__first__'), 14 | ('company', '0001_initial'), 15 | ] 16 | 17 | operations = [ 18 | migrations.CreateModel( 19 | name='JobPosition', 20 | fields=[ 21 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 | ('job_title', models.CharField(max_length=200)), 23 | ], 24 | options={ 25 | 'ordering': ['job_title'], 26 | }, 27 | ), 28 | migrations.CreateModel( 29 | name='PositionDetail', 30 | fields=[ 31 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 32 | ('responsibilities', models.TextField()), 33 | ('requirements', models.TextField()), 34 | ('department', models.CharField(max_length=200)), 35 | ('job_type', models.CharField(max_length=200)), 36 | ('city', models.CharField(max_length=200)), 37 | ('is_deleted', models.BooleanField(default=False)), 38 | ('created_date', models.DateTimeField(default=django.utils.timezone.now, null=True)), 39 | ('updated_date', models.DateTimeField(default=django.utils.timezone.now, null=True)), 40 | ('company', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='positiondetail_company', to='company.Company')), 41 | ('country', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='utils.Country')), 42 | ('job', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='position.JobPosition')), 43 | ('state', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='utils.State')), 44 | ], 45 | options={ 46 | 'ordering': ['updated_date'], 47 | }, 48 | ), 49 | ] 50 | -------------------------------------------------------------------------------- /frontend/src/utils/constants/endpoints.js: -------------------------------------------------------------------------------- 1 | export const apiRoot = "https://ats-be.jobhax.com"; //"http://10.0.0.75:8000"; "http://0.0.0.0:8001";ot 2 | export const jtsApiRoot = "https://jts-be.jobhax.com"; 3 | 4 | //USER REQUESTS// 5 | export const USERS = type => `${apiRoot}/api/users/${type}/`; 6 | 7 | //POS_APPS REQUESTS// 8 | export const JOB_APPS = `${apiRoot}/api/positionapps/`; 9 | 10 | export const GET_SOURCES = `${apiRoot}/api/positionapps/sources/`; 11 | 12 | export const GET_STATUSES = `${apiRoot}/api/positionapps/statuses/`; 13 | 14 | export const CONTACTS = posappId => `${apiRoot}/api/positionapps/${posappId}/contacts/`; 15 | 16 | export const GET_NEW_JOBAPPS = timestamp => `${apiRoot}/api/positionapps/?timestamp=${timestamp}`; 17 | 18 | export const NOTES = posappId => `${apiRoot}/api/positionapps/${posappId}/notes/`; 19 | 20 | export const POS_FEEDBACKS = posappId => `${apiRoot}/api/positionapps/${posappId}/feedbacks/`; 21 | 22 | //METRICS REQUESTS// 23 | export const METRICS = type => `${apiRoot}/api/metrics/${type}`; 24 | 25 | //COMPANIES REQUESTS// 26 | export const COMPANIES = `${apiRoot}/api/companies/`; 27 | 28 | //ALUMNI REQUESTS// 29 | export const ALUMNI = `${apiRoot}/api/alumni/`; 30 | 31 | //REVIEWS REQUESTS// 32 | export const REVIEWS = `${apiRoot}/api/reviews/`; 33 | 34 | export const SOURCE_TYPES = `${apiRoot}/api/reviews/sourceTypes/`; 35 | 36 | export const EMPLOYMENT_AUTHORIZATIONS = `${apiRoot}/api/reviews/employmentAuthorizations/`; 37 | 38 | //AUTOCOMPLETE REQUEST// 39 | export const AUTOCOMPLETE = type => `${apiRoot}/api/${type}/`; 40 | 41 | //NOTIFICATIONS REQUESTS// 42 | export const NOTIFICATIONS = `${apiRoot}/api/notifications/`; 43 | 44 | //TOKENLESS REQUESTS// 45 | export const FAQS = `${apiRoot}/api/faqs/`; 46 | 47 | export const AGREEMENTS = `${apiRoot}/api/agreements/`; 48 | 49 | export const FEEDBACKS = `${apiRoot}/api/feedbacks/`; 50 | 51 | // COMPANY // 52 | export const COMPANY = id => `${apiRoot}/api/companies/${id}`; 53 | 54 | // COMPANY POSITIONS // 55 | export const COMPANY_POSITIONS = `${apiRoot}/api/positions/company`; 56 | export const GET_COMPANY_POSITIONS = id => `${COMPANY_POSITIONS}?id=${id}`; 57 | 58 | // RESUME PARSER // 59 | export const RESUME_PARSER = id => (id ? `${apiRoot}/api/parser/?id=${id}` : `${apiRoot}/api/parser/`); 60 | export const RESUME_PARSER_METRICS = `${apiRoot}/api/parser/metrics`; 61 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/Graphs/PieChart.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactEchartsCore from "echarts-for-react/lib/core"; 3 | import echarts from "echarts/dist/echarts.min.js"; 4 | 5 | class PieChart extends React.Component { 6 | constructor(props) { 7 | super(props); 8 | } 9 | 10 | chartThemeCreator() { 11 | echarts.registerTheme("pie", { 12 | color: ["#F4EBC1", "#A0C1B8", "#709FB0", "#726A95", "#351F39"], 13 | backgroundColor: "white", 14 | textStyle: { 15 | fontType: "HelveticaNeue", 16 | color: "black" 17 | }, 18 | title: { 19 | textStyle: { 20 | color: "black" 21 | } 22 | } 23 | }); 24 | } 25 | 26 | buildPieChart() { 27 | this.chartThemeCreator(); 28 | return { 29 | title: { 30 | text: this.props.metric.title, 31 | x: "left" 32 | }, 33 | tooltip: { 34 | show: this.props.style.heigth > 180 ? true : false, 35 | trigger: "item", 36 | formatter: "{a}
{b} : {c} ({d}%)" 37 | }, 38 | /*legend: { 39 | orient: "vertical", 40 | left: "right", 41 | data: this.props.metric.legend 42 | },*/ 43 | toolbox: { 44 | show: true, 45 | feature: { 46 | saveAsImage: { 47 | show: true, 48 | title: "save", 49 | iconStyle: { color: "black", emphasis: { color: "black" } } 50 | } 51 | } 52 | }, 53 | series: [ 54 | { 55 | name: "Stages", 56 | type: "pie", 57 | radius: "55%", 58 | center: ["50%", "60%"], 59 | label: { 60 | normal: { show: false } 61 | }, 62 | data: this.props.metric.series, 63 | itemStyle: { 64 | emphasis: { 65 | shadowBlur: 10, 66 | shadowOffsetX: 0, 67 | shadowColor: "rgba(0, 0, 0, 0.5)" 68 | } 69 | } 70 | } 71 | ] 72 | }; 73 | } 74 | 75 | render() { 76 | return ( 77 |
78 |
79 |
80 | 88 |
89 |
90 |
91 | ); 92 | } 93 | } 94 | 95 | export default PieChart; 96 | -------------------------------------------------------------------------------- /frontend/src/components/UserAuth/SignIn/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .sign_in-background { 4 | background-color: white; 5 | height: 16vh; 6 | } 7 | 8 | .sign_in-top { 9 | display: flex; 10 | justify-content: space-between; 11 | padding: 2vh 8vh; 12 | 13 | button { 14 | color: white; 15 | font-size: 12pt; 16 | background-color: rgba(0, 0, 0, 0.2); 17 | border: none; 18 | border-radius: 50px; 19 | padding: 15px 35px; 20 | margin-top: 4vh; 21 | cursor: pointer; 22 | } 23 | 24 | .logo { 25 | width: 90px; 26 | } 27 | } 28 | 29 | 30 | .sign_in-vertical-container { 31 | display: flex; 32 | justify-content: center; 33 | align-items: center; 34 | padding: 100px 0 200px 0; 35 | 36 | .sign_in-form-container { 37 | margin: auto; 38 | width: 320px; 39 | height: fit-content; 40 | border: 1px solid rgba(150, 150, 150, 0.4); 41 | background-color: white; 42 | padding: 24px 24px 0px 24px; 43 | 44 | .content-container { 45 | 46 | h1 { 47 | color: rgb(0, 0, 0); 48 | text-align: center; 49 | } 50 | } 51 | 52 | .social-buttons-container { 53 | margin: 0px 0 12px 0; 54 | display: flex; 55 | justify-content: center; 56 | 57 | .social-buttons-google { 58 | display: flex; 59 | justify-content: center; 60 | width: 288px; 61 | border: none; 62 | padding: none; 63 | background-color: white; 64 | cursor: default; 65 | color: rgb(0, 0, 0); 66 | font-size: 12pt; 67 | 68 | img { 69 | cursor: pointer; 70 | width: 186px; 71 | height: 42px; 72 | } 73 | } 74 | } 75 | 76 | .separator { 77 | font-style: italic; 78 | font-size: 90%; 79 | display: flex; 80 | justify-content: center; 81 | color: rgba(150, 150, 150, 0.8); 82 | 83 | .line { 84 | height: 1px; 85 | width: 92px; 86 | margin: 8px 12px 24px 12px; 87 | background-color: rgba(150, 150, 150, 0.4) 88 | } 89 | } 90 | } 91 | } 92 | 93 | .bottom-fixed-footer { 94 | position: fixed; 95 | bottom: 0%; 96 | width: 100%; 97 | } -------------------------------------------------------------------------------- /backend/utils/social_auth_credentials.py: -------------------------------------------------------------------------------- 1 | # github.com/python-social-auth/social-core/issues/125 2 | from datetime import datetime 3 | 4 | from google.auth.exceptions import RefreshError 5 | from google.oauth2.credentials import Credentials as GoogleCredentials 6 | from requests import exceptions as requests_errors 7 | from social_django.utils import load_strategy 8 | 9 | 10 | class Credentials(GoogleCredentials): 11 | """Google auth credentials using python social auth under the hood""" 12 | 13 | def _parse_expiry(self, data): 14 | """ 15 | Parses the expiry field from a data into a datetime. 16 | 17 | Args: 18 | data (Mapping): extra_data from UserSocialAuth model 19 | Returns: 20 | datetime: The expiration 21 | """ 22 | return datetime.fromtimestamp(data['auth_time'] + data['expires']) 23 | 24 | def __init__(self, usa): 25 | """ 26 | Args: 27 | usa (UserSocialAuth): UserSocialAuth google-oauth2 object 28 | """ 29 | backend = usa.get_backend_instance(load_strategy()) 30 | data = usa.extra_data 31 | token = data['access_token'] 32 | try: 33 | refresh_token = data['refresh_token'] 34 | except: 35 | refresh_token = '' 36 | pass 37 | token_uri = backend.refresh_token_url() 38 | client_id, client_secret = backend.get_key_and_secret() 39 | scopes = backend.get_scope() 40 | # id_token is not provided with GoogleOAuth2 backend 41 | super().__init__( 42 | token, refresh_token=refresh_token, id_token=None, 43 | token_uri=token_uri, client_id=client_id, client_secret=client_secret, 44 | scopes=scopes 45 | ) 46 | self.usa = usa 47 | # Needed for self.expired() check 48 | # self.expiry = self._parse_expiry(data) 49 | 50 | def refresh(self, request): 51 | """Refreshes the access token. 52 | 53 | Args: 54 | request (google.auth.transport.Request): The object used to make 55 | HTTP requests. 56 | 57 | Raises: 58 | google.auth.exceptions.RefreshError: If the credentials could 59 | not be refreshed. 60 | """ 61 | usa = self.usa 62 | try: 63 | usa.refresh_token(load_strategy()) 64 | except requests_errors.HTTPError as e: 65 | raise RefreshError(e) 66 | data = usa.extra_data 67 | self.token = data['access_token'] 68 | self._refresh_token = data['refresh_token'] 69 | # self.expiry = self._parse_expiry(data) 70 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/IndividualMetrics/IndividualMetrics.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import DetailedMetricsGroup from "../Containers/DetailedGroupContainer.jsx"; 4 | import SummaryMetricsGroup from "../Containers/SummaryGroupContainer.jsx"; 5 | import { axiosCaptcha } from "../../../../utils/api/fetch_api.js"; 6 | import { METRICS } from "../../../../utils/constants/endpoints.js"; 7 | 8 | class IndividualMetrics extends React.Component { 9 | constructor(props) { 10 | super(props); 11 | 12 | this.state = { 13 | genericData: [], 14 | detailedData: [], 15 | isInitialRequest: "beforeRequest" 16 | }; 17 | } 18 | 19 | componentDidMount() { 20 | if (this.props.cookie("get", "jobhax_access_token") != ("" || null)) { 21 | this.getData(); 22 | } 23 | } 24 | 25 | getData() { 26 | if ( 27 | this.props.cookie("get", "jobhax_access_token") != ("" || null) && 28 | this.state.isInitialRequest === "beforeRequest" 29 | ) { 30 | this.setState({ isInitialRequest: true }); 31 | let config = { method: "GET" }; 32 | axiosCaptcha(METRICS("personal/generic/"), config).then(response => { 33 | if (response.statusText === "OK") { 34 | if (response.data.success) { 35 | this.data = response.data.data; 36 | this.setState({ 37 | genericData: this.data 38 | }); 39 | } 40 | } 41 | }); 42 | axiosCaptcha(METRICS("personal/detailed/"), config).then(response => { 43 | if (response.statusText === "OK") { 44 | if (response.data.success) { 45 | this.data = response.data.data; 46 | this.setState({ 47 | detailedData: this.data, 48 | isInitialRequest: false 49 | }); 50 | } 51 | } 52 | }); 53 | } 54 | } 55 | 56 | generateDetailedMetricsGroup() { 57 | return ( 58 |
59 |
60 | 64 |
65 |
66 | 70 |
71 |
72 | ); 73 | } 74 | 75 | render() { 76 | return ( 77 |
78 | {this.generateDetailedMetricsGroup()} 79 |
80 | ); 81 | } 82 | } 83 | 84 | export default IndividualMetrics; 85 | -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/Card/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | $cardChangeAnimationTransitionDuration: .5s; 4 | $cardChangeAnimationFromZeroScale: 0.0; 5 | 6 | .card-container { 7 | border-radius: 5px; 8 | margin: 0px 25px 8px 15px; 9 | padding-right: 8px; 10 | height: fit-content; 11 | height: -moz-fit-content; 12 | min-height: fit-content; 13 | min-height: -moz-fit-content; 14 | max-width: auto; 15 | display: flex; 16 | justify-content: start; 17 | background-color: rgb(255, 255, 255); 18 | cursor: pointer; 19 | box-shadow: 1px 1px 5px 1px rgba(0, 0, 0, 0.1); 20 | transition: transform $cardChangeAnimationTransitionDuration; 21 | -webkit-transition: transform $cardChangeAnimationTransitionDuration; 22 | -moz-transition: transform $cardChangeAnimationTransitionDuration; 23 | -o-transition: transform $cardChangeAnimationTransitionDuration; 24 | -ms-transition: transform $cardChangeAnimationTransitionDuration; 25 | 26 | &.--animation-from-zero { 27 | transform: scale($cardChangeAnimationFromZeroScale); 28 | -webkit-transform: scale($cardChangeAnimationFromZeroScale); 29 | -moz-transform: scale($cardChangeAnimationFromZeroScale); 30 | -o-transform: scale($cardChangeAnimationFromZeroScale); 31 | -ms-transform: scale($cardChangeAnimationFromZeroScale); 32 | } 33 | 34 | &.rejected-cards { 35 | opacity: 0.8; 36 | background-color: rgba(252, 252, 252, 0.4); 37 | text-align: left; 38 | } 39 | 40 | &.--is_dragging { 41 | opacity: 0; 42 | } 43 | 44 | .card-company-icon { 45 | margin-top: 15px; 46 | margin-bottom: 15px; 47 | margin-left: 15px; 48 | width: 40px; 49 | height: 40px; 50 | border-radius: 4px; 51 | display: flex; 52 | align-items: center; 53 | 54 | img { 55 | margin: 1px; 56 | width: 38px; 57 | height: auto; 58 | } 59 | } 60 | 61 | .card-company-info { 62 | width: 80%; 63 | margin-left: 10px; 64 | margin-top: 15px; 65 | margin-bottom: 15px; 66 | height: fit-content; 67 | 68 | .card-company-name { 69 | font-size: 14px; 70 | font-weight: 600; 71 | word-break: break-all; 72 | } 73 | 74 | .card-job-position { 75 | font-size: 12px; 76 | font-weight: normal; 77 | color: rgba(94, 94, 94, 0.7); 78 | word-break: break-all; 79 | } 80 | } 81 | 82 | .card-job-details { 83 | position: relative; 84 | right: 9%; 85 | padding-top: 2%; 86 | height: 5px; 87 | width: 0; 88 | font-size: 80%; 89 | cursor: pointer; 90 | 91 | img { 92 | height: 16px; 93 | width: auto; 94 | } 95 | } 96 | } -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalBody/Body/BodyComponents/Feedbacks/Feedbacks.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Rate, Menu, Dropdown, Button, Icon } from "antd"; 3 | 4 | import { makeTimeBeautiful } from "../../../../../../../../utils/constants/constants.js"; 5 | import { axiosCaptcha } from "../../../../../../../../utils/api/fetch_api"; 6 | import { POS_FEEDBACKS } from "../../../../../../../../utils/constants/endpoints.js"; 7 | import { IS_CONSOLE_LOG_OPEN } from "../../../../../../../../utils/constants/constants.js"; 8 | 9 | import "./style.scss"; 10 | 11 | const desc = ["no hire", "weak", "average", "above average", "strong hire"]; 12 | 13 | class Feedbacks extends React.Component { 14 | constructor(props) { 15 | super(props); 16 | 17 | this.state = { 18 | feedbacksList: this.props.feedbacksList 19 | }; 20 | } 21 | 22 | componentDidUpdate() { 23 | if (this.state.feedbacksList != this.props.feedbacksList) { 24 | this.setState({ feedbacksList: this.props.feedbacksList }); 25 | } 26 | } 27 | 28 | mapReviews() { 29 | return this.state.feedbacksList.map(feedback => ( 30 |
31 |
32 |
{feedback.interviewer}
33 |
34 |
35 | {feedback.interview_round}, 36 | {feedback.interview_date && makeTimeBeautiful(feedback.interview_date, "dateandtime")} 37 |
38 |
39 | 40 |
41 |
42 |
43 |
44 |
45 | {feedback.description != null && feedback.description != "" && ( 46 |
47 | 50 |
{feedback.description}
51 |
52 | )} 53 |
54 |
55 |
56 | )); 57 | } 58 | 59 | render() { 60 | IS_CONSOLE_LOG_OPEN && console.log(this.state.feedbacksList); 61 | 62 | return ( 63 |
64 |
{this.mapReviews()}
65 |
66 | ); 67 | } 68 | } 69 | 70 | export default Feedbacks; 71 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/ContactCards/ContactCard.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Modal } from "antd"; 3 | 4 | import ContactCardDetailed from "./ContactCardDetailed.jsx"; 5 | import "./style.scss"; 6 | 7 | class ContactCard extends React.Component { 8 | constructor(props) { 9 | super(props); 10 | 11 | this.state = { 12 | isDetailedModalShowing: false 13 | }; 14 | 15 | this.setDetailedDisplay = this.setDetailedDisplay.bind(this); 16 | } 17 | 18 | setDetailedDisplay(state) { 19 | this.setState({ isDetailedModalShowing: state }); 20 | } 21 | 22 | generateCard() { 23 | const { contact } = this.props; 24 | return ( 25 |
26 |
27 |
28 | 29 |
30 |
31 |
32 | {contact.first_name + " " + contact.last_name} 33 |
34 |
35 | {contact.position && ( 36 |
{contact.position}
37 | )} 38 | {contact.company && ( 39 |
{" at " + contact.company}
40 | )} 41 |
42 |
43 |
44 |
45 | ); 46 | } 47 | 48 | render() { 49 | return ( 50 |
51 |
54 | this.setState({ 55 | isDetailedModalShowing: !this.state.isDetailedModalShowing 56 | }) 57 | } 58 | > 59 | {this.generateCard()} 60 |
61 |
62 | 71 | 80 | 81 |
82 |
83 | ); 84 | } 85 | } 86 | 87 | export default ContactCard; 88 | -------------------------------------------------------------------------------- /frontend/src/components/UserAuth/Action/Action.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import { Redirect } from "react-router-dom"; 3 | 4 | import { axiosCaptcha } from "../../../utils/api/fetch_api"; 5 | import Spinner from "../../Partials/Spinner/Spinner.jsx"; 6 | import ChangePassword from "../ChangePassword/ChangePassword.jsx"; 7 | import { IS_CONSOLE_LOG_OPEN } from "../../../utils/constants/constants"; 8 | import { USERS } from "../../../utils/constants/endpoints"; 9 | 10 | class Action extends React.Component { 11 | constructor(props) { 12 | super(props); 13 | 14 | this.state = { 15 | redirect: "", 16 | code: "" 17 | }; 18 | } 19 | componentDidMount() { 20 | let params = window.location.search.split("&"); 21 | if (params.length < 2) { 22 | this.setState({ redirect: "/home" }); 23 | } else { 24 | if (params[0].split("=")[1] == "redirect") { 25 | this.setState({ 26 | redirect: window.location.search.split("redirect&")[1] 27 | }); 28 | } else { 29 | IS_CONSOLE_LOG_OPEN && console.log(); 30 | const action = params[0].split("=")[1]; 31 | const code = params[1].split("=")[1]; 32 | this.setState({ code: code }); 33 | IS_CONSOLE_LOG_OPEN && 34 | console.log("action : ", action, "\ncode : ", code); 35 | let config = { method: "GET" }; 36 | axiosCaptcha(USERS(action) + "?code=" + code, config).then(response => { 37 | if (response.statusText === "OK") { 38 | if (response.data.success === true) { 39 | if (action === "activate") { 40 | this.setState({ redirect: "/signin" }); 41 | this.props.alert( 42 | 5000, 43 | "success", 44 | "Your account has activated successfully. You can sign in now!" 45 | ); 46 | } else if (action === "validateForgotPassword") { 47 | this.setState({ redirect: "validateForgotPassword" }); 48 | } 49 | } else { 50 | this.props.alert(5000, "error", "Something went wrong!"); 51 | this.setState({ redirect: "/home" }); 52 | } 53 | } else { 54 | this.props.alert(5000, "error", "Something went wrong!"); 55 | } 56 | }); 57 | } 58 | } 59 | } 60 | render() { 61 | if (this.state.redirect === "") { 62 | return ; 63 | } else if (this.state.redirect === "validateForgotPassword") { 64 | return ; 65 | } else { 66 | return ; 67 | } 68 | } 69 | } 70 | 71 | export default Action; 72 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/UniversityMetrics/UniversityMetrics.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import DetailedMetricsGroup from "../Containers/DetailedGroupContainer.jsx"; 4 | import SummaryMetricsGroup from "../Containers/SummaryGroupContainer.jsx"; 5 | import { axiosCaptcha } from "../../../../utils/api/fetch_api.js"; 6 | import { METRICS } from "../../../../utils/constants/endpoints.js"; 7 | 8 | class UniversityMetrics extends React.Component { 9 | constructor(props) { 10 | super(props); 11 | 12 | this.state = { 13 | genericData: [], 14 | detailedData: [], 15 | isInitialRequest: "beforeRequest" 16 | }; 17 | } 18 | 19 | componentDidMount() { 20 | if (this.props.cookie("get", "jobhax_access_token") != ("" || null)) { 21 | this.getData(); 22 | } 23 | } 24 | 25 | getData() { 26 | if ( 27 | this.props.cookie("get", "jobhax_access_token") != ("" || null) && 28 | this.state.isInitialRequest === "beforeRequest" 29 | ) { 30 | this.setState({ isInitialRequest: true }); 31 | let config = { method: "GET" }; 32 | axiosCaptcha( 33 | METRICS("aggregated/generic/?public=" + this.props.isPublic), 34 | config 35 | ).then(response => { 36 | if (response.statusText === "OK") { 37 | if (response.data.success) { 38 | this.data = response.data.data; 39 | this.setState({ 40 | genericData: this.data 41 | }); 42 | } 43 | } 44 | }); 45 | axiosCaptcha( 46 | METRICS("aggregated/detailed/?public=" + this.props.isPublic), 47 | config 48 | ).then(response => { 49 | if (response.statusText === "OK") { 50 | if (response.data.success) { 51 | this.data = response.data.data; 52 | this.setState({ 53 | detailedData: this.data, 54 | isInitialRequest: false 55 | }); 56 | } 57 | } 58 | }); 59 | } 60 | } 61 | 62 | generateDetailedMetricsGroup() { 63 | return ( 64 |
65 |
66 | 70 |
71 |
72 | 76 |
77 |
78 | ); 79 | } 80 | 81 | render() { 82 | return ( 83 |
84 | {this.generateDetailedMetricsGroup()} 85 |
86 | ); 87 | } 88 | } 89 | 90 | export default UniversityMetrics; 91 | -------------------------------------------------------------------------------- /backend/utils/gmail_utils.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from dateutil import tz 4 | 5 | 6 | def remove_html_tags(string): 7 | string = string.replace('\\r', '') 8 | string = string.replace('\\t', '') 9 | string = string.replace('\\n', '') 10 | string = string.replace('
', '') 11 | return string 12 | 13 | 14 | def convert_time(base): 15 | # METHOD 2: Auto-detect zones: 16 | from_zone = tz.tzutc() 17 | to_zone = tz.tzlocal() 18 | 19 | # utc = datetime.utcnow() 20 | # utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S') 21 | base = base[:25].strip() 22 | utc = datetime.strptime(base, '%a, %d %b %Y %H:%M:%S') 23 | # Mon, 1 Oct 2018 22:35:03 +0000 (UTC) 24 | 25 | # Tell the datetime object that it's in UTC time zone since 26 | # datetime objects are 'naive' by default 27 | utc = utc.replace(tzinfo=from_zone) 28 | 29 | # Convert time zone 30 | central = utc.astimezone(to_zone) 31 | return central 32 | # return central.strftime('%Y-%m-%d') 33 | # return central.strftime('%a, %d %b %Y %H:%M:%S %z') 34 | 35 | 36 | def find_nth(string, substring, n): 37 | try: 38 | if (n == 1): 39 | return string.find(substring) 40 | else: 41 | return string.find(substring, find_nth(string, substring, n - 1) + 1) 42 | except: 43 | return -1 44 | 45 | 46 | def unicode_to_ascii(text): 47 | TEXT = (text. 48 | replace('\\xe2\\x80\\x99', "'"). 49 | replace('\\xc3\\xa9', 'e'). 50 | replace('\\xe2\\x80\\x90', '-'). 51 | replace('\\xe2\\x80\\x91', '-'). 52 | replace('\\xe2\\x80\\x92', '-'). 53 | replace('\\xe2\\x80\\x93', '-'). 54 | replace('\\xe2\\x80\\x94', '-'). 55 | replace('\\xe2\\x80\\x94', '-'). 56 | replace('\\xe2\\x80\\x98', "'"). 57 | replace('\\xe2\\x80\\x9b', "'"). 58 | replace('\\xe2\\x80\\x9c', '"'). 59 | replace('\\xe2\\x80\\x9c', '"'). 60 | replace('\\xe2\\x80\\x9d', '"'). 61 | replace('\\xe2\\x80\\x9e', '"'). 62 | replace('\\xe2\\x80\\x9f', '"'). 63 | replace('\\xe2\\x80\\xa6', '...'). # 64 | replace('\\xe2\\x80\\xb2', "'"). 65 | replace('\\xe2\\x80\\xb3', "'"). 66 | replace('\\xe2\\x80\\xb4', "'"). 67 | replace('\\xe2\\x80\\xb5', "'"). 68 | replace('\\xe2\\x80\\xb6', "'"). 69 | replace('\\xe2\\x80\\xb7', "'"). 70 | replace('\\xe2\\x81\\xba', "+"). 71 | replace('\\xe2\\x81\\xbb', "-"). 72 | replace('\\xe2\\x81\\xbc', "="). 73 | replace('\\xe2\\x81\\xbd', "("). 74 | replace('\\xe2\\x81\\xbe', ")") 75 | 76 | ) 77 | return TEXT 78 | -------------------------------------------------------------------------------- /frontend/src/components/Partials/FeedBack/style.scss: -------------------------------------------------------------------------------- 1 | @import "../../App/style.scss"; 2 | 3 | .feedback-container { 4 | color: $text_color; 5 | position: fixed; 6 | z-index: 21; 7 | 8 | .feedback-open-button { 9 | position: fixed; 10 | bottom: 16px; 11 | right: 16px; 12 | background-color: #595959; 13 | color: white; 14 | height: 48px; 15 | width: 48px; 16 | border-radius: 24px; 17 | z-index: 21; 18 | display: flex; 19 | align-items: center; 20 | justify-content: center; 21 | cursor: pointer; 22 | 23 | img { 24 | height: 24px; 25 | width: auto; 26 | } 27 | 28 | &.shake { 29 | animation: shake 0.5s; 30 | animation-iteration-count: infinite; 31 | background-color: $soft_button_color; 32 | } 33 | 34 | @keyframes shake { 35 | 0% { 36 | transform: translate(1px, 1px) rotate(0deg); 37 | } 38 | 39 | 10% { 40 | transform: translate(-1px, -2px) rotate(-1deg); 41 | } 42 | 43 | 20% { 44 | transform: translate(-3px, 0px) rotate(1deg); 45 | } 46 | 47 | 30% { 48 | transform: translate(3px, 2px) rotate(0deg); 49 | } 50 | 51 | 40% { 52 | transform: translate(1px, -1px) rotate(1deg); 53 | } 54 | 55 | 50% { 56 | transform: translate(-1px, 2px) rotate(-1deg); 57 | } 58 | 59 | 60% { 60 | transform: translate(-3px, 1px) rotate(0deg); 61 | } 62 | 63 | 70% { 64 | transform: translate(3px, 1px) rotate(-1deg); 65 | } 66 | 67 | 80% { 68 | transform: translate(-1px, -1px) rotate(1deg); 69 | } 70 | 71 | 90% { 72 | transform: translate(1px, 2px) rotate(0deg); 73 | } 74 | 75 | 100% { 76 | transform: translate(1px, -2px) rotate(-1deg); 77 | } 78 | } 79 | } 80 | 81 | 82 | .question { 83 | 84 | .question-label { 85 | margin-top: 16px; 86 | } 87 | 88 | .text-box { 89 | font-family: exo; 90 | font-size: 90%; 91 | height: 160px; 92 | max-width: 256px; 93 | max-height: 200px; 94 | min-width: 256px; 95 | min-height: 120px; 96 | border: 1px solid $primary_button_color; 97 | border-radius: 4px; 98 | padding: 8px; 99 | } 100 | } 101 | 102 | 103 | } -------------------------------------------------------------------------------- /frontend/src/components/Dashboard/CardModal/SubComponents/ModalHeader/ModalHeader.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import defaultLogo from "../../../../../assets/icons/JobHax-logo-black.svg"; 4 | import MoveOptions from "./MoveOptions.jsx"; 5 | 6 | class ModalHeader extends React.Component { 7 | constructor(props) { 8 | super(props); 9 | 10 | this.state = { 11 | updateHeader: this.props.updateHeader, 12 | card: this.props.card, 13 | companyLogoError: false 14 | }; 15 | } 16 | 17 | componentDidUpdate() { 18 | this.state.updateHeader && 19 | this.setState({ 20 | card: this.props.card, 21 | updateHeader: !this.props.updateHeader 22 | }); 23 | } 24 | 25 | generateModalHeader() { 26 | const { card } = this.state; 27 | return ( 28 |
29 |
30 |
31 |
32 | {card.company_object.cb_company_logo == null || 33 | this.state.companyLogoError ? ( 34 | 35 | ) : ( 36 | this.setState({ companyLogoError: true })} 38 | src={card.company_object.cb_company_logo} 39 | /> 40 | )} 41 |
42 |
43 | {card.company_object && ( 44 |
45 | {card.first_name + " " + card.last_name} 46 |
47 | )} 48 | {card.position && ( 49 |
50 | { 51 | card.position.job 52 | .split(",")[0] 53 | .split("-")[0] 54 | .split("(")[0] 55 | } 56 |
57 | )} 58 |
59 |
60 | 71 |
72 |
73 | ); 74 | } 75 | 76 | render() { 77 | return
{this.generateModalHeader()}
; 78 | } 79 | } 80 | 81 | export default ModalHeader; 82 | -------------------------------------------------------------------------------- /frontend/src/components/Metrics/SubComponents/Containers/SummarySingleContainer.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import LineGraph from "../Graphs/LineGraph.jsx"; 4 | import PieChart from "../Graphs/PieChart.jsx"; 5 | import BarGraph from "../Graphs/BarGraph.jsx"; 6 | 7 | class SummaryMetricSingle extends React.Component { 8 | constructor(props) { 9 | super(props); 10 | } 11 | 12 | graphSelector() { 13 | const style = { 14 | height: "160px", 15 | width: "120px", 16 | margin: "0 10px 10px 10px" 17 | }; 18 | switch (this.props.metric.graph.type) { 19 | case "line": 20 | return ; 21 | case "pie": 22 | return ; 23 | case "bar": 24 | return ; 25 | } 26 | } 27 | 28 | render() { 29 | return ( 30 |
31 |
32 |
40 |
41 | {this.graphSelector()} 42 |
43 |
44 |
52 | {this.props.metric.value} 53 |
54 |
61 | {this.props.metric.title} 62 |
63 |
64 |
65 |
71 | 80 |
81 |
84 | {this.props.metric.description} 85 |
86 |
87 |
88 | ); 89 | } 90 | } 91 | 92 | export default SummaryMetricSingle; 93 | -------------------------------------------------------------------------------- /backend/company/utils.py: -------------------------------------------------------------------------------- 1 | from company.models import Company 2 | from utils.clearbit_company_checker import get_company_detail 3 | import os 4 | import uuid 5 | from django.core.files import File 6 | from urllib.request import urlretrieve 7 | from urllib.error import HTTPError 8 | from background_task import background 9 | 10 | 11 | def get_or_create_company(name): 12 | cd = get_company_detail(name) 13 | if cd is None: 14 | company_title = name 15 | else: 16 | company_title = cd['name'] 17 | jc = Company.objects.all().filter(company__iexact=company_title) 18 | if jc.count() == 0: 19 | # if company doesnt exist save it 20 | if cd is None: 21 | jc = Company(company=name, domain=None) 22 | else: 23 | jc = Company(company=cd['name'], domain=cd['domain']) 24 | jc.save() 25 | if 'logo' in cd and cd['logo'] is not None and cd['logo'] is not '': 26 | try: 27 | urlretrieve(cd['logo'], filename=cd['logo'].split('/')[-1]) 28 | file = open(cd['logo'].split('/')[-1], 'rb') 29 | filename = "%s.%s" % (uuid.uuid4(), 'jpg') 30 | jc.logo.save(filename, File(file), save=True) 31 | jc.save() 32 | os.remove(cd['logo'].split('/')[-1]) 33 | except FileNotFoundError as err: 34 | pass # something wrong with local path 35 | except HTTPError as err: 36 | pass # something wrong with url 37 | jc.save() 38 | else: 39 | jc = jc[0] 40 | if jc.location_address is None: 41 | fetch_company_location(name) 42 | return jc 43 | 44 | 45 | @background(schedule=3) 46 | def fetch_company_location(query): 47 | url = "https://maps.googleapis.com/maps/api/place/textsearch/json?" 48 | api_key = os.environ.get('JOBHAX_BACKEND_MAPS_API_KEY', '') 49 | if api_key is not '': 50 | log('Looking location of ' + query, 'e') 51 | if query is not None: 52 | r = requests.get(url + 'query=' + query + 53 | '&key=' + api_key) 54 | x = r.json() 55 | y = x['results'] 56 | for i in range(len(y)): 57 | place = y[i] 58 | if 'establishment' in place['types']: 59 | lat = place['geometry']['location']['lat'] 60 | lng = place['geometry']['location']['lng'] 61 | formatted_address = place['formatted_address'] 62 | company = Company.objects.get(company=query) 63 | company.location_lat = lat 64 | company.location_lon = lng 65 | company.location_address = formatted_address 66 | company.save() 67 | break 68 | --------------------------------------------------------------------------------