def course_owner(call, lang): course_ = Course.Course(call.data['c_id']) text = msgs[lang]['teacher']['course_owner_full'].format( name=course_.name, num=len(course_.participants), lock=UI.to_dtime(course_.entry_restriction), desc=course_.description) c_text = msgs[lang]['confirm']['delete_course'].format(course_.name) markup = mkp.create( lang, [tbt.user_list(call.data['c_id'], lang)], [tbt.task_list(call.data['c_id'], lang)], [tbt.classwork_list(call.data['c_id'], lang)], [tbt.announce(call.data['c_id'], lang)], [ tbt.switch_lock(call.data['c_id'], True if course_.is_open else False, lang) ], [ cbt.confirm_action( 'delete_course', msgs[lang]['buttons']['confirm']['delete_course'], c_text, call.message.chat.id, call.message.message_id, c_id=course_.id) ]) botHelper.edit_mes(text, call, markup=markup)
def task(call, lang): course_ = Course.Course(call.data['c_id']) task_ = course_.task(call.data['t_id']) p = UI.Paging(course_.participants, sort_key='name') text = msgs[lang]['teacher']['management']['task'].format(name=task_.name, hmark=int(task_.highest_mark)) \ + p.msg(call.data['page'], lang) c_text = msgs[lang]['confirm']['delete_task'].format(task_.name) markup = mkp.create_listed( lang, tbt.user_tasks_list(p.list(call.data['page']), call.data['c_id'], call.data['t_id']), tbt.task, call.data['c_id'], call.data['t_id'], lang, call.data['page']) mkp.add_before_back( markup, cbt.confirm_action('del_task', msgs[lang]['buttons']['confirm']['del_task'], c_text, call.message.chat.id, call.message.message_id, c_id=call.data['c_id'], t_id=call.data['t_id'])) botHelper.edit_mes(text, call, markup=markup)
def course_list(call, lang): if call.data['type'] == 'all': # TODO не добавлять закрытые курсы courses = [i for i in Course.fetch_all_courses()] text = msgs[lang]['common']['all'] elif call.data['type'] == 'my': courses = [i for i in User.User(call.message.chat.id).participation] text = msgs[lang]['common']['my'] elif call.data['type'] == 'teach': courses = [i for i in User.User(call.message.chat.id).possessions] text = msgs[lang]['common']['teach'] else: botHelper.error(call=call) return page = call.data['page'] p = UI.Paging(courses, sort_key='name') text += p.msg(call.data['page'], lang) if call.data['type'] == 'teach': markup = mkp.create_listed(lang, tbt.courses(p.list(page)), tbt.manage_list, lang, page) else: markup = mkp.create_listed(lang, cbt.courses(p.list(page)), cbt.course_list_of, call.data['type'], lang, page) botHelper.edit_mes(text, call, markup=markup)
def cw(call, lang): course_ = Course.Course(call.data['c_id']) classwork = course_.classwork(call.data['cw_id']) p = UI.Paging(course_.participants, sort_key='name') text = msgs[lang]['teacher']['management']['classwork'].format( date=classwork.date) + p.msg(call.data['page'], lang) c_text = msgs[lang]['confirm']['delete_class'].format(classwork.name) markup = mkp.create_listed( lang, tbt.user_attendance_list(p.list(call.data['page']), call.data['c_id'], call.data['cw_id']), tbt.classwork, call.data['c_id'], call.data['cw_id'], lang, call.data['page']) mkp.add_before_back( markup, tbt.invert_attendance(call.data['c_id'], call.data['cw_id'], lang)) mkp.add_before_back( markup, tbt.change_cw_date(call.data['c_id'], call.data['cw_id'], lang)) mkp.add_before_back( markup, cbt.confirm_action('del_class', msgs[lang]['buttons']['confirm']['del_class'], c_text, call.message.chat.id, call.message.message_id, c_id=call.data['c_id'], cw_id=call.data['cw_id'])) botHelper.edit_mes(text, call, markup=markup)
def announce(call): def return_to_menu(): new_mes = botHelper.send_mes('empty', call.message.chat.id) botHelper.renew_menu(call, new_mes) back(call, True) def cancel(): botHelper.send_mes(msgs[lang]['teacher']['announce']['cancel']) return_to_menu() def send(): course_ = Course.Course(call.data['c_id']) for part in course_.participants: try: botHelper.send_mes( msgs[lang]['teacher']['announce']['got_announce'].format( course_.name), part.id) botHelper.send_mes(announce_info['text'], part.id) for file, caption in zip(announce_info['file'], announce_info['file_caption']): bot.send_document(part.id, file, caption=caption) except TBotApiException: continue botHelper.send_mes(msgs[lang]['teacher']['announce']['sent'], call.message.chat.id) return_to_menu() def get_file(message): if message.text == '/exit': cancel() elif message.text == '/send': send() else: if message.document: announce_info['file'].append(message.document.file_id) announce_info['file_caption'].append(message.caption) bot.register_next_step_handler(message, get_file) def get_text(message): if message.text == '/exit': cancel() else: announce_info['text'] = message.text botHelper.send_mes(msgs[lang]['teacher']['announce']['files'], call.message.chat.id) bot.register_next_step_handler(message, get_file) call.data = json.loads(call.data) lang = get_lang(call.message.chat.id) announce_info = {'text': '', 'file': [], 'file_caption': []} botHelper.edit_mes(msgs[lang]['teacher']['announce']['begin'], call) botHelper.send_mes(msgs[lang]['teacher']['announce']['input_text'], call.message.chat.id) bot.register_next_step_handler(call.message, get_text)
def confirm(call): call.data = json.loads(call.data) text = botHelper.get_from_disc(get_confirm_message, call=call) if text: botHelper.edit_mes(text, call, markup=mkp.create_confirm( get_lang(call.message.chat.id), call.data))
def st_tsk(call, lang): task_ = Course.Task(call.data['c_id'], call.data['t_id']) text = msgs[lang]['student']['student_task'].format( name=task_.name, desc=task_.description, mark=task_.mark(call.message.chat.id).value, hmark=int(task_.highest_mark)) botHelper.edit_mes(text, call, markup=mkp.create(lang))
def st_task_list(call, lang): p = UI.Paging(Course.Course(call.data['c_id']).tasks, sort_key='name') text = msgs[lang]['student']['task_list'] + p.msg(call.data['page'], lang) markup = mkp.create_listed(lang, cbt.tasks(p.list(call.data['page'])), cbt.task_list, call.data['c_id'], lang, call.data['page']) botHelper.edit_mes(text, call, markup=markup)
def user_list(call, lang): p = UI.Paging(Course.Course(call.data['c_id']).participants, sort_key='name') text = msgs[lang]['teacher']['management']['user_list'] + p.msg( call.data['page'], lang) markup = mkp.create_listed( lang, tbt.users(p.list(call.data['page']), call.data['c_id']), tbt.user_list, call.data['c_id'], lang, call.data['page']) botHelper.edit_mes(text, call, markup=markup)
def task_list(call, lang): tasks = Course.Course(call.data['c_id']).tasks p = UI.Paging(tasks, sort_key='name') text = msgs[lang]['teacher']['management']['task_list'] + p.msg( call.data['page'], lang) markup = mkp.create_listed(lang, tbt.tasks(p.list(call.data['page'])), tbt.task_list, call.data['c_id'], lang, call.data['page']) mkp.add_before_back(markup, tbt.new_task(call.data['c_id'], lang)) botHelper.edit_mes(text, call, markup=markup)
def usr_mng(call, lang): course_ = Course.Course(call.data['c_id']) tasks = course_.tasks user = User.User(call.data['u_id']) cws = course_.classworks if tasks: total_mark = sum( filter(None, map(lambda x: x.mark(call.data['u_id']).value, tasks))) mean_mark = total_mark / len(tasks) else: total_mark = None mean_mark = None if cws: overall = len(cws) att = sum(map(lambda cw_: cw_.attendance(call.data['u_id']).value, cws)) else: overall = None att = None text = msgs[lang]['teacher']['management']['user'].format( course=course_.name, name=user.name, email='', mean=mean_mark, total=total_mark, attend=att, attend_tot=overall) c_text = msgs[lang]['confirm']['kick'].format(user.name) markup = mkp.create(lang, [ cbt.confirm_action('kick', msgs[lang]['buttons']['confirm']['kick'], c_text, call.message.chat.id, call.message.message_id, c_id=call.data['c_id'], u_id=call.data['u_id']) ]) botHelper.edit_mes(text, call, markup=markup)
def menu(call): lang = get_lang(call.message.chat.id) if User.User(call.message.chat.id).type_u == 'student': markup = mkp.create( lang, [cbt.course_list_of('all', lang), cbt.course_list_of('my', lang)], include_back=False) botHelper.edit_mes(msgs[lang]['common']['menu'], call, markup=markup) else: markup = mkp.create( lang, [cbt.course_list_of('all', lang), cbt.course_list_of('my', lang)], [tbt.manage_list(lang)], [tbt.new_course(lang)], include_back=False) botHelper.edit_mes(msgs[lang]['common']['menu'], call, markup=markup)
def cw_date(call): def return_to_menu(): new_mes = botHelper.send_mes('empty', call.message.chat.id) botHelper.renew_menu(call, new_mes) back(call, True) def get_date(message): if message.text == '/exit': return_to_menu() elif re.fullmatch(r'\d{1,2}\s\d{1,2}\s\d{1,2}', message.text): in_date = message.text.split() cw_ = Course.Classwork(call.data['c_id'], call.data['cw_id']) try: date = datetime.date(2000 + int(in_date[0]), int(in_date[1]), int(in_date[2])).strftime('%d %b %Y') except ValueError: botHelper.send_mes( msgs[get_lang(call.message.chat.id)]['teacher'] ['management']['wrong_input'], message.messasge_id) bot.register_next_step_handler(message, get_date) else: cw_.date = date cw_.name = date return_to_menu() else: botHelper.send_mes( msgs[get_lang(call.message.chat.id)]['teacher']['management'] ['wrong_input'], message.messasge_id) bot.register_next_step_handler(message, get_date) call.data = json.loads(call.data) botHelper.edit_mes( msgs[get_lang( call.message.chat.id)]['teacher']['management']['input_date'], call) bot.register_next_step_handler(call.message, get_date)
def do_tsk(call): def return_to_menu(): new_mes = botHelper.send_mes('empty', call.message.chat.id) botHelper.renew_menu(call, new_mes) back(call, True) def get_mark(message): if message.text == '/exit': return_to_menu() elif message.text == '-1': mark.value = None elif re.fullmatch(r'\d+', message.text): if int(message.text) <= task_.highest_mark: mark.value = int(message.text) return_to_menu() else: botHelper.send_mes(msgs[get_lang(call.message.chat.id)] ['teacher']['management']['error_mark']) bot.register_next_step_handler(message, get_mark) else: botHelper.send_mes(msgs[get_lang( call.message.chat.id)]['teacher']['management']['wrong_input']) bot.register_next_step_handler(message, get_mark) call.data = json.loads(call.data) task_ = Course.Task(call.data['c_id'], call.data['t_id']) mark = Course.Mark(call.data['c_id'], call.data['t_id'], call.data['u_id']) text = msgs['mark_one'].format(task=task_.name, user=User.User(call.data['u_id']).name, mark=mark.value, max=task_.highest_mark) botHelper.edit_mes(text, call) bot.register_next_step_handler(call.message, get_mark)
def course(call, lang): course_ = Course.Course(call.data['c_id']) num_par = len(course_.participants) owner = course_.owner if owner.id == call.message.chat.id: # owner if course_.is_open: lock = msgs[lang]['teacher']['lock_open'] else: lock = msgs[lang]['teacher']['lock_close'] desc = course_.description if len(desc) > UI.constants.COURSE_INFO_DESC_LENGTH: desc = botHelper.remove_danger( desc[:UI.constants.COURSE_INFO_DESC_LENGTH]) + '...' botHelper.edit_mes( msgs[lang]['teacher']['course_owner_min'].format(name=course_.name, num=num_par, lock=lock, desc=desc), call, markup=mkp.create(lang, [tbt.manage(call.data['c_id'], lang)])) elif course_.id in (c.id for c in User.User(call.message.chat.id).participation ): # enrolled cws = course_.classworks attend_text = '' overall = len(cws) if overall: att = sum( map(lambda cw_: cw_.attendance(call.message.chat.id).value, cws)) attend_text = msgs[lang]['student']['attendance'].format( count=att, overall=overall, ratio=int(att / overall * 100)) tasks = course_.tasks if tasks: total_mark = sum( map(lambda task_: task_.mark(call.message.chat.id).value, tasks)) mean_mark = total_mark / len(tasks) mark_text = msgs[lang]['student']['marks'].format( total_mark, round(mean_mark, 2)) else: mark_text = '' text = msgs[lang]['student']['course'].format(name=course_.name, fio=owner.name, num=num_par, mail='', marks=mark_text, attend=attend_text) c_text = msgs[lang]['confirm']['leave_course'].format(course_.name) if not course_.is_open: c_text += msgs[lang]['confirm']['leave_course_append'] markup = mkp.create(lang, [cbt.task_list(call.data['c_id'], lang)], [ cbt.confirm_action('leave', msgs[lang]['buttons']['confirm']['leave'], c_text, call.message.chat.id, call.message.message_id, c_id=course_.id) ]) botHelper.edit_mes(text, call, markup=markup) else: # not enrolled locked = '' if course_.is_open else msgs[lang]['student'][ 'course_closed'] end_entry = course_.entry_restriction lock = UI.to_dtime( end_entry) if end_entry else msgs[lang]['student']['lock_absent'] text = msgs[lang]['student']['course_not_enroll'].format( name=course_.name, fio=owner.name, desc=course_.description, num=num_par, lock=lock, mail='', locked=locked) # TODO mail c_text = msgs[lang]['confirm']['enroll_course'].format(course_.name) if locked: markup = mkp.create(lang) else: markup = mkp.create(lang, [ cbt.confirm_action('enroll', msgs[lang]['buttons']['confirm']['enroll'], c_text, call.message.chat.id, call.message.message_id, c_id=course_.id) ]) botHelper.edit_mes(text, call, markup=markup)
def new_task(call): def return_to_menu(): new_mes = botHelper.send_mes('empty', call.message.chat.id) botHelper.renew_menu(call, new_mes) back(call, True) def cancel(): botHelper.send_mes(msgs[lang]['teacher']['task_create']['canceled'], call.message.chat.id) return_to_menu() def create(): name = task_info['name'] if not name: name = msgs[lang]['teacher']['task_create']['name'] + str( len(Course.Course(call.data['c_id']).tasks) + 1) Course.Task(course_id=call.data['c_id'], name=name, description=task_info['desc'].format(task_info['hmark']), highest_mark=task_info['hmark']) botHelper.send_mes(msgs[lang]['teacher']['task_create']['created'], call.message.chat.id) return_to_menu() def get_hmark(message): if message.text == '/exit': cancel() else: if message.text != '0' and re.fullmatch(r'\d+', message.text): task_info['hmark'] = int(message.text) create() else: botHelper.send_mes( msgs[lang]['teacher']['task_create']['error_max_mark'], call.message.chat.id) bot.register_next_step_handler(message, get_hmark) def get_desc(message): if message.text == '/exit': cancel() else: if len(message.text) <= UI.constants.TASK_DESC_MAX_LENGTH: if message.text != '/no': task_info['desc'] += message.text botHelper.send_mes( msgs[lang]['teacher']['task_create']['input_max_mark'], call.message.chat.id) bot.register_next_step_handler(message, get_hmark) else: botHelper.send_mes( msgs[lang]['teacher']['task_create'] ['error_length'].format(UI.constants.TASK_DESC_MAX_LENGTH), call.message.chat.id) bot.register_next_step_handler(message, get_desc) def get_name(message): if message.text == '/exit': cancel() return_to_menu() else: if len(message.text) <= UI.constants.TASK_NAME_MAX_LENGTH: if message.text != '/no': task_info['name'] = message.text botHelper.send_mes( msgs[lang]['teacher']['task_create']['input_desc'], call.message.chat.id) bot.register_next_step_handler(message, get_desc) else: botHelper.send_mes( msgs[lang]['teacher']['task_create'] ['error_length'].format(UI.constants.TASK_NAME_MAX_LENGTH), call.message.chat.id) bot.register_next_step_handler(message, get_name) call.data = json.loads(call.data) lang = get_lang(call.message.chat.id) task_info = { 'name': '', 'desc': msgs[lang]['teacher']['task_create']['max_mark'], 'hmark': 0 } botHelper.edit_mes(msgs[lang]['teacher']['task_create']['begin'], call) botHelper.send_mes(msgs[lang]['teacher']['task_create']['input_name'], call.message.chat.id) bot.register_next_step_handler(call.message, get_name)
def new_course(call): botHelper.edit_mes( msgs[get_lang( call.message.chat.id)]['teacher']['course_create']['begin'], call) create_course(call.message.chat.id)