Passed
Push — master ( 5bb24e...0e504e )
by Daniil
18:24 queued 12s
created

keyboard.Keyboards.generate_names_selector()   A

Complexity

Conditions 2

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 10
nop 1
dl 0
loc 12
rs 9.9
c 0
b 0
f 0
1
import os
2
3
from vk_api.keyboard import VkKeyboard
4
5
from database import Database
6
7
8
class Keyboards:
9
    """
10
    Класс с генераторами пользовательских клавиатур
11
    """
12
13
    def __init__(self):
14
        self.db = Database(os.environ["DATABASE_URL"])
15
16
    @staticmethod
17
    def generate_main_menu(is_admin: bool):
18
        """
19
        Генерирует клавиатуру с главным меню
20
        """
21
        kb = VkKeyboard()
22
        if is_admin:
23
            kb.add_button(label="Призыв", payload={"button": "call"})
24
            kb.add_button(label="Финансы", payload={"button": "finances"})
25
            kb.add_line()
26
        kb.add_button(label="Расписание", payload={"button": "schedule"})
27
        kb.add_line()
28
        kb.add_button(
29
            label="Управление рассылками", payload={"button": "mailings"},
30
        )
31
        if is_admin:
32
            kb.add_line()
33
            kb.add_button(label="Настройки", payload={"button": "prefs"})
34
        return kb.get_keyboard()
35
36 View Code Duplication
    @staticmethod
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
37
    def generate_schedule_keyboard():
38
        """
39
        Возвращает клавиатуру с выбором даты получения расписания
40
        """
41
        kb = VkKeyboard()
42
        kb.add_button(label="На сегодня", color="default", payload={"button": "today"})
43
        kb.add_button(
44
            label="На завтра", color="default", payload={"button": "tomorrow"}
45
        )
46
        kb.add_line()
47
        kb.add_button(
48
            label="На послезавтра",
49
            color="default",
50
            payload={"button": "day_after_tomorrow"},
51
        )
52
        kb.add_button(
53
            label="Выбрать дату", color="default", payload={"button": "arbitrary"},
54
        )
55
        kb.add_line()
56
        kb.add_button(
57
            label="Назад", color="primary", payload={"button": "home"},
58
        )
59
        return kb.get_keyboard()
60
61
    @staticmethod
62
    def empty():
63
        """
64
        Возвращает пустую клавиатуру
65
        """
66
        kb = VkKeyboard()
67
        return kb.get_empty_keyboard()
68
69
    @staticmethod
70
    def skip():
71
        """
72
        Возвращает клавиатуру с кнопкой "Пропустить"
73
        """
74
        kb = VkKeyboard()
75
        kb.add_button(label="Пропустить", payload={"button": "skip"})
76
        return kb.get_keyboard()
77
78
    @staticmethod
79
    def cancel():
80
        """
81
        Возвращает клавиатуру с кнопкой "Отмена"
82
        """
83
        kb = VkKeyboard()
84
        kb.add_button(label="Отмена", color="negative", payload={"button": "cancel"})
85
        return kb.get_keyboard()
86
87
    @staticmethod
88
    def generate_prefs_keyboard():
89
        """
90
        Возвращает клавиатуру с настройками бота
91
        """
92
        kb = VkKeyboard()
93
        kb.add_button(label="Сменить беседу", payload={"button": "chconv"})
94
        kb.add_line()
95
        kb.add_button(label="Использование имён в призыве", payload={"button": "names"})
96
        kb.add_line()
97
        kb.add_button(
98
            label="Назад", color="primary", payload={"button": "home"},
99
        )
100
        return kb.get_keyboard()
101
102
    @staticmethod
103
    def generate_conv_selector(chat: int):
104
        """
105
        Возвращает клавиатуру-селектор бесед
106
        """
107
        kb = VkKeyboard()
108
        if chat == 2000000001:
109
            kb.add_button(
110
                label="Переключиться на основную беседу",
111
                payload={"button": "select_main_conv"},
112
            )
113
        elif chat == 2000000002:
114
            kb.add_button(
115
                label="Переключиться на тестовую беседу",
116
                payload={"button": "select_test_conv"},
117
            )
118
        kb.add_line()
119
        kb.add_button(
120
            label="Назад", color="primary", payload={"button": "prefs"},
121
        )
122
        return kb.get_keyboard()
123
124
    @staticmethod
125
    def generate_names_selector(status: bool):
126
        kb = VkKeyboard()
127
        if status:
128
            kb.add_button(label="Выключить", payload={"button": "off_using_names"})
129
        else:
130
            kb.add_button(label="Включить", payload={"button": "on_using_names"})
131
        kb.add_line()
132
        kb.add_button(
133
            label="Назад", color="primary", payload={"button": "prefs"},
134
        )
135
        return kb.get_keyboard()
136
137 View Code Duplication
    @staticmethod
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
138
    def fin_category_menu():
139
        kb = VkKeyboard()
140
        kb.add_button(label="📈 Доход", payload={"button": "add_donate"})
141
        kb.add_button(label="📉 Расход", payload={"button": "add_expense"})
142
        kb.add_line()
143
        kb.add_button(label="Статистика", payload={"button": "fin_stat"})
144
        kb.add_line()
145
        kb.add_button(label="📢 Должники", payload={"button": "debtors"})
146
        kb.add_button(label="⚙ Настройки", payload={"button": "fin_prefs"})
147
        kb.add_line()
148
        kb.add_button(label="👈🏻 Назад", color="primary", payload={"button": "finances"})
149
        return kb.get_keyboard()
150
151
    @staticmethod
152
    def fin_prefs():
153
        kb = VkKeyboard()
154
        kb.add_button(label="Изменить сумму", payload={"button": "update_summ"})
