views.py 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. # -*- coding: utf-8 -*-
  2. from django.shortcuts import render
  3. from django.http import HttpResponse
  4. from django.template import RequestContext, Context, loader
  5. from asuzr.models import Product
  6. from asuzr.models import Attendance
  7. from asuzr.models import Order
  8. from asuzr.models import OrderPlan
  9. from asuzr.models import Schedule
  10. from datetime import datetime, date, timedelta
  11. import calendar
  12. from django.db.models import Count, Sum
  13. from asuzr.common import custom_date
  14. from django.contrib.auth.decorators import login_required
  15. from tables import *
  16. from django_tables2 import RequestConfig
  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. table = VisitTable(month_days.values(), prefix = prefix)
  61. table.verbose_name = 'Сводная информация'
  62. table.set_summaries({
  63. 'calls': attend_sum['calls__sum'],
  64. 'visits': attend_sum['visits__sum'],
  65. 'orders': order_sum['product__count'],
  66. 'cost': order_sum['price__sum'],
  67. })
  68. return table
  69. def get_day_orders_table(date, prefix):
  70. orders = Order.objects.filter(date = date)
  71. orders_price = orders.aggregate(Sum('price'))
  72. table = DayOrdersTable(orders, prefix = prefix)
  73. table.verbose_name = 'Заказы на %s' % date.strftime('%d %B %Y г')
  74. table.set_summary(orders_price['price__sum'])
  75. return table
  76. @login_required
  77. def visit_view(request):
  78. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  79. attendance_table = get_attendance_table(curr_date.year, curr_date.month, 'attendance-')
  80. RequestConfig(request, paginate={'per_page': 32}).configure(attendance_table)
  81. orders_table = get_day_orders_table(curr_date, 'orders-')
  82. RequestConfig(request).configure(orders_table)
  83. title = 'Таблица посещаемости на %s' % curr_date.strftime('%B %Y г')
  84. return render(request, 'asuzr/table3.html', {
  85. 'table1': attendance_table,
  86. 'table2': orders_table,
  87. 'table3': attendance_table,
  88. 'title': title})
  89. @login_required
  90. def main(request, day, month, year):
  91. d,m,y=int(day),int(month), int(year)
  92. attend_list = Attendance.objects.all().order_by('date')
  93. filtered_attend_list=get_filtered_list(attend_list, year, month)
  94. p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y')
  95. order_list = Order.objects.filter(date=p_date).order_by('id')
  96. month_order_list=Order.objects.filter(date__range=(date(y,m,1),date(y,m,calendar.monthrange(y,m)[1]))).values('date').annotate(Count('product'),Sum('price'))
  97. plan = OrderPlan.objects.all()
  98. filtered_plan = get_filtered_list(plan, year, month)
  99. month_plan=0
  100. if len(filtered_plan) > 0:
  101. month_plan=filtered_plan[0].plan
  102. schedule = Schedule.objects.all().order_by('date')
  103. filtered_schedule = get_filtered_list(schedule, year, month)
  104. month_days={i: {'date': custom_date(int(year),int(month),i)} for i in range(1,calendar.monthrange(int(year),int(month))[1]+1)}
  105. for l in filtered_attend_list:
  106. month_days[l.date.day]['attend']=l
  107. for s in filtered_schedule:
  108. if 'designers' in month_days[s.date.day]:
  109. des=', '.join((month_days[s.date.day]['designers'], ' '.join((s.designer.first_name, s.designer.last_name))))
  110. month_days[s.date.day]['designers'] = des
  111. else:
  112. month_days[s.date.day]['designers'] = ' '.join((s.designer.first_name, s.designer.last_name))
  113. for order in month_order_list:
  114. month_days[order['date'].day]['orders_count'] = order['product__count']
  115. month_days[order['date'].day]['orders_price'] = order['price__sum']
  116. month_days_values = month_days.values()
  117. sum_calls = sum(l.calls for l in filtered_attend_list)
  118. sum_visits = sum(l.visits for l in filtered_attend_list)
  119. sum_orders = sum(l['orders_count'] for l in month_days_values if 'orders_count' in l)
  120. sum_price = sum(l['orders_price'] for l in month_days_values if 'orders_price' in l)
  121. sum_order_price = sum(l.price for l in order_list)
  122. plan_balance = month_plan-sum_price
  123. d_date = p_date.strftime("%d/%m/%Y")
  124. t = loader.get_template('asuzr/attend_order.html')
  125. c = RequestContext(request,{
  126. 'attend_list': month_days_values,
  127. 'order_list': order_list,
  128. 'sum_calls': sum_calls,
  129. 'sum_visits': sum_visits,
  130. 'sum_orders': sum_orders,
  131. 'sum_price': sum_price,
  132. 'sum_order_price': sum_order_price,
  133. 'plan': month_plan,
  134. 'balance': plan_balance,
  135. 'd_date': d_date,
  136. })
  137. return HttpResponse(t.render(c))
  138. @login_required
  139. def sketches(request, order_id):
  140. curr_order = Order.objects.get(pk = order_id)
  141. table = SketchesTable(Sketch.objects.filter(order = curr_order))
  142. RequestConfig(request).configure(table)
  143. return render(request, 'asuzr/table.html', {'table': table, 'title': 'Эскизы заказа %s' % curr_order})
  144. @login_required
  145. def orders(request, archive):
  146. is_archive = (archive == '1')
  147. Table = ArchiveOrdersTable if is_archive else OrdersTable
  148. table = Table(Order.objects.filter(is_done = is_archive))
  149. title = 'Архивная таблица заказов' if is_archive else 'Таблица выхода заказов'
  150. RequestConfig(request).configure(table)
  151. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  152. @login_required
  153. def desreport(request):
  154. start_date = request.GET.get('sdate', date.today().strftime('%d.%m.%y'))
  155. sdate = datetime.strptime(start_date, '%d.%m.%y')
  156. end_date = request.GET.get('edate', date.today().strftime('%d.%m.%y'))
  157. edate = datetime.strptime(end_date, '%d.%m.%y')
  158. Table = DesignerTable
  159. table = Table(Order.objects.filter(cancelled=False, date__range=(sdate,edate)).values('designer__first_name','designer__last_name').annotate(Sum('price'),Count('designer')))
  160. title = 'Отчет по дизайнерам за '+' - '.join((start_date, end_date))
  161. RequestConfig(request).configure(table)
  162. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  163. @login_required
  164. def production_table(request, order_id):
  165. order_list = Order.objects.filter(is_done=False).order_by('-id')
  166. sel_order = Order.objects.filter(id=order_id)
  167. cost_items = sel_order.values('cost_items')
  168. t=loader.get_template('asuzr/order_costs.html')
  169. c=RequestContext(request,{
  170. 'order_list' : order_list,
  171. 'sel_order' : sel_order,
  172. 'cost_items' : cost_items,
  173. })
  174. return HttpResponse(t.render(c))