diff --git a/asuzr/models.py b/asuzr/models.py
index 900078b..8f571ea 100644
--- a/asuzr/models.py
+++ b/asuzr/models.py
@@ -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):
diff --git a/asuzr/tables.py b/asuzr/tables.py
index 61bbcbb..f1dd9f4 100644
--- a/asuzr/tables.py
+++ b/asuzr/tables.py
@@ -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'Удалить' %
+ (reverse('asuzr.views.delete_sketch'), escape(record.id)))
class Meta:
attrs = {'class': 'paleblue'}
@@ -128,8 +128,8 @@ class VisitTable(tables.Table):
summary = ['Итого:','',0,0,0,0,'']
def set_summaries(self, summaries):
- indexes = {'calls': 2, 'visits': 3, 'orders': 4, 'cost': 5}
- for s in summaries:
+ indexes = {'calls': 2, 'visits': 3, 'orders': 4, 'cost': 5}
+ for s in summaries:
idx = indexes[s]
self.summary[idx] = summaries[s]
@@ -145,6 +145,37 @@ class VisitTable(tables.Table):
attrs = {'class': 'paleblue'}
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 = 'Дата')
@@ -154,4 +185,4 @@ class ProdPlanTable(tables.Table):
action = EditableColumn('action', 'prodplan', verbose_name = 'Действие')
class Meta:
- attrs = {'class': 'paleblue'}
\ No newline at end of file
+ attrs = {'class': 'paleblue'}
diff --git a/asuzr/views.py b/asuzr/views.py
index 67d9b73..2021c5e 100644
--- a/asuzr/views.py
+++ b/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,17 +39,13 @@ 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})
-
- 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)
+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)
+ 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'))
for attend in attend_list:
@@ -76,25 +67,56 @@ def visit_view(request):
month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer)
else:
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({
- '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 render(request, 'asuzr/table.html', {'table': table, 'title': title, 'form': form})
+
+ return table, additional_info
+
+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})
\ No newline at end of file
diff --git a/record/settings.py b/record/settings.py
index f0d872e..f881ad9 100644
--- a/record/settings.py
+++ b/record/settings.py
@@ -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'
diff --git a/record/urls.py b/record/urls.py
index 42709cb..390c34f 100644
--- a/record/urls.py
+++ b/record/urls.py
@@ -20,13 +20,13 @@ urlpatterns = patterns('',
url(r'^desreport/$', 'asuzr.views.desreport'),
url(r'^production_table/(?P\d+)/$', 'asuzr.views.production_table'),
url(r'^sketches/(?P\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:
diff --git a/templates/asuzr/base.html b/templates/asuzr/base.html
index 2cd8226..8c76b19 100644
--- a/templates/asuzr/base.html
+++ b/templates/asuzr/base.html
@@ -30,13 +30,17 @@
table.paleblue tr.weekend {
background-color: #FFE4E1
}
+ .inline {
+ display: inline-block;
+ vertical-align: top;
+ }
{% block menu %}