示例#1
0
def actualizar_burdownchart_sprint(request,id_sprint):
    """
    Permite la creacion o actualizacion del burndown chart
    :param request:
    :param id_sprint:
    :return:
    """
    sprint_seleccionado = Sprint.objects.get(id=id_sprint)
    fecha_sprint_inicio = datetime.combine(sprint_seleccionado.fecha_inicio , datetime.min.time())
    fecha_sprint_fin = datetime.combine(sprint_seleccionado.fecha_fin , datetime.min.time())
    fecha_actual = datetime.now()
    dias_utilizados = fecha_actual - fecha_sprint_inicio
    dias_utilizados = dias_utilizados.days
    dias_restantes = fecha_sprint_fin - fecha_actual
    error = 'ninguno'

    burn_existente_fecha = BurndownChartSprint()

    try:
        burn_existente_fecha = BurndownChartSprint.objects.get(id_sprint=sprint_seleccionado.id,dia = dias_restantes.days+1)
    except:
        pass


    if request.method == 'POST':
        if request.POST.get('horas_trabajadas') is not None:
            #se guarda el burndown chart
            try:
                burn_existente_fecha = BurndownChartSprint.objects.get(id_sprint=sprint_seleccionado.id,dia = dias_restantes.days+1)
                #Si trae quiere decir que existe y solo se actualizara ese burndown chart
                burn_existente_fecha.horas_trabajadas=request.POST.get('horas_trabajadas')
                burn_existente_fecha.save()
                Sistema().registrar("Modificado burn down chart de sprint " + sprint_seleccionado.nombre_sprint, request.user.username,
                            "Ninguno")
            except:
                #Caso contrario se creara el burndown chart
                BurndownChartSprint(id_sprint=sprint_seleccionado.id,dia = dias_restantes.days+1,horas_trabajadas=request.POST.get('horas_trabajadas')).save()
                Sistema().registrar("Modificado burn down chart de sprint " + sprint_seleccionado.nombre_sprint, request.user.username,
                            "Ninguno")

            redireccion = reverse('listar_sprint', args=[sprint_seleccionado.id_proyecto_id])
            return HttpResponseRedirect(redireccion)
        elif request.POST.get('horas_trabajadas') is None:
            error = "horas"
            context = {"burn":burn_existente_fecha,"sprint":sprint_seleccionado,'fecha':dias_utilizados,'dia_actual':dias_utilizados+1,'dias_restantes':dias_restantes.days,'error':error}
            return render(request, "Gestion_de_BurndownChart/actualizar_burndown_chart_sprint.html",context)

    context = {"burn":burn_existente_fecha,"sprint":sprint_seleccionado,'fecha':dias_utilizados,'dia_actual':dias_utilizados+1,'dias_restantes':dias_restantes.days,'error':error}
    return render(request, "Gestion_de_BurndownChart/actualizar_burndown_chart_sprint.html",context)
示例#2
0
def modificar_rol_view(request, id_rol):
    """
    permite la modificacion de un rol a los usuarios con permisos adecuados
    :param request:
    :param id_proyecto:
    :return:
    """

    rol_seleccionado = Group.objects.get(pk=id_rol)

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/listar_roles/')
    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = RolForm(request.POST, instance=rol_seleccionado)
        if formulario.is_valid():
            Sistema().registrar("Modificado rol " + rol_seleccionado.name,
                                request.user.username, "Ninguno")
            formulario.save(rol_seleccionado)
            return HttpResponseRedirect('/listar_roles/')

        return HttpResponseRedirect('/listar_roles/')
    formulario = RolForm(instance=rol_seleccionado)
    return render_to_response("Gestion_de_roles/modificar_rol.html",
                              {"formulario": formulario},
                              context_instance=RequestContext(request))
示例#3
0
def login_view(request):
    """
    Redirecciona a la interfaz de logueo y obtiene los parametros del usuario para verificar
    :param request:
    :return:
    """
    username = password = ''
    status = "valido"
    if request.POST and 'Entrar' in request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                Sistema().registrar("Ingreso al sistema el usuario "+ username+" ",request.user.username,"none")
                return HttpResponseRedirect('/home/')
            else:
                status = "no activo"
                return render_to_response('Sistema/login.html', {'username': username, 'status': status},
                                          context_instance=RequestContext(request))
        else:
            status = "invalido"
            return render_to_response('Sistema/login.html', {'username': username, 'status': status},
                                      context_instance=RequestContext(request))
    if request.POST and 'olvide' in request.POST:
        status = "olvide"
        return render_to_response('Sistema/login.html', {'status': status},
                                      context_instance=RequestContext(request))

    return render_to_response('Sistema/login.html', {'username': username, 'status': status},
                              context_instance=RequestContext(request))
示例#4
0
def logout_view(request):
    """
    Redirecciona al usuario a la interfaz de logueo cerrando la sesion
    :param request:
    :return:
    """
    Sistema().registrar("Salio del sistema el usuario "+ request.user.username+" ",request.user.username,"none")
    logout(request)
    return render_to_response("Sistema/login.html", locals(), context_instance=RequestContext(request))
示例#5
0
def modificar_tablero_kanban_view(request, id_tablero):
    """
    Permite la modificacion de un tablero kanban especificado a la hora de seleccionar
    :param request:
    :param id_tablero:
    :return:
    """
    tablero = TableroKanban.objects.get(pk=id_tablero)
    flujo = Flujo.objects.get(pk=tablero.id_flujo.id)
    actividades = Actividad.objects.filter(id_Flujo_id=flujo.id)
    sprint = Sprint.objects.get(pk=tablero.id_sprint.id)
    proyecto_seleccionado = Proyecto.objects.get(pk=tablero.id_proyecto.id)
    error = "Ninguno"

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/listar_proyecto_kanban/')

    if request.method == 'POST' and 'Guardar' in request.POST:

        if request.POST.get('nombre_tablero') is not None and request.POST.get(
                'sprint') is not None and request.POST.get(
                    "flujo") is not None:
            tablero.nombre_tablero = request.POST.get('nombre_tablero')
            tablero.estado_tablero = request.POST.get('estado')
            tablero.id_sprint = Sprint.objects.get(
                pk=request.POST.get("sprint"))
            tablero.id_flujo = Flujo.objects.get(pk=request.POST.get("flujo"))
            tablero.id_proyecto = Proyecto.objects.get(
                pk=tablero.id_proyecto.id)
            tablero.nombre_proyecto = Proyecto.objects.get(
                pk=tablero.id_proyecto.id).nombre_proyecto
            tablero.save()
            Sistema().registrar("Modificado tablero " + tablero.nombre_tablero,
                                request.user.username, "Ninguno")
            redireccion = reverse('listar_tablero_kanban_proyecto',
                                  args=[tablero.id_proyecto.id])
            return HttpResponseRedirect(redireccion)
        else:
            error = "Incompleto"

    context = {
        'tablero': tablero,
        "proyecto": proyecto_seleccionado,
        "flujos": flujo,
        "sprints": sprint,
        "error": error
    }
    return render_to_response(
        "Gestion_de_tablero_kanban/modificar_tablero.html",
        context,
        context_instance=RequestContext(request))
示例#6
0
def eliminar_rol_view(request,
                      id_rol,
                      template_name='Gestion_de_roles/eliminar_rol.html'):
    """
    La funcion Eliminar elimina un rol seleccionado
    :param id_rol: el id del rol que sera eliminado
    :return:
    """

    rol_seleccionado = Group.objects.get(pk=id_rol)
    nombre = rol_seleccionado.name
    if request.method == 'POST' and 'Aceptar' in request.POST:
        Group.delete(rol_seleccionado)
        Sistema().registrar("Eliminado rol " + rol_seleccionado.name,
                            request.user.username, "Ninguno")
        return HttpResponseRedirect('/listar_roles/')
    else:
        return render(request, template_name, {'nombre': nombre})
