diff --git a/users/serializer.py b/users/serializer.py index 76835d1..08310d2 100644 --- a/users/serializer.py +++ b/users/serializer.py @@ -11,6 +11,7 @@ class Pucko_User_Serializer(serializers.ModelSerializer): model = get_user_model() fields = ( 'username', + 'email', 'is_staff', 'date_joined', 'slug' @@ -62,3 +63,11 @@ class Logout_Serializer(serializers.Serializer): class Meta: fields = () + +class Change_Password_Serializer(serializers.Serializer): + old_password = serializers.CharField(required=True, write_only=True) + new_password = serializers.CharField(required=True, write_only=True) + message = serializers.CharField(read_only=True) + + class Meta: + fields = ("old_password", "new_password", "message") diff --git a/users/urls.py b/users/urls.py index 5d7a09f..51e79b0 100644 --- a/users/urls.py +++ b/users/urls.py @@ -4,10 +4,14 @@ from .views import RenewView from .views import LogoutView from .views import LogoutAllView from .views import RegisterView +from .views import ChangePasswordView +from .views import AccountInfoView urlpatterns = [ path("create-token/", LoginView.as_view(), name="create_token"), path("refresh-token/", RenewView.as_view(), name="refresh-token"), + path("account-info/", AccountInfoView.as_view({"get": "user_info"}), name="account-info"), + path("change-password/", ChangePasswordView.as_view({"post": "change_password"}), name="change-password"), path("signup/", RegisterView.as_view(), name="signup"), path("logout/", LogoutView.as_view(), name="logout"), path("logout-all/", LogoutAllView.as_view(), name="logout-all") diff --git a/users/views.py b/users/views.py index c05d4e5..39eccdd 100644 --- a/users/views.py +++ b/users/views.py @@ -12,10 +12,14 @@ from knox.views import LoginView as KnoxLoginView from knox.views import LogoutView as KnoxLogoutView from knox.views import LogoutAllView as KnoxLogoutAllView +from settings.puckoviews import PuckoView +from settings.puckolizers import Message_Serializer + from .serializer import Pucko_CreateUser_Serializer from .serializer import Pucko_Renew_Serializer from .serializer import Pucko_User_Serializer from .serializer import Pucko_Login_Serializer +from .serializer import Change_Password_Serializer class LoginView(KnoxLoginView): permission_classes = (AllowAny,) @@ -31,6 +35,14 @@ class LoginView(KnoxLoginView): user = serializer.validated_data['user'] login(request, user) return super(LoginView, self).post(request, format=None) + +class AccountInfoView(PuckoView): + permission_classes = (IsAuthenticated,) + serializer_class = Pucko_User_Serializer + + def user_info(self, request, format=None): + serializer = self.serializer_class(request.user) + return Response(serializer.data, status=200) class RenewView(KnoxLoginView): authentication_classes = (TokenAuthentication,) @@ -64,3 +76,21 @@ class RegisterView(CreateAPIView): queryset = get_user_model().objects.all() permission_classes = (AllowAny,) serializer_class = Pucko_CreateUser_Serializer + +class ChangePasswordView(PuckoView): + permission_classes = (IsAuthenticated,) + serializer_class = Change_Password_Serializer + + def change_password(self, request): + old_password = request.data["old_password"] + new_password = request.data["new_password"] + + user = request.user + + if not user.check_password(raw_password=old_password): + serializer = Message_Serializer({"message": "Error: Could not change password. old password does not match."}) + return Response(serializer.data, status=403) + user.set_password(new_password) + user.save() + serializer = Message_Serializer({"message": "password is updated"}) + return Response(serializer.data, status=200) \ No newline at end of file