예제 #1
0
def comentar_perfil(request, username):
	"""
	guarda un comentario en el grupo, redirige al main del grupo
	"""

	if request.method == "POST":
		comentario = bleach.clean(request.POST.get("comentario", ""))

		if comentario:
			perfil_muro = Perfil.objects.get(usuario__username=username)
			perfil_comenta = obtener_perfil(request.user)

			# Crear comment
			CommentPerfil.objects.create(muro=perfil_muro, perfil=perfil_comenta, texto=comentario)			

			if perfil_muro == perfil_comenta:
				# Esta comentando en su propio muro, redirigir allá
				return redirect('perfiles:perfil_propio')
			else:
				return redirect('perfiles:perfil_usuario', username=username)

		else:
			return HttpResponse(status=400)
	else:
		return HttpResponse(status=400)
예제 #2
0
def editar_perfil(request):
    """
	Procesa el view y el form para que el usuario edite su perfil
	"""
    template = "perfiles/editar_perfil.html"
    perfil = obtener_perfil(request.user)
    avatar = obtener_avatar_large(perfil)

    if request.method == "POST":
        form = FormEditarPerfil(request.POST, instance=perfil)

        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('perfiles:perfil_propio'))

    else:
        if perfil.ciudad:
            ciudad_default = perfil.ciudad
        else:
            ciudad_default = obtenerquito()
        form = FormEditarPerfil(
            initial={
                'descripcion': perfil.descripcion,
                'ciudad': ciudad_default,
                'numero_telefono_contacto': perfil.numero_telefono_contacto
            })

    context = {'form': form, 'avatar': avatar}

    return render(request, template, context)
예제 #3
0
def comment_notificacion_ajax(request):

	if request.is_ajax():

		if request.method == "POST":
			id_notificacion = int(request.POST.get("id_notificacion", ""))
			texto_comment = bleach.clean(request.POST.get("texto_comment", ""))
			notificacion = Notificacion.objects.get(id=id_notificacion)

			if texto_comment:

				perfil = obtener_perfil(request.user)
				# Crear objeto CommentNotificacion
				r = CommentNotificacion.objects.create(perfil=perfil, notificacion=notificacion, texto=texto_comment)

				respuesta = json.dumps([r.id, r.texto, r.perfil.usuario.username, r.perfil.imagen_perfil])

				return HttpResponse(respuesta, status=201)

			else:
				return HttpResponse(status=400)

		else:
			return HttpResponse(status=400)

	else:
		return HttpResponse(status=400)
예제 #4
0
def termino_leer_ajax(request):
    if request.is_ajax():

        libro_leido_id = request.POST.get('libro_leido_id', '')

        if not libro_leido_id:
            return HttpResponse("No recibio libro id", status=400)

        libro_leyendo = UsuarioLeyendo.objects.get(id=libro_leido_id)

        if libro_leyendo.termino is None:
            libro_leyendo.termino = datetime.today()
            libro_leyendo.save()

            perfil = obtener_perfil(request.user)

            # notificacion termino leer libro
            Notificacion.objects.termino_leer(perfil, libro_leyendo.libro)

            # notificaciones para cada grupo
            notif_grupos_termino_leer(perfil, libro_leyendo.libro)

            return HttpResponse(status=201)

        else:
            return HttpResponse("Ya había terminado ese libro", status=200)
    else:
        return HttpResponse(status=400)
예제 #5
0
def crear_grupo(request):
    template = "grupos/crear_grupo.html"

    if request.method == "POST":
        form = FormCrearGrupo(request.POST)

        if form.is_valid():

            # Sumar un tipo al grupo (Abierto, Cerrado, Todos puede añadir, Admins pueden añadir)
            tipo_grupo = form.obtener_tipo()
            nuevo_grupo = form.save(commit=False)
            nuevo_grupo.tipo = tipo_grupo

            # Situar el grupo en una ciudad si es necesario
            situar_ciudad = form.cleaned_data['situar_ciudad']
            perfil_admin = obtener_perfil(request.user)
            if situar_ciudad:
                nuevo_grupo.ciudad = perfil_admin.ciudad

            nuevo_grupo.save()

            # Crear usuario administrador
            usuario_admin = UsuariosGrupo(perfil=perfil_admin, grupo=nuevo_grupo, es_admin=True)
            usuario_admin.save()

            return redirect('grupos:main_grupo', id_grupo=nuevo_grupo.id)
    else:
        form = FormCrearGrupo()

    context = {'form': form}

    return render(request, template, context)