155
        kb.add_button(label="Переименовать", payload={"button": "update_name"})
156
        kb.add_line()
157
        kb.add_button(
158
            label="Удалить", color="negative", payload={"button": "delete_expense"}
159
        )
160
        kb.add_line()
161
        kb.add_button(
162
            label="Назад", color="primary", payload={"button": "fin_category"},
163
        )
164
        return kb.get_keyboard()
165
166
    def generate_call_prompt(self):
167
        kb = self.generate_alphabet_keyboard()
168
        kb.add_line()
169
        kb.add_button(label="Отмена", color="negative", payload={"button": "cancel"})
170
        kb.add_button(label="Сохранить", color="positive", payload={"button": "save"})
171
        kb.add_line()
172
        kb.add_button(
173
            label="Отправить всем", color="primary", payload={"button": "send_to_all"}
174
        )
175
        return kb.get_keyboard()
176
177
    def generate_finances_prompt(self):
178
        kb = self.generate_alphabet_keyboard()
179
        kb.add_line()
180
        kb.add_button(label="Отмена", color="negative", payload={"button": "cancel"})
181
        return kb.get_keyboard()
182
183
    def generate_alphabet_keyboard(self):
184
        """
185
        Генерирует клавиатуру с алфавитными кнопками
186
        """
187
        kb = VkKeyboard()
188
        letters = self.db.get_last_names_letters()
189
        for i, v in enumerate(letters):
190
            if len(kb.lines[-1]) < 4:
191
                kb.add_button(label=v, payload={"button": "letter", "letter": v})
192
            else:
193
                kb.add_line()
194
                kb.add_button(label=v, payload={"button": "letter", "letter": v})
195
196
        return kb
197
198
    def generate_names_keyboard(self, letter):
199
        """
200
        Генерирует клавиатуру с фамилиями, начинающимися на букву (аргумент)
201
        """
202
        names = self.db.get_list_of_names(letter=letter)
203
        kb = VkKeyboard()
204
        for i, v in enumerate(names):
205
            label = f"{v[2]} {v[1][0]}."
206
            kb.add_button(
207
                label=label, payload={"button": "student", "name": label, "id": v[0]},
208
            )
209
            if len(kb.lines[-1]) == 2:
210
                kb.add_line()
211
        if kb.lines[-1]:
212
            kb.add_line()
213
        kb.add_button(
214
            label="Назад", color="primary", payload={"button": "back"},
215
        )
216
        return kb.get_keyboard()
217
218
    def generate_mailings_keyboard(self):
219
        """
220
        Генерация клавиатуры со списком доступных рассылок
221
        """
222
        mailings = self.db.get_mailings_list()
223
        kb = VkKeyboard()
224
        for i, v in enumerate(mailings):
225
            kb.add_button(
226
                label=v[1], payload={"button": "mailing", "name": v[1], "slug": v[2]},
227
            )
228
            if len(kb.lines[-1]) == 2:
229
                kb.add_line()
230
        if kb.lines[-1]:
231
            kb.add_line()
232
        kb.add_button(
233
            label="Назад", color="primary", payload={"button": "home"},
234
        )
235
        return kb.get_keyboard()
236
237
    def generate_mailing_mgmt(self, user_id: int, is_admin: bool, slug: str):
238
        uid = self.db.get_user_id(vk_id=user_id)
239
        status = self.db.get_subscription_status(slug=slug, user_id=uid)
240
241
        kb = VkKeyboard()
242
        if is_admin:
243
            kb.add_button(
244
                label="Отправить рассылку",
245
                color="default",
246
                payload={"button": "send_mailing", "mailing": slug},
247
            )
248
        kb.add_button(
249
            label=f"{'Отписаться' if status else 'Подписаться'}",
250
            payload={
251
                "button": f"{'unsubscribe' if status else 'subscribe'}",
252
                "slug": slug,
253
                "user_id": uid,
254
            },
255
        )
256
        kb.add_line()
257
        kb.add_button(
258
            label="Назад", color="primary", payload={"button": "mailings"},
259
        )
260
        return kb.get_keyboard()
261
262
    def prompt(self, user_id: int = None):
263
        """
264
        Возвращает клавиатуру с подтверждением действия
265
        """
266
        kb = VkKeyboard()
267
        kb.add_button(
268
            label="Подтвердить", color="positive", payload={"button": "confirm"}
269
        )
270
        kb.add_button(label="Отмена", color="negative", payload={"button": "deny"})
271
        if user_id is not None and self.db.get_session_state(user_id) in [
272
            "call_configuring",
273
            "debtors_forming",
274
        ]:
275
            kb.add_line()
276
            kb.add_button(
277
                label="Сменить беседу",
278
                color="primary",
279
                payload={"button": "chconv_call"},
280
            )
281
            kb.add_line()
282
            kb.add_button(
283
                label="Переключить использование имён",
284
                color="primary",
285
                payload={"button": "chnames_call"},
286
            )
287
        return kb.get_keyboard()
288
289
    def finances_main(self):
290
        kb = VkKeyboard()
291
        list_of_cats = self.db.get_list_of_finances_categories()
292
        for i, v in enumerate(list_of_cats):
293
            label = v[0]
294
            kb.add_button(
295
                label=label,
296
                payload={"button": "fin_category", "slug": v[1], "name": v[0]},
297
            )
298
            if len(kb.lines[-1]) == 2:
299
                kb.add_line()
300
        if kb.lines[-1]:
301
            kb.add_line()
302
        kb.add_button(label="Баланс", payload={"button": "balance"})
303
        kb.add_button(label="Добавить статью", payload={"button": "add_expense_cat"})
304
        kb.add_line()
305
        kb.add_button(label="Назад", color="primary", payload={"button": "home"})
306
        return kb.get_keyboard()
307