Исправлены конфликты
This commit is contained in:
@@ -105,7 +105,11 @@ class Order(models.Model):
|
||||
|
||||
#Эскизы
|
||||
class Sketch(models.Model):
|
||||
sketch_file = models.FileField(upload_to = 'sketches/') #путь к файу
|
||||
def get_sketch_path(self, file_name):
|
||||
template = 'sketches/%s'
|
||||
return template % '' if self.order == None else '%s/%s' % ((template % self.order.id), file_name)
|
||||
|
||||
sketch_file = models.FileField(upload_to = get_sketch_path) #путь к файу
|
||||
order = models.ForeignKey(Order) #id заказа
|
||||
|
||||
def __unicode__(self):
|
||||
|
||||
@@ -17,12 +17,12 @@ class EditableColumn(tables.TemplateColumn):
|
||||
main_part = ''
|
||||
if object_name == '':
|
||||
main_part = '''
|
||||
{{% inplace_edit "record.{field}" auto_height = 1 %}}
|
||||
{{% inplace_edit "record.{field}" auto_height = 1, auto_width = 1 %}}
|
||||
'''
|
||||
else:
|
||||
main_part = '''
|
||||
{{% if record.{object_name} %}}
|
||||
{{% inplace_edit "record.{object_name}.{field}" auto_height = 1 %}}
|
||||
{{% inplace_edit "record.{object_name}.{field}" auto_height = 1, auto_width = 1 %}}
|
||||
{{% endif %}}
|
||||
'''
|
||||
template = template.format(main_part = main_part)
|
||||
@@ -43,7 +43,7 @@ class ThumbnailColumn(tables.TemplateColumn):
|
||||
|
||||
class OrdersTable(tables.Table):
|
||||
date = tables.DateColumn('d/m/Y', verbose_name = 'Дата')
|
||||
deadline = tables.DateColumn('d/m/Y/', verbose_name = 'Срок сдачи')
|
||||
deadline = tables.DateColumn('d/m/Y', verbose_name = 'Срок сдачи')
|
||||
product = tables.Column(verbose_name = 'Наименование')
|
||||
delivery = EditableColumn('delivery', verbose_name = 'Доставка')
|
||||
lifting = EditableColumn('lifting', verbose_name = 'Подъем')
|
||||
@@ -55,18 +55,12 @@ class OrdersTable(tables.Table):
|
||||
sketch = tables.LinkColumn('asuzr.views.sketches', verbose_name = 'Эскизы', args=[tables.utils.A('pk')])
|
||||
executor = EditableColumn('executor', verbose_name = 'Исполнитель')
|
||||
is_done = EditableColumn('is_done', verbose_name = 'Сдан')
|
||||
id = tables.Column(visible = False)
|
||||
designer = tables.Column(visible = False)
|
||||
calls = tables.Column(visible = False)
|
||||
contact = tables.Column(visible = False)
|
||||
phone_num = tables.Column(visible = False)
|
||||
cancelled = tables.Column(visible = False)
|
||||
|
||||
def render_price(self, value):
|
||||
return '%0.1f' % value
|
||||
return '%0.2f' % value
|
||||
|
||||
def render_ostatok(self, value):
|
||||
return '%0.1f' % value
|
||||
return '%0.2f' % value
|
||||
|
||||
class Meta:
|
||||
model = Order
|
||||
@@ -84,6 +78,7 @@ class OrdersTable(tables.Table):
|
||||
'sketch',
|
||||
'executor',
|
||||
'is_done',)
|
||||
exclude = ('id', 'calls', 'contact', 'phone_num', 'cancelled', 'designer', )
|
||||
|
||||
class ArchiveOrdersTable(OrdersTable):
|
||||
calls = EditableColumn('calls', verbose_name = 'Обзвон')
|
||||
@@ -112,6 +107,11 @@ class DesignerTable(tables.Table):
|
||||
class SketchesTable(tables.Table):
|
||||
sketch_file = tables.FileColumn(verbose_name = 'Имя файла')
|
||||
sketch_image = ThumbnailColumn('sketch_file', verbose_name = 'Эскиз', orderable = False)
|
||||
delete_sketch = tables.Column(verbose_name = 'Удалить', orderable = False, empty_values = ())
|
||||
|
||||
def render_delete_sketch(self, record):
|
||||
return mark_safe(u'<a href="%s?pk=%s">Удалить</a>' %
|
||||
(reverse('asuzr.views.delete_sketch'), escape(record.id)))
|
||||
|
||||
class Meta:
|
||||
attrs = {'class': 'paleblue'}
|
||||
@@ -146,6 +146,37 @@ class VisitTable(tables.Table):
|
||||
orderable = False
|
||||
template = 'asuzr/weekend_table.html'
|
||||
|
||||
class DayOrdersTable(OrdersTable):
|
||||
designer = tables.Column(verbose_name = 'Дизайнер')
|
||||
|
||||
summary = ['Итого:', 0, '', '', '',]
|
||||
|
||||
def set_summary(self, price):
|
||||
self.summary[1] = price
|
||||
|
||||
def render_designer(self, value):
|
||||
return ' '.join((value.first_name, value.last_name))
|
||||
|
||||
class Meta:
|
||||
attrs = {'class': 'paleblue'}
|
||||
exclude = ('date',
|
||||
'delivery',
|
||||
'lifting',
|
||||
'paid',
|
||||
'ostatok',
|
||||
'approved',
|
||||
'sketch',
|
||||
'executor',
|
||||
'is_done',
|
||||
)
|
||||
sequence = ('product',
|
||||
'price',
|
||||
'address',
|
||||
'designer',
|
||||
'deadline',
|
||||
)
|
||||
template = 'asuzr/totals_table.html'
|
||||
|
||||
class ProdPlanTable(tables.Table):
|
||||
date = tables.Column(verbose_name = 'Дата')
|
||||
week_day = tables.Column(verbose_name = 'День недели', accessor = 'date.weekday_name')
|
||||
|
||||
116
asuzr/views.py
116
asuzr/views.py
@@ -1,21 +1,16 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.shortcuts import render
|
||||
from django.shortcuts import render, redirect, get_object_or_404
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.template import RequestContext, Context, loader
|
||||
from asuzr.models import Product
|
||||
from asuzr.models import Attendance
|
||||
from asuzr.models import Order
|
||||
from asuzr.models import OrderPlan
|
||||
from asuzr.models import Schedule
|
||||
from asuzr.models import ProdPlan
|
||||
from asuzr.models import *
|
||||
from datetime import datetime, date, timedelta
|
||||
import calendar
|
||||
from django.db.models import Count, Sum
|
||||
from asuzr.common import custom_date
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from tables import *
|
||||
from forms import *
|
||||
from asuzr.tables import *
|
||||
from asuzr.forms import *
|
||||
from django_tables2 import RequestConfig
|
||||
|
||||
@login_required
|
||||
@@ -44,16 +39,12 @@ def get_orders_by_date(dt):
|
||||
order_list = Order.objects.filter(date=dt).order_by('id')
|
||||
return order_list
|
||||
|
||||
@login_required
|
||||
def visit_view(request):
|
||||
curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
|
||||
form = DateForm(request.GET, initial = {'date': curr_date})
|
||||
def get_attendance_table(year, month, prefix):
|
||||
day_in_month = calendar.monthrange(year,month)[1]
|
||||
sdate = date(year,month,1)
|
||||
edate = date(year,month,day_in_month)
|
||||
|
||||
y,m = curr_date.year, curr_date.month
|
||||
day_in_month = calendar.monthrange(y,m)[1]
|
||||
month_days = {i+1: {'date': custom_date(y,m,i+1)} for i in range(day_in_month)}
|
||||
sdate = date(y,m,1)
|
||||
edate = date(y,m,day_in_month)
|
||||
month_days = {i+1: {'date': custom_date(year,month,i+1)} for i in range(day_in_month)}
|
||||
|
||||
attend_list = Attendance.objects.filter(date__range = (sdate,edate))
|
||||
attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits'))
|
||||
@@ -77,24 +68,55 @@ def visit_view(request):
|
||||
else:
|
||||
month_days[day]['designer'] = designer
|
||||
|
||||
table = VisitTable(month_days.values())
|
||||
RequestConfig(request, paginate={'per_page': 32}).configure(table)
|
||||
month_plan = OrderPlan.objects.filter(date = sdate).first()
|
||||
month_plan = 0 if month_plan == None else month_plan.plan
|
||||
month_balance = month_plan - (order_sum['price__sum'] or 0)
|
||||
|
||||
additional_info = {'title': 'Справочно',
|
||||
'rows': [
|
||||
{'title': 'ПЛАН', 'value': month_plan},
|
||||
{'title': 'Осталось до выполнения', 'value': month_balance},
|
||||
]
|
||||
}
|
||||
|
||||
table = VisitTable(month_days.values(), prefix = prefix)
|
||||
table.verbose_name = 'Сводная информация'
|
||||
|
||||
table.set_summaries({
|
||||
'calls': attend_sum['calls__sum'],
|
||||
'visits': attend_sum['visits__sum'],
|
||||
'orders': order_sum['product__count'],
|
||||
'cost': order_sum['price__sum'],
|
||||
'calls': attend_sum['calls__sum'] or 0,
|
||||
'visits': attend_sum['visits__sum'] or 0,
|
||||
'orders': order_sum['product__count'] or 0,
|
||||
'cost': order_sum['price__sum'] or 0,
|
||||
})
|
||||
title = 'Таблица посещаемости на %s г.' % curr_date.strftime('%B %Y')
|
||||
|
||||
if request.method == 'POST':
|
||||
form = DateForm(request.POST)
|
||||
if form.is_valid():
|
||||
print form.cleaned_data
|
||||
else:
|
||||
form = DateForm()
|
||||
return table, additional_info
|
||||
|
||||
return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'form': form})
|
||||
def get_day_orders_table(date, prefix):
|
||||
orders = Order.objects.filter(date = date)
|
||||
orders_price = orders.aggregate(Sum('price'))
|
||||
table = DayOrdersTable(orders, prefix = prefix)
|
||||
table.verbose_name = 'Заказы на %s' % date.strftime('%d %B %Y г')
|
||||
table.set_summary(orders_price['price__sum'] or 0)
|
||||
|
||||
return table
|
||||
|
||||
@login_required
|
||||
def visit_view(request):
|
||||
curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
|
||||
form = DateForm(request.GET, initial = {'date': curr_date})
|
||||
attendance_table, add_info = get_attendance_table(curr_date.year, curr_date.month, 'attendance-')
|
||||
RequestConfig(request, paginate={'per_page': 32}).configure(attendance_table)
|
||||
|
||||
orders_table = get_day_orders_table(curr_date, 'orders-')
|
||||
RequestConfig(request).configure(orders_table)
|
||||
|
||||
title = 'Таблица посещаемости на %s' % curr_date.strftime('%B %Y г')
|
||||
return render(request, 'asuzr/table2.html', {
|
||||
'table1': attendance_table,
|
||||
'table2': orders_table,
|
||||
'additional_info': add_info,
|
||||
'title': title,
|
||||
'form': form})
|
||||
|
||||
@login_required
|
||||
def main(request, day, month, year):
|
||||
@@ -169,9 +191,28 @@ def main(request, day, month, year):
|
||||
@login_required
|
||||
def sketches(request, order_id):
|
||||
curr_order = Order.objects.get(pk = order_id)
|
||||
if request.method == 'POST':
|
||||
if 'sketch_file' in request.FILES:
|
||||
files = request.FILES.getlist('sketch_file')
|
||||
for f in files:
|
||||
instance = Sketch(sketch_file = f, order = curr_order)
|
||||
instance.save()
|
||||
return redirect(sketches, order_id = order_id)
|
||||
|
||||
table = SketchesTable(Sketch.objects.filter(order = curr_order))
|
||||
RequestConfig(request).configure(table)
|
||||
return render(request, 'asuzr/table.html', {'table': table, 'title': 'Эскизы заказа %s' % curr_order})
|
||||
return render(request, 'asuzr/sketches.html', {
|
||||
'order_id': order_id,
|
||||
'table': table,
|
||||
'title': 'Эскизы заказа %s' % curr_order})
|
||||
|
||||
def delete_sketch(request):
|
||||
pk = request.GET.get('pk', -1)
|
||||
sketch = get_object_or_404(Sketch, pk = pk)
|
||||
order_id = sketch.order.pk
|
||||
sketch.sketch_file.delete(save = False)
|
||||
sketch.delete()
|
||||
return redirect(sketches, order_id = order_id)
|
||||
|
||||
@login_required
|
||||
def orders(request, archive):
|
||||
@@ -226,12 +267,3 @@ def prod_plan_view(request):
|
||||
title = u'Производственный план на %s - %s' % (sdate.strftime('%d.%m.%Y'), edate.strftime('%d.%m.%Y'))
|
||||
RequestConfig(request).configure(table)
|
||||
return render(request, 'asuzr/table.html', {'table': table, 'title': title})
|
||||
|
||||
def get_date(request):
|
||||
if request.method == 'POST':
|
||||
form = DateForm(request.POST)
|
||||
if form.is_valid():
|
||||
HttpResponse("AAA")
|
||||
else:
|
||||
form = DateForm()
|
||||
return render(request, 'asuzr/date_control.html', {'form': form})
|
||||
@@ -87,8 +87,12 @@ STATIC_URL = '/static/'
|
||||
|
||||
TEMPLATE_DIRS = ('templates/')
|
||||
|
||||
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.request',)
|
||||
TEMPLATE_CONTEXT_PROCESSORS += ('django.core.context_processors.request',
|
||||
'django.core.context_processors.csrf',
|
||||
)
|
||||
|
||||
MEDIA_ROOT = 'media/'
|
||||
|
||||
MEDIA_URL = 'http://127.0.0.1:8000/media/'
|
||||
|
||||
THUMBNAIL_ENGINE = 'sorl.thumbnail.engines.convert_engine.Engine'
|
||||
|
||||
@@ -20,13 +20,13 @@ urlpatterns = patterns('',
|
||||
url(r'^desreport/$', 'asuzr.views.desreport'),
|
||||
url(r'^production_table/(?P<order_id>\d+)/$', 'asuzr.views.production_table'),
|
||||
url(r'^sketches/(?P<order_id>\d+)/$', 'asuzr.views.sketches'),
|
||||
url(r'^sketches/delete/$', 'asuzr.views.delete_sketch'),
|
||||
url(r'^prodplan/$', 'asuzr.views.prod_plan_view'),
|
||||
url(r'^admin/', include(admin.site.urls)),
|
||||
url(r'^inplaceeditform/', include('inplaceeditform.urls')),
|
||||
url(r'^accounts/login/$', login),
|
||||
url(r'^accounts/logout/$', logout),
|
||||
url(r'^jsi18n$', 'django.views.i18n.javascript_catalog', js_info_dict),
|
||||
url(r'^test/$', 'asuzr.views.get_date'),
|
||||
)
|
||||
|
||||
if settings.DEBUG:
|
||||
|
||||
@@ -30,13 +30,17 @@
|
||||
table.paleblue tr.weekend {
|
||||
background-color: #FFE4E1
|
||||
}
|
||||
.inline {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="breadcrumbs">
|
||||
{% block menu %}
|
||||
<ul id="menu" class="hr">
|
||||
<li><a href={% url 'asuzr-main' %}>Таблица посещаемости</a></li>
|
||||
<li><a href={% url 'asuzr.views.visit_view' %}>Таблица посещаемости</a></li>
|
||||
<li><a href={% url 'asuzr.views.orders' 0 %}>Таблица выхода заказов</a></li>
|
||||
<li><a href={% url 'asuzr.views.orders' 1 %}>Архивная таблица</a></li>
|
||||
<li><a href={% url 'asuzr.views.desreport' %}>Отчет по дизайнерам</a></li>
|
||||
|
||||
12
templates/asuzr/sketches.html
Normal file
12
templates/asuzr/sketches.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{% extends "asuzr/table.html" %}
|
||||
|
||||
{% block additional %}
|
||||
<div class="inline">
|
||||
<form action="/sketches/{{ order_id }}/" method="POST" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
<div>Добавить эскизы:</div>
|
||||
<input type="file" name="sketch_file" multiple />
|
||||
<input type="submit" text="Добавить эскиз">
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -3,6 +3,10 @@
|
||||
{% load render_table from django_tables2 %}
|
||||
|
||||
{% block page %}
|
||||
{% block table %}
|
||||
{% render_table table %}
|
||||
{% endblock %}
|
||||
{% block additional %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
24
templates/asuzr/table2.html
Normal file
24
templates/asuzr/table2.html
Normal file
@@ -0,0 +1,24 @@
|
||||
{% extends "asuzr/base.html" %}
|
||||
{% load inplace_edit %}
|
||||
{% load render_table from django_tables2 %}
|
||||
|
||||
{% block page %}
|
||||
<div class="inline"><div><h3>{{ table1.verbose_name }}</h3></div>{% render_table table1 %}</div>
|
||||
<div class="inline"><div><h3>{{ table2.verbose_name }}</h3></div>{% render_table table2 %}</div>
|
||||
{% if additional_info %}
|
||||
<div>
|
||||
<hr>
|
||||
<div>
|
||||
<h3>{{ additional_info.title }}</h3>
|
||||
</div>
|
||||
<div class="table-container">
|
||||
<table class="paleblue">
|
||||
{% for row in additional_info.rows %}
|
||||
<tr><td>{{ row.title }}</td><td>{{ row.value }}</td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
15
templates/asuzr/totals_table.html
Normal file
15
templates/asuzr/totals_table.html
Normal file
@@ -0,0 +1,15 @@
|
||||
{% extends "django_tables2/table.html" %}
|
||||
{% load django_tables2 %}
|
||||
{% load i18n %}
|
||||
{% block table.tfoot %}
|
||||
<tfoot>
|
||||
{% if table.summary %}
|
||||
<tr>
|
||||
{% for summary in table.summary %}
|
||||
<td> {{ summary }} </td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
</tfoot>
|
||||
{% endblock table.tfoot %}
|
||||
|
||||
@@ -1,29 +1,7 @@
|
||||
{% spaceless %}
|
||||
{% extends "asuzr/totals_table.html" %}
|
||||
{% load django_tables2 %}
|
||||
{% load i18n %}
|
||||
{% if table.page %}
|
||||
<div class="table-container">
|
||||
{% endif %}
|
||||
{% block table %}
|
||||
<table{% if table.attrs %} {{ table.attrs.as_html }}{% endif %}>
|
||||
{% nospaceless %}
|
||||
{% block table.thead %}
|
||||
<thead>
|
||||
<tr>
|
||||
{% for column in table.columns %}
|
||||
{% if column.orderable %}
|
||||
<th {{ column.attrs.th.as_html }}><a href="{% querystring table.prefixed_order_by_field=column.order_by_alias.next %}">{{ column.header }}</a></th>
|
||||
{% else %}
|
||||
<th {{ column.attrs.th.as_html }}>{{ column.header }}</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
{% endblock table.thead %}
|
||||
{% block table.tbody %}
|
||||
<tbody>
|
||||
{% for row in table.page.object_list|default:table.rows %} {# support pagination #}
|
||||
{% block table.tbody.row %}
|
||||
{% block table.tbody.row %}
|
||||
<tr class="
|
||||
{% if row.date.is_weekend %}weekend{% else %}
|
||||
{{ forloop.counter|divisibleby:2|yesno:"even,odd" }}{% endif %}
|
||||
@@ -32,29 +10,5 @@
|
||||
<td {{ column.attrs.td.as_html }}>{% if column.localize == None %}{{ cell }}{% else %}{% if column.localize %}{{ cell|localize }}{% else %}{{ cell|unlocalize }}{% endif %}{% endif %}</td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endblock table.tbody.row %}
|
||||
{% empty %}
|
||||
{% if table.empty_text %}
|
||||
{% block table.tbody.empty_text %}
|
||||
<tr><td colspan="{{ table.columns|length }}">{{ table.empty_text }}</td></tr>
|
||||
{% endblock table.tbody.empty_text %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
{% endblock table.tbody %}
|
||||
{% block table.tfoot %}
|
||||
<tfoot>
|
||||
{% if table.summary %}
|
||||
<tr>
|
||||
{% for summary in table.summary %}
|
||||
<td> {{ summary }} </td>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
</tfoot>
|
||||
{% endblock table.tfoot %}
|
||||
{% endnospaceless %}
|
||||
</table>
|
||||
{% endblock table %}
|
||||
{% endblock table.tbody.row %}
|
||||
|
||||
{% endspaceless %}
|
||||
|
||||
Reference in New Issue
Block a user