예제 #6
0
def responder_comment_bcompartida_ajax(request):
	"""
	Guarda un objeto RespuestaCommentBCompartida con FK al comment_perfil respondido
	"""

	if request.is_ajax():

		if request.method == "POST":
			comentario_id = int(request.POST.get("comment_id", ""))
			texto_respuesta_base = request.POST.get("texto_respuesta", "")

			if texto_respuesta_base:

				comment_obj = CommentBCompartida.objects.get(id=comentario_id)
				perfil_usuario = obtener_perfil(request.user)
				texto_respuesta = bleach.clean(texto_respuesta_base)

				# Crear objeto respuesta
				r = RespuestaCommentBCompartida.objects.create(comment_bcompartida=comment_obj, perfil=perfil_usuario, texto=texto_respuesta)

				respuesta = json.dumps([r.id, r.texto, r.perfil.usuario.username, r.perfil.imagen_perfil])

				return HttpResponse(respuesta, status=201)

			else:
				return HttpResponse(status=400)
		else:
			return HttpResponse(status=400)	
	else:
		return HttpResponse(status=400)
예제 #7
0
def redirigir_login(request):
    perfil = obtener_perfil(request.user)
    if AdminsBibliotecaCompartida.objects.filter(perfil=perfil).exists():
        admin_bcompartida_obj = AdminsBibliotecaCompartida.objects.filter(
            perfil=perfil).select_related('biblioteca_compartida').first()
        bcompartida = admin_bcompartida_obj.biblioteca_compartida
        return redirect('libros:biblioteca_compartida', slug_biblioteca_compartida=bcompartida.slug)
    else:
        return redirect('libros:libros_ciudad', slug_ciudad=perfil.ciudad.slug, id_ciudad=perfil.ciudad.id)
예제 #8
0
def libros_usuario_ajax(request):
    """
	Crea un UsuarioLeyendo object y señala la fecha actual como inicio
	"""
    if request.is_ajax():
        perfil = obtener_perfil(request.user)
        titulos_autocomplete, autores_autocomplete = obtener_libros_perfil(perfil)
        context = {'titulos_autocomplete': json.dumps(titulos_autocomplete),
                   'autores_autocomplete': json.dumps(autores_autocomplete)}
        return HttpResponse(context, status=200)
    else:
        return HttpResponse(status=400)
예제 #9
0
def login_admin_bcompartida(request):
    template = "perfiles/login_admin_bcompartida.html"

    if request.method == "POST":
        form = LoginAdminBcompartida(request.POST)
        # Bibliotecas compartidas obtenidas de Quito
        bibliotecas_compartidas = BibliotecaCompartida.objects.filter(ciudad__id=18)
        form.fields["biblioteca_compartida"].queryset = bibliotecas_compartidas

        if form.is_valid():
            bcompartida = form.cleaned_data['biblioteca_compartida']
            password = form.cleaned_data['password']
            n_usuario = form.cleaned_data['nombre_usuario']

            if User.objects.filter(username=n_usuario).exists():
                usuario = User.objects.get(username=n_usuario)

                perfil_admin = obtener_perfil(usuario)

                if AdminsBibliotecaCompartida.objects.filter(biblioteca_compartida=bcompartida,
                                                             perfil=perfil_admin).exists():
                    usuario_auth = authenticate(username=perfil_admin.usuario.username, password=password)

                    if usuario_auth is not None:
                        if usuario.is_active:
                            login(request, usuario_auth)
                            # Redirige al admin logeado a la pagina de su biblioteca compartida
                            return redirect('libros:biblioteca_compartida',
                                            slug_biblioteca_compartida=bcompartida.slug)
                        else:
                            form.add_error(None, "Usuario inactivo")
                    else:
                        form.add_error(None, "Nombre de usuario o contraseña incorrecta")
                else:
                    form.add_error(None, "No existe un administrador de esa biblioteca compartida con ese nombre")
            else:
                form.add_error("nombre_usuario", "Nombre de usuario incorrecto")
    else:
        form = LoginAdminBcompartida()

    # Bibliotecas compartidas obtenidas de Quito
    bibliotecas_compartidas = BibliotecaCompartida.objects.filter(ciudad__id=18)
    form.fields["biblioteca_compartida"].queryset = bibliotecas_compartidas

    context = {'form': form}

    return render(request, template, context)
