Исправлены конфликты

This commit is contained in:
Anastasia
2015-06-19 09:11:49 +05:00
11 changed files with 204 additions and 120 deletions

View File

@@ -105,7 +105,11 @@ class Order(models.Model):
#Эскизы #Эскизы
class Sketch(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 заказа order = models.ForeignKey(Order) #id заказа
def __unicode__(self): def __unicode__(self):

View File

@@ -17,12 +17,12 @@ class EditableColumn(tables.TemplateColumn):
main_part = '' main_part = ''
if object_name == '': if object_name == '':
main_part = ''' main_part = '''
{{% inplace_edit "record.{field}" auto_height = 1 %}} {{% inplace_edit "record.{field}" auto_height = 1, auto_width = 1 %}}
''' '''
else: else:
main_part = ''' main_part = '''
{{% if record.{object_name} %}} {{% 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 %}} {{% endif %}}
''' '''
template = template.format(main_part = main_part) template = template.format(main_part = main_part)
@@ -43,7 +43,7 @@ class ThumbnailColumn(tables.TemplateColumn):
class OrdersTable(tables.Table): class OrdersTable(tables.Table):
date = tables.DateColumn('d/m/Y', verbose_name = 'Дата') 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 = 'Наименование') product = tables.Column(verbose_name = 'Наименование')
delivery = EditableColumn('delivery', verbose_name = 'Доставка') delivery = EditableColumn('delivery', verbose_name = 'Доставка')
lifting = EditableColumn('lifting', 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')]) sketch = tables.LinkColumn('asuzr.views.sketches', verbose_name = 'Эскизы', args=[tables.utils.A('pk')])
executor = EditableColumn('executor', verbose_name = 'Исполнитель') executor = EditableColumn('executor', verbose_name = 'Исполнитель')
is_done = EditableColumn('is_done', 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): def render_price(self, value):
return '%0.1f' % value return '%0.2f' % value
def render_ostatok(self, value): def render_ostatok(self, value):
return '%0.1f' % value return '%0.2f' % value
class Meta: class Meta:
model = Order model = Order
@@ -84,6 +78,7 @@ class OrdersTable(tables.Table):
'sketch', 'sketch',
'executor', 'executor',
'is_done',) 'is_done',)
exclude = ('id', 'calls', 'contact', 'phone_num', 'cancelled', 'designer', )
class ArchiveOrdersTable(OrdersTable): class ArchiveOrdersTable(OrdersTable):
calls = EditableColumn('calls', verbose_name = 'Обзвон') calls = EditableColumn('calls', verbose_name = 'Обзвон')
@@ -112,6 +107,11 @@ class DesignerTable(tables.Table):
class SketchesTable(tables.Table): class SketchesTable(tables.Table):
sketch_file = tables.FileColumn(verbose_name = 'Имя файла') sketch_file = tables.FileColumn(verbose_name = 'Имя файла')
sketch_image = ThumbnailColumn('sketch_file', verbose_name = 'Эскиз', orderable = False) 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: class Meta:
attrs = {'class': 'paleblue'} attrs = {'class': 'paleblue'}
@@ -128,8 +128,8 @@ class VisitTable(tables.Table):
summary = ['Итого:','',0,0,0,0,''] summary = ['Итого:','',0,0,0,0,'']
def set_summaries(self, summaries): def set_summaries(self, summaries):
indexes = {'calls': 2, 'visits': 3, 'orders': 4, 'cost': 5} indexes = {'calls': 2, 'visits': 3, 'orders': 4, 'cost': 5}
for s in summaries: for s in summaries:
idx = indexes[s] idx = indexes[s]
self.summary[idx] = summaries[s] self.summary[idx] = summaries[s]
@@ -145,6 +145,37 @@ class VisitTable(tables.Table):
attrs = {'class': 'paleblue'} attrs = {'class': 'paleblue'}
orderable = False orderable = False
template = 'asuzr/weekend_table.html' 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): class ProdPlanTable(tables.Table):
date = tables.Column(verbose_name = 'Дата') date = tables.Column(verbose_name = 'Дата')
@@ -154,4 +185,4 @@ class ProdPlanTable(tables.Table):
action = EditableColumn('action', 'prodplan', verbose_name = 'Действие') action = EditableColumn('action', 'prodplan', verbose_name = 'Действие')
class Meta: class Meta:
attrs = {'class': 'paleblue'} attrs = {'class': 'paleblue'}

