from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from dojango.decorators import json_response
from models import Post
from models import UserData
from datetime import datetime, timedelta
from django.conf import settings
from django.contrib.auth.models import User, Group
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from dateutil.parser import parser
import sys
import MySQLdb
import time
import thread



###################### post ###############################
@json_response
def post(request):
	
	msg         = request.POST['text']
	remote_user = request.POST['remote_user']
	status_call = request.POST['status_call']
	
	mensaje_privado = "0"

	user_local              = User.objects.get(username=request.user)
	localdata, localcreated = UserData.objects.get_or_create(user=user_local)

	localdata.last_req = datetime.now()
	localdata.usecond_last_req = datetime.now().microsecond
	print "\tSe actualiza reloj en post a:", localdata.usecond_last_req
	localdata.save()
	
	if(remote_user != "null"):
		user_remote               = User.objects.get(username=remote_user)
		remotedata, remotecreated = UserData.objects.get_or_create(user=user_remote)

	print "\tTexto enviado  : ", msg
	print "\tUsuario remoto : ", remote_user
	print "\tEstado llamada : ", status_call

	if (msg.find("MP:") >= 0):
		# Se comprueba si el usuario quiere enviar un mensaje privado
		remotedata.mensaje_privado = msg
		remotedata.save()
		print "\tMensaje privado guardado"
		mensaje_privado = "1"
		return get_posts(request)
	else:
		if (msg.find("MPRestore:") >= 0):
			# Se reinicia la variable mensaje privado a su valor por defecto
			localdata.mensaje_privado = "null"
			localdata.save()
			print "\tMensaje privado reseteado"
			mensaje_privado = "0"
			return get_posts(request)
		else:
			if ((remote_user != "inactivo") and (remote_user != "null")):
				# Se inicia la comprobacion del estado de la videollamada enviada
				print "\tComprobacion del estado de la llamada"
				remotedata.remote_user    = request.user.username
				localdata.remote_user     = remote_user
				if (status_call == "1"):
					# Inicio de solicitud de videollamada
					print "\tEl usuario", request.user.username, "quiere hablar con", remote_user
					if (remotedata.status_call != int("0")):
						# Si el usuario esta ocupado se anula la llamada al usuario solicitante
						print "\t Llamada anulada por indisponibilidad del usuario remoto"
						localdata.status_call  = int("3")
						localdata.remote_user  = "inactivo"
						localdata.save()
						return get_posts(request)
					else:								
						remotedata.status_call = int("1")
						remotedata.save()
						localdata.save()
				else:
					if (status_call == "5"):
						# Inicio solicitud de llamada
						print "\tEl usuario", request.user.username, "quiere hablar con", remote_user
						if (remotedata.status_call != int("0")):
							# Si el usuario esta ocupado se anula la llamada al usuario solicitante
							print "\t Llamada anulada por indisponibilidad del usuario remoto"
							localdata.status_call  = int("3")
							localdata.remote_user  = "inactivo"
							localdata.save()
							return get_posts(request)
						else:								
							remotedata.status_call = int("5")
							remotedata.save()
							localdata.save()
					else:
						if (status_call == "2"):
							# Aceptacion del usuario remoto a la solicitud de videollamada
							print "\tEl usuario", request.user.username, "a aceptado la videollamada de", remote_user 				
							localdata.status_call  = int("2")
							remotedata.status_call = int("2")
							remotedata.save()
							localdata.save()
						else:
							if (status_call == "4"):
								# El usuario ha cancelado o finalizado la videollamada/llamada
								print "\tEl usuario", request.user.username, "detiene la llamada con", remote_user				
								localdata.status_call=int("0")
								remotedata.status_call=int("4")
								remotedata.save()
								localdata.save()
							else:
								if (status_call == "6"):
									# Aceptacion del usuario remoto a la solicitud de llamada
									print "\tEl usuario", request.user.username, "a aceptado la videollamada de", remote_user 				
									localdata.status_call  = int("6")
									remotedata.status_call = int("6")
									remotedata.save()
									localdata.save()
								else:
									# Estado de la videollamada inactiva
									remotedata.status_call = int("0")
									localdata.status_call  = int("0")
									remotedata.remote_user = "inactivo"
									localdata.remote_user  = "inactivo"
									remotedata.save()
									localdata.save()
				
	# Se ha modificado el chat, avisamos al servidor para que lo envie	
	localdata.flag_message = 1
	if (mensaje_privado == 1):
		mensaje_privado        = 0
		localdata.flag_message = 1
	localdata.save()

	now    = datetime.now()
	before = now - timedelta(seconds=settings.CONNECTED_AFTER_LAST_REQ)

	for ud in UserData.objects.all():
		if ((ud.last_req > before) and (ud.canal==localdata.canal)):
			# Se ha modificado el chat, avisamos al servidor para que lo envie
			ud.flag_message = 1
			ud.save()	
	
	Post.objects.create(user=request.user, message=msg, canal=int(localdata.canal), usecond_date = int(datetime.now().microsecond))

	return get_posts(request)



