| from rest_framework import serializers |
| |
|
|
| class UserSerializer(serializers.Serializer): |
| id = serializers.CharField(read_only=True) |
| username = serializers.CharField() |
| email = serializers.EmailField() |
|
|
| def update(self, instance, validated_data): |
| from expense_tracker.utils import MongoDBClient |
| from bson import ObjectId |
| |
| db = MongoDBClient.get_client() |
| update_fields = {} |
| if 'username' in validated_data: |
| update_fields['username'] = validated_data['username'] |
| if 'email' in validated_data: |
| update_fields['email'] = validated_data['email'] |
| |
| if update_fields: |
| db.users.update_one({'_id': ObjectId(instance.id)}, {'$set': update_fields}) |
| |
| |
| instance.username = update_fields.get('username', instance.username) |
| instance.email = update_fields.get('email', instance.email) |
| |
| return instance |
|
|
| class RegisterSerializer(serializers.Serializer): |
| username = serializers.CharField() |
| email = serializers.EmailField() |
| password = serializers.CharField(write_only=True) |
|
|
| def validate_username(self, value): |
| from expense_tracker.utils import MongoDBClient |
| db = MongoDBClient.get_client() |
| if db.users.find_one({'username': value}): |
| raise serializers.ValidationError("Username already exists") |
| return value |
|
|
| def validate_email(self, value): |
| from expense_tracker.utils import MongoDBClient |
| db = MongoDBClient.get_client() |
| if db.users.find_one({'email': value}): |
| raise serializers.ValidationError("Email already exists") |
| return value |
|
|
| def create(self, validated_data): |
| from expense_tracker.utils import MongoDBClient |
| from django.contrib.auth.hashers import make_password |
| from datetime import datetime |
| |
| db = MongoDBClient.get_client() |
| user_doc = { |
| 'username': validated_data['username'], |
| 'email': validated_data['email'], |
| 'password': make_password(validated_data['password']), |
| 'is_active': True, |
| 'is_staff': False, |
| 'is_superuser': False, |
| 'date_joined': datetime.now(), |
| 'last_login': None |
| } |
| result = db.users.insert_one(user_doc) |
| |
| |
| user_doc['id'] = str(result.inserted_id) |
| return user_doc |
|
|