# -*- coding: utf-8 -*- from django.shortcuts import render_to_response from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.core.context_processors import csrf from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.admin.views.decorators import staff_member_required from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage from django.db.models.deletion import ProtectedError #forms and models from file.forms import FileModelForm from file.models import TmpFile from theme.models import Tag from accounts.models import User from functions.forms import AdminSearchForm from django.utils.translation import get_language as lang from hvad.utils import get_translation_aware_manager #python import random from django.views.generic import ListView as OldListView class ListView(OldListView): """ Default Django generic ListView with few overrided methods for redirecting onto first page of pagination in case of entering big page number(for search engines) List of modules, where overrided ListView is used: - accounts.views - article.views - company.views - conference.views - core.views - exposition.views - photologue.views - place_exposition.views - specialist_catalog.views - translator.views """ def paginate_queryset(self, queryset, page_size): """ Paginate the queryset, if needed. """ paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty()) page_kwarg = self.page_kwarg page = self.kwargs.get(page_kwarg) or self.request.GET.get(page_kwarg) or 1 try: page_number = int(page) except ValueError: if page == 'last': page_number = paginator.num_pages else: raise Http404(_("Page is not 'last', nor can it be converted to an int.")) try: page = paginator.page(page_number) self.kwargs['home'] = False except EmptyPage as e: page = paginator.page(1) self.kwargs['home'] = True return (paginator, page, page.object_list, page.has_other_pages()) def get(self, request, *args, **kwargs): response = super(ListView, self).get(request, *args, **kwargs) if self.kwargs.get("home"): path = self.request.path return HttpResponseRedirect(path[:path.find('page')]) else: return response @login_required def filtered_list(request, objects, template, item_per_page=settings.ADMIN_PAGINATION): """ Return template with objects in it with pagination item_per_page - how many objects view in the one page """ paginator = Paginator(objects, item_per_page) page = request.GET.get('page') try: objects = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objects = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objects = paginator.page(paginator._num_pages) return render_to_response(template, {'objects': objects, 'search_form': AdminSearchForm()}) from django.db.models.loading import get_model from theme.models import Theme @staff_member_required def objects_list(request, Model, template, item_per_page=settings.ADMIN_PAGINATION): """ Return template with all objects of model Model Model - objects Model item_per_page - how many objects view in the one page """ if request.GET: form = AdminSearchForm(request.POST) if form.is_valid(): s_name = request.GET.get('search_name') if s_name: objects = get_translation_aware_manager(Model).filter(name__contains=s_name).distinct() return filtered_list(request, objects, template, 1000) else: list = Model.objects.all() else: list = Model.objects.all() paginator = Paginator(list, item_per_page) page = request.GET.get('page') try: objects = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. objects = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. objects = paginator.page(paginator._num_pages) return render_to_response(template, {'objects': objects, 'search_form': AdminSearchForm()}) @login_required def add_object(request, Form, template_string, redirect_string, #required values choices={}, init_data ={}): if request.POST: form = Form(request.POST) #set choices filled by ajax if 'city' in choices: form.fields['city'].choices = [(item.id, item.name) for item in choices['city'].objects.filter(country=request.POST['country'])] if 'tag' in choices: form.fields['tag'].choices = [(item.id, item.name) for item in choices['tag'].objects.all()] if form.is_valid(): form.save() return HttpResponseRedirect(redirect_string) else: form = Form(initial=init_data) args = {} args.update(csrf(request)) args['languages'] = settings.LANGUAGES args['form'] = form return render_to_response(template_string, args) @login_required def add_object_with_file(request, Form, template, redirect_string, #required values choices={}, init_data ={}): """ Return form and FileForm and post it on the server. Create key which will be check tmp files If form is posted redirect on the page in redirect_string FileForm posts with ajax choices are ... """ #cheks if key already exist(when form wasn't validated) if request.POST.get('key'): key = request.POST['key'] else: key = random.getrandbits(128) #initial FileForm with key for checking if file connected to object file_form = FileModelForm(initial={'key': key}) if request.POST: form = Form(request.POST) #set choices filled by ajax if 'city' in choices: form.fields['city'].choices = [(item.id, item.name) for item in choices['city'].objects.filter(country=request.POST['country'])] if 'tag' in choices: form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] if form.is_valid(): form.save() return HttpResponseRedirect(redirect_string) else: init_data['key'] = key form = Form(initial=init_data) args = {} args.update(csrf(request)) #languages uses in template args['languages'] = settings.LANGUAGES args['form'] = form args['file_form'] = file_form #list of files connected to this form args['files'] = TmpFile.objects.filter(key=key) return render_to_response(template, args) @login_required def delete_object(request, Model, Form, url, prev_page,): """ Form must have 1 parameter url or id """ if request.GET: url = request.GET.get('url') id = request.GET.get('id') if url: object = Model.objects.get(url=url) else: object = Model.objects.get(id=id) try: object.delete() return HttpResponseRedirect(prev_page) except ProtectedError: msg = u'Удаления %s требует удаления связаных объектов'%object return render_to_response('delete.html', {'msg':msg, 'prev_page':prev_page}) else: try: object = Model.objects.get(url=url) except: object = Model.objects.get(id=url) form = Form(instance=object) args = {} args.update(csrf(request)) args['form'] = form args['object'] = object args['prev_page'] = prev_page return render_to_response('delete.html', args) #-----class------------------ from django.views.generic import DetailView from functions.views_help import split_params from city.models import City from exposition.models import Exposition from conference.models import Conference from seminar.models import Seminar from webinar.models import Webinar from company.models import Company from photoreport.models import Photoreport from django.utils.translation import ugettext as _ class ExpoMixin(object): def get_params(self): model_names = {Exposition: _(u'Выставки'), Conference: _(u'Конференции'), Seminar: _(u'Семинары'), Webinar: _(u'Вебинары'), Company: _(u'Участники'), Photoreport: _(u'Фоторепортажи')} model_alternative_name = {Exposition: 'exposition', Conference: 'conference', Photoreport: 'photoreport'} params = [{'type':'model', 'url':self.model, 'name': model_names.get(self.model), 'alternative_name': model_alternative_name.get(self.model)}] st = self.kwargs.get('params') if st: params = params + split_params(st) return params single_page_filter = {Exposition:'event', Conference:'event', Seminar:'event', Webinar:'event', Company:'member', User:'visitor', Photoreport: 'photoreport'} from meta.models import MetaSetting from meta.views import Meta class ExpoListView(ExpoMixin, ListView): """ """ paginate_by = settings.CLIENT_PAGINATION params = None single_page = False search_form = None order = None def get_queryset(self): query = self.model.objects.all() params = self.get_params() for param in params: if param.get('type') == 'country': country = Country.objects.safe_get(url=param.get('url')) if country: param['name'] = country.name query = query.filter(country=country) if param.get('type') == 'city': city = City.objects.safe_get(url=param.get('url')) if city: param['name'] = city.name query = query.filter(city=city) if param.get('type') == 'theme': theme = Theme.objects.safe_get(url=param.get('url')) if theme: param['name'] = theme.name query = query.filter(theme=theme) if param.get('type') == 'tag': tag = Tag.objects.safe_get(url=param.get('url')) if tag: param['name'] = tag.name query = query.filter(tag=tag) if param.get('type') == 'year': param['name'] = param.get('url') query = query.filter(data_begin__year=param.get('url')) if param.get('type') == 'month': monthes = {'jan': 1, 'feb': 2, 'mar': 3, 'apr': 4, 'may': 5, 'jun': 6, 'jul': 7, 'aug': 8, 'sep': 9, 'oct': 10, 'nov': 11, 'dec': 12} param['name'] = param.get('url') query = query.filter(data_begin__month=monthes.get(param.get('url'))) if param.get('type') == 'member' and self.model != Company: param['name'] = param.get('url') company = Company.objects.safe_get(url=param.get('url')) if company: param['name'] = company.name query = query.filter(company__in=[company]) if param.get('type') == single_page_filter.get(self.model): query = query.filter(url=param.get('url')) if query: self.single_page = True param['name'] = query[0].name #if self.request: # views = query[0].views # query.update(views=views+1) self.params = params if self.order: return query.order_by(self.order) else: return query def get_context_data(self, **kwargs): context = super(ExpoListView, self).get_context_data(**kwargs) context['filter'] = self.params context['single_page'] = self.single_page context['search_form'] = self.search_form if self.single_page: s = MetaSetting.objects.get(name='expo') obj = context['object_list'][0] params = s.generate_meta(obj) m = Meta(**params) context['meta'] = m return context from country.models import Country class EventDetail(ExpoMixin, DetailView): def get_object(self, queryset=None): obj = Country.objects.filter()[0] return obj from haystack.query import EmptySearchQuerySet class ExpoSearchView(ListView): paginate_by = settings.CLIENT_PAGINATION template_name = None search_form = None model = None def get_queryset(self): if self.request.GET: form = self.search_form(self.request.GET) if form.is_valid(): return form.search() else: return EmptySearchQuerySet() else: return EmptySearchQuerySet() def get_context_data(self, **kwargs): context = super(ExpoSearchView, self).get_context_data(**kwargs) if self.request.GET: form = self.search_form(self.request.GET) if form.is_valid(): form.data_with_parents = form.get_form_data() else: form = self.search_form() context['search_form'] = form queries = self.request.GET.copy() if queries.has_key('page'): del queries['page'] context['queries'] = queries return context