from rest_framework import serializers # Removed get_user_model as it requires the SQL-based auth app. 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}) # Update instance in memory 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) # Return a dict that mimics the User object for the response user_doc['id'] = str(result.inserted_id) return user_doc