###################### update #############################
@json_response
def update(request):
	return get_posts(request)



###################### testpost ###########################
def testpost(request):
	messages = get_posts(request)['messages']
	return HttpResponse(messages)



###################### get_posts ##########################
def get_posts(request):
	now            = datetime.now()
	salir          = 'False'
	udata, created = UserData.objects.get_or_create(user=request.user)

	print"\tProcesamiento de mensajes"

	lista = []
	lasts = Post.objects.filter(canal = int(udata.canal)).order_by('-date', '-usecond_date')

	print lasts
	

	def ordenar(elemento):
		print "\tSe mira"
		ordenardata, created = UserData.objects.get_or_create(user=request.user)
		print elemento
		print elemento.date, ">", ordenardata.last_req
		if (elemento.date > ordenardata.last_req):
				return (elemento)
		else:
			print int(elemento.usecond_date), ">", int(ordenardata.usecond_last_req)
			if ((elemento.date == ordenardata.last_req) and (int(elemento.usecond_date) > int(ordenardata.usecond_last_req))):
				return (elemento)
			else:
				return False


	for item in lasts:
		objeto = ordenar(item)
		if(objeto != False):
			print "\tSe une a la lista"
			lista.append(item)
			print "\tUnido finalizado"
		else:
			break

	lasts = lista

	if (len(lasts) >= 15 ):
		print "\tEnvio los ultimos 10 mensajes"
		lasts = lasts[:10]
	else:
		if (len(lasts) == 0):
			print "\tNo se envia nada"
	
	lasts.reverse()

	if request.method == 'GET':
		udata.last_req         = now
		udata.usecond_last_req = now.microsecond
		print "\tSe actualiza reloj en get a:", udata.usecond_last_req
		udata.save()

	print"\tProcesamiento de mensajes terminado"

	messages     = ''
	messagesaux1 = ''
	messagesaux2 = ''
	messagesaux3 = ''	
	messagest    = ''
	wgroup       = ""
	icono        = ""

	for m in lasts:
		messages += '<img src=%s> <i><b>%s </b></i>[%s]: %s<br>' % (m.user.get_profile().avatar_url(), m.user.username, str(m.date)[11:], m.message)
	for m2 in UserData.objects.all():
		if m2.connected:
			print "\tEl usuario", m2.user.username, "esta conectado"
			wgroup = m2.canal
			if ((m2.status_call == int(2)) or (m2.status_call == int(6))):
				print "\tSe incluye icono para cancelar"
				icono = "error.png'"
			else:
				print "\tNo se incluye icono para cancelar"
				icono = "videoconferencia.png'"

			if (m2.user.username == request.user.username):
				# Usuario solicitante: no se incluye camara para la videollamada
				messagesaux3 = "<li> <b onmouseover=\"return overlib('Haz doble click para enviar un mensaje privado a %s.');\" onmouseout=\"return nd();\" ondblclick=\"mensaje_privado('%s');\">%s</b> (canal:%d)</li>" % (m2.user.username, m2.user.username, m2.user.username, wgroup)
				messagest = messagest + messagesaux3
			else:
				# Se incluye camara para el resto de usuarios
				messagesaux1 = "<li><img id='%s' src='/chat/templates/" % m2.user.username
				messagesaux2 = messagesaux1 + icono
				if (icono == "error.png'"):
					print "\tSe incluye icono para cancelar la videollamada o una llamada"
					messagesaux3 = messagesaux2 + " width='20' height='20' alt='' onmouseover=\"return overlib('Haz click para iniciar/detener la videollamada con %s.');\" onmouseout=\"return nd();\" onclick=iniciarvideollamada('%s') /> <b onmouseover=\"return overlib('Haz doble click para enviar un mensaje privado a %s.');\" onmouseout=\"return nd();\" ondblclick=\"mensaje_privado('%s');\">%s</b> (canal:%d)</li>" % (m2.user.username, m2.user.username, m2.user.username, m2.user.username, m2.user.username, wgroup)
				
				else:
					print "\tNo hay videollamada en curso"
					messagesaux3 = messagesaux2 + " width='20' height='20' alt='' onmouseover=\"return overlib('Haz click para iniciar/detener la videollamada con %s.');\" onmouseout=\"return nd();\" onclick=iniciarvideollamada('%s') /> <img src='/chat/templates/llamada.gif' width='20' height='20' alt='' onmouseover=\"return overlib('Haz click para iniciar/detener llamada con %s.');\" onmouseout=\"return nd();\" onclick=iniciarllamada('%s') /> <b onmouseover=\"return overlib('Haz doble click para enviar un mensaje privado a %s.');\" onmouseout=\"return nd();\" ondblclick=\"mensaje_privado('%s');\">%s</b> (canal:%d)</li>" % (m2.user.username, m2.user.username, m2.user.username, m2.user.username, m2.user.username, m2.user.username, m2.user.username, wgroup)
				messagest = messagest + messagesaux3

	
	#udata.lock = 0
	#udata.save()
	#thread.start_new_thread(espera, (0,12,udata))
	#time.sleep(1)
	#while ((udata.flag_message == 0) and (udata.lock == 0)):
		#print "\tEstamos esperando"
		#pass

	if(udata.flag_message == 1):
		envio = 1
		udata.flag_message = 0
		udata.save()
	else:
		envio = 0

	if not udata.connected:
		udata.connected = True
		admin           = User.objects.get(username=settings.ADMINS[0][0])
		Post.objects.create(user=admin, message='%s is connected.' % request.user.username, canal=0, usecond_date = now.microsecond)
	udata.save()

	if udata.disconnected:
		print "\tMarcado desconectado:", str(udata.disconnected)
		udata.disconnected = False
		print "\tMarcado desconectado actualizado:", str(udata.disconnected)
		salir              = 'True'
		udata.save()
    
	# Usuarios conectados
	before        = now - timedelta(seconds=settings.CONNECTED_AFTER_LAST_REQ)
	userlist      = []
	userlistcanal = []


	for ud in UserData.objects.all():
		if ud.last_req > before:
			# Agregamos el usuario a la lista de Usuarios Conectados
			userlist.append(ud.user.username)
			if (ud.canal == udata.canal):
				# Agregamos el usuario a la lista de Usuarios Conectados del mismo canal
				userlistcanal.append(ud.user.username)
		else:
			if ud.connected:
				# El usuario se ha desconectado
				ud.connected = False
				ud.save()


	if(envio == 1):
		return {'success':True,
			'messages':messages,
			'envio':envio,
			'users':'Conectados en este canal: <b>%s</b>' % ', '.join(userlistcanal),
			'messages2':messagest,
			'canal':udata.canal,
			'desconectado':salir,
			'video':str(udata.remote_user),
			'me':str(udata.user.username),
			'status':str(udata.status_call),
			'mensaje':str(udata.mensaje_privado),
			'wait_value':udata.refresh_period}
	else:
		return {'success':True,
			'envio':envio,
			'users':'Conectados en este canal: <b>%s</b>' % ', '.join(userlistcanal),
			'messages2':messagest,
			'canal':udata.canal,
			'desconectado':salir,
			'video':str(udata.remote_user),
			'me':str(udata.user.username),
			'status':str(udata.status_call),
			'mensaje':str(udata.mensaje_privado),
			'wait_value':udata.refresh_period}

	

