views.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. # -*- coding: utf-8 -*-
  2. from django.shortcuts import render, redirect, get_object_or_404
  3. from django.http import HttpResponse, HttpResponseRedirect
  4. from django.template import RequestContext, Context, loader
  5. from django.contrib.admin.models import LogEntry
  6. from asuzr.models import *
  7. from datetime import datetime, date, timedelta
  8. from django.utils import dateformat
  9. import calendar
  10. from django.db.models import Count, Sum
  11. from asuzr.common import *
  12. from django.contrib.auth.decorators import login_required
  13. from asuzr.tables import *
  14. from asuzr.forms import *
  15. from django_tables2 import RequestConfig
  16. from inplaceeditform.commons import get_admin_static_url
  17. @login_required
  18. def prod_list(request):
  19. product_list = Product.objects.all()
  20. t = loader.get_template('asuzr/prod_list.html')
  21. c = Context({
  22. 'product_list': product_list,
  23. })
  24. return HttpResponse(t.render(c))
  25. @login_required
  26. def prod_detail(request, prod_id):
  27. return HttpResponse("This is %s" % prod_id)
  28. def get_filtered_list(p_list, year, month):
  29. filtered_list=[]
  30. for a in p_list:
  31. a_date = a.date
  32. if a_date.strftime('%m/%Y').lstrip('0') == '/'.join((month,year)).lstrip('0'):
  33. filtered_list.append(a)
  34. return filtered_list
  35. def get_orders_by_date(dt):
  36. order_list = Order.objects.filter(date=dt).order_by('id')
  37. return order_list
  38. def get_attendance_table(year, month, prefix):
  39. day_in_month = calendar.monthrange(year,month)[1]
  40. sdate = date(year,month,1)
  41. edate = date(year,month,day_in_month)
  42. month_days = {i+1: {'date': custom_date(year,month,i+1)} for i in range(day_in_month)}
  43. attend_list = Attendance.objects.filter(date__range = (sdate,edate))
  44. attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits'))
  45. for attend in attend_list:
  46. month_days[attend.date.day]['attend'] = attend
  47. order_list = Order.objects.filter(date__range = (sdate,edate))
  48. order_sum = order_list.aggregate(Count('product'), Sum('price'))
  49. order_list = order_list.values('date')
  50. order_list = order_list.annotate(Count('product'), Sum('price'))
  51. for order in order_list:
  52. month_days[order['date'].day]['order'] = order
  53. schedule = Schedule.objects.filter(date__range = (sdate,edate))
  54. for designer in schedule:
  55. day = designer.date.day
  56. if 'designer' in month_days[day]:
  57. month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer)
  58. else:
  59. month_days[day]['designer'] = designer
  60. month_plan = OrderPlan.objects.filter(date = sdate).first()
  61. month_plan = 0 if month_plan == None else month_plan.plan
  62. month_balance = month_plan - (order_sum['price__sum'] or 0)
  63. additional_info = {'title': 'Справочно',
  64. 'rows': [
  65. {'title': 'ПЛАН', 'value': month_plan},
  66. {'title': 'Осталось до выполнения', 'value': month_balance},
  67. ]
  68. }
  69. table = VisitTable(month_days.values(), prefix = prefix)
  70. table.verbose_name = 'Сводная информация'
  71. table.set_summaries({
  72. 'calls': attend_sum['calls__sum'] or 0,
  73. 'visits': attend_sum['visits__sum'] or 0,
  74. 'orders': order_sum['product__count'] or 0,
  75. 'cost': order_sum['price__sum'] or 0,
  76. })
  77. return table, additional_info
  78. def get_day_orders_table(date, prefix):
  79. orders = Order.objects.filter(date = date)
  80. summaries = orders.aggregate(Sum('price'), Sum('paid'))
  81. table = DayOrdersTable(orders, prefix = prefix)
  82. table.verbose_name = u'Заказы на %s' % dateformat.format(date, 'd E Y')
  83. table.set_summary(summaries['price__sum'] or 0, summaries['paid__sum'] or 0)
  84. return table
  85. def create_attendance_if_need(date):
  86. attendance, created = Attendance.objects.get_or_create(date = date,
  87. defaults={'calls': 0, 'visits': 0})
  88. if created:
  89. attendance.save()
  90. @log_view_call
  91. @login_required
  92. def visit_view(request):
  93. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  94. form = DateForm({'date':curr_date})
  95. create_attendance_if_need(curr_date)
  96. attendance_table, add_info = get_attendance_table(curr_date.year, curr_date.month, 'attendance-')
  97. RequestConfig(request, paginate={'per_page': 32}).configure(attendance_table)
  98. orders_table = get_day_orders_table(curr_date, 'orders-')
  99. RequestConfig(request).configure(orders_table)
  100. order_form = OrderForm(initial = {'designer': request.user})
  101. request.ADMIN_MEDIA_PREFIX = get_admin_static_url()
  102. title = u'Таблица посещаемости на %s' % dateformat.format(curr_date, 'F Y')
  103. return render(request, 'asuzr/table2.html', {
  104. 'table1': attendance_table,
  105. 'table2': orders_table,
  106. 'additional_info': add_info,
  107. 'title': title,
  108. 'dateform': form,
  109. 'add_form': order_form,
  110. 'form_action': 'add-order'
  111. })
  112. @log_view_call
  113. @login_required
  114. def sketches(request, order_id):
  115. curr_order = Order.objects.get(pk = order_id)
  116. if request.method == 'POST':
  117. if 'sketch_file' in request.FILES:
  118. files = request.FILES.getlist('sketch_file')
  119. for f in files:
  120. instance = Sketch(sketch_file = f, order = curr_order)
  121. instance.save()
  122. return redirect(sketches, order_id = order_id)
  123. sketch_list = Sketch.objects.filter(order = curr_order)
  124. return render(request, 'asuzr/sketches.html', {
  125. 'order_id': order_id,
  126. 'sketch_list': sketch_list,
  127. 'title': u'Эскизы заказа %s' % curr_order})
  128. def add_order(request):
  129. new_order = Order(date=date.today())
  130. form = OrderForm(request.POST, instance = new_order)
  131. if form.is_valid():
  132. form.save()
  133. return redirect(visit_view)
  134. def delete_sketch(request):
  135. pk = request.GET.get('pk', -1)
  136. sketch = get_object_or_404(Sketch, pk = pk)
  137. order_id = sketch.order.pk
  138. sketch.delete()
  139. return redirect(sketches, order_id = order_id)
  140. @log_view_call
  141. @login_required
  142. def orders(request, archive):
  143. is_archive = (archive == '1')
  144. Table = ArchiveOrdersTable if is_archive else OrdersTable
  145. table = Table(Order.objects.filter(is_done = is_archive))
  146. title = u'Архивная таблица заказов' if is_archive else u'Таблица выхода заказов'
  147. RequestConfig(request).configure(table)
  148. request.ADMIN_MEDIA_PREFIX = get_admin_static_url()
  149. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  150. @log_view_call
  151. @login_required
  152. def desreport(request):
  153. start_date = request.GET.get('sdate', date.today().strftime('%d.%m.%Y'))
  154. sdate = datetime.strptime(start_date, '%d.%m.%Y')
  155. end_date = request.GET.get('edate', date.today().strftime('%d.%m.%Y'))
  156. edate = datetime.strptime(end_date, '%d.%m.%Y')
  157. Table = DesignerTable
  158. table = Table(Order.objects.filter(cancelled=False, date__range=(sdate,edate)).values('designer__first_name','designer__last_name').annotate(Sum('price'),Count('designer')))
  159. title = u'Отчет по дизайнерам за '+' - '.join((start_date, end_date))
  160. form = DiapDateForm({'sdate': sdate, 'edate': edate})
  161. RequestConfig(request).configure(table)
  162. request.ADMIN_MEDIA_PREFIX = get_admin_static_url()
  163. return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'dateform': form})
  164. @log_view_call
  165. @login_required
  166. def production_table(request, order_id):
  167. order_costs = OrderCosts.objects.filter(order=order_id)
  168. table = ProductionTable(order_costs)
  169. curr_order = Order.objects.get(pk = order_id)
  170. title = u'Производственная таблица'
  171. table.verbose_name = u'Заказ: %s' % (', '.join((curr_order.product.name, curr_order.address)))
  172. table.verbose_name2 = u'Стоимость: %s' % str(curr_order.price)
  173. costs_sum = order_costs.aggregate(Sum('value'))
  174. table.set_summary(costs_sum['value__sum'] or 0)
  175. table.set_balance(curr_order.price - (costs_sum['value__sum'] or 0))
  176. form = ProdTableForm()
  177. RequestConfig(request).configure(table)
  178. return render(request, 'asuzr/table.html',
  179. {'table': table, 'title': title, 'add_form': form, 'form_action': 'add-cost-items', 'params': order_id})
  180. def production_table_add_item(request, order_id):
  181. curr_order = Order.objects.get(pk = order_id)
  182. new_item = OrderCosts(order=curr_order)
  183. form = ProdTableForm(request.POST, instance = new_item)
  184. form.save()
  185. return redirect(production_table, order_id = order_id)
  186. @log_view_call
  187. @login_required
  188. def prod_plan_view(request):
  189. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  190. y,m,d = curr_date.year, curr_date.month, curr_date.day
  191. wd = curr_date.weekday()
  192. sdate = curr_date - timedelta(days = wd)
  193. edate = curr_date + timedelta(days = 6-wd)
  194. days = [sdate + timedelta(days=i) for i in range(0,7)]
  195. week_days = {i.weekday(): {'date': custom_date(i.year,i.month,i.day)} for i in days}
  196. prodplan_list = ProdPlan.objects.filter(start_date__range = (sdate,edate))
  197. tables = []
  198. for week_day in week_days:
  199. tdate = week_days[week_day]['date']
  200. prodplan_list = ProdPlan.objects.filter(start_date = tdate)
  201. tables.append(ProdPlanTable(prodplan_list))
  202. tables[week_day].verbose_name = ', '.join((tdate.strftime('%d.%m.%Y'), tdate.weekday_name))
  203. title = u'Производственный план на %s - %s' % (sdate.strftime('%d.%m.%Y'), edate.strftime('%d.%m.%Y'))
  204. date_form = DateForm({'date':curr_date})
  205. add_form = ProdPlanForm()
  206. request.ADMIN_MEDIA_PREFIX = get_admin_static_url()
  207. for table in tables:
  208. RequestConfig(request).configure(table)
  209. return render(request, 'asuzr/table_n.html', {'tables': tables, 'title': title, 'dateform': date_form, 'add_form': add_form, 'form_action' : 'add-plan-item'})
  210. def prod_plan_add_item(request):
  211. return redirect(prod_plan_view)
  212. def create_plan_item_if_need(date):
  213. plan_item, created = ProdPlan.objects.get_or_create(start_date = date,
  214. defaults={'end_date': date})
  215. if created:
  216. plan_item.save()
  217. @login_required
  218. def log_view(request):
  219. log = LogEntry.objects.all()
  220. table = LogTable(log)
  221. RequestConfig(request).configure(table)
  222. return render(request, 'asuzr/table.html', {'table': table, 'title': 'Журнал операций'})