felicity-lims/felicity/init/setup/groups_perms.py

246 lines
6.5 KiB
Python
Raw Normal View History

2021-12-23 16:53:53 +08:00
import logging
from felicity.apps.user import models, schemas
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:
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,
2023-12-30 19:42:48 +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: {
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,
],
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
async def create_groups() -> None:
logger.info("Setting up groups .....")
2021-04-18 18:37:49 +08:00
for _grp in groups:
2022-03-06 02:06:07 +08:00
exists = await models.Group.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)
await models.Group.create(schema)
2021-04-18 18:37:49 +08:00
async def create_permissions() -> None:
logger.info("Setting up permissions .....")
2021-10-29 07:18:28 +08:00
for _perm in get_action_targets():
2022-03-06 02:06:07 +08:00
permission = await models.Permission.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])
await models.Permission.create(schema)
2022-03-06 02:06:07 +08:00
async def set_default_group_permissions() -> None:
logger.info("Setting up default group permissions .....")
2022-03-06 02:06:07 +08:00
for action, objects in permissions.items():
for obj, roles in objects.items():
permission = await models.Permission.get(
action__exact=action, target__exact=obj
)
for role in roles:
group: models.Group = await models.Group.get(name=role)
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"
await group.save()
async def setup_default_permissions() -> None:
await create_groups()
await create_permissions()
await set_default_group_permissions()