Nav apraksta

viewsets.py 5.6KB

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