init
This commit is contained in:
28
templates/accounts/edit_profile.html
Normal file
28
templates/accounts/edit_profile.html
Normal file
@ -0,0 +1,28 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Редактирование профиля - Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h3 class="text-center">Редактирование профиля</h3>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="POST">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" class="btn btn-primary">Сохранить изменения</button>
|
||||
<a href="{% url 'profile' %}" class="btn btn-outline-secondary">Отмена</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
122
templates/accounts/home.html
Normal file
122
templates/accounts/home.html
Normal file
@ -0,0 +1,122 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Главная | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<!-- Главный баннер -->
|
||||
|
||||
|
||||
<!-- Преимущества -->
|
||||
<div class="row mb-5">
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body text-center">
|
||||
<i class="fas fa-car fa-3x text-primary mb-3"></i>
|
||||
<h3>Курсы вождения</h3>
|
||||
<p>Изучите теорию и практику вождения с нашими профессиональными инструкторами. Мы предлагаем:</p>
|
||||
<ul class="list-unstyled text-start">
|
||||
<li><i class="fas fa-check text-success me-2"></i>Категория B</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Категория A</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Переподготовка</li>
|
||||
</ul>
|
||||
<a href="{% url 'course:list' %}" class="btn btn-primary">
|
||||
<i class="fas fa-list me-2"></i>Смотреть курсы
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body text-center">
|
||||
<i class="fas fa-users fa-3x text-success mb-3"></i>
|
||||
<h3>Наши инструкторы</h3>
|
||||
<p>Опытные инструкторы с многолетним стажем работы. Каждый инструктор:</p>
|
||||
<ul class="list-unstyled text-start">
|
||||
<li><i class="fas fa-check text-success me-2"></i>Имеет стаж более 5 лет</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Прошел специальную подготовку</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Имеет современный автопарк</li>
|
||||
</ul>
|
||||
<a href="{% url 'instructor:list' %}" class="btn btn-success">
|
||||
<i class="fas fa-user-tie me-2"></i>Смотреть инструкторов
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body text-center">
|
||||
<i class="fas fa-graduation-cap fa-3x text-info mb-3"></i>
|
||||
<h3>Почему мы?</h3>
|
||||
<ul class="list-unstyled text-start">
|
||||
<li><i class="fas fa-check text-success me-2"></i>Современные автомобили</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Гибкий график занятий</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Индивидуальный подход</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Высокий процент сдачи</li>
|
||||
<li><i class="fas fa-check text-success me-2"></i>Удобное расположение</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Дополнительная информация -->
|
||||
<div class="row mb-5">
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body">
|
||||
<h3 class="mb-4">О нашей автошколе</h3>
|
||||
<p>Автошкола "Флагман" - это современный учебный центр, где вы получите качественное образование и практические навыки вождения. Мы работаем с 2010 года и за это время подготовили более 5000 водителей.</p>
|
||||
<p>Наша миссия - сделать процесс обучения вождению максимально эффективным и комфортным для каждого студента. Мы используем современные методики обучения и постоянно совершенствуем наш подход.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body">
|
||||
<h3 class="mb-4">Наши преимущества</h3>
|
||||
<ul class="list-unstyled">
|
||||
<li class="mb-3"><i class="fas fa-car-side text-primary me-2"></i>Современный автопарк с автомобилями разных классов</li>
|
||||
<li class="mb-3"><i class="fas fa-chalkboard-teacher text-success me-2"></i>Опытные преподаватели теории и практики</li>
|
||||
<li class="mb-3"><i class="fas fa-clock text-info me-2"></i>Гибкий график занятий, включая выходные дни</li>
|
||||
<li class="mb-3"><i class="fas fa-map-marker-alt text-danger me-2"></i>Удобное расположение в центре города</li>
|
||||
<li class="mb-3"><i class="fas fa-percentage text-warning me-2"></i>Высокий процент успешной сдачи экзаменов</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if not user.is_authenticated %}
|
||||
<div class="row mt-4">
|
||||
<div class="col-md-6 offset-md-3">
|
||||
<div class="card shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-body text-center">
|
||||
<h3>Начните обучение прямо сейчас!</h3>
|
||||
<p class="lead">Быстрая регистрация за 2 минуты</p>
|
||||
<form method="post" action="{% url 'accounts:register' %}" class="mb-3">
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<input type="text" name="username" class="form-control bg-dark text-white border-secondary" placeholder="Имя пользователя" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<input type="email" name="email" class="form-control bg-dark text-white border-secondary" placeholder="Email" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<input type="password" name="password1" class="form-control bg-dark text-white border-secondary" placeholder="Пароль" required>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-lg w-100">
|
||||
<i class="fas fa-user-plus me-2"></i>Зарегистрироваться
|
||||
</button>
|
||||
</form>
|
||||
<p>Уже есть аккаунт? <a href="{% url 'accounts:login' %}" class="text-white">Войти</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
42
templates/accounts/login.html
Normal file
42
templates/accounts/login.html
Normal file
@ -0,0 +1,42 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Вход | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-sign-in-alt me-2"></i>Вход в систему
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="id_username" class="form-label text-white">Имя пользователя</label>
|
||||
<input type="text" name="username" id="id_username" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="id_password" class="form-label text-white">Пароль</label>
|
||||
<input type="password" name="password" id="id_password" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="d-grid gap-2 mt-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-sign-in-alt me-2"></i>Войти
|
||||
</button>
|
||||
<a href="{% url 'accounts:register' %}" class="btn btn-outline-light">
|
||||
<i class="fas fa-user-plus me-2"></i>Нет аккаунта? Зарегистрироваться
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
29
templates/accounts/logout.html
Normal file
29
templates/accounts/logout.html
Normal file
@ -0,0 +1,29 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Выход | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-sign-out-alt me-2"></i>Выход из системы
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body text-center">
|
||||
<p class="lead">Вы успешно вышли из системы.</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-sign-in-alt me-2"></i>Войти снова
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
64
templates/accounts/profile.html
Normal file
64
templates/accounts/profile.html
Normal file
@ -0,0 +1,64 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Профиль - Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Информация о пользователе</h5>
|
||||
<p><strong>Имя пользователя:</strong> {{ user.username }}</p>
|
||||
<p><strong>Email:</strong> {{ user.email }}</p>
|
||||
<p><strong>Имя:</strong> {{ user.first_name }}</p>
|
||||
<p><strong>Фамилия:</strong> {{ user.last_name }}</p>
|
||||
<p><strong>Тип пользователя:</strong> {{ user.profile.get_user_type_display }}</p>
|
||||
<p><strong>Телефон:</strong> {{ user.profile.phone }}</p>
|
||||
<p><strong>Адрес:</strong> {{ user.profile.address }}</p>
|
||||
<p><strong>Дата рождения:</strong> {{ user.profile.birth_date }}</p>
|
||||
<a href="{% url 'accounts:profile_update' %}" class="btn btn-primary">Редактировать профиль</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-8">
|
||||
{% if user.profile.user_type == 'student' %}
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Прогресс обучения</h5>
|
||||
<div class="progress mb-3">
|
||||
<div class="progress-bar" role="progressbar" style="width: {{ user.student.progress }}%">
|
||||
{{ user.student.progress }}%
|
||||
</div>
|
||||
</div>
|
||||
<a href="{% url 'student_progress' %}" class="btn btn-outline-primary">Подробнее</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Ближайшие занятия</h5>
|
||||
<!-- Здесь будет список ближайших занятий -->
|
||||
</div>
|
||||
</div>
|
||||
{% elif user.profile.user_type == 'instructor' %}
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Расписание занятий</h5>
|
||||
<!-- Здесь будет расписание занятий -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Список студентов</h5>
|
||||
<!-- Здесь будет список студентов -->
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
50
templates/accounts/register.html
Normal file
50
templates/accounts/register.html
Normal file
@ -0,0 +1,50 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Регистрация | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card shadow bg-dark bg-opacity-75 text-white">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-user-plus me-2"></i>Регистрация
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
<div class="mb-3">
|
||||
<label for="id_username" class="form-label text-white">Имя пользователя</label>
|
||||
<input type="text" name="username" id="id_username" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="id_email" class="form-label text-white">Email</label>
|
||||
<input type="email" name="email" id="id_email" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="id_password1" class="form-label text-white">Пароль</label>
|
||||
<input type="password" name="password1" id="id_password1" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="id_password2" class="form-label text-white">Подтверждение пароля</label>
|
||||
<input type="password" name="password2" id="id_password2" class="form-control bg-dark text-white border-secondary" required>
|
||||
</div>
|
||||
<div class="d-grid gap-2 mt-4">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-user-plus me-2"></i>Зарегистрироваться
|
||||
</button>
|
||||
<a href="{% url 'accounts:login' %}" class="btn btn-outline-light">
|
||||
<i class="fas fa-sign-in-alt me-2"></i>Уже есть аккаунт? Войти
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
35
templates/accounts/register_instructor.html
Normal file
35
templates/accounts/register_instructor.html
Normal file
@ -0,0 +1,35 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Регистрация инструктора | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-user-plus me-2"></i>Регистрация инструктора
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end mt-4">
|
||||
<a href="{% url 'home' %}" class="btn btn-secondary me-md-2">
|
||||
<i class="fas fa-times me-2"></i>Отмена
|
||||
</a>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-user-plus me-2"></i>Зарегистрировать
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
149
templates/base.html
Normal file
149
templates/base.html
Normal file
@ -0,0 +1,149 @@
|
||||
{% load static %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{% block title %}Автошкола{% endblock %}</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="{% static 'css/style.css' %}">
|
||||
<link rel="manifest" href="{% static 'manifest.json' %}">
|
||||
<meta name="theme-color" content="#000000">
|
||||
<style>
|
||||
.main-background {
|
||||
background-image: url('{% static "images/temnaa-masina-na-sosse-vecernee-vozdenie-letnii-peizaz.jpg" %}');
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
min-height: 100vh;
|
||||
position: relative;
|
||||
}
|
||||
.main-background::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.main-content {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
{% block extra_css %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-lg navbar-dark" style="background-color: rgba(0, 0, 0, 0.8);">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="{% url 'accounts:home' %}">
|
||||
<i class="fas fa-car me-2"></i>Флагман
|
||||
</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'course:list' %}">
|
||||
<i class="fas fa-book me-2"></i>Курсы
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'instructor:list' %}">
|
||||
<i class="fas fa-user-tie me-2"></i>Инструкторы
|
||||
</a>
|
||||
</li>
|
||||
{% if user.is_authenticated %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'schedule:list' %}">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<ul class="navbar-nav">
|
||||
{% if user.is_authenticated %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'accounts:profile' %}">
|
||||
<i class="fas fa-user me-2"></i>{{ user.get_full_name }}
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<form action="{% url 'accounts:logout' %}" method="post" style="display: inline;">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="nav-link btn btn-link" style="color: rgba(255,255,255,.55); text-decoration: none; padding: 0.5rem 1rem;">
|
||||
<i class="fas fa-sign-out-alt me-2"></i>Выход
|
||||
</button>
|
||||
</form>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'accounts:login' %}">
|
||||
<i class="fas fa-sign-in-alt me-2"></i>Вход
|
||||
</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url 'accounts:register' %}">
|
||||
<i class="fas fa-user-plus me-2"></i>Регистрация
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="main-background">
|
||||
<div class="container main-content py-4">
|
||||
{% if messages %}
|
||||
{% for message in messages %}
|
||||
<div class="alert alert-{{ message.tags }} alert-dismissible fade show">
|
||||
{{ message }}
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert"></button>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="bg-light py-4 mt-5">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h5>Автошкола</h5>
|
||||
<p>Профессиональное обучение вождению с опытными инструкторами</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h5>Контакты</h5>
|
||||
<p>
|
||||
<i class="fas fa-phone me-2"></i>+7 (999) 123-45-67<br>
|
||||
<i class="fas fa-envelope me-2"></i>info@autoschool.ru
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<h5>Мы в соцсетях</h5>
|
||||
<div class="social-links">
|
||||
<a href="#" class="text-dark me-2"><i class="fab fa-vk fa-2x"></i></a>
|
||||
<a href="#" class="text-dark me-2"><i class="fab fa-telegram fa-2x"></i></a>
|
||||
<a href="#" class="text-dark"><i class="fab fa-whatsapp fa-2x"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="text-center">
|
||||
<p class="mb-0">© 2025 Автошкола. Все права защищены.</p>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
{% block extra_js %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
36
templates/course/course_confirm_delete.html
Normal file
36
templates/course/course_confirm_delete.html
Normal file
@ -0,0 +1,36 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Удаление курса | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle me-2"></i>Подтверждение удаления
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="lead">Вы уверены, что хотите удалить курс "{{ course.title }}"?</p>
|
||||
<p class="text-muted">Это действие нельзя будет отменить.</p>
|
||||
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
|
||||
<a href="{% url 'course:detail' course.pk %}" class="btn btn-secondary me-md-2">
|
||||
<i class="fas fa-times me-2"></i>Отмена
|
||||
</a>
|
||||
<button type="submit" class="btn btn-danger">
|
||||
<i class="fas fa-trash me-2"></i>Удалить
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
54
templates/course/course_detail.html
Normal file
54
templates/course/course_detail.html
Normal file
@ -0,0 +1,54 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ course.title }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'course:list' %}">Курсы</a></li>
|
||||
<li class="breadcrumb-item active">{{ course.title }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title mb-4">{{ course.title }}</h2>
|
||||
<p class="card-text">{{ course.description }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h5 class="mb-0">Информация о курсе</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p><strong>Создан:</strong> {{ course.created_at|date:"d.m.Y" }}</p>
|
||||
<p><strong>Последнее обновление:</strong> {{ course.updated_at|date:"d.m.Y" }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user.is_authenticated and user.instructor %}
|
||||
<div class="card shadow mt-4">
|
||||
<div class="card-body">
|
||||
<a href="{% url 'course:update' course.pk %}" class="btn btn-warning w-100 mb-2">
|
||||
<i class="fas fa-edit me-2"></i>Редактировать
|
||||
</a>
|
||||
<a href="{% url 'course:delete' course.pk %}" class="btn btn-danger w-100">
|
||||
<i class="fas fa-trash me-2"></i>Удалить
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
49
templates/course/course_form.html
Normal file
49
templates/course/course_form.html
Normal file
@ -0,0 +1,49 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}
|
||||
{% if action == 'create' %}
|
||||
Добавление курса | Автошкола
|
||||
{% else %}
|
||||
Редактирование курса | Автошкола
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
{% if action == 'create' %}
|
||||
<i class="fas fa-plus-circle me-2"></i>Добавление курса
|
||||
{% else %}
|
||||
<i class="fas fa-edit me-2"></i>Редактирование курса
|
||||
{% endif %}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post" novalidate>
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end mt-4">
|
||||
<a href="{% url 'course:list' %}" class="btn btn-secondary me-md-2">
|
||||
<i class="fas fa-times me-2"></i>Отмена
|
||||
</a>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{% if action == 'create' %}
|
||||
<i class="fas fa-save me-2"></i>Создать
|
||||
{% else %}
|
||||
<i class="fas fa-save me-2"></i>Сохранить
|
||||
{% endif %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
61
templates/course/course_list.html
Normal file
61
templates/course/course_list.html
Normal file
@ -0,0 +1,61 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
{% block title %}Курсы | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<h2 class="text-center mb-4">Курсы</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user.is_authenticated and user.instructor %}
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<a href="{% url 'course:create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Добавить курс
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
{% if courses %}
|
||||
{% for course in courses %}
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ course.title }}</h5>
|
||||
<p class="card-text">{{ course.description|truncatewords:30 }}</p>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent">
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'course:detail' course.pk %}" class="btn btn-primary">
|
||||
<i class="fas fa-info-circle me-2"></i>Подробнее
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if user.is_authenticated and user.instructor %}
|
||||
<a href="{% url 'course:update' course.pk %}" class="btn btn-warning">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'course:delete' course.pk %}" class="btn btn-danger">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col">
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>На данный момент нет доступных курсов.
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
76
templates/instructor/instructor_detail.html
Normal file
76
templates/instructor/instructor_detail.html
Normal file
@ -0,0 +1,76 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ instructor.user.get_full_name }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'instructor:list' %}">Инструкторы</a></li>
|
||||
<li class="breadcrumb-item active">{{ instructor.user.get_full_name }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">Информация об инструкторе</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ instructor.profile.user.get_full_name }}</h5>
|
||||
<p class="card-text">
|
||||
<i class="fas fa-envelope me-2"></i>{{ instructor.profile.user.email }}<br>
|
||||
<i class="fas fa-phone me-2"></i>{{ instructor.phone_number }}<br>
|
||||
<i class="fas fa-car me-2"></i>Опыт работы: {{ instructor.experience_years }} лет<br>
|
||||
<i class="fas fa-graduation-cap me-2"></i>Специализация: {{ instructor.specialization }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h4 class="mb-0">Проводимые занятия</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if lessons %}
|
||||
<div class="list-group">
|
||||
{% for lesson in lessons %}
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex w-100 justify-content-between">
|
||||
<h5 class="mb-1">{{ lesson.course.title }}</h5>
|
||||
<small>{{ lesson.date|date:"d.m.Y" }} {{ lesson.start_time|time:"H:i" }}</small>
|
||||
</div>
|
||||
<p class="mb-1">
|
||||
<i class="fas fa-map-marker-alt me-2"></i>{{ lesson.location }}<br>
|
||||
<i class="fas fa-users me-2"></i>Записано студентов: {{ lesson.enrolled_students.count }}
|
||||
</p>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>У инструктора пока нет запланированных занятий.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<a href="{% url 'instructor:schedule' instructor.pk %}" class="btn btn-success w-100 mb-2">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание занятий
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
49
templates/instructor/instructor_list.html
Normal file
49
templates/instructor/instructor_list.html
Normal file
@ -0,0 +1,49 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Инструкторы | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<h2 class="text-center mb-4">Наши инструкторы</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
{% if instructors %}
|
||||
{% for instructor in instructors %}
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ instructor.profile.user.get_full_name }}</h5>
|
||||
<p class="card-text">
|
||||
<i class="fas fa-envelope me-2"></i>{{ instructor.profile.user.email }}<br>
|
||||
<i class="fas fa-car me-2"></i>Опыт работы: {{ instructor.experience_years }} лет<br>
|
||||
<i class="fas fa-graduation-cap me-2"></i>Специализация: {{ instructor.specialization }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent">
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'instructor:detail' instructor.pk %}" class="btn btn-primary">
|
||||
<i class="fas fa-info-circle me-2"></i>Подробнее
|
||||
</a>
|
||||
<a href="{% url 'instructor:schedule' instructor.pk %}" class="btn btn-success">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col">
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>На данный момент нет доступных инструкторов.
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
70
templates/instructor/instructor_schedule.html
Normal file
70
templates/instructor/instructor_schedule.html
Normal file
@ -0,0 +1,70 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Расписание {{ instructor.user.get_full_name }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'instructor:list' %}">Инструкторы</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'instructor:detail' instructor.pk %}">{{ instructor.user.get_full_name }}</a></li>
|
||||
<li class="breadcrumb-item active">Расписание</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание занятий
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if lessons %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<th>Время</th>
|
||||
<th>Курс</th>
|
||||
<th>Место</th>
|
||||
<th>Студенты</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for lesson in lessons %}
|
||||
<tr>
|
||||
<td>{{ lesson.date|date:"d.m.Y" }}</td>
|
||||
<td>{{ lesson.start_time|time:"H:i" }} - {{ lesson.end_time|time:"H:i" }}</td>
|
||||
<td>{{ lesson.course.title }}</td>
|
||||
<td>{{ lesson.location }}</td>
|
||||
<td>{{ lesson.enrolled_students.count }}</td>
|
||||
<td>
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="btn btn-sm btn-primary">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>У инструктора пока нет запланированных занятий.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
55
templates/schedule/lesson_confirm_delete.html
Normal file
55
templates/schedule/lesson_confirm_delete.html
Normal file
@ -0,0 +1,55 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Удаление занятия | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'schedule:list' %}">Расписание</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'schedule:detail' lesson.pk %}">{{ lesson.course.title }}</a></li>
|
||||
<li class="breadcrumb-item active">Удаление</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-6 mx-auto">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-trash me-2"></i>Удаление занятия
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="card-text">
|
||||
Вы уверены, что хотите удалить занятие "{{ lesson.course.title }}"?
|
||||
</p>
|
||||
<p class="card-text text-muted">
|
||||
<small>
|
||||
<i class="fas fa-calendar me-2"></i>{{ lesson.date|date:"d.m.Y" }}<br>
|
||||
<i class="fas fa-clock me-2"></i>{{ lesson.start_time|time:"H:i" }} - {{ lesson.end_time|time:"H:i" }}<br>
|
||||
<i class="fas fa-users me-2"></i>Записанных студентов: {{ lesson.enrolled_students.count }}
|
||||
</small>
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" class="btn btn-danger">
|
||||
<i class="fas fa-trash me-2"></i>Удалить
|
||||
</button>
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="btn btn-secondary">
|
||||
<i class="fas fa-times me-2"></i>Отмена
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
102
templates/schedule/lesson_detail.html
Normal file
102
templates/schedule/lesson_detail.html
Normal file
@ -0,0 +1,102 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ lesson.course.title }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'schedule:list' %}">Расписание</a></li>
|
||||
<li class="breadcrumb-item active">{{ lesson.course.title }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">Информация о занятии</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ lesson.course.title }}</h5>
|
||||
<p class="card-text">
|
||||
<i class="fas fa-calendar me-2"></i>Дата: {{ lesson.date|date:"d.m.Y" }}<br>
|
||||
<i class="fas fa-clock me-2"></i>Время: {{ lesson.start_time|time:"H:i" }} - {{ lesson.end_time|time:"H:i" }}<br>
|
||||
<i class="fas fa-user me-2"></i>Инструктор: {{ lesson.instructor.user.get_full_name }}<br>
|
||||
<i class="fas fa-map-marker-alt me-2"></i>Место: {{ lesson.location }}<br>
|
||||
<i class="fas fa-users me-2"></i>Количество мест: {{ lesson.enrolled_students.count }}/{{ lesson.max_students }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h4 class="mb-0">Записанные студенты</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if lesson.enrolled_students.all %}
|
||||
<div class="list-group">
|
||||
{% for student in lesson.enrolled_students.all %}
|
||||
<div class="list-group-item">
|
||||
<h6 class="mb-1">{{ student.user.get_full_name }}</h6>
|
||||
<small class="text-muted">
|
||||
<i class="fas fa-envelope me-2"></i>{{ student.user.email }}<br>
|
||||
<i class="fas fa-phone me-2"></i>{{ student.phone_number }}
|
||||
</small>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>На это занятие пока никто не записался.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
{% if user.is_authenticated %}
|
||||
{% if user.instructor == lesson.instructor %}
|
||||
<a href="{% url 'schedule:update' lesson.pk %}" class="btn btn-warning w-100 mb-2">
|
||||
<i class="fas fa-edit me-2"></i>Редактировать
|
||||
</a>
|
||||
<a href="{% url 'schedule:delete' lesson.pk %}" class="btn btn-danger w-100">
|
||||
<i class="fas fa-trash me-2"></i>Удалить
|
||||
</a>
|
||||
{% elif user.student %}
|
||||
{% if user.student in lesson.enrolled_students.all %}
|
||||
<div class="alert alert-success">
|
||||
<i class="fas fa-check-circle me-2"></i>Вы записаны на это занятие
|
||||
</div>
|
||||
{% elif lesson.enrolled_students.count >= lesson.max_students %}
|
||||
<div class="alert alert-warning">
|
||||
<i class="fas fa-exclamation-circle me-2"></i>К сожалению, все места заняты
|
||||
</div>
|
||||
{% else %}
|
||||
<form method="post" action="{% url 'schedule:enroll' lesson.pk %}">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn btn-success w-100">
|
||||
<i class="fas fa-plus me-2"></i>Записаться
|
||||
</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>Для записи на занятие необходимо войти в систему
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
68
templates/schedule/lesson_form.html
Normal file
68
templates/schedule/lesson_form.html
Normal file
@ -0,0 +1,68 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}
|
||||
{% if action == 'create' %}Создание занятия{% else %}Редактирование занятия{% endif %} | Автошкола
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'schedule:list' %}">Расписание</a></li>
|
||||
<li class="breadcrumb-item active">
|
||||
{% if action == 'create' %}Создание занятия{% else %}Редактирование занятия{% endif %}
|
||||
</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8 mx-auto">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">
|
||||
{% if action == 'create' %}
|
||||
<i class="fas fa-plus me-2"></i>Создание занятия
|
||||
{% else %}
|
||||
<i class="fas fa-edit me-2"></i>Редактирование занятия
|
||||
{% endif %}
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{% for field in form %}
|
||||
<div class="mb-3">
|
||||
<label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
|
||||
{{ field.errors }}
|
||||
{{ field }}
|
||||
{% if field.help_text %}
|
||||
<div class="form-text">{{ field.help_text }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
<div class="d-grid gap-2">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{% if action == 'create' %}
|
||||
<i class="fas fa-plus me-2"></i>Создать
|
||||
{% else %}
|
||||
<i class="fas fa-save me-2"></i>Сохранить
|
||||
{% endif %}
|
||||
</button>
|
||||
<a href="{% url 'schedule:list' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-times me-2"></i>Отмена
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
81
templates/schedule/schedule_list.html
Normal file
81
templates/schedule/schedule_list.html
Normal file
@ -0,0 +1,81 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Расписание | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<h2 class="text-center mb-4">Расписание занятий</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if user.is_authenticated and user.instructor %}
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<a href="{% url 'schedule:create' %}" class="btn btn-primary">
|
||||
<i class="fas fa-plus me-2"></i>Добавить занятие
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
{% if lessons %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<th>Время</th>
|
||||
<th>Курс</th>
|
||||
<th>Инструктор</th>
|
||||
<th>Место</th>
|
||||
<th>Студенты</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for lesson in lessons %}
|
||||
<tr>
|
||||
<td>{{ lesson.date|date:"d.m.Y" }}</td>
|
||||
<td>{{ lesson.start_time|time:"H:i" }} - {{ lesson.end_time|time:"H:i" }}</td>
|
||||
<td>{{ lesson.course.title }}</td>
|
||||
<td>{{ lesson.instructor.user.get_full_name }}</td>
|
||||
<td>{{ lesson.location }}</td>
|
||||
<td>{{ lesson.enrolled_students.count }}/{{ lesson.max_students }}</td>
|
||||
<td>
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="btn btn-sm btn-primary">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if user.is_authenticated and user.instructor == lesson.instructor %}
|
||||
<a href="{% url 'schedule:update' lesson.pk %}" class="btn btn-sm btn-warning">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<a href="{% url 'schedule:delete' lesson.pk %}" class="btn btn-sm btn-danger">
|
||||
<i class="fas fa-trash"></i>
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>На данный момент нет запланированных занятий.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
75
templates/student/student_detail.html
Normal file
75
templates/student/student_detail.html
Normal file
@ -0,0 +1,75 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}{{ student.user.get_full_name }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'student:list' %}">Студенты</a></li>
|
||||
<li class="breadcrumb-item active">{{ student.user.get_full_name }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<h4 class="mb-0">Информация о студенте</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ student.user.get_full_name }}</h5>
|
||||
<p class="card-text">
|
||||
<i class="fas fa-envelope me-2"></i>{{ student.user.email }}<br>
|
||||
<i class="fas fa-phone me-2"></i>{{ student.phone_number }}<br>
|
||||
<i class="fas fa-calendar-alt me-2"></i>Дата регистрации: {{ student.user.date_joined|date:"d.m.Y" }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h4 class="mb-0">Записанные занятия</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if enrolled_lessons %}
|
||||
<div class="list-group">
|
||||
{% for lesson in enrolled_lessons %}
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="list-group-item list-group-item-action">
|
||||
<div class="d-flex w-100 justify-content-between">
|
||||
<h5 class="mb-1">{{ lesson.course.title }}</h5>
|
||||
<small>{{ lesson.date|date:"d.m.Y" }} {{ lesson.start_time|time:"H:i" }}</small>
|
||||
</div>
|
||||
<p class="mb-1">
|
||||
<i class="fas fa-user me-2"></i>{{ lesson.instructor.user.get_full_name }}<br>
|
||||
<i class="fas fa-map-marker-alt me-2"></i>{{ lesson.location }}
|
||||
</p>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>Студент еще не записан ни на одно занятие.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<div class="card shadow">
|
||||
<div class="card-body">
|
||||
<a href="{% url 'student:schedule' student.pk %}" class="btn btn-success w-100 mb-2">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание занятий
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
48
templates/student/student_list.html
Normal file
48
templates/student/student_list.html
Normal file
@ -0,0 +1,48 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Студенты | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<h2 class="text-center mb-4">Студенты</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
{% if students %}
|
||||
{% for student in students %}
|
||||
<div class="col-md-4 mb-4">
|
||||
<div class="card h-100 shadow">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ student.user.get_full_name }}</h5>
|
||||
<p class="card-text">
|
||||
<i class="fas fa-envelope me-2"></i>{{ student.user.email }}<br>
|
||||
<i class="fas fa-phone me-2"></i>{{ student.phone_number }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-footer bg-transparent">
|
||||
{% if user.is_authenticated %}
|
||||
<a href="{% url 'student:detail' student.pk %}" class="btn btn-primary">
|
||||
<i class="fas fa-info-circle me-2"></i>Подробнее
|
||||
</a>
|
||||
<a href="{% url 'student:schedule' student.pk %}" class="btn btn-success">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<div class="col">
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>На данный момент нет зарегистрированных студентов.
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
70
templates/student/student_schedule.html
Normal file
70
templates/student/student_schedule.html
Normal file
@ -0,0 +1,70 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load static %}
|
||||
|
||||
{% block title %}Расписание {{ student.user.get_full_name }} | Автошкола{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row mb-4">
|
||||
<div class="col">
|
||||
<nav aria-label="breadcrumb">
|
||||
<ol class="breadcrumb">
|
||||
<li class="breadcrumb-item"><a href="{% url 'student:list' %}">Студенты</a></li>
|
||||
<li class="breadcrumb-item"><a href="{% url 'student:detail' student.pk %}">{{ student.user.get_full_name }}</a></li>
|
||||
<li class="breadcrumb-item active">Расписание</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card shadow">
|
||||
<div class="card-header bg-success text-white">
|
||||
<h4 class="mb-0">
|
||||
<i class="fas fa-calendar-alt me-2"></i>Расписание занятий
|
||||
</h4>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if enrolled_lessons %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<th>Время</th>
|
||||
<th>Курс</th>
|
||||
<th>Инструктор</th>
|
||||
<th>Место</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for lesson in enrolled_lessons %}
|
||||
<tr>
|
||||
<td>{{ lesson.date|date:"d.m.Y" }}</td>
|
||||
<td>{{ lesson.start_time|time:"H:i" }} - {{ lesson.end_time|time:"H:i" }}</td>
|
||||
<td>{{ lesson.course.title }}</td>
|
||||
<td>{{ lesson.instructor.user.get_full_name }}</td>
|
||||
<td>{{ lesson.location }}</td>
|
||||
<td>
|
||||
<a href="{% url 'schedule:detail' lesson.pk %}" class="btn btn-sm btn-primary">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-info">
|
||||
<i class="fas fa-info-circle me-2"></i>Студент еще не записан ни на одно занятие.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
Reference in New Issue
Block a user