瀏覽代碼

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

Anastasia 10 年之前
父節點
當前提交
5746ae2024

+ 5 - 1
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):

+ 45 - 14
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'<a href="%s?pk=%s">Удалить</a>' % 
+                           (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'}
+    attrs = {'class': 'paleblue'}

+ 77 - 45
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})

+ 5 - 1
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'

+ 1 - 1
record/urls.py

@@ -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:

+ 5 - 1
templates/asuzr/base.html

@@ -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 - 0
templates/asuzr/sketches.html

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

+ 5 - 1
templates/asuzr/table.html

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

+ 24 - 0
templates/asuzr/table2.html

@@ -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 - 0
templates/asuzr/totals_table.html

@@ -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 %}
+

+ 10 - 56
templates/asuzr/weekend_table.html

@@ -1,60 +1,14 @@
-{% 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 %}
-          <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>
+{% 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>
-    {% endif %}
-    </tfoot>
-    {% endblock table.tfoot %}
-    {% endnospaceless %}
-</table>
-{% endblock table %}
+    </tr>
+{% endblock table.tbody.row %}
 
-{% endspaceless %}