diff --git a/core/views/sso_login.py b/core/views/sso_login.py index e78e87a03da099fbe164b8b4e6c82a04808c8fa3..55d6a00f66ebb7a787b48bdfd10d3aa73de2999a 100755 --- a/core/views/sso_login.py +++ b/core/views/sso_login.py @@ -1,50 +1,43 @@ import requests from django.conf import settings +import views_constants def get_access_token(username, password): try: - url = "https://akun.cs.ui.ac.id/oauth/token/" + url = views_constants.URL_AKUN_CS_UI - payload = "username=" + username + "&password=" + password + "&grant_type=password" + payload = views_constants.PARAM_USERNAME + username + "&" + views_constants.PARAM_PASSWORD + password + "&" + \ + views_constants.PARAM_GRANT_TYPE + views_constants.PASSWORD headers = { - 'authorization': "Basic WDN6TmtGbWVwa2RBNDdBU05NRFpSWDNaOWdxU1UxTHd5d3U1V2VwRzpCRVFXQW43RDl6a2k3NEZ0bkNpWVhIRk50Ymg3eXlNWmFuNnlvMU1uaUdSVWNGWnhkQnBobUU5TUxuVHZiTTEzM1dsUnBwTHJoTXBkYktqTjBxcU9OaHlTNGl2Z0doczB0OVhlQ3M0Ym1JeUJLMldwbnZYTXE4VU5yTEFEMDNZeA==", - 'cache-control': "no-cache", - 'content-type': "application/x-www-form-urlencoded" + 'authorization': views_constants.HEADER_AUTH, + 'cache-control': views_constants.HEADER_NO_CACHE, + 'content-type': views_constants.HEADER_CONTENT_TYPE } - response = requests.request("POST", url, data=payload, headers=headers) + response = requests.request(views_constants.METHOD_POST, url, data=payload, headers=headers) - return response.json()["access_token"] + return response.json()[views_constants.ACCESS_TOKEN] except Exception as e: return None def get_client_id(): - client_id = 'X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG' - return client_id + return views_constants.CLIENT_ID_VALUE def verify_user(access_token): - print ("#get identity number") - parameters = {"access_token": access_token, "client_id": get_client_id()} + parameters = {views_constants.ACCESS_TOKEN: access_token, views_constants.CLIENT_ID: get_client_id()} response = requests.get(settings.API_VERIFY_USER, params=parameters) - print ("response => ", response.json()) return response.json() def get_summary_user(access_token, npm): - print ("#get summary user => ", npm) - parameters = {"access_token": access_token, "client_id": get_client_id()} + parameters = {views_constants.ACCESS_TOKEN: access_token, views_constants.CLIENT_ID: get_client_id()} response = requests.get(settings.API_MAHASISWA + str(npm), params=parameters) - print ("response => ", response.text) - print ("response => ", response.json()) return response.json() def get_riwayat_user(access_token, npm): - print ("#get riwayat user => ", npm) - parameters = {"access_token": access_token, "client_id": get_client_id()} + parameters = {views_constants.ACCESS_TOKEN: access_token, views_constants.CLIENT_ID: get_client_id()} response = requests.get(settings.API_RIWAYAT_MAHASISWA.format(npm=npm), params=parameters) - print ("response => ", response.text) - print ("response => ", response.json()) return response.json() diff --git a/core/views/vacancies.py b/core/views/vacancies.py index bbbbe958ad3f35ec855385ebcb8669122622a013..d71124449ade8feea4bad79502e3f18a9b867c03 100644 --- a/core/views/vacancies.py +++ b/core/views/vacancies.py @@ -9,6 +9,7 @@ from rest_framework.generics import get_object_or_404 from rest_framework.pagination import PageNumberPagination from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response +import views_constants from core.lib.mixins import MultiSerializerViewSetMixin from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany, IsAdminOrVacancyOwner, AsAdminOrSupervisor, \ @@ -23,16 +24,19 @@ from core.views.accounts import StudentViewSet def date_validator(open_time, close_time): if open_time < str(datetime.today()): - return {'is_valid': False, 'error': 'Waktu buka lowongan harus lebih dari hari ini!', - 'status': status.HTTP_400_BAD_REQUEST} + return {views_constants.IS_VALID: False, + views_constants.ERROR: views_constants.ERROR_OPEN_TIME_GREATER_THAN_CURRENT_TIME, + views_constants.STATUS: status.HTTP_400_BAD_REQUEST} elif close_time < open_time: - return {'is_valid': False, 'error': 'Waktu tutup lowongan harus lebih dari waktu buka lowongan!', - 'status': status.HTTP_400_BAD_REQUEST} + return {views_constants.IS_VALID: False, + views_constants.ERROR: views_constants.ERROR_OPEN_TIME_GREATER_THAN_CLOSE_TIME, + views_constants.STATUS: status.HTTP_400_BAD_REQUEST} elif close_time == open_time: - return {'is_valid': False, 'error': 'Waktu tutup dan buka lowongan tidak boleh sama!', - 'status': status.HTTP_400_BAD_REQUEST} + return {views_constants.IS_VALID: False, + views_constants.ERROR: views_constants.ERROR_OPEN_TIME_EQUALS_CLOSE_TIME, + views_constants.STATUS: status.HTTP_400_BAD_REQUEST} else: - return {'is_valid': True, 'error': '', 'status': status.HTTP_200_OK} + return {views_constants.IS_VALID: True, views_constants.ERROR: '', views_constants.STATUS: status.HTTP_200_OK} class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): @@ -42,19 +46,21 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): pagination_class = PageNumberPagination def get_permissions(self): - if self.action in ["retrieve", "list"]: + if self.action in [views_constants.ACTION_RETRIEVE, views_constants.ACTION_LIST]: return [IsAuthenticated()] return super(VacancyViewSet, self).get_permissions() def list(self, request, *args, **kwargs): - search = request.query_params['search'] if 'search' in request.query_params else None - verified = request.query_params['verified'] if 'verified' in request.query_params else "True" - order_by = request.GET.get('sort', None) - order = request.GET.get('order', 'ascending') + search = request.query_params[views_constants.SEARCH] \ + if views_constants.SEARCH in request.query_params else None + verified = request.query_params[views_constants.VERIFIED] \ + if views_constants.VERIFIED in request.query_params else "True" + order_by = request.GET.get(views_constants.SORT, None) + order = request.GET.get(views_constants.ORDERING, views_constants.ORDER_ASCENDING) - opened_only = str(request.query_params['opened_only']) \ - if 'opened_only' in request.query_params else "False" - companies = [int(x) for x in request.query_params.getlist('company', [])] + opened_only = str(request.query_params[views_constants.OPENED_ONLY]) \ + if views_constants.OPENED_ONLY in request.query_params else "False" + companies = [int(x) for x in request.query_params.getlist(views_constants.COMPANY, [])] if search is not None: vacancies = Vacancy.objects.filter(Q(name__icontains=search) | Q(company__user__username__icontains=search)) @@ -71,9 +77,10 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): print(vacancies) print(request) if page is not None: - return self.get_paginated_response(VacancySerializer(page, many=True, context={'request': request}).data) + return self.get_paginated_response( + VacancySerializer(page, many=True, context={views_constants.REQUEST: request}).data) vacancies = Vacancy.objects.all() - return Response(VacancySerializer(vacancies, many=True, context={'request': request}).data) + return Response(VacancySerializer(vacancies, many=True, context={views_constants.REQUEST: request}).data) def verifiedFilter(self, vacancies, flag): if flag.lower() in ("yes", "true", "t", "1"): @@ -94,9 +101,10 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): return vacancies def sort(self, order_by, vacancies, order): - if (order_by is not None) and (order_by in ['name', 'salary']) and (order in ['ascending', 'descending']): + if (order_by is not None) and (order_by in [views_constants.NAME, views_constants.SALARY]) and ( + order in [views_constants.ORDER_ASCENDING, views_constants.ORDER_DESCENDING]): order_query = "" - if order == 'descending': + if order == views_constants.ORDER_DESCENDING: order_query = "-" return vacancies.order_by('{}{}'.format(order_query, order_by)) return vacancies @@ -104,86 +112,84 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): def name_position_validator(self, names): for name in names.split(" "): if not name.isalpha(): - raise ValidationError("Name must alphabets only") + raise ValidationError(views_constants.ERROR_NAME_MUST_ALPHABET) return name def salary_validator(self, salary): try: int(salary) except: - raise ValidationError("Salary must number only") + raise ValidationError(views_constants.ERROR_SALARY_MUST_NUMBER) def amount_validator(self, amount): try: int(amount) except: - raise ValidationError("Amount must number only") + raise ValidationError(views_constants.ERROR_AMOUNT_MUST_NUMBER) def responsibilities_validator(self, responsibilities): if not isinstance(responsibilities, basestring): - raise ValidationError("Responsibilities must be string") + raise ValidationError(views_constants.ERROR_RESPONSIBILITIES_MUST_STRING) def recruiter_activity_validator(self, recruiter_activity): enum_recruiter_activity = ['Selalu', 'Sering', 'Kadang', 'Jarang', 'Tidak Pernah'] if (not isinstance(recruiter_activity, basestring)) or (recruiter_activity not in enum_recruiter_activity): - raise ValidationError('Tingkat Respons Perekrut harus salah ' - 'satu dari Selalu, Sering, Kadang, ' - 'Jarang, dan Tidak Pernah!') + raise ValidationError(views_constants.ERROR_INVALID_RECRUITER_RESPONSE) def date_range_validator(self, open_time, close_time): validity = date_validator(open_time, close_time) - if not validity['is_valid']: - raise ValidationError(validity['error']) + if not validity[views_constants.IS_VALID]: + raise ValidationError(validity[views_constants.ERROR]) def __get_company(self, company_id): company_set = Company.objects.filter(id=company_id) if len(company_set) == 0: - raise ValidationError('No company exists with that ID') + raise ValidationError(views_constants.ERROR_COMPANY_DOES_NOT_EXIST) return company_set[0] def __parse_vacancy_data(self, raw_data): data = { - "open_time": raw_data['open_time'], - "close_time": raw_data['close_time'], - "name": raw_data['name'], - "salary": raw_data.get('salary', 0), - "tag": raw_data.get('tag', ''), - "requirements": raw_data.get('requirements', ''), - "responsibilities": raw_data.get('responsibilities', ''), - "benefits": raw_data.get('benefits', ''), - "amount": raw_data.get('amount', 0), - "recruiter_activity": raw_data.get('recruiter_activity', ''), - "description": raw_data['description'], - "working_period": raw_data['working_period'], - "max_accepted_applicants": raw_data['max_accepted_applicants'] + views_constants.OPEN_TIME: raw_data[views_constants.OPEN_TIME], + views_constants.CLOSE_TIME: raw_data[views_constants.CLOSE_TIME], + views_constants.NAME: raw_data[views_constants.NAME], + views_constants.SALARY: raw_data.get(views_constants.SALARY, 0), + views_constants.TAG: raw_data.get(views_constants.TAG, ''), + views_constants.REQUIREMENTS: raw_data.get(views_constants.REQUIREMENTS, ''), + views_constants.RESPONSIBILITIES: raw_data.get(views_constants.RESPONSIBILITIES, ''), + views_constants.BENEFITS: raw_data.get(views_constants.BENEFITS, ''), + views_constants.AMOUNT: raw_data.get(views_constants.AMOUNT, 0), + views_constants.RECRUITER_ACTIVITY: raw_data.get(views_constants.RECRUITER_ACTIVITY, ''), + views_constants.DESCRIPTION: raw_data[views_constants.DESCRIPTION], + views_constants.WORKING_PERIOD: raw_data[views_constants.WORKING_PERIOD], + views_constants.MAX_ACCEPTED_APPLICANTS: raw_data[views_constants.MAX_ACCEPTED_APPLICANTS] } return data def __validate_vacancy_data(self, data): - self.date_range_validator(data['open_time'], data['close_time']) - self.name_position_validator(data['name']) - self.salary_validator(data['salary']) - if data.get('amount'): - self.amount_validator(data['amount']) - if data.get('responsibilities'): - self.responsibilities_validator(data['responsibilities']) - if data.get('recruiter_activity'): - self.recruiter_activity_validator(data['recruiter_activity']) + self.date_range_validator(data[views_constants.OPEN_TIME], data[views_constants.CLOSE_TIME]) + self.name_position_validator(data[views_constants.NAME]) + self.salary_validator(data[views_constants.SALARY]) + if data.get(views_constants.AMOUNT): + self.amount_validator(data[views_constants.AMOUNT]) + if data.get(views_constants.RESPONSIBILITIES): + self.responsibilities_validator(data[views_constants.RESPONSIBILITIES]) + if data.get(views_constants.RECRUITER_ACTIVITY): + self.recruiter_activity_validator(data[views_constants.RECRUITER_ACTIVITY]) def create(self, request): print("[LOG] data: " + str(request.data)) try: data = self.__parse_vacancy_data(request.data) - data['company'] = self.__get_company(request.data['company']) + data[views_constants.COMPANY] = self.__get_company(request.data[views_constants.COMPANY]) self.__validate_vacancy_data(data) vacancy = Vacancy(**data) vacancy.save() except ValidationError as e: print("[LOG] error: " + str(e)) - return Response({"error": str(e.detail[0])}, status=status.HTTP_400_BAD_REQUEST) + return Response({views_constants.ERROR: str(e.detail[0])}, status=status.HTTP_400_BAD_REQUEST) except ValueError as e: print("[LOG] error: " + str(e)) - return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST) + return Response({views_constants.ERROR: str(e)}, status=status.HTTP_400_BAD_REQUEST) return Response(status=status.HTTP_200_OK) def partial_update(self, request, pk): @@ -197,7 +203,7 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): vacancy.save() except ValidationError as e: print("[LOG] error: " + str(e)) - return Response({"error": str(e.detail[0])}, status=status.HTTP_400_BAD_REQUEST) + return Response({views_constants.ERROR: str(e.detail[0])}, status=status.HTTP_400_BAD_REQUEST) return Response(status=status.HTTP_200_OK) @detail_route(permission_classes=[IsAdminOrCompany]) @@ -205,9 +211,9 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): vacancy = self.get_object() count = Application.objects.filter(vacancy=vacancy).count() count_new = Application.objects.filter(vacancy=vacancy, status=Application.NEW).count() - return Response({"count": count, "count_new": count_new}, status=status.HTTP_200_OK) + return Response({views_constants.COUNT: count, views_constants.COUNT_NEW: count_new}, status=status.HTTP_200_OK) - @detail_route(methods=['patch'], permission_classes=[VacancyApprovalPermission], + @detail_route(methods=[views_constants.METHOD_PATCH], permission_classes=[VacancyApprovalPermission], serializer_class=VacancyVerifiedSerializer) def verify(self, request, pk=None): vacancy = self.get_object() @@ -215,49 +221,49 @@ class VacancyViewSet(MultiSerializerViewSetMixin, viewsets.ModelViewSet): if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) - return Response({"error": "bad request"}, status=status.HTTP_400_BAD_REQUEST) + return Response({views_constants.ERROR: views_constants.ERROR_BAD_REQUEST}, status=status.HTTP_400_BAD_REQUEST) class ApplicationViewSet(MultiSerializerViewSetMixin, viewsets.GenericViewSet): queryset = Application.objects.all() serializer_class = ApplicationSerializer serializer_action_classes = { - 'update': ApplicationStatusSerializer, - 'partial_update': ApplicationStatusSerializer, - 'list': SupervisorStudentApplicationSerializer + views_constants.ACTION_UPDATE: ApplicationStatusSerializer, + views_constants.ACTION_PARTIAL_UPDATE: ApplicationStatusSerializer, + views_constants.ACTION_LIST: SupervisorStudentApplicationSerializer } permission_classes = [IsAdminOrVacancyOwner] pagination_class = PageNumberPagination def list(self, request): - applications = Application.objects.order_by('student') + applications = Application.objects.order_by(views_constants.ORDER_STUDENT) page = self.paginate_queryset(applications) serializer = self.get_serializer_class() if page is not None: return self.get_paginated_response( - serializer(applications, many=True, context={'request': request}).data) - return Response(serializer(applications, many=True, context={'request': request}).data) + serializer(applications, many=True, context={views_constants.REQUEST: request}).data) + return Response(serializer(applications, many=True, context={views_constants.REQUEST: request}).data) - @detail_route(methods=['get'], permission_classes=[IsAdminOrStudent]) + @detail_route(methods=[views_constants.METHOD_GET], permission_classes=[IsAdminOrStudent]) def count(self, request, pk=None): count = Application.objects.filter(vacancy_id=pk).count() - return Response({"count": count}, status=status.HTTP_200_OK) + return Response({views_constants.COUNT: count}, status=status.HTTP_200_OK) def partial_update(self, request, pk=None): application = self.get_object() serializer = self.get_serializer_class()(application, data=request.data, partial=True) if serializer.is_valid(): serializer.save() - if request.data['status'] == 3: - if request.data['reason'] == "" or request.data['reason'] == " ": + if request.data[views_constants.STATUS] == 3: + if request.data[views_constants.REASON] == "" or request.data[views_constants.REASON] == " ": ReasonRejected.objects.create(application=application) else: - ReasonRejected.objects.create(application=application, reason=request.data['reason']) + ReasonRejected.objects.create(application=application, reason=request.data[views_constants.REASON]) return Response(serializer.data, status=status.HTTP_202_ACCEPTED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - @detail_route(methods=['get'], permission_classes=[IsAdminOrVacancyOwner]) + @detail_route(methods=[views_constants.METHOD_GET], permission_classes=[IsAdminOrVacancyOwner]) def transcript(self, request, pk): """ Get student's academic transcript on application {application_id} @@ -267,7 +273,7 @@ class ApplicationViewSet(MultiSerializerViewSetMixin, viewsets.GenericViewSet): return StudentViewSet.transcript(StudentViewSet(), request, application.student.pk) def get_permissions(self): - if self.action == "list": + if self.action == views_constants.ACTION_LIST: return [AsAdminOrSupervisor()] return super(ApplicationViewSet, self).get_permissions() @@ -283,8 +289,8 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): --- """ student = get_object_or_404(Student.objects.all(), pk=student_id) - vacancy_ids = Application.objects.filter(student=student).values('vacancy') - search = request.query_params['search'] if 'search' in request.query_params else None + vacancy_ids = Application.objects.filter(student=student).values(views_constants.VACANCY) + search = request.query_params[views_constants.SEARCH] if views_constants.SEARCH in request.query_params else None if search is not None: vacancies = Vacancy.objects.filter( Q(id__in=vacancy_ids) & (Q(name__icontains=search) | Q(company__user__username__icontains=search))) @@ -292,8 +298,8 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): vacancies = Vacancy.objects.filter(id__in=vacancy_ids) page = self.paginate_queryset(vacancies) if page is not None: - return self.get_paginated_response(VacancySerializer(page, many=True, context={'request': request}).data) - return Response(VacancySerializer(vacancies, many=True, context={'request': request}).data) + return self.get_paginated_response(VacancySerializer(page, many=True, context={views_constants.REQUEST: request}).data) + return Response(VacancySerializer(vacancies, many=True, context={views_constants.REQUEST: request}).data) def create(self, request, student_id): """ @@ -306,17 +312,17 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): type: string paramType: body """ - cover_letter = request.data.get('cover_letter') - vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get('vacancy_id')) + cover_letter = request.data.get(views_constants.COVER_LETTER) + vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get(views_constants.VACANCY_ID)) if vacancy.close_time < timezone.now(): - return Response({"error": "vacancy is closed"}, \ + return Response({views_constants.ERROR: views_constants.ERROR_VACANCY_CLOSED}, status=status.HTTP_400_BAD_REQUEST) student = get_object_or_404(Student.objects.all(), pk=student_id) if Application.objects.filter(vacancy=vacancy, student=student).exists(): - raise ValidationError("You have already applied for the vacancy") + raise ValidationError(views_constants.ERROR_VACANCY_ALREADY_APPLIED) application = Application(vacancy=vacancy, student=student, cover_letter=cover_letter) application.save() - return Response(ApplicationSerializer(application, context={'request': request}).data) + return Response(ApplicationSerializer(application, context={views_constants.REQUEST: request}).data) def destroy(self, request, student_id, pk): """ @@ -327,9 +333,9 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): student = get_object_or_404(Student.objects.all(), pk=student_id) application = get_object_or_404(Application.objects.all(), student=student, vacancy=vacancy) application.delete() - return Response(ApplicationSerializer(application, context={'request': request}).data) + return Response(ApplicationSerializer(application, context={views_constants.REQUEST: request}).data) - @detail_route(methods=['get'], permission_classes=[IsAdminOrStudent]) + @detail_route(methods=[views_constants.METHOD_GET], permission_classes=[IsAdminOrStudent]) def reason(self, request, student_id, pk): """ Get the reason for rejection of application {id} for student {student_id} @@ -340,7 +346,7 @@ class StudentApplicationViewSet(viewsets.GenericViewSet): application = get_object_or_404(Application.objects.all(), student=student, vacancy=vacancy) reason_rejected = get_object_or_404(ReasonRejected.objects.all(), application=application) print(reason_rejected.reason) - return Response({"reason": reason_rejected.reason}, status=status.HTTP_200_OK) + return Response({views_constants.REASON: reason_rejected.reason}, status=status.HTTP_200_OK) class StatusError(Exception): @@ -368,12 +374,12 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): applications = self.__filter_application_list_by_status(request, applications) return self.__get_paginated_application_list(request, applications) except UnauthorizeError: - return Response({"error": "forbidden"}, status=status.HTTP_403_FORBIDDEN) + return Response({views_constants.ERROR: views_constants.ERROR_FORBIDDEN}, status=status.HTTP_403_FORBIDDEN) except (StatusError, ValueError): - return Response({"error": "status must be an integer between 0 and 4"}, \ + return Response({views_constants.ERROR: views_constants.ERROR_INVALID_STATUS_CODE}, status=status.HTTP_400_BAD_REQUEST) - @detail_route(methods=["get"]) + @detail_route(methods=[views_constants.METHOD_GET]) def by_vacancy(self, request, company_id, pk=None): """ Get list of company {company_id}'s applications by vacancy {id} @@ -388,13 +394,13 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): applications = self.__filter_application_list_by_status(request, applications) return self.__get_paginated_application_list(request, applications) except UnauthorizeError: - return Response({"error": "forbidden"}, status=status.HTTP_403_FORBIDDEN) + return Response({views_constants.ERROR: views_constants.ERROR_FORBIDDEN}, status=status.HTTP_403_FORBIDDEN) except (StatusError, ValueError): - return Response({"error": "status must be an integer between 0 and 4"}, \ + return Response({views_constants.ERROR: views_constants.ERROR_INVALID_STATUS_CODE}, status=status.HTTP_400_BAD_REQUEST) def __get_company_list_by_company_id(self, request, company_id): - company = get_object_or_404(Company.objects.all().order_by('-updated'), pk=company_id) + company = get_object_or_404(Company.objects.all().order_by(views_constants.ORDER_UPDATED), pk=company_id) if not self.__validating_user(request, company): raise UnauthorizeError return company @@ -421,7 +427,7 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): return Application.objects.filter(vacancy=vacancy) def __get_status_from_request_param(self, request): - return request.query_params.get('status', None) + return request.query_params.get(views_constants.STATUS, None) def __validating_application_status(self, status): list_status = {0: "NEW", 1: "READ", 2: "BOOKMARKED", 3: "REJECTED", 4: "ACCEPTED", 6: "FINISHED"} @@ -441,8 +447,8 @@ class CompanyApplicationViewSet(viewsets.GenericViewSet): page = self.paginate_queryset(applications) if page is not None: return self.get_paginated_response( - ApplicationSerializer(page, many=True, context={'request': request}).data) - return Response(ApplicationSerializer(applications, many=True, context={'request': request}).data) + ApplicationSerializer(page, many=True, context={views_constants.REQUEST: request}).data) + return Response(ApplicationSerializer(applications, many=True, context={views_constants.REQUEST: request}).data) class CompanyVacanciesViewSet(viewsets.GenericViewSet): @@ -455,14 +461,14 @@ class CompanyVacanciesViewSet(viewsets.GenericViewSet): Get list of company {company_id}'s vacancies --- """ - company = get_object_or_404(Company.objects.all().order_by('-updated'), pk=company_id) + company = get_object_or_404(Company.objects.all().order_by(views_constants.ORDER_UPDATED), pk=company_id) if not request.user.is_superuser and request.user != company.user: - return Response({"error": "forbidden"}, status=status.HTTP_403_FORBIDDEN) + return Response({views_constants.ERROR: views_constants.ERROR_FORBIDDEN}, status=status.HTTP_403_FORBIDDEN) vacancies = Vacancy.objects.filter(company=company) page = self.paginate_queryset(vacancies) if page is not None: - return self.get_paginated_response(VacancySerializer(page, many=True, context={'request': request}).data) - return Response(VacancySerializer(vacancies, many=True, context={'request': request}).data) + return self.get_paginated_response(VacancySerializer(page, many=True, context={views_constants.REQUEST: request}).data) + return Response(VacancySerializer(vacancies, many=True, context={views_constants.REQUEST: request}).data) class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): @@ -475,7 +481,7 @@ class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): --- """ student = get_object_or_404(Student.objects.all(), pk=student_id) - search = request.query_params['search'] if 'search' in request.query_params else None + search = request.query_params[views_constants.SEARCH] if views_constants.SEARCH in request.query_params else None if search is not None: vacancies = student.bookmarked_vacancies.filter( Q(name__icontains=search) | Q(company__user__username__icontains=search)) @@ -483,8 +489,8 @@ class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): vacancies = student.bookmarked_vacancies.all() page = self.paginate_queryset(vacancies) if page is not None: - return self.get_paginated_response(VacancySerializer(page, many=True, context={'request': request}).data) - return Response(VacancySerializer(vacancies, many=True, context={'request': request}).data) + return self.get_paginated_response(VacancySerializer(page, many=True, context={views_constants.REQUEST: request}).data) + return Response(VacancySerializer(vacancies, many=True, context={views_constants.REQUEST: request}).data) def create(self, request, student_id): """ @@ -497,11 +503,11 @@ class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): type: string paramType: body """ - vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id']) + vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data[views_constants.VACANCY_ID]) student = get_object_or_404(Student.objects.all(), pk=student_id) student.bookmarked_vacancies.add(vacancy) return Response( - self.serializer_class(student.bookmarked_vacancies, many=True, context={'request': request}).data) + self.serializer_class(student.bookmarked_vacancies, many=True, context={views_constants.REQUEST: request}).data) def destroy(self, request, student_id, pk): """ @@ -512,7 +518,7 @@ class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet): student = get_object_or_404(Student.objects.all(), pk=student_id) student.bookmarked_vacancies.remove(vacancy) return Response( - self.serializer_class(student.bookmarked_vacancies, many=True, context={'request': request}).data) + self.serializer_class(student.bookmarked_vacancies, many=True, context={views_constants.REQUEST: request}).data) class VacancyMilestoneViewSet(viewsets.GenericViewSet): @@ -529,8 +535,8 @@ class VacancyMilestoneViewSet(viewsets.GenericViewSet): page = self.paginate_queryset(milestones) if page is not None: return self.get_paginated_response( - self.serializer_class(page, many=True, context={'request': request}).data) - return Response(self.serializer_class(milestones, many=True, context={'request': request}).data) + self.serializer_class(page, many=True, context={views_constants.REQUEST: request}).data) + return Response(self.serializer_class(milestones, many=True, context={views_constants.REQUEST: request}).data) def create(self, request, vacancy_id): """ @@ -548,7 +554,7 @@ class VacancyMilestoneViewSet(viewsets.GenericViewSet): milestone_serializer = self.serializer_class(data=request.data) if milestone_serializer.is_valid(): milestone = milestone_serializer.save(vacancy=vacancy) - return Response(self.serializer_class(milestone, context={'request': request}).data, + return Response(self.serializer_class(milestone, context={views_constants.REQUEST: request}).data, status=status.HTTP_200_OK) return Response(milestone_serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -569,7 +575,7 @@ class VacancyMilestoneViewSet(viewsets.GenericViewSet): milestone_serializer = self.serializer_class(old_milestone, data=request.data) if milestone_serializer.is_valid(): milestone = milestone_serializer.save(vacancy=vacancy) - return Response(self.serializer_class(milestone, context={'request': request}).data, + return Response(self.serializer_class(milestone, context={views_constants.REQUEST: request}).data, status=status.HTTP_200_OK) return Response(milestone_serializer.errors, status=status.HTTP_400_BAD_REQUEST) @@ -582,7 +588,7 @@ class VacancyMilestoneViewSet(viewsets.GenericViewSet): milestone = get_object_or_404(vacancy.milestones.all(), pk=pk) milestone.delete() return Response( - self.serializer_class(vacancy.milestones.all(), many=True, context={'request': request}).data) + self.serializer_class(vacancy.milestones.all(), many=True, context={views_constants.REQUEST: request}).data) class AcceptOfferByStudentViewSet(MultiSerializerViewSetMixin, viewsets.GenericViewSet): @@ -594,13 +600,13 @@ class AcceptOfferByStudentViewSet(MultiSerializerViewSetMixin, viewsets.GenericV Get list of a student {student_id}'s cancel offered vacancies --- """ - student = get_object_or_404(Student.objects.all().order_by('-updated'), pk=student_id) + student = get_object_or_404(Student.objects.all().order_by(views_constants.ORDER_UPDATED), pk=student_id) apps = Application.objects.filter(student=student) for a in apps: if a.vacancy_id != int(pk): - serializer = ApplicationStatusSerializer(a, data={'status': 5}, partial=True) + serializer = ApplicationStatusSerializer(a, data={views_constants.STATUS: 5}, partial=True) if serializer.is_valid(): serializer.save() - return Response(SupervisorStudentApplicationSerializer(apps, many=True, context={'request': request}).data) + return Response(SupervisorStudentApplicationSerializer(apps, many=True, context={views_constants.REQUEST: request}).data) diff --git a/core/views/views_constants.py b/core/views/views_constants.py new file mode 100644 index 0000000000000000000000000000000000000000..9874200b5426410987a17e4443f8321480d9ae11 --- /dev/null +++ b/core/views/views_constants.py @@ -0,0 +1,74 @@ +ERROR_OPEN_TIME_GREATER_THAN_CURRENT_TIME = 'Waktu buka lowongan harus lebih dari hari ini!' +ERROR_OPEN_TIME_GREATER_THAN_CLOSE_TIME = 'Waktu tutup lowongan harus lebih dari waktu buka lowongan!' +ERROR_OPEN_TIME_EQUALS_CLOSE_TIME = 'Waktu tutup dan buka lowongan tidak boleh sama!' +ERROR_NAME_MUST_ALPHABET = 'Name must alphabets only' +ERROR_SALARY_MUST_NUMBER = 'Salary must number only' +ERROR_AMOUNT_MUST_NUMBER = 'Amount must number only' +ERROR_RESPONSIBILITIES_MUST_STRING = 'Responsibilities must be string' +ERROR_INVALID_RECRUITER_RESPONSE = 'Tingkat Respons Perekrut harus salah satu dari Selalu, Sering, Kadang, Jarang, ' \ + 'dan Tidak Pernah!' +ERROR_VACANCY_ALREADY_APPLIED = 'You have already applied for the vacancy' +ERROR_COMPANY_DOES_NOT_EXIST = 'No company exists with that ID' +ERROR_VACANCY_CLOSED = 'vacancy is closed' +ERROR_INVALID_STATUS_CODE = 'status must be an integer between 0 and 4' +ERROR_FORBIDDEN = 'forbidden' +ERROR_BAD_REQUEST = 'bad request' + +ACTION_LIST = 'list' +ACTION_PARTIAL_UPDATE = 'partial_update' +ACTION_RETRIEVE = 'retrieve' +ACTION_UPDATE = 'update' + +HEADER_AUTH = 'Basic WDN6TmtGbWVwa2RBNDdBU05NRFpSWDNaOWdxU1UxTHd5d3U1V2VwRzpCRVFXQW43RDl6a2k3NEZ0bkNpWVhIRk50Ymg3eXlNWmFuNnlvMU1uaUdSVWNGWnhkQnBobUU5TUxuVHZiTTEzM1dsUnBwTHJoTXBkYktqTjBxcU9OaHlTNGl2Z0doczB0OVhlQ3M0Ym1JeUJLMldwbnZYTXE4VU5yTEFEMDNZeA==' +HEADER_CONTENT_TYPE = 'application/x-www-form-urlencoded' +HEADER_NO_CACHE = 'no-cache' + +CLIENT_ID_VALUE = 'X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG' +URL_AKUN_CS_UI = 'https://akun.cs.ui.ac.id/oauth/token/' + +METHOD_GET = 'get' +METHOD_PATCH = 'patch' +METHOD_POST = 'POST' + +ORDER_ASCENDING = 'ascending' +ORDER_DESCENDING = 'descending' +ORDER_STUDENT = 'student' +ORDER_UPDATED = '-updated' + +PARAM_GRANT_TYPE = 'grant_type=' +PARAM_PASSWORD = 'password=' +PARAM_USERNAME = 'username=' + + +ACCESS_TOKEN = 'access_token' +AMOUNT = 'amount' +BENEFITS = 'benefits' +CLIENT_ID = 'client_id' +CLOSE_TIME = 'close_time' +COMPANY = 'company' +COUNT = 'count' +COUNT_NEW = 'count_new' +COVER_LETTER = 'cover_letter' +DESCRIPTION = 'description' +ERROR = 'error' +IS_VALID = 'is_valid' +MAX_ACCEPTED_APPLICANTS = 'max_accepted_applicants' +NAME = 'name' +OPEN_TIME = 'open_time' +OPENED_ONLY = 'opened_only' +ORDERING = 'order' +PASSWORD = 'password' +REASON = 'reason' +RECRUITER_ACTIVITY = 'recruiter_activity' +REQUEST = 'request' +REQUIREMENTS = 'requirements' +RESPONSIBILITIES = 'responsibilities' +SALARY = 'salary' +SEARCH = 'search' +SORT = 'sort' +STATUS = 'status' +TAG = 'tag' +VACANCY = 'vacancy' +VACANCY_ID = 'vacancy_id' +VERIFIED = 'verified' +WORKING_PERIOD = 'working_period'