View File

@@ -1,21 +1,16 @@
# -*- coding: utf-8 -*- # -*- 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.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext, Context, loader from django.template import RequestContext, Context, loader
from asuzr.models import Product from asuzr.models import *
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 datetime import datetime, date, timedelta from datetime import datetime, date, timedelta
import calendar import calendar
from django.db.models import Count, Sum from django.db.models import Count, Sum
from asuzr.common import custom_date from asuzr.common import custom_date
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from tables import * from asuzr.tables import *
from forms import * from asuzr.forms import *
from django_tables2 import RequestConfig from django_tables2 import RequestConfig
@login_required @login_required
@@ -44,17 +39,13 @@ def get_orders_by_date(dt):
order_list = Order.objects.filter(date=dt).order_by('id') order_list = Order.objects.filter(date=dt).order_by('id')
return order_list return order_list
@login_required def get_attendance_table(year, month, prefix):
def visit_view(request): day_in_month = calendar.monthrange(year,month)[1]
curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y') sdate = date(year,month,1)
form = DateForm(request.GET, initial = {'date': curr_date}) 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_list = Attendance.objects.filter(date__range = (sdate,edate))
attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits')) attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits'))
for attend in attend_list: for attend in attend_list:
@@ -76,25 +67,56 @@ def visit_view(request):
month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer) month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer)
else: else:
month_days[day]['designer'] = designer month_days[day]['designer'] = designer
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 = VisitTable(month_days.values())
RequestConfig(request, paginate={'per_page': 32}).configure(table)
table.set_summaries({ table.set_summaries({
'calls': attend_sum['calls__sum'], 'calls': attend_sum['calls__sum'] or 0,
'visits': attend_sum['visits__sum'], 'visits': attend_sum['visits__sum'] or 0,
'orders': order_sum['product__count'], 'orders': order_sum['product__count'] or 0,
'cost': order_sum['price__sum'], 'cost': order_sum['price__sum'] or 0,
}) })
title = 'Таблица посещаемости на %s г.' % curr_date.strftime('%B %Y')
return table, additional_info
if request.method == 'POST':
form = DateForm(request.POST) def get_day_orders_table(date, prefix):
if form.is_valid(): orders = Order.objects.filter(date = date)
print form.cleaned_data orders_price = orders.aggregate(Sum('price'))
else: table = DayOrdersTable(orders, prefix = prefix)
form = DateForm() table.verbose_name = 'Заказы на %s' % date.strftime('%d %B %Y г')
table.set_summary(orders_price['price__sum'] or 0)
return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'form': form})
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 @login_required
def main(request, day, month, year): def main(request, day, month, year):
@@ -169,9 +191,28 @@ def main(request, day, month, year):
@login_required @login_required
def sketches(request, order_id): def sketches(request, order_id):
curr_order = Order.objects.get(pk = 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)) table = SketchesTable(Sketch.objects.filter(order = curr_order))
RequestConfig(request).configure(table) 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 @login_required
def orders(request, archive): 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')) title = u'Производственный план на %s - %s' % (sdate.strftime('%d.%m.%Y'), edate.strftime('%d.%m.%Y'))
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render(request, 'asuzr/table.html', {'table': table, 'title': title}) 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})

View File

