def _show_requests(self, event, custom_data=None): if custom_data: user = custom_data.get('user', None) page = custom_data.get('page', 0) stp_filter = custom_data.get('stp', None) else: stp_filter = None user = event.kwargs.get('user') page = 0 stp = Stp.get(Stp.user == user) stp_sections = StpSection.select(StpSection.section).where(StpSection.stp == stp).where( Request.is_finished == False) requests = Request.select().where(Request.section << stp_sections) if stp_filter: requests = requests.where(Request.stp == stp_filter) else: requests = requests.where(Request.stp == None) requests = requests.offset(page * REQUEST_PAGE_SIZE).limit( REQUEST_PAGE_SIZE + 1) if not custom_data: self.tb.send_message(self.chat, "Заявки:", reply_markup=generate_custom_keyboard(types.ReplyKeyboardMarkup, [[get_button( "В главное меню")]])) req_len = len(requests) if req_len: for i in range(req_len): buttons = self.get_request_control_buttons(stp, requests[i].id) if req_len == REQUEST_PAGE_SIZE + 1 and req_len == i + 1: buttons.append([get_button_inline(text="Показать еще", data="stp_request_show %s" % (page + 1))]) self.print_request(requests[i], stp=stp, keyboard=generate_custom_keyboard(types.InlineKeyboardMarkup, buttons)) else: self.tb.send_message(self.chat, "Нету доступных заявок.")
def show_active_requests(message, user, tb, sm): sm._show_requests(None, custom_data={ 'user': user, 'page': 0, 'stp': Stp.get(user=user).id })
def _is_taken(self, event): request = Request.get(id=event.kwargs.get('request')) stp = Stp.get(user=event.kwargs.get("user")) if request.stp is None or request.stp == stp: return True else: self.tb.send_message(self.chat, "Данная заявка уже взята.") return False
def PromoteUser(user_id, sections): user = User.get(id=user_id) user.state = 'stp_initial' user.save() stp = Stp.get_or_create(user=user, staff_id=1, is_active=True)[0] stp.save() [ StpSection.get_or_create(stp=stp, section=section, importance=1) for section in sections ]
def take_request(self, request, user, call): stp = Stp.get(user=user) request = Request.get(id=request) if request.stp is None: request.stp = stp request.save() self.tb.edit_message_reply_markup(self.chat, message_id=call.message.message_id, reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, self.get_request_control_buttons( stp, request.id))) else: self.tb.send_message(self.chat, "Вы уже взяли заявку, либо ее взял кто-то другой /r%s." % request.id)
def show_request(self, request_id, curr_user, reply=None): try: r = Request.get(id=request_id) buttons = [] stp = Stp.get(Stp.user == curr_user) stp_sections = StpSection.select(StpSection.section).where(StpSection.stp == stp) is_suitable = Request.select().where(Request.section == r.section).where( Request.section << stp_sections).where(Request.is_finished == False).exists() if is_suitable: buttons = self.get_request_control_buttons(stp, request_id) self.print_request(r, keyboard=generate_custom_keyboard(types.InlineKeyboardMarkup, buttons), stp=stp) except: self.tb.send_message(self.chat, "Данная заявка не найдена")
def arguments_wrapper(*args, **kwargs): user = args[1] tb = args[2] if user and user.is_active and Stp.get(user=user).is_active: sm = StpStateMachine( data={ 'chat_id': user.telegram_chat_id, 'tb': tb, 'state': user.state, 'user_id': user.id }) obj = tele_func(*args, **kwargs, sm=sm) else: if user and not user.is_active: tb.send_message(args[0].chat.id, "Кажется, ваш аккаунт деактивирован.") elif user.is_active and not Stp.get(user=user).is_active: tb.send_message( args[0].chat.id, "Кажется вы больше не являетесь членом СТП.") obj = None return obj
def send_to_chat(self, text, user): try: r = Request.get(id=user.additional_data['chat']) if r.stp is not None: stp = User.get(id=Stp.get(id=r.stp).user) m = Message(from_user=user, to_user=stp.id, text=text, request=r) if 'chat' in stp.additional_data and stp.additional_data['chat'] == r.id: m.is_read = True self.tb.send_message(stp.telegram_chat_id, m.text) else: m = Message(from_user=user, to_user=None, text=text, request=r) m.save() except Exception as e: pass
def _set_chat(self, event): request = Request.get(id=event.kwargs.get('request')) user = event.kwargs.get("user") message = event.kwargs.get("message") stp = Stp.get(user=user) request.stp = stp request.save() user.additional_data['chat'] = request.id user.save() keyboard = generate_custom_keyboard(types.ReplyKeyboardMarkup, [[get_button("Показать историю чата")], [get_button("Закрыть заявку")], [get_button("Клиент в чате?")], [get_button("Отключиться от заявки")], [get_button("Отключиться от чата")]]) self.tb.edit_message_text(chat_id=self.chat, text="Вы переключились в чат заявки /r%s %s" % (request.id, request.unicode_icons), message_id=message) self.tb.send_message(self.chat, "имя клиента: %s\nФамилия клиента: %s\n" % (request.user.first_name, request.user.surname), reply_markup=keyboard) self._show_unread_messages(request)
def remove_from_stp(stp): tb = telebot.TeleBot(config.token) stp = Stp.get(id=stp) user = stp.user user.state = 'main_menu' user.save() stp.delete_instance() try: keyboard = generate_custom_keyboard( types.ReplyKeyboardMarkup, buttons=[ ["Создать заявку"], ["Мои заявки"], # ["Мои завершенные запросы"] ]) tb.send_message(user.telegram_chat_id, "Вы были переведены в раздел для обычных клиентов", reply_markup=keyboard) except Exception as e: print("Cant promote to stp, reason: %s" % e) return redirect(url_for('stp.index_view'))
def promote_to_stp(user): tb = telebot.TeleBot(config.token) user = User.get(id=user) user.state = 'stp_main_menu' user.save() stp = Stp.get_or_create(user=user)[0] stp.is_active = True stp.save() try: keyboard = generate_custom_keyboard( types.ReplyKeyboardMarkup, buttons=[ ["Список запросов"], ["Мои активные запросы"], # ["Мои завершенные запросы"] ]) tb.send_message( user.telegram_chat_id, "Вы были переведены в раздел СТП, команды находятся под полем ввода", reply_markup=keyboard) except Exception as e: print("Cant promote to stp, reason: %s" % e) return redirect(url_for('stp.edit_view', id=stp.id))
def _show_request_history(self, request_id, page=0): r = Request.get(id=request_id) messages = Message.select().where(Message.request == request_id).offset(page * CHAT_PAGE_SIZE).limit( CHAT_PAGE_SIZE) req_len = len(messages) stp_user = Stp.get(id=r.stp).user if req_len: for i in range(req_len): text = "<code>%s</code>\n%s" % ( "Клиент" if r.user == messages[i].from_user else ( "Вы" if messages[i].from_user == stp_user else "Тех. поддержка"), messages[i].text) messages[i].is_read = True messages[i].save() if req_len == CHAT_PAGE_SIZE and req_len == i + 1: self.tb.send_message(self.chat, text, reply_markup=generate_custom_keyboard(types.InlineKeyboardMarkup, [[get_button_inline( "Следующие %s сообщений" % CHAT_PAGE_SIZE, "next_chat_page %s" % (page + 1))]]), parse_mode='HTML') else: self.tb.send_message(self.chat, text, parse_mode='HTML') else: self.tb.send_message(self.chat, "Отображены все сообщения")
def is_not_stp(id): return Stp.select().where(Stp.user == id).where( Stp.is_active == True).count() == 0