예제 #10
0
def invitar_ajax(request):
    if request.is_ajax():
        grupo_id = request.POST.get("grupo_id", "")
        invitaciones = json.loads(request.POST.get("invitaciones", ""))

        if grupo_id and invitaciones:
            grupo = Grupo.objects.get(id=grupo_id)
            invitado_por = obtener_perfil(request.user)

            for invitacion in invitaciones:
                usuario_invitado = Perfil.objects.get(usuario__username=invitacion['nombre_usuario'])

                # Si el usuario ya es miembro del grupo
                if UsuariosGrupo.objects.filter(perfil=usuario_invitado, grupo=grupo).exists():
                    pass

                # Si cualquier persona puede sumar miembros al grupo
                elif grupo.tipo == 1 or grupo.tipo == 3:

                    RequestInvitacion.objects.create(grupo=grupo, usuario_invitado=usuario_invitado,
                                                     invitado_por=invitado_por,
                                                     aceptado_por=invitado_por,
                                                     aceptado=True)  # crea un objecto de RequestInvitacion con aceptado True
                    UsuariosGrupo.objects.create(perfil=usuario_invitado, grupo=grupo)  # Crea un UsuariosGrupo object

                # Si el usuario que invita es admin del grupo
                elif UsuariosGrupo.objects.filter(perfil=invitado_por, grupo=grupo, es_admin=True,
                                                  activo=True).exists():
                    RequestInvitacion.objects.create(grupo=grupo, usuario_invitado=usuario_invitado,
                                                     invitado_por=invitado_por,
                                                     aceptado_por=invitado_por,
                                                     aceptado=True)  # crea un objecto de RequestInvitacion con aceptado True
                    UsuariosGrupo.objects.create(perfil=usuario_invitado, grupo=grupo)  # Crea un UsuariosGrupo object

                else:
                    # No es abierto ni es admin, crear RequestInvitacion sin aceptado=True
                    RequestInvitacion.objects.create(grupo=grupo, usuario_invitado=usuario_invitado,
                                                     invitado_por=invitado_por)

            return HttpResponse("Invitaciones Creadas", status=201)

        else:
            return HttpResponse("No encontro los args", status=400)

    else:
        return HttpResponse("No Ajax", status=403)
예제 #11
0
def perfil_propio(request):
    """
	Muestra el perfil del usuario que está hecho login enfocado en la actividad
	"""
    template = "perfiles/perfil_propio.html"
    perfil = obtener_perfil(request.user)
    avatar = obtener_avatar_large(perfil)

    # Grupos Perfil
    grupos = None
    if UsuariosGrupo.objects.filter(perfil=perfil, activo=True).exists():
        usuarios_grupo_obj = UsuariosGrupo.objects.filter(perfil=perfil, activo=True).select_related('grupo')
        grupos = [ug.grupo for ug in usuarios_grupo_obj]

    # Usuario Leyendo
    actualmente_leyendo, libros_leidos_usuario = obtener_usuario_leyendo(perfil)

    libros_disponibles = LibrosDisponibles.objects.filter(perfil=perfil).select_related('libro')

    # autocomplete Usuario Leyendo
    titulos_autocomplete = {}
    autores_autocomplete = {}
    for l in libros_disponibles:
        titulos_autocomplete[l.libro.titulo] = (l.libro.id, l.libro.autor)

    # Muro, comentarios y actividades
    actividad = []
    actividad_0 = obtener_muro_perfil(perfil)
    for act in actividad_0:
        if act.__class__.__name__ == "CommentPerfil":
            actividad.append((act, "comment"))
        else:
            actividad.append((act, "notificacion"))

    for l in libros_disponibles:
        autores_autocomplete[l.libro.autor] = l.libro.id

    # Si es admin de una biblioteca, poner link a la biblioteca
    bibliotecas_compartidas = None

    context = {'avatar': avatar, 'grupos': grupos, 'actualmente_leyendo': actualmente_leyendo,
               'libros_leidos_usuario': libros_leidos_usuario, 'titulos_autocomplete': json.dumps(titulos_autocomplete),
               'autores_autocomplete': json.dumps(autores_autocomplete), 'actividad': actividad,
               'bibliotecas_compartidas': bibliotecas_compartidas}

    return render(request, template, context)
