Skip to content

Commit e76741e

Browse files
committed
Rename group to role
1 parent 6a26ab0 commit e76741e

20 files changed

+210
-179
lines changed

freenit/api/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import freenit.api.auth
2-
import freenit.api.group
2+
import freenit.api.role
33
import freenit.api.user
44

55
from .router import api

freenit/api/auth.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from freenit.api.router import api
77
from freenit.auth import authorize, decode, encode, encrypt
88
from freenit.config import getConfig
9-
from freenit.models.user import User, UserSafe
9+
from freenit.models.safe import UserSafe
10+
from freenit.models.user import User
1011

1112
config = getConfig()
1213

freenit/api/group.py

-82
This file was deleted.

freenit/api/role.py

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from typing import List, NewType
2+
3+
import ormar
4+
import ormar.exceptions
5+
from fastapi import Depends, HTTPException
6+
7+
from freenit.api.router import route
8+
from freenit.decorators import description
9+
from freenit.models.role import Role, RoleOptional
10+
from freenit.models.safe import RoleSafe, UserSafe
11+
from freenit.models.user import User
12+
from freenit.permissions import role_perms
13+
14+
tags = ["role"]
15+
16+
17+
@route("/roles", tags=tags)
18+
class RoleListAPI:
19+
@staticmethod
20+
@description("Get roles")
21+
async def get(_: User = Depends(role_perms)) -> List[RoleSafe]:
22+
return await Role.objects.select_all().exclude_fields(["password"]).all()
23+
24+
@staticmethod
25+
async def post(role: Role, _: User = Depends(role_perms)) -> RoleSafe:
26+
await role.save()
27+
return role
28+
29+
30+
@route("/roles/{id}", tags=tags)
31+
class RoleDetailAPI:
32+
@staticmethod
33+
async def get(id: int, _: User = Depends(role_perms)) -> RoleSafe:
34+
try:
35+
role = await Role.objects.select_all().get(pk=id)
36+
except ormar.exceptions.NoMatch:
37+
raise HTTPException(status_code=404, detail="No such role")
38+
return role
39+
40+
@staticmethod
41+
async def patch(
42+
id: int, role_data: RoleOptional, _: User = Depends(role_perms)
43+
) -> RoleSafe:
44+
try:
45+
role = await Role.objects.select_all().get(pk=id)
46+
except ormar.exceptions.NoMatch:
47+
raise HTTPException(status_code=404, detail="No such role")
48+
await role.patch(role_data)
49+
return role
50+
51+
@staticmethod
52+
async def delete(id: int, _: User = Depends(role_perms)) -> RoleSafe:
53+
try:
54+
role = await Role.objects.select_all().get(pk=id)
55+
except ormar.exceptions.NoMatch:
56+
raise HTTPException(status_code=404, detail="No such role")
57+
await role.delete()
58+
return role
59+
60+
61+
@route("/roles/{role_id}/{user_id}", tags=tags)
62+
class RoleUserAPI:
63+
@staticmethod
64+
@description("Assign user to role")
65+
async def post(
66+
role_id: int, user_id: int, _: User = Depends(role_perms)
67+
) -> UserSafe:
68+
try:
69+
user = await User.objects.select_all().get(pk=user_id)
70+
except ormar.exceptions.NoMatch:
71+
raise HTTPException(status_code=404, detail="No such user")
72+
for role in user.roles:
73+
if role.id == role_id:
74+
raise HTTPException(status_code=409, detail="User already assigned")
75+
try:
76+
role = await Role.objects.get(pk=role_id)
77+
except ormar.exceptions.NoMatch:
78+
raise HTTPException(status_code=404, detail="No such role")
79+
await user.roles.add(role)
80+
return user

freenit/api/user.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -7,32 +7,35 @@
77
from freenit.api.router import route
88
from freenit.auth import encrypt
99
from freenit.decorators import description
10-
from freenit.models.user import User, UserOptional, UserSafe
10+
from freenit.models.safe import UserSafe
11+
from freenit.models.user import User, UserOptional
1112
from freenit.permissions import profile_perms, user_perms
1213

14+
tags = ["user"]
1315

14-
@route("/users", tags=["user"])
16+
17+
@route("/users", tags=tags)
1518
class UserListAPI:
1619
@staticmethod
1720
@description("Get users")
1821
async def get(_: User = Depends(user_perms)) -> List[UserSafe]:
19-
return await User.objects.all()
22+
return await User.objects.select_all().all()
2023

2124

22-
@route("/users/{id}", tags=["user"])
25+
@route("/users/{id}", tags=tags)
2326
class UserDetailAPI:
2427
@staticmethod
2528
async def get(id: int, _: User = Depends(user_perms)) -> UserSafe:
2629
try:
27-
user = await User.objects.get(pk=id)
30+
user = await User.objects.select_all().get(pk=id)
2831
except ormar.exceptions.NoMatch:
2932
raise HTTPException(status_code=404, detail="No such user")
3033
return user
3134

