설명 없음

viewsets.py 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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
  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', '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}))
  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', '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. def get_queryset(self, view):
  41. return models.FeedCategory.objects.all()
  42. class FeedItemFilterSet(django_filters.FilterSet):
  43. day_number = django_filters.NumberFilter(label='Day')
  44. message_text = django_filters.CharFilter(label='Text', lookup_expr='icontains')
  45. class Meta:
  46. fields = ('day_number', 'message_text')
  47. model = models.FeedItem
  48. class FeedItemTable(BaseTable):
  49. delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}})
  50. class Meta(BaseTable.Meta):
  51. fields = ('day_number', 'message_text', 'delete')
  52. order_by = ('day_number',)
  53. class FeedItemForm(forms.ModelForm):
  54. 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}))
  55. message_text = forms.CharField(widget=forms.Textarea(attrs={'cols': 40, 'rows': 5}))
  56. class Meta:
  57. fields = ('day_number', 'message_text')
  58. model = models.FeedItem
  59. def clean_day_number(self):
  60. day_number = self.cleaned_data['day_number']
  61. if day_number is None:
  62. feed_category = self.view.get_cached_object(self.view.viewset.master_viewset)
  63. queryset = models.FeedItem.objects.filter(feed_category=feed_category).order_by('-day_number')
  64. if self.instance.id is not None:
  65. queryset = queryset.exclude(id=self.instance.id)
  66. items = queryset[:1]
  67. if items:
  68. return items[0].day_number + 1
  69. else:
  70. return 1
  71. return day_number
  72. class FeedItemViewset(BaseViewset):
  73. master_viewset_class = FeedCategoryViewset
  74. nested_list_view_index = 0
  75. view_url_kwarg_names = BaseViewset.derive_view_url_kwarg_names(master_viewset_class)
  76. lookup_url_kwarg = 'feed_item_id'
  77. filter_class = FeedItemFilterSet
  78. form_class = FeedItemForm
  79. tables2_class = FeedItemTable
  80. tables2_clickable_rows = True
  81. list_view_title = 'Messages'
  82. detail_view_title = 'Message'
  83. detail_view_template_name = 'feed_content/feed_item_detail_view.html'
  84. def get_queryset(self, view):
  85. if view is None:
  86. return models.FeedItem.objects.none()
  87. return models.FeedItem.objects.filter(feed_category_id=view.kwargs['feed_category_id'])
  88. def get_master_object(self, view, instance):
  89. return instance.feed_category
  90. def create_view_form_valid(self, view, form):
  91. form.instance.feed_category = view.get_cached_object(self.master_viewset)