예제 #12
0
def editar_info_personal(request):
    """
    Permite editar info que esta en User object, incluido cambiar clave
    """
    template = "perfiles/editar_info_personal.html"
    usuario_editar = request.user

    print "metodo actual: %s" % request.method

    if request.method == "POST":

        form = FormEditarInfoPersonal(usuario_editar, request.POST)

        if form.is_valid():
            form.save()  # Cambia la contraseña

            email = form.cleaned_data['email']

            usuario_editar.email = email
            usuario_editar.save()

            print request.user

            # render html con mensaje temporal
            perfil = obtener_perfil(usuario_editar)
            admin_bcompartida = AdminsBibliotecaCompartida.objects.filter(perfil=perfil, activo=True).select_related(
                'biblioteca_compartida').first()
            razon_mensaje = 'cambio_contrasena'
            template = "perfiles/mensaje_temporal.html"
            url_redirigir = reverse('libros:biblioteca_compartida',
                                    kwargs={'slug_biblioteca_compartida': admin_bcompartida.biblioteca_compartida.slug})

            context = {'razon_mensaje': razon_mensaje, 'admin_bcompartida': admin_bcompartida,
                       'url_redirigir': url_redirigir}

            return render(request, template, context)

    else:
        form = FormEditarInfoPersonal(usuario_editar, initial={'email': usuario_editar.email})

    context = {'form': form}

    return render(request, template, context)
예제 #13
0
def comentar_bcompartida(request, slug_biblioteca_compartida):
	"""
	guarda un comentario en el grupo, redirige al main del grupo
	"""

	if request.method == "POST":
		comentario = bleach.clean(request.POST.get("comentario", ""))

		if comentario:
			bcompartida = BibliotecaCompartida.objects.get(slug=slug_biblioteca_compartida)
			perfil_usuario = obtener_perfil(request.user)

			# Crear comment
			CommentBCompartida.objects.create(bcompartida=bcompartida, perfil=perfil_usuario, texto=comentario)

		return redirect('libros:biblioteca_compartida', slug_biblioteca_compartida=bcompartida.slug)

	else:
		return HttpResponse(status=400)
예제 #14
0
def comentar_grupo(request, id_grupo):
	"""
	guarda un comentario en el grupo, redirige al main del grupo
	"""

	if request.method == "POST":
		comentario = bleach.clean(request.POST.get("comentario", ""))

		if comentario:
			grupo = Grupo.objects.get(id=id_grupo)
			perfil_usuario = obtener_perfil(request.user)

			# Crear comment
			CommentGrupo.objects.create(grupo=grupo, perfil=perfil_usuario, texto=comentario)

		return redirect('grupos:main_grupo_actividad', id_grupo=grupo.id)

	else:
		return HttpResponse(status=400)
예제 #15
0
def editar_grupo(request, id_grupo):
    template = "grupos/editar_grupo.html"

    grupo = get_object_or_404(Grupo, id=id_grupo)

    if request.method == "POST":
        form = FormCrearGrupo(request.POST, instance=grupo)

        if form.is_valid():

            # Sumar un tipo al grupo (Abierto, Cerrado, Todos puede añadir, Admins pueden añadir)
            tipo_grupo = form.obtener_tipo()
            grupo_editado = form.save(commit=False)
            grupo_editado.tipo = tipo_grupo

            # Situar el grupo en una ciudad si es necesario
            situar_ciudad = form.cleaned_data['situar_ciudad']
            perfil_admin = obtener_perfil(request.user)
            if situar_ciudad:
                grupo_editado.ciudad = perfil_admin.ciudad

            # Guardar cambios
            grupo_editado.save()

        return redirect('grupos:main_grupo', id_grupo=grupo.id)

    else:
        if grupo.ciudad is not None:
            form_situar_ciudad = True

        form = FormCrearGrupo(initial={
            'nombre': grupo.nombre,
            'descripcion': grupo.descripcion,
            'imagen': grupo.imagen,
            'tipo_apertura': grupo.obtener_tipo_apertura(),
            'tipo_invitaciones': grupo.obtener_tipo_invitaciones(),
            'situar_ciudad': form_situar_ciudad
        })

    context = {'form': form, 'grupo': grupo}
    return render(request, template, context)
