Skip to content

Commit ed59622

Browse files
committed
moves users
1 parent b4f6ce1 commit ed59622

File tree

4 files changed

+144
-138
lines changed

4 files changed

+144
-138
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
from enum import Enum
2+
from functools import total_ordering
3+
4+
_USER_ROLE_TO_LEVEL = {
5+
"ANONYMOUS": 0,
6+
"GUEST": 10,
7+
"USER": 20,
8+
"TESTER": 30,
9+
"PRODUCT_OWNER": 40,
10+
"ADMIN": 100,
11+
}
12+
13+
14+
@total_ordering
15+
class UserRole(Enum):
16+
"""SORTED enumeration of user roles
17+
18+
A role defines a set of privileges the user can perform
19+
Roles are sorted from lower to highest privileges
20+
USER is the role assigned by default A user with a higher/lower role is denoted super/infra user
21+
22+
ANONYMOUS : The user is not logged in
23+
GUEST : Temporary user with very limited access. Main used for demos and for a limited amount of time
24+
USER : Registered user. Basic permissions to use the platform [default]
25+
TESTER : Upgraded user. First level of super-user with privileges to test the framework.
26+
Can use everything but does not have an effect in other users or actual data
27+
ADMIN : Framework admin.
28+
29+
See security_access.py
30+
"""
31+
32+
ANONYMOUS = "ANONYMOUS"
33+
GUEST = "GUEST"
34+
USER = "USER"
35+
TESTER = "TESTER"
36+
PRODUCT_OWNER = "PRODUCT_OWNER"
37+
ADMIN = "ADMIN"
38+
39+
@property
40+
def privilege_level(self) -> int:
41+
return _USER_ROLE_TO_LEVEL[self.name]
42+
43+
def __lt__(self, other: "UserRole") -> bool:
44+
if self.__class__ is other.__class__:
45+
return self.privilege_level < other.privilege_level
46+
return NotImplemented
47+
48+
49+
class UserStatus(str, Enum):
50+
# This is a transition state. The user is registered but not confirmed. NOTE that state is optional depending on LOGIN_REGISTRATION_CONFIRMATION_REQUIRED
51+
CONFIRMATION_PENDING = "CONFIRMATION_PENDING"
52+
# This user can now operate the platform
53+
ACTIVE = "ACTIVE"
54+
# This user is inactive because it expired after a trial period
55+
EXPIRED = "EXPIRED"
56+
# This user is inactive because he has been a bad boy
57+
BANNED = "BANNED"
58+
# This user is inactive because it was marked for deletion
59+
DELETED = "DELETED"
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# pylint: disable=no-value-for-parameter
2+
# pylint: disable=redefined-outer-name
3+
# pylint: disable=unused-argument
4+
# pylint: disable=unused-variable
5+
6+
7+
from common_library.users_enums import _USER_ROLE_TO_LEVEL, UserRole
8+
9+
10+
def test_user_role_to_level_map_in_sync():
11+
# If fails, then update _USER_ROLE_TO_LEVEL map
12+
assert set(_USER_ROLE_TO_LEVEL.keys()) == set(UserRole.__members__.keys())
13+
14+
15+
def test_user_roles_compares_to_admin():
16+
assert UserRole.ANONYMOUS < UserRole.ADMIN
17+
assert UserRole.GUEST < UserRole.ADMIN
18+
assert UserRole.USER < UserRole.ADMIN
19+
assert UserRole.TESTER < UserRole.ADMIN
20+
assert UserRole.PRODUCT_OWNER < UserRole.ADMIN
21+
assert UserRole.ADMIN == UserRole.ADMIN
22+
23+
24+
def test_user_roles_compares_to_product_owner():
25+
assert UserRole.ANONYMOUS < UserRole.PRODUCT_OWNER
26+
assert UserRole.GUEST < UserRole.PRODUCT_OWNER
27+
assert UserRole.USER < UserRole.PRODUCT_OWNER
28+
assert UserRole.TESTER < UserRole.PRODUCT_OWNER
29+
assert UserRole.PRODUCT_OWNER == UserRole.PRODUCT_OWNER
30+
assert UserRole.ADMIN > UserRole.PRODUCT_OWNER
31+
32+
33+
def test_user_roles_compares_to_tester():
34+
assert UserRole.ANONYMOUS < UserRole.TESTER
35+
assert UserRole.GUEST < UserRole.TESTER
36+
assert UserRole.USER < UserRole.TESTER
37+
assert UserRole.TESTER == UserRole.TESTER
38+
assert UserRole.PRODUCT_OWNER > UserRole.TESTER
39+
assert UserRole.ADMIN > UserRole.TESTER
40+
41+
42+
def test_user_roles_compares_to_user():
43+
assert UserRole.ANONYMOUS < UserRole.USER
44+
assert UserRole.GUEST < UserRole.USER
45+
assert UserRole.USER == UserRole.USER
46+
assert UserRole.TESTER > UserRole.USER
47+
assert UserRole.PRODUCT_OWNER > UserRole.USER
48+
assert UserRole.ADMIN > UserRole.USER
49+
50+
51+
def test_user_roles_compares_to_guest():
52+
assert UserRole.ANONYMOUS < UserRole.GUEST
53+
assert UserRole.GUEST == UserRole.GUEST
54+
assert UserRole.USER > UserRole.GUEST
55+
assert UserRole.TESTER > UserRole.GUEST
56+
assert UserRole.PRODUCT_OWNER > UserRole.GUEST
57+
assert UserRole.ADMIN > UserRole.GUEST
58+
59+
60+
def test_user_roles_compares_to_anonymous():
61+
assert UserRole.ANONYMOUS == UserRole.ANONYMOUS
62+
assert UserRole.GUEST > UserRole.ANONYMOUS
63+
assert UserRole.USER > UserRole.ANONYMOUS
64+
assert UserRole.TESTER > UserRole.ANONYMOUS
65+
assert UserRole.PRODUCT_OWNER > UserRole.ANONYMOUS
66+
assert UserRole.ADMIN > UserRole.ANONYMOUS
67+
68+
69+
def test_user_roles_compares():
70+
# < and >
71+
assert UserRole.TESTER < UserRole.ADMIN
72+
assert UserRole.ADMIN > UserRole.TESTER
73+
74+
# >=, == and <=
75+
assert UserRole.TESTER <= UserRole.ADMIN
76+
assert UserRole.ADMIN >= UserRole.TESTER
77+
78+
assert UserRole.ADMIN <= UserRole.ADMIN
79+
assert UserRole.ADMIN == UserRole.ADMIN

