Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,19 @@ pyhton3 -m venv venv

pip install -r requirements.txt
```
5. Запустите проект
5. Перейдите в папку с проектом
```
cd geekshop-server
```
6. Примените миграции
```
python manage.py migrate
```
7. Импортируйте демонстрационные данные в базу данных
```
python manage.py import
```
8. Запустите проект
```
python manage.py runserver
```
24 changes: 24 additions & 0 deletions adminapp/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from authapp.models import ShopUser
from authapp.forms import ShopUserEditForm
from mainapp.models import ProductCategory, Product
from ordersapp.models import Order, OrderItem


class ShopUserAdminEditForm(ShopUserEditForm):
class Meta:
Expand Down Expand Up @@ -31,3 +33,25 @@ def __init__(self, *args, **kwargs):
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'form-control'
field.help_text = ''


class OrderForm(forms.ModelForm):
class Meta:
model = Order
exclude = ('user',)

def __init__(self, *args, **kwargs):
super(OrderForm, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'form-control'


class OrderItemForm(forms.ModelForm):
class Meta:
model = OrderItem
exclude = ()

def __init__(self, *args, **kwargs):
super(OrderItemForm, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'form-control'
8 changes: 5 additions & 3 deletions adminapp/templates/adminapp/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@

{% block css %}
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap.css' %}">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
<link rel="stylesheet" href="{% static 'fonts/font-awesome/css/font-awesome.css' %}">
{% endblock %}

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script>
<script src="{% static 'js/jquery-3.5.1.js' %}"></script>

</head>
<body>
<div class="admin_container">
Expand All @@ -31,8 +34,7 @@
{% endblock %}
</div>
{% block js %}
<script src="{% static 'js/jquery-3.5.1.js' %}"></script>
<script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>

{% endblock %}
</body>
</html>
13 changes: 12 additions & 1 deletion adminapp/templates/adminapp/includes/inc_menu.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
Expand All @@ -9,12 +8,24 @@
<li class="nav-item active">
<a class="nav-link" href="{% url 'main' %}">На сайт<span class="sr-only">(current)</span></a>
</li>
{% if user.is_superuser %}
<li class="nav-item">
<a class="nav-link" href="{% url 'admin_staff:users' %}">Пользователи</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'admin_staff:categories' %}">Категории товаров</a>
</li>
{% endif %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Заказы
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="{% url 'admin_staff:all_orders' %}">Все заказы</a></li>
<li><a class="dropdown-item" href="{% url 'admin_staff:orders_processed' %}">Заказы на сборку</a></li>
<li><a class="dropdown-item" href="{% url 'admin_staff:orders_ready' %}">Заказы на выдачу</a></li>
</ul>
</li>
</ul>
</div>
</nav>
47 changes: 47 additions & 0 deletions adminapp/templates/adminapp/order.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{% extends 'adminapp/base.html' %}
{% load static %}
{% load project_tags %}

{% block title %}
{{ title }}
{% endblock %}

{% block content %}
<div class="order_form">
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<table class="table">
{{ formset.management_form }}
{% for form in formset.forms %}
{% if forloop.first %}
<thead>
<tr>
{% for field in form.visible_fields %}
<th class="{% cycle 'td1' 'td2' 'td3' %} order formset_td">
{{ field.label|capfirst }}
</th>
{% endfor %}
</tr>
</thead>
{% endif %}
<tr class="formset_row">
{% for field in form.visible_fields %}
<td class="{% cycle 'td1' 'td2' 'td3' %} order formset_td">
{% if forloop.first %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% endif %}
{{ field.errors.as_ul }}
{{ field }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>

<button type="submit" value="сохранить" class="btn btn-default btn-round form-control last">сохранить</button>
</form>
</div>
{% endblock %}
135 changes: 135 additions & 0 deletions adminapp/templates/adminapp/order_list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
{% extends 'adminapp/base.html' %}
{% load static %}
{% load project_tags %}

{% block title %}
{{ title }}
{% endblock %}

{% block content %}
<div class="order_list">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Номер</th>
<th scope="col">Имя</th>
<th scope="col">Фамилия</th>
<th scope="col">Дата заказа</th>
<th scope="col">Последнее изменение</th>
<th scope="col">Сумма</th>
<th scope="col">Статус</th>
<th scope="col">Действия</th>
<th scope="col">Редактировать</th>
</tr>
</thead>
<tbody>
{% for object in object_list %}
<tr {% if not object.is_active %}class="table-success"{% endif %} id="order_list{{ object.pk }}">
<td>{{ object.pk }}</td>
<td>{{ object.user.first_name }}</td>
<td>{{ object.user.last_name }}</td>
<td>{{ object.created }}</td>
<td>{{ object.updated }}</td>
<td id="order_sum">{{ object.get_total_cost }}</td>
<td>{{ object.get_status_display }}</td>
<td>
<button class="btn btn-primary btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#order{{ object.pk }}" aria-expanded="false" aria-controls="{{ object.order.pk }}">
Состав заказа
</button>
{% if object.status == 'PRD' %}
<form method="post" action="{% url 'admin_staff:order_is_ready' object.pk %}">
{% csrf_token %}
<button type="submit" class="btn btn-primary btn-sm" name="button">Собрать</button>
</form>
{% elif object.status == 'RDY' %}
<form method="post" action="{% url 'adminapp:order_issued' object.pk %}">
{% csrf_token %}
<button type="submit" class="btn btn-primary btn-sm" name="button">Выдать</button>
</form>
{% endif %}
</td>
<td>
{% if object.is_active %}
<a class="btn btn-primary btn-sm" href="{% url 'adminapp:order' object.pk %}" role="button">
Редактировать (formset)
</a>
<form method="post" action="{% url 'adminapp:order_delete' object.pk %}">
{% csrf_token %}
<button type="submit" class="btn btn-danger btn-sm" name="button">Отменить заказ</button>
</form>
{% endif %}
</td>
</tr>
<tr>
<td colspan="5">
<div class="collapse" id="order{{ object.pk }}">
<div class="card card-body">
<table class="table">
<thead>
<tr>
<th scope="col">Наименование товара</th>
<th scope="col">Цена</th>
<th scope="col">Количество</th>
<th scope="col"></th>
<th scope="col">Сумма</th>
<th scope="col">Действия</th>
</tr>
</thead>
<tbody>
{% for order_item in object.all_order_items %}
<tr class="order_item" id="order_item_{{ order_item.pk }}">
<td id="product_name">{{ order_item.product.name }}</td>
<td id="product_price">{{ order_item.product.price }}</td>
<td id="order_item_quantity">
{{ order_item.quantity }}
</td>
<td>
{% if object.is_active %}
<i class="fa fa-minus-square-o fa-2x" name='minus' aria-hidden="true" id='{{ order_item.pk }}'></i>
<i class="fa fa-plus-square-o fa-2x" name='plus' aria-hidden="true" id='{{ order_item.pk }}'></i>
{% endif %}
</td>
<td id="order_item_sum">{{ order_item.get_product_cost }}</td>
<td id="delete">
{% if object.is_active %}
<button type="button" class="btn btn-danger btn-sm delete" id="{{ order_item.pk }}">Убрать из заказа</button>
{% endif %}
</td>
</tr>
{% endfor %}
<tr class="empty">
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
{% if object.is_active %}
<form class="add_order_item">
{% csrf_token %}
<label for="add_order_item_{{ object.pk }}" class="col-sm-2 col-form-label">Добавить товар:</label>
<input type="hidden" name="order" value="{{ object.pk }}">
<select class="form-select" name="product" id="add_order_item_{{ object.pk }}">
{% for product in products %}
<option value="{{ product.pk }}">
{{ product.pk }}. {{ product.name }} ({{ product.category.name }}), цена: {{ product.price }}
</option>
{% endfor %}
</select>
<button class="btn btn-primary" type="submit">Добавить</button>
</form>
{% endif %}
</div>
</div>
</td>
</tr>
{% endfor%}
</tbody>
</table>
</div>
{% endblock %}

{% block js %}
<script src="{% static 'js/orders_staff.js' %}"></script>
{% endblock %}
10 changes: 10 additions & 0 deletions adminapp/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,14 @@
path('products/read/category/<str:category>/', adminapp.ProductListView.as_view(), name='products'),
path('products/update/<int:pk>/', adminapp.ProductUpdateView.as_view(), name='product_update'),
path('products/change_active/<int:pk>/', adminapp.ProductChangeActive.as_view(), name='product_change_active'),

path('orders/', adminapp.StaffOrderList.as_view(), name='all_orders'),
path('order/<int:pk>', adminapp.StaffOrderUpdate.as_view(), name='order'),
path('change_order/', adminapp.StaffChangeOrder.as_view(), name='change_order'),
path('add_order_item/', adminapp.StaffAddOrderItem.as_view(), name='add_order_item'),
path('orders/processed/', adminapp.StaffOrderProcessedList.as_view(), name='orders_processed'),
path('orders/ready/', adminapp.StaffOrderReadyList.as_view(), name='orders_ready'),
path('order/ready/<int:pk>', adminapp.StaffOrderIsReady.as_view(), name='order_is_ready'),
path('order/issued/<int:pk>', adminapp.StaffOrderIssued.as_view(), name='order_issued'),
path('order/delete/<int:pk>', adminapp.StaffOrderDelete.as_view(), name='order_delete')
]
Loading