# -*- encoding: UTF-8 -*- from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required from django.core.exceptions import ImproperlyConfigured from django.core.urlresolvers import reverse, reverse_lazy from django.db.models.query_utils import Q from django.shortcuts import render_to_response, get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.template import * from pyjasperclient import JasperClient from django.core import serializers from datos.forms import * from django.views.generic import ListView, DetailView, CreateView, UpdateView, FormView, TemplateView from django.conf import settings from django.contrib import messages from django.http import HttpResponseRedirect, HttpResponse from pure_pagination.mixins import PaginationMixin import datetime from datos.models import * class DinamicPaginationMixin(PaginationMixin): def get_paginate_by(self, queryset): self.paginate_by = self.request.GET.get('rpp', 10) if self.paginate_by: self.paginate_by = int(self.paginate_by) return self.paginate_by def get_context_data(self, **kwargs): context = super(DinamicPaginationMixin, self).get_context_data(**kwargs) context['rpp'] = self.get_paginate_by(self.queryset) return context class SearchMixin(object): def get_search(self): return self.request.GET.get('search', '') def get_filter(self, queryset): raise ImproperlyConfigured('Debe especificar implementar el filtro de búsqueda') def get_queryset(self): queryset = super(SearchMixin, self).get_queryset() queryset = self.get_filter(queryset) return queryset def get_context_data(self, **kwargs): context = super(SearchMixin, self).get_context_data(**kwargs) context['search'] = self.get_search() return context class JasperMix(object): url = settings.JASPERSERVER username = 'jasperadmin' password = 'jasperadmin' def generateReport(self, path, namefile, params={}, tipo=None): """ Gennara reportes atravez del jasperserver :param path: :param namefile: :param params: :param tipo: default is PDF """ j = JasperClient(self.url, self.username, self.password) ret = j.runReport(path, ("PDF" if not tipo else tipo), params) f = file(namefile, 'w') f.write(ret['data']) f.close() class ListaUsuariosView(DinamicPaginationMixin, SearchMixin, ListView): model = Usuarios queryset = Usuarios.objects.filter(activo=1).order_by('nombre_usuario') def get_filter(self, queryset): search = self.get_search() if queryset: queryset = queryset.filter( #Q(extension__icontains=search) | Q(nombre_usuario__icontains=search) #Q(nombre_departamento__icontains=search) ) return queryset def get_context_data(self, **kwargs): context = super(ListaUsuariosView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class ListaTarifasView(DinamicPaginationMixin, SearchMixin, ListView): model = Tarifas queryset = Tarifas.objects.all().order_by('id') def get_filter(self, queryset): search = self.get_search() if queryset: queryset = queryset.filter( Q(llamada__icontains=search) ) return queryset def get_context_data(self, **kwargs): context = super(ListaTarifasView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class DetalleUsuariosView(DetailView): model = Usuarios form_class = UsuariosForm def get_context_data(self, **kwargs): context = super(DetalleUsuariosView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class DetalleTarifasView(DetailView): model = Tarifas form_class = TarifasForm def get_context_data(self, **kwargs): context = super(DetalleTarifasView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class CrearUsuariosView(CreateView): model = Usuarios form_class = UsuariosForm def get_success_url(self): messages.success(self.request, "Se agrego el usuario correctamente") return reverse('lista-usuarios') def form_valid(self, form): queryset = Usuarios.objects.filter(nombre_usuario=form.cleaned_data["nombre_usuario"], extension=form.cleaned_data["extension"], departamento=form.cleaned_data["nombre_departamento"], activo=1) if queryset: messages.error(self.request, 'Ya existe el usuario con el mismo nombre, extension y departamento.') return HttpResponseRedirect(reverse('crear-usuarios')) return super(CrearUsuariosView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(CrearUsuariosView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class UpdateUsuariosView(UpdateView): model = Usuarios form_class = UsuariosForm def get_success_url(self): messages.success(self.request, "La información del usuario se actualizo correctamente") return reverse_lazy('lista-usuarios') def form_valid(self, form): form.save() return super(UpdateUsuariosView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(UpdateUsuariosView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class UpdateTarifasView(UpdateView): model = Tarifas form_class = TarifasForm def get_success_url(self): messages.success(self.request, "La información de la tarifa se actualizo correctamente") return reverse_lazy('lista-tarifas') def form_valid(self, form): form.save() return super(UpdateTarifasView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(UpdateTarifasView, self).get_context_data(**kwargs) context["cisco"] = "active" return context class EliminarUsuariosView(UpdateView): model = Usuarios form_class = UsuariosUpdateForm def get_success_url(self): messages.success(self.request, "Se ha eliminado el usuario correctamente") return reverse('lista-usuarios') def form_valid(self, form): queryUsuarios = Usuarios.objects.get(id=self.kwargs["pk"]) queryset = Campos.objects.filter(callingpartynumber__in=str(queryUsuarios.extension)) if queryset: messages.error(self.request, 'El usuario no puede ser eliminado por que tiene asociado un bien.') return HttpResponseRedirect(reverse('lista-usuarios')) else: form.instance.departamento = queryUsuarios.departamento form.instance.activo = 0 form.save() return super(EliminarUsuariosView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(EliminarUsuariosView, self).get_context_data(**kwargs) context["cisco"] = "active" context["eliminar_usuario"] = True return context class CargarArchivo(FormView, JasperMix): template_name = 'datos/form.html' form_class = SubirArchivo @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(CargarArchivo, self).dispatch(*args, **kwargs) def get(self, request, *args, **kwargs): return super(CargarArchivo, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): if request.method == 'POST': form = self.form_class(request.POST, request.FILES) fields = ['cdrRecordType', 'globalCallID_callManagerId', 'globalCallID_callId', 'origLegCallIdentifier', 'dateTimeOrigination', 'origNodeId', 'origSpan', 'origIpAddr', 'callingpartynumber', 'callingpartyUnicodeLoginUserID', 'origCause_location', 'origCause_value', 'origPrecedenceLevel', 'origMediaTransportAddress_IP', 'origMediaTransportAddress_Port', 'origMediaCap_payloadCapability', 'origMediaCap_maxFramesPerPacket', 'origMediaCap_g723BitRate', 'origVideoCap_Codec', 'origVideoCap_Bandwidth', 'origVideoCap_Resolution', 'origVideoTransportAddress_IP', 'origVideoTransportAddress_Port', 'origRSVPAudioStat', 'origRSVPVideoStat', 'destLegIdentifier', 'destNodeId', 'destSpan', 'destIpAddr', 'originalCalledPartyNumber', 'finalCalledPartyNumber', 'finalCalledPartyUnicodeLoginUserID', 'destCause_location', 'destCause_value', 'destPrecedenceLevel', 'destMediaTransportAddress_IP', 'destMediaTransportAddress_Port', 'destMediaCap_payloadCapability', 'destMediaCap_maxFramesPerPacket', 'destMediaCap_g723BitRate', 'destVideoCap_Codec', 'destVideoCap_Bandwidth', 'destVideoCap_Resolution', 'destVideoTransportAddress_IP', 'destVideoTransportAddress_Port', 'destRSVPAudioStat', 'destRSVPVideoStat', 'dateTimeConnect', 'dateTimeDisconnect', 'lastredirectdn', 'pkid', 'originalCalledPartyNumberPartition', 'callingPartyNumberPartition', 'finalCalledPartyNumberPartition', 'lastRedirectDnPartition', 'duration', 'origDeviceName', 'destDeviceName', 'origCallTerminationOnBehalfOf', 'destCallTerminationOnBehalfOf', 'origCalledPartyRedirectOnBehalfOf', 'lastRedirectRedirectOnBehalfOf', 'origCalledPartyRedirectReason', 'lastRedirectRedirectReason', 'destConversationId', 'globalCallId_ClusterID', 'joinOnBehalfOf', 'comment', 'authCodeDescription', 'authorizationLevel', 'clientMatterCode', 'origDTMFMethod', 'destDTMFMethod', 'callSecuredStatus', 'origConversationId', 'origMediaCap_Bandwidth', 'destMediaCap_Bandwidth', 'authorizationCodeValue', 'outpulsedCallingPartyNumber', 'outpulsedCalledPartyNumber', 'origIpv4v6Addr', 'destIpv4v6Addr', 'origVideoCap_Codec_Channel2', 'origVideoCap_Bandwidth_Channel2', 'origVideoCap_Resolution_Channel2', 'origVideoTransportAddress_IP_Channel2', 'origVideoTransportAddress_Port_Channel2', 'origVideoChannel_Role_Channel2', 'destVideoCap_Codec_Channel2', 'destVideoCap_Bandwidth_Channel2', 'destVideoCap_Resolution_Channel2', 'destVideoTransportAddress_IP_Channel2', 'destVideoTransportAddress_Port_Channel2', 'destVideoChannel_Role_Channel2', 'incomingProtocolID', 'incomingProtocolCallRef', 'outgoingProtocolID', 'outgoingProtocolCallRef', 'currentRoutingReason', 'origRoutingReason', 'lastRedirectingRoutingReason', 'huntPilotDN', 'huntPilotPartition', 'calledPartyPatternUsage', 'outpulsedOriginalCalledPartyNumber', 'outpulsedLastRedirectingNumber', 'wasCallQueued', 'totalWaitTimeInQueue', 'callingPartyNumber_uri', 'originalCalledPartyNumber_uri', 'finalCalledPartyNumber_uri', 'lastRedirectDn_uri', 'parseoFecha'] if form.is_valid(): var = request.FILES['archivo'] name = request.FILES['archivo'].name periodo = self.request.POST['periodo'] queryset = Archivo.objects.all().filter(archivo=name) if len(queryset): messages.error(self.request, 'El archivo solo debe de ser ingresado una sola vez al sistema') return HttpResponseRedirect(reverse('CargarArchivo')) l = var.read() import string lista = string.split(l, '\n') pares = map(lambda e: string.split(e, ','), lista) ind = 0 tab = Archivo() tab.archivo=name tab.save() for row in pares: if row != ['']: if ind == 0: pares.remove(row) else: parseo = datetime.datetime.fromtimestamp(int(row[4])) Campos.objects.create( **dict(zip(fields, row), parseofecha=parseo, periodo_id=periodo, archivo_id=tab.id)) ind += 1 var.close() messages.success(request, "Se ha generado correctamente el archivo") else: messages.error(self.request, 'No existe un archivo agregado al formulario, vuelva a intentarlo por favor.') return HttpResponseRedirect(reverse('CargarArchivo')) else: form = SubirArchivo() messages.success(request, "Se ha generado correctamente el archivo") return render_to_response('datos/form.html', {'form': form}, context_instance=RequestContext(request)) def form_invalid(self, form): messages.error(self.request, 'corrija los siguientes errores') return super(CargarArchivo, self).form_invalid(form) def get_context_data(self, **kwargs): context = super(CargarArchivo, self).get_context_data(**kwargs) context['periodo'] = Periodo.objects.all() context['reporte'] = 'active' return context class reportecisco(FormView, JasperMix): template_name = 'datos/imprimirCisco.html' form_class = ReporteCiscoForm def get(self, request, *args, **kwargs): return super(reportecisco, self).get(request, *args, **kwargs) def form_valid(self, form): usuario_id = self.request.POST['usuario'] archivo_id = self.request.POST['archivo'] per1 = self.request.POST['periodo1'] per2 = self.request.POST['periodo2'] tipo = self.request.POST['tipo'] formato = self.request.POST['formato'] extencion = self.request.POST.getlist('extencion') tipo_llamada = self.request.POST['tipo_llamada'] duracion = self.request.POST['duracion'] importe = self.request.POST['importe'] depa = self.request.POST['depa'] user = self.request.user if int(tipo) == 1: if int(formato)==1: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.PDF', {'periodo_ini': per1 , 'periodo_fin': per2,'tipo':tipo, 'usu_log':str(user.id)},'PDF') return HttpResponseRedirect('/media/controlCisco.PDF') else: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.xls', {'periodo_ini': per1 , 'periodo_fin': per2,'tipo':tipo,'usu_log':str(user.id)},'xls') return HttpResponseRedirect('/media/controlCisco.xls') if int(tipo) == 2: if int(formato)==1: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.PDF', {'archivo_id': archivo_id,'tipo':tipo,'usu_log':str(user.id)}, 'PDF') return HttpResponseRedirect('/media/controlCisco.PDF') else: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.xls', {'archivo_id': archivo_id,'tipo':tipo,'usu_log':str(user.id)}, 'xls') return HttpResponseRedirect('/media/controlCisco.xls') if int(tipo) == 3: if int(formato)==1: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.PDF', {'usuario_id': usuario_id,'tipo':tipo,'usu_log':str(user.id)}, 'PDF') return HttpResponseRedirect('/media/controlCisco.PDF') else: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.xls', {'usuario_id': usuario_id,'tipo':tipo,'usu_log':str(user.id)}, 'xls') return HttpResponseRedirect('/media/controlCisco.xls') if int(tipo) == 5: var = extencion[0] print(var) try: var2 = extencion[1] except IndexError: var2 = None if not var: var = 0 if not var2: var2 = 0 if int(formato)==1: print(var[0]) if int (var[0]) == 1 or int(var[0])== 2: print('entro') self.generateReport('/llamadascisco/reportes/cisco_extenciones_priv', settings.MEDIA_ROOT + 'cisco_extenciones_priv.PDF', {'no_extencion':format( var) ,'no2_extencion':format (var2),'tipo':tipo},'PDF') return HttpResponseRedirect('/media/cisco_extenciones_priv.PDF') else: self.generateReport('/llamadascisco/reportes/cisco_extenciones', settings.MEDIA_ROOT + 'cisco_extenciones.PDF', {'no_extencion':format( var) ,'no2_extencion':format (var2)},'PDF') return HttpResponseRedirect('/media/cisco_extenciones.PDF') elif int(formato != 1): if var[0] == 200 or 300: self.generateReport('/llamadascisco/reportes/cisco_extenciones_priv', settings.MEDIA_ROOT + 'cisco_extenciones_priv.xls', {'no_extencion':format( var) ,'no2_extencion':format (var2),'tipo':tipo},'xls') return HttpResponseRedirect('/media/cisco_extenciones_priv.xls') else: self.generateReport('/llamadascisco/reportes/cisco_extenciones', settings.MEDIA_ROOT + 'cisco_extenciones.xls', {'no_extencion': var,'no2_extencion':var2},'xls') return HttpResponseRedirect('/media/cisco_extenciones.xls') if int(tipo) == 6: if int(formato)==1: self.generateReport('/llamadascisco/reportes/cisco_tip_lama', settings.MEDIA_ROOT + 'cisco_tip_lama.PDF', {'tip_llam': tipo_llamada,'usu_log':str(user.id)},'PDF') return HttpResponseRedirect('/media/cisco_tip_lama.PDF') else: self.generateReport('/llamadascisco/reportes/cisco_tip_lama', settings.MEDIA_ROOT + 'cisco_tip_lama.xls', {'tip_llam': tipo_llamada,'usu_log':str(user.id)},'xls') return HttpResponseRedirect('/media/cisco_tip_lama.xls') if int(tipo) == 7: if int(formato)==1: self.generateReport('/llamadascisco/reportes/cisco_duracion', settings.MEDIA_ROOT + 'cisco_duracion.PDF', {'duracion': duracion,'usu_log':str(user.id)},'PDF') return HttpResponseRedirect('/media/cisco_duracion.PDF') else: self.generateReport('/llamadascisco/reportes/cisco_duracion', settings.MEDIA_ROOT + 'cisco_duracion.xls', {'duarcion': duracion,'usu_log':str(user.id)},'xls') return HttpResponseRedirect('/media/cisco_duracion.xls') if int(tipo) == 8: if int(formato)==1: self.generateReport('/llamadascisco/reportes/cisco_importe', settings.MEDIA_ROOT + 'cisco_importe.PDF', {'importe': importe,'usu_log':str(user.id)},'PDF') return HttpResponseRedirect('/media/cisco_importe.PDF') else: self.generateReport('/llamadascisco/reportes/cisco_importe', settings.MEDIA_ROOT + 'cisco_importe.xls', {'importe': importe,'usu_log':str(user.id)},'xls') return HttpResponseRedirect('/media/cisco_importe.xls') if int(tipo) == 9: if int(formato)==1: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.PDF', {'id_depa': depa,'usu_log':str(user.id)},'PDF') return HttpResponseRedirect('/media/controlCisco.PDF') else: self.generateReport('/llamadascisco/reportes/controlCisco', settings.MEDIA_ROOT + 'controlCisco.xls', {'id_depa': depa,'usu_log':str(user.id)},'xls') return HttpResponseRedirect('/media/controlCisco.xls') def form_invalid(self, form): messages.error(self.request, 'corrija los siguientes errores') return super(reportecisco, self).form_invalid(form) def get_context_data(self, **kwargs): # if self.request.user.tipo_permisos == 1: # aux = ExtensionesUsuarios.objects.get(usuario_id = self.request.user) # x = aux.extension.all() # usu = Usuarios.objects.filter(departamento = x) # print(usu) # elif self.request.user.tipo_permisos == 2: # aux = ExtensionesUsuarios.objects.get(usuario_id = self.request.user) # x = aux.extension.all() # usu = Usuarios.objects.filter(extension = x) # print(usu) # else: # usu = Usuarios.objects.all() todo = '' context = super(reportecisco, self).get_context_data(**kwargs) if self.request.user.tipo_permisos == 2 or self.request.user.tipo_permisos == 3 : todo = Extensiones.objects.all() else: try: a = ExtensionesUsuarios.objects.get(usuario = self.request.user) todo = a.extension.all() except: pass context['ext']= todo # context['usua'] = usu context['periodo']= Periodo.objects.all() context['cisco'] = 'active' return context #vista para listar los usuarios en sesion #----------------------------------------- #vista para el permiso denegado class Denegado(TemplateView): template_name = 'htmlPermiso/permisoDenegado.html' #--------------------------------------------------------# #vista para la lista del permiso a las extensiones class Permisos(ListView): template_name = 'Extensiones/extensiones.html' context_object_name = 'usuarios' def get_queryset(self): return ExtensionesUsuarios.objects.all().order_by('id') #------------------------------------------------------# def editPermisos(request,id): extensiones = get_object_or_404(ExtensionesUsuarios, pk = id) if request.method == 'POST': formulario = ExtUsuarios(request.POST, instance = extensiones) if formulario.is_valid(): formulario.save() return redirect('Permisos') else: formulario = ExtUsuarios(instance = extensiones) us = ExtensionesUsuarios.objects.filter(id__contains = id) return render_to_response('Extensiones/EditExtensiones.html', {'formulario':formulario, 'users':us}, context_instance = RequestContext(request)) #-----------------------------------------------------# #funcion para cargar el rango extensiones en el comboBox class FiltroCombo(TemplateView): def get(self, request, *args, **kwargs): id_extension = request.GET['idRango'] extensiones = CatExtensiones.objects.filter(rango_extension=id_extension).order_by('id') data = serializers.serialize('json',extensiones, fields=('descripcion')) return HttpResponse(data, mimetype='application/json') class LlenaCombo(TemplateView): def get(self, request, *args, **kwargs): tabla = request.GET['ext'] print tabla exten = Extensiones.objects.all() data = serializers.serialize('json', exten, fields=('descripcion')) return HttpResponse(data, mimetype='application/json') #------------------------------------------------------# # Vistas para las extensiones y catalogo de extensiones class VistaCatExtensiones(TemplateView): template_name = 'datos/RangoExtensiones.html' class UpCatExtension(UpdateView): model = CatExtensiones template_name = 'datos/upCatExtensiones.html' success_url = reverse_lazy('Extensiones') class AddExtension(CreateView): model = CatExtensiones template_name = 'datos/AddExtension.html' success_url = reverse_lazy('Extensiones') class AddRango(CreateView): model = Extensiones template_name = 'datos/addRango.html' success_url = reverse_lazy('Extensiones') #-----------------------------------------------------# # Vistas para los usuarios que se autenticaran en el sistema class CuentasUsusario(FormView): template_name = 'datos/cuentasUsuarios.html' form_class =UserForm success_url = reverse_lazy('crearCuenta') def form_valid(self, form): user = form.save() messages.success(self.request,'Usuario registrado correctamente') return super(CuentasUsusario, self).form_valid(form) class AsignRangoExtension(FormView): template_name = 'datos/AsigRango.html' form_class = AsigExtensiones success_url = reverse_lazy('Permisos') def form_valid(self, form): ext = form.save() messages.success(self.request,'Permisos Asignados correctamente') return super(AsignRangoExtension, self).form_valid(form) def validar(request): """ :param request: :return: Usuario login del sistema """ username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) mensaje = '' if user is not None: if user.is_active: login(request, user) usuario = request.user.tipo_permisos if usuario == 1: return HttpResponseRedirect('/Archivo/Cargar/Reporte/') elif usuario == 2: return HttpResponseRedirect('/Archivo/Cargar/Usuario/') else: return HttpResponseRedirect('/Archivo/Cargar/Usuario/') else: mensaje = mensaje + 'Usuario no valido, Verifique su Password y User' return TemplateResponse(request, 'login.html', {'msj': mensaje})