Browse Source

Добавлена возможность бронированть мероприятия
Мелкие исправления

vmshay 2 năm trước cách đây
mục cha
commit
83d9aa59d8
6 tập tin đã thay đổi với 70 bổ sung45 xóa
  1. 0 8
      bot/database.py
  2. 29 19
      bot/functions.py
  3. 1 1
      draft.py
  4. 3 0
      handlers/start.py
  5. 36 16
      handlers/user/make_events.py
  6. 1 1
      handlers/user/registration.py

+ 0 - 8
bot/database.py

@@ -74,11 +74,3 @@ class Database:
         self.close()
 
 
-# databas = Database()
-# # # print(db.sql_simple_check(sql=f'select admin from user_table where tg_id = 338836490'))
-# # # data = Db.sql_simple_check("select tg_id from user_table where tg_id = 338836490 and approved = 0")
-# dat = databas.sql_fetchall(sql=f"select events_table.description, user_table.name, events_table.dat "
-#                                             f"from events_table inner join user_table "
-#                                             f"on events_table.owner = user_table.tg_id ")
-# print(dat)
-

+ 29 - 19
bot/functions.py

@@ -69,23 +69,22 @@ def make_date():
     return datetime.datetime.strftime(today, '%d.%m.%Y')
 
 
-def date_range(range):
+def date_range(data):
     today = date.today()
     weekday = today.weekday()
     days_per_month = {1: 31, 2: 28, 3: 30, 4: 31, 5: 30, 6: 31,
                       7: 31, 8: 31, 9: 30, 10: 31, 11: 30, 12: 31}
-    if range == "today":
+    if data == "today":
         return today
 
-    if range == "week":
+    if data == "week":
         first = today - timedelta(days=weekday)
         # upper bound
         last = today + timedelta(days=(6 - weekday))
         return f"{first} and {last}"
 
-    if range == "month":
+    if data == "month":
         first = today.replace(day=1)
-        # вторая дата
         try:
             last = today.replace(day=days_per_month[today.month])
         except ValueError:
@@ -96,20 +95,31 @@ def date_range(range):
         return f"{first} and {last}"
 
 
-def get_all_events(data):
-    pass
+def to_quotes(data):
+    data = "'" + str(data) + "'"
+    return data
+
+
+def time_validator(data):
+    re_pattern = "^(2[0-3]|[01]?[0-9])(:|\.)([0-5]?[0-9])( |-)(2[0-3]|[01]?[0-9])(:|\.)([0-5]?[0-9])$"
+    if re.match(re_pattern, data):
+        if len(data.split(" ")) == 2:
+            return True
+        elif len(data.split("-")) == 2:
+            return True
+        else:
+            return False
+    else:
+        return False
 
 
+def split_time(data):
+    if len(data.split(" ")) == 2:
+        return data.split(" ")
+    elif len(data.split("-")) == 2:
+        return data.split("-")
+    else:
+        return False
+
 
-    #
-    # def sql_parse_user_events(self, sql: str):
-    #     self.execute(sql)
-    #     result_set = self.fetchall()
-    #     events_list = []
-    #     if len(result_set) == 0:
-    #         return False
-    #     elif len(result_set) > 0:
-    #         for row in result_set:
-    #             event_data = f"Описание {row['description']}\n Дата {row['dat']}"
-    #             events_list.append(event_data)
-    #         return events_list
+print(split_time("1.00-15.30"))

+ 1 - 1
draft.py

@@ -30,7 +30,7 @@
 #        await message.answer("Список всех событий")
 #        for event in events:
 #           await message.answer(beauty_all_events(event))
-
+# {'date': '2022-10-9', 'owner': 338836490, 't_start': '13.00', 't_end': '15.30', 'description': 'sdlf;sdlf', 'approved': 0}
 #
 # def sql_fetchone(self, sql: str):
 #     self.execute(sql)

+ 3 - 0
handlers/start.py

@@ -1,3 +1,6 @@
+import asyncio
+
+import aiogram
 from aiogram import types, Dispatcher
 from bot.keyboards import main_kb, register_kb,   check_register_kb
 from bot import database

+ 36 - 16
handlers/user/make_events.py

@@ -1,7 +1,7 @@
 from aiogram import types, Dispatcher
-from bot import database
-from bot.keyboards import register_kb, make_calendar, events_kb, cancel_booking
-from bot.functions import make_date
+from bot import database, sql
+from bot.keyboards import register_kb, make_calendar, events_kb, cancel_booking, main_kb
+from bot.functions import make_date, time_validator, split_time, to_quotes
 from handlers.user.states import BookingState
 from aiogram.dispatcher.storage import FSMContext
 