示例#7
0
def eliminar_usuario_view(
        request,
        id_usuario,
        template_name='Gestion_de_usuarios/eliminar_usuario.html'):
    """
    La funcion Eliminar en realidad solo cambia el estado del usuario en la base de datos
    dejandolo inactivo, a fin de tener un registro sobre el historial de los usuarios creados.
    :param id_usuario: el id del usuario que sera modificado
    :return:
    """
    usuario_seleccionado = Usuario.objects.get(pk=id_usuario)
    nombre = usuario_seleccionado.username
    if request.method == 'POST' and 'Aceptar' in request.POST:
        usuario_seleccionado.is_active = False
        usuario_seleccionado.save()
        Sistema().registrar("desactivado usuario " + nombre + " ",
                            request.user.username, "none")
        return HttpResponseRedirect('/listar_usuarios/')
    else:
        return render(request, template_name, {'nombre': nombre})
示例#8
0
def consultar_release_view(request, id_release):
    """
    Permite la consulta de un release a partir del proyecto que es seleccionado
    :param request:
    :param id_proyecto:
    :return:
    """

    release_seleccionado = Release.objects.get(pk=id_release)
    userstories_de_release = release_seleccionado.userstory_set.all()
    context = {
        'release': release_seleccionado,
        'userstories': userstories_de_release
    }

    Sistema().registrar("Consuldta de " + release_seleccionado.nombre,
                        request.user.username, "Ninguno")

    return render(request, 'Gestion_de_Releases/consultar_release.html',
                  context)
示例#9
0
def listar_releases_view(request, id_proyecto):
    """
    Permite listar releases de un proyecto seleccinado
    :param request:
    :param id_proyecto:
    :return:
    """

    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)

    if request.method == 'POST':
        form = Release_Buscar_form(request.POST)
        if form.is_valid():
            busqueda = form.cleaned_data.get('Busqueda')
            if busqueda == '':
                releases = Release.objects.filter(
                    proyecto=proyecto_seleccionado)
            else:
                releases = Release.objects.filter(
                    proyecto=proyecto_seleccionado).filter(nombre=busqueda)
        else:
            form = Release_Buscar_form()
    else:
        form = Release_Buscar_form()
        releases = Release.objects.filter(proyecto=proyecto_seleccionado)

    Sistema().registrar(
        "Listado de Releases del proyecto " +
        proyecto_seleccionado.nombre_proyecto, request.user.username,
        "Ninguno")

    context = {
        'form': form,
        'releases': releases,
        'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
    }
    return render(request,
                  'Gestion_de_Releases/lista_releases_de_proyecto.html',
                  context)
示例#10
0
def eliminar_sprint_view(request, id_proyecto, id_sprint):
    """
    Permite la eliminacion de un sprint especificado en el id_sprint perteneciente al
    proyecto con id id_proyecto
    :param request:
    :param id_proyecto:
    :param id_sprint:
    :return:
    """
    sprint_seleccionado = Sprint.objects.get(pk=id_sprint)
    nombre = sprint_seleccionado.nombre_sprint

    if request.method == 'POST' and 'Aceptar' in request.POST:
        sprint_seleccionado.delete()
        Sistema().registrar("Eliminado sprint " + nombre, request.user.username, "Ninguno")
        redireccion = reverse('listar_sprint', args=[id_proyecto])
        return HttpResponseRedirect(redireccion)
    if request.method == 'POST' and 'Cancelar' in request.POST:
        redireccion = reverse('listar_sprint', args=[id_proyecto])
        return HttpResponseRedirect(redireccion)

    return render(request, "Gestion_de_sprints/eliminar_sprint.html", {'nombre': nombre})
示例#11
0
def crear_rol_view(request):
    """
    Permite la creacion de un rol
    :param request:
    :return:
    """

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/home/')

    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = RolForm(request.POST)
        if formulario.is_valid():
            formulario.save()
            Sistema().registrar("Creado rol ", request.user.username,
                                "Ninguno")
            return HttpResponseRedirect('/listar_roles/')

    formulario = RolForm()
    return render_to_response(
        "Gestion_de_roles/crear_rol.html",
        {'formulario': formulario},
        context_instance=RequestContext(request),
    )
示例#12
0
def modificar_proyecto_view(request, id_proyecto):
    """
    permite la modificacion de un proyecto que no posea un estado de finalizado o cancelado a los usuarios con permisos adecuados
    :param
    request:
    :param id_proyecto:
    :return:
    """
    usuario = request.user
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)
    formulario_original = proyecto_seleccionado
    cliente_proyecto = proyecto_seleccionado.cliente

    if (not usuario.has_perm('GestiondeProyectos.modificar_proyecto')
            or proyecto_seleccionado.scrum_master.id != usuario.id
        ) and not usuario.groups.filter(name='Administrador').exists():
        msg = 'El usuario no tiene permiso para modificar el proyecto'
        return render(request, 'Sistema/403.html', {'msg': msg})

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/listar_proyecto')

    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = ModificarProyectoForm(request.POST,
                                           instance=proyecto_seleccionado)

        #Control para que no pase de estado activo a pendiente
        if (formulario_original.estado_proyecto.upper == "ACTIVO"
                and request.POST.get('estado_proyecto').upper == "PENDIENTE"):
            mensaje = "estado_activo_pendiente"
            formulario = ModificarProyectoForm(instance=proyecto_seleccionado)
            context = {
                'formulario': formulario,
                'id_proyecto': id_proyecto,
                "error": mensaje,
                'cliente': cliente_proyecto
            }
            return render_to_response(
                'Gestion_de_Proyectos/modificar_proyecto.html',
                context,
                context_instance=RequestContext(request))

        #Control para que la fecha de inicio sea mayor a la fecha de finalizacion
        if request.POST.get('fecha_inicio') >= request.POST.get(
                'fecha_finalizacion'):
            context = {
                'formulario': formulario,
                'error': 'fechas',
                'id_proyecto': id_proyecto
            }
            return render(request,
                          'Gestion_de_Proyectos/modificar_proyecto.html',
                          context)

        #Control para que en caso de modificarse el equipo de desarrollo no se deje sin seleccionar al equipo
        if request.POST.getlist('equipo_desarrollo') is None:
            context = {
                'formulario': formulario,
                'error': 'equipo',
                'id_proyecto': id_proyecto
            }
            return render(request,
                          'Gestion_de_Proyectos/modificar_proyecto.html',
                          context)

        #Control para que se coloque una descripcion del proyecto
        if request.POST.get('descripcion_proyecto') is None:
            context = {
                'formulario': formulario,
                'error': 'descripcion',
                'id_proyecto': id_proyecto
            }
            return render(request,
                          'Gestion_de_Proyectos/modificar_proyecto.html',
                          context)

        print(request.POST.get('estado_proyecto'))
        #Control de que si el proyecto pasa a estado finalizado todos los sprints y us deben ser finalizados
        if request.POST.get('estado_proyecto').upper() == 'FINALIZADO':
            existen_sprints_activos_o_pendientes = False
            try:
                sprints_proyecto = Sprint.objects.filter(
                    id_proyecto=id_proyecto)

                for item in sprints_proyecto:

                    if item.estado.upper() == 'PENDIENTE' or item.estado.upper(
                    ) == 'ACTIVO':
                        existen_sprints_activos_o_pendientes = True

                if existen_sprints_activos_o_pendientes:
                    mensaje = "sprints_activos_o_pendientes"
                    context = {
                        'formulario': formulario,
                        'error': mensaje,
                        'id_proyecto': id_proyecto
                    }
                    return render(
                        request,
                        'Gestion_de_Proyectos/modificar_proyecto.html',
                        context)
            except:
                pass

            try:
                us_proyecto = UserStory.objects.filter(proyecto_id=id_proyecto)
                existen_us_activos_o_pendientes = False

                for item in us_proyecto:
                    if item.estado.upper() == 'PENDIENTE' or item.estado.upper(
                    ) == 'ACTIVO':
                        existen_us_activos_o_pendientes = True

                if existen_us_activos_o_pendientes:
                    mensaje = "us_activos_o_pendientes"
                    context = {
                        'formulario': formulario,
                        'error': mensaje,
                        'id_proyecto': id_proyecto
                    }
                    return render(
                        request,
                        'Gestion_de_Proyectos/modificar_proyecto.html',
                        context)
            except:
                pass

        if not request.POST.get('scrum_master') is None:
            proyecto_seleccionado.scrum_master = Usuario.objects.get(
                pk=request.POST.get('scrum_master'))

        proyecto_seleccionado.fecha_finalizacion = request.POST.get(
            'fecha_finalizacion')
        proyecto_seleccionado.descripcion_proyecto = request.POST.get(
            'descripcion_proyecto')
        proyecto_seleccionado.cliente = Usuario.objects.get(
            pk=(request.POST.get('cliente')))
        equipo_seleccionado = request.POST.getlist('equipo_desarrollo')
        proyecto_seleccionado.equipo_desarrollo.clear()
        proyecto_seleccionado.estado_proyecto = request.POST.get(
            'estado_proyecto')

        for item in equipo_seleccionado:
            participante = Usuario.objects.get(pk=item)
            proyecto_seleccionado.equipo_desarrollo.add(participante)

        proyecto_seleccionado.save()

        Sistema().registrar(
            "Modificado proyecto " + request.POST.get('nombre_proyecto'),
            request.user.username, "Ninguno")
        return HttpResponseRedirect('/listar_proyecto')

    formulario = ModificarProyectoForm(instance=proyecto_seleccionado)
    context = {
        'formulario': formulario,
        'id_proyecto': id_proyecto,
        'cliente': cliente_proyecto
    }
    return render_to_response('Gestion_de_Proyectos/modificar_proyecto.html',
                              context,
                              context_instance=RequestContext(request))
