mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 04:31:09 +00:00
357 lines
17 KiB
Python
357 lines
17 KiB
Python
import requests
|
||
from typing import Optional
|
||
|
||
# Конфигурация
|
||
USERNAME = "admin"
|
||
PASSWORD = "GzwQMe3j2DsPRKpL2DVw6A"
|
||
BASE_URL = "http://localhost:8000"
|
||
|
||
|
||
class LibraryAPI:
|
||
def __init__(self, base_url: str):
|
||
self.base_url = base_url
|
||
self.token: Optional[str] = None
|
||
self.session = requests.Session()
|
||
|
||
def login(self, username: str, password: str) -> bool:
|
||
"""Авторизация и получение токена"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/auth/token",
|
||
data={"username": username, "password": password},
|
||
headers={"Content-Type": "application/x-www-form-urlencoded"}
|
||
)
|
||
if response.status_code == 200:
|
||
self.token = response.json()["access_token"]
|
||
self.session.headers.update({"Authorization": f"Bearer {self.token}"})
|
||
print(f"✓ Авторизация успешна для пользователя: {username}")
|
||
return True
|
||
else:
|
||
print(f"✗ Ошибка авторизации: {response.text}")
|
||
return False
|
||
|
||
def register(self, username: str, email: str, password: str, full_name: str = None) -> bool:
|
||
"""Регистрация нового пользователя"""
|
||
data = {
|
||
"username": username,
|
||
"email": email,
|
||
"password": password
|
||
}
|
||
if full_name:
|
||
data["full_name"] = full_name
|
||
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/auth/register",
|
||
json=data
|
||
)
|
||
if response.status_code == 201:
|
||
print(f"✓ Пользователь {username} зарегистрирован")
|
||
return True
|
||
else:
|
||
print(f"✗ Ошибка регистрации: {response.text}")
|
||
return False
|
||
|
||
def create_author(self, name: str) -> Optional[int]:
|
||
"""Создание автора"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/authors/",
|
||
json={"name": name}
|
||
)
|
||
if response.status_code == 200:
|
||
author_id = response.json()["id"]
|
||
print(f" ✓ Автор создан: {name} (ID: {author_id})")
|
||
return author_id
|
||
else:
|
||
print(f" ✗ Ошибка создания автора {name}: {response.text}")
|
||
return None
|
||
|
||
def create_book(self, title: str, description: str) -> Optional[int]:
|
||
"""Создание книги"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/books/",
|
||
json={"title": title, "description": description}
|
||
)
|
||
if response.status_code == 200:
|
||
book_id = response.json()["id"]
|
||
print(f" ✓ Книга создана: {title} (ID: {book_id})")
|
||
return book_id
|
||
else:
|
||
print(f" ✗ Ошибка создания книги {title}: {response.text}")
|
||
return None
|
||
|
||
def create_genre(self, name: str) -> Optional[int]:
|
||
"""Создание жанра"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/genres/",
|
||
json={"name": name}
|
||
)
|
||
if response.status_code == 200:
|
||
genre_id = response.json()["id"]
|
||
print(f" ✓ Жанр создан: {name} (ID: {genre_id})")
|
||
return genre_id
|
||
else:
|
||
print(f" ✗ Ошибка создания жанра {name}: {response.text}")
|
||
return None
|
||
|
||
def link_author_book(self, author_id: int, book_id: int) -> bool:
|
||
"""Связь автора и книги"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/relationships/author-book",
|
||
params={"author_id": author_id, "book_id": book_id}
|
||
)
|
||
if response.status_code == 200:
|
||
print(f" ↔ Связь автор-книга: {author_id} ↔ {book_id}")
|
||
return True
|
||
else:
|
||
print(f" ✗ Ошибка связи автор-книга: {response.text}")
|
||
return False
|
||
|
||
def link_genre_book(self, genre_id: int, book_id: int) -> bool:
|
||
"""Связь жанра и книги"""
|
||
response = self.session.post(
|
||
f"{self.base_url}/api/relationships/genre-book",
|
||
params={"genre_id": genre_id, "book_id": book_id}
|
||
)
|
||
if response.status_code == 200:
|
||
print(f" ↔ Связь жанр-книга: {genre_id} ↔ {book_id}")
|
||
return True
|
||
else:
|
||
print(f" ✗ Ошибка связи жанр-книга: {response.text}")
|
||
return False
|
||
|
||
|
||
def main():
|
||
api = LibraryAPI(BASE_URL)
|
||
|
||
# Авторизация
|
||
if not api.login(USERNAME, PASSWORD):
|
||
print("Не удалось авторизоваться. Проверьте логин и пароль.")
|
||
return
|
||
|
||
print("\n📚 Создание авторов...")
|
||
authors_data = [
|
||
"Лев Толстой",
|
||
"Фёдор Достоевский",
|
||
"Антон Чехов",
|
||
"Александр Пушкин",
|
||
"Михаил Булгаков",
|
||
"Николай Гоголь",
|
||
"Иван Тургенев",
|
||
"Борис Пастернак",
|
||
"Михаил Лермонтов",
|
||
"Александр Солженицын",
|
||
"Максим Горький",
|
||
"Иван Бунин"
|
||
]
|
||
|
||
authors = {}
|
||
for name in authors_data:
|
||
author_id = api.create_author(name)
|
||
if author_id:
|
||
authors[name] = author_id
|
||
|
||
print("\n🏷️ Создание жанров...")
|
||
genres_data = [
|
||
"Роман",
|
||
"Повесть",
|
||
"Рассказ",
|
||
"Поэзия",
|
||
"Драма",
|
||
"Философская проза",
|
||
"Историческая проза",
|
||
"Сатира"
|
||
]
|
||
|
||
genres = {}
|
||
for name in genres_data:
|
||
genre_id = api.create_genre(name)
|
||
if genre_id:
|
||
genres[name] = genre_id
|
||
|
||
print("\n📖 Создание книг...")
|
||
books_data = [
|
||
{
|
||
"title": "Война и мир",
|
||
"description": "Роман-эпопея Льва Толстого, описывающий русское общество в эпоху войн против Наполеона в 1805—1812 годах. Одно из величайших произведений мировой литературы.",
|
||
"authors": ["Лев Толстой"],
|
||
"genres": ["Роман", "Историческая проза"]
|
||
},
|
||
{
|
||
"title": "Анна Каренина",
|
||
"description": "Роман Льва Толстого о трагической любви замужней дамы Анны Карениной к блестящему офицеру Вронскому. История страсти, ревности и роковых решений.",
|
||
"authors": ["Лев Толстой"],
|
||
"genres": ["Роман", "Драма"]
|
||
},
|
||
{
|
||
"title": "Преступление и наказание",
|
||
"description": "Социально-психологический роман Фёдора Достоевского о бедном студенте Раскольникове, совершившем убийство и мучающемся угрызениями совести.",
|
||
"authors": ["Фёдор Достоевский"],
|
||
"genres": ["Роман", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Братья Карамазовы",
|
||
"description": "Последний роман Достоевского, история семьи Карамазовых, затрагивающая глубокие вопросы веры, свободы воли и морали.",
|
||
"authors": ["Фёдор Достоевский"],
|
||
"genres": ["Роман", "Философская проза", "Драма"]
|
||
},
|
||
{
|
||
"title": "Идиот",
|
||
"description": "Роман о князе Мышкине — человеке с чистой душой, который сталкивается с жестокостью и корыстью петербургского общества.",
|
||
"authors": ["Фёдор Достоевский"],
|
||
"genres": ["Роман", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Вишнёвый сад",
|
||
"description": "Пьеса Антона Чехова о разорении дворянского гнезда и продаже родового имения с вишнёвым садом.",
|
||
"authors": ["Антон Чехов"],
|
||
"genres": ["Драма"]
|
||
},
|
||
{
|
||
"title": "Чайка",
|
||
"description": "Пьеса Чехова о любви, искусстве и несбывшихся мечтах, разворачивающаяся в усадьбе на берегу озера.",
|
||
"authors": ["Антон Чехов"],
|
||
"genres": ["Драма"]
|
||
},
|
||
{
|
||
"title": "Палата № 6",
|
||
"description": "Повесть о враче психиатрической больницы, который начинает сомневаться в границах между нормой и безумием.",
|
||
"authors": ["Антон Чехов"],
|
||
"genres": ["Повесть", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Евгений Онегин",
|
||
"description": "Роман в стихах Александра Пушкина — энциклопедия русской жизни начала XIX века и история несчастной любви.",
|
||
"authors": ["Александр Пушкин"],
|
||
"genres": ["Роман", "Поэзия"]
|
||
},
|
||
{
|
||
"title": "Капитанская дочка",
|
||
"description": "Исторический роман Пушкина о событиях Пугачёвского восстания, любви и чести.",
|
||
"authors": ["Александр Пушкин"],
|
||
"genres": ["Роман", "Историческая проза"]
|
||
},
|
||
{
|
||
"title": "Пиковая дама",
|
||
"description": "Повесть о молодом офицере Германне, одержимом желанием узнать тайну трёх карт.",
|
||
"authors": ["Александр Пушкин"],
|
||
"genres": ["Повесть"]
|
||
},
|
||
{
|
||
"title": "Мастер и Маргарита",
|
||
"description": "Роман Михаила Булгакова о визите дьявола в Москву 1930-х годов, переплетённый с историей Понтия Пилата.",
|
||
"authors": ["Михаил Булгаков"],
|
||
"genres": ["Роман", "Сатира", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Собачье сердце",
|
||
"description": "Повесть-сатира о профессоре Преображенском, превратившем бродячего пса в человека.",
|
||
"authors": ["Михаил Булгаков"],
|
||
"genres": ["Повесть", "Сатира"]
|
||
},
|
||
{
|
||
"title": "Белая гвардия",
|
||
"description": "Роман о семье Турбиных в Киеве во время Гражданской войны 1918-1919 годов.",
|
||
"authors": ["Михаил Булгаков"],
|
||
"genres": ["Роман", "Историческая проза"]
|
||
},
|
||
{
|
||
"title": "Мёртвые души",
|
||
"description": "Поэма Николая Гоголя о похождениях Чичикова, скупающего «мёртвые души» крепостных крестьян.",
|
||
"authors": ["Николай Гоголь"],
|
||
"genres": ["Роман", "Сатира"]
|
||
},
|
||
{
|
||
"title": "Ревизор",
|
||
"description": "Комедия о чиновниках уездного города, принявших проезжего за ревизора из Петербурга.",
|
||
"authors": ["Николай Гоголь"],
|
||
"genres": ["Драма", "Сатира"]
|
||
},
|
||
{
|
||
"title": "Шинель",
|
||
"description": "Повесть о маленьком человеке — титулярном советнике Акакии Башмачкине и его мечте о новой шинели.",
|
||
"authors": ["Николай Гоголь"],
|
||
"genres": ["Повесть"]
|
||
},
|
||
{
|
||
"title": "Отцы и дети",
|
||
"description": "Роман Ивана Тургенева о конфликте поколений и нигилизме на примере Евгения Базарова.",
|
||
"authors": ["Иван Тургенев"],
|
||
"genres": ["Роман", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Записки охотника",
|
||
"description": "Цикл рассказов Тургенева о русской деревне и крестьянах, написанный с глубоким сочувствием к народу.",
|
||
"authors": ["Иван Тургенев"],
|
||
"genres": ["Рассказ"]
|
||
},
|
||
{
|
||
"title": "Доктор Живаго",
|
||
"description": "Роман Бориса Пастернака о судьбе русского интеллигента в эпоху революции и Гражданской войны.",
|
||
"authors": ["Борис Пастернак"],
|
||
"genres": ["Роман", "Историческая проза", "Поэзия"]
|
||
},
|
||
{
|
||
"title": "Герой нашего времени",
|
||
"description": "Роман Михаила Лермонтова о Печорине — «лишнем человеке», скучающем и разочарованном в жизни.",
|
||
"authors": ["Михаил Лермонтов"],
|
||
"genres": ["Роман", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Архипелаг ГУЛАГ",
|
||
"description": "Документально-художественное исследование Александра Солженицына о системе советских лагерей.",
|
||
"authors": ["Александр Солженицын"],
|
||
"genres": ["Историческая проза"]
|
||
},
|
||
{
|
||
"title": "Один день Ивана Денисовича",
|
||
"description": "Повесть о одном дне заключённого советского лагеря, положившая начало лагерной прозе.",
|
||
"authors": ["Александр Солженицын"],
|
||
"genres": ["Повесть", "Историческая проза"]
|
||
},
|
||
{
|
||
"title": "На дне",
|
||
"description": "Пьеса Максима Горького о жителях ночлежки для бездомных — людях, оказавшихся на дне жизни.",
|
||
"authors": ["Максим Горький"],
|
||
"genres": ["Драма", "Философская проза"]
|
||
},
|
||
{
|
||
"title": "Тёмные аллеи",
|
||
"description": "Сборник рассказов Ивана Бунина о любви — трагической, мимолётной и прекрасной.",
|
||
"authors": ["Иван Бунин"],
|
||
"genres": ["Рассказ"]
|
||
}
|
||
]
|
||
|
||
books = {}
|
||
for book in books_data:
|
||
book_id = api.create_book(book["title"], book["description"])
|
||
if book_id:
|
||
books[book["title"]] = {
|
||
"id": book_id,
|
||
"authors": book["authors"],
|
||
"genres": book["genres"]
|
||
}
|
||
|
||
print("\n🔗 Создание связей...")
|
||
|
||
for book_title, book_info in books.items():
|
||
book_id = book_info["id"]
|
||
|
||
for author_name in book_info["authors"]:
|
||
if author_name in authors:
|
||
api.link_author_book(authors[author_name], book_id)
|
||
|
||
for genre_name in book_info["genres"]:
|
||
if genre_name in genres:
|
||
api.link_genre_book(genres[genre_name], book_id)
|
||
|
||
print("\n" + "=" * 50)
|
||
print("📊 ИТОГИ:")
|
||
print(f" • Авторов создано: {len(authors)}")
|
||
print(f" • Жанров создано: {len(genres)}")
|
||
print(f" • Книг создано: {len(books)}")
|
||
print("=" * 50)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|