예제 #16
0
def main_grupo_actividad(request, id_grupo):
    template = "grupos/main_grupo.html"

    perfil_usuario = None
    if request.user.is_authenticated():
        perfil_usuario = obtener_perfil(request.user)

    grupo = Grupo.objects.get(id=id_grupo)

    usuario_es_miembro = False
    if request.user.is_authenticated():
        usuario_es_miembro = UsuariosGrupo.objects.filter(perfil=perfil_usuario, grupo=grupo).exists()

    usuarios_grupo_obj = UsuariosGrupo.objects.filter(grupo=grupo, activo=True).select_related('perfil')
    miembros = [u_grupo for u_grupo in usuarios_grupo_obj]

    # Invitar a un usuario al grupo
    usuario_es_admin = False
    request_invitacion_enviada = False

    if request.user.is_authenticated():
        if usuario_es_miembro:
            # Si el usuario es miembro, revisar si es admin
            if UsuariosGrupo.objects.filter(perfil=perfil_usuario, grupo=grupo, es_admin=True):
                usuario_es_admin = True
        else:
            # Si el usuario no es miembro, revisar si ya envió solicitud
            if RequestInvitacion.objects.filter(grupo=grupo, usuario_invitado=perfil_usuario, aceptado=False,
                                                eliminado=False).exists():
                request_invitacion_enviada = True

    # Requests pendientes de aceptacion al grupo
    requests_entrar_grupo = None
    if usuario_es_miembro:
        if grupo.tipo in [2, 4]:
            # Si solo los admins pueden aceptar !!!
            # Si el usuario es admin, mostrar los requests.
            if usuario_es_admin:
                requests_entrar_grupo = RequestInvitacion.objects.filter(grupo=grupo, aceptado=False, eliminado=False)
        else:
            requests_entrar_grupo = RequestInvitacion.objects.filter(grupo=grupo, aceptado=False, eliminado=False)

    comentarios = CommentGrupo.objects.filter(grupo=grupo, eliminado=False).annotate(num_respuestas=Count("respuestas"))
    notificaciones = Notificacion.objects.filter(grupo=grupo).annotate(num_respuestas=Count("respuestas"))

    actividad_0 = list(chain(comentarios, notificaciones))
    actividad_0.sort(key=lambda x: x.fecha)  # Ordena comentarios y notificaciones alternados por fecha.
    actividad_0.reverse()  # Ordena desde el más reciente.

    actividad = []
    for act in actividad_0:
        if act.__class__.__name__ == "CommentGrupo":
            actividad.append((act, "comment"))
        else:
            actividad.append((act, "notificacion"))

    actualmente_leyendo, libros_leidos_usuario = obtener_usuario_leyendo(perfil_usuario)

    context = {'grupo': grupo, 'miembros': miembros, 'requests_entrar_grupo': requests_entrar_grupo,
               'usuario_es_admin': usuario_es_admin,
               'usuario_es_miembro': usuario_es_miembro, 'request_invitacion_enviada': request_invitacion_enviada,
               'actividad': actividad,
               'actualmente_leyendo': actualmente_leyendo
               }

    return render(request, template, context)