示例#13
0
def modificar_usuario_view(request, id_usuario):
    """
    Redirecciona al usuario la modificacion de un usuario especifico
    :param id_usuario: el id del usuario que sera modificado
    :return:
    """
    grupos_permisos = Group.objects.all()

    #Se obtienen los datos del usuario
    usuario_seleccionado = Usuario.objects.get(pk=id_usuario)
    roles_asignados = usuario_seleccionado.groups.all()
    usuario_pass_hash = usuario_seleccionado.password

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/listar_usuarios/')

    if request.method == 'POST' and 'Guardar' in request.POST:
        usuario_seleccionado.username = request.POST.get('username')
        usuario_seleccionado.first_name = request.POST.get('firstname')
        usuario_seleccionado.telefono = request.POST.get('telefono')
        usuario_seleccionado.observacion = request.POST.get('observacion')
        usuario_seleccionado.domicilio = request.POST.get('domicilio')
        usuario_seleccionado.password = request.POST.get('password')
        usuario_seleccionado.last_name = request.POST.get('lastname')
        usuario_seleccionado.email = request.POST.get('email')
        roles_asignados = request.POST.getlist('agregar')

        if request.POST.get('activo'):
            usuario_seleccionado.is_active = True
        else:
            usuario_seleccionado.is_active = False

        #Controlara que se haya asignado un rol como minimo al modificar
        if len(roles_asignados) == 0:
            return render_to_response(
                "Gestion_de_usuarios/modificar_usuario.html", {
                    'error': "roles",
                    'usuario': usuario_seleccionado,
                    'grupos': grupos_permisos,
                    'roles': roles_asignados
                },
                context_instance=RequestContext(request))

            #Controla que no se hayan dejado en blanco ningun campo
        if usuario_seleccionado.username != '' and usuario_seleccionado.password != '' and usuario_seleccionado.last_name != '' and usuario_seleccionado.email != '':
            usuario_seleccionado.groups.clear()
            #Se agrega el rol que poseera el usuario
            for item in roles_asignados:
                group = Group.objects.get(pk=item)
                usuario_seleccionado.groups.add(group)

            if usuario_seleccionado.password != usuario_pass_hash:
                usuario_seleccionado.password = make_password(
                    usuario_seleccionado.password, salt=None, hasher='default')

            usuario_seleccionado.save()
            Sistema().registrar(
                "modificado usuario " + usuario_seleccionado.username + " ",
                request.user.username, "none")
            return HttpResponseRedirect('/listar_usuarios/')
        else:
            return render_to_response(
                "Gestion_de_usuarios/modificar_usuario.html", {
                    'error': "vacio",
                    'usuario': usuario_seleccionado,
                    'grupos': grupos_permisos,
                    'roles': roles_asignados
                },
                context_instance=RequestContext(request))

    return render_to_response("Gestion_de_usuarios/modificar_usuario.html", {
        "usuario": usuario_seleccionado,
        'grupos': grupos_permisos,
        'roles': roles_asignados
    },
                              context_instance=RequestContext(request))
