views.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. # -*- coding: utf-8 -*-
  2. from django.shortcuts import render
  3. from django.http import HttpResponse, HttpResponseRedirect
  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 asuzr.models import ProdPlan
  11. from datetime import datetime, date, timedelta
  12. import calendar
  13. from django.db.models import Count, Sum
  14. from asuzr.common import custom_date
  15. from django.contrib.auth.decorators import login_required
  16. from tables import *
  17. from forms import *
  18. from django_tables2 import RequestConfig
  19. @login_required
  20. def prod_list(request):
  21. product_list = Product.objects.all()
  22. t = loader.get_template('asuzr/prod_list.html')
  23. c = Context({
  24. 'product_list': product_list,
  25. })
  26. return HttpResponse(t.render(c))
  27. @login_required
  28. def prod_detail(request, prod_id):
  29. return HttpResponse("This is %s" % prod_id)
  30. def get_filtered_list(p_list, year, month):
  31. filtered_list=[]
  32. for a in p_list:
  33. a_date = a.date
  34. if a_date.strftime('%m/%Y').lstrip('0') == '/'.join((month,year)).lstrip('0'):
  35. filtered_list.append(a)
  36. return filtered_list
  37. def get_orders_by_date(dt):
  38. order_list = Order.objects.filter(date=dt).order_by('id')
  39. return order_list
  40. @login_required
  41. def visit_view(request):
  42. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  43. form = DateForm(request.GET, initial = {'date': curr_date})
  44. y,m = curr_date.year, curr_date.month
  45. day_in_month = calendar.monthrange(y,m)[1]
  46. month_days = {i+1: {'date': custom_date(y,m,i+1)} for i in range(day_in_month)}
  47. sdate = date(y,m,1)
  48. edate = date(y,m,day_in_month)
  49. attend_list = Attendance.objects.filter(date__range = (sdate,edate))
  50. attend_sum = attend_list.aggregate(Sum('calls'), Sum('visits'))
  51. for attend in attend_list:
  52. month_days[attend.date.day]['attend'] = attend
  53. order_list = Order.objects.filter(date__range = (sdate,edate))
  54. order_sum = order_list.aggregate(Count('product'), Sum('price'))
  55. order_list = order_list.values('date')
  56. order_list = order_list.annotate(Count('product'), Sum('price'))
  57. for order in order_list:
  58. month_days[order['date'].day]['order'] = order
  59. schedule = Schedule.objects.filter(date__range = (sdate,edate))
  60. for designer in schedule:
  61. day = designer.date.day
  62. if 'designer' in month_days[day]:
  63. month_days[day]['designer'] = '%s, %s' % (month_days[day]['designer'], designer)
  64. else:
  65. month_days[day]['designer'] = designer
  66. table = VisitTable(month_days.values())
  67. RequestConfig(request, paginate={'per_page': 32}).configure(table)
  68. table.set_summaries({
  69. 'calls': attend_sum['calls__sum'],
  70. 'visits': attend_sum['visits__sum'],
  71. 'orders': order_sum['product__count'],
  72. 'cost': order_sum['price__sum'],
  73. })
  74. title = 'Таблица посещаемости на %s г.' % curr_date.strftime('%B %Y')
  75. if request.method == 'POST':
  76. form = DateForm(request.POST)
  77. if form.is_valid():
  78. print form.cleaned_data
  79. else:
  80. form = DateForm()
  81. return render(request, 'asuzr/table.html', {'table': table, 'title': title, 'form': form})
  82. @login_required
  83. def main(request, day, month, year):
  84. if day == None:
  85. day = str(date.today().day)
  86. if month == None:
  87. month = str(date.today().month)
  88. if year == None:
  89. year = str(date.today().year)
  90. d,m,y=int(day),int(month), int(year)
  91. attend_list = Attendance.objects.all().order_by('date')
  92. filtered_attend_list=get_filtered_list(attend_list, year, month)
  93. p_date = datetime.strptime(day+'/'+month+'/'+year, '%d/%m/%Y')
  94. order_list = Order.objects.filter(date=p_date).order_by('id')
  95. 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'))
  96. plan = OrderPlan.objects.all()
  97. filtered_plan = get_filtered_list(plan, year, month)
  98. month_plan=0
  99. if len(filtered_plan) > 0:
  100. month_plan=filtered_plan[0].plan
  101. schedule = Schedule.objects.all().order_by('date')
  102. filtered_schedule = get_filtered_list(schedule, year, month)
  103. month_days={i: {'date': custom_date(int(year),int(month),i)} for i in range(1,calendar.monthrange(int(year),int(month))[1]+1)}
  104. for l in filtered_attend_list:
  105. month_days[l.date.day]['attend']=l
  106. for s in filtered_schedule:
  107. if 'designers' in month_days[s.date.day]:
  108. des=', '.join((month_days[s.date.day]['designers'], ' '.join((s.designer.first_name, s.designer.last_name))))
  109. month_days[s.date.day]['designers'] = des
  110. else:
  111. month_days[s.date.day]['designers'] = ' '.join((s.designer.first_name, s.designer.last_name))
  112. for order in month_order_list:
  113. month_days[order['date'].day]['orders_count'] = order['product__count']
  114. month_days[order['date'].day]['orders_price'] = order['price__sum']
  115. month_days_values = month_days.values()
  116. sum_calls = sum(l.calls for l in filtered_attend_list)
  117. sum_visits = sum(l.visits for l in filtered_attend_list)
  118. sum_orders = sum(l['orders_count'] for l in month_days_values if 'orders_count' in l)
  119. sum_price = sum(l['orders_price'] for l in month_days_values if 'orders_price' in l)
  120. sum_order_price = sum(l.price for l in order_list)
  121. plan_balance = month_plan-sum_price
  122. d_date = p_date.strftime("%d/%m/%Y")
  123. t = loader.get_template('asuzr/attend_order.html')
  124. c = RequestContext(request,{
  125. 'attend_list': month_days_values,
  126. 'order_list': order_list,
  127. 'sum_calls': sum_calls,
  128. 'sum_visits': sum_visits,
  129. 'sum_orders': sum_orders,
  130. 'sum_price': sum_price,
  131. 'sum_order_price': sum_order_price,
  132. 'plan': month_plan,
  133. 'balance': plan_balance,
  134. 'd_date': d_date,
  135. })
  136. return HttpResponse(t.render(c))
  137. @login_required
  138. def sketches(request, order_id):
  139. curr_order = Order.objects.get(pk = order_id)
  140. table = SketchesTable(Sketch.objects.filter(order = curr_order))
  141. RequestConfig(request).configure(table)
  142. return render(request, 'asuzr/table.html', {'table': table, 'title': 'Эскизы заказа %s' % curr_order})
  143. @login_required
  144. def orders(request, archive):
  145. is_archive = (archive == '1')
  146. Table = ArchiveOrdersTable if is_archive else OrdersTable
  147. table = Table(Order.objects.filter(is_done = is_archive))
  148. title = 'Архивная таблица заказов' if is_archive else 'Таблица выхода заказов'
  149. RequestConfig(request).configure(table)
  150. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  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. RequestConfig(request).configure(table)
  161. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  162. @login_required
  163. def production_table(request, order_id):
  164. order_list = Order.objects.filter(is_done=False).order_by('-id')
  165. sel_order = Order.objects.filter(id=order_id)
  166. cost_items = sel_order.values('cost_items')
  167. t=loader.get_template('asuzr/order_costs.html')
  168. c=RequestContext(request,{
  169. 'order_list' : order_list,
  170. 'sel_order' : sel_order,
  171. 'cost_items' : cost_items,
  172. })
  173. return HttpResponse(t.render(c))
  174. @login_required
  175. def prod_plan_view(request):
  176. curr_date = datetime.strptime(request.GET.get('date', date.today().strftime('%d.%m.%Y')), '%d.%m.%Y')
  177. y,m = curr_date.year, curr_date.month
  178. wd = curr_date.weekday()
  179. sdate = curr_date - timedelta(days = wd)
  180. edate = curr_date + timedelta(days = 6-wd)
  181. week_days = {i: {'date': custom_date(y,m,sdate.day+i)} for i in range(0,7)}
  182. prodplan_list = ProdPlan.objects.filter(start_date__range = (sdate,edate))
  183. for prodplan in prodplan_list:
  184. week_days[prodplan.start_date.weekday()]['prodplan'] = prodplan
  185. table = ProdPlanTable(week_days.values())
  186. title = u'Производственный план на %s - %s' % (sdate.strftime('%d.%m.%Y'), edate.strftime('%d.%m.%Y'))
  187. RequestConfig(request).configure(table)
  188. return render(request, 'asuzr/table.html', {'table': table, 'title': title})
  189. def get_date(request):
  190. if request.method == 'POST':
  191. form = DateForm(request.POST)
  192. if form.is_valid():
  193. HttpResponse("AAA")
  194. else:
  195. form = DateForm()
  196. return render(request, 'asuzr/date_control.html', {'form': form})