@@ -87,8 +87,12 @@ STATIC_URL = '/static/'
TEMPLATE_DIRS = ('templates/') 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_ROOT = 'media/'
MEDIA_URL = 'http://127.0.0.1:8000/media/' MEDIA_URL = 'http://127.0.0.1:8000/media/'
THUMBNAIL_ENGINE = 'sorl.thumbnail.engines.convert_engine.Engine'

View File

@@ -20,13 +20,13 @@ urlpatterns = patterns('',
url(r'^desreport/$', 'asuzr.views.desreport'), url(r'^desreport/$', 'asuzr.views.desreport'),
url(r'^production_table/(?P<order_id>\d+)/$', 'asuzr.views.production_table'), 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/(?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'^prodplan/$', 'asuzr.views.prod_plan_view'),
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'^inplaceeditform/', include('inplaceeditform.urls')), url(r'^inplaceeditform/', include('inplaceeditform.urls')),
url(r'^accounts/login/$', login), url(r'^accounts/login/$', login),
url(r'^accounts/logout/$', logout), url(r'^accounts/logout/$', logout),
url(r'^jsi18n$', 'django.views.i18n.javascript_catalog', js_info_dict), url(r'^jsi18n$', 'django.views.i18n.javascript_catalog', js_info_dict),
url(r'^test/$', 'asuzr.views.get_date'),
) )
if settings.DEBUG: if settings.DEBUG:

View File

@@ -30,13 +30,17 @@
table.paleblue tr.weekend { table.paleblue tr.weekend {
background-color: #FFE4E1 background-color: #FFE4E1
} }
.inline {
display: inline-block;
vertical-align: top;
}
</style> </style>
</head> </head>
<body> <body>
<div class="breadcrumbs"> <div class="breadcrumbs">
{% block menu %} {% block menu %}
<ul id="menu" class="hr"> <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' 0 %}>Таблица выхода заказов</a></li>
<li><a href={% url 'asuzr.views.orders' 1 %}>Архивная таблица</a></li> <li><a href={% url 'asuzr.views.orders' 1 %}>Архивная таблица</a></li>
<li><a href={% url 'asuzr.views.desreport' %}>Отчет по дизайнерам</a></li> <li><a href={% url 'asuzr.views.desreport' %}>Отчет по дизайнерам</a></li>

View 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 %}

View File

@@ -3,6 +3,10 @@
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block page %} {% block page %}
{% render_table table %} {% block table %}
{% render_table table %}
{% endblock %}
{% block additional %}
{% endblock %}
{% endblock %} {% endblock %}

View 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 %}

View 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 %}

View File

@@ -1,60 +1,14 @@
{% spaceless %} {% extends "asuzr/totals_table.html" %}
{% load django_tables2 %} {% load django_tables2 %}
{% load i18n %} {% load i18n %}
{% if table.page %} {% block table.tbody.row %}
<div class="table-container"> <tr class="
{% endif %} {% if row.date.is_weekend %}weekend{% else %}
{% block table %} {{ forloop.counter|divisibleby:2|yesno:"even,odd" }}{% endif %}
<table{% if table.attrs %} {{ table.attrs.as_html }}{% endif %}> "> {# avoid cycle for Django 1.2-1.6 compatibility #}
{% nospaceless %} {% for column, cell in row.items %}
{% block table.thead %} <td {{ column.attrs.td.as_html }}>{% if column.localize == None %}{{ cell }}{% else %}{% if column.localize %}{{ cell|localize }}{% else %}{{ cell|unlocalize }}{% endif %}{% endif %}</td>
<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 %}
<tr class="
{% if row.date.is_weekend %}weekend{% else %}
{{ forloop.counter|divisibleby:2|yesno:"even,odd" }}{% endif %}
"> {# avoid cycle for Django 1.2-1.6 compatibility #}
{% for column, cell in row.items %}
<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 %} {% endfor %}
</tr> </tr>
{% endif %} {% endblock table.tbody.row %}
</tfoot>
{% endblock table.tfoot %}
{% endnospaceless %}
</table>
{% endblock table %}
{% endspaceless %}