felicity-lims/felicity/lims/seeds/groups_perms.py

256 lines
6.8 KiB
Python
Raw Normal View History

2021-12-23 16:53:53 +08:00
import logging
2024-07-24 04:30:01 +08:00
from felicity.apps.user import entities, schemas
from felicity.apps.user.services import GroupService, PermissionService
2024-07-24 17:04:53 +08:00
from felicity.apps.common.utils.serializer import marshaller
2021-04-18 18:37:49 +08:00
2021-12-23 16:53:53 +08:00
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
2021-10-29 07:18:28 +08:00
2021-11-08 01:01:12 +08:00
class FGroup: # (KEYWORD, NAME)
2022-03-06 02:06:07 +08:00
ADMINISTRATOR = "ADMINISTRATOR"
LAB_MANAGER = "LAB_MANAGER"
SCIENTIST = "SCIENTIST"
TECHNOLOGIST = "TECHNOLOGIST"
LAB_HAND = "LABORATORY HAND"
GUEST = "GUEST"
STORES = "STORES"
2023-12-30 19:42:48 +08:00
ACCOUNTING = "ACCOUNTING"
2021-10-29 07:18:28 +08:00
class FObject:
2024-04-12 23:14:48 +08:00
ANALYTICS = "ANALYTICS"
2023-04-10 19:38:06 +08:00
CLIENT = "CLIENT"
PATIENT = "PATIENT"
SAMPLE = "SAMPLE"
2022-04-10 19:22:16 +08:00
RESULT = "RESULT"
WORKSHEET = "WORKSHEET"
PRODUCT = "PRODUCT"
SHIPMENT = "SHIPMENT"
STORAGE = "STORAGE"
2023-12-30 19:42:48 +08:00
NOTICE = "NOTICE"
BILLING = "BILLING"
2021-10-29 07:18:28 +08:00
class FAction:
CREATE = "CREATE"
READ = "READ"
UPDATE = "UPDATE"
DELETE = "DELETE"
2021-10-29 07:18:28 +08:00
SUBMIT = "SUBMIT"
VERIFY = "VERIFY"
CANCEL = "CANCEL"
INVALIDATE = "INVALIDATE"
REJECT = "REJECT"
RETEST = "RETEST"
ORDER = "ORDER"
ISSUE = "ISSUE"
2021-10-29 07:18:28 +08:00
fg = FGroup()
fo = FObject()
fa = FAction()
2021-04-18 18:37:49 +08:00
groups = [
2021-10-29 07:18:28 +08:00
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.LAB_HAND,
fg.GUEST,
fg.STORES,
2024-02-16 23:48:19 +08:00
fg.ACCOUNTING,
2021-04-18 18:37:49 +08:00
]
2021-10-29 07:18:28 +08:00
# default permissions
permissions = {
fa.CREATE: {
2023-04-10 19:38:06 +08:00
fo.CLIENT: [fg.ADMINISTRATOR],
2022-03-06 02:06:07 +08:00
fo.PATIENT: [fg.LAB_HAND],
fo.SAMPLE: [fg.LAB_HAND],
fo.WORKSHEET: [fg.SCIENTIST, fg.TECHNOLOGIST],
fo.PRODUCT: [fg.STORES],
fo.SHIPMENT: [fg.LAB_HAND, fg.SCIENTIST, fg.TECHNOLOGIST],
fo.STORAGE: [
fg.ADMINISTRATOR,
fg.STORES,
fg.LAB_HAND,
fg.SCIENTIST,
fg.TECHNOLOGIST,
],
2021-10-29 07:18:28 +08:00
},
fa.READ: {
2024-04-12 23:14:48 +08:00
fo.ANALYTICS: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.LAB_HAND,
fg.GUEST,
],
2023-04-10 19:38:06 +08:00
fo.CLIENT: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.LAB_HAND,
fg.GUEST,
],
fo.PATIENT: [
2022-03-06 02:06:07 +08:00
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.LAB_HAND,
fg.GUEST,
],
fo.SAMPLE: [
2022-03-06 02:06:07 +08:00
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.LAB_HAND,
fg.GUEST,
],
2022-04-10 19:22:16 +08:00
fo.RESULT: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.GUEST,
],
fo.WORKSHEET: [
2022-03-06 02:06:07 +08:00
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.GUEST,
],
fo.PRODUCT: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.GUEST,
fg.STORES,
],
fo.SHIPMENT: [fg.LAB_HAND, fg.SCIENTIST, fg.TECHNOLOGIST, fg.GUEST],
fo.STORAGE: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.GUEST,
fg.STORES,
],
2021-10-29 07:18:28 +08:00
},
fa.UPDATE: {
2023-04-10 19:38:06 +08:00
fo.CLIENT: [fg.ADMINISTRATOR],
2022-03-06 02:06:07 +08:00
fo.PATIENT: [fg.LAB_HAND],
fo.SAMPLE: [fg.LAB_HAND],
2022-04-10 19:22:16 +08:00
fo.RESULT: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-03-06 02:06:07 +08:00
fo.WORKSHEET: [fg.SCIENTIST, fg.TECHNOLOGIST],
fo.PRODUCT: [fg.STORES],
fo.SHIPMENT: [fg.LAB_HAND, fg.SCIENTIST, fg.TECHNOLOGIST],
fo.STORAGE: [
fg.ADMINISTRATOR,
fg.STORES,
fg.LAB_HAND,
fg.SCIENTIST,
fg.TECHNOLOGIST,
],
2023-12-30 19:42:48 +08:00
fo.NOTICE: [
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.STORES,
],
2024-02-16 23:48:19 +08:00
fo.BILLING: [fg.ACCOUNTING],
2021-10-29 07:18:28 +08:00
},
fa.SUBMIT: {
2022-03-06 02:06:07 +08:00
fo.SAMPLE: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-04-10 19:22:16 +08:00
fo.RESULT: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-03-06 02:06:07 +08:00
fo.WORKSHEET: [fg.SCIENTIST, fg.TECHNOLOGIST],
2021-10-29 07:18:28 +08:00
},
fa.VERIFY: {
2022-03-06 02:06:07 +08:00
fo.SAMPLE: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-04-10 19:22:16 +08:00
fo.RESULT: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-03-06 02:06:07 +08:00
fo.WORKSHEET: [fg.SCIENTIST, fg.TECHNOLOGIST],
2021-10-29 07:18:28 +08:00
},
2022-04-10 19:22:16 +08:00
fa.CANCEL: {
fo.SAMPLE: [fg.SCIENTIST, fg.TECHNOLOGIST, fg.LAB_HAND],
fo.RESULT: [fg.SCIENTIST, fg.TECHNOLOGIST],
fo.SHIPMENT: [fg.LAB_HAND, fg.SCIENTIST, fg.TECHNOLOGIST],
2022-04-10 19:22:16 +08:00
},
2021-10-29 07:18:28 +08:00
fa.RETEST: {
2022-03-06 02:06:07 +08:00
fo.SAMPLE: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-04-10 19:22:16 +08:00
fo.RESULT: [fg.SCIENTIST, fg.TECHNOLOGIST],
2022-03-06 02:06:07 +08:00
fo.WORKSHEET: [fg.SCIENTIST, fg.TECHNOLOGIST],
2021-10-29 07:18:28 +08:00
},
2022-11-06 20:09:44 +08:00
fa.INVALIDATE: {fo.SAMPLE: [fg.SCIENTIST, fg.TECHNOLOGIST]},
fa.ISSUE: {
fo.PRODUCT: [fg.STORES],
},
fa.ORDER: {
fo.PRODUCT: [
fg.ADMINISTRATOR,
fg.LAB_MANAGER,
fg.SCIENTIST,
fg.TECHNOLOGIST,
fg.STORES,
],
},
2021-10-29 07:18:28 +08:00
}
def get_action_targets(): # e.g ('verify', 'worksheet'),
final = []
for a_key, action in permissions.items():
for o_key, obj in action.items():
final.append((a_key, o_key))
return final
2021-04-18 18:37:49 +08:00
2024-01-28 21:17:16 +08:00
async def seed_groups() -> None:
logger.info("Setting up groups .....")
2024-07-24 04:30:01 +08:00
group_service = GroupService()
2021-04-18 18:37:49 +08:00
for _grp in groups:
2024-07-24 04:30:01 +08:00
exists = await group_service.get(name=_grp)
2021-04-18 18:37:49 +08:00
if not exists:
2022-03-06 02:06:07 +08:00
schema = schemas.GroupCreate(name=_grp, keyword=_grp)
2024-07-24 04:30:01 +08:00
await group_service.create(schema)
2021-04-18 18:37:49 +08:00
2024-01-28 21:17:16 +08:00
async def seed_permissions() -> None:
logger.info("Setting up permissions .....")
2024-07-24 04:30:01 +08:00
permission_service = PermissionService()
2021-10-29 07:18:28 +08:00
for _perm in get_action_targets():
2024-07-24 04:30:01 +08:00
permission = await permission_service.get(
action__exact=_perm[0], target__exact=_perm[1]
)
2022-03-06 02:06:07 +08:00
if not permission:
2021-04-18 18:37:49 +08:00
schema = schemas.PermissionCreate(action=_perm[0], target=_perm[1])
2024-07-24 04:30:01 +08:00
await permission_service.create(schema)
2022-03-06 02:06:07 +08:00
2024-01-28 21:17:16 +08:00
async def seed_group_permissions_defaults() -> None:
logger.info("Setting up default group permissions .....")
2024-07-24 04:30:01 +08:00
permission_service = PermissionService()
group_service = GroupService()
2022-03-06 02:06:07 +08:00
for action, objects in permissions.items():
for obj, roles in objects.items():
2024-07-24 04:30:01 +08:00
permission = await permission_service.get(
2022-03-06 02:06:07 +08:00
action__exact=action, target__exact=obj
)
for role in roles:
2024-07-24 04:30:01 +08:00
group= await group_service.get(name=role)
2022-03-06 02:06:07 +08:00
if permission.uid not in [p.uid for p in group.permissions]:
group.permissions.append(permission)
group.pages = "DASHBOARD"
if group.name == FGroup.ADMINISTRATOR:
group.pages += ", ADMINISTRATION"
2024-07-24 17:04:53 +08:00
await group_service.save(group)