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; + }