А добавь теперь и для моего mini-app этот функционал. Ну наверное просто вкладку отдельную сделай там.





app.py: [from flask import Flask, render_template, request, redirect, url_for, flash

import db
from db import fetch_schedule, insert_schedule, update_homework
from datetime import datetime, timedelta
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, SubmitField, SelectField
from wtforms.validators import DataRequired
import locale

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # Замените на ваш секретный ключ
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')

class HomeworkForm(FlaskForm):
    date = SelectField('Дата', choices=[], validators=[DataRequired()])
    time = StringField('Время', validators=[DataRequired()])
    subject = StringField('Предмет', validators=[DataRequired()])
    homework = TextAreaField('Домашнее задание', validators=[DataRequired()])
    submit = SubmitField('Добавить')


@app.route('/')
def index():
    # Получаем параметр week_offset из запроса, по умолчанию 0 (текущая неделя)
    week_offset = request.args.get('week', default=0, type=int)

    # Получаем текущую дату
    today = datetime.now().date()

    # Определяем начало текущей недели
    start_of_current_week = today - timedelta(days=today.weekday())

    # Рассчитываем начало нужной недели с учетом week_offset
    start_of_week = start_of_current_week + timedelta(weeks=week_offset)
    end_of_week = start_of_week + timedelta(days=6)

    schedule = {}

    for single_date in (start_of_week + timedelta(n) for n in range(7)):
        day_schedule = fetch_schedule(single_date.strftime('%Y-%m-%d'))
        schedule[single_date] = day_schedule

    return render_template('index.html', schedule=schedule, week_offset=week_offset, start_of_week=start_of_week,
                           end_of_week=end_of_week)


@app.route('/add_homework', methods=['GET', 'POST'])
def add_homework():
    form = HomeworkForm()
    # Заполняем выбор даты
    today = datetime.now().date()
    start_of_week = today - timedelta(days=today.weekday())
    dates = [(start_of_week + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(7)]
    form.date.choices = [(date, datetime.strptime(date, '%Y-%m-%d').strftime('%d.%m.%Y')) for date in dates]

    if request.method == 'POST' and form.validate_on_submit():
        date = form.date.data
        time = form.time.data
        subject = form.subject.data
        homework = form.homework.data

        # Обновляем домашнее задание в базе данных
        db.update_homework(date, time, homework)

        flash('Домашнее задание успешно добавлено!', 'success')
        return redirect(url_for('index'))

    return render_template('add_homework.html', form=form)


class UpdateHomeworkForm(FlaskForm):
    homework = TextAreaField('Домашнее задание', validators=[DataRequired()])
    submit = SubmitField('Обновить')

@app.route('/update_homework', methods=['GET', 'POST'])
def update_homework():
    date = request.args.get('date')
    time_slot = request.args.get('time')

    if not date or not time_slot:
        flash('Некорректные параметры.', 'danger')
        return redirect(url_for('index'))

    form = UpdateHomeworkForm()

    if form.validate_on_submit():
        homework = form.homework.data
        db.update_homework(date, time_slot, homework)
        flash('Домашнее задание успешно обновлено!', 'success')
        return redirect(url_for('index'))

    # Получаем текущую запись для предварительного заполнения формы
    current_schedule = fetch_schedule(date)
    current_entry = next((entry for entry in current_schedule if entry[0] == time_slot), None)

    if not current_entry:
        flash('Запись не найдена.', 'danger')
        return redirect(url_for('index'))

    form.homework.data = current_entry[4]  # Предварительное заполнение текущего ДЗ

    return render_template('update_homework.html', form=form, date=date, time_slot=time_slot, subject=current_entry[1])


if __name__ == '__main__':
    app.run(debug=True, port=8787)
]









index: [<!-- templates/index.html -->

{% extends "layout.html" %}

{% block content %}
<h1 class="mt-4">Расписание на неделю ({{ start_of_week.strftime('%d.%m.%Y') }} - {{ end_of_week.strftime('%d.%m.%Y') }})</h1>

<!-- Навигация между неделями -->
<div class="d-flex justify-content-between mb-3">
    <a href="{{ url_for('index', week=week_offset - 1) }}" class="btn btn-secondary">&laquo; Предыдущая неделя</a>
    <a href="{{ url_for('index', week=week_offset + 1) }}" class="btn btn-secondary">Следующая неделя &raquo;</a>
</div>

{% for date, entries in schedule.items() %}
    <div class="card mb-3">
        <div class="card-header">
            {{ date.strftime('%d.%m.%Y') }}, {{ date.strftime('%A') }}
        </div>
        <ul class="list-group list-group-flush">
            {% if entries %}
                {% for entry in entries %}
                    <li class="list-group-item d-flex justify-content-between align-items-center">
                        <div>
                            <strong>{{ entry[0] }} - {{ entry[1] }}</strong><br>
                            Преподаватель: {{ entry[2] }}<br>
                            Место: {{ entry[3] }}<br>
                            {% if entry[4] %}
                                Домашнее задание: {{ entry[4] }}
                            {% else %}
                                Домашнего задания нет.
                            {% endif %}
                        </div>
                        <!-- Кнопка "Обновить ДЗ" -->
                        <a href="{{ url_for('update_homework', date=date.strftime('%Y-%m-%d'), time=entry[0]) }}" class="btn btn-sm btn-primary">Обновить ДЗ</a>
                    </li>
                {% endfor %}
            {% else %}
                <li class="list-group-item">Нет занятий.</li>
            {% endif %}
        </ul>
    </div>
{% endfor %}
{% endblock %}]





layout: [<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Расписание</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
    <style>
        /* Дополнительные стили для адаптивности */
        body {
            padding-top: 60px;
        }
    </style>
</head>
<body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark fixed-top">
        <a class="navbar-brand" href="{{ url_for('index') }}">Расписание</a>
<!--        <div class="collapse navbar-collapse">-->
<!--            <ul class="navbar-nav ml-auto">-->
<!--                <li class="nav-item">-->
<!--                    <a class="nav-link" href="{{ url_for('add_homework') }}">Добавить ДЗ</a>-->
<!--                </li>-->
<!--            </ul>-->
<!--        </div>-->
    </nav>

    <div class="container">
        {% with messages = get_flashed_messages(with_categories=true) %}
          {% if messages %}
            {% for category, message in messages %}
              <div class="alert alert-{{ category }} mt-2">
                {{ message }}
              </div>
            {% endfor %}
          {% endif %}
        {% endwith %}
        {% block content %}{% endblock %}
    </div>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>]







upfdate_homework: [<!-- templates/update_homework.html -->

{% extends "layout.html" %}

{% block content %}
<h1 class="mt-4">Обновить Домашнее Задание</h1>
<p><strong>Дата:</strong> {{ date }}</p>
<p><strong>Время:</strong> {{ time_slot }}</p>
<p><strong>Предмет:</strong> {{ subject }}</p>

<form method="POST">
    {{ form.hidden_tag() }}
    <div class="form-group">
        {{ form.homework.label(class="form-label") }}
        {{ form.homework(class="form-control", rows=4) }}
    </div>
    <button type="submit" class="btn btn-primary">{{ form.submit.label.text }}</button>
    <a href="{{ url_for('index') }}" class="btn btn-secondary">Отмена</a>
</form>
{% endblock %}
]





add_homework: [{% extends "layout.html" %}

{% block content %}
<h1 class="mt-4">Расписание на неделю</h1>
{% for date, entries in schedule.items() %}
    <div class="card mb-3">
        <div class="card-header">
            {{ date.strftime('%d.%m.%Y') }}, {{ date.strftime('%A') }}
        </div>
        <ul class="list-group list-group-flush">
            {% if entries %}
                {% for entry in entries %}
                    <li class="list-group-item">
                        <strong>{{ entry[0] }} - {{ entry[1] }}</strong><br>
                        Преподаватель: {{ entry[2] }}<br>
                        Место: {{ entry[3] }}<br>
                        {% if entry[4] %}
                            Домашнее задание: {{ entry[4] }}
                        {% else %}
                            Домашнего задания нет.
                        {% endif %}
                    </li>
                {% endfor %}
            {% else %}
                <li class="list-group-item">Нет занятий.</li>
            {% endif %}
        </ul>
    </div>
{% endfor %}
{% endblock %}]