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

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

Задание
Ваша основная задача - разработать максимально удобное и понятное приложение для учета клиентов такси и их заказов. Помните, что вы разрабатываетек веб-приложение. Язык на котором должна выполнятся разработка - 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.
Телеграм
-