| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- from django import forms
- from django.conf import settings
- 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 urlparse import urlparse
- from . import models, views
- 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', 'starting_month', 'days_required', 'status', 'delete')
- order_by = ('name',)
- def render_rss_url(self, value, bound_column):
- request = bound_column._table.view.request
- rss_url = reverse('rss:daily', kwargs={'feed_category_id': value})
- if settings.FORCE_HTTP_RSS_URLS:
- rss_url = 'http://%s%s' % (request.META['HTTP_HOST'].split(':')[0], rss_url)
- else:
- rss_url = request.build_absolute_uri(rss_url)
- return mark_safe('<a href="{0}">{0}</a>'.format(rss_url))
- class FeedCategoryForm(forms.ModelForm):
- name = forms.CharField(widget=forms.TextInput(attrs={'autofocus': True}))
- class Meta:
- model = models.FeedCategory
- fields = ('name', 'description', 'starting_month', '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'
- extra_instance_views = [
- {
- 'view_type': 'import_excel',
- 'regex': r'import_excel/$',
- 'view_class': views.FeedCategoryImportExcelView
- }
- ]
- def get_queryset(self, view):
- return models.FeedCategory.objects.all()
- def add_context_data(self, view, context):
- super(FeedCategoryViewset, self).add_context_data(view, context)
- if view.view_type == 'detail':
- context['actions'].append(
- [
- {
- 'type': 'button',
- 'text': 'Import from Excel',
- 'url': self.get_view_url('import_excel', view, view.request.GET, view.get_object()),
- 'button_class': 'btn-default'
- }
- ]
- )
- 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='<ul><li>Leave blank to use the next available day number</li></ul>', 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)
|