# -*- coding: utf8 -*- # Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) # Авторизация или регистрация в кооперативе или другой организации from bot_sys import bot_bd, keyboard, user_access, bd_table, bot_subscribes, config from bot_modules import mod_table_operate, mod_simple_message from template import docs_message, bd_item from enum import Enum from enum import auto # --------------------------------------------------------- # БД module_name = 'authorize' table_name = module_name user_id_field = 'userID' user_name_field = 'userName' user_family_name_field = 'userFamilyName' user_middle_name_field = 'userMiddleName' user_birthday_field = 'userBirthday' user_address_field = 'userAddress' user_contacts_field = 'userContacts' user_confirm_field = 'userConfirm' access_field = 'authorizeAccess' create_datetime_field = 'authorizeCreateDateTime' user_id_table_field = bd_table.TableField(user_id_field, bd_table.TableFieldDestiny.USER_ID, bd_table.TableFieldType.INT) class ConfirmStatus(Enum): YES = auto() NO = auto() table = bd_table.Table(table_name, [ user_id_table_field, bd_table.TableField(user_name_field, bd_table.TableFieldDestiny.USER_NAME, bd_table.TableFieldType.STR), bd_table.TableField(user_family_name_field, bd_table.TableFieldDestiny.USER_FAMILY_NAME, bd_table.TableFieldType.STR), bd_table.TableField(user_middle_name_field, bd_table.TableFieldDestiny.USER_MIDDLE_NAME, bd_table.TableFieldType.STR), bd_table.TableField(user_birthday_field, bd_table.TableFieldDestiny.USER_BIRTHDAY, bd_table.TableFieldType.STR), bd_table.TableField(user_address_field, bd_table.TableFieldDestiny.USER_ADDRESS, bd_table.TableFieldType.STR), bd_table.TableField(user_contacts_field, bd_table.TableFieldDestiny.USER_CONTACTS, bd_table.TableFieldType.STR), bd_table.TableField(user_confirm_field, bd_table.TableFieldDestiny.USER_CONFIRM, bd_table.TableFieldType.ENUM, a_Enum = ConfirmStatus), bd_table.TableField(access_field, bd_table.TableFieldDestiny.ACCESS, bd_table.TableFieldType.STR), bd_table.TableField(create_datetime_field, bd_table.TableFieldDestiny.CREATE_DATE, bd_table.TableFieldType.STR), ] , [ [user_id_table_field], ] ) init_access = f'{user_access.user_access_group_new}=va' def GetAuthorizeItem(a_Bot, a_UserID): items = bd_item.GetBDItemsTemplate(a_Bot, table_name, user_id_field)(a_UserID) if len(items) == 1: return items[0] return None # --------------------------------------------------------- # Сообщения и кнопки class ButtonNames(Enum): LIST_AUTH_DOCS = auto() button_names = { mod_simple_message.ButtonNames.START: "🔑 Авторизация", mod_table_operate.ButtonNames.LIST: "≣ Список авторизаций пользователей", mod_table_operate.ButtonNames.ADD: "📨 Заявка на вступление", ButtonNames.LIST_AUTH_DOCS: "📨 Регистрационные документы", mod_table_operate.ButtonNames.EDIT: "🛠 Редактировать свои данные", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_ID): "☐ Изменить id пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_NAME): "☐ Изменить имя пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_FAMILY_NAME): "☐ Изменить фамилию пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_MIDDLE_NAME): "☐ Изменить отчество пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_BIRTHDAY): "☐ Изменить дату рождения пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_ADDRESS): "☐ Изменить адрес пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_CONTACTS): "☐ Изменить контакты пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_CONFIRM): "☐ Изменить подтверждение пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.USER_ID): "☐ Изменить id пользователя", mod_table_operate.EditButton(bd_table.TableFieldDestiny.ACCESS): "✋ Доступ к авторизации пользователя", mod_table_operate.ButtonNames.DEL: "❌ Удалить авторизацию пользователя", mod_table_operate.EnumButton(ConfirmStatus.YES): "Да, все данные верны", mod_table_operate.EnumButton(ConfirmStatus.NO): "Нет, данные не верны", } class Messages(Enum): LIST_AUTH_DOCS = auto() LIST_AUTH_DOCS_ERROR = auto() messages = { mod_simple_message.Messages.START: f''' {button_names[mod_simple_message.ButtonNames.START]} ''', Messages.LIST_AUTH_DOCS: ''' ваши регистрационные документы: ''', Messages.LIST_AUTH_DOCS_ERROR: ''' Ошибка получения документов. Обратитесь в техподдержку. ''', mod_table_operate.Messages.SELECT: ''' Пожалуйста, выберите пользователя: ''', mod_table_operate.Messages.ERROR_FIND: ''' ❌ Ошибка, пользователь не найден ''', mod_table_operate.Messages.OPEN: f''' Пользователь: #{user_id_field} Имя: #{user_name_field} Фамилия: #{user_family_name_field} Отчество: #{user_middle_name_field} Дата рождения: #{user_birthday_field} Адрес: #{user_address_field} Контакты: #{user_contacts_field} Подтверждение авторизации: #{user_confirm_field} Время создания: #{create_datetime_field} ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_NAME): ''' Авторизация. Шаг №1 Введите своё имя: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_FAMILY_NAME): ''' Авторизация. Шаг №2 Введите свою фамилию: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_MIDDLE_NAME): ''' Авторизация. Шаг №3 Введите своё отчество: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_BIRTHDAY): ''' Авторизация. Шаг №4 Введите свою дату рождения в формате ДД.ММ.ГГГГ: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_ADDRESS): ''' Авторизация. Шаг №5 Введите свой домашний адрес: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_CONTACTS): ''' Авторизация. Шаг №6 Введите свои контакты: ''', mod_table_operate.CreateMessage(bd_table.TableFieldDestiny.USER_CONFIRM): f''' Авторизация. Шаг №7 Имя: #{user_name_field} Фамилия: #{user_family_name_field} Отчество: #{user_middle_name_field} Дата рождения: #{user_birthday_field} Адрес: #{user_address_field} Контакты: #{user_contacts_field} Подтверждение авторизации: #{user_confirm_field} Подтвердите свои данные: ''', mod_table_operate.Messages.SUCCESS_CREATE: '''✅ Вы успешно зарегистрированы! Посмотрите документы и отправьте фотографии подписанных документов''', mod_table_operate.Messages.START_EDIT: ''' Пожалуйста, выберите действие: ''', mod_table_operate.Messages.SELECT_TO_EDIT: ''' Выберите пользователя, у которого вы хотите отредактировать данные. ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_NAME): f''' Текущее имя пользователя: #{user_name_field} Введите новое имя пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_FAMILY_NAME): f''' Текущая фамилия пользователя: #{user_family_name_field} Введите новую фамилию пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_MIDDLE_NAME): f''' Текущее отчество пользователя: #{user_middle_name_field} Введите новое отчество пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_BIRTHDAY): f''' Текущая дата рождения пользователя: #{user_birthday_field} Введите новую дату рождения пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_ADDRESS): f''' Текущий адрес пользователя: #{user_address_field} Введите новый адрес пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_CONTACTS): f''' Текущие контакты пользователя: #{user_contacts_field} Введите новые контакты пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.USER_CONFIRM): f''' Текущее подтвержение пользователя: #{user_confirm_field} Введите новое подтверждение пользователя: ''', mod_table_operate.EditMessage(bd_table.TableFieldDestiny.ACCESS): f''' Текущий доступ к проекту: #{access_field} {user_access.user_access_readme} Введите новую строку доступа: ''', mod_table_operate.Messages.SUCCESS_EDIT: '''✅ Проект успешно отредактирован!''', mod_table_operate.Messages.SELECT_TO_DELETE: ''' Выберите пользователя, у которого вы хотите удалить авторизованные данные. ''', mod_table_operate.Messages.SUCCESS_DELETE: '''✅ Данные пользователя успешно удалены!''', } messages_subscribes = { mod_table_operate.SubscribeMessage(bot_subscribes.SubscribeType.ADD):f'''Данные по авторизации созданы''', mod_table_operate.SubscribeMessage(bot_subscribes.SubscribeType.ANY_ITEM_EDIT):f'''Данные по авторизации отредактированы''', mod_table_operate.SubscribeMessage(bot_subscribes.SubscribeType.ANY_ITEM_DEL):f'''Данные по авторизации удалены''', mod_table_operate.SubscribeMessage(bot_subscribes.SubscribeType.ITEM_EDIT):f'''Данные по авторизации отредактированы #item_id''', mod_table_operate.SubscribeMessage(bot_subscribes.SubscribeType.ITEM_DEL):f'''Данные по авторизации удалены #item_id''', } messages.update(messages_subscribes) messages_confirm_status = { mod_table_operate.EnumMessageForView(ConfirmStatus.YES): f'''Да, все данные верны''', mod_table_operate.EnumMessageForView(ConfirmStatus.NO): f'''Нет, данные не верны''', } messages.update(messages_confirm_status) class ModuleAuthorize(mod_table_operate.TableOperateModule): def __init__(self, a_ParentModName, a_ChildModName, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_BotSubscribes, a_Log): super().__init__(table, messages, button_names, a_ParentModName, a_ChildModName, init_access, a_ChildModuleNameList, a_EditModuleNameList, a_Bot, a_ModuleAgregator, a_BotMessages, a_BotButtons, a_BotSubscribes, a_Log) def GetName(self): return module_name def GetAccessForEditKeyboardButtons(self, a_Field): cur_dict = { bd_table.TableFieldDestiny.USER_ID: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_NAME: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_FAMILY_NAME: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_MIDDLE_NAME: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_BIRTHDAY: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_ADDRESS: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_CONTACTS: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.USER_CONFIRM: user_access.AccessMode.NONE, bd_table.TableFieldDestiny.ACCESS: user_access.AccessMode.NONE, } return cur_dict.get(a_Field.m_Destiny, super().GetAccessForEditKeyboardButtons(a_Field)) def GetButtonNameAndKeyValueAndAccess(self, a_Item): key_name_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_ID) name_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_NAME) fam_name_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_FAMILY_NAME) access_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS) assert key_name_id != None assert name_field_id != None assert fam_name_field_id != None assert access_field_id != None return \ a_Item[name_field_id] + ' ' + a_Item[fam_name_field_id] + '(' + a_Item[key_name_id] +')',\ a_Item[key_name_id],\ a_Item[access_field_id] def GetStartKeyboardButtons(self, a_Message, a_UserGroups): parent_buttons = super().GetStartKeyboardButtons(a_Message, a_UserGroups) user_id = str(a_Message.from_user.id) item = GetAuthorizeItem(self.m_Bot, user_id) user_confirm_field_id = self.m_Table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.USER_CONFIRM) cur_buttons = [] if item and item[user_confirm_field_id] == str(ConfirmStatus.YES): cur_buttons += [ keyboard.ButtonWithAccess(self.GetButton(ButtonNames.LIST_AUTH_DOCS), user_access.AccessMode.VIEW, self.GetAccess()), ] return parent_buttons + keyboard.MakeButtons(self.m_Bot, cur_buttons, a_UserGroups) def RegisterHandlers(self): super().RegisterHandlers() def GetFilesFunc(a_user_id): files = GetAuthDocs() cur_dict = GetReplaceDictFunc(self.m_Bot, a_user_id) result = {} for f in files: result.update({f, cur_dict}) return result button_name = self.GetButton(ButtonNames.LIST_AUTH_DOCS) if button_name: self.m_Bot.RegisterMessageHandler( docs_message.DocFilesTemplate( self.m_Bot, GetFilesFunc, self.GetMessage(Messages.LIST_AUTH_DOCS), self.m_GetAccessFunc, self.m_GetStartKeyboardButtonsFunc, None, self.GetMessage(Messages.LIST_AUTH_DOCS_ERROR), access_mode = user_access.AccessMode.VIEW ), bd_item.GetCheckForTextFunc(button_name) ) def AddBDItemFunc(self, a_ItemData, a_UserID): a_ItemData[user_id_field] = a_UserID #a_ItemData[address_field] = '' return super().AddBDItemFunc(a_ItemData, a_UserID) def GetReplaceDictFunc(a_Bot, a_user_id): item = GetAuthorizeItem(self.m_Bot, user_id) if not item: return None result = {} i = 0 for f in table: result.update({str(f.m_Destiny), item[i]}) i += 1 return result auth_docs_file_name = 'config_auth_docs' def GetAuthDocs(): global g_auth_docs if len(g_auth_docs) == 0: root_ids = config.GetAllLinesFromFile(auth_docs_file_name) for i in root_ids: g_auth_docs += [config.ClearReadLine(i)] return g_auth_docs