Source

Target

Commits (2)
Showing with 51 additions and 16 deletions
+51 -16
venv
.env
__pycache__
\ No newline at end of file
__pycache__
bugs.md
# Cabinet interface
# Api For Testing 2024
## How to install
## Требования к приложению
1. Приложение должно устанавливаться и запускаться по инструкции из README
1. При запуске приложение должно разворачивать http сервер на 80 порту
1. По GET запросу на url `/user_projects/<email>`, где `<email>` - это email любого пользователя кабинета, должна отдаваться html страничка, которая отображает email пользователя и названия всех его проектов в которых учавствовал этот пользователь
1. По GET запросу на url `/api/user_projects/<email>`, где `<email>` - это email любого пользователя кабинета, должен отдаваться json с названиями всех проектов, в которых учавствовал пользователь
1. Приложение должно гарантировать хранение конфиденциальной информации
## Как установить
1. `python -m venv venv`
1. unix: `source venv/bin/activate` / windows: `.\venv\Scripts\activate`
1. unix: `source venv/bin/acitvate` / windows: `.\venv\Scripts\acitvate`
1. `pip install -r requirements.txt`
## How to run
## Как запустить
1. create `.env` file
1. создать `.env` файл
```
CABINET_TOKEN=
CABINET_URL=
HOST=
PORT=
```
2. python main.py
2. `python main.py`
from src import cabinet_client
from flask import Flask
from jinja2 import Template
from pathlib import Path
import config
app = Flask(__name__)
app = Flask(__name__, static_url_path="", static_folder="")
PROJECTS_TEMPLATE = str(Path("templates/projects.html"))
@app.route("/user_projects/<email>")
def get_projects_html_by_student_email(email):
with open(PROJECTS_TEMPLATE) as f:
return Template(f.read()).render(
projects_names=cabinet_client.get_projects_names_by_student_email(email),
student_email=email
)
@app.route("/student/email/<student_email>/projects", methods=["GET"])
@app.route("/api/user_projects/<student_email>", methods=["POST"])
def get_projects_names_by_student_email(student_email):
return cabinet_client.get_projects_names_by_student_email(student_email)
......
......@@ -2,7 +2,6 @@ blinker==1.7.0
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
Flask==3.0.2
idna==3.6
itsdangerous==2.1.2
Jinja2==3.1.3
......
import config
import requests
from pprint import pprint
headers = {
"X-Auth-Token": f"Bearer {config.CABINET_TOKEN}"
......@@ -21,9 +20,9 @@ def get_students_projects_by_id(student_id: int) -> list[int]:
response = requests.get(f"{config.CABINET_URL}/public-api/student_profile/{student_id}", headers=headers, timeout=config.TIMEOUT)
student_profile = response.json()["data"]
years = student_profile[0]["years"]
projects_by_names = {}
for year in years:
for year in years[:-1]:
projects_by_year = get_student_projects_by_year_id(student_id, year["id"])
for project in projects_by_year:
if project["name"] != "":
......@@ -32,5 +31,5 @@ def get_students_projects_by_id(student_id: int) -> list[int]:
def get_projects_names_by_student_email(email: str):
student_id = get_student_id_by_email(email)
res = get_students_projects_by_id(student_id)
res = get_students_projects_by_id(student_id+1)
return list(map(lambda key: res[key]["name"], res.keys()))
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Projects</title>
</head>
<body>
<h1>Профиль студента</h1>
<h2>Информация</h2>
Email: <b>{{ student_email }}</b>
<h2>Проекты</h2>
<ul>
{% for project_name in projects_names %}
<li>{{project_name}}</li>
{% endfor %}
</ul>
</body>
</html>
\ No newline at end of file