class AdminUserDataEditView(views.APIView): permission_classes = [CanStaffVerifyUsers] @swagger_auto_schema( responses={ '200': sample_message_response("Dane konta zostały zaktualizowane"), '400': "Błędy walidacji", '403': sample_error_response("Nie możesz edytować danych tego użytkownika"), '404': sample_error_response('Użytkownik o podanym id nie został znaleziony') }, manual_parameters=[ openapi.Parameter('pk', openapi.IN_PATH, type='string($uuid)', description='String UUID będący id danego użytkownika') ], operation_description="Api dla admina do edycji danych użytkowników (w tym hasła).", ) def patch(self, request, pk): try: account = Account.objects.get(pk=pk) except Account.DoesNotExist: return ErrorResponse('Użytkownik o podanym id nie został znaleziony', status.HTTP_404_NOT_FOUND) if account.type == AccountType.STANDARD.value: serializer = DefaultAccountSerializer(account, data=request.data, partial=True) elif account.type == AccountType.EMPLOYER.value: serializer = EmployerAccountSerializer(account, data=request.data, partial=True) elif account.type == AccountType.STAFF.value: return ErrorResponse("Nie możesz edytować danych tego użytkownika", status.HTTP_403_FORBIDDEN) if serializer.is_valid(): serializer.update(account, serializer.validated_data) send_account_data_change_email(pk, request.data) return MessageResponse("Dane konta zostały zaktualizowane") else: return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) @swagger_auto_schema( responses={ '200': sample_message_response("Konto zostało usunięte"), '403': sample_error_response("Nie możesz wykonać tej operacji"), '404': sample_error_response("Użytkownik o podanym id nie został znaleziony") }, manual_parameters=[ openapi.Parameter('pk', openapi.IN_PATH, type='string($uuid)', description='String UUID będący id danego użytkownika') ], operation_description="Api dla admina do kasowania użytkowników. Nie można przez nie usuwać staffów.", ) def delete(self, request, pk): try: account = Account.objects.get(pk=pk) if account.type == AccountType.STAFF.value: return ErrorResponse("Nie możesz wykonać tej operacji", status.HTTP_403_FORBIDDEN) account.delete() return MessageResponse("Konto zostało usunięte") except Account.DoesNotExist: return ErrorResponse("Użytkownik o podanym id nie został znaleziony", status.HTTP_404_NOT_FOUND)
class PasswordChangeView(views.APIView): permission_classes = (IsAuthenticated, ) @swagger_auto_schema( responses={ '200': sample_message_response("Hasło zostało zmienione"), '400': "Błędy walidacji", '403': sample_error_response("Stare hasło jest niepoprawne") }, request_body=PasswordChangeRequestSerializer, operation_description= "Api pozwalające użytkownikowi zmienić swoje hasło", ) def patch(self, request): account = request.user serializer = PasswordChangeRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) old_pass = request.data['old_password'] new_pass = request.data['new_password'] if check_password(old_pass, account.password): account.set_password(new_pass) account.save() account.auth_token_set.all().delete() return MessageResponse("Hasło zostało zmienione") return ErrorResponse("Stare hasło jest niepoprawne", status.HTTP_403_FORBIDDEN)
class TileView(views.APIView): permission_classes = [IsStaffMember] @swagger_auto_schema( manual_parameters=[Parameter('tile_id', IN_PATH, type='integer')], responses={ 200: '"message": "Kafelek o podanym id został zaktualizowany"', 403: 'Forbidden - no permissions', 404: '"error": "Nie znaleziono kafelka o podanym id"' }) def put(self, request, tile_id): try: instance = Tile.objects.get(id=tile_id) serializer = TileSerializer(instance, data=request.data, partial=True) if serializer.is_valid(): serializer.update(instance, serializer.validated_data) response_data = { "message": "Kafelek o podanym id został zaktualizowany" } return Response(response_data, status.HTTP_200_OK) else: return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) except ObjectDoesNotExist: return ErrorResponse("Nie znaleziono kafelka o podanym id", status.HTTP_404_NOT_FOUND) @swagger_auto_schema( manual_parameters=[ Parameter('tile_id', IN_PATH, type='integer'), ], responses={ 200: sample_message_response('Kafelek został pomyślnie usunięty'), 404: sample_message_response("Nie znaleziono kafelka o podanym id") }) def delete(self, request, tile_id): try: instance = Tile.objects.get(pk=tile_id) except ObjectDoesNotExist: return ErrorResponse("Nie znaleziono kafelka o podanym id", status.HTTP_404_NOT_FOUND) instance.delete() return MessageResponse("Kafelek został pomyślnie usunięty")
class PhoneContactView(views.APIView): permission_classes = [IsStaffBlogModerator] @swagger_auto_schema( manual_parameters=[ Parameter('contact_id', IN_PATH, type='integer'), ], responses={ 200: sample_message_response('Kontakt został pomyślnie usunięty'), 404: sample_message_response("Nie znaleziono kontaktu o podanym id") }) def delete(self, request, contact_id): try: instance = PhoneContact.objects.get(pk=contact_id) except ObjectDoesNotExist: return ErrorResponse("Nie znaleziono kontaktu o podanym id", status.HTTP_404_NOT_FOUND) instance.delete() return MessageResponse("Kontakt został pomyślnie usunięty")
class CVView(views.APIView): permissions_classes = [IsCVOwner | IsStaffResponsibleForCVs] @swagger_auto_schema( manual_parameters=[ openapi.Parameter('cv_id', openapi.IN_PATH, type='string($uuid)', description='String UUID będący id danego CV') ], responses={ '200': sample_message_response("/media/cv_docs/2020/04/03/file_name.pdf"), '403': 'Nie masz uprawnień do wykonania tej czynności', '404': "Nie znaleziono CV. Upewnij się, że uwzględniono cv_id w url-u" }, operation_description='Zwraca url-a do pdf zawierającego CV na podstawie zapisanych wcześniej danych' ) def get(self, request, cv_id): try: cv = CV.objects.get(cv_id=cv_id) if not IsCVOwner().has_object_permission(request, self, cv) \ and not IsStaffResponsibleForCVs().has_object_permission(request, self, cv): return ErrorResponse("Nie masz uprawnień do wykonania tej czynności", status.HTTP_403_FORBIDDEN) except CV.DoesNotExist: return ErrorResponse("Nie znaleziono CV. Upewnij się, że uwzględniono cv_id w url-u", status.HTTP_404_NOT_FOUND) return Response({'url': cv.document.url}, status.HTTP_200_OK) @swagger_auto_schema( operation_description="Usuwa CV z bazy danych jeśli ono istnieje", manual_parameters=[ openapi.Parameter('cv_id', openapi.IN_PATH, type='string($uuid)', description='String UUID będący id danego CV') ], responses={ '200': 'CV usunięto pomyślnie', '403': 'Nie masz uprawnień do wykonania tej czynności.', '404': "Nie znaleziono CV. Upewnij się, że uwzględniono cv_id w url-u" } ) def delete(self, request, cv_id): try: cv = CV.objects.get(cv_id=cv_id) if not IsCVOwner().has_object_permission(request, self, cv) \ and not IsStaffResponsibleForCVs().has_object_permission(request, self, cv): return ErrorResponse("Nie masz uprawnień do wykonania tej czynności", status.HTTP_403_FORBIDDEN) cv.delete() except CV.DoesNotExist: return ErrorResponse("Nie znaleziono CV. Upewnij się, że uwzględniono cv_id w url-u", status.HTTP_404_NOT_FOUND) return MessageResponse('CV usunięto pomyślnie')
class StaffDataChangeView(views.APIView): permission_classes = (IsStaffMember, ) @swagger_auto_schema( responses={ '200': sample_message_response("Dane zostały pomyślnie zmienione"), '400': "Błędy walidacji" }, request_body=StaffAccountSerializer, operation_description="Api pozwalające pracownikowi zmienić swoje dane (do hasła jest inne api). Uprawnień nie można zmieniać", ) def patch(self, request): account = request.user serializer = StaffAccountSerializer(account, data=request.data, partial=True) if serializer.is_valid(): serializer.update(account, serializer.validated_data) else: return Response(serializer.errors, status.HTTP_400_BAD_REQUEST) return MessageResponse("Dane zostały pomyślnie zmienione")
class UserDataView(views.APIView): permission_classes = [IsAuthenticated] def get_serializer_class(self, request): if request.user.type == AccountType.STANDARD.value: serializer = DefaultAccountDetailSerializer(instance=request.user) user_type = AccountType.STANDARD.value elif request.user.type == AccountType.EMPLOYER.value: serializer = EmployerDetailSerializer(instance=request.user) user_type = AccountType.EMPLOYER.value else: serializer = StaffDetailSerializer(instance=request.user) user_type = AccountType.STAFF.value return serializer, user_type @swagger_auto_schema( operation_description="Zwraca dane aktualnego użytkownika. " "Przykład jest dla użytkownika standardowego", responses={200: DefaultAccountSerializer}) def get(self, request): serializer, user_type = self.get_serializer_class(request) data = serializer.data user_id = str(request.user.id) data['is_subscribed'] = False return JsonResponse({ 'type': dict(ACCOUNT_TYPE_CHOICES)[user_type], 'data': data }) @swagger_auto_schema( responses={ '200': sample_message_response("Konto zostało pomyślnie usunięte") }, operation_description= "Api pozwalające użytkownikowi usunąć swoje konto", ) def delete(self, request): account = request.user account.delete() return MessageResponse("Konto zostało pomyślnie usunięte")