예제 #17
0
def compartir_libro_grupo(request, id_grupo):
    # No usa un Django form. Utiliza client side validation y en el server utiliza bleach
    template = "grupos/compartir_con_grupo.html"

    grupo = Grupo.objects.get(id=id_grupo)
    perfil_obj = obtener_perfil(request.user)

    if request.method == "POST":

        tipo = request.POST.get("tipo_libro", "")

        if tipo == "existente":
            # el form envia el id de un libro disponible existente
            id_libro_disp = request.POST.get("libro_disp_id", "")

            if LibrosDisponibles.objects.filter(id=int(id_libro_disp)).exists():
                libro_disponible = LibrosDisponibles.objects.get(id=int(id_libro_disp))
            else:
                # !! Llamar a una función que cree un nuevo libro como si fuera c_nuevo
                return HttpResponse(staus=400)

            # revisa si existe un LibroDisponibleGrupo object con ese libro disponible y el grupo
            if LibroDisponibleGrupo.objects.filter(grupo=grupo, libro_disponible=libro_disponible).exists():
                libro_disponible_grupo_obj = LibroDisponibleGrupo.objects.get(grupo=grupo,
                                                                              libro_disponible=libro_disponible)
                if not libro_disponible_grupo_obj.activo:
                    libro_disponible_grupo_obj.activo = True
                    libro_disponible_grupo_obj.save()

                    # Crear notificacion libro compartido con grupo !! usar nueva funcion
                    Notificacion.objects.compartio_libro_grupo(perfil_obj, libro_disponible.libro, grupo)

                    return redirect('grupos:main_grupo_libros', id_grupo=grupo.id, queryset="titulo")
                else:
                    return redirect('grupos:main_grupo_libros', id_grupo=grupo.id, queryset="titulo")
            else:
                LibroDisponibleGrupo.objects.create(grupo=grupo, libro_disponible=libro_disponible)

                # Crear notificacion libro compartido con grupo !! usar nueva funcion
                Notificacion.objects.compartio_libro_grupo(perfil_obj, libro_disponible.libro, grupo)

                return redirect('grupos:main_grupo_libros', id_grupo=grupo.id, queryset="titulo")

        elif tipo == "nuevo":
            # el form envia el titulo y el autor para crear un nuevo libro
            titulo = bleach.clean(request.POST.get("titulo", ""))
            autor = bleach.clean(request.POST.get("autor", ""))
            descripcion = bleach.clean(request.POST.get("descripcion", ""))

            if titulo and autor:
                # crea un nuevo libro
                nuevo_libro = Libro.objects.create(titulo=titulo, autor=autor, descripcion=descripcion)

                # crea un Libro Disponible object
                libro_disponible_obj = LibrosDisponibles.objects.create(libro=nuevo_libro, perfil=perfil_obj,
                                                                        abierto_comunidad=False,
                                                                        ciudad=perfil_obj.ciudad)

                # crea un LibroDisponibleGrupo object
                LibroDisponibleGrupo.objects.create(libro_disponible=libro_disponible_obj, grupo=grupo)

                # crear notificacion libro compartido con grupo
                Notificacion.objects.compartio_libro_grupo(perfil_obj, libro_disponible_obj.libro, grupo)

                return redirect('grupos:main_grupo_libros', id_grupo=grupo.id, queryset="titulo")

            else:
                return HttpResponse("Falta titulo o autor", status=400)

        else:
            return HttpResponse("Formulario mal llenado", status=400)

        return HttpResponse("prueba form")

    else:
        titulos_autocomplete, autores_autocomplete = obtener_libros_perfil(perfil_obj)

    context = {'grupo': grupo, 'titulos_autocomplete': json.dumps(titulos_autocomplete),
               'autores_autocomplete': json.dumps(autores_autocomplete)}

    return render(request, template, context)
예제 #18
0
def leyendo_libro_ajax(request):
    """
	Recibe un libro id o un titulo y un autor. En el primer caso, crea un objeto UsuarioLeyendo, en el segundo,
	crea un objeto Libro y luego un objeto UsuarioLeyendo
	"""
    if request.is_ajax():
        libro_id = request.POST.get("libro_id", "")
        titulo = request.POST.get("titulo", "")
        autor = request.POST.get("autor", "")
        perfil = obtener_perfil(request.user)

        if not libro_id and (not titulo or not autor):
            # Si envio valores vacíos
            return HttpResponse(status=400)

        if libro_id:
            # Significa que el libro está en su biblioteca
            libro = Libro.objects.get(id=int(libro_id))

            # Revisar si el último UsuarioLeyendo object no es el mismo que declaro estar leyendo, para evitar repeticiones
            ultimo_libro = UsuarioLeyendo.objects.filter(perfil=perfil).latest('inicio')
            if ultimo_libro.libro.titulo == titulo:
                return HttpResponse("es el mismo libro que ya está leyendo", status=400)

            # Revisar si no borro el nombre y puso otro que no está en su biblioteca (nuevo)
            # El autocomplete pudiera haber llenado el id del hidden input y luego se pudo haber quedado así,
            # a pesar de que el usuario borro el nombre del autocomplete e insertó otro título.
            if libro.titulo == titulo and libro.autor == autor:
                UsuarioLeyendo.objects.create(perfil=perfil, libro=libro)

            else:
                if not titulo or not autor:
                    # Si envio valores vacíos
                    return HttpResponse(status=400)
                # crear nuevo libro
                libro = Libro.objects.create(titulo=titulo, autor=autor)

                # crear objeto UsuarioLeyendo
                UsuarioLeyendo.objects.create(libro=libro, perfil=perfil)

            # crear notificaciones para cada grupo
            Notificacion.objects.comenzo_leer(perfil, libro)
            notif_grupos_comenzo_leer(perfil, libro)

        else:
            # Significa que el libro no está en su biblioteca
            # Revisar si el último UsuarioLeyendo object no es el mismo que declaro estar leyendo, para evitar repeticiones
            ultimo_libro = UsuarioLeyendo.objects.filter(perfil=perfil).latest('inicio')
            if ultimo_libro.libro.titulo == titulo:
                return HttpResponse("es el mismo libro que ya está leyendo", status=400)

            # Revisar si no existe ya un libro con ese titulo, para evitar repeticiones
            if Libro.objects.filter(titulo=titulo, autor=autor).exists():
                # Puede darse errores en que get returns more than 1 object. asi que mejor usar last()
                libro = Libro.objects.filter(titulo=titulo, autor=autor).last()
            else:
                # crear nuevo libro
                libro = Libro.objects.create(titulo=titulo, autor=autor)

            # crear objeto LibroDisponible, suma libro a su biblioteca, solo si no existe ya en la biblioteca
            if not LibrosDisponibles.objects.filter(libro=libro, perfil=perfil).exists():
                LibrosDisponibles.objects.create(libro=libro, perfil=perfil, disponible=False, ciudad=perfil.ciudad)

            # crear objeto UsuarioLeyendo
            UsuarioLeyendo.objects.create(libro=libro, perfil=perfil)

            # crear notificaciones para cada grupo
            Notificacion.objects.comenzo_leer(perfil, libro)
            notif_grupos_comenzo_leer(perfil, libro)

        return HttpResponse(status=200)

    else:
        return HttpResponse(status=400)
