Example #1
0
def _get_printable_info():
    """
    Построение ответа сервера на запрос.
    :return: Ответ сервера на запрос
    """
    form = cgi.FieldStorage()
    article_id = form.getvalue('id')

    # Если ID статьи не был дан или не является числом
    if not article_id or not article_id.isdigit():
        return dict(detail='ID is required')

    # Получение данных из полей формы
    article = {}
    for param in form.list:
        article[param.name] = param.value

    # Попытка обновления статьи в базе данных
    resp = requests.put('http://127.0.0.1:8000/db/' + article_id + '/',
                        data=article,
                        auth=get_auth_data())

    # Если операция прошла неуспешно
    if resp.status_code != 200:
        return resp.json()

    return {}
def _write_confirmation_to_db(email, confirmation):
    """
    Отправка данных о новом пользователе в базу данных.
    :param email: Почтовый адрес пользователя в назначенном домене
    :param confirmation: Ключ подтверждения, требуемый для верификации аккаунта
    :return: True - успешная операция, False - неудача
    """
    resp = requests.get('http://127.0.0.1:8000/db/users/' + email + '/').json()
    if not resp.get('id'):
        resp_create = requests.post('http://127.0.0.1:8000/db/users/',
                                    data={'email': email, 'activationKey': confirmation},
                                    auth=get_auth_data())
        return resp_create.status_code == 201
    db_id = resp['id']
    resp = requests.put('http://127.0.0.1:8000/db/users/' + str(db_id) + '/',
                        data={'email': email, 'activationKey': confirmation},
                        auth=get_auth_data())
    return resp.status_code == 200
Example #3
0
def _process_file(file_name):
    """
    Обработка полученного файла и выбача текста сообщения с результатом обработки.
    :param file_name: Имя файла для обработки
    :return: Сообщение с информацией об операции для вывода пользователю
    """
    # Открытие файла
    csv = open('tmp\\' + file_name, 'r')
    text = csv.read()
    # Инициализация списков ошибок и конфликтов
    err_elem = []
    confl_elem = []
    # Выбор типа содержимого (запятая или перенос строки)
    if ',' in text:
        text = text.replace('\n', '').split(',')
    else:
        text = text.split('\n')

    successful = 0
    # Для каждого элемента (логина) из файла
    for el in text:
        # Проверка на корректность
        if not re.fullmatch(r'[0-9A-Za-z.@]+', str(el)):
            err_elem.append(str(el))
            continue
        login = str(el)
        # При наличии домена - его проверка и отсечение
        if '@' in login:
            spl = login.split('@')
            if len(spl) != 2 or '@' + spl[1] != def_mail_domain():
                err_elem.append(el)
                continue
            login = str(spl[0])
        # Попытка записи в базу данных
        resp = requests.post('http://127.0.0.1:8000/db/users/',
                             data={'email': login},
                             auth=get_auth_data())
        # В случае ошибки - запись в список конфликтов (вероятно, уже существующий пользователь)
        if resp.status_code != 201:
            confl_elem.append(el)
        else:
            successful += 1

    res = '\\n' + 'Users added: ' + str(successful)
    # Печать текста об ошибках и конфликтах
    if len(err_elem) != 0:
        res += '\\n\\n' + 'There are some incorrect elements:'
        for el in err_elem:
            res += '\\n' + str(el)
    if len(confl_elem) != 0:
        res += '\\n\\n' + 'There are some conflict elements:'
        for el in confl_elem:
            res += '\\n' + str(el)
    return res