###################### logout #############################
def logout(request):
    usuariodesconectado = User.objects.get(username= request.user)
    udata, created = UserData.objects.get_or_create(user=usuariodesconectado)
    udata.disconnected = True
    udata.save()
    auth.logout(request)
    return HttpResponseRedirect("/chat/")



###################### canal ##############################
def canal(request):
    user = User.objects.get(username= request.user)
    usudata, usucreated = UserData.objects.get_or_create(user=user)
    if (usudata.canal == 1):
        canaldefault = "room1"
    else:
        if (usudata.canal == 2):
            canaldefault = "room2"
        else:
            canaldefault = "room3"
    canal = request.POST.get('canal', canaldefault)
    print "\tEligiendo canal"
    print "\t Ususuario", usudata.user
    print "\t Canal", canal
    
    try:
        group = Group.objects.get(name=canal)
        print "\tComprobamos que no este conectado al canal: %s" % canal
        if user.groups.filter(name=canal).count() != 0:
            print "\t Le agregamos al canal"
            #user.groups.clear()
            #user.groups = (group,)
            print "\tProceso de salvaguarda de canal"
            usudata, usucreated = UserData.objects.get_or_create(user=user)
            usudata.flag_message = 1
            if ((canal == "room1") and (user.groups.filter(name=canal).count() == 1)):
                print "\t Recibido canal 1"
                usudata.canal = 1
                usudata.status_call = 0
                usudata.remote_user= "inactivo"
                usudata.mensaje_privado= "null"
                usudata.disconnected = False # Valor por defecto para desconexion				
            if ((canal == "room2") and (user.groups.filter(name=canal).count() == 1)):
                print "\t Recibido canal 2"
                usudata.canal = 2
                usudata.status_call = 0
                usudata.remote_user= "inactivo"
                usudata.mensaje_privado= "null"
                usudata.disconnected = False # Valor por defecto para desconexion
            if (canal == "room3" and (user.groups.filter(name=canal).count() == 1)):
                print "\t Recibido canal 3"
                usudata.canal = 3
                usudata.status_call = 0
                usudata.remote_user= "inactivo"				
                usudata.mensaje_privado= "null"
                usudata.disconnected = False # Valor por defecto para desconexion
        else:
            print "\tError: al entrar en el grupo"
            return HttpResponseRedirect("/chat/error_grupo/")
        print "\t Se salva el canal en la BBDD"
        usudata.save()
        if (usudata.user.username != "admin"):
       	    user.is_staff = False
        else:
            user.is_staff = True
        user.save()
        print "\t Salvado correcto"
        print "\tProceso borrado de tabla videollamada"
        process = delete_table(request.user.username)
        if (process):
            print"\t\tProceso con exito"
        else:
            print"\t\tProceso con error"
            return HttpResponseRedirect("/chat/error/")
        return render_to_response("test.html")

    except:
        print "\tError: al entrar en el grupo"
        return HttpResponseRedirect("/chat/error/")