예제 #19
0
def main_grupo_libros(request, id_grupo, queryset):
    template = "grupos/main_grupo.html"

    grupo = Grupo.objects.get(id=id_grupo)
    perfil_usuario = None
    if request.user.is_authenticated():
        perfil_usuario = obtener_perfil(request.user)

    usuario_es_miembro = False
    if request.user.is_authenticated():
        usuario_es_miembro = UsuariosGrupo.objects.filter(perfil=perfil_usuario, grupo=grupo).exists()

    usuarios_grupo_obj = UsuariosGrupo.objects.filter(grupo=grupo, activo=True).select_related('perfil')
    miembros = [usuario_grupo_obj for usuario_grupo_obj in usuarios_grupo_obj]

    # Invitar a un usuario al grupo
    usuario_es_admin = False
    request_invitacion_enviada = False

    if request.user.is_authenticated():
        if usuario_es_miembro:
            # Si el usuario es miembro, revisar si es admin
            if UsuariosGrupo.objects.filter(perfil=perfil_usuario, grupo=grupo, es_admin=True).exists():
                usuario_es_admin = True
        else:
            # Si el usuario no es miembro, revisar si ya envió solicitud
            if RequestInvitacion.objects.filter(grupo=grupo, usuario_invitado=perfil_usuario, aceptado=False,
                                                eliminado=False).exists():
                request_invitacion_enviada = True

    # Requests pendientes de aceptacion al grupo
    requests_entrar_grupo = None
    if usuario_es_miembro:
        if grupo.tipo in [2, 4]:
            # Si solo los admins pueden aceptar !!!
            # Si el usuario es admin, mostrar los requests.
            if usuario_es_admin:
                requests_entrar_grupo = RequestInvitacion.objects.filter(grupo=grupo, aceptado=False, eliminado=False)
        else:
            requests_entrar_grupo = RequestInvitacion.objects.filter(grupo=grupo, aceptado=False, eliminado=False)

    # Libros disponibles en el Grupo
    if queryset == "autor":
        libros_disponibles = LibroDisponibleGrupo.objects.filter(grupo=grupo,
                                                                 activo=True).select_related(
            "libro_disponible").order_by("libro_disponible__libro__autor")
    else:
        libros_disponibles = LibroDisponibleGrupo.objects.filter(grupo=grupo, activo=True).select_related(
            "libro_disponible")

    actualmente_leyendo, libros_leidos_usuario = obtener_usuario_leyendo(perfil_usuario)

    libros_disponibles = [ldg.libro_disponible for ldg in libros_disponibles]

    context = {'grupo': grupo, 'miembros': miembros, 'requests_entrar_grupo': requests_entrar_grupo,
               'usuario_es_admin': usuario_es_admin,
               'usuario_es_miembro': usuario_es_miembro, 'request_invitacion_enviada': request_invitacion_enviada,
               'libros_disponibles': libros_disponibles,
               'filtro': 'libros', 'ordenar_por': queryset, 'actualmente_leyendo': actualmente_leyendo
               }

    return render(request, template, context)