def load_users_file():
    # убеждаемся в наличии файла
    if not os.path.exists("user_dumps"):
        os.makedirs("user_dumps")
    # открываем окно загрузки файла
    root = Tk()
    root.filename = filedialog.askopenfilename(
        initialdir=os.getcwd() + "/user_dumps/",
        title="Choose your file",
        filetypes=(("JSON files", "*.json"), ("all files", "*.*")))
    # закрываем окно загрузки
    root.withdraw()
    # если пользователь не выбрал файла завершаем
    if not root.filename:
        print("Cancelled by user")
        return
    # открываем полученный файл
    infile = open(root.filename, "r")
    # выгружаем данные из файла
    users = json.load(infile)
    # инициализиуем счетчики количества
    counter_ok = 0
    counter_err = 0
    total = 0
    print("Starting...")
    # итерируемся по всем пользователям и добавляем в текущую базу
    for user in users:
        def_dict = dict(userID=user['userID'],
                        chatID=user['chatID'],
                        email=user['email'],
                        preferredLanguage=user['preferredLanguage'],
                        state=user['state'],
                        activationKey=user['activationKey'])
        resp = requests.post("http://127.0.0.1:8000/db/users/",
                             data=def_dict,
                             auth=get_auth_data())
        # считаем количество успехов/неуспехов
        if resp.status_code == 201:
            counter_ok += 1
        else:
            counter_err += 1
        total += 1
        # каждые 5 пользователей выводим строку с информацией
        if total % 5 == 0:
            print("\rAdding users: %s successful, %s unsuccessful%s" %
                  (counter_ok, counter_err, getProgress(total / 5 % 3 + 1)),
                  end='',
                  flush=True)
    time.sleep(0.5)
    print("\rFinished adding users: %s successful, %s unsuccessful" %
          (counter_ok, counter_err),
          end='',
          flush=True)
def confirm_keycode(user_id, chat_id, key):
    # получаем список пользователей
    resp = requests.get('http://127.0.0.1:8000/db/users/').json()
    # составляем ключ активации
    # keycode = str(user_id)+str(key)
    # ищем ключ в списке пользователей
    user_id = str(user_id)
    key = str(key)
    for user in resp:
        try:
            activation_data = json.loads(user['activationKey'])
        except Exception:
            continue
        if activation_data['user_id'] == user_id:
            # ищем пользователя с указанным user_id
            if activation_data['key'] == key:
                def_dict = dict(email=user['email'], activationKey='None', userID=user_id, chatID=chat_id)
                # Если ключ правильный, обновляем данные пользователя и удаляем подтверждение из базы
                resp_save = requests.put('http://127.0.0.1:8000/db/users/%s/' % user['id'], data=def_dict,
                                         auth=get_auth_data())
                add_activation_date(user_id)
                return True
            else:
                if activation_data['limit'] >= TRY_LIMIT:
                    # по достижении лимита попыток удаляем код подтверждения
                    def_dict = dict(email=user['email'], activationKey='None')
                    resp_save = requests.put('http://127.0.0.1:8000/db/users/%s/' % user['id'], data=def_dict,
                                             auth=get_auth_data())
                    return 'limit'
                else:
                    # инкрементируем счетчик при неправильном коде
                    activation_data['limit'] += 1
                    def_dict = dict(email=user['email'], activationKey=json.dumps(activation_data))
                    resp_save = requests.put('http://127.0.0.1:8000/db/users/%s/' % user['id'], data=def_dict,
                                             auth=get_auth_data())
                return False
    return False
def delete_invites():
    # подтверждение
    if not confirm():
        print("Cancelled by user")
        return
    # получаем список инвайтов
    resp = requests.get("http://127.0.0.1:8000/db/invites/")
    print("Starting...")
    counter = 0
    # удаляем инвайты и считаем их количество
    for invite in resp.json():
        requests.delete("http://127.0.0.1:8000/db/invites/%s/" % invite["id"],
                        auth=get_auth_data())
        counter += 1
    print("Finished, deleted %s invites" % counter)
