You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

153 lines
5.1 KiB

# -*- coding: utf-8 -*-
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q
from django.http import Http404
from django.http import HttpResponseForbidden
from django.http import HttpResponseNotFound
from django.views.generic.edit import FormMixin, FormView
from django.conf import settings
from django.template.loader import render_to_string
from django.template import RequestContext
from haystack.query import SearchQuerySet
from emencia.django.newsletter.forms import ContactForm
from emencia.django.newsletter.models import Contact
from functions.custom_views import ContextMixin
from functions.custom_views import ReverseOrderMixin
from functions.custom_views import ListView
from functions.http import JsonResponse
from exposition.models import Exposition
from conference.models import Conference
from .forms import FilterForm
class FilterListView_(ContextMixin, FormMixin, ListView):
initial_ctx = {'filtering': True}
form_class = FilterForm
paginate_by = settings.CLIENT_PAGINATION
template_name = 'events/filter_listview.html'
_ajax_results_template_name = 'events/filter_listview_ajax.html'
_ajax_form_template_name = 'includes/events/filter_form.html'
def get_form_kwargs(self):
kwargs = super(FilterListView_, self).get_form_kwargs()
kwargs.update({'data': self.request.GET})
return kwargs
def get_queryset(self):
if self.form.is_valid():
qs = self.form.filter()
# import pdb; pdb.set_trace()
else:
qs = self.form.default_filter()
if self.kwargs.get('with_form', True):
self.form.recalculate_choices()
# print(self.form.data, self.form.cleaned_data, self.form.get_date_begin_periods())
# import pdb; pdb.set_trace()
return qs
def get(self, request, *args, **kwargs):
self.form = self.get_form(self.get_form_class())
self.extra_ctx['form'] = self.form
# ajax
if request.is_ajax():
ctx = RequestContext(request, self.get_context_data(object_list=self.get_queryset()))
data = {'success': True}
if kwargs.get('with_results', True):
data.update({
'results': render_to_string(self._ajax_results_template_name, ctx),
})
if kwargs.get('with_form', True):
data.update({
'form': render_to_string(self._ajax_form_template_name, ctx),
})
return JsonResponse(data)
# usual get
return super(FilterListView_, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(FilterListView_, self).get_context_data(**kwargs)
# get params for paginator
get = self.form.data.copy()
if 'page' in get:
del get['page']
context['GETparams'] = get.urlencode() if hasattr(get, 'urlencode') else ''
return context
class FilterListView(ReverseOrderMixin, FilterListView_):
pass
class SubscribeView(FormView):
form_class = ContactForm
template_name = None
models = {'expo': (Exposition, 'expositions'), 'conf': (Conference, 'conferences')}
defaults = {
'activated': True,
'from_events': True,
'subscriber': False,
}
def get_event(self):
model, self.attr = self.models.get(self.kwargs.get('model'))
slug = self.kwargs.get('slug')
return model.objects.get(url=slug)
def set_event(self):
attr = getattr(self.contact, self.attr)
attr.add(self.event)
def get_contact(self):
user = self.request.user
defaults = {
'first_name': user.first_name,
'last_name': user.last_name,
'email': user.email,
'user': user,
}
defaults.update(self.defaults)
try:
contact = Contact.objects.filter(Q(user=user) | Q(email=user.email))[0]
except (Contact.DoesNotExist, IndexError):
contact = Contact(defaults)
contact.save()
return contact
def dispatch(self, request, *args, **kwargs):
if not request.is_ajax():
return HttpResponseForbidden()
self.attr = None
self.contact = None
try:
self.event = self.get_event()
except ObjectDoesNotExist:
return HttpResponseNotFound()
return super(SubscribeView, self).dispatch(request, *args, **kwargs)
def form_invalid(self, form):
return JsonResponse(form.errors, status=400)
def form_valid(self, form):
contact = form.save(commit=False)
contact.send_activation()
return self.success_responce()
def success_responce(self):
self.set_event()
return JsonResponse({'success': True})
def post(self, request, *args, **kwargs):
if request.user.is_authenticated():
self.contact = self.get_contact()
return self.success_responce()
return super(SubscribeView, self).post(request, *args, **kwargs)