@@ -22,14 +22,15 @@ async def make_event(message: types.message):
                                  f"Сегодняшняя дата <b>{make_date()}</b>", reply_markup=make_calendar())
 
 
-async def select_date(call: types.CallbackQuery):
+async def select_date(call: types.CallbackQuery, state: FSMContext):
     db = database.Database()
     print(call.data)
-    # TODO: Планирование по дате
-    # Показать занятое время в выбраный день
-    time = "'" + call.data.split("_")[1] + "'"
-    booked = db.sql_fetchall(f"select events_table.e_start, events_table.e_end from events_table WHERE e_date = {time}")
+    date = call.data.split("_")[1]
+
+    booked = db.sql_fetchall(f"select events_table.e_start, events_table.e_end from events_table WHERE e_date = {to_quotes(date)}")
     await BookingState.start.set()
+    await state.update_data(date=to_quotes(date))
+    await state.update_data(owner=call.from_user.id)
     if len(booked) == 0:
         await call.message.edit_text("На этот день мероприятий не заплпнированно", reply_markup=events_kb())
     else:
@@ -37,6 +38,7 @@ async def select_date(call: types.CallbackQuery):
 
 
 async def edit_date(call: types.CallbackQuery, state: FSMContext):
+
     await call.message.edit_text(f"выберите дату чтобы увидеть список мероприятий\n\n"
                                  f"Так же календарь мероприятий можно посмотреть в "
                                  f"<a href=moodle.tomtit.tomsk.ru>Moodle</a>\n\n"
@@ -46,22 +48,40 @@ async def edit_date(call: types.CallbackQuery, state: FSMContext):
 
 
 async def booking_date(call: types.CallbackQuery):
-    print(call.message.text)
-    await call.message.edit_text("введите время", reply_markup=cancel_booking())
+    await call.message.edit_text("Введите диапазон времени\n"
+                                 "Возможные форматы\n"
+                                 "13.00 15.30\n"
+                                 "13.00-15.30\n"
+                                 "13:00 15:30\n"
+                                 "13.00-15.30\n", reply_markup=cancel_booking())
+    # TODO: парсер времени
+    # TODO: Проверка на занятость
+
     await BookingState.time.set()
 
 
 async def get_date(message: types.Message, state: FSMContext):
-    await state.update_data(time=message.text)
-    await message.answer("Введите краткое описание мероприятия", reply_markup=cancel_booking())
-    await BookingState.description.set()
+    if time_validator(message.text):
+        time = split_time(message.text)
+        await state.update_data(t_start=time[0])
+        await state.update_data(t_end=time[1])
+        await message.answer("Введите краткое описание мероприятия", reply_markup=cancel_booking())
+        await BookingState.description.set()
+    else:
+        await message.answer("Неверный формат времени")
+
+    # TODO: огран по длине текста
 
 
 async def send_event(message: types.Message, state: FSMContext):
+    db = database.Database()
     await state.update_data(description=message.text)
+    await state.update_data(approved=0)
     data = await state.get_data()
-    print(data)
+    await message.answer("Заявка принята", reply_markup=main_kb)
     await state.finish()
+    # await message.answer(data)
+    db.sql_query_send(sql.sql_send_event(data))
 
 
 def events_register(dp: Dispatcher):
@@ -70,6 +90,6 @@ def events_register(dp: Dispatcher):
     dp.register_callback_query_handler(edit_date, text=['change', 'cancel_booking'], state=[BookingState.start,
                                                                                             BookingState.time,
                                                                                             BookingState.description])
-    dp.register_callback_query_handler(booking_date, text='booking',state=BookingState.start)
+    dp.register_callback_query_handler(booking_date, text='booking', state=BookingState.start)
     dp.register_message_handler(get_date, state=BookingState.time)
-    dp.register_message_handler(send_event,state=BookingState.description)
+    dp.register_message_handler(send_event, state=BookingState.description)

+ 1 - 1
handlers/user/registration.py

@@ -66,7 +66,7 @@ async def get_fio(message: types.Message, state: FSMContext):
         await message.answer(f"Спасибо за регистрацию\n"
                              f"Вы сможете воспользоваться функциями после одобрения\n", reply_markup=check_register_kb)
 
-        db.sql_query_send(sql.sql_send(reg_data))
+        db.sql_query_send(sql.sql_send_register(reg_data))
         await state.finish()