Example #7
0
def tryPutUserWithEmail(newUID, chatID, invite):
    # Запрашиваем из базы пользователя
    invite_search = requests.get("http://127.0.0.1:8000/db/invites/")
    email = None
    invite_id = None
    # пытаемся получить email и id записи по коду инвайта
    for entry in invite_search.json():
        if entry['invite'] == invite:
            email = entry['email']
            invite_id = entry['id']
            break
    # если email так и не найден возвращаем неуспех
    if not email:
        return False
    resp = requests.get('http://127.0.0.1:8000/db/users/%s/' % email)
    # Если пользователь не найден завершаем создаем пользователя
    if resp.status_code != 200:
        def_dict = dict(email=email, userID=newUID, chatID=chatID, activationKey='None')

        # Попытка создания пользователя в базе данных
        resp_user = requests.post('http://127.0.0.1:8000/db/users/', data=def_dict, auth=get_auth_data())

        # Если создание пользователя в базе данных не удалось возвращаем неуспех
        if resp_user.status_code != 201:
            return False
        else:
            # если инвайт использован успешно, удаляем его
            resp = requests.delete('http://127.0.0.1:8000/db/invites/%s/' % invite_id, auth=get_auth_data())
            return True
    else:
        # Получаем данные пользователя
        our_user = resp.json()
        # Если у пользователя уже есть userID возвращаем неуспех
        if our_user['userID']:
            return False
        else:
            # Если данные совпадают, назначаем пользователю новыe userID и chatID, сбрасываем ключ активации
            auth_data = get_auth_data()
            resp = requests.put('http://127.0.0.1:8000/db/users/' + str(our_user['id']) + '/',
                                data={'email': email, 'userID': newUID, 'activationKey': 'None', 'chatID': chatID},
                                auth=auth_data)
            # После удачного запроса к БД возвращаем успех, если произошла ошибка возвращаем неуспех
            if resp.status_code != 200:
                return False
            else:
                # если инвайт использован успешно, удаляем его
                requests.delete('http://127.0.0.1:8000/db/invites/%s/' % invite_id, auth=get_auth_data())
                return True
def _get_printable_info():
    """
    Построение ответа сервера на запрос.
    :return: Ответ сервера на запрос
    """
    form = cgi.FieldStorage()
    article_id = form.getvalue('id')

    # Удаление статьи из базы данных
    resp = requests.delete('http://127.0.0.1:8000/db/' + article_id + '/', auth=get_auth_data())

    # Если операция прошла неуспешно
    if resp.status_code != 204:
        return resp.json()

    return {}
def _get_printable_info():
    """
        Построение ответа сервера на запрос.
        :return: Ответ сервера на запрос
        """
    form = cgi.FieldStorage()
    user_id = form.getvalue('id')
    if not user_id:
        return 'User ID is required'
    user_id = decrypt_uid(user_id)
    chat_id = form.getvalue('chat')
    if not chat_id:
        return 'Chat ID is required'
    chat_id = decrypt_uid(chat_id)
    # import smth
    email = form.getvalue('email')
    if not email:
        return 'Email is required'
    key = form.getvalue('key')
    if not key:
        return 'Key is required'

    resp = requests.get('http://127.0.0.1:8000/db/users/' + email + '/')
    if resp.status_code != 200:
        return 'User not found'

    our_user = resp.json()
    # Сверка ключа из ссылки с хэш-ключом в базе данных
    if our_user['activationKey'] == 'None' or our_user[
            'activationKey'] != construct_confirmation(user_id, email, key):
        return 'Key is incorrect'

    resp = requests.put('http://127.0.0.1:8000/db/users/' +
                        str(our_user['id']) + '/',
                        data={
                            'email': email,
                            'userID': user_id,
                            'chatID': chat_id,
                            'activationKey': 'None'
                        },
                        auth=get_auth_data())
    if resp.status_code != 200:
        return 'DB authentication failed! Please, try again later.'
    print(
        'User was successfully added! Check your chat with bot to start conversation.'
    )
    send_hello_message(int(user_id), int(chat_id))
Example #10
0
def _get_printable_info():
    """
    Построение ответа сервера на запрос.
    :return: Ответ сервера на запрос
    """
    form = cgi.FieldStorage()
    text = form.getvalue('text')

    # Попытка обновления статьи в базе данных
    resp = requests.put('http://127.0.0.1:8000/db/contact_info/',
                        data={'info': str(text)},
                        auth=get_auth_data())

    # Если операция прошла неуспешно
    if resp.status_code != 200:
        return resp.json()

    return {}
Example #11
0
def _get_printable_info():
    """
    Построение ответа сервера на запрос.
    :return: Ответ сервера на запрос
    """
    # Инициализация словаря с данными по-умолчанию
    def_dict = dict(email=def_user(), activationKey='None')

    # Попытка создания пользователя в базе данных
    resp = requests.post('http://127.0.0.1:8000/db/users/',
                         data=def_dict,
                         auth=get_auth_data())
    result = resp.json()

    # Если создание пользователя в базе данных не удалось
    if resp.status_code != 200:
        return result

    # В случае успеха возвращаем ID нового пользователя в базе данных
    return dict(id=result['id'])