###################### delete_table #######################
def delete_table(m_username) :
    try:
        conn = MySQLdb.connect (host = "localhost", user = "admin", passwd = "chat", db = "chatdb2")
        cursor = conn.cursor()
    except MySQLdb.Error, e:
        # print "Error %d: %s" % (e.args[0], e.args[1])
        return False

	print "el nombre es" + musername 
    sql = 'DELETE FROM chat_registration WHERE m_username = %s'
    args = (m_username)
    cursor.execute(sql,args)

    cursor.close()
    conn.commit()
    conn.close()

    return True



###################### hilo_espera ########################
# Funcion que ejecuta en un hilo
def espera(inicio, fin, udata):
	
	print "\tEntra en espera"
	contador = inicio
	
	print "\tContador:", contador
	print "\tFinal   :", fin

	# Bucle de inicio a fin, con espera de un segundo
	while ((contador < fin) and (udata.flag_message == 0)):
		print "\tTiempo:", contador
		time.sleep(1)
		contador = contador + 1
	# Marca hilo terminado
	
	udata.lock = 1
	udata.save()
	
	print "\tFin de la espera"
	return True

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
	<head>
            <title>e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.</title>

                <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta name="description" content="Buscador de proyectos ETSI" />
<meta name="author" content="Daniel Callejo"/>
<meta name="author" content="Federico L&oacute;pez"/>
<meta name="author" content="Juli&aacute;n P&eacute;rez"/>
<meta name="author" content="Jos&eacute; Mar&iacute;a Vidal Vidal"/>
<base href="/bibing/proyectos/" /><link rel="shortcut icon" href="./favicon.ico" />
<link rel="stylesheet" href="./publico/css/estructura.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/bootstrap.css" type="text/css" media="screen"/>
<link rel="stylesheet" href="./publico/css/enlaces-capas.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/pestanas.css" type="text/css"  /> 
<link rel="stylesheet" href="./publico/css/formularios.css" type="text/css" />
<link rel="stylesheet" href="./publico/css/lightbox.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/autocompleter.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/resultados.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/milista.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/explorador.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/ultimos.css" type="text/css"  />
<link rel="stylesheet" href="./publico/css/contactar.css" type="text/css"  />
<!-- <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" /> -->
<script src="./publico/javascript/jquery-1.9.1.min.js" type="text/javascript"></script>
<script src="./publico/javascript/bootstrap.js" type="text/javascript"></script>