예제 #20
0
def perfil_propio_libros(request):
    """
	Muestra el perfil del usuario loggeado. enfocado en los libros y notificaciones
	"""
    template = "perfiles/perfil_propio_libros.html"
    perfil = obtener_perfil(request.user)
    avatar = obtener_avatar_large(perfil)

    # Libros Perfil
    libros_perfil = {
        'tiene_requests_pendientes': False,
        'tiene_libros_prestados': False,
        'tiene_libros_pedidos': False,
        'tiene_libros_pedidos_bcompartida': False
    }

    libros_requests = libros_prestados = libros_prestados_bcompartida = libros_pedidos = libros_pedidos_bcompartida = []

    if LibrosRequest.objects.filter(perfil_envio=perfil, aceptado=False, eliminado=False).exists():
        libros_perfil['tiene_libros_pedidos'] = True
        libros_pedidos = LibrosRequest.objects.filter(perfil_envio=perfil, aceptado=False, eliminado=False)

    if LibrosRequestBibliotecaCompartida.objects.filter(perfil_envio=perfil, retirado=False, eliminado=False).exists():
        libros_perfil['tiene_libros_pedidos_bcompartida'] = True
        libros_pedidos_bcompartida = LibrosRequestBibliotecaCompartida.objects.filter(perfil_envio=perfil,
                                                                                      retirado=False,
                                                                                      eliminado=False).select_related(
            "libro_disponible")

    if LibrosRequest.objects.filter(perfil_recepcion=perfil, aceptado=False, eliminado=False).exists():
        libros_perfil['tiene_requests_pendientes'] = True
        libros_requests = LibrosRequest.objects.filter(perfil_recepcion=perfil, aceptado=False, eliminado=False)

    if LibrosPrestados.objects.filter(perfil_receptor=perfil, fecha_devolucion=None).exists():
        libros_perfil['tiene_libros_prestados'] = True
        libros_prestados = LibrosPrestados.objects.filter(perfil_receptor=perfil, fecha_devolucion=None)

    if LibrosPrestadosBibliotecaCompartida.objects.filter(perfil_prestamo=perfil, fecha_devolucion=None).exists():
        libros_perfil['tiene_libros_prestados'] = True
        libros_prestados_bcompartida = LibrosPrestadosBibliotecaCompartida.objects.filter(perfil_prestamo=perfil,
                                                                                          fecha_devolucion=None)

    # Grupos Perfil
    grupos = None
    if UsuariosGrupo.objects.filter(perfil=perfil, activo=True).exists():
        usuarios_grupo_obj = UsuariosGrupo.objects.filter(perfil=perfil, activo=True).select_related('grupo')
        grupos = [ug.grupo for ug in usuarios_grupo_obj]

    # Usuario Leyendo
    actualmente_leyendo, libros_leidos_usuario = obtener_usuario_leyendo(perfil)
    libros_disponibles = LibrosDisponibles.objects.filter(perfil=perfil).select_related('libro')

    # autocomplete Usuario Leyendo
    titulos_autocomplete = {}
    autores_autocomplete = {}
    for l in libros_disponibles:
        titulos_autocomplete[l.libro.titulo] = (l.libro.id, l.libro.autor)

    for l in libros_disponibles:
        autores_autocomplete[l.libro.autor] = l.libro.id

    # Request de entrar a grupos a los que el usuario es admin
    requests_entrar_grupo = None
    if UsuariosGrupo.objects.filter(perfil=perfil, es_admin=True).exists():
        usuarios_grupo_obj = UsuariosGrupo.objects.filter(perfil=perfil, es_admin=True).select_related('grupo')
        grupos = [x.grupo for x in usuarios_grupo_obj]

        requests_entrar_grupo = RequestInvitacion.objects.filter(aceptado=False, grupo__in=grupos)

    # Si es admin de una biblioteca, poner link a la biblioteca
    bibliotecas_compartidas = None

    context = {'libros_perfil': libros_perfil, 'libros_requests': libros_requests, 'libros_prestados': libros_prestados,
               'libros_pedidos': libros_pedidos, 'libros_prestados_bcompartida': libros_prestados_bcompartida,
               'libros_pedidos_bcompartida': libros_pedidos_bcompartida, 'libros_disponibles': libros_disponibles,
               'avatar': avatar, 'grupos': grupos, 'actualmente_leyendo': actualmente_leyendo,
               'libros_leidos_usuario': libros_leidos_usuario, 'requests_entrar_grupo': requests_entrar_grupo,
               'titulos_autocomplete': json.dumps(titulos_autocomplete),
               'autores_autocomplete': json.dumps(autores_autocomplete),
               'bibliotecas_compartidas': bibliotecas_compartidas}

    return render(request, template, context)