Browse Source

bd_table

pull/2/head
Alexei 2 years ago
parent
commit
1ac4d98e13
  1. 14
      bot_modules/access.py
  2. 49
      bot_modules/profile.py
  3. 12
      bot_modules/tasks.py
  4. 97
      bot_sys/bd_table.py
  5. 16
      main.py

14
bot_modules/access.py

@ -4,7 +4,7 @@
# Права пользователей
from bot_sys import keyboard, user_access, bot_bd
from bot_modules import mod_simple_message
from bot_modules import mod_simple_message, access_utils
from template import simple_message, sql_request, bd_item
from aiogram.dispatcher import FSMContext
@ -24,10 +24,10 @@ class FSMEditDefaultAccessItem(StatesGroup):
# БД
module_name = 'access'
table_name = 'module_access'
mod_name_field = 'modName'
moduleaccess_field = 'modAccess'
mod_default_access_field = 'itemDefaultAccess'
table_name = access_utils.table_name
mod_name_field = access_utils.mod_name_field
moduleaccess_field = access_utils.moduleaccess_field
mod_default_access_field = access_utils.mod_default_access_field
#TODO: Автоматическое создание init_bd_cmds, необходимо table_name, mod_name_field ... объединить в объект
@ -109,14 +109,14 @@ class ModuleAccess(mod_simple_message.SimpleMessageModule):
)
def GetInitBDCommands(self):
return super(). GetInitBDCommands() + [
return [
f"""CREATE TABLE IF NOT EXISTS {table_name}(
{mod_name_field} TEXT,
{moduleaccess_field} TEXT,
{mod_default_access_field} TEXT,
UNIQUE({mod_name_field})
);""",
]
] + super().GetInitBDCommands()
def GetName(self):
return module_name

49
bot_modules/profile.py