packages/postgres-database/src/simcore_postgres_database/models/users.py

Lines changed: 5 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,14 @@
1-
from enum import Enum
2-
from functools import total_ordering
3-
41
import sqlalchemy as sa
2+
from common_library.users_enums import UserRole, UserStatus
53
from sqlalchemy.sql import expression
64

75
from ._common import RefActions
86
from .base import metadata
97

10-
_USER_ROLE_TO_LEVEL = {
11-
"ANONYMOUS": 0,
12-
"GUEST": 10,
13-
"USER": 20,
14-
"TESTER": 30,
15-
"PRODUCT_OWNER": 40,
16-
"ADMIN": 100,
17-
}
18-
19-
20-
@total_ordering
21-
class UserRole(Enum):
22-
"""SORTED enumeration of user roles
23-
24-
A role defines a set of privileges the user can perform
25-
Roles are sorted from lower to highest privileges
26-
USER is the role assigned by default A user with a higher/lower role is denoted super/infra user
27-
28-
ANONYMOUS : The user is not logged in
29-
GUEST : Temporary user with very limited access. Main used for demos and for a limited amount of time
30-
USER : Registered user. Basic permissions to use the platform [default]
31-
TESTER : Upgraded user. First level of super-user with privileges to test the framework.
32-
Can use everything but does not have an effect in other users or actual data
33-
ADMIN : Framework admin.
34-
35-
See security_access.py
36-
"""
37-
38-
ANONYMOUS = "ANONYMOUS"
39-
GUEST = "GUEST"
40-
USER = "USER"
41-
TESTER = "TESTER"
42-
PRODUCT_OWNER = "PRODUCT_OWNER"
43-
ADMIN = "ADMIN"
44-
45-
@property
46-
def privilege_level(self) -> int:
47-
return _USER_ROLE_TO_LEVEL[self.name]
48-
49-
def __lt__(self, other: "UserRole") -> bool:
50-
if self.__class__ is other.__class__:
51-
return self.privilege_level < other.privilege_level
52-
return NotImplemented
53-
54-
55-
class UserStatus(str, Enum):
56-
# This is a transition state. The user is registered but not confirmed. NOTE that state is optional depending on LOGIN_REGISTRATION_CONFIRMATION_REQUIRED
57-
CONFIRMATION_PENDING = "CONFIRMATION_PENDING"
58-
# This user can now operate the platform
59-
ACTIVE = "ACTIVE"
60-
# This user is inactive because it expired after a trial period
61-
EXPIRED = "EXPIRED"
62-
# This user is inactive because he has been a bad boy
63-
BANNED = "BANNED"
64-
# This user is inactive because it was marked for deletion
65-
DELETED = "DELETED"
66-
8+
__all__: tuple[str, ...] = (
9+
"UserRole",
10+
"UserStatus",
11+
)
6712

