Source code for dataio.utils.accounts

import json
import os
import random
import string
from dataclasses import asdict, dataclass
from pathlib import Path


[docs] @dataclass class Account: name: str abbreviation: str
[docs] class AccountRepository: def __init__( self, path: Path = None, ): self.file_path = path self.accounts = {} self.load_accounts()
[docs] def load_accounts(self): # breakpoint() with open(self.file_path, "r") as file: accounts_data = json.load(file) self.accounts = { name: Account(name, data["abbreviation"]) for name, data in accounts_data.items() }
[docs] def add_account(self, name: str) -> Account: if name in self.accounts: return self.accounts[name] abbreviation = self.generate_abbreviation(name) self.accounts[name] = Account(name, abbreviation) self.save_accounts() # Save the updated accounts list to a file or database print(f"{name} added to accounts with an abbriviated name of {abbreviation}") return self.accounts[name]
[docs] def generate_abbreviation(self, name: str) -> str: # Generate a two-letter abbreviation not already used while True: abbreviation = "".join(random.choices(string.ascii_uppercase, k=2)) if all( abbreviation != acct.abbreviation for acct in self.accounts.values() ): return abbreviation
[docs] def save_accounts(self): with open(self.file_path, "w") as file: json_data = { name: asdict(account) for name, account in self.accounts.items() } json.dump(json_data, file, indent=4)
[docs] def get_account(self, name: str) -> Account: account = self.accounts.get(name) if account is None: raise KeyError(f"Account {name} not found") return account
[docs] def get_or_create_account(self, name: str) -> Account: try: return self.get_account(name) except KeyError: return self.add_account(name)