Add basic test
This commit is contained in:
parent
f2b924e9e9
commit
c2a4aaac51
4 changed files with 128 additions and 22 deletions
|
@ -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()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue