FinMK / backend /users /mongo_auth.py
Kumar
Refactor: Exclude PDF and CSV files from Git to fix HF push error
24e6f5b
import logging
from datetime import datetime
from bson import ObjectId
from django.conf import settings
from django.contrib.auth.hashers import check_password, make_password
from expense_tracker.utils import MongoDBClient
class MongoUser:
"""
A custom User class that mimics Django's User model but stores data in MongoDB.
"""
def __init__(self, data):
self._id = data.get('_id')
self.pk = str(self._id) if self._id else None
self.id = self.pk
self.username = data.get('username')
self.email = data.get('email')
self.password = data.get('password') # Hashed
self.is_active = data.get('is_active', True)
self.is_staff = data.get('is_staff', False)
self.is_superuser = data.get('is_superuser', False)
self.last_login = data.get('last_login')
self.date_joined = data.get('date_joined')
@property
def is_authenticated(self):
return True
def save(self):
# This is a helper, but actual saving logic might be in views/backend
pass
def __str__(self):
return self.username
def __eq__(self, other):
return isinstance(other, MongoUser) and self.pk == other.pk
class MongoBackend:
"""
Authentication Backend to authenticate against MongoDB users collection.
"""
def authenticate(self, request, username=None, password=None, **kwargs):
db = MongoDBClient.get_client()
if username is None:
username = kwargs.get('email')
# Try finding by username or email
user_data = db.users.find_one({'$or': [{'username': username}, {'email': username}]})
if user_data:
if check_password(password, user_data.get('password')):
# Update last login
db.users.update_one({'_id': user_data['_id']}, {'$set': {'last_login': datetime.now()}})
return MongoUser(user_data)
return None
def get_user(self, user_id):
try:
db = MongoDBClient.get_client()
user_data = db.users.find_one({'_id': ObjectId(user_id)})
if user_data:
return MongoUser(user_data)
except:
pass
return None