-
Notifications
You must be signed in to change notification settings - Fork 52
/
Copy pathfeatures.py
137 lines (112 loc) · 3.4 KB
/
features.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
from typing import List
from fastapi import APIRouter, Depends, Request
from fastapi.responses import HTMLResponse
from sqlalchemy.sql import exists
from starlette.responses import PlainTextResponse
from app.database.models import Feature, User, UserFeature
from app.dependencies import SessionLocal, get_db, templates
from app.internal.features import (
create_user_feature_association,
get_user_installed_features,
get_user_uninstalled_features,
is_user_has_feature,
remove_follower,
)
from app.internal.security.dependencies import current_user
router = APIRouter(
prefix="/features",
tags=["features"],
responses={404: {"description": "Not found"}},
)
@router.get("/")
async def index(
request: Request,
session: SessionLocal = Depends(get_db),
user: User = Depends(current_user),
) -> templates:
features = {
"installed": get_user_installed_features(
session=session,
user_id=user.user_id,
),
"uninstalled": get_user_uninstalled_features(
session=session,
user_id=user.user_id,
),
}
return templates.TemplateResponse(
"features.html",
{"request": request, "features": features},
)
@router.post("/add")
async def add_feature_to_user(
request: Request,
session: SessionLocal = Depends(get_db),
user: User = Depends(current_user),
) -> bool:
form = await request.form()
feat = session.query(
exists().where(Feature.id == form["feature_id"]),
).scalar()
is_exist = is_user_has_feature(
session=session,
feature_id=form["feature_id"],
user_id=user.user_id,
)
if not feat or is_exist:
# in case there is no feature in the database with that same id
# and or the association is exist
return False
create_user_feature_association(
db=session,
feature_id=form["feature_id"],
user_id=user.user_id,
is_enable=True,
)
return is_user_has_feature(
session=session,
feature_id=form["feature_id"],
user_id=user.user_id,
)
@router.post("/delete")
async def delete_user_feature_association(
request: Request,
session: SessionLocal = Depends(get_db),
user: User = Depends(current_user),
) -> bool:
form = await request.form()
feature_id = int(form["feature_id"])
is_exist = is_user_has_feature(
session=session,
feature_id=feature_id,
user_id=user.user_id,
)
if not is_exist:
return False
remove_follower(feature_id=feature_id, session=session)
session.query(UserFeature).filter_by(
feature_id=feature_id,
user_id=user.user_id,
).delete()
session.commit()
return True
@router.get("/installed")
async def get_user_feature(
request: Request,
session: SessionLocal = Depends(get_db),
user: User = Depends(current_user),
) -> List[Feature]:
return get_user_installed_features(user_id=user.user_id, session=session)
@router.post("/settings/{template}")
async def render_settings(
request: Request,
template: str,
) -> HTMLResponse:
if template == 'null':
return PlainTextResponse(
content='No additional settings for this one :)')
template = templates.get_template(
"partials/features_panels/" + template + '.html'
)
content = template.render()
return HTMLResponse(content=content)