\d+)/$',ver_historial),
)
diff --git a/Proyecto/views.py b/Proyecto/views.py
old mode 100644
new mode 100755
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/app/forms.py b/app/forms.py
index 895926c..33fda0c 100755
--- a/app/forms.py
+++ b/app/forms.py
@@ -116,17 +116,15 @@ class FilterForm2(forms.Form):
class ProyectosForm(forms.Form):
"""Formulario para la creacion de proyectos."""
nombre = forms.CharField(max_length=50, label='NOMBRE')
- usuario_scrum = forms.ModelChoiceField(queryset=None, label='SCRUM')
+ usuario_scrum = forms.ModelChoiceField(queryset=None, label='SCRUM MASTER')
+ product_owner = forms.ModelChoiceField(queryset=None, label='PRODUCT OWNER')
descripcion = forms.CharField(widget=forms.Textarea(), required=False, label='DESCRIPCIÓN')
fecha_inicio = forms.DateField(required=False, label='FECHA DE INICIO')
- #fecha_fin = forms.DateField(required=False, label='FECHA DE FINAIZACIÓN')
- #cronograma = forms.FileField(required=False, label='CRONOGRAMA')
- #cantidad = forms.IntegerField(required=False, label='CANTIDAD')
- #cant_actual = forms.IntegerField(required=False, label='Actual')
- def __init__(self, *args, **kwargs):
+ sprint = forms.IntegerField(max_length=2)
+ def __init__(self,*args, **kwargs):
super(ProyectosForm, self).__init__(*args, **kwargs)
self.fields['usuario_scrum'].queryset = RolUsuario.objects.filter()
-
+ self.fields['product_owner'].queryset = ProductOwner.objects.filter()
def clean_nombre(self):
if 'nombre' in self.cleaned_data:
nuevo = self.cleaned_data['nombre']
@@ -145,7 +143,7 @@ class UsuarioProyectoForm(forms.Form):
def __init__(self, proyecto, *args, **kwargs):
super(UsuarioProyectoForm, self).__init__(*args, **kwargs)
- self.fields['usuario'].queryset = User.objects.filter(~Q(id = proyecto.usuario_scrum.id))
+ self.fields['usuario'].queryset = User.objects.filter(~Q(id = proyecto.usuario_scrum.usuario.id))
def clean_usuario(self):
@@ -177,3 +175,60 @@ def clean_nombre(self):
if proyecto.nombre == nuevo:
raise forms.ValidationError('Ya existe ese nombre. Elija otro')
return nuevo
+
+class FlujosForm(forms.Form):
+ """Formulario para la creacion de proyectos."""
+ nombre = forms.CharField(max_length=50, label='NOMBRE')
+
+
+ def clean_nombre(self):
+ if 'nombre' in self.cleaned_data:
+ nuevo = self.cleaned_data['nombre']
+ flujos = Flujo.objects.all()
+ nuevo = self.cleaned_data['nombre']
+ for flujo in flujos:
+ if flujo.nombre == nuevo:
+ raise forms.ValidationError('Ya existe ese nombre. Elija otro')
+ return nuevo
+
+class ActividadesForm(forms.Form):
+ """Formulario para la creacion de proyectos."""
+ nombre = forms.CharField(max_length=50, label='NOMBRE')
+
+
+ def clean_nombre(self):
+ if 'nombre' in self.cleaned_data:
+ nuevo = self.cleaned_data['nombre']
+ acti = Actividades.objects.all()
+ nuevo = self.cleaned_data['nombre']
+ for activ in acti:
+ if activ.nombre == nuevo:
+ raise forms.ValidationError('Ya existe ese nombre. Elija otro')
+ return nuevo
+
+class AddActividadesForm(forms.Form):
+ #Asignar roles
+ actividades = forms.ModelMultipleChoiceField(queryset = None, label = 'ACTIVIDADES DISPONIBLES', required=False)
+ def __init__(self, proyecto, *args, **kwargs):
+ super(AddActividadesForm, self).__init__(*args, **kwargs)
+ self.fields['actividades'].queryset = Actividades.objects.filter(proyecto=proyecto)
+#**********************USER STORY
+class UserStoryForm(forms.Form):
+ nombre = forms.CharField(max_length=50)
+ usuario = forms.ModelChoiceField(queryset=None, label='Asignar a ')
+ prioridad = forms.IntegerField()
+ #valor_negocio=models.IntegerField(max_length=2) #del 1 al 10 donde 10 es de mas valor que 1
+ #valor_tecnico=models.IntegerField(max_length=2) #del 1 al 10 donde 10 es de mas valor que 1
+ duracion= forms.IntegerField() #Duracion estimativa en dias de la historia de usuario
+ descripcion= forms.CharField(widget=forms.Textarea(), required=False, label='Descripcion')
+ #adjuntos = forms
+ def __init__(self,proyecto,*args, **kwargs):
+ super(UserStoryForm, self).__init__(*args, **kwargs)
+ self.fields['usuario'].queryset = UsuarioRolProyecto.objects.filter(Q(proyecto=proyecto))
+
+ # self.fields['usuario'].queryset = UsuarioRolProyecto.objects.filter(Q(proyecto=proyecto))
+
+
+#************
+class AdjuntoForm(forms.Form):
+ archivo = forms.FileField(required = False)
diff --git a/app/helper.py b/app/helper.py
index bd63dbd..65b61be 100755
--- a/app/helper.py
+++ b/app/helper.py
@@ -14,7 +14,7 @@ def get_permisos_sistema(user):
def get_permisos_proyecto(user, proyecto):
roles = UsuarioRolProyecto.objects.filter(usuario = user, proyecto = proyecto)
permisos_obj = []
- print roles
+ # print roles
#for i in roles:
# permisos_obj.extend(i.rol.permisos.all())
permisos = []
diff --git a/app/models.py b/app/models.py
index 3e981d0..6f5a113 100755
--- a/app/models.py
+++ b/app/models.py
@@ -10,7 +10,20 @@
('2', 'Rol de Proyecto'),
)
+""" Estados de Actividades """
+status_activity = (
+ ('1', 'To Do'),
+ ('2', 'Doing'),
+ ('', 'Done'),
+ )
+"""Estados de los UserStories"""
+STATUS_CHOICES = (
+ ('1', 'Pendiente'),
+ ('2', 'Modificado'),
+ ('3', 'Aprobado'),
+ ('4', 'Inactivo')
+ )
class Permiso(models.Model):
@@ -73,7 +86,10 @@ class RolUsuario(models.Model):
usuario =models.ForeignKey(User)
def __unicode__(self):
return self.usuario.username
-
+class ProductOwner(models.Model):
+ usuario =models.ForeignKey(User)
+ def __unicode__(self):
+ return self.usuario.username
class Proyecto(models.Model):
@@ -82,8 +98,10 @@ class Proyecto(models.Model):
"""
nombre = models.CharField(unique=True, max_length=50)
usuario_scrum = models.ForeignKey(RolUsuario)
+ product_owner = models.ForeignKey(ProductOwner)
descripcion = models.TextField(null=True, blank= True)
fecha_inicio = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
+ sprint = models.IntegerField(max_length=2)
def __unicode__(self):
return self.nombre
class UsuarioRolProyecto(models.Model):
@@ -96,3 +114,67 @@ class UsuarioRolProyecto(models.Model):
class Meta:
unique_together = [("usuario", "rol", "proyecto")]
+ def __unicode__(self):
+ return self.usuario
+
+class Flujo(models.Model):
+
+ nombre = models.CharField(unique=True, max_length=50)
+ proyecto = models.ForeignKey(Proyecto)
+ def __unicode__(self):
+ return self.nombre
+
+class Actividades(models.Model):
+
+ nombre = models.CharField(unique=True, max_length=50)
+ estado = models.IntegerField(max_length=1, default=1)
+ proyecto = models.ForeignKey(Proyecto)
+ def __unicode__(self):
+ return self.nombre
+
+class ActividadesFlujo(models.Model):
+ actividades = models.ForeignKey(Actividades, null=True)
+ flujo = models.ForeignKey(Flujo)
+ proyecto = models.ForeignKey(Proyecto)
+ class Meta:
+ unique_together = [("actividades", "flujo","proyecto")]
+
+#***************************************USER STORY**********************************************
+class UserStory(models.Model):
+ nombre = models.CharField( max_length=50)
+ usuario = models.ForeignKey(User)
+ estado = models.IntegerField(max_length=1, choices=STATUS_CHOICES, default=1)
+ version = models.PositiveIntegerField()
+ prioridad = models.IntegerField(max_length=3) #del 1 al 100 donde 1 es mas prioritario
+ habilitado = models.BooleanField(default=True)
+ #valor_negocio=models.IntegerField(max_length=2) #del 1 al 10 donde 10 es de mas valor que 1
+ #valor_tecnico=models.IntegerField(max_length=2) #del 1 al 10 donde 10 es de mas valor que 1
+ duracion=models.IntegerField(max_length=2) #Duracion estimativa en dias de la historia de usuario
+ descripcion = models.TextField(null=True, blank= True)
+ #adjuntos = models.TextField(null=True,blank=True)
+ #acumulador_horas= models.IntegerField(max_length=50)
+ #claves foraneas
+ proyecto = models.ForeignKey(Proyecto) #Proyecto al cual pertenece
+ #flujo = models.ForeignKey(Flujo)#flujo asigando
+ #Sprint = models.ForeignKey(Sprint)#nro de sprint en el que se encuentra la historia
+ def __unicode__(self):
+ return self.nombre
+#***********************
+class Historial(models.Model):
+ """Clase que representa el historial de los user stories"""
+ usuario = models.ForeignKey(User)
+ fecha_creacion = models.DateField(auto_now =False, auto_now_add=True, editable=False)
+ #claves foraneas
+ user_story = models.OneToOneField(UserStory, parent_link=False)
+
+class RegistroHistorial(models.Model):
+ """Clase que representa el Registro de versiones de los user stories"""
+ version = models.PositiveIntegerField()
+ prioridad = models.IntegerField()
+ descripcion = models.TextField(null=True, blank=True)
+ habilitado = models.BooleanField()
+ fecha_modificacion = models.DateTimeField(auto_now=True, auto_now_add=False, editable=False)
+ #claves foraneas
+ historial = models.ForeignKey(Historial)
+
+
diff --git a/app/views.py b/app/views.py
index a0fd71f..4886b65 100755
--- a/app/views.py
+++ b/app/views.py
@@ -26,11 +26,7 @@
@login_required
@csrf_protect
def principal(request):
- """
-Muestra la pagina principal del sistema
-:param request:
-:return:
-"""
+ """Muestra la pagina principal del sistema"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos---------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -70,11 +66,7 @@ def principal(request):
@login_required
def add_user(request):
- """
-Agrega un nuevo usuario en el sistema
-:param request:
-:return:
-"""
+ """Agrega un nuevo usuario en el sistema."""
user = User.objects.get(username=request.user.username)
#Validacion de permisos----------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -112,12 +104,7 @@ def add_user(request):
@login_required
def mod_user(request, usuario_id):
- """
-Modifica los datos de un usuario y los actualiza en el sistema
-:param request:
-:param usuario_id:
-:return:
-"""
+ """Modifica los datos de un usuario y los actualiza en el sistema"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos----------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -147,11 +134,7 @@ def mod_user(request, usuario_id):
@login_required
def cambiar_password(request):
- """
-Cambia la contrasena del usuario logueado y lo direge a la pagina principal
-:param request:
-:return:
-"""
+ """Cambia la contrasena del usuario logueado y lo direge a la pagina principal"""
user = User.objects.get(username=request.user.username)
if request.method == 'POST':
form = CambiarPasswordForm(request.POST)
@@ -165,12 +148,7 @@ def cambiar_password(request):
@login_required
def asignar_roles_sistema(request, usuario_id):
- """
-Asigna roles de sistema a un usuario
-:param request:
-:param usuario_id:
-:return:
-"""
+ """Asigna roles de sistema a un usuario"""
user = User.objects.get(username=request.user.username)
permisos = get_permisos_sistema(user)
usuario = get_object_or_404(User, id=usuario_id)
@@ -215,13 +193,7 @@ def asignar_roles_sistema(request, usuario_id):
@login_required
def borrar_usuario(request, usuario_id):
- """
-Borra un usuario, comprobando las dependencias primero
-:param request:
-:param usuario_id:
-:return:
-"""
-
+ """Borra un usuario, comprobando las dependencias primero"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos----------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -250,11 +222,7 @@ def borrar_usuario(request, usuario_id):
@login_required
def admin_usuarios(request):
- """
-Administracion general de usuarios
-:param request:
-:return:
-"""
+ """Administracion general de usuarios"""
'''Ya esta la validacion de permisos en este'''
user = User.objects.get(username=request.user.username)
permisos = get_permisos_sistema(user)
@@ -311,11 +279,7 @@ def admin_usuarios(request):
@login_required
def admin_roles(request):
- """
-Administracion general de roles
-:param request:
-:return:
-"""
+ """Administracion general de roles"""
user = User.objects.get(username=request.user.username)
permisos = get_permisos_sistema(user)
return render_to_response('admin/roles/roles.html',{'user':user,
@@ -325,12 +289,7 @@ def admin_roles(request):
'eliminar_rol': 'Eliminar rol' in permisos},context_instance=RequestContext(request))
@login_required
def admin_roles_sist(request):
- """
-Administracion general de roles
-:param request:
-:return:
-"""
-
+ """Administracion general de roles"""
user = User.objects.get(username=request.user.username)
permisos = get_permisos_sistema(user)
lista = Rol.objects.filter(categoria=1).order_by('id')
@@ -379,11 +338,7 @@ def admin_roles_sist(request):
@login_required
def admin_roles_proy(request):
- """
-Administracion general de roles
-:param request:
-:return:
-"""
+ """Administracion general de roles"""
user = User.objects.get(username=request.user.username)
permisos = get_permisos_sistema(user)
lista = Rol.objects.filter(categoria=2).order_by('id')
@@ -434,11 +389,7 @@ def admin_roles_proy(request):
@login_required
def crear_rol(request):
- """
-Agrega un nuevo rol
-:param request:
-:return:
-"""
+ """Agrega un nuevo rol"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos---------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -471,12 +422,7 @@ def crear_rol(request):
@login_required
def admin_permisos(request, rol_id):
- """
-Administración de permisos
-:param request:
-:param rol_id:
-:return:
-"""
+ """Administración de permisos"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos---------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -556,12 +502,7 @@ def admin_permisos(request, rol_id):
def mod_rol(request, rol_id):
- """
-Modificar roles
-:param request:
-:param rol_id:
-:return:
-"""
+ """Modificar roles"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos---------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -596,12 +537,7 @@ def mod_rol(request, rol_id):
@login_required
def borrar_rol(request, rol_id):
- """
-Borra un rol con las comprobaciones de consistencia
-:param request:
-:param rol_id:
-:return:
-"""
+ """Borra un rol con las comprobaciones de consistencia"""
user = User.objects.get(username=request.user.username)
#Validacion de permisos---------------------------------------------
roles = UsuarioRolSistema.objects.filter(usuario = user).only('rol')
@@ -664,4 +600,4 @@ def logout_pagina(request):
def index_view(request):
- return render_to_response('index.html', context_instance=RequestContext(request))
+ return render_to_response('index.html', context_instance=RequestContext(request))
\ No newline at end of file
diff --git a/gdt_project/settings.py b/gdt_project/settings.py
index b1fc139..1daf9bc 100755
--- a/gdt_project/settings.py
+++ b/gdt_project/settings.py
@@ -4,12 +4,16 @@
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DEBUG = True
TEMPLATE_DEBUG = DEBUG
+from unipath import Path
+
+RUTA_PROYECTO= Path(__file__).ancestor(2)
-ADMINS = (
- # ('Your Name', 'your_email@domain.com'),
-)
+PATH=RUTA_PROYECTO
+
+ALLOWED_HOSTS = []
+
+WSGI_APPLICATION = 'gdt_project.wsgi.application'
-MANAGERS = ADMINS
DATABASES = {
'default': {
@@ -21,7 +25,7 @@
'PORT': '5432',
}
}
-
+STATIC_URL = '/static/'
# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
@@ -41,12 +45,12 @@
# Absolute path to the directory that holds media.
# Example: "/home/media/media.lawrence.com/"
-MEDIA_ROOT = os.path.abspath('site_media')
+MEDIA_ROOT = RUTA_PROYECTO.child('site_media'),
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash if there is a path component (optional in other cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
-MEDIA_URL = ''
+MEDIA_URL = '/site_media/'
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
# trailing slash.
@@ -56,14 +60,6 @@
# Make this unique, and don't share it with anybody.
SECRET_KEY = 'n#cb07^_%crknkp&+1=z1(wrn^r_@o329cqe^end+a-)0(h4k='
-# List of callables that know how to import templates from various sources.
-TEMPLATE_LOADERS = (
-
- 'django.template.loaders.filesystem.Loader',
- 'django.template.loaders.app_directories.Loader',
-
-)
-
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
@@ -73,27 +69,16 @@
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
-STATIC_URL = '/static/'
-STATICFILES_DIRS = (
- # Put strings here, like "/home/html/static" or "C:/www/django/static".
- # Always use forward slashes, even on Windows.
- # Don't forget to use absolute paths, not relative paths.
- os.path.join(BASE_DIR,'static'),
-)
-STATICFILES_FINDERS = (
- 'django.contrib.staticfiles.finders.FileSystemFinder',
- 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
- )
+
+
ROOT_URLCONF = 'gdt_project.urls'
-TEMPLATE_DIRS = (
- os.path.abspath('templates'),
- # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
- # Always use forward slashes, even on Windows.
- # Don't forget to use absolute paths, not relative paths.
+TEMPLATE_DIRS= (
+ RUTA_PROYECTO.child('templates'),
)
+
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
diff --git a/gdt_project/wsgi.py b/gdt_project/wsgi.py
index b023436..4f28a0b 100755
--- a/gdt_project/wsgi.py
+++ b/gdt_project/wsgi.py
@@ -1,27 +1,21 @@
"""
-WSGI config for saip project.
-
+WSGI config for gdt_project.
+
It exposes the WSGI callable as a module-level variable named ``application``.
-
+
For more information on this file, see
https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/
"""
-
-#import os
-#os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gdt_project.settings")
-
-#from django.core.wsgi import get_wsgi_application
-#application = get_wsgi_application()
-
-# -.- coding: utf-8 -.-
-import os, sys
-from app import settings
+import os# -.- coding: utf-8 -.-
+import os, sys
+from gdt_project import settings
path = settings.PATH
if path not in sys.path:
sys.path.append(path)
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "gdt_project.settings")
from django.core.wsgi import get_wsgi_application
-_application = get_wsgi_application()
+application = get_wsgi_application()
+# -.- coding: utf-8 -.-
diff --git a/site_media/images/construccion.png b/site_media/images/construccion.png
new file mode 100755
index 0000000..a6022bc
Binary files /dev/null and b/site_media/images/construccion.png differ
diff --git a/site_media/images/image.png b/site_media/images/image.png
new file mode 100755
index 0000000..544d9c8
Binary files /dev/null and b/site_media/images/image.png differ
diff --git a/site_media/images/imagen.png b/site_media/images/imagen.png
deleted file mode 100755
index be61142..0000000
Binary files a/site_media/images/imagen.png and /dev/null differ
diff --git a/site_media/images/principal.jpg b/site_media/images/principal.jpg
new file mode 100755
index 0000000..4b00dc0
Binary files /dev/null and b/site_media/images/principal.jpg differ
diff --git a/templates/admin/proyectos/abm_proyecto.html b/templates/admin/proyectos/abm_proyecto.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/add_miembro.html b/templates/admin/proyectos/add_miembro.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/admin_miembros.html b/templates/admin/proyectos/admin_miembros.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/asignar_roles.html b/templates/admin/proyectos/asignar_roles.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/cambiar_usuario_rol.html b/templates/admin/proyectos/cambiar_usuario_rol.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/crear_proyecto.html b/templates/admin/proyectos/crear_proyecto.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/eliminar_miembro.html b/templates/admin/proyectos/eliminar_miembro.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/mod_proyecto.html b/templates/admin/proyectos/mod_proyecto.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/proyecto_confirm_delete.html b/templates/admin/proyectos/proyecto_confirm_delete.html
old mode 100644
new mode 100755
diff --git a/templates/admin/proyectos/proyectos.html b/templates/admin/proyectos/proyectos.html
old mode 100644
new mode 100755
index ff815d9..bcaa99b
--- a/templates/admin/proyectos/proyectos.html
+++ b/templates/admin/proyectos/proyectos.html
@@ -35,7 +35,7 @@
padding-top: 15px;
padding-bottom: 15px;
/* padding-left: 40px; */
- display: block;
+ display: block;
padding: 8px 15px;
font-size: 18px;
font-weight: bold;
@@ -104,7 +104,8 @@
NOMBRE
SCRUM MASTER
- DESCRIPCIÓN
+ PRODUCT OWNER
+ DESCRIPCIÓN
FECHA DE INICIO
@@ -117,12 +118,14 @@
{{i.nombre}}
{% endif %}
{{i.usuario_scrum}}
+ {{i.product_owner}}
{{i.descripcion}}
{{i.fecha_inicio}}
{% if eliminar_proyecto %}
- ELIMINAR
+ ELIMINAR
{% endif %}
@@ -144,4 +147,4 @@
{% endif %}
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/templates/main_page.html b/templates/main_page.html
index a15ef96..51c6acd 100755
--- a/templates/main_page.html
+++ b/templates/main_page.html
@@ -3,43 +3,115 @@
{% block content %}
{% if user.username %}
- SISTEMA GDT
+
+
+
+
+
+ PROYECTO GDT
Bienvenido, {{ user.username }}
ADMINISTRACIÓN DEL SISTEMA
-
+
{% if roles or user or proyectos or tipo_item %}
-
-
- {% if user %}
- U S U A R I O S
+
+
{% endif %}
{% else %}
Bienvenido, visitante
Puedes iniciar sesion AQUI
{% endif %}
-{% endblock %}
-
+{% endblock %}
\ No newline at end of file