示例#14
0
def crear_tablero_kanban_view(request, id_proyecto):
    """
    Permite la generacion de un tablero kanban al proyecto que posee el id de id_proyecto
    :param request:
    :param id_proyecto:
    :return:
    """
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)
    flujos = Flujo.objects.filter(id_Proyecto=id_proyecto)
    sprints = Sprint.objects.filter(id_proyecto=id_proyecto, estado="Activo")
    sprints_copy = []
    tablero = TableroKanban()
    error = "Ninguno"

    #Controla que no exista otro sprint que se encuentre activo
    lista_sprint = list(Sprint.objects.filter(id_proyecto=id_proyecto))
    sprints_activos = []
    for item in lista_sprint:
        if item.estado == "ACTIVO":
            sprints_activos.append(item)

    if len(sprints_activos) >= 1:
        error = "sprint activo"
        context = {
            'tablero': tablero,
            "proyecto": proyecto_seleccionado,
            "flujos": flujos,
            "sprints": sprints,
            "error": error
        }
        return render_to_response(
            "Gestion_de_tablero_kanban/crear_tablero.html",
            context,
            context_instance=RequestContext(request))

    #Controla que existan sprint antes de realizar la creacion del tablero
    if len(sprints) == 0:
        error = "cree sprint"
        context = {
            'tablero': tablero,
            "proyecto": proyecto_seleccionado,
            "flujos": flujos,
            "sprints": sprints,
            "error": error
        }
        return render_to_response(
            "Gestion_de_tablero_kanban/crear_tablero.html",
            context,
            context_instance=RequestContext(request))

    uss = []
    #Obtiene los us que fueron asignados a ese sprint
    for item in sprints:
        uss = UserStory.objects.filter(proyecto_id=id_proyecto,
                                       nombre_sprint=item.nombre_sprint)
        if len(uss) > 0:
            sprints_copy.append(item)

    for item in uss:
        if item.usuario_asignado_id:
            error == "ningun_usuario"

    if error == "ningun_usuario":
        context = {
            'tablero': tablero,
            "proyecto": proyecto_seleccionado,
            "flujos": flujos,
            "sprints": sprints,
            "error": error
        }
        return render_to_response(
            "Gestion_de_tablero_kanban/crear_tablero.html",
            context,
            context_instance=RequestContext(request))

    sprints = sprints_copy

    #Controla que existan mas de un US dentro del sprint
    if len(sprints) == 0:
        error = "asigne us"
        context = {
            'tablero': tablero,
            "proyecto": proyecto_seleccionado,
            "flujos": flujos,
            "sprints": sprints,
            "error": error
        }
        return render_to_response(
            "Gestion_de_tablero_kanban/crear_tablero.html",
            context,
            context_instance=RequestContext(request))

    #Controla que existan flujos para la creacion del tablero kanban
    if len(flujos) == 0:
        error = "asigne flujo"
        context = {
            'tablero': tablero,
            "proyecto": proyecto_seleccionado,
            "flujos": flujos,
            "sprints": sprints,
            "error": error
        }
        return render_to_response(
            "Gestion_de_tablero_kanban/crear_tablero.html",
            context,
            context_instance=RequestContext(request))

    if request.method == 'POST' and 'Guardar' in request.POST:
        if request.POST.get('nombre_tablero') is not None and request.POST.get(
                'sprint') is not None and request.POST.get(
                    "flujo") is not None:

            try:
                error = "Contenido"
                tablero1 = TableroKanban.objects.get(
                    id_proyecto_id=id_proyecto,
                    id_sprint_id=request.POST.get('sprint'),
                    id_flujo_id=request.POST.get('flujo'))
                #Si pasa esta linea quiere decir que existe un tablero con las mismas caracteristicas en el proyecto, debe mostrar el error
                context = {
                    'tablero': tablero,
                    "proyecto": proyecto_seleccionado,
                    "flujos": flujos,
                    "sprints": sprints,
                    "error": error,
                    'tablero_copy': tablero1
                }
                return render_to_response(
                    "Gestion_de_tablero_kanban/crear_tablero.html",
                    context,
                    context_instance=RequestContext(request))
            except:
                #Si salta la excepcion quiere decir que no existe un tablero con el mismo contenido, por tanto puede continuar
                pass

            try:
                #va a buscar en la bd si existe el tablero con el nombre indicado, de esa manera se
                #controla que los nombre de los tableros no coincidan
                error = "Nombre"
                tablero2 = TableroKanban.objects.get(
                    nombre_tablero=request.POST.get('nombre_tablero'))
                #si pasa a esta linea quiere decir que el tablero existe, debe mostrar un cuadro indicando el error
                context = {
                    'tablero': tablero,
                    "proyecto": proyecto_seleccionado,
                    "flujos": flujos,
                    "sprints": sprints,
                    "error": error,
                    'tablero_copy': tablero1
                }
                return render_to_response(
                    "Gestion_de_tablero_kanban/crear_tablero.html",
                    context,
                    context_instance=RequestContext(request))
            except:
                pass

                tablero.nombre_tablero = request.POST.get('nombre_tablero')
                tablero.estado_tablero = request.POST.get('estado')
                sprint = Sprint.objects.get(pk=request.POST.get("sprint"))
                flujo = Flujo.objects.get(pk=request.POST.get("flujo"))
                flujo.id_sprint = sprint.id
                flujo.save()

                uss = UserStory.objects.filter(
                    proyecto_id=id_proyecto,
                    nombre_sprint=sprint.nombre_sprint)
                actividades = list(Actividad.objects.filter(id_Flujo_id=flujo))

                for us in uss:
                    if us.estado != "En Curso":
                        us.estado = "En Curso"
                        us.id_flujo = flujo.id
                        us.id_actividad = actividades[0].id
                        us.save()

                tablero.id_sprint = sprint
                tablero.id_flujo = flujo
                tablero.id_proyecto = Proyecto.objects.get(pk=id_proyecto)
                tablero.nombre_proyecto = Proyecto.objects.get(
                    pk=id_proyecto).nombre_proyecto
                tablero.save()

                Sistema().registrar(
                    "Creado tablero kanban " +
                    request.POST.get('nombre_tablero') + " para proyecto " +
                    Proyecto.objects.get(pk=id_proyecto).nombre_proyecto,
                    request.user.username, "Ninguno")
                redireccion = reverse('listar_tablero_kanban_proyecto',
                                      args=[id_proyecto])
                return HttpResponseRedirect(redireccion)
        else:
            error = "Incompleto"

    context = {
        'tablero': tablero,
        "proyecto": proyecto_seleccionado,
        "flujos": flujos,
        "sprints": sprints,
        "error": error
    }
    return render_to_response("Gestion_de_tablero_kanban/crear_tablero.html",
                              context,
                              context_instance=RequestContext(request))
示例#15
0
def modificar_sprint_view(request, id_proyecto, id_sprint):
    """
    Permite la modificacion de ciertos atributos que posee un sprint que es especificado por el id id_sprint
    y pertenece al proyecto con id id_proyecto
    :param request:
    :param id_proyecto:
    :param id_sprint:
    :return:
    """
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)
    sprint_seleccionado = Sprint.objects.get(pk=id_sprint)
    estado_inicial = sprint_seleccionado.estado
    numero_de_sprint = sprint_seleccionado.numero_sprint

    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = modificar_sprint_form(request.POST, instance=sprint_seleccionado)
        if formulario.is_valid():
            fecha_inicio_temp = request.POST.get('fecha_inicio')
            fecha_fin_temp = request.POST.get('fecha_fin')

            #Se controlara que no existan 2 sprint con estados activos
            if request.POST.get('estado').upper() == "ACTIVO":
                otros_activos = Sprint.objects.filter(id_proyecto_id=id_proyecto ,estado="Activo")

                if(len(otros_activos) > 0):
                    error = "activo"
                    context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': error,'sprint': sprint_seleccionado}
                    return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)


            #Se controla que la fecha de inicio del sprint sea menor  a la fecha de fin del sprint
            if control_fecha(fecha_inicio_temp,fecha_fin_temp) == False:
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'fechas','sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

            #Se controla que la fecha de inicio del sprint sea menor a la fecha de fin del proyecto
            if control_fecha(fecha_inicio_temp, str(proyecto_seleccionado.fecha_finalizacion)) == False:
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,'error': 'finalizacion_proyecto', 'sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

            #Se controla que la fecha de inicio del sprint sea superior a la fecha de inicio del proyecto
            if control_fecha(str(proyecto_seleccionado.fecha_inicio),fecha_inicio_temp) == False:
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,'error': 'inicio_proyecto', 'sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

            #Se controla que la fecha de fin del sprint sea menor a la fecha de fin del proyecto
            if control_fecha(fecha_fin_temp, str(proyecto_seleccionado.fecha_finalizacion)) == False:
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,'error': 'fin_proyecto', 'sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

            #Se controla que no vuelva a un estado pendiente si posee un estado activo
            if estado_inicial.upper() == "ACTIVO" and request.POST.get('estado').upper() == "PENDIENTE":
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,'error': 'estado', 'sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

            #Se controla que no vuelva a un estado pendiente si posee un estado activo
            if estado_inicial.upper() != "ACTIVO" and request.POST.get('estado').upper() == "FINALIZADO":
                context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,'error': 'estado_salteado', 'sprint': sprint_seleccionado}
                return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)


            #Se reasignara los US si se cambia a estado finalizado
            if request.POST.get('estado').upper() == "FINALIZADO":
                equipo =  Usuario.objects.filter(equipo_desarrollo=sprint_seleccionado.id_proyecto_id)
                uss = list(UserStory.objects.filter(nombre_sprint=sprint_seleccionado.nombre_sprint))
                ultima_actividad = []
                completados_todos = True
                mayor_size = 0
                error = "Ninguno"
                us_no_finalizados = []
                porcentaje_total = 100
                horas_en_un_dia = 12
                for us in uss:
                    if us.porcentaje_realizado < porcentaje_total:
                        completados_todos = False
                        us_no_finalizados.append(us)
                        ultima_actividad.append(Actividad.objects.get(id=us.id_actividad or 0))

                        try:
                            #Se realiza en un try porque us.horas_dedicadas puede ser 0
                            dias_trabajados = horas_en_un_dia/us.horas_dedicadas
                        except:
                            dias_trabajados = 0

                        dias_restantes = us.size - dias_trabajados
                        if dias_restantes > mayor_size:
                            mayor_size = dias_restantes

                uss = us_no_finalizados
                lista = zip(uss,ultima_actividad)

                if completados_todos == False:
                    #existen US que no finalizaron
                    try:
                        prox_sprint = Sprint.objects.get(numero_sprint=numero_de_sprint+1)
                        for us in uss:
                            if us.porcentaje_realizado < porcentaje_total:
                                us.nombre_sprint = prox_sprint.nombre_sprint
                                us.save()

                        formulario.save()
                        Sistema().registrar("Modificado Sprint " + sprint_seleccionado.nombre_sprint , request.user.username,  "Ninguno")

                        context = {'equipo':equipo,'lista':lista,'prox_sprint':prox_sprint,'error':error,'mayor_size':mayor_size}
                    except:
                        error = "falta_sprint"
                        context = {'equipo':equipo,'lista':lista,'error':error,'mayor_size':mayor_size}

                    return render(request,'Gestion_de_sprints/reasignacion_de_us.html',context)
                if completados_todos == True:
                    formulario.save()
                    Sistema().registrar("Modificado Sprint " + sprint_seleccionado.nombre_sprint , request.user.username,  "Ninguno")
                    redireccion = reverse('listar_sprint', args=[id_proyecto])
                    return HttpResponseRedirect(redireccion)

            formulario.save()
            Sistema().registrar("Modificado Sprint " + sprint_seleccionado.nombre_sprint , request.user.username,  "Ninguno")
            redireccion = reverse('listar_sprint', args=[id_proyecto])
            return HttpResponseRedirect(redireccion)
        else:
            context = {'formulario': formulario, 'proyecto': proyecto_seleccionado,
                        'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'camposobligatorios',
                        'sprint': sprint_seleccionado}
            return render(request, 'Gestion_de_sprints/modificar_sprint.html', context)

    formulario = modificar_sprint_form(instance=sprint_seleccionado)
    context = {'formulario': formulario, 'proyecto': proyecto_seleccionado, 'error': 'ninguno',
                   'sprint': sprint_seleccionado}
    return render_to_response("Gestion_de_sprints/modificar_sprint.html", context,
                                  context_instance=RequestContext(request))