6813
users = sa.Table(
6914
"users",

packages/postgres-database/tests/test_users.py

Lines changed: 1 addition & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,7 @@
1212
from faker import Faker
1313
from pytest_simcore.helpers.faker_factories import random_user
1414
from simcore_postgres_database.errors import InvalidTextRepresentation, UniqueViolation
15-
from simcore_postgres_database.models.users import (
16-
_USER_ROLE_TO_LEVEL,
17-
UserRole,
18-
UserStatus,
19-
users,
20-
)
15+
from simcore_postgres_database.models.users import UserRole, UserStatus, users
2116
from simcore_postgres_database.utils_users import (
2217
UsersRepo,
2318
_generate_random_chars,
@@ -26,78 +21,6 @@
2621
from sqlalchemy.sql import func
2722

2823

29-
def test_user_role_to_level_map_in_sync():
30-
# If fails, then update _USER_ROLE_TO_LEVEL map
31-
assert set(_USER_ROLE_TO_LEVEL.keys()) == set(UserRole.__members__.keys())
32-
33-
34-
def test_user_roles_compares_to_admin():
35-
assert UserRole.ANONYMOUS < UserRole.ADMIN
36-
assert UserRole.GUEST < UserRole.ADMIN
37-
assert UserRole.USER < UserRole.ADMIN
38-
assert UserRole.TESTER < UserRole.ADMIN
39-
assert UserRole.PRODUCT_OWNER < UserRole.ADMIN
40-
assert UserRole.ADMIN == UserRole.ADMIN
41-
42-
43-
def test_user_roles_compares_to_product_owner():
44-
assert UserRole.ANONYMOUS < UserRole.PRODUCT_OWNER
45-
assert UserRole.GUEST < UserRole.PRODUCT_OWNER
46-
assert UserRole.USER < UserRole.PRODUCT_OWNER
47-
assert UserRole.TESTER < UserRole.PRODUCT_OWNER
48-
assert UserRole.PRODUCT_OWNER == UserRole.PRODUCT_OWNER
49-
assert UserRole.ADMIN > UserRole.PRODUCT_OWNER
50-
51-
52-
def test_user_roles_compares_to_tester():
53-
assert UserRole.ANONYMOUS < UserRole.TESTER
54-
assert UserRole.GUEST < UserRole.TESTER
55-
assert UserRole.USER < UserRole.TESTER
56-
assert UserRole.TESTER == UserRole.TESTER
57-
assert UserRole.PRODUCT_OWNER > UserRole.TESTER
58-
assert UserRole.ADMIN > UserRole.TESTER
59-
60-
61-
def test_user_roles_compares_to_user():
62-
assert UserRole.ANONYMOUS < UserRole.USER
63-
assert UserRole.GUEST < UserRole.USER
64-
assert UserRole.USER == UserRole.USER
65-
assert UserRole.TESTER > UserRole.USER
66-
assert UserRole.PRODUCT_OWNER > UserRole.USER
67-
assert UserRole.ADMIN > UserRole.USER
68-
69-
70-
def test_user_roles_compares_to_guest():
71-
assert UserRole.ANONYMOUS < UserRole.GUEST
72-
assert UserRole.GUEST == UserRole.GUEST
73-
assert UserRole.USER > UserRole.GUEST
74-
assert UserRole.TESTER > UserRole.GUEST
75-
assert UserRole.PRODUCT_OWNER > UserRole.GUEST
76-
assert UserRole.ADMIN > UserRole.GUEST
77-
78-
79-
def test_user_roles_compares_to_anonymous():
80-
assert UserRole.ANONYMOUS == UserRole.ANONYMOUS
81-
assert UserRole.GUEST > UserRole.ANONYMOUS
82-
assert UserRole.USER > UserRole.ANONYMOUS
83-
assert UserRole.TESTER > UserRole.ANONYMOUS
84-
assert UserRole.PRODUCT_OWNER > UserRole.ANONYMOUS
85-
assert UserRole.ADMIN > UserRole.ANONYMOUS
86-
87-
88-
def test_user_roles_compares():
89-
# < and >
90-
assert UserRole.TESTER < UserRole.ADMIN
91-
assert UserRole.ADMIN > UserRole.TESTER
92-
93-
# >=, == and <=
94-
assert UserRole.TESTER <= UserRole.ADMIN
95-
assert UserRole.ADMIN >= UserRole.TESTER
96-
97-
assert UserRole.ADMIN <= UserRole.ADMIN
98-
assert UserRole.ADMIN == UserRole.ADMIN
99-
100-
10124
@pytest.fixture
10225
async def clean_users_db_table(connection: SAConnection):
10326
yield

0 commit comments

Comments
 (0)