lavkach3

Форк
0
170 строк · 7.0 Кб
1
import uuid
2
from collections import defaultdict
3
from lib2to3.fixes.fix_input import context
4
from typing import Optional
5

6
from fastapi import APIRouter, Query
7
from fastapi import Request
8
from fastapi.responses import HTMLResponse
9
from pydantic import BaseModel
10
from starlette.responses import RedirectResponse
11
from starlette.websockets import WebSocket
12
from urllib3 import request
13

14
from app.front.apps.basic.company.company import company
15
from app.front.template_spec import templates
16
from app.front.utills import BasePermit
17
from distributed_websocket import WebSocketProxy
18

19
from app.front.front_config import config
20

21

22
class ExceptionResponseSchema(BaseModel):
23
    error: str
24

25

26
index_router = APIRouter(
27
    responses={"400": {"model": ExceptionResponseSchema}},
28
)
29

30

31
@index_router.get("/front/topbar_vertical", response_class=HTMLResponse)
32
async def topbar(request: Request):
33
    return templates.TemplateResponse(request, 'partials/topbar_vertical.html', context={})
34

35

36
@index_router.get("/front/topbar_horizontal", response_class=HTMLResponse)
37
async def topbar(request: Request):
38
    return templates.TemplateResponse(request, 'partials/topbar_horizontal.html', context={})
39

40

41
@index_router.get("/front/theme_editor", response_class=HTMLResponse)
42
async def topbar(request: Request):
43
    return templates.TemplateResponse(request, 'partials/theme_editor.html', context={})
44

45

46
@index_router.get("/front/search_bar", response_class=HTMLResponse)
47
async def topbar(request: Request):
48
    return templates.TemplateResponse(request, 'partials/search_bar.html', context={})
49

50

51
@index_router.get("/front/sidebar_vertical", response_class=HTMLResponse)
52
async def sidebar(request: Request):
53
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
54
    admin_nav = {}
55
    env = request.scope['env']
56
    for domain_name, domain in env.domains.items():
57
        model_list = {}
58
        for model_name, model in domain.models.items():
59
            model_list.update({
60
                model_name: f'/{domain_name}/{model_name}',
61
            })
62
        admin_nav.update({
63
            domain_name: model_list
64
        })
65
    return templates.TemplateResponse(request, 'partials/sidebar_vertical.html',
66
                                      context={'nav': admin_nav})
67

68

69
@index_router.get("/front/sidebar_horizontal", response_class=HTMLResponse)
70
async def sidebar(request: Request):
71
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
72
    return templates.TemplateResponse(request, 'partials/sidebar_horizontal.html')
73

74

75
@index_router.get("/front/sidebar", response_class=HTMLResponse)
76
async def sidebar(request: Request):
77
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
78
    return templates.TemplateResponse(request, 'partials/sidebar.html')
79

80

81
@index_router.get("/front/sidebar_scroll", response_class=HTMLResponse)
82
async def sidebar(request: Request):
83
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
84
    return templates.TemplateResponse(request, 'partials/sidebar_scroll.html')
85

86

87
@index_router.get("/front/search_bar", response_class=HTMLResponse)
88
async def sidebar(request: Request):
89
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
90
    return templates.TemplateResponse(request, 'partials/search_bar.html')
91

92

93
@index_router.get("/front/theme_editor", response_class=HTMLResponse)
94
async def sidebar(request: Request):
95
    """Строит левое меню Админки, на базе tags в роутах и пермишенах Пользователя"""
96
    return templates.TemplateResponse(request, 'partials/theme_editor.html')
97

98

99
@index_router.get("/", response_class=HTMLResponse)
100
async def root_page(request: Request):
101
    return templates.TemplateResponse(request, 'index-full.html')
102

103

104
async def get_user_companies(request: Request) -> dict:
105
    async with request.scope['env']['company'].adapter as a:
106
        res = await a.list(params={'id__in': request.user.company_ids})
107
        companies = {i['id']: i for i in res['data']}
108
        company = companies.get(request.user.company_id.__str__())
109
        companies.pop(request.user.company_id.__str__())
110
    return {
111
        'companies': companies,
112
        'company': company
113
    }
114

115

116
@index_router.get("/front/company_changer_widget", response_class=HTMLResponse)
117
async def company_changer_widget(request: Request) -> dict:
118
    data = await get_user_companies(request)
119
    return templates.TemplateResponse(request, 'widgets/widget_company_changer.html', context=data)
120

121

122
class CompanyId(BaseModel):
123
    company_id: uuid.UUID
124

125

126
@index_router.post("/front/company_changer_widget", response_class=HTMLResponse)
127
async def company_changer_widget(request: Request, schema: CompanyId) -> dict:
128
    async with request.scope['env']['user'].adapter as a:
129
        data = await a.user_company_change(user_id=request.user.user_id,
130
                                           company_id=schema.company_id)
131
    data = await get_user_companies(request)
132
    return templates.TemplateResponse(request, 'widgets/widget_company_changer.html', context=data)
133

134

135
# @index_router.get("/basic/dropdown-ids", response_class=HTMLResponse)
136
# async def dropdown_ids(request: Request, module: str, model: str, id: str, itemlink: str,
137
#                        is_named=False) -> dict:
138
#     """
139
#      Виджет на вход получает модуль-модель-ид- и обратную ссылку если нужно, если нет будет /module/model/{id}
140
#      _named означает, что так же будет отдат name для отрисовки на тайтле кнопки
141
#     """
142
#     data = await request.scope['env']['company'].adapter.dropdown_ids(model, id, itemlink, is_named)
143
#     return templates.TemplateResponse(request, 'widgets/dropdown-ids-named-htmx.html', context=data)
144

145
@index_router.get("/front/widget_locale_changer", response_class=HTMLResponse)
146
async def company_changer_widget(request: Request, locale: str=None) -> dict:
147
    locales = {
148
        'current_locale': locale or request.cookies.get('locale') or request.user.locale,
149
        'locales': [
150
            'en',
151
            'ru',
152
            'sa'
153
        ]
154
    }
155
    if locale and locale != request.user.locale:
156
        async with request.scope['env']['user'].adapter as a:
157
            await a.user_locale_change(user_id=request.user.user_id, locale=locale)
158
    return templates.TemplateResponse(
159
        request,
160
        'widgets/widget_locale_changer.html',
161
        context=locales
162
    )
163

164

165
@index_router.get("/front/widget_user_profile", response_class=HTMLResponse)
166
async def widget_user_profile(request: Request) -> dict:
167
    return templates.TemplateResponse(
168
        request,
169
        'widgets/widget_user_profile.html'
170
    )
171

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.