Скриншот архива с проектом

Структура проекта

Задание
Ваша основная задача - разработать максимально удобное и понятное приложение для учета клиентов такси и их заказов. Помните, что вы разрабатываетек веб-приложение. Язык на котором должна выполнятся разработка - Python. Фреймворки - можете выбрать любой из двух, но в идеале - Django. Для продвинутых: если желаете улучшить свой результат и максимально прокачать навыки применяйте Django REST Framework и React.js.
Функционал программы
- Добавление клиентов и заказов - - добавление клиентов через админку, добавление заказов через админку и форму
 - Редактирование клиентов и заказов - редактирование клиентов через админку, редактирование заказов через админку и форму
 - Удаление клиентов и заказов
 - Поиск по клиенту
 - Печать отчетов по заказа
 
Фрагмент программного кода
from django.shortcuts import render, redirect, get_object_or_404
from .forms import *
from .models import *
from django.contrib.auth.views import LoginView
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth import login
from django.contrib.auth import logout
from django.urls import reverse_lazy
from django.views.generic.edit import FormView
import matplotlib
from matplotlib import dates as mdates
from collections import defaultdict
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from io import BytesIO
import base64
# Create your views here.
class CustomLoginView(LoginView):
    template_name = 'login.html'
    fields = '__all__'
    redirect_authenticated_user = True
    def get_success_url(self):
        return reverse_lazy('index')
class RegisterPage(FormView):
    template_name = 'register.html'
    form_class = UserCreationForm
    redirect_authenticated_user = True
    success_url = reverse_lazy('index')
    def form_valid(self, form):
        user = form.save()
        if user is not None:
            login(self.request, user)
        return super(RegisterPage, self).form_valid(form)
    def get(self, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('index')
        return super(RegisterPage, self).get(*args, **kwargs)
def logout_view(request):
    logout(request)
    return redirect('index')
def index(request):
    context = {
        'title': 'Главная страница сайта'
    }
    return render(request, 'index.html', context)
def clients(request):
    clients = Client.objects.all()
    context = {
        'clients': clients,
    }
    return render(request, 'client_list.html', context)
def add_client(request):
    if request.method == 'POST':
        form = ClientForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('client_list')
    else:
        form = ClientForm()
    return render(request, 'add_client.html', {'form': form})
def plot_order_statistics(orders):
    fig, ax = plt.subplots()
    order_date = [order.order_date for order in orders]
    order_amounts = [order.order_amount for order in orders]
    # Группировка данных по дате, если это необходимо
    grouped_orders = defaultdict(float)
    for date, amount in zip(order_date, order_amounts):
        grouped_orders[date] += float(amount)
    # Разделение обратно на списки
    unique_dates = list(grouped_orders.keys())
    summed_amounts = list(grouped_orders.values())
    # Построение линейного графика
    ax.plot(unique_dates, summed_amounts, marker='o', color='skyblue', linestyle='-')
    plt.xlabel('Дата')
    plt.ylabel('Сумма заказа')
    plt.title('Статистика заказов')
    plt.xticks(rotation=45)
    graph_file = BytesIO()
    plt.savefig(graph_file, format='png')
    graph_file.seek(0)
    graph_base64 = base64.b64encode(graph_file.read()).decode()
    plt.close(fig)
    return graph_base64
def plot_order_statistics_2(orders):
    fig, ax = plt.subplots()
    order_date = [order.order_date for order in orders]
    order_amounts = [order.order_amount for order in orders]
    ax.bar(order_date, order_amounts, color='skyblue')
    plt.xlabel('Дата')
    plt.ylabel('Сумма заказа')
    plt.title('Статистика заказов')
    plt.xticks(rotation=45)
    graph_file = BytesIO()
    plt.savefig(graph_file, format='png')
    graph_file.seek(0)
    graph_base64_2 = base64.b64encode(graph_file.read()).decode()
    plt.close('all')
    return graph_base64_2
def orders(request):
    orders = Order.objects.all()
    graph_base64_2 = plot_order_statistics_2(orders)
    graph_base64 = plot_order_statistics(orders)
    context = {
        'orders': orders,
        'graph_base64': graph_base64,
        'graph_base64_2': graph_base64_2,
    }
    return render(request, 'order_list.html', context)
def add_order(request):
    if request.method == 'POST':
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('order_list')
    else:
        form = OrderForm()
    return render(request, 'add_order.html', {'form': form})
def search_orders(request):
    client = request.GET.get('client')
    if client:
        orders = Order.objects.filter(client__name__icontains=client)
        header = f"Search results for '{client}'"
    else:
        orders = Order.objects.all()
        header = "All Orders"
    graph_base64_2 = plot_order_statistics_2(orders)
    graph_base64 = plot_order_statistics(orders)
    context = {
        'orders': orders,
        'header': header,
        'graph_base64': graph_base64,
        'graph_base64_2': graph_base64_2,
    }
    return render(request, 'order_list.html', context)
def print_orders(request):
    orders = Order.objects.all()
    return render(request, 'order_list.html', {'orders': orders})
def edit_order(request, pk):
    order = get_object_or_404(Order, pk=pk)
    if request.method == "POST":
        form = OrderForm(request.POST, instance=order)
        if form.is_valid():
            form.save()
            return redirect("order_list")
    else:
        form = OrderForm(instance=order)
        context = {
            'form': form,
            'header': 'Редактировать заказ',
        }
        return render(request, 'edit_order.html', context)
def delete_order(request, pk):
    orders = get_object_or_404(Order, pk=pk)
    orders.delete()
    return redirect("order_list")
Пояснения по запуску программы
Для эффективной работы с приложением вам потребуется:
- редактор кода VS Code - скачать можно тут - https://code.visualstudio.com/download или PyCharm Community - https://www.jetbrains.com/ru-ru/pycharm/download/?section=windows
 - интерпретатор языка Python, скачать можно тут - https://www.python.org/downloads/ Рнкомендуемая версия - 3.12.3
 - После установки всего выше описанного, настройте VS Code для работы с Python установив необходимые расширения (см. инструкцию - https://youtu.be/j5e5gwZgMH8) .
 - Переходите в директорию с проектом - в терминале вводите cd TaxiApp и затем python manage.py runserver
 - Запускаете приложение и пользуетесь. Также вы можете самостоятельно выложить проект на Heroku.
 
                    
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                Телеграм
                            
                
-