File size: 2,611 Bytes
24e6f5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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