示例#16
0
def crear_release_view(request, id_proyecto):
    """
    Permite crear un release en un proyecto seleccinado
    :param request:
    :param id_proyecto:
    :return:
    """
    releases = Release.objects.all().order_by('-fecha')
    if len(releases):
        version_anterior = "La version del release anterior es el " + releases[
            0].version
    else:
        version_anterior = "Este es el primer Release del proyecto"

    userstories = UserStory.objects.filter(proyecto=id_proyecto).filter(
        estado='APROBADO').filter(release__isnull=True)
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)

    if request.method == 'POST' and 'Guardar' in request.POST:
        nombre = request.POST.get('nombre_release')
        version = request.POST.get('version_release')
        descripcion = request.POST.get('descripcion_release')
        us_seleccionados_id = request.POST.getlist('us_seleccionados')

        if nombre == '' or version == '' or descripcion == '':
            context = {
                'version_anterior': version_anterior,
                'userstories': userstories,
                'error': 'campos',
                'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
            }
            return render(request, 'Gestion_de_Releases/crear_release.html',
                          context)

        if len(us_seleccionados_id) == 0:
            context = {
                'version_anterior': version_anterior,
                'userstories': userstories,
                'error': 'seleccion_us',
                'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
            }
            return render(request, 'Gestion_de_Releases/crear_release.html',
                          context)

        release = Release(nombre=nombre,
                          version=version,
                          descripcion=descripcion,
                          proyecto=proyecto_seleccionado)
        release.save()

        for us_seleccionado_id in us_seleccionados_id:
            us_tmp = UserStory.objects.get(pk=us_seleccionado_id)
            us_tmp.release = release
            us_tmp.save()

            Sistema().registrar(
                "Creacion de Release en el proyecto " +
                proyecto_seleccionado.nombre_proyecto, request.user.username,
                "Ninguno")

        redireccion = reverse('listar_releases_proyecto', args=[id_proyecto])
        return HttpResponseRedirect(redireccion)

    context = {
        'version_anterior': version_anterior,
        'userstories': userstories,
        'error': 'ninguno',
        'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
    }
    return render(request, 'Gestion_de_Releases/crear_release.html', context)
示例#17
0
def cambio_us_actividad_estado_tablero_kanban_view(request, id_tablero, id_us):
    """
    Permite cambiar de actividad el US al usuario que posea los permisos adecuados
    :param request:
    :param id_tablero:
    :param id_us:
    :return:
    """
    us = UserStory.objects.get(pk=id_us)
    tablero = TableroKanban.objects.get(pk=id_tablero)
    flujo = Flujo.objects.get(pk=tablero.id_flujo.id)
    actividades = Actividad.objects.filter(id_Flujo_id=flujo.id)
    copy_actividades = list(actividades)
    rol = ""
    ultima_actividad = Actividad.objects.get(id=us.id_actividad)
    siguiente_actividad = ultima_actividad
    us_completado = False

    #Se obtiene el rol del usuario para limitar las vistas
    for permiso in request.user.groups.all():
        if permiso.name == "Scrum Master":
            rol = "Scrum Master"
            break
        if permiso.name == "Desarrollador":
            rol = "Desarrollador"

    #Se obtendra la siguiente actividad a realizar cuando el US posea estado Done
    if us.estado_en_actividad == 'Done':
        for index in range(len(copy_actividades)):
            if ultima_actividad == copy_actividades[index]:
                if len(copy_actividades) > index + 1:
                    siguiente_actividad = copy_actividades[index + 1]
                    break

    if us.id_actividad == copy_actividades.pop(
    ).id and us.estado_en_actividad == "Done":
        us_completado = True

    ######################
    #rol = "Desarrollador"
    ######################

    if request.method == 'POST':
        if us_completado and rol == "Desarrollador":
            estado_en_actividad = "Done"
        else:
            estado_en_actividad = request.POST.get('estado') or "ToDo"

        if request.POST.get('comentario') == "":
            error = "comentario"
            context = {
                'tablero': tablero,
                'actividades': actividades,
                "siguiente_actividad": siguiente_actividad,
                'error': error,
                'us': us,
                "rol": rol,
                "us_completado": us_completado
            }
            return render(
                request,
                'Gestion_de_tablero_kanban/cambio_actividad_estado.html',
                context)

        contenido_comentario = request.POST.get('comentario')
        comentario = Comentario(comentario=contenido_comentario,
                                autor=request.user.username,
                                us_id=id_us)
        comentario.save()

        id_actividad = request.POST.get('actividad') or us.id_actividad
        us.id_actividad = id_actividad
        us.porcentaje_realizado = request.POST.get('porcentaje_realizado')
        us.horas_dedicadas = request.POST.get('horas_dedicadas')
        us.estado_en_actividad = estado_en_actividad
        us.save()

        if int(us.porcentaje_realizado) == 100:
            proyecto = Proyecto.objects.get(id=us.proyecto_id)
            scrum_master = Usuario.objects.get(id=proyecto.scrum_master.id)
            enviar_notificacion("Finalizacion de US ", us.nombre,
                                scrum_master.email, '*****@*****.**')

        #Se debe agregar un comentario o un archivo para que se guarde el cambio de estado
        #Seccion para agregar un archivo a un US para realizar el cambio de actividad o estado
        if request.POST.get('image') is not None:
            fecha_path = str(datetime_safe.date.today()).split("-")
            archivo_request = request.FILES['image']
            archivo_a_adjuntar = FileAttached_model()
            archivo_a_adjuntar.file = archivo_request
            archivo_a_adjuntar.file_name = archivo_request.name
            archivo_a_adjuntar.file_path = settings.MEDIA_URL + 'subidos/' + fecha_path[
                0] + '/' + fecha_path[1] + '/' + fecha_path[2] + '/'
            #archivo_a_adjuntar.save()

        #if request.POST.get('image') is None and request.POST.get('comentario'):
        #print error, debe ingresar uno de los dos para guardar el cambio de estado o actividad del US

        Sistema().registrar(
            "Cambio US " + us.nombre + " a actividad " +
            ultima_actividad.nombre_actividad + " con estado " +
            us.estado_en_actividad, request.user.username, "Ninguno")
        redireccion = reverse('visualizar_tablero_kanban', args=[id_tablero])
        return HttpResponseRedirect(redireccion)

    context = {
        'tablero': tablero,
        'actividades': actividades,
        "siguiente_actividad": siguiente_actividad,
        'us': us,
        "rol": rol,
        "us_completado": us_completado
    }
    return render(request,
                  'Gestion_de_tablero_kanban/cambio_actividad_estado.html',
                  context)
