Skip to content
This repository has been archived by the owner on Apr 18, 2023. It is now read-only.

Commit

Permalink
(#17) Crear área personal para alumnos
Browse files Browse the repository at this point in the history
Se ha creado un área personal para los alumnos donde pueden ver su
información, especialmente sus preferencias, que también podrán
modificar a traves de esta nueva area.

Este commit únicamente hace las conexiones apropiadas como para que
existan las páginas, que sean accesibles por alumnos y que se muestren
las preferencias de forma correcta, falta implementar la funcionalidad.
  • Loading branch information
xiwire committed Nov 17, 2017
1 parent 2242802 commit e3b5147
Show file tree
Hide file tree
Showing 19 changed files with 312 additions and 31 deletions.
58 changes: 31 additions & 27 deletions cambios/templates/cambios/aceptar_cambio.html
Original file line number Diff line number Diff line change
@@ -1,32 +1,36 @@
{% extends "gespai/base.html" %} {% block content %}
<div class="container">
{% if cambio %} {% if messages %} {% for message in messages %}
<div{% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</div>
{% endfor %} {% endif %}
<div class="content-section">
<h1 class="page-header">Datos del Cambio</h1>
<p><strong>Nombre del becario: </strong>{{ cambio.becario }}</p>
<p><strong>Estado actual del becario: </strong>{{ cambio.becario.get_estado_display }}</p>
<p><strong>Permisos: </strong>{% if cambio.becario.permisos %}Sí{% else %}No{% endif %}</p>
<p><strong>Estado del cambio: </strong>{{ cambio.get_estado_cambio_display }}</p>
<p><strong>Plaza actual del becario: </strong>{% if cambio.becario.plaza_asignada %}{{ cambio.becario.plaza_asignada }}{% else %}Sin plaza{% endif %}</p>
{% if cambio.plaza %}
<p><strong>Plaza del cambio: </strong>{{ cambio.plaza }}</p>{% endif %}
<p><strong>Fecha del cambio: </strong>{{ cambio.fecha_cambio }}</p>
<p><strong>Observaciones: </strong>{{ cambio.observaciones }}</p>
{% if is_osl %}
<form action="" method="POST">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Aceptar cambio" name="aceptar">
<a href="{% url 'cambios:modificar' cambio.id %}" class="btn btn-primary">Modificar cambio</a>
</form>
{% if cambio %}
{% if messages %}
{% for message in messages %}
<div{% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</div>
{% endfor %}
{% endif %}
<div class="content-section">
<h1 class="page-header">Datos del Cambio</h1>
<p><strong>Nombre del becario: </strong>{{ cambio.becario }}</p>
<p><strong>Estado actual del becario: </strong>{{ cambio.becario.get_estado_display }}</p>
<p><strong>Permisos: </strong>{% if cambio.becario.permisos %}Sí{% else %}No{% endif %}</p>
<p><strong>Estado del cambio: </strong>{{ cambio.get_estado_cambio_display }}</p>
<p><strong>Plaza actual del becario: </strong>{% if cambio.becario.plaza_asignada %}{{ cambio.becario.plaza_asignada }}{% else %}Sin plaza{% endif %}</p>
{% if cambio.plaza %}
<p><strong>Plaza del cambio: </strong>{{ cambio.plaza }}</p>
{% endif %}
<p><strong>Fecha del cambio: </strong>{{ cambio.fecha_cambio }}</p>
<p><strong>Observaciones: </strong>{{ cambio.observaciones }}</p>
{% if is_osl %}
<form action="" method="POST">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Aceptar cambio" name="aceptar">
<a href="{% url 'cambios:modificar' cambio.id %}" class="btn btn-primary">Modificar cambio</a>
</form>
{% endif %}
</div>
{% else %}
<div class="content-section">
<h1 class="page-header">Error</h1>
<div class="alert alert-danger">No se encuentra un cambio con la ID especificada.</div>
</div>
{% endif %}
</div>
{% else %}
<div class="content-section">
<h1 class="page-header">Error</h1>
<div class="alert alert-danger">No se encuentra un cambio con la ID especificada.</div>
</div>
{% endif %}
</div>
{% endblock content %}
5 changes: 4 additions & 1 deletion gespai/context_processors.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
# Método que devuelve un diccionario con información que se utilizará
# en las plantillas de la aplicación
def context_processor(request):
return {'is_osl': request.user.groups.filter(name='osl').exists()}
return {
'is_osl': request.user.groups.filter(name='osl').exists(),
'is_alu': request.user.groups.filter(name='alu').exists(),
}
1 change: 1 addition & 0 deletions gespai/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
'gestion.apps.GestionConfig',
'upload.apps.UploadConfig',
'cambios.apps.CambiosConfig',
'personal.apps.PersonalConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
Expand Down
22 changes: 21 additions & 1 deletion gespai/templates/gespai/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@ <h1>Gestión de Becarios</h1>
<i class="fa fa-user fa-5x"></i>
</div>
<div class="col-md-10">
{% if not user.is_authenticated %}
<h4>Inicio de Sesión</h4>
<p>Introduzca sus datos para acceder al sistema</p>
{% if not user.is_authenticated %}
<a class="btn btn-success btn-sm" href="{% url 'login' %}"><i class="fa fa-angle-double-right"></i> Inicie sesión</a>
{% else %}
<h4>Cerrar Sesión</h4>
<p>Cierre sesión</p>
<a href="{% url 'logout' %}" class="btn btn-danger btn-sm"><i class="fa fa-angle-double-right"></i> Cerrar sesión</a>
{% endif %}
</div>
Expand All @@ -66,6 +68,24 @@ <h4>Sistema de cambios a becarios</h4>
</div>
</div>
{% endif %}
{% if user.is_alu %}
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="col-md-2 align-center">
<i class="fa fa-pencil-square-o fa-5x"></i>
</div>
<div class="col-md-10">
<h4>Área Personal</h4>
<p>Revisa aquí información personal tuya y revisa o modifica tus preferencias</p>
<a class="btn btn-primary btn-sm" href="{% url 'personal:index' %}"><i class="fa fa-angle-double-right"></i> Acceder</a>
</div>
</div>
</div>
</div>
</div>
{% endif %}
</div>

<div class="row">
Expand Down
1 change: 1 addition & 0 deletions gespai/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
url(r'^admin/', admin.site.urls),
url(r'^upload/', include('upload.urls')),
url(r'^cambios/', include('cambios.urls')),
url(r'^personal/', include('personal.urls')),
url(r'^$', TemplateView.as_view(template_name='gespai/index.html'), name='index'),
url('^inbox/notifications/', include(notifications.urls, namespace='notifications')),
url(r'^login/$', auth_views.login, {'authentication_form': forms.LoginForm}),
Expand Down
4 changes: 2 additions & 2 deletions gestion/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,11 +126,11 @@ class PreferenciasBecario(models.Model):
class Meta:
# Un becario solo puede indicar su preferencia para una plaza una sola vez
# Un becario solo puede indicar un orden de prelacion para cada plaza
unique_together = (('becario', 'plaza'), ('becario', 'num_orden'))
unique_together = (('becario', 'plaza'), ('becario', 'orden'))
verbose_name_plural = "preferencias becarios"
becario = models.ForeignKey(Becario, on_delete=models.CASCADE)
plaza = models.ForeignKey(Plaza, on_delete=models.CASCADE)
num_orden = models.PositiveSmallIntegerField()
orden = models.PositiveSmallIntegerField()

def __str__(self):
return "{0.becario}({0.num_orden}) - {0.plaza}".format(self)
Expand Down
Binary file added personal/.views.py.swo
Binary file not shown.
Empty file added personal/__init__.py
Empty file.
3 changes: 3 additions & 0 deletions personal/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.contrib import admin

# Register your models here.
5 changes: 5 additions & 0 deletions personal/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django.apps import AppConfig


class PersonalConfig(AppConfig):
name = 'personal'
55 changes: 55 additions & 0 deletions personal/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from django import forms
import datetime

from gestion import models

class ObservacionesBecarioForm(forms.Form):

def __init__(self, *args, **kwargs):
self.becario = kwargs.pop('becario')
super(ObservacionesBecarioForm, self).__init__(*args, **kwargs)
if self.becario:
self.fields['observaciones'].initial = self.becario.observaciones

observaciones = forms.CharField(label="Observaciones",
widget=forms.Textarea(attrs={'cols':50, 'rows':5, 'class': 'form-control'}))

class CambioBecarioForm(forms.ModelForm):
class Meta:
model = models.CambiosPendientes
exclude = ('becario',)

def __init__(self, *args, **kwargs):
self.becario = kwargs.pop('becario')
super(CambioBecarioForm, self).__init__(*args, **kwargs)
if self.becario and self.becario.plaza_asignada:
self.fields['plaza'].initial = self.becario.plaza_asignada

ESTADOS = (
('A', 'Asignado'),
('R', 'Renuncia'),
('T', 'Traslado'),
)

plaza = forms.ModelChoiceField(
label="Plaza de cambio", queryset=models.Plaza.objects.all(), required=False, widget=forms.Select(attrs={'class': 'form-control'}))
estado_cambio = forms.ChoiceField(label="Estado de cambio", choices=ESTADOS, widget=forms.Select(attrs={'class': 'form-control'}))
fecha_cambio = forms.DateField(label="Fecha de cambio", widget=forms.SelectDateWidget(attrs={'class': 'form-control'}),
initial=datetime.date.today, required=False)
observaciones = forms.CharField(label="Observaciones del cambio", widget=forms.Textarea(attrs={'cols':50, 'rows':5, 'class': 'form-control'}),
required=False)

def clean(self):
cleaned_data = super(CambioBecarioForm, self).clean()
estado = cleaned_data.get('estado_cambio')
plaza = cleaned_data.get('plaza')
fecha = cleaned_data.get('fecha_cambio')

if estado == 'T' and not plaza:
self.add_error('plaza', 'Debe seleccionar una plaza si el cambio es un traslado.')
if estado == 'T' and plaza == self.becario.plaza_asignada:
self.add_error('plaza', 'Un becario no puede ser trasladado a su misma plaza.')
if estado == 'A' and self.becario.estado == 'A':
self.add_error('estado_cambio', 'Si desea asignar al becario a otra plaza, seleccione Traslado como estado de cambio.')
if fecha < datetime.date.today():
self.add_error('fecha_cambio', 'Seleccione una fecha en el futuro.')
3 changes: 3 additions & 0 deletions personal/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.db import models

# Create your models here.
33 changes: 33 additions & 0 deletions personal/templates/personal/aceptar_cambio.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{% extends "gespai/base.html" %} {% block content %}
<div class="container">
<div class="content-section">
<h1 class="page-header">Datos del Cambio</h1>
{% if %}
{% if messages %}
{% for message in messages %}
<div{% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</div>
{% endfor %}
{% endif %}
<p><strong>Nombre del becario: </strong>{{ cambio.becario }}</p>
<p><strong>Estado actual del becario: </strong>{{ cambio.becario.get_estado_display }}</p>
<p><strong>Permisos: </strong>{% if cambio.becario.permisos %}Sí{% else %}No{% endif %}</p>
<p><strong>Estado del cambio: </strong>{{ cambio.get_estado_cambio_display }}</p>
<p><strong>Plaza actual del becario: </strong>{% if cambio.becario.plaza_asignada %}{{ cambio.becario.plaza_asignada }}{% else %}Sin plaza{% endif %}</p>
{% if cambio.plaza %}
<p><strong>Plaza del cambio: </strong>{{ cambio.plaza }}</p>
{% endif %}
<p><strong>Fecha del cambio: </strong>{{ cambio.fecha_cambio }}</p>
<p><strong>Observaciones: </strong>{{ cambio.observaciones }}</p>
{% if is_osl %}
<form action="" method="POST">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Aceptar cambio" name="aceptar">
<a href="{% url 'cambios:modificar' cambio.id %}" class="btn btn-primary">Modificar cambio</a>
</form>
{% endif %}
{% else %}
<div class="alert alert-danger">No se encuentra un cambio con la ID especificada.</div>
</div>
{% endif %}
</div>
{% endblock content %}
43 changes: 43 additions & 0 deletions personal/templates/personal/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{% extends "gespai/base.html" %} {% block content %}
<div class="container-fluid">
<h1 class="page-header">Área Personal</h1>
<div class="row">
<div class="col-lg-10 col-lg-push-1 portal-panels">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="col-md-2 align-center">
<i class="fa fa-user fa-5x"></i>
</div>
<div class="col-md-10">
<h4>Página personal</h4>
<p>Verifique aqui su información personal.</p>
<a class="btn btn-primary btn-sm" href="{% url 'personal:info' %}"><i class="fa fa-angle-double-right"></i> Acceder</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-6">
<div class="panel panel-default">
<div class="panel-body">
<div class="row">
<div class="col-md-2 align-center">
<i class="fa fa-pencil-square-o fa-5x"></i>
</div>
<div class="col-md-10">
<h4>Preferencias</h4>
<p>Consulte o modifique sus preferencias aquí.</p>
<a class="btn btn-primary btn-sm" href="{% url 'personal:preferencias' %}"><i class="fa fa-angle-double-right"></i> Acceder</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock content %}
33 changes: 33 additions & 0 deletions personal/templates/personal/info.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{% extends "gespai/base.html" %} {% block content %}
<div class="container">
<div class="content-section">
<h1 class="page-header">Datos del Cambio</h1>
{% if %}
{% if messages %}
{% for message in messages %}
<div{% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</div>
{% endfor %}
{% endif %}
<p><strong>Nombre del becario: </strong>{{ cambio.becario }}</p>
<p><strong>Estado actual del becario: </strong>{{ cambio.becario.get_estado_display }}</p>
<p><strong>Permisos: </strong>{% if cambio.becario.permisos %}Sí{% else %}No{% endif %}</p>
<p><strong>Estado del cambio: </strong>{{ cambio.get_estado_cambio_display }}</p>
<p><strong>Plaza actual del becario: </strong>{% if cambio.becario.plaza_asignada %}{{ cambio.becario.plaza_asignada }}{% else %}Sin plaza{% endif %}</p>
{% if cambio.plaza %}
<p><strong>Plaza del cambio: </strong>{{ cambio.plaza }}</p>
{% endif %}
<p><strong>Fecha del cambio: </strong>{{ cambio.fecha_cambio }}</p>
<p><strong>Observaciones: </strong>{{ cambio.observaciones }}</p>
{% if is_osl %}
<form action="" method="POST">
{% csrf_token %}
<input type="submit" class="btn btn-primary" value="Aceptar cambio" name="aceptar">
<a href="{% url 'cambios:modificar' cambio.id %}" class="btn btn-primary">Modificar cambio</a>
</form>
{% endif %}
{% else %}
<div class="alert alert-danger">No se encuentra un cambio con la ID especificada.</div>
</div>
{% endif %}
</div>
{% endblock content %}
28 changes: 28 additions & 0 deletions personal/templates/personal/list_preferencias.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{% extends "gespai/base.html" %} {% block content %}
<div class="container-fluid">
<div class="content-section">
<h1 class="page-header">Preferencias</h1>
{% if becario_list %}
<div class="table-responsive">
<table class="table table-striped table-hover sortable">
<tr>
<th>Orden</th>
<th>Nombre</th>
</tr>
{% for preferencia in object_list %}
<tr>
<td>{{ preferencia.orden }}</td>
<td>{{ preferencia.nombre }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% else %}
<div class="content-section">
<h1 class="page-header">Error</h1>
<div class="alert alert-danger">No tienes preferencias guardadas.</div>
</div>
{% endif %}
</div>
{% endblock content %}
3 changes: 3 additions & 0 deletions personal/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
11 changes: 11 additions & 0 deletions personal/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django.conf.urls import url

from . import views

app_name = 'personal'

urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^info/$', views.InfoView.as_view(), name='info'),
url(r'^preferencias/$', views.ListPreferenciasView.as_view(), name='preferencias'),
]
Loading

0 comments on commit e3b5147

Please sign in to comment.