4
from typing import Optional, Any
6
from jinja2_fragments import render_block
7
from pydantic import BaseModel
10
from core.frontend.enviroment import environment
11
from core.frontend.types import MethodType, ViewVars
16
vars: Optional[dict] = None
22
- as_update - виджет поля как редактируемого
23
- as_get - виджет поля как просмотра
24
- as_table_update - виджет как таблица (доступен только для list_rel) полей
25
- as_table_get - виджет как таблица (доступен только для list_rel) полей
32
enums: Optional[Any] = None
35
is_filter: bool = False
36
is_reserved: bool = False
44
def copy(self) -> 'Field':
45
instance = copy.copy(self)
49
def __init__(self, *args, **kwargs):
50
self.__dict__.update(kwargs)
54
"""Отдает уникальный идентификатор для поля"""
55
if self.field_name == 'quantity':
59
return f'{self.cls.p.key}--{self.field_name}'
61
def render(self, block_name: str, type: str = '', method: MethodType=MethodType.GET) -> str:
62
"""Метод рендера шаблона"""
63
type = type or self.type
64
rendered_html = render_block(
65
environment=environment,
66
template_name=f'field/{type}.html',
67
block_name=block_name,
74
def label(self) -> str:
75
"""Отдать Label for шаблон для поля"""
77
environment=environment,
78
template_name=f'field/label.html',
84
def as_update(self) -> str:
85
"""Отобразить поле с возможностью редактирования"""
86
return self.render(block_name='as_update', method=MethodType.UPDATE)
89
def as_create(self) -> str:
90
"""Отобразить поле с возможностью редактирования"""
91
return self.render(block_name='as_create', method=MethodType.CREATE)
94
def as_get(self) -> str:
95
"""Отобразить поле только на чтение"""
96
return self.render(block_name='as_get')
99
def as_table_get(self) -> str:
100
"""Отобразить поле как Таблицу (Если поле является list_rel)"""
102
environment=environment,
103
template_name=f'cls/table.html',
104
block_name='as_table',
105
method=MethodType.GET,
110
def as_table_update(self) -> str:
111
"""Отобразить поле как Таблицу на редактирование (Если поле является list_rel)"""
112
block_name = 'as_table'
114
environment=environment,
115
template_name=f'cls/table.html',
116
block_name=block_name,
117
method=MethodType.UPDATE,
121
def filter_as_string(self) -> str:
122
"""Костыльная утилита, что бы в js передать фильтр"""
123
return self.update.get('filter')
127
"""Обертка для удобства, что бы с полями работать как с обьектом"""
131
def __setattr__(self, key, value):
132
super().__setattr__(key, value)
135
self._fields = [i for i in self.__dict__.values() if isinstance(i, Field)]
139
"""Если использовать конструктор как итератор, то он будет возвращать строки"""
141
field = self._fields[self.__state]
148
def get_fields(self):
149
return {i.field_name: i for i in self._fields}.items()