示例#18
0
def crear_sprint_view(request, id_proyecto):
    """
    Permite la creacion de un sprint de limitando a un proyecto en especifico
    :param request:
    :param id_proyecto:
    :return:
    """
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)
    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = sprint_form(request.POST)
        if formulario.is_valid():
            nombre_sprint_temp = request.POST.get('nombre_sprint')
            fecha_inicio_temp = request.POST.get('fecha_inicio')
            fecha_fin_temp = request.POST.get('fecha_fin')


            #Se controla que la fecha de inicio del sprint sea menor  a la fecha de fin del sprint
            if control_fecha(fecha_inicio_temp,fecha_fin_temp) == False:
                context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'fechas'}
                return render(request, 'Gestion_de_sprints/crear_sprint.html', context)

            #Se controla que la fecha de inicio del sprint sea menor a la fecha de fin del proyecto
            if control_fecha(fecha_inicio_temp, str(proyecto_seleccionado.fecha_finalizacion)) == False:
                context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'finalizacion_proyecto'}
                return render(request, 'Gestion_de_sprints/crear_sprint.html', context)

            #Se controla que la fecha de inicio del sprint sea superior a la fecha de inicio del proyecto
            if control_fecha(str(proyecto_seleccionado.fecha_inicio),fecha_inicio_temp) == False:
                context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'inicio_proyecto'}
                return render(request, 'Gestion_de_sprints/crear_sprint.html', context)

            #Se controla que la fecha de fin del sprint sea menor a la fecha de fin del proyecto
            if control_fecha(fecha_fin_temp, str(proyecto_seleccionado.fecha_finalizacion)) == False:
                context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'fin_proyecto'}
                return render(request, 'Gestion_de_sprints/crear_sprint.html', context)


            try:
                #Si ya existe un sprint con este nombre y en el mismo proyecto no va a explotar, quiere decir que esta mal, si no existe se puede guardar
                sprint_prueba = Sprint.objects.get(nombre_sprint=nombre_sprint_temp,id_proyecto_id=id_proyecto)
                context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,
                       'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'nombre'}
                return render(request, 'Gestion_de_sprints/crear_sprint.html', context)
            except:
                pass


            numero_sprint = proyecto_seleccionado.cantidad_sprints + 1
            sprint = Sprint(nombre_sprint=nombre_sprint_temp, fecha_inicio=fecha_inicio_temp, fecha_fin=fecha_fin_temp,
                            id_proyecto=proyecto_seleccionado,numero_sprint=numero_sprint)
            sprint.estado = "Pendiente"
            sprint.save()
            proyecto_seleccionado.cantidad_sprints+=1
            proyecto_seleccionado.save()

            Sistema().registrar("Creado Sprint " + sprint.nombre_sprint , request.user.username,  "Ninguno")
            redireccion = reverse('listar_sprint', args=[id_proyecto])
            return HttpResponseRedirect(redireccion)
        else:
            context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,
                       'nombre_proyecto': proyecto_seleccionado.nombre_proyecto, 'error': 'camposobligatorios'}
            return render(request, 'Gestion_de_sprints/crear_sprint.html', context)

    formulario = sprint_form()
    context = {'formulario': formulario, 'nro_sprint': proyecto_seleccionado.cantidad_sprints+1,
               'nombre_proyecto': proyecto_seleccionado.nombre_proyecto}
    return render_to_response("Gestion_de_sprints/crear_sprint.html", context, context_instance=RequestContext(request))
示例#19
0
def modificar_userstory_view(request, id_userStory):
    """
    Permite realizar la modificacion de un user story
    :param request:
    :return:
    """
    usuario = request.user
    us_seleccionado = UserStory.objects.get(pk=id_userStory)
    proyecto = us_seleccionado.proyecto
    upload_form = FileAttached_form()
    usuario_es_scrum = proyecto.scrum_master.id == usuario.id
    usuario_es_desarrollador = proyecto.equipo_desarrollo.filter(
        pk=usuario.id).exists()
    archivo = ''

    if not usuario_es_scrum and not usuario_es_desarrollador:
        print("chau!")

    if request.method == 'POST' and 'Guardar' in request.POST:

        nombre = request.POST.get('nombre')
        descripcion = request.POST.get('descripcion')
        prioridad = request.POST.get('prioridad')
        estado = request.POST.get('estado')
        valor_de_negocio = request.POST.get('valor_de_negocio')
        valor_tecnico = request.POST.get('valor_tecnico')
        porcentaje_realizado = request.POST.get('porcentaje_realizado')
        usuario_asignado = request.POST.get('usuario_asignado')
        size = request.POST.get('size')
        comentario_us = request.POST.get('comentario')
        horas_trabajadas = request.POST.get('horas_trabajadas')

        try:
            sprint_seleccionado = Sprint.objects.get(
                id=request.POST.get('sprint'))
            nombre_sprint = sprint_seleccionado.nombre_sprint
        except:
            nombre_sprint = "No Asignado"

        try:
            if FileAttached_model.objects.get(userstory_id=0) != None:
                archivo = FileAttached_model.objects.get(userstory_id=0)
                archivo.userstory_id = id_userStory
                archivo.save()
        except:
            pass

        if usuario_es_scrum:
            formulario = ModificarUserStoryForm(
                us_seleccionado.proyecto,
                us_seleccionado.estado,
                us_seleccionado.porcentaje_realizado,
                sprint_inicial=us_seleccionado.nombre_sprint,
                instance=us_seleccionado)

            if nombre == '' or descripcion == '' or size == '' or horas_trabajadas == '':
                context = {
                    'formulario': formulario,
                    'error': 'campos',
                    'userstory': us_seleccionado,
                    'usuario_es_scrum': usuario_es_scrum,
                    'usuario_es_desarrollador': usuario_es_desarrollador
                }
                return render(
                    request, 'Gestion_de_UserStories/modificar_userstory.html',
                    context)

            us_seleccionado.nombre = nombre
            us_seleccionado.descripcion = descripcion
            us_seleccionado.prioridad = prioridad
            us_seleccionado.estado = estado
            us_seleccionado.valor_de_negocio = valor_de_negocio
            us_seleccionado.valor_tecnico = valor_tecnico
            us_seleccionado.porcentaje_realizado = porcentaje_realizado
            us_seleccionado.nombre_sprint = nombre_sprint

            if comentario_us != "":
                comentario = Comentario(comentario=comentario_us,
                                        autor=request.user.username,
                                        us_id=id_userStory)
                comentario.save()

            if not usuario_asignado is None:
                if usuario_asignado == '':
                    us_seleccionado.usuario_asignado = None
                else:
                    us_seleccionado.usuario_asignado = Usuario.objects.get(
                        pk=usuario_asignado)

            us_seleccionado.size = size
            us_seleccionado.horas_dedicadas += int(horas_trabajadas)
            us_seleccionado.save()
            Sistema().registrar("Se modifico User Story",
                                request.user.username, "Ninguno")

        else:
            formulario = ModificarUserStoryFormDesarrollador(
                us_seleccionado.estado, us_seleccionado.porcentaje_realizado)
            if horas_trabajadas == '':
                context = {
                    'formulario': formulario,
                    'error': 'campos',
                    'userstory': us_seleccionado,
                    'usuario_es_scrum': usuario_es_scrum,
                    'usuario_es_desarrollador': usuario_es_desarrollador
                }
                return render(
                    request, 'Gestion_de_UserStories/modificar_userstory.html',
                    context)

            us_seleccionado.porcentaje_realizado = request.POST.get(
                'porcentaje_realizado')
            us_seleccionado.horas_dedicadas += int(horas_trabajadas)
            us_seleccionado.estado = estado
            us_seleccionado.save()

            Sistema().registrar("Se modifico User Story ",
                                request.user.username, "Ninguno")

        redireccion = reverse('listar_userstories_proyecto',
                              args=[us_seleccionado.proyecto.id])
        return HttpResponseRedirect(redireccion)

    if request.method == 'POST' and 'Upload' in request.POST:
        if request.FILES:
            fecha_path = str(datetime_safe.date.today()).split("-")
            archivo_request = request.FILES['image']
            archivo = FileAttached_model()
            archivo.file = archivo_request
            archivo.file_name = archivo_request.name
            archivo.file_path = settings.MEDIA_URL + 'subidos/' + fecha_path[
                0] + '/' + fecha_path[1] + '/' + fecha_path[2] + '/'
            archivo.file_type = archivo_request.content_type
            archivo.save()
            formulario_lleno = ModificarUserStoryForm(
                us_seleccionado.proyecto,
                us_seleccionado.estado,
                us_seleccionado.porcentaje_realizado,
                sprint_inicial=us_seleccionado.nombre_sprint,
                instance=us_seleccionado)
            return render_to_response(
                "Gestion_de_UserStories/modificar_userstory.html", {
                    'formulario': formulario_lleno,
                    'userstory': us_seleccionado,
                    'usuario_es_scrum': usuario_es_scrum,
                    'usuario_es_desarrollador': usuario_es_desarrollador
                },
                context_instance=RequestContext(request))

        else:
            print('No files')

    if usuario_es_scrum:

        formulario = ModificarUserStoryForm(
            us_seleccionado.proyecto,
            us_seleccionado.estado,
            us_seleccionado.porcentaje_realizado,
            sprint_inicial=us_seleccionado.nombre_sprint,
            instance=us_seleccionado)
    else:
        formulario = ModificarUserStoryForm(
            us_seleccionado.proyecto,
            us_seleccionado.estado,
            us_seleccionado.porcentaje_realizado,
            sprint_inicial=us_seleccionado.nombre_sprint,
            instance=us_seleccionado)

    context = {
        'formulario': formulario,
        'userstory': us_seleccionado,
        'usuario_es_scrum': usuario_es_scrum,
        'usuario_es_desarrollador': usuario_es_desarrollador,
        'upload_form': upload_form
    }
    return render_to_response(
        "Gestion_de_UserStories/modificar_userstory.html",
        context,
        context_instance=RequestContext(request))
