tables.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. # -*- coding: utf-8 -*-
  2. from django.core.urlresolvers import reverse
  3. from django.utils.safestring import mark_safe
  4. from django.utils.html import escape
  5. import django_tables2 as tables
  6. from models import *
  7. class EditableColumn(tables.TemplateColumn):
  8. def __init__(self, field_name, object_name = '', *args, **kwargs):
  9. super(tables.TemplateColumn, self).__init__(*args, **kwargs)
  10. template = '''
  11. {{{{% load inplace_edit %}}}}
  12. {main_part}
  13. '''
  14. main_part = ''
  15. if object_name == '':
  16. main_part = '''
  17. {{% inplace_edit "record.{field}" auto_height = 1, auto_width = 1 %}}
  18. '''
  19. else:
  20. main_part = '''
  21. {{% if record.{object_name} %}}
  22. {{% inplace_edit "record.{object_name}.{field}" auto_height = 1, auto_width = 1 %}}
  23. {{% endif %}}
  24. '''
  25. template = template.format(main_part = main_part)
  26. self.template_code = template.format(field = field_name, object_name = object_name)
  27. class ThumbnailColumn(tables.TemplateColumn):
  28. def __init__(self, field_name, *args, **kwargs):
  29. super(tables.TemplateColumn, self).__init__(*args, **kwargs)
  30. template = '''
  31. {{% load thumbnail %}}
  32. {{% thumbnail record.{field} "100x100" as im %}}
  33. <img src="{{{{ im.url }}}}">
  34. {{% endthumbnail %}}
  35. '''.format(field = field_name)
  36. self.template_code = template
  37. class OrdersTable(tables.Table):
  38. date = tables.DateColumn('d/m/Y', verbose_name = 'Дата')
  39. deadline = tables.DateColumn('d/m/Y', verbose_name = 'Срок сдачи')
  40. product = tables.Column(verbose_name = 'Наименование')
  41. delivery = EditableColumn('delivery', verbose_name = 'Доставка')
  42. lifting = EditableColumn('lifting', verbose_name = 'Подъем')
  43. address = tables.Column(verbose_name = 'Адрес')
  44. price = tables.Column(verbose_name = 'Стоимость')
  45. paid = EditableColumn('paid', verbose_name = 'Оплачено')
  46. ostatok = tables.Column(verbose_name = 'Остаток')
  47. approved = EditableColumn('approved', verbose_name = 'Согласовано')
  48. sketch = tables.LinkColumn('asuzr.views.sketches', verbose_name = 'Эскизы', args=[tables.utils.A('pk')])
  49. executor = EditableColumn('executor', verbose_name = 'Исполнитель')
  50. is_done = EditableColumn('is_done', verbose_name = 'Сдан')
  51. designer = tables.Column(visible = False) # Почему-то дизайнер в exclude вызывает ошибку, м.б. из-за FK. Разобраться
  52. def render_price(self, value):
  53. return '%0.1f' % value
  54. def render_ostatok(self, value):
  55. return '%0.1f' % value
  56. class Meta:
  57. model = Order
  58. attrs = {'class': 'paleblue'}
  59. sequence = ('date',
  60. 'deadline',
  61. 'product',
  62. 'delivery',
  63. 'lifting',
  64. 'address',
  65. 'price',
  66. 'paid',
  67. 'ostatok',
  68. 'approved',
  69. 'sketch',
  70. 'executor',
  71. 'is_done',)
  72. exclude = ('id', 'calls', 'contact', 'phone_num', 'cancelled',)
  73. class ArchiveOrdersTable(OrdersTable):
  74. calls = EditableColumn('calls', verbose_name = 'Обзвон')
  75. class Meta:
  76. attrs = {'class': 'paleblue'}
  77. empty_text = 'Архивных заказов нет'
  78. class DesignerTable(tables.Table):
  79. full_name = tables.Column(empty_values=(), verbose_name = 'Дизайнер')
  80. designer__count = tables.Column(verbose_name = 'Всего заказов')
  81. price__sum = tables.Column(verbose_name = 'Общая сумма')
  82. def render_full_name(self, record):
  83. return " ".join((record['designer__first_name'], record['designer__last_name']))
  84. def render_sum_price(self, value):
  85. return '%0.1f' % value
  86. class Meta:
  87. attrs = {'class': 'paleblue'}
  88. class SketchesTable(tables.Table):
  89. sketch_file = tables.FileColumn(verbose_name = 'Имя файла')
  90. sketch_image = ThumbnailColumn('sketch_file', verbose_name = 'Эскиз', orderable = False)
  91. class Meta:
  92. attrs = {'class': 'paleblue'}
  93. class VisitTable(tables.Table):
  94. date = tables.Column(verbose_name = 'Дата')
  95. week_day = tables.Column(verbose_name = 'День недели', accessor = 'date.weekday_name')
  96. calls = EditableColumn('calls', 'attend' ,verbose_name = 'Звонки', accessor = 'attend.calls')
  97. visits = EditableColumn('visits','attend', verbose_name = 'Посещения', accessor = 'attend.visits')
  98. orders = tables.Column(verbose_name = 'Заказы', accessor = 'order.product__count')
  99. cost = tables.Column(verbose_name = 'Стоимость', accessor = 'order.price__sum')
  100. designer = tables.Column(verbose_name = 'Дизайнеры')
  101. summary = ['Всего','',0,0,0,0,'']
  102. def set_summaries(self, summaries):
  103. indexes = {'calls': 2, 'visits': 3, 'orders': 4, 'cost': 5}
  104. for s in summaries:
  105. idx = indexes[s]
  106. self.summary[idx] = summaries[s]
  107. def render_orders(self, value, record, column):
  108. value = 0 if value == None else value
  109. return mark_safe('<a href="%s?date=%s">%s</a>' % (
  110. reverse('asuzr.views.visit_view'),
  111. record['date'].strftime('%d.%m.%Y'),
  112. escape(value),
  113. ))
  114. class Meta:
  115. attrs = {'class': 'paleblue'}
  116. orderable = False
  117. template = 'asuzr/weekend_table.html'
  118. class DayOrdersTable(OrdersTable):
  119. designer = tables.Column(verbose_name = 'Дизайнер')
  120. summary = ['Всего', 0, '', '', '',]
  121. def set_summary(self, price):
  122. self.summary[1] = price
  123. class Meta:
  124. attrs = {'class': 'paleblue'}
  125. exclude = ('date',
  126. 'delivery',
  127. 'lifting',
  128. 'paid',
  129. 'ostatok',
  130. 'approved',
  131. 'sketch',
  132. 'executor',
  133. 'is_done',
  134. )
  135. sequence = ('product',
  136. 'price',
  137. 'address',
  138. 'designer',
  139. 'deadline',
  140. )
  141. template = 'asuzr/totals_table.html'