# coding: utf-8 from copy import copy from django import http import unicodecsv as csv class ActiveLegislatureMixin(object): """ Mixin for views that can switch between active legislature and all data """ default_active_only = True def get(self, *args, **kwargs): self.set_active_only() return super(ActiveLegislatureMixin, self).get(*args, **kwargs) def override_active_only(self): """ Redefine this method to override active legislature selection - return None to enable user choice - return True or False to disable user choice and set active state """ return None def set_active_only(self): if 'active_only' in self.request.GET: self.request.session['active_only'] = \ self.request.GET['active_only'] == '1' elif 'active_only' not in self.request.session: self.request.session['active_only'] = self.default_active_only def get_active_only(self): overriden = self.override_active_only() if overriden is None: return self.request.session['active_only'] else: return overriden def get_context_data(self, **kwargs): c = super(ActiveLegislatureMixin, self).get_context_data(**kwargs) if self.override_active_only() is None: c['active_only'] = self.get_active_only() return c class PaginationMixin(object): pagination_limits = (12, 24, 48, 96) def get(self, *args, **kwargs): self.set_paginate_by() return super(PaginationMixin, self).get(*args, **kwargs) def set_paginate_by(self): if 'paginate_by' in self.request.GET: self.request.session['paginate_by'] = \ self.request.GET['paginate_by'] elif 'paginate_by' not in self.request.session: self.request.session['paginate_by'] = 12 def get_paginate_by(self, queryset): return self.request.session['paginate_by'] def get_page_range(self, page): pages = [] if page and page.paginator.num_pages != 1: for i in page.paginator.page_range: if page.number - 4 < i < page.number + 4: pages.append(i) return pages def get_context_data(self, **kwargs): c = super(PaginationMixin, self).get_context_data(**kwargs) c['pagination_limits'] = self.pagination_limits c['paginate_by'] = self.request.session['paginate_by'] c['page_range'] = self.get_page_range(c['page_obj']) c['queries'] = copy(self.request.GET) if 'page' in c['queries']: del c['queries']['page'] return c class GridListMixin(object): def set_session_display(self): if self.request.GET.get('display') in ('grid', 'list'): self.request.session['display'] = self.request.GET.get('display') if 'display' not in self.request.session: self.request.session['display'] = 'grid' def get(self, *args, **kwargs): self.set_session_display() return super(GridListMixin, self).get(*args, **kwargs) def get_template_names(self): return [t.replace('_list', '_%s' % self.request.session['display']) for t in super(GridListMixin, self).get_template_names()] def get_context_data(self, **kwargs): c = super(GridListMixin, self).get_context_data(**kwargs) c['grid_list'] = True return c class CSVDownloadMixin(object): def get_paginate_by(self, queryset): if self.request.GET.get('csv', None) is None: return super(CSVDownloadMixin, self).get_paginate_by(queryset) return None def render_to_csv_response(self, context, **kwargs): response = http.HttpResponse(content_type='text/csv') writer = csv.writer(response) for result in self.get_csv_results(context, **kwargs): writer.writerow(self.get_csv_row(result)) response['Content-Disposition'] = 'attachment; filename="%s.csv"' % ( self.csv_name) return response def render_to_response(self, context, **kwargs): if self.request.GET.get('csv', None) is None: return super(CSVDownloadMixin, self).render_to_response( context, **kwargs) return self.render_to_csv_response(context, **kwargs)