lavkach3

Форк
0
149 строк · 5.2 Кб
1
import copy
2
import json
3
from enum import Enum
4
from typing import Optional, Any
5

6
from jinja2_fragments import render_block
7
from pydantic import BaseModel
8

9

10
from core.frontend.enviroment import environment
11
from core.frontend.types import MethodType, ViewVars
12

13

14
class FieldFields:
15
    model_name: str  # Имя поля
16
    vars: Optional[dict] = None  # Переменные если нужно передать контекст
17

18

19
class Field:
20
    """
21
        Описание поля
22
        - as_update - виджет поля как редактируемого
23
        - as_get - виджет поля как просмотра
24
        - as_table_update - виджет как таблица (доступен только для list_rel) полей
25
        - as_table_get - виджет как таблица (доступен только для list_rel) полей
26
    """
27
    cls: 'ClassView'  # Класс, которому принадлежит поле
28
    field_name: str  # Системное имя поля
29
    type: str  # Тип поля (srt, ins, rel, list_rel ... )
30

31
    # widget params
32
    enums: Optional[Any] = None  # Если поле enum, то тут будет список енумов
33
    sort_idx: int = 0  # Индекс сортировки поля
34

35
    is_filter: bool = False  # Является ли поле фильтром
36
    is_reserved: bool = False  # Призна
37
    # Views vars
38
    get: ViewVars
39
    create: ViewVars
40
    update: ViewVars
41
    val: Any = None
42

43

44
    def copy(self) -> 'Field':
45
        instance = copy.copy(self)
46
        instance.val = None
47
        return instance
48

49
    def __init__(self, *args, **kwargs):
50
        self.__dict__.update(kwargs)
51

52
    @property
53
    def key(self) -> str:
54
        """Отдает уникальный идентификатор для поля"""
55
        if self.field_name == 'quantity':
56
            a=1
57
        # if self.cls.v.parent_field:
58
        #     return f'{self.cls.v.parent_field.key}--{self.cls._id}--{self.field_name}'
59
        return f'{self.cls.p.key}--{self.field_name}'
60

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,
68
            field=self,
69
            method=method,
70
        )
71
        return rendered_html
72

73
    @property
74
    def label(self) -> str:
75
        """Отдать Label for шаблон для поля"""
76
        return render_block(
77
            environment=environment,
78
            template_name=f'field/label.html',
79
            block_name='label',
80
            field=self,
81
        )
82

83
    @property
84
    def as_update(self) -> str:
85
        """Отобразить поле с возможностью редактирования"""
86
        return self.render(block_name='as_update', method=MethodType.UPDATE)
87

88
    @property
89
    def as_create(self) -> str:
90
        """Отобразить поле с возможностью редактирования"""
91
        return self.render(block_name='as_create', method=MethodType.CREATE)
92

93
    @property
94
    def as_get(self) -> str:
95
        """Отобразить поле только на чтение"""
96
        return self.render(block_name='as_get')
97

98
    @property
99
    def as_table_get(self) -> str:
100
        """Отобразить поле как Таблицу (Если поле является list_rel)"""
101
        return render_block(
102
            environment=environment,
103
            template_name=f'cls/table.html',
104
            block_name='as_table',
105
            method=MethodType.GET,
106
            cls=self.val
107
        )
108

109
    @property
110
    def as_table_update(self) -> str:
111
        """Отобразить поле как Таблицу на редактирование (Если поле является list_rel)"""
112
        block_name = 'as_table'
113
        return render_block(
114
            environment=environment,
115
            template_name=f'cls/table.html',
116
            block_name=block_name,
117
            method=MethodType.UPDATE,
118
            cls=self.val
119
        )
120

121
    def filter_as_string(self) -> str:
122
        """Костыльная утилита, что бы в js передать фильтр"""
123
        return self.update.get('filter')
124

125

126
class Fields:
127
    """Обертка для удобства, что бы с полями работать как с обьектом"""
128
    _fields: list = []
129
    __state = 0  # счетчик итераций
130

131
    def __setattr__(self, key, value):
132
        super().__setattr__(key, value)
133

134
    def __iter__(self):
135
        self._fields = [i for i in self.__dict__.values() if isinstance(i, Field)]
136
        return self
137

138
    def __next__(self):
139
        """Если использовать конструктор как итератор, то он будет возвращать строки"""
140
        try:
141
            field = self._fields[self.__state]
142
            self.__state += 1
143
            return field
144
        except IndexError:
145
            self.__state = 0
146
            raise StopIteration
147

148
    def get_fields(self):
149
        return {i.field_name: i for i in self._fields}.items()
150

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

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

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

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