Add basic test

This commit is contained in:
phil 2024-12-14 17:34:48 +01:00
parent f2b924e9e9
commit c2a4aaac51
4 changed files with 128 additions and 22 deletions

View file

@ -9,15 +9,18 @@ from gisaf.baskets import Basket, standard_baskets
from gisaf.redis_tools import store
from gisaf.registry import registry
logger = logging.getLogger('Gisaf admin manager')
logger = logging.getLogger("Gisaf admin manager")
class AdminManager:
"""
Application wide manager of the admin (baskets).
One instance only, handled by Gisaf's process.
"""
store: Store
baskets: dict[str, Basket]
async def setup_admin(self):
"""
Create the default baskets, scan and create baskets
@ -28,12 +31,9 @@ class AdminManager:
# self.store = app['store']
## Standard baskets
self.baskets = {
basket.name: basket
for basket in standard_baskets
}
self.baskets = {basket.name: basket for basket in standard_baskets}
for entry_point in entry_points().select(group='gisaf_extras.baskets'):
for entry_point in entry_points().select(group="gisaf_extras.baskets"):
try:
basket_class = entry_point.load()
except ModuleNotFoundError as err:
@ -46,24 +46,32 @@ class AdminManager:
else:
name = basket_class.name
if name in self.baskets:
logger.warn(f'Skip basket {name} in {entry_point.module}: name already defined')
logger.warning(
f"Skip basket {name} in {entry_point.module}: name already defined"
)
continue
## Instanciate
basket = basket_class()
basket._custom_module = entry_point.name # type: ignore
basket._custom_module = entry_point.name # type: ignore
## Check base_dir, eventually create it
if not basket.base_dir.exists():
try:
basket.base_dir.mkdir()
except Exception as err:
logger.warn(f'Skip basket {name} in {entry_point.module}: '
f'cannot create directory for basket {name} at {basket.base_dir}')
logger.warning(
f"Skip basket {name} in {entry_point.module}: "
f"cannot create directory for basket {name} at {basket.base_dir}"
)
continue
else:
logger.info(f'Created directory for basket {name} at {basket.base_dir}')
logger.info(
f"Created directory for basket {name} at {basket.base_dir}"
)
## Add to register
self.baskets[name] = basket
logger.info(f'Added Basket {entry_point.name} from {entry_point.module}')
logger.info(
f"Added Basket {entry_point.name} from {entry_point.module}"
)
## Give a reference to the application to the baskets
# for basket in self.baskets.values():
@ -72,16 +80,17 @@ class AdminManager:
## Subscribe to admin redis channels
self.pub_categories = store.redis.pubsub()
self.pub_scheduler = store.redis.pubsub()
await self.pub_categories.psubscribe('admin:categories:update')
await self.pub_categories.psubscribe("admin:categories:update")
task1 = create_task(self._listen_to_redis_categories())
await self.pub_scheduler.psubscribe('admin:scheduler:json')
await self.pub_scheduler.psubscribe("admin:scheduler:json")
task2 = create_task(self._listen_to_redis_scheduler())
# app['admin'] = self
async def baskets_for_role(self, user: User) -> dict[str, Basket]:
return {
name: basket for name, basket in self.baskets.items()
name: basket
for name, basket in self.baskets.items()
if await basket.allowed_for(user)
}
@ -90,9 +99,9 @@ class AdminManager:
Subscribe the redis sub channel for category updates ("admin:categories:update")
"""
async for msg in self.pub_categories.listen():
if msg['type'] == 'pmessage':
if msg["type"] == "pmessage":
## XXX: Why the name isn't retrieved?
#client = await self.app['store'].pub.client_getname()
# client = await self.app['store'].pub.client_getname()
client = store.uuid
## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@ -100,8 +109,8 @@ class AdminManager:
## !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
## Skip for the process which sent this message actually updated its registry
#breakpoint()
if client != msg['data'].decode():
# breakpoint()
if client != msg["data"].decode():
await registry.make_registry()
async def _listen_to_redis_scheduler(self):
@ -109,8 +118,11 @@ class AdminManager:
Subscribe the redis sub channel for scheduler jobs ("admin:scheduler:json")
"""
async for msg in self.pub_scheduler.listen():
if msg['type'] == 'pmessage':
await live_server._send_to_ws_clients(msg['channel'].decode(), msg['data'].decode())
if msg["type"] == "pmessage":
await live_server._send_to_ws_clients(
msg["channel"].decode(), msg["data"].decode()
)
manager = AdminManager()
manager = AdminManager()