跳转至

Users

labridge.accounts.users

labridge.accounts.users.AccountManager

Bases: object

This is account manager of the Laboratory members and chat groups. Only registered users have access to the Lab assistant.

The user account information is stored as a dictionary in JSON format: {user_id: password}

The chat groups information is stored as a dictionary in JSON format: {chat_group_id: [user_id, ]}

Source code in labridge\accounts\users.py
 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
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
class AccountManager(object):
	r"""
	This is account manager of the Laboratory members and chat groups.
	Only registered users have access to the Lab assistant.

	The user account information is stored as a dictionary in JSON format:
	`{user_id: password}`

	The chat groups information is stored as a dictionary in JSON format:
	`{chat_group_id: [user_id, ]}`
	"""
	def __init__(self):
		root = Path(__file__)
		for idx in range(3):
			root = root.parent
		self.root = root
		self.user_ids_path = str(root / USER_IDS_PERSIS_PATH)
		self.chat_group_ids_path = str(root / CHAT_GROUP_IDS_PERSIST_PATH)
		self.fs = fsspec.filesystem("file")
		dir_path = str(Path(self.user_ids_path).parent)
		if not self.fs.exists(dir_path):
			self.fs.makedirs(dir_path)

	def _get_user_ids_dict(self) -> Dict[str, str]:
		r""" Get the user account dict. """
		if not self.fs.exists(self.user_ids_path):
			return {}
		with self.fs.open(self.user_ids_path, "rb") as f:
			user_ids = json.load(f)
		return user_ids

	def _get_chat_group_ids_dict(self) -> Dict[str, List[str]]:
		r""" Get the chat group id dict. """
		if not self.fs.exists(self.chat_group_ids_path):
			return {}
		with self.fs.open(self.chat_group_ids_path, "rb") as f:
			chat_group_ids = json.load(f)
		return chat_group_ids

	def get_users(self) -> List[str]:
		r""" Get the registered users. """
		return list(self._get_user_ids_dict().keys())

	def get_chat_groups(self) -> List[str]:
		r""" Get the registered chat groups """
		return list(self._get_chat_group_ids_dict().keys())

	def user_log_in(self, user_id: str, password: str) -> bool:
		r""" User log in """
		try:
			self.check_valid_user(user_id)
			user_ids = self._get_user_ids_dict()
			return password == user_ids[user_id]
		except ValueError:
			return False

	def check_valid_user(self, user_id: str):
		r""" Check whether the given user is registered. """
		user_list = self.get_users()
		if user_id not in user_list:
			raise ValueError(f"Invalid user id, the user {user_id} is not registered.")

	def is_valid_chat_group(self, chat_group_id: str):
		r""" Check whether the given chat group is registered """
		chat_group_list = self.get_chat_groups()
		if chat_group_id not in chat_group_list:
			raise ValueError(f"The chat group {chat_group_id} is not registered.")

	def add_user(self, user_id: str, password: str):
		r""" Register a new user. """
		user_ids = self._get_user_ids_dict()

		if user_id not in user_ids:
			user_ids[user_id] = password
			with self.fs.open(self.user_ids_path, "w") as f:
				f.write(json.dumps(user_ids))

	def add_chat_group(self, chat_group_id: str, user_list: List[str]) -> Optional[str]:
		r"""
		Register a new chat group along with its members.
		All members in the chat group should have registered as a user.
		"""
		for user_id in user_list:
			try:
				self.check_valid_user(user_id)
			except ValueError as e:
				return f"Error: {e!s}"

		chat_group_ids = self._get_chat_group_ids_dict()

		if chat_group_id not in chat_group_ids:
			chat_group_ids[chat_group_id] = user_list
			with self.fs.open(self.chat_group_ids_path, "w") as f:
				f.write(json.dumps(chat_group_ids))
			return None

	def update_chat_group_members(self, chat_group_id: str, new_user_list: List[str]) -> Optional[str]:
		r""" Update the members of a chat group. """
		for user_id in new_user_list:
			try:
				self.check_valid_user(user_id)
			except ValueError as e:
				return f"Error: {e!s}"

		chat_group_ids = self._get_chat_group_ids_dict()
		chat_group_ids[chat_group_id] = new_user_list
		with self.fs.open(self.chat_group_ids_path, "w") as f:
			f.write(json.dumps(chat_group_ids))
		return None