示例#20
0
def asignar_user_story_a_sprint(request, id_sprint):
    """
    Permite realizar al usuario con los permisos adecuados la asignacion de un US a un Sprint
    :param request:
    :param id_userStory:
    :param id_proyecto:
    :return:
    """
    error="ninguno"
    sprint = Sprint.objects.get(id=id_sprint)
    fecha  = sprint.fecha_fin - sprint.fecha_inicio
    userStories = UserStory.objects.filter(proyecto_id=sprint.id_proyecto,nombre_sprint='No Asignado').order_by('prioridad')
    userStories_copy = list(userStories)


    #Se agregara a la lista los US que fueron reasignados en sprints anteriores
    userReasignados = UserStory.objects.filter(proyecto_id=sprint.id_proyecto,nombre_sprint=sprint.nombre_sprint)
    for us in userReasignados:
        userStories_copy.append(us)

    userStories = userStories_copy

    proyecto = Proyecto.objects.get(id=sprint.id_proyecto.id)
    usuario_equipo =  Usuario.objects.filter(equipo_desarrollo=proyecto.id)
    flujos = Flujo.objects.filter(id_Proyecto_id=proyecto.id)


    if request.method == 'POST' and "Volver" in request.POST:
        redireccion = reverse('listar_todos_sprint' )
        return HttpResponseRedirect(redireccion)


    if request.method == 'POST' and "Guardar" in request.POST:
        usuarios = request.POST.getlist('usuario')
        flujos_seleccionados = request.POST.getlist('flujo')
        uss = request.POST.getlist('agregar')

        flujos_copy = []
        for flujo in flujos_seleccionados:
            if flujo != "---":
                flujos_copy.append(flujo)
        flujos_seleccionados = flujos_copy


        usuarios_copy = []
        for usuario in usuarios:
            if usuario != "---":
                usuarios_copy.append(usuario)
        usuarios = usuarios_copy

        if len(usuarios) != len(uss):
            #Debe seleccionar tantos usuarios como checkbox marco
            error = "cantidad_diferente_"


        for (us,usuario,flujo_seleccionado) in zip(uss,usuarios,flujos_seleccionados):
                userStory = UserStory.objects.get(id=us)
                userStory.nombre_sprint = sprint.nombre_sprint
                userStory.usuario_asignado = Usuario.objects.get(id=usuario)
                userStory.id_flujo = flujo_seleccionado
                userStory.save()
                Sistema().registrar("Asginado US " + userStory.nombre+" a usuario "+Usuario.objects.get(id=usuario).username , request.user.username,  "Ninguno")


        redireccion = reverse('listar_todos_sprint' )
        return HttpResponseRedirect(redireccion)

    return render_to_response("Gestion_de_sprints/asignar_us_sprint.html", {"userstories": userStories,"flujos":flujos,"sprint":sprint,"equipo":usuario_equipo,"duracion_sprint":fecha.days,'error':error},
                          context_instance=RequestContext(request))