3235
@staticmethod
3336
async def delete(id: int, _: User = Depends(user_perms)) -> UserSafe:
3437
try:
35-
user = await User.objects.get(pk=id)
38+
user = await User.objects.select_all().get(pk=id)
3639
except ormar.exceptions.NoMatch:
3740
raise HTTPException(status_code=404, detail="No such user")
3841
await user.delete()
@@ -42,16 +45,18 @@ async def delete(id: int, _: User = Depends(user_perms)) -> UserSafe:
4245
@route("/profile", tags=["profile"])
4346
class ProfileDetailAPI:
4447
@staticmethod
45-
@description("Get my user")
48+
@description("Get my profile")
4649
async def get(user: User = Depends(profile_perms)) -> UserSafe:
50+
await user.load_all()
4751
return user
4852

4953
@staticmethod
50-
@description("Edit my user")
54+
@description("Edit my profile")
5155
async def patch(
5256
data: UserOptional, user: User = Depends(profile_perms)
5357
) -> UserSafe:
5458
if data.password:
5559
data.password = encrypt(data.password)
5660
await user.patch(data)
61+
await user.load_all()
5762
return user

freenit/auth.py

+17-14
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,32 @@ def encode(user):
3030
return jwt.encode(payload, config.secret, algorithm="HS256")
3131

3232

33-
async def authorize(request: Request, groups=[], allof=[], cookie="access"):
33+
async def authorize(request: Request, roles=[], allof=[], cookie="access"):
3434
token = request.cookies.get(cookie)
3535
if not token:
3636
raise HTTPException(status_code=403, detail="Unauthorized")
3737
user = await decode(token)
38+
await user.load_all()
3839
if not user.active:
3940
raise HTTPException(status_code=403, detail="Permission denied")
4041
if user.admin:
4142
return user
42-
if user.groupusers is None:
43-
if len(groups) > 0 or len(allof) > 0:
43+
if len(user.roles) == 0:
44+
if len(roles) > 0 or len(allof) > 0:
4445
raise HTTPException(status_code=403, detail="Permission denied")
4546
else:
46-
found = False
47-
for groupuser in user.groupusers:
48-
if groupuser.group.name in groups:
49-
found = True
50-
break
51-
if not found:
52-
raise HTTPException(status_code=403, detail="Permission denied")
53-
for groupuser in user.groupusers:
54-
if groupuser.group.name not in allof:
47+
if len(roles) > 0:
48+
found = False
49+
for role in user.roles:
50+
if role.name in roles:
51+
found = True
52+
break
53+
if not found:
5554
raise HTTPException(status_code=403, detail="Permission denied")
55+
if len(allof) > 0:
56+
for role in user.roles:
57+
if role.name not in allof:
58+
raise HTTPException(status_code=403, detail="Permission denied")
5659
return user
5760

5861

@@ -66,9 +69,9 @@ def encrypt(password):
6669
return pbkdf2_sha256.hash(f"{config.secret}{password}")
6770

6871

69-
def permissions(groups=[], allof=[]):
72+
def permissions(roles=[], allof=[]):
7073
async def handler(request: Request):
71-
user = await authorize(request, groups, allof)
74+
user = await authorize(request, roles, allof)
7275
return user
7376

7477
return handler

freenit/base_config.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def __init__(self, secure=True, expire=hour, refresh_expire=year):
1919

2020

2121
class BaseConfig:
22-
name = "App Name"
22+
name = "Freenit"
2323
version = "0.0.1"
2424
api_root = "/api/v1"
2525
hostname = socket.gethostname()
@@ -31,7 +31,7 @@ class BaseConfig:
3131
engine = None
3232
secret = "SECRET"
3333
user = "freenit.models.ormar.user"
34-
group = "freenit.models.ormar.group"
34+
role = "freenit.models.ormar.role"
3535
meta = None
3636
auth = Auth()
3737

@@ -53,8 +53,8 @@ def __repr__(self):
5353
def get_user(self):
5454
return import_module(self.user)
5555

56-
def get_group(self):
57-
return import_module(self.group)
56+
def get_role(self):
57+
return import_module(self.role)
5858

5959
@classmethod
6060
def envname(cls):

freenit/models/group.py

-8
This file was deleted.

freenit/models/ormar/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,6 @@ class OrmarUserMixin:
2424
admin: bool = ormar.Boolean(default=False)
2525

2626

27-
class OrmarGroupMixin:
27+
class OrmarRoleMixin:
2828
id: int = ormar.Integer(primary_key=True)
2929
name: str = ormar.Text()

freenit/models/ormar/group.py

-27
This file was deleted.

freenit/models/ormar/role.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from freenit.config import getConfig
2+
3+
from ..metaclass import AllOptional
4+
from .base import OrmarBaseModel, OrmarRoleMixin
5+
6+
config = getConfig()
7+
8+
9+
class Role(OrmarBaseModel, OrmarRoleMixin):
10+
class Meta(config.meta):
11+
pass
12+
13+
14+
class RoleOptional(Role, metaclass=AllOptional):
15+
pass

0 commit comments

Comments
 (0)