from django import forms from django.db.models import Q from base.viewsets import BaseTable, BaseViewset from crud.tables2_columns import CrudLinkColumn from django_tables2 import Column, LinkColumn, A from django.shortcuts import reverse from django.utils.text import mark_safe import django_filters from . import models class FeedCategoryFilterSet(django_filters.FilterSet): search_expr = django_filters.CharFilter(label='Search', method='filter_search_expr') class Meta: fields = ['search_expr'] model = models.FeedCategory def filter_search_expr(self, queryset, name, value): return queryset.filter(Q(name__icontains=value) | Q(description__icontains=value)) class FeedCategoryTable(BaseTable): rss_url = Column(accessor='pk', verbose_name="RSS URL") status = Column(orderable=False) delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}}) class Meta(BaseTable.Meta): fields = ('name', 'description', 'rss_url', 'days_required', 'status', 'delete') order_by = ('name',) def render_rss_url(self, value, bound_column): rss_url = bound_column._table.view.request.build_absolute_uri(reverse('rss:daily', kwargs={'feed_category_id': value})) return mark_safe('{0}'.format(rss_url)) class FeedCategoryForm(forms.ModelForm): name = forms.CharField(widget=forms.TextInput(attrs={'autofocus': True})) class Meta: model = models.FeedCategory fields = ('name', 'description', 'days_required') class FeedCategoryViewset(BaseViewset): lookup_url_kwarg = 'feed_category_id' filter_class = FeedCategoryFilterSet form_class = FeedCategoryForm tables2_class = FeedCategoryTable tables2_clickable_rows = True detail_view_title = 'Category' detail_view_template_name = 'feed_content/feed_category_detail_view.html' def get_queryset(self, view): return models.FeedCategory.objects.all() class FeedItemFilterSet(django_filters.FilterSet): day_number = django_filters.NumberFilter(label='Day') message_text = django_filters.CharFilter(label='Text', lookup_expr='icontains') class Meta: fields = ('day_number', 'message_text') model = models.FeedItem class FeedItemTable(BaseTable): delete = CrudLinkColumn('delete', text='', verbose_name='', orderable=False, attrs={'a': {'class': 'btn btn-danger btn-xs glyphicon glyphicon-remove', 'role': 'button'}}) class Meta(BaseTable.Meta): fields = ('day_number', 'message_text', 'delete') order_by = ('day_number',) class FeedItemForm(forms.ModelForm): day_number = forms.IntegerField(required=False, help_text='', widget=forms.TextInput(attrs={'autofocus': True})) message_text = forms.CharField(widget=forms.Textarea(attrs={'cols': 40, 'rows': 5})) class Meta: fields = ('day_number', 'message_text') model = models.FeedItem def clean_day_number(self): day_number = self.cleaned_data['day_number'] if day_number is None: feed_category = self.view.get_cached_object(self.view.viewset.master_viewset) queryset = models.FeedItem.objects.filter(feed_category=feed_category).order_by('-day_number') if self.instance.id is not None: queryset = queryset.exclude(id=self.instance.id) items = queryset[:1] if items: return items[0].day_number + 1 else: return 1 return day_number class FeedItemViewset(BaseViewset): master_viewset_class = FeedCategoryViewset nested_list_view_index = 0 view_url_kwarg_names = BaseViewset.derive_view_url_kwarg_names(master_viewset_class) lookup_url_kwarg = 'feed_item_id' filter_class = FeedItemFilterSet form_class = FeedItemForm tables2_class = FeedItemTable tables2_clickable_rows = True list_view_title = 'Messages' detail_view_title = 'Message' detail_view_template_name = 'feed_content/feed_item_detail_view.html' def get_queryset(self, view): if view is None: return models.FeedItem.objects.none() return models.FeedItem.objects.filter(feed_category_id=view.kwargs['feed_category_id']) def get_master_object(self, view, instance): return instance.feed_category def create_view_form_valid(self, view, form): form.instance.feed_category = view.get_cached_object(self.master_viewset)