@ -3,8 +3,8 @@
# Профиль пользователя
from bot_sys import user_access, bot_bd
from bot_modules import mod_simple_message, groups, access, access_utils
from bot_sys import user_access, bot_bd, bd_table
from bot_modules import mod_simple_message, groups, access, access_utils, groups_utils
from template import bd_item, simple_message
# ---------------------------------------------------------
@ -21,6 +21,17 @@ language_code_field = 'userLanguageCode'
access_field = 'userAccess'
create_datetime_field = 'createDateTime'
table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(name1_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(name2_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(is_bot_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(language_code_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
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),
])
start_message = f'''
<b>📰 Профиль:</b>
@ -42,17 +53,7 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule):
def GetInitBDCommands(self):
return super(). GetInitBDCommands() + [
f"""CREATE TABLE IF NOT EXISTS {table_name}(
{key_name} INTEGER,
{name_field} TEXT,
{name1_field} TEXT,
{name2_field} TEXT,
{is_bot_field} TEXT,
{language_code_field} TEXT,
{access_field} TEXT,
{create_datetime_field} TEXT,
UNIQUE({key_name})
);""",
table.GetInitTableRequest(),
]
def GetName(self):
@ -62,19 +63,11 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule):
async def StartMessageHandler(self, a_Message, state = None):
user_info = GetUserInfo(self.m_Bot, a_Message.from_user.id)
lang = str(a_Message.from_user.language_code)
msg = self.m_StartMessage
msg = msg.GetMessageForLang(lang).StaticCopy()
if not user_info is None:
msg.m_MessageDesc = msg.GetDesc().\
replace(f'#{key_name}', str(user_info[0])).\
replace(f'#{name_field}', str(user_info[1])).\
replace(f'#{name1_field}', str(user_info[2])).\
replace(f'#{name2_field}', str(user_info[3])).\
replace(f'#{is_bot_field}', str(user_info[4])).\
replace(f'#{language_code_field}', str(user_info[5])).\
replace(f'#{access_field}', str(user_info[6])).\
replace(f'#{create_datetime_field}', str(user_info[7]))
return simple_message.WorkFuncResult(msg, item_access = str(user_info[6]))
msg = self.m_StartMessage
msg = msg.GetMessageForLang(lang).StaticCopy()
msg.m_MessageDesc = table.ReplaceAllFieldTags(msg.GetDesc(), user_info)
return simple_message.WorkFuncResult(msg, item_access = str(user_info[table.GetFieldIDByDestiny(bd_table.TableFieldDestiny.ACCESS)]))
return await super().StartMessageHandler(a_Message, state)
@ -84,8 +77,8 @@ class ModuleProfile(mod_simple_message.SimpleMessageModule):
def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode):
a_Bot.SQLRequest(f"INSERT OR IGNORE INTO users ({key_name}, {name_field}, {name1_field}, {name2_field}, {is_bot_field}, {language_code_field}, {access_field}, {create_datetime_field}) VALUES (?, ?, ?, ?, ?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot, a_LanguageCode, access_utils.GetItemDefaultAccessForModule(a_Bot, module_name)))
'''
user_groups = access_utils.GetUserGroupData(a_Bot, a_UserID)
user_groups = groups_utils.GetUserGroupData(a_Bot, a_UserID)
# Если пользователь не состоит ни в одной группе, то добавляем его в группу user_access.user_access_group_new
if len(user_groups.group_names_list) == 0:
new_group_id = a_Bot.SQLRequest(f'SELECT {groups.key_table_groups_name} FROM {groups.table_groups_name} WHERE {groups.name_table_groups_field} = ?',
@ -93,7 +86,7 @@ def AddUser(a_Bot, a_UserID, a_UserName, a_UserName1, a_UserName2, a_UserIsBot,
if new_group_id and new_group_id[0]:
a_Bot.SQLRequest(f"INSERT OR IGNORE INTO {groups.table_user_in_groups_name} ({groups.user_id_field}, {groups.key_table_groups_name}, {groups.access_field}, {groups.create_datetime_field}) VALUES (?, ?, ?, {bot_bd.GetBDDateTimeNow()});",
commit=True, param = (a_UserID, new_group_id[0][0], access_utils.GetItemDefaultAccessForModule(a_Bot, module_name)))
'''
def GetUserInfo(a_Bot, a_UserID):
user_info = a_Bot.SQLRequest('SELECT * FROM users WHERE user_id = ?', param = [a_UserID])
if len(user_info) != 0:

12
bot_modules/tasks.py

@ -3,7 +3,7 @@
# Задачи
from bot_sys import bot_bd, log, keyboard, user_access
from bot_sys import bot_bd, bd_table, keyboard, user_access
from bot_modules import start, access, groups, projects, needs, comments
from template import bd_item_view, simple_message, bd_item_delete, bd_item_edit, bd_item, bd_item_add, bd_item_select
@ -47,6 +47,16 @@ access_field = 'taskAccess'
create_datetime_field = 'taskCreateDateTime'
parent_id_field = 'projectID'
table = bd_table.Table(table_name, [
bd_table.TableField(key_name, bd_table.TableFieldDestiny.KEY, bd_table.TableFieldType.INT),
bd_table.TableField(name_field, bd_table.TableFieldDestiny.NAME, bd_table.TableFieldType.STR),
bd_table.TableField(desc_field, bd_table.TableFieldDestiny.DESC, bd_table.TableFieldType.STR),
bd_table.TableField(photo_field, bd_table.TableFieldDestiny.PHOTO, bd_table.TableFieldType.STR),
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),
bd_table.TableField(parent_id_field, bd_table.TableFieldDestiny.PARENT_ID, bd_table.TableFieldType.INT),
])
init_bd_cmds = [f'''CREATE TABLE IF NOT EXISTS {table_name}(
{key_name} INTEGER PRIMARY KEY,
{name_field} TEXT,

97
bot_sys/bd_table.py

@ -0,0 +1,97 @@
#-*-coding utf-8-*-
# Общественное достояние, 2023, Алексей Безбородов (Alexei Bezborodov) <AlexeiBv+mirocod_platform_bot@narod.ru>
from enum import Enum
from enum import auto
# Тип поля в таблице
class TableFieldType(Enum):
INT = 'INTEGER'
STR = 'TEXT'
# Предназначение поля в таблице
class TableFieldDestiny(Enum):
KEY = auto()
NAME = auto()
DESC = auto()
PHOTO = auto()
ACCESS = auto()
CREATE_DATE = auto()
PARENT_ID = auto()
OTHER = auto()
class TableField:
def __init__(self, a_Name, a_Destiny : TableFieldDestiny, a_Type : TableFieldType):
self.m_Name = a_Name
self.m_Destiny = a_Destiny
self.m_Type = a_Type
class Table:
def __init__(self, a_TableName, a_Fields : [TableField]):
self.m_TableName = a_TableName
self.m_Fields = a_Fields
def GetName(self):
return self.m_TableName
def GetFields(self):
return self.TableFieldType
def GetFieldByDestiny(self, a_Destiny):
for f in self.m_Fields:
if f.m_Destiny == a_Destiny:
return f
return None
def GetFieldIDByDestiny(self, a_Destiny):
for i in range(len(self.m_Fields)):
f = self.m_Fields[i]
if f.m_Destiny == a_Destiny:
return i
return None
def GetInitTableRequest(self):
request = f'CREATE TABLE IF NOT EXISTS {self.GetName()}('
fields = []
for f in self.m_Fields:
key_str = ''
if f.m_Destiny == TableFieldDestiny.KEY:
key_str = 'PRIMARY KEY'
fields += [' '.join([f.m_Name, str(f.m_Type.value), key_str])]
return request + ', '.join(fields) + ');'
def ReplaceAllFieldTags(self, a_String, a_BDItem):
result = a_String
for i in range(len(self.m_Fields)):
f = self.m_Fields[i]
result = result.replace(f'#{f.m_Name}', str(a_BDItem[i]))
return result
def Test():
table = Table('tname', [
TableField('f1', TableFieldDestiny.KEY, TableFieldType.INT),
TableField('f2', TableFieldDestiny.NAME, TableFieldType.STR),
TableField('f3', TableFieldDestiny.DESC, TableFieldType.STR),
])
assert table.GetName() == 'tname'
assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Name == 'f1'
assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Destiny == TableFieldDestiny.KEY
assert table.GetFieldByDestiny(TableFieldDestiny.KEY).m_Type == TableFieldType.INT
assert table.GetFieldIDByDestiny(TableFieldDestiny.KEY) == 0
assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Name == 'f2'
assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Destiny == TableFieldDestiny.NAME
assert table.GetFieldByDestiny(TableFieldDestiny.NAME).m_Type == TableFieldType.STR
assert table.GetFieldIDByDestiny(TableFieldDestiny.NAME) == 1
assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Name == 'f3'
assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Destiny == TableFieldDestiny.DESC
assert table.GetFieldByDestiny(TableFieldDestiny.DESC).m_Type == TableFieldType.STR
assert table.GetFieldIDByDestiny(TableFieldDestiny.DESC) == 2
assert table.GetFieldByDestiny(TableFieldDestiny.PHOTO) == None
assert table.GetFieldIDByDestiny(TableFieldDestiny.PHOTO) == None
assert table.GetInitTableRequest() == 'CREATE TABLE IF NOT EXISTS tname(f1 INTEGER PRIMARY KEY, f2 TEXT , f3 TEXT );'
item = [10, 'i1', 'i2']
print( table.ReplaceAllFieldTags('#f1 #f2 #f3', item))
assert table.ReplaceAllFieldTags('#f1 #f2 #f3', item) == '10 i1 i2'

16
main.py

@ -5,7 +5,7 @@ log_start_message = 'Бот успешно запущен!'
import os
from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages
from bot_sys import config, log, bot_bd, user_access, aiogram_bot, bot_messages, bd_table
from bot_modules import mod_agregator, start, profile, backup, groups, access #, projects, , access, , tasks, needs, comments, messages, , languages
g_Log = log
@ -20,18 +20,18 @@ g_ModuleAgregator = mod_agregator.ModuleAgregator()
mod_start_name = 'start'
mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_access)
mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_groups)
mod_profile = profile.ModuleProfile([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_profile)
mod_backup = backup.ModuleBackup([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_backup)
mod_groups = groups.ModuleGroups([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_groups)
mod_access = access.ModuleAccess([mod_start_name], g_Bot, g_ModuleAgregator, g_BotMessages, g_BotButtons, g_Log)
g_ModuleAgregator.AddModule(mod_access)
start_mod_name_list = [#, 'projects', 'groups', 'access', , 'languages']
mod_profile.GetName(),
mod_backup.GetName(),
@ -64,7 +64,7 @@ for m in modules:
m.RegisterHandlers()
# Юнит тесты модулей и файлов
test_mods = [user_access]
test_mods = [user_access, bd_table]
for m in test_mods:
m.Test()

Loading…
Cancel
Save