Bez popisu

viewsets.py 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. from django import forms
  2. from django.db.models import Q
  3. from base.viewsets import BaseTable, BaseViewset
  4. from crud.tables2_columns import CrudLinkColumn
  5. from django_tables2 import Column, LinkColumn, A
  6. from django.shortcuts import reverse
  7. from django.utils.text import mark_safe
  8. import django_filters
  9. from . import models, views
  10. class FeedCategoryFilterSet(django_filters.FilterSet):
  11. search_expr = django_filters.CharFilter(label='Search', method='filter_search_expr')
  12. class Meta:
  13. fields = ['search_expr']
  14. model = models.FeedCategory
  15. def filter_search_expr(self, queryset, name, value):
  16. return queryset.filter(Q(name__icontains=value) | Q(description__icontains=value))
  17. class FeedCategoryTable(BaseTable):
  18. rss_url = Column(accessor='pk', verbose_name="RSS URL")
  19. status = Column(orderable=False)
  20. delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}})
  21. class Meta(BaseTable.Meta):
  22. fields = ('name', 'description', 'rss_url', 'starting_month', 'days_required', 'status', 'delete')
  23. order_by = ('name',)
  24. def render_rss_url(self, value, bound_column):
  25. rss_url = bound_column._table.view.request.build_absolute_uri(reverse('rss:daily', kwargs={'feed_category_id': value})).replace('https://', 'http://')
  26. return mark_safe('<a href="{0}">{0}</a>'.format(rss_url))
  27. class FeedCategoryForm(forms.ModelForm):
  28. name = forms.CharField(widget=forms.TextInput(attrs={'autofocus': True}))
  29. class Meta:
  30. model = models.FeedCategory
  31. fields = ('name', 'description', 'starting_month', 'days_required')
  32. class FeedCategoryViewset(BaseViewset):
  33. lookup_url_kwarg = 'feed_category_id'
  34. filter_class = FeedCategoryFilterSet
  35. form_class = FeedCategoryForm
  36. tables2_class = FeedCategoryTable
  37. tables2_clickable_rows = True
  38. detail_view_title = 'Category'
  39. detail_view_template_name = 'feed_content/feed_category_detail_view.html'
  40. extra_instance_views = [
  41. {
  42. 'view_type': 'import_excel',
  43. 'regex': r'import_excel/$',
  44. 'view_class': views.FeedCategoryImportExcelView
  45. }
  46. ]
  47. def get_queryset(self, view):
  48. return models.FeedCategory.objects.all()
  49. def add_context_data(self, view, context):
  50. super(FeedCategoryViewset, self).add_context_data(view, context)
  51. if view.view_type == 'detail':
  52. context['actions'].append(
  53. [
  54. {
  55. 'type': 'button',
  56. 'text': 'Import from Excel',
  57. 'url': self.get_view_url('import_excel', view, view.request.GET, view.get_object()),
  58. 'button_class': 'btn-default'
  59. }
  60. ]
  61. )
  62. class FeedItemFilterSet(django_filters.FilterSet):
  63. day_number = django_filters.NumberFilter(label='Day')
  64. message_text = django_filters.CharFilter(label='Text', lookup_expr='icontains')
  65. class Meta:
  66. fields = ('day_number', 'message_text')
  67. model = models.FeedItem
  68. class FeedItemTable(BaseTable):
  69. delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}})
  70. class Meta(BaseTable.Meta):
  71. fields = ('day_number', 'message_text', 'delete')
  72. order_by = ('day_number',)
  73. class FeedItemForm(forms.ModelForm):
  74. day_number = forms.IntegerField(required=False, help_text='<ul><li>Leave blank to use the next available day number</li></ul>', widget=forms.TextInput(attrs={'autofocus': True}))
  75. message_text = forms.CharField(widget=forms.Textarea(attrs={'cols': 40, 'rows': 5}))
  76. class Meta:
  77. fields = ('day_number', 'message_text')
  78. model = models.FeedItem
  79. def clean_day_number(self):
  80. day_number = self.cleaned_data['day_number']
  81. if day_number is None:
  82. feed_category = self.view.get_cached_object(self.view.viewset.master_viewset)
  83. queryset = models.FeedItem.objects.filter(feed_category=feed_category).order_by('-day_number')
  84. if self.instance.id is not None:
  85. queryset = queryset.exclude(id=self.instance.id)
  86. items = queryset[:1]
  87. if items:
  88. return items[0].day_number + 1
  89. else:
  90. return 1
  91. return day_number
  92. class FeedItemViewset(BaseViewset):
  93. master_viewset_class = FeedCategoryViewset
  94. nested_list_view_index = 0
  95. view_url_kwarg_names = BaseViewset.derive_view_url_kwarg_names(master_viewset_class)
  96. lookup_url_kwarg = 'feed_item_id'
  97. filter_class = FeedItemFilterSet
  98. form_class = FeedItemForm
  99. tables2_class = FeedItemTable
  100. tables2_clickable_rows = True
  101. list_view_title = 'Messages'
  102. detail_view_title = 'Message'
  103. detail_view_template_name = 'feed_content/feed_item_detail_view.html'
  104. def get_queryset(self, view):
  105. if view is None:
  106. return models.FeedItem.objects.none()
  107. return models.FeedItem.objects.filter(feed_category_id=view.kwargs['feed_category_id'])
  108. def get_master_object(self, view, instance):
  109. return instance.feed_category
  110. def create_view_form_valid(self, view, form):
  111. form.instance.feed_category = view.get_cached_object(self.master_viewset)