Coverage for src / local_deep_research / database / models / auth.py: 100%

18 statements  

« prev     ^ index     » next       coverage.py v7.12.0, created at 2026-01-11 00:51 +0000

1""" 

2Authentication models for managing users. 

3Only stores username and metadata - passwords are never stored. 

4Each user gets their own encrypted database file. 

5""" 

6 

7from datetime import datetime, UTC 

8from functools import partial 

9 

10from sqlalchemy import Column, Integer, String 

11from sqlalchemy_utc import UtcDateTime 

12 

13from ...config.paths import get_user_database_filename 

14from .base import Base 

15 

16 

17class User(Base): 

18 """ 

19 User model - stored in a central auth database. 

20 Passwords are NEVER stored - they are used to decrypt individual user databases. 

21 """ 

22 

23 __tablename__ = "users" 

24 

25 id = Column(Integer, primary_key=True) 

26 username = Column(String(80), unique=True, nullable=False, index=True) 

27 created_at = Column(UtcDateTime, default=partial(datetime.now, UTC)) 

28 last_login = Column(UtcDateTime) 

29 

30 # Metadata only - no sensitive data 

31 database_version = Column(Integer, default=1) 

32 

33 def __repr__(self): 

34 return f"<User {self.username}>" 

35 

36 @property 

37 def database_path(self): 

38 """Path to this user's encrypted database file.""" 

39 return get_user_database_filename(self.username)