示例#21
0
def crear_userstory_view(request, id_proyecto):
    """
    La funcion Crear User Story recibe 2 parametros los cuales son, la peticion natural del protocolo HTTP que contiene
    todos los formularios y campos definidos en la pagina visitada por el cliente, ademas
    recibe el identificador del proyecto al cual se desea agregar un User Story.
    :param request:
    :param id_proyecto:
    :return:
    """
    proyecto_seleccionado = Proyecto.objects.get(pk=id_proyecto)

    formulario = CrearUserStoryForm(proyecto_seleccionado)
    upload_form = FileAttached_form()
    archivo = ''
    error = 'sinerrores'

    if request.method == 'POST' and 'Guardar' in request.POST:
        formulario = CrearUserStoryForm(proyecto_seleccionado, request.POST)

        if formulario.is_valid():
            nombre = request.POST.get('nombre')
            descripcion = request.POST.get('descripcion')
            prioridad = request.POST.get('prioridad')
            valor_tecnico = request.POST.get('valor_tecnico')
            valor_de_negocio = request.POST.get('valor_de_negocio')
            usuario_asignado = None

            proyecto = proyecto_seleccionado
            size = request.POST.get('size')

            newuserstory = UserStory(nombre=nombre,
                                     descripcion=descripcion,
                                     prioridad=prioridad,
                                     valor_de_negocio=valor_de_negocio,
                                     valor_tecnico=valor_tecnico,
                                     usuario_asignado=usuario_asignado,
                                     proyecto=proyecto,
                                     size=size)

            try:
                #Si me trae el siguiente us_prueba, quiere decir que ya existe en la BD, se debe cambiar el nombre
                us_prueba = UserStory.objects.get(nombre=nombre,
                                                  proyecto=proyecto)
                error = 'nombre'

                formulario = CrearUserStoryForm(proyecto_seleccionado)
                context = {
                    'formulario': formulario,
                    'error': error,
                    'id_proyecto': id_proyecto,
                    'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
                }
                return render(request,
                              'Gestion_de_UserStories/crear_userstory.html',
                              context)
            except:
                pass

            newuserstory.save()
            try:
                if FileAttached_model.objects.filter(userstory_id=0) != None:
                    archivo_unico = FileAttached_model.objects.get(
                        userstory_id=0)
                    archivo_unico.userstory_id = newuserstory.id
                    archivo_unico.save()
                else:
                    print('no archivo')
            except:
                pass
            codigo = generarcodigo(newuserstory.id,
                                   proyecto_seleccionado.codigo_proyecto)
            newuserstory.codigo = codigo
            newuserstory.save()
            Sistema().registrar("Creado User Story " + nombre,
                                request.user.username, "Ninguno")
            redireccion = reverse('listar_userstories_proyecto',
                                  args=[id_proyecto])

            return HttpResponseRedirect(redireccion)
        else:
            error = 'campos'
            print(formulario.errors)

    formulario = CrearUserStoryForm(proyecto_seleccionado)
    context = {
        'formulario': formulario,
        'error': error,
        'id_proyecto': id_proyecto,
        'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
    }
    if request.method == 'POST' and 'Upload' in request.POST:
        if request.FILES:
            fecha_path = str(datetime_safe.date.today()).split("-")
            archivo_request = request.FILES['image']
            archivo = FileAttached_model()
            archivo.file = archivo_request
            archivo.file_name = archivo_request.name
            archivo.file_path = settings.MEDIA_URL + 'subidos/' + fecha_path[
                0] + '/' + fecha_path[1] + '/' + fecha_path[2] + '/'
            archivo.file_type = archivo_request.content_type
            archivo.save()
            formulario_lleno = CrearUserStoryForm(proyecto_seleccionado,
                                                  request.POST)

            #print(formulario_lleno.nombre)

            return render_to_response(
                "Gestion_de_UserStories/crear_userstory.html", {
                    'formulario': formulario_lleno,
                    'error': error,
                    'id_proyecto': id_proyecto,
                    'nombre_proyecto': proyecto_seleccionado.nombre_proyecto
                },
                context_instance=RequestContext(request))

        else:
            print('No files')

    context = {
        'formulario': formulario,
        'error': error,
        'id_proyecto': id_proyecto,
        'nombre_proyecto': proyecto_seleccionado.nombre_proyecto,
        'form_popup': upload_form
    }

    return render(request, 'Gestion_de_UserStories/crear_userstory.html',
                  context)
示例#22
0
def crear_proyecto_view(request):
    """
    Permite la creacion de un proyecto
    :param request:
    :return:
    """
    usuario = request.user
    if not usuario.has_perm('GestiondeProyectos.crear_proyecto'):
        msg = 'El usuario no tiene permiso para crear proyectos'
        return render(request, 'Sistema/403.html', {'msg': msg})

    if request.method == 'POST' and 'Cancelar' in request.POST:
        return HttpResponseRedirect('/home')

    if request.method == 'POST' and 'Guardar' in request.POST:

        formulario = CrearProyectoForm(request.POST)
        if request.POST.get('cliente') is None:
            context = {'formulario': formulario, 'error': 'cliente'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        if request.POST.get('equipo_desarrollo') is None:
            context = {'formulario': formulario, 'error': 'equipo_desarrollo'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        if request.POST.get('scrum_master') is None:
            context = {'formulario': formulario, 'error': 'scrum_master'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        if request.POST.get('fecha_inicio') >= request.POST.get(
                'fecha_finalizacion'):
            context = {'formulario': formulario, 'error': 'fechas'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        nombre_proyecto = request.POST.get('nombre_proyecto')
        codigo_proyecto = request.POST.get('codigo_proyecto')

        if Proyecto.objects.filter(nombre_proyecto=nombre_proyecto):
            context = {'formulario': formulario, 'error': 'nombre'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        if Proyecto.objects.filter(codigo_proyecto=codigo_proyecto):
            context = {'formulario': formulario, 'error': 'codigo'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

        if formulario.is_valid():
            formulario.save()
            Sistema().registrar(
                "Creado proyecto " + request.POST.get('nombre_proyecto'),
                request.user.username, "Ninguno")
            return HttpResponseRedirect('listar_proyecto')
        else:
            context = {'formulario': formulario, 'error': 'otro'}
            return render(request, 'Gestion_de_Proyectos/crear_proyecto.html',
                          context)

    formulario = CrearProyectoForm()
    context = {'formulario': formulario}

    return render(request, 'Gestion_de_Proyectos/crear_proyecto.html', context)
示例#23
0
def crear_usuario_view(request):
    """
    Redirecciona a la interfaz para la creacion de un usuario nuevo
    :param request:
    :return:
    """
    grupo_de_permisos = Group.objects.all()
    if request.method == 'POST' and 'Cancelar' in request.POST:
        if request.POST.get('username') != '':
            username = request.POST.get('username')
            try:
                temp_user = Usuario.objects.get(username=username)
                temp_user.delete()
            except:
                None
        return HttpResponseRedirect('/home/')

    #Primero creara un usuario de forma temporal para poder asignar los permisos que sean elegidos
    if request.method == 'POST' and 'Guardar' in request.POST:
        username = request.POST.get('username')
        password = make_password(request.POST.get('password'),
                                 salt=None,
                                 hasher='default')
        lastname = request.POST.get('lastname')
        email = request.POST.get('email')
        activo = request.POST.get('activo')
        roles_asignados = request.POST.getlist('agregar')

        #Controla que el usuario a crear sea unico
        if User.objects.filter(username=username).exists():
            return render_to_response("Gestion_de_usuarios/crear_usuario.html",
                                      {
                                          'error': 'existente',
                                          'disponibles': grupo_de_permisos
                                      },
                                      context_instance=RequestContext(request))

        #Controlara que se haya seleccionado al menos un rol
        if len(roles_asignados) == 0:
            return render_to_response("Gestion_de_usuarios/crear_usuario.html",
                                      {
                                          'error': 'roles',
                                          'disponibles': grupo_de_permisos
                                      },
                                      context_instance=RequestContext(request))
        #Controla que no se hayan dejado en blanco ningun campo
        if username != '' and password != '' and lastname != '' and email != '':
            # Se creara el usuario
            user = Usuario(username=username, password=password, email=email)
            user.first_name = request.POST.get('firstname')
            user.last_name = lastname

            #Si no se elige una de las opciones se tomara usuario desactivado por defecto
            if activo == 'true':
                user.is_active = True
            else:
                user.is_active = False

            user.is_staff = True
            user.is_superuser = False
            user.save()
            Sistema().registrar("creado usuario " + username + " ",
                                request.user.username, "none")

            #Se agrega el rol que poseera el usuario
            for item in roles_asignados:
                group = Group.objects.get(pk=item)
                user.groups.add(group)

            return HttpResponseRedirect('/listar_usuarios/')
            #return render_to_response("Gestion_de_usuarios/crear_usuario.html", {'error': 'ninguno',  'disponibles': grupo_de_permisos},context_instance=RequestContext(request))
        else:
            return render_to_response("Gestion_de_usuarios/crear_usuario.html",
                                      {
                                          'error': 'vacio',
                                          'disponibles': grupo_de_permisos
                                      },
                                      context_instance=RequestContext(request))

    return render_to_response("Gestion_de_usuarios/crear_usuario.html",
                              {'disponibles': grupo_de_permisos},
                              context_instance=RequestContext(request))