welco/welco/views.py

176 lines
6.5 KiB
Python
Raw Normal View History

2015-07-02 16:16:57 +02:00
# welco - multichannel request processing
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
2015-07-15 16:40:37 +02:00
import json
import urllib
2015-07-15 16:40:37 +02:00
from django.conf import settings
from django.contrib.auth import logout as auth_logout
from django.contrib.auth import views as auth_views
from django.contrib.auth.decorators import login_required
from django.contrib.contenttypes.models import ContentType
2015-10-09 16:44:05 +02:00
from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse
2015-07-15 16:40:37 +02:00
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import resolve_url
from django import template
from django.template import RequestContext
from django.utils.encoding import force_text
from django.views.decorators.csrf import csrf_exempt
2015-07-02 16:16:57 +02:00
from django.views.generic import TemplateView
try:
from mellon.utils import get_idps
except ImportError:
get_idps = lambda: []
from sources.mail.views import Home as MailHome
2015-09-24 15:15:10 +02:00
from sources.phone.views import Home as PhoneHome
from .qualif.models import Association
from .kb.views import HomeZone as KbHomeZone
2015-07-18 20:33:48 +02:00
from .contacts.views import HomeZone as ContactsHomeZone
from .forms import QualificationForm
2015-07-02 16:16:57 +02:00
def login(request, *args, **kwargs):
if any(get_idps()):
if not 'next' in request.GET:
return HttpResponseRedirect(resolve_url('mellon_login'))
return HttpResponseRedirect(resolve_url('mellon_login') + '?next='
+ urllib.quote(request.GET.get('next')))
return auth_views.login(request, *args, **kwargs)
def logout(request, next_page=None):
if any(get_idps()):
return HttpResponseRedirect(resolve_url('mellon_logout'))
auth_logout(request)
if next_page is not None:
next_page = resolve_url(next_page)
else:
next_page = '/'
return HttpResponseRedirect(next_page)
class Qualification(TemplateView):
template_name = 'welco/qualification.html'
def get_context_data(self, **kwargs):
context = super(Qualification, self).get_context_data(**kwargs)
context['form'] = QualificationForm()
context['source_type'] = self.request.GET['source_type']
context['source_pk'] = self.request.GET['source_pk']
context['associations'] = Association.objects.filter(
source_type=ContentType.objects.get(id=self.request.GET['source_type']),
source_pk=self.request.GET['source_pk'])
return context
def post(self, request, *args, **kwargs):
association = Association(
source_type=ContentType.objects.get(id=request.POST['source_type']),
source_pk=request.POST['source_pk'])
association.formdef_reference = request.POST['formdef_reference']
association.save()
request.GET = request.POST
return self.get(request)
qualification = csrf_exempt(Qualification.as_view())
2015-07-02 16:16:57 +02:00
class Home(TemplateView):
template_name = 'welco/home.html'
2015-09-24 15:15:10 +02:00
source_klass = MailHome
2015-07-02 16:16:57 +02:00
2015-10-09 16:44:05 +02:00
def check_user_ok(self):
return True
def get_context_data(self, **kwargs):
2015-10-09 16:44:05 +02:00
if not self.check_user_ok():
raise PermissionDenied()
context = super(Home, self).get_context_data(**kwargs)
2015-09-24 15:15:10 +02:00
context['source'] = self.source_klass(self.request)
context['kb'] = KbHomeZone(self.request)
2015-07-18 20:33:48 +02:00
context['contacts'] = ContactsHomeZone(self.request)
return context
home = login_required(Home.as_view())
2015-07-15 16:40:37 +02:00
2015-09-24 15:15:10 +02:00
class HomePhone(Home):
source_klass = PhoneHome
home_phone = login_required(HomePhone.as_view())
2015-09-24 15:15:10 +02:00
2015-07-15 16:40:37 +02:00
@csrf_exempt
def qualification_done(request):
source_class = ContentType.objects.get(
id=request.POST['source_type']).model_class()
source_object = source_class.objects.get(id=request.POST['source_pk'])
if source_object.status:
source_object.status = settings.VALIDATION_STEPS[
settings.VALIDATION_STEPS.index(source_object.status)+1]
else:
source_object.status = settings.VALIDATION_STEPS[0]
if source_object.status == settings.VALIDATION_STEPS[-1]:
for association in Association.objects.filter(
source_type=request.POST['source_type'],
source_pk=request.POST['source_pk']):
association.push(request)
source_object.save()
2015-07-15 16:40:37 +02:00
response = HttpResponse(content_type='application/json')
json.dump({'result': 'ok'}, response, indent=2)
return response
2015-10-09 18:01:00 +02:00
@login_required
def wcs_summary(request, *args, **kwargs):
source_class = ContentType.objects.get(id=kwargs.get('source_type')).model_class()
source_object = source_class.objects.get(id=kwargs.get('source_pk'))
tmpl_name = 'welco/%s_summary.html' % source_class._meta.app_label
tmpl = template.loader.get_template(tmpl_name)
context = RequestContext(request)
context['site_base'] = request.build_absolute_uri('/')[:-1]
context['object'] = source_object
json_str = json.dumps({'content': tmpl.render(context)})
for variable in ('jsonpCallback', 'callback'):
if variable in request.GET:
json_str = '%s(%s);' % (request.GET[variable], json_str)
break
return HttpResponse(json_str, content_type='application/javascript')
@login_required
def remove_association(request, *args, **kwargs):
Association.objects.filter(id=kwargs.get('pk')).delete()
return HttpResponseRedirect(resolve_url('home'))
@login_required
def menu_json(request):
response = HttpResponse(content_type='application/json')
if getattr(settings, 'TEMPLATE_VARS', {}).get('site_title'):
label = settings.TEMPLATE_VARS.get('site_title')
else:
label = _('Counter')
json_str = json.dumps([{'label': force_text(label),
'slug': 'counter',
'url': request.build_absolute_uri(reverse('home'))
}])
for variable in ('jsonpCallback', 'callback'):
if variable in request.GET:
json_str = '%s(%s);' % (request.GET[variable], json_str)
break
response.write(json_str)
return response