labridge.accounts.users.AccountManager.add_chat_group(chat_group_id, user_list)

Register a new chat group along with its members. All members in the chat group should have registered as a user.

Source code in labridge\accounts\users.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def add_chat_group(self, chat_group_id: str, user_list: List[str]) -> Optional[str]:
	r"""
	Register a new chat group along with its members.
	All members in the chat group should have registered as a user.
	"""
	for user_id in user_list:
		try:
			self.check_valid_user(user_id)
		except ValueError as e:
			return f"Error: {e!s}"

	chat_group_ids = self._get_chat_group_ids_dict()

	if chat_group_id not in chat_group_ids:
		chat_group_ids[chat_group_id] = user_list
		with self.fs.open(self.chat_group_ids_path, "w") as f:
			f.write(json.dumps(chat_group_ids))
		return None

labridge.accounts.users.AccountManager.add_user(user_id, password)

Register a new user.

Source code in labridge\accounts\users.py
80
81
82
83
84
85
86
87
def add_user(self, user_id: str, password: str):
	r""" Register a new user. """
	user_ids = self._get_user_ids_dict()

	if user_id not in user_ids:
		user_ids[user_id] = password
		with self.fs.open(self.user_ids_path, "w") as f:
			f.write(json.dumps(user_ids))

labridge.accounts.users.AccountManager.check_valid_user(user_id)

Check whether the given user is registered.

Source code in labridge\accounts\users.py
68
69
70
71
72
def check_valid_user(self, user_id: str):
	r""" Check whether the given user is registered. """
	user_list = self.get_users()
	if user_id not in user_list:
		raise ValueError(f"Invalid user id, the user {user_id} is not registered.")

labridge.accounts.users.AccountManager.get_chat_groups()

Get the registered chat groups

Source code in labridge\accounts\users.py
55
56
57
def get_chat_groups(self) -> List[str]:
	r""" Get the registered chat groups """
	return list(self._get_chat_group_ids_dict().keys())

labridge.accounts.users.AccountManager.get_users()

Get the registered users.

Source code in labridge\accounts\users.py
51
52
53
def get_users(self) -> List[str]:
	r""" Get the registered users. """
	return list(self._get_user_ids_dict().keys())

labridge.accounts.users.AccountManager.is_valid_chat_group(chat_group_id)

Check whether the given chat group is registered

Source code in labridge\accounts\users.py
74
75
76
77
78
def is_valid_chat_group(self, chat_group_id: str):
	r""" Check whether the given chat group is registered """
	chat_group_list = self.get_chat_groups()
	if chat_group_id not in chat_group_list:
		raise ValueError(f"The chat group {chat_group_id} is not registered.")

labridge.accounts.users.AccountManager.update_chat_group_members(chat_group_id, new_user_list)

Update the members of a chat group.

Source code in labridge\accounts\users.py
108
109
110
111
112
113
114
115
116
117
118
119
120
def update_chat_group_members(self, chat_group_id: str, new_user_list: List[str]) -> Optional[str]:
	r""" Update the members of a chat group. """
	for user_id in new_user_list:
		try:
			self.check_valid_user(user_id)
		except ValueError as e:
			return f"Error: {e!s}"

	chat_group_ids = self._get_chat_group_ids_dict()
	chat_group_ids[chat_group_id] = new_user_list
	with self.fs.open(self.chat_group_ids_path, "w") as f:
		f.write(json.dumps(chat_group_ids))
	return None

labridge.accounts.users.AccountManager.user_log_in(user_id, password)

User log in

Source code in labridge\accounts\users.py
59
60
61
62
63
64
65
66
def user_log_in(self, user_id: str, password: str) -> bool:
	r""" User log in """
	try:
		self.check_valid_user(user_id)
		user_ids = self._get_user_ids_dict()
		return password == user_ids[user_id]
	except ValueError:
		return False