Source code for openlifu.db.user

from __future__ import annotations

import json
import logging
from dataclasses import dataclass, field
from pathlib import Path
from typing import Annotated, Any, Dict, List

from openlifu.util.annotations import OpenLIFUFieldData


[docs] @dataclass class User: id: Annotated[str, OpenLIFUFieldData("User ID", "The unique identifier of the user")] = "user" """The unique identifier of the user""" password_hash: Annotated[str, OpenLIFUFieldData("Password hash", "A hashed user password for authentication.")] = "" """A hashed user password for authentication.""" roles: Annotated[List[str], OpenLIFUFieldData("Roles", "A list of roles")] = field(default_factory=list) """A list of roles""" name: Annotated[str, OpenLIFUFieldData("User name", "The name of the user")] = "User" """The name of the user""" description: Annotated[str, OpenLIFUFieldData("Description", "A description of the user")] = "" """A description of the user""" def __post_init__(self): self.logger = logging.getLogger(__name__) @staticmethod def from_dict(d : Dict[str,Any]) -> User: return User(**d) def to_dict(self): return { "id": self.id, "password_hash": self.password_hash, "roles": self.roles, "name": self.name, "description": self.description, } @staticmethod def from_file(filename): with open(filename) as f: d = json.load(f) return User.from_dict(d)
[docs] @staticmethod def from_json(json_string : str) -> User: """Load a User from a json string""" return User.from_dict(json.loads(json_string))
[docs] def to_json(self, compact:bool) -> str: """Serialize a User to a json string Args: compact: if enabled then the string is compact (not pretty). Disable for pretty. Returns: A json string representing the complete User object. """ if compact: return json.dumps(self.to_dict(), separators=(',', ':')) else: return json.dumps(self.to_dict(), indent=4)
[docs] def to_file(self, filename: str): """ Save the user to a file Args: filename: Name of the file """ Path(filename).parent.mkdir(exist_ok=True, parents=True) with open(filename, 'w') as file: file.write(self.to_json(compact=False))