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