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
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)
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))
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 {}
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())
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
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)