def add_activation_date(user_id):
    resp_get = requests.get("http://127.0.0.1:8000/db/users/")
    for user in resp_get.json():
        if user['userID'] == user_id:
            now = datetime.datetime.now()
            # формируем строку с датой
            date = "%s/%s/%s %s:%s" % (now.day, now.month, now.year, add_zero(now.hour), add_zero(now.minute))
            # получаем старые записи о дате
            old_date = []
            try:
                old_date = json.loads(user['activationDate'])
            except json.decoder.JSONDecodeError:
                old_date = []
            if not old_date or str(type(old_date)) == "<class 'str'>":
                old_date = []
            # добавляем текущую дату
            old_date.append(date)
            def_dict = dict(email=user['email'], activationDate=json.dumps(old_date))
            resp_save = requests.put('http://127.0.0.1:8000/db/users/%s/' % user['id'], data=def_dict,
                                     auth=get_auth_data())
Example #13
0
def sendEmailWithInvite(email):
    # простая проверка email чтобы избежать исключений
    if not email:
        return False
    # получаем инвайт по почте
    invite = getInvite(email)
    # составляем письмо
    link = "Here is your link / Вот твоя пригласительная ссылка:\n" + BOT_HOST + invite
    message = INV_MESSAGE_EN + INV_MESSAGE_RU + "\n\n" + link

    # пытаемся добавить пользователя в таблицу инвайтов c полученным кодом инвайта
    def_dict = dict(invite=invite, email=email, is_valid="1")
    resp = requests.post("http://127.0.0.1:8000/db/invites/",
                         def_dict,
                         auth=get_auth_data())

    # обрабытваем ответ сервера, 201 - все успешно, 400 - пользователь уже существует
    if resp.status_code != 201 and resp.status_code != 400:
        return False
    # отправляем приглашение пользователю
    _send_email(email + "@innopolis.ru", INV_HEADER, message)
    return True
Example #14
0
def _get_printable_info():
    """
    Построение ответа сервера на запрос.
    :return: Ответ сервера на запрос
    """
    # Инициализация словаря с данными по-умолчанию
    def_dict = dict(title=def_title(),
                    text=def_text(),
                    keywords=def_keywords())

    # Попытка создания статьи в базе данных
    resp = requests.post('http://127.0.0.1:8000/db/',
                         data=def_dict,
                         auth=get_auth_data())
    result = resp.json()

    # Если создание статьи в базе данных не удалось
    if resp.status_code != 200:
        return result

    # В случае успеха возвращаем ID новой статьи в базе данных
    return dict(id=result['id'])
def delete_articles():
    # подтверждение
    if not confirm():
        print("Cancelled by user")
        return
    # получаем список статей
    articles = requests.get("http://127.0.0.1:8000/db/")
    # проверяем успешность запроса
    if articles.status_code != 200:
        print("Database unreachable")
        return
    # парсим данные в json
    articles = articles.json()
    # считаем количество статей
    counter = 0
    for article in articles:
        counter += 1
    current_counter = 1
    print("Starting...")
    # итерируемся по статьям
    for article in articles:
        # удаляем статью по id
        resp_delete = requests.delete("http://127.0.0.1:8000/db/%s/" %
                                      article['id'],
                                      auth=get_auth_data())
        # проверяем успешность запроса
        if resp_delete.status_code != 204:
            print("Deletion error")
            return
        # формируем строку с информацией о прогрессе
        line = "\rDeleting: %s of %s" % (current_counter, counter)
        # выводим информацию каждые 5 статей
        if current_counter % 5 == 0:
            print(line, end='', flush=True)
        current_counter += 1
    time.sleep(1)
    print("\rFinished, deleted %s articles" % counter)
