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.
 
 
 
 
 
 

187 lines
6.3 KiB

# -*- coding: utf-8 -*-
from django.core.exceptions import ObjectDoesNotExist
from django.core.urlresolvers import reverse_lazy
from django.db.models import Q
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 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 = 'client/events/filter_listview.html'
_ajax_results_template_name = 'client/events/filter_listview_ajax.html'
_ajax_form_template_name = 'client/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()
else:
qs = self.form.default_filter()
if self.kwargs.get('with_form', True):
self.form.recalculate_choices()
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
redirect_url = reverse_lazy('subscription_activation_send')
models = {'expo': (Exposition, 'expositions'), 'conf': (Conference, 'conferences')}
defaults = {
# 'activated': True,
# 'from_events': True,
'dailymailing': 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 = None
# contact = Contact(**defaults)
# contact.save()
return contact
def get_form_kwargs(self):
"""
Returns the keyword arguments for instantiating the form.
"""
kwargs = super(SubscribeView, self).get_form_kwargs()
# kwargs.update({'instance': self.object})
return kwargs
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()
self._redirect_url = self.event.get_permanent_url()
return super(SubscribeView, self).dispatch(request, *args, **kwargs)
def form_invalid(self, form):
return JsonResponse({'errors': form.errors})
def form_valid(self, form):
contact = form.save(commit=False)
if not contact.pk:
contact.dailymailing = False
if self.request.user.is_authenticated():
contact.user = self.request.user
contact.save()
contact.send_activation()
self._redirect_url = self.redirect_url
self.contact = contact
return self.success_responce(sent=True)
def success_responce(self, sent=False):
self.set_event()
return JsonResponse({'success': True, 'sent': sent, 'redirect_url': str(self._redirect_url)})
def post(self, request, *args, **kwargs):
if request.user.is_authenticated():
self.contact = self.get_contact()
if self.contact is not None:
return self.success_responce()
return super(SubscribeView, self).post(request, *args, **kwargs)
def event_visit(request, event_type, id):
args = {'success': False}
user = request.user
model = {'exposition': Exposition, 'conference': Conference}.get(event_type)
if user.is_authenticated():
event = model.objects.safe_get(id=id)
if user in event.users.all():
event.users.remove(user)
args['in'] = False
else:
event.users.add(user)
args['in'] = True
args['success'] = True
else:
args['not_authorized'] = True
args['success'] = True
return JsonResponse(args)