tables.py 7.6 KB

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