def delete_feedback():
    # подтверждение
    if not confirm():
        print("Cancelled by user")
        return
    # получаем список статей
    feedback = requests.get("http://127.0.0.1:8000/db/feedback/")
    # проверяем успешность запроса
    if feedback.status_code != 200:
        print("Database unreachable")
        return
    # парсим данные в json
    feedback = feedback.json()
    # считаем количество отзывов
    counter = 0
    for feed in feedback:
        counter += 1
    current_counter = 1
    print("Starting...")
    # итерируемся по всем отзывам
    for feed in feedback:
        # удаляем отзыв по id
        resp_delete = requests.delete("http://127.0.0.1:8000/db/feedback/%s/" %
                                      feed['id'],
                                      auth=get_auth_data())
        # проверяем успешность запроса
        if resp_delete.status_code != 204:
            print("Deletion error")
            return
        # формируем строку с информацией о прогрессе
        line = "\rDeleting: %s of %s" % (current_counter, counter)
        # каждые 5 отзывов выводим информацию
        if current_counter % 5 == 0:
            print(line, end='', flush=True)
        current_counter += 1
    time.sleep(1)
    print("\rFinished, deleted %s feedback entries" % counter)
def delete_users():
    # подтверждение
    if not confirm():
        print("Cancelled by user")
        return
    # загружаем список всех пользователей
    users = requests.get("http://127.0.0.1:8000/db/users/")
    # проверяем успешность запроса
    if users.status_code != 200:
        print("Database unreachable")
        return
    # парсим данные в json
    users = users.json()
    # считаем пользователей
    counter = 0
    for user in users:
        counter += 1
    current_counter = 1
    print("Starting...")
    # итерируемся по всем пользователям
    for user in users:
        # удаляем пользователя по id
        resp_delete = requests.delete("http://127.0.0.1:8000/db/users/%s/" %
                                      user['id'],
                                      auth=get_auth_data())
        # проверяем успешность запроса
        if resp_delete.status_code != 204:
            print("Deletion error")
            return
        # собираем строку с информацией о прогрессе
        line = "\rDeleting: %s of %s" % (current_counter, counter)
        # каждые 5 пользователей выводим информацию в консоль
        if current_counter % 5 == 0:
            print(line, end='', flush=True)
        current_counter += 1
    time.sleep(0.5)
    print("\rFinished, deleted %s users" % counter)
def load_articles_file():
    # убеждаемся в наличии папки
    if not os.path.exists("article_dumps"):
        os.makedirs("article_dumps")
    # открываем окно загрузки файла
    root = Tk()
    root.filename = filedialog.askopenfilename(
        initialdir=os.getcwd() + "/article_dumps/",
        title="Choose your file",
        filetypes=(("JSON files", "*.json"), ("all files", "*.*")))
    # закрываем окно
    root.withdraw()
    # если пользователь не выбрал файла завершаем
    if not root.filename:
        print("Cancelled by user")
        return
    # открываем файл
    infile = open(root.filename, "r")
    # загружаем данные
    articles = json.load(infile)
    # инициализируем счетчики
    counter_ok = 0
    counter_err = 0
    total = 0
    print("Starting...")
    # получаем список статей в базе для того чтобы не добавлять существующие
    current_articles = requests.get("http://127.0.0.1:8000/db/").json()
    # итерируемся по статьям
    for article in articles:
        def_dict = dict(created=article['created'],
                        text=article['text'],
                        keywords=article['keywords'],
                        title=article['title'],
                        viewCount=article['viewCount'],
                        likeCount=article['likeCount'])
        # сверяемся с текущей данной - ищем статью по заголовку, существующие не добавляем
        exists = False
        for element in current_articles:
            if element['title'] == def_dict['title']:
                exists = True
        if exists:
            total += 1
            counter_err += 1
            continue
        # записываем статью в базу
        resp = requests.post("http://127.0.0.1:8000/db/",
                             data=def_dict,
                             auth=get_auth_data())
        # проверяем успешность запроса
        if resp.status_code == 201:
            counter_ok += 1
        else:
            counter_err += 1
        total += 1
        # каждые 5 статей выводим информацию о прогрессе
        if total % 5 == 0:
            print("\rAdding articles: %s successful, %s unsuccessful%s" %
                  (counter_ok, counter_err, getProgress(total / 5 % 3 + 1)),
                  end='',
                  flush=True)
    time.sleep(0.5)
    print("\rFinished adding articles: %s successful, %s unsuccessful" %
          (counter_ok, counter_err),
          end='',
          flush=True)