<script src="./publico/javascript/mootools-1.2.4-core.js" type="text/javascript"></script>
<script src="./publico/javascript/mootools-1-1.2.4.2-more.js" type="text/javascript"></script>
<script src="./publico/javascript/targetbl.js" type="text/javascript"></script>
<script src="./publico/javascript/mensajes.js" type="text/javascript"></script>
<script src="./publico/javascript/form.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Observer.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.js" type="text/javascript"></script>
<script src="./publico/javascript/autocompleter/Autocompleter.Request.js" type="text/javascript"></script>
<script src="./publico/javascript/domready.js" type="text/javascript"></script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8T1TSNC1QY"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8T1TSNC1QY');
</script>



<script type="text/javascript">
function seleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=1
}
function deseleccionar_todo(){
   for (i=0;i<document.formulario_marcados.elements.length;i++)
      if(document.formulario_marcados.elements[i].type == "checkbox")
         document.formulario_marcados.elements[i].checked=0
} 
</script>
	</head>
    <body style="min-width: 960px; background-color: #e2e2e2; height: 100%">	
		<a name="arriba"></a>
<div>
<div id="header">
    <table id="Tabla_01" height="105" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_01.jpg" width="3" height="105" alt="">
        </td>
        <td>
            <img src="./publico/imagenes/cabecera/banner_new2_02.jpg" width="100" height="105" alt="">
        </td>
        <td width="100%" align="right"  style="min-width: 613px; background-repeat: no-repeat; background-position: top right; font-size: medium; font-weight: bold; color: white;">
            <table width="100%" height="105" border="0">
                <tr>
                    <td style=" vertical-align: top; width: 547px">
                        <!-- <a style="text-decoration: none" href="./"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a> -->
                        <a style="text-decoration: none" href="/bibing/proyectos/"><img src="./publico/imagenes/cabecera/banner_new2_03.jpg"alt=""></a>
                     </td>
                     <td  background="./publico/imagenes/cabecera/banner_new2_04.jpg" style="background-repeat: no-repeat; background-color: #c6d4e8;"><br><br><br>
                         &nbsp;
                        </td>
                    </tr>
             </table>
        </td>
    </tr>
    <tr style="border-top: 1px solid #ffffff;">
        <td colspan="3" id="menu_sup" style="font-size: small; text-align: right; background-color: #9c1f2f; vertical-align: bottom">
             
					<a href="/bibing/proyectos/" class="enlace " style=" color: #ffffff">Inicio&nbsp;&nbsp;|</a>
					<a href="/bibing/proyectos/acerca/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Acerca de&nbsp;&nbsp;|</a>
					
					<a href="/bibing/proyectos/contactar/" style=" color: #ffffff" class="enlace ">&nbsp;&nbsp;Contactar&nbsp;&nbsp;</a>
			 <!--       <a href="/bibing/proyectos/ayuda/" style=" color: #ffffff" class="enlace  ">&nbsp;&nbsp;Ayuda&nbsp;&nbsp;|</a> -->
					<!-- <form id="idioma" class=""  method="post" action="">
					<div class="inline" style="color: white">
					<input type="submit" class="tipo_letra " style=" color: #ffffff"name="idioma" value="Castellanossss" />&nbsp;&nbsp;
					</div>	
					</form> -->
			        </td>

    </tr>
    </table>
</div>
<br><br>
<div class="colmask rightmenu">
<div class="panel panel-default" style="margin:20px">
            <div class="panel-heading"><h4>IMPLANTACIÓN DE UNA COMUNICACIÓN CHAT CON DJANGO</h4><h5 style="color:grey"><span class="glyphicon glyphicon-user""></span> : <b>CUEVAS CEPEDA, MIGUEL ÁNGEL</b><br><span class="glyphicon glyphicon-book""></span>  :<b> Ingenier&iacute;a Telecomunicación</b></h5></div><div class="panel-body"><div class="contenido_proyecto"><div class="titulo2_explorador">Contenido del proyecto:</div><div class="ruta"><a href="use/abreproy/12051">Directorio ra&iacute;z</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12051/direccion/django_chat%252F">django_chat</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12051/direccion/django_chat%252Fchat%252F">chat</a>&nbsp;&nbsp;>&nbsp;&nbsp;<a href="use/abreproy/12051/direccion/django_chat%252Fchat%252Fviews.py%252F">views.py</a></div><div class="listing"></div></div></div></div>
</div>
</div>

        
	</body>
 
 
<!-- Inicio Google Analytics -->
<!--
	<script type="text/javascript">
		var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
		document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
	</script>
	
	<script type="text/javascript">
		try {
		var pageTracker = _gat._getTracker("UA-7789620-1");
		pageTracker._trackPageview();
	} 
		catch(err) {}
	</script>
-->
<!-- Fin Google Analytics -->

</html>

