Esempio n. 1
0
def question_1_handler(update: Update, context: CallbackContext) -> int:
    text = messageTextProvider.get_question_1_state_text()
    reply_keyboard = [['1', '2'], ['3', 'Больше трех']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    helpers.get_message(update).reply_text(text, reply_markup=keyboard_markup)
    return states.QUESTION_1_STATE
Esempio n. 2
0
def survey_finish_handler(update: Update, context: CallbackContext) -> int:
    text = messageTextProvider.get_survey_finish_state_text()
    reply_keyboard = [['Да', 'Нет']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    helpers.get_message(update).reply_text(text, reply_markup=keyboard_markup)
    context.user_data['state'] = states.SURVEY_FINISH_STATE
    return states.SURVEY_FINISH_STATE
Esempio n. 3
0
def start_state_handler(update: Update, context: CallbackContext) -> int:
    # TODO: проверить, проходил ли юзер раньше этот опрос. если проходил то надо предупредить что ответы перезапишутся

    text = messageTextProvider.get_start_state_text()
    reply_keyboard = [['Начнем']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    helpers.get_message(update).reply_text(text, reply_markup=keyboard_markup)
    return states.START_STATE
Esempio n. 4
0
def part_2_question_1_handler(update: Update, context: CallbackContext) -> int:
    context.user_data['part_number'] = 2

    keys = [f'question{i+1}' for i in range(7)]
    for key in keys:
        answerHelper.set_empty_answer(context.user_data, key)

    text = '*Для чего* учите новый язык?'
    helpers.get_message(update).reply_text(text, parse_mode='Markdown')
    return states.PART_2_QUESTION_1_STATE
Esempio n. 5
0
def part_3_question_1_handler(update: Update, context: CallbackContext) -> int:
    context.user_data['part_number'] = 3

    keys = [str(i + 1)
            for i in range(7)] + ['4_1', '4_2', '4_3', '5_1', '5_2', '5_3']
    keys.sort()
    keys = [f'question{key}' for key in keys]
    for key in keys:
        answerHelper.set_empty_answer(context.user_data, key)

    text = 'Какие техники/приложения использовали для запоминания новых слов?'
    helpers.get_message(update).reply_text(text)
    return states.PART_3_QUESTION_1_STATE
Esempio n. 6
0
def total_finish_handler(update: Update, context: CallbackContext) -> int:
    if context.user_data['state'] == states.PLANS_INFO_STATE:
        answerHelper.save_answer(update.message, context, 'final1')
    else:
        answerHelper.set_empty_answer(context.user_data, 'final1')

    answerHelper.save_user_answers_to_file(update.effective_user,
                                           context.user_data)

    text = 'Теперь точно всё :) Спасибо и до скорых встреч!'
    helpers.get_message(update).reply_text(text,
                                           reply_markup=ReplyKeyboardRemove())
    return ConversationHandler.END
def part_1_question_1_handler(update: Update, context: CallbackContext) -> int:
    context.user_data['part_number'] = 1

    keys = [f'question{i+1}' for i in range(4)]
    for key in keys:
        answerHelper.set_empty_answer(context.user_data, key)

    text = 'Вы же как-то ищете перевод/смысл иностранных слов?'
    reply_keyboard = [['Да', 'Нет']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    helpers.get_message(update).reply_text(text, reply_markup=keyboard_markup)
    context.user_data['state'] = states.PART_1_QUESTION_1_STATE
    return states.PART_1_QUESTION_1_STATE
Esempio n. 8
0
def admin_state_handler(update: Update, context: CallbackContext,
                        admin_ids) -> int:
    user = helpers.get_message(update).from_user
    logger.info(f'@{user.username} tried to log in to the admin area')
    if user.id not in admin_ids:
        return states.START_STATE

    text = 'Вы вошли в админку.'
    reply_keyboard = [['Получить список проголосовавших'],
                      ['Экспорт результатов в HTML']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    helpers.get_message(update).reply_text(text, reply_markup=keyboard_markup)
    return states.ADMIN_STATE
Esempio n. 9
0
def part_4_question_4_1_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question4')
    text = 'Как находили правильный перевод?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_4_1_STATE
Esempio n. 10
0
def part_4_question_12_handler(update: Update,
                               context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question11')
    text = 'Что вас *мотивирует* изучать новый язык?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_12_STATE
Esempio n. 11
0
def part_3_question_5_2_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question5_1')
    text = 'Как думаете, вам поможет знание двух языков в изучении третьего? Если да, то чем?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_3_QUESTION_5_2_STATE
Esempio n. 12
0
def part_1_question_3_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question2')
    text = 'Как убеждаетесь в правильном смысле перевода? Бывает ли так, что уместный перевод не сразу находится?'
    message.reply_text(text)
    context.user_data['state'] = states.PART_1_QUESTION_3_STATE
    return states.PART_1_QUESTION_3_STATE
Esempio n. 13
0
def part_4_question_10_handler(update: Update,
                               context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question9')
    text = 'Как отслеживаете свой *текущий уровень* в изучении нового языка?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_10_STATE
Esempio n. 14
0
def part_3_question_4_1_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question4')
    text = 'Сколько примерно слов сейчас знаете?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_3_QUESTION_4_1_STATE
Esempio n. 15
0
def admin_export_state_handler(update: Update,
                               context: CallbackContext) -> int:
    message = helpers.get_message(update)
    user = message.from_user
    logger.info(f'@{user.username} exported survey results')

    export_dir_path = export.Export().export_to_html(
        user.id, should_remove_original_files=False)
    export_dir_path = os.path.normpath(export_dir_path)
    archive_file_name = os.path.split(export_dir_path)[-1]
    zip_file = shutil.make_archive(
        archive_file_name,
        'zip',
        root_dir=export_dir_path,
        base_dir='.',
    )

    reply_keyboard = [['Вернуться в главное меню админки']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    with open(zip_file, 'rb') as f:
        message.reply_document(f,
                               reply_markup=keyboard_markup,
                               reply_to_message_id=message.message_id)

    os.remove(zip_file)
    return states.ADMIN_EXPORT_RESULT_STATE
Esempio n. 16
0
def part_3_question_5_1_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question5')
    text = 'Что вас мотивирует, а что останавливает?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_3_QUESTION_5_1_STATE
Esempio n. 17
0
def part_3_question_4_2_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question4_1')
    text = 'Чем пользовались чтобы узнать это число?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_3_QUESTION_4_2_STATE
Esempio n. 18
0
def part_4_question_11_handler(update: Update,
                               context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question10')
    text = 'Отслеживаете текущее количество известных слов? Если да, то как?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_11_STATE
Esempio n. 19
0
def part_1_question_4_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question1')

    text = 'Эх, тогда вопросов больше нет :) Расскажите, на ваш взгляд, как эффективней запоминать слова иностранного язык?'
    message.reply_text(text)
    context.user_data['state'] = states.PART_1_QUESTION_4_STATE
    return states.PART_1_QUESTION_4_STATE
Esempio n. 20
0
def part_4_question_4_2_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question4_1')
    text = 'Что помогает найти правильный смысл слова?'
    message.reply_text(text, parse_mode='Markdown')
    context.user_data['state'] = states.PART_4_QUESTION_4_2_STATE
    return states.PART_4_QUESTION_4_2_STATE
Esempio n. 21
0
def part_4_question_8_yes_1_handler(update: Update,
                                    context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question8')
    text = 'Чем полезно проверять перевод нового слова сразу на несколько языков?'
    message.reply_text(text, parse_mode='Markdown')
    context.user_data['state'] = states.PART_4_QUESTION_8_YES_1_STATE
    return states.PART_4_QUESTION_8_YES_1_STATE
Esempio n. 22
0
def part_4_question_8_no_1_handler(update: Update,
                                   context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question8')
    text = 'Как узнаете смысл слова? Переводите обычно только на свой родной язык или как-то иначе?'
    message.reply_text(text, parse_mode='Markdown')
    context.user_data['state'] = states.PART_4_QUESTION_8_NO_1_STATE
    return states.PART_4_QUESTION_8_NO_1_STATE
Esempio n. 23
0
def part_3_question_4_3_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question4_2')
    text = 'Продолжаете набирать словарный запас?'
    message.reply_text(text, parse_mode='Markdown')
    context.user_data['state'] = states.PART_3_QUESTION_4_3_STATE
    return states.PART_3_QUESTION_4_3_STATE
Esempio n. 24
0
def part_3_question_5_3_handler(update: Update,
                                context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question5_2')
    text = 'С чего начнёте учить новый язык?'
    message.reply_text(text, parse_mode='Markdown')
    context.user_data['state'] = states.PART_3_QUESTION_5_3_STATE
    return states.PART_3_QUESTION_5_3_STATE
Esempio n. 25
0
def part_4_question_5_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    if context.user_data['state'] == states.PART_4_QUESTION_4_STATE:
        answerHelper.save_answer(message, context, 'question4')
    elif context.user_data['state'] == states.PART_4_QUESTION_4_2_STATE:
        answerHelper.save_answer(message, context, 'question4_2')

    text = 'Какие *методики/приложения* используете чтобы запоминать новые слова?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_5_STATE
Esempio n. 26
0
def part_3_question_4_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question3')
    text = 'Когда-нибудь проверяли сколько вы знаете слов?'
    reply_keyboard = [['Да', 'Нет']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    message.reply_text(text, reply_markup=keyboard_markup)
    context.user_data['state'] = states.PART_3_QUESTION_4_STATE
    return states.PART_3_QUESTION_4_STATE
Esempio n. 27
0
def part_4_question_8_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question7')
    text = 'Проверяете ли значение нового слова переводя на разные известные вам языки?'
    reply_keyboard = [['Да', 'Нет']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    message.reply_text(text, reply_markup=keyboard_markup)
    context.user_data['state'] = states.PART_4_QUESTION_8_STATE
    return states.PART_4_QUESTION_8_STATE
Esempio n. 28
0
def part_4_question_9_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    if context.user_data['state'] == states.PART_4_QUESTION_8_YES_1_STATE:
        answerHelper.save_answer(message, context, 'question8_yes_1')
    elif context.user_data['state'] == states.PART_4_QUESTION_8_NO_1_STATE:
        answerHelper.save_answer(message, context, 'question8_no_1')

    text = 'Что бы хотели улучшить, *сделать более эффективным*, в процессе изучения языка?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_4_QUESTION_9_STATE
Esempio n. 29
0
def part_3_question_6_handler(update: Update, context: CallbackContext) -> int:
    message = helpers.get_message(update)
    if context.user_data['state'] == states.PART_3_QUESTION_5_3_STATE:
        answerHelper.save_answer(message, context, 'question5_3')
    elif context.user_data['state'] == states.PART_3_QUESTION_5_STATE:
        answerHelper.save_answer(message, context, 'question5')

    text = 'Какой мотивации не хватает чтобы начать изучать новый язык?'
    message.reply_text(text, parse_mode='Markdown')
    return states.PART_3_QUESTION_6_STATE
Esempio n. 30
0
def part_3_survey_finish_handler(update: Update,
                                 context: CallbackContext) -> int:
    message = helpers.get_message(update)
    answerHelper.save_answer(message, context, 'question6')
    text = messageTextProvider.get_survey_finish_state_text()
    reply_keyboard = [['Да', 'Нет']]
    keyboard_markup = ReplyKeyboardMarkup(reply_keyboard,
                                          one_time_keyboard=True)
    message.reply_text(text, reply_markup=keyboard_markup)
    context.user_data['state'] = states.SURVEY_FINISH_STATE
    return states.SURVEY_FINISH_STATE
Esempio n. 31
0
    def wsdl_parse(self, url, cache=False):
        "Parse Web Service Description v1.1"

        log.debug("wsdl url: %s" % url)
        # Try to load a previously parsed wsdl:
        force_download = False
        if cache:
            # make md5 hash of the url for caching...
            filename_pkl = "%s.pkl" % hashlib.md5(url).hexdigest()
            if isinstance(cache, basestring):
                filename_pkl = os.path.join(cache, filename_pkl)
            if os.path.exists(filename_pkl):
                log.debug("Unpickle file %s" % (filename_pkl,))
                f = open(filename_pkl, "r")
                pkl = pickle.load(f)
                f.close()
                # sanity check:
                if pkl["version"][:-1] != __version__.split(" ")[0][:-1] or pkl["url"] != url:
                    import warnings

                    warnings.warn("version or url mismatch! discarding cached wsdl", RuntimeWarning)
                    log.debug("Version: %s %s" % (pkl["version"], __version__))
                    log.debug("URL: %s %s" % (pkl["url"], url))
                    force_download = True
                else:
                    self.namespace = pkl["namespace"]
                    self.documentation = pkl["documentation"]
                    return pkl["services"]

        soap_ns = {
            "http://schemas.xmlsoap.org/wsdl/soap/": "soap11",
            "http://schemas.xmlsoap.org/wsdl/soap12/": "soap12",
        }
        wsdl_uri = "http://schemas.xmlsoap.org/wsdl/"
        xsd_uri = "http://www.w3.org/2001/XMLSchema"
        xsi_uri = "http://www.w3.org/2001/XMLSchema-instance"

        get_local_name = lambda s: s and str((":" in s) and s.split(":")[1] or s)
        get_namespace_prefix = lambda s: s and str((":" in s) and s.split(":")[0] or None)

        # always return an unicode object:
        REVERSE_TYPE_MAP[u"string"] = unicode

        # Open uri and read xml:
        xml = fetch(url, self.http, cache, force_download, self.wsdl_basedir)
        # Parse WSDL XML:
        wsdl = SimpleXMLElement(xml, namespace=wsdl_uri)

        # detect soap prefix and uri (xmlns attributes of <definitions>)
        xsd_ns = None
        soap_uris = {}
        for k, v in wsdl[:]:
            if v in soap_ns and k.startswith("xmlns:"):
                soap_uris[get_local_name(k)] = v
            if v == xsd_uri and k.startswith("xmlns:"):
                xsd_ns = get_local_name(k)

        # Extract useful data:
        self.namespace = wsdl["targetNamespace"]
        self.documentation = unicode(wsdl("documentation", error=False) or "")

        services = {}
        bindings = {}  # binding_name: binding
        operations = {}  # operation_name: operation
        port_type_bindings = {}  # port_type_name: binding
        messages = {}  # message: element
        elements = {}  # element: type def

        for service in wsdl.service:
            service_name = service["name"]
            if not service_name:
                continue  # empty service?
            log.debug("Processing service %s" % service_name)
            serv = services.setdefault(service_name, {"ports": {}})
            serv["documentation"] = service["documentation"] or ""
            for port in service.port:
                binding_name = get_local_name(port["binding"])
                operations[binding_name] = {}
                address = port("address", ns=soap_uris.values(), error=False)
                location = address and address["location"] or None
                soap_uri = address and soap_uris.get(address.get_prefix())
                soap_ver = soap_uri and soap_ns.get(soap_uri)
                bindings[binding_name] = {
                    "name": binding_name,
                    "service_name": service_name,
                    "location": location,
                    "soap_uri": soap_uri,
                    "soap_ver": soap_ver,
                }
                serv["ports"][port["name"]] = bindings[binding_name]

        for binding in wsdl.binding:
            binding_name = binding["name"]
            soap_binding = binding("binding", ns=soap_uris.values(), error=False)
            transport = soap_binding and soap_binding["transport"] or None
            port_type_name = get_local_name(binding["type"])
            bindings[binding_name].update({"port_type_name": port_type_name, "transport": transport, "operations": {}})
            if port_type_name not in port_type_bindings:
                port_type_bindings[port_type_name] = []
            port_type_bindings[port_type_name].append(bindings[binding_name])
            for operation in binding.operation:
                op_name = operation["name"]
                op = operation("operation", ns=soap_uris.values(), error=False)
                action = op and op["soapAction"]
                d = operations[binding_name].setdefault(op_name, {})
                bindings[binding_name]["operations"][op_name] = d
                d.update({"name": op_name})
                d["parts"] = {}
                # input and/or ouput can be not present!
                input = operation("input", error=False)
                body = input and input("body", ns=soap_uris.values(), error=False)
                d["parts"]["input_body"] = body and body["parts"] or None
                output = operation("output", error=False)
                body = output and output("body", ns=soap_uris.values(), error=False)
                d["parts"]["output_body"] = body and body["parts"] or None
                header = input and input("header", ns=soap_uris.values(), error=False)
                d["parts"]["input_header"] = header and {"message": header["message"], "part": header["part"]} or None
                header = output and output("header", ns=soap_uris.values(), error=False)
                d["parts"]["output_header"] = header and {"message": header["message"], "part": header["part"]} or None
                if action:
                    d["action"] = action

        # check axis2 namespace at schema types attributes
        self.namespace = dict(wsdl.types("schema", ns=xsd_uri)[:]).get("targetNamespace", self.namespace)

        imported_schemas = {}

        # process current wsdl schema:
        for schema in wsdl.types("schema", ns=xsd_uri):
            preprocess_schema(
                schema,
                imported_schemas,
                elements,
                xsd_uri,
                self.__soap_server,
                self.http,
                cache,
                force_download,
                self.wsdl_basedir,
            )

        postprocess_element(elements)

        for message in wsdl.message:
            log.debug("Processing message %s" % message["name"])
            for part in message("part", error=False) or []:
                element = {}
                element_name = part["element"]
                if not element_name:
                    # some implementations (axis) uses type instead
                    element_name = part["type"]
                type_ns = get_namespace_prefix(element_name)
                type_uri = wsdl.get_namespace_uri(type_ns)
                if type_uri == xsd_uri:
                    element_name = get_local_name(element_name)
                    fn = REVERSE_TYPE_MAP.get(unicode(element_name), None)
                    element = {part["name"]: fn}
                    # emulate a true Element (complexType)
                    messages.setdefault((message["name"], None), {message["name"]: OrderedDict()}).values()[0].update(
                        element
                    )
                else:
                    element_name = get_local_name(element_name)
                    fn = elements.get(make_key(element_name, "element"))
                    if not fn:
                        # some axis servers uses complexType for part messages
                        fn = elements.get(make_key(element_name, "complexType"))
                        element = {message["name"]: {part["name"]: fn}}
                    else:
                        element = {element_name: fn}
                    messages[(message["name"], part["name"])] = element

        for port_type in wsdl.portType:
            port_type_name = port_type["name"]
            log.debug("Processing port type %s" % port_type_name)

            for binding in port_type_bindings[port_type_name]:
                for operation in port_type.operation:
                    op_name = operation["name"]
                    op = operations[str(binding["name"])][op_name]
                    op["documentation"] = unicode(operation("documentation", error=False) or "")
                    if binding["soap_ver"]:
                        # TODO: separe operation_binding from operation (non SOAP?)
                        if operation("input", error=False):
                            input_msg = get_local_name(operation.input["message"])
                            input_header = op["parts"].get("input_header")
                            if input_header:
                                header_msg = get_local_name(input_header.get("message"))
                                header_part = get_local_name(input_header.get("part"))
                                # warning: some implementations use a separate message!
                                header = get_message(messages, header_msg or input_msg, header_part)
                            else:
                                header = None  # not enought info to search the header message:
                            op["input"] = get_message(messages, input_msg, op["parts"].get("input_body"))
                            op["header"] = header
                        else:
                            op["input"] = None
                            op["header"] = None
                        if operation("output", error=False):
                            output_msg = get_local_name(operation.output["message"])
                            op["output"] = get_message(messages, output_msg, op["parts"].get("output_body"))
                        else:
                            op["output"] = None

        # dump the full service/port/operation map
        # log.debug(pprint.pformat(services))

        # Save parsed wsdl (cache)
        if cache:
            f = open(filename_pkl, "wb")
            pkl = {
                "version": __version__.split(" ")[0],
                "url": url,
                "namespace": self.namespace,
                "documentation": self.documentation,
                "services": services,
            }
            pickle.dump(pkl, f)
            f.close()

        return services