FinMK / backend /users /serializers.py
Kumar
Refactor: Exclude PDF and CSV files from Git to fix HF push error
24e6f5b
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