Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
1311 Разработка системы заявок для 3д печати
project_1311
Commits
566bdaca
Commit
566bdaca
authored
2 months ago
by
“Mikkelando”
Browse files
Options
Download
Patches
Plain Diff
final
parent
2a5c8aad
xserver
No related merge requests found
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
movere_local/mainapp/urls.py
+1
-1
movere_local/mainapp/urls.py
movere_local/mainapp/views.py
+21
-1
movere_local/mainapp/views.py
test/api_test.py
+30
-0
test/api_test.py
test/tg_bot.py
+60
-19
test/tg_bot.py
with
112 additions
and
21 deletions
+112
-21
movere_local/mainapp/urls.py
+
1
−
1
View file @
566bdaca
...
@@ -30,7 +30,7 @@ urlpatterns = [
...
@@ -30,7 +30,7 @@ urlpatterns = [
path
(
'story-and-files'
,
views
.
view_story_and_files
,
name
=
'view_story_and_files'
),
path
(
'story-and-files'
,
views
.
view_story_and_files
,
name
=
'view_story_and_files'
),
path
(
'redactor/'
,
views
.
redactor
,
name
=
'redactor'
),
path
(
'redactor/'
,
views
.
redactor
,
name
=
'redactor'
),
path
(
'api/orders/by-username/<str:username>/'
,
views
.
order_list_by_username_api
,
name
=
'order_list_by_username_api'
),
path
(
'api/orders/by-username/<str:username>/'
,
views
.
order_list_by_username_api
,
name
=
'order_list_by_username_api'
),
path
(
'api/users/<str:username>/'
,
views
.
check_user_exists
,
name
=
'check_user_exists'
),
# path('serve-file/<str:file_name>/', views.serve_file, name='serve_file'),
# path('serve-file/<str:file_name>/', views.serve_file, name='serve_file'),
# re_path(r'^download-file/(?P<path>.*)$', views.download_file, name='download_file'),
# re_path(r'^download-file/(?P<path>.*)$', views.download_file, name='download_file'),
...
...
This diff is collapsed.
Click to expand it.
movere_local/mainapp/views.py
+
21
−
1
View file @
566bdaca
...
@@ -635,4 +635,24 @@ def view_editrequests(request):
...
@@ -635,4 +635,24 @@ def view_editrequests(request):
print
(
'from views: '
,
nn_status
)
print
(
'from views: '
,
nn_status
)
return
render
(
request
,
'mainapp/view_editrequests.html'
,
{
'orders_status_list'
:
orders_status_list
,
'nn_status'
:
nn_status
})
return
render
(
request
,
'mainapp/view_editrequests.html'
,
{
'orders_status_list'
:
orders_status_list
,
'nn_status'
:
nn_status
})
\ No newline at end of file
@csrf_exempt
def
check_user_exists
(
request
,
username
):
# Проверка ключа API
api_key
=
request
.
headers
.
get
(
'Authorization'
)
if
api_key
!=
f
"Api-Key
{
settings
.
API_KEY
}
"
:
return
JsonResponse
({
'error'
:
'Unauthorized'
},
status
=
403
)
if
request
.
method
==
'GET'
:
# Проверка существует ли пользователь с таким именем
try
:
user
=
User
.
objects
.
get
(
username
=
username
)
return
JsonResponse
({
'exists'
:
True
})
except
User
.
DoesNotExist
:
return
JsonResponse
({
'exists'
:
False
})
return
JsonResponse
({
'error'
:
'Method not allowed'
},
status
=
405
)
This diff is collapsed.
Click to expand it.
test/api_test.py
+
30
−
0
View file @
566bdaca
...
@@ -139,7 +139,37 @@ def mark_order_as_processed(order_id):
...
@@ -139,7 +139,37 @@ def mark_order_as_processed(order_id):
return
set_order_status
(
order_id
=
order_id
,
status
=
STATUS_FINISHED
)
return
set_order_status
(
order_id
=
order_id
,
status
=
STATUS_FINISHED
)
def
is_login_exists_in_db
(
username
):
"""
Проверяет существование пользователя в базе данных по имени пользователя.
Аргументы:
username (str): Имя пользователя, наличие которого необходимо проверить в базе данных.
Возвращает:
bool: Возвращает True, если пользователь существует в базе данных, иначе False.
Исключения:
Обрабатывает любое исключение requests, связанное с HTTP-запросом, такое как проблемы соединения
или некорректный HTTP-ответ. В случае ошибки возвращает False и выводит сообщение об ошибке в консоль.
"""
try
:
response
=
requests
.
get
(
f
"
{
BASE_URL
}{
USERNAME_CHECK_ENDPOINT
}{
username
}
/"
,
headers
=
HEADERS
)
response
.
raise_for_status
()
user_data
=
response
.
json
()
return
user_data
.
get
(
'exists'
,
False
)
except
requests
.
exceptions
.
RequestException
as
e
:
print
(
f
"Ошибка при проверке логина в базе данных:
{
e
}
"
)
return
False
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
data
=
get_order_statuses_with_ids
(
'red'
)
data
=
get_order_statuses_with_ids
(
'red'
)
print
(
data
)
print
(
data
)
print
(
'LOGIN: '
,
is_login_exists_in_db
(
'lksdjf'
))
print
(
'LOGIN: '
,
is_login_exists_in_db
(
'red'
))
This diff is collapsed.
Click to expand it.
test/tg_bot.py
+
60
−
19
View file @
566bdaca
...
@@ -7,8 +7,16 @@ from aiogram.types import CallbackQuery
...
@@ -7,8 +7,16 @@ from aiogram.types import CallbackQuery
from
aiogram.utils.keyboard
import
InlineKeyboardBuilder
from
aiogram.utils.keyboard
import
InlineKeyboardBuilder
from
aiogram.fsm.state
import
State
,
StatesGroup
from
aiogram.fsm.state
import
State
,
StatesGroup
from
test.api_test
import
get_order_statuses_with_ids
# Импорт функции для получения заказов
# from test.api_test import get_order_statuses_with_ids # Импорт функции для получения заказов
# from test.api_test import is_login_exists_in_db
# from test.config import token
from
api_test
import
get_order_statuses_with_ids
# Импорт функции для получения заказов
from
api_test
import
is_login_exists_in_db
from
config
import
token
from
config
import
token
# Устанавливаем уровень логирования
# Устанавливаем уровень логирования
logging
.
basicConfig
(
level
=
logging
.
INFO
)
logging
.
basicConfig
(
level
=
logging
.
INFO
)
...
@@ -43,11 +51,11 @@ async def send_welcome(message: types.Message, state: FSMContext):
...
@@ -43,11 +51,11 @@ async def send_welcome(message: types.Message, state: FSMContext):
# Создаем инлайн-кнопки "Старт", "Вход" и "Регистрация"
# Создаем инлайн-кнопки "Старт", "Вход" и "Регистрация"
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Старт"
,
callback_data
=
"start"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Старт
⭐
"
,
callback_data
=
"start"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Вход"
,
callback_data
=
"login"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Вход
🔐
"
,
callback_data
=
"login"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Регистрация"
,
url
=
"https://
lms.hse
.ru/"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Регистрация
✍
"
,
url
=
"https://
moverelab
.ru/"
))
await
message
.
answer
(
"Привет
! Выберите действие:
"
,
reply_markup
=
builder
.
as_markup
())
await
message
.
answer
(
"Привет
👋
"
,
reply_markup
=
builder
.
as_markup
())
# Удаление всех сообщений до /start
# Удаление всех сообщений до /start
async
def
delete_messages_up_to_start
(
chat_id
:
int
,
current_message_id
:
int
):
async
def
delete_messages_up_to_start
(
chat_id
:
int
,
current_message_id
:
int
):
...
@@ -66,7 +74,7 @@ async def delete_messages_up_to_start(chat_id: int, current_message_id: int):
...
@@ -66,7 +74,7 @@ async def delete_messages_up_to_start(chat_id: int, current_message_id: int):
async
def
send_about
(
call
:
CallbackQuery
):
async
def
send_about
(
call
:
CallbackQuery
):
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад"
,
callback_data
=
"main_menu"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад
🔙
"
,
callback_data
=
"main_menu"
))
await
call
.
message
.
answer
(
"Этот бот был создан студентами для лаборатории МИЭМ."
,
reply_markup
=
builder
.
as_markup
())
await
call
.
message
.
answer
(
"Этот бот был создан студентами для лаборатории МИЭМ."
,
reply_markup
=
builder
.
as_markup
())
# Обработчик нажатия на "Вход"
# Обработчик нажатия на "Вход"
...
@@ -75,29 +83,45 @@ async def ask_for_login(call: CallbackQuery, state: FSMContext):
...
@@ -75,29 +83,45 @@ async def ask_for_login(call: CallbackQuery, state: FSMContext):
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад"
,
callback_data
=
"main_menu"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад
🔙
"
,
callback_data
=
"main_menu"
))
await
call
.
message
.
answer
(
"Введите ваш логин:"
,
reply_markup
=
builder
.
as_markup
())
await
call
.
message
.
answer
(
"Введите ваш логин:"
,
reply_markup
=
builder
.
as_markup
())
await
state
.
set_state
(
AuthStates
.
waiting_for_login
)
await
state
.
set_state
(
AuthStates
.
waiting_for_login
)
# Обработка ввода логина
# Обработка ввода логина
@router.message
(
AuthStates
.
waiting_for_login
)
@router.message
(
AuthStates
.
waiting_for_login
)
async
def
get_login
(
message
:
types
.
Message
,
state
:
FSMContext
):
async
def
get_login
(
message
:
types
.
Message
,
state
:
FSMContext
):
await
delete_messages_up_to_start
(
message
.
chat
.
id
,
message
.
message_id
)
await
delete_messages_up_to_start
(
message
.
chat
.
id
,
message
.
message_id
)
# Сохраняем логин в словарь авторизованных пользователей
chat_id
=
message
.
chat
.
id
chat_id
=
message
.
chat
.
id
login
=
message
.
text
login
=
message
.
text
auth_users
[
chat_id
]
=
login
# Проверяем, существует ли логин в базе данных
if
is_login_exists_in_db
(
login
):
# Сохраняем логин в словарь авторизованных пользователей
auth_users
[
chat_id
]
=
login
await
message
.
answer
(
f
"Вы успешно вошли в систему как
{
login
}
."
)
await
show_profile_menu
(
chat_id
)
await
state
.
clear
()
else
:
# Если логин не найден
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад🔙"
,
callback_data
=
"main_menu"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Попробовать снова"
,
callback_data
=
"login"
))
# Кнопка для повторного ввода
await
message
.
answer
(
"Логин не найден. Пожалуйста, введите корректный логин или вернитесь в главное меню."
,
reply_markup
=
builder
.
as_markup
()
)
await
state
.
clear
()
await
state
.
clear
()
await
message
.
answer
(
f
"Вы успешно вошли в систему как
{
login
}
."
)
await
show_profile_menu
(
chat_id
)
# Отображение меню профиля
# Отображение меню профиля
async
def
show_profile_menu
(
chat_id
):
async
def
show_profile_menu
(
chat_id
):
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Профиль"
,
callback_data
=
"profile"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Профиль
👤
"
,
callback_data
=
"profile"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Мои заказы"
,
callback_data
=
"show_orders"
))
# Новая кнопка для заказа
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Мои заказы
✅
"
,
callback_data
=
"show_orders"
))
# Новая кнопка для заказа
await
bot
.
send_message
(
chat_id
,
"Выберите действие:"
,
reply_markup
=
builder
.
as_markup
())
await
bot
.
send_message
(
chat_id
,
"Выберите действие:"
,
reply_markup
=
builder
.
as_markup
())
# Обработчик нажатия на "Профиль"
# Обработчик нажатия на "Профиль"
...
@@ -110,10 +134,10 @@ async def show_profile(call: CallbackQuery):
...
@@ -110,10 +134,10 @@ async def show_profile(call: CallbackQuery):
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
await
delete_messages_up_to_start
(
call
.
message
.
chat
.
id
,
call
.
message
.
message_id
)
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Выйти"
,
callback_data
=
"logout"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Выйти
🔚
"
,
callback_data
=
"logout"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад"
,
callback_data
=
"profile_menu"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад
🔙
"
,
callback_data
=
"profile_menu"
))
await
call
.
message
.
answer
(
f
"В
аш профиль:
\n
Логин:
{
login
}
\n
Выберите действие:
"
,
reply_markup
=
builder
.
as_markup
())
await
call
.
message
.
answer
(
f
"В
ы авторизованы как
{
login
}
\n
"
,
reply_markup
=
builder
.
as_markup
())
# Обработчик нажатия на "Назад" из профиля
# Обработчик нажатия на "Назад" из профиля
@router.callback_query
(
lambda
call
:
call
.
data
==
'profile_menu'
)
@router.callback_query
(
lambda
call
:
call
.
data
==
'profile_menu'
)
...
@@ -160,15 +184,32 @@ async def show_orders(call: CallbackQuery):
...
@@ -160,15 +184,32 @@ async def show_orders(call: CallbackQuery):
if
login
:
if
login
:
user_orders
=
get_order_statuses_with_ids
(
login
)
user_orders
=
get_order_statuses_with_ids
(
login
)
# Перевод статусов
status_translation
=
{
'wait_confirmation'
:
'Ожидает подтверждения⏳'
,
'in_work'
:
'В работе🛠️'
,
'ready'
:
'Готов✔️'
,
'done'
:
'Получен🚩'
,
'canceled'
:
'Отменен❌'
}
# Проверка и вывод заказов
if
user_orders
:
if
user_orders
:
order_details
=
[
f
"Order ID:
{
order_id
}
, Status:
{
status
}
"
for
order_id
,
status
in
user_orders
]
print
(
user_orders
)
orders_text
=
"Ваши заказы:
\n
"
+
"
\n
"
.
join
(
order_details
)
order_details
=
[
f
"Номер заказа:
{
order_id
}
\n
Статус:
{
status_translation
.
get
(
status
,
'Неизвестный статус'
)
}
"
for
order_id
,
status
in
user_orders
]
orders_text
=
"Ваши заказы:
\n
"
+
"
\n\n
"
.
join
(
order_details
)
else
:
else
:
orders_text
=
"Заказы отсутствуют."
orders_text
=
"Заказы отсутствуют."
# Строим меню с кнопкой возврата
# Строим меню с кнопкой возврата
builder
=
InlineKeyboardBuilder
()
builder
=
InlineKeyboardBuilder
()
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад"
,
callback_data
=
"profile_menu"
))
builder
.
add
(
types
.
InlineKeyboardButton
(
text
=
"Назад
🔙
"
,
callback_data
=
"profile_menu"
))
await
call
.
message
.
answer
(
orders_text
,
reply_markup
=
builder
.
as_markup
())
await
call
.
message
.
answer
(
orders_text
,
reply_markup
=
builder
.
as_markup
())
else
:
else
:
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets