tables.py 9.1 KB

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