from turbogears import paginate
from docutils.core import publish_parts
from sercom.subcontrollers import validate as val
-from sercom.model import Curso, AlumnoInscripto, Docente, Grupo, Alumno, Miembro
+from sercom.model import Curso, AlumnoInscripto, Docente, DocenteInscripto, Grupo, Alumno, Miembro
from sqlobject import *
from sercom.widgets import *
cls = Grupo
name = 'grupo'
namepl = 'grupos'
-
-fkcls = Curso
-fkname = 'curso'
-fknamepl = fkname + 's'
#}}}
#{{{ Validación
-def validate_fk(data):
- fk = data.get(fkname + 'ID', None)
- if fk == 0: fk = None
- if fk is not None:
- try:
- fk = fkcls.get(fk)
- except LookupError:
- flash(_(u'No se pudo crear el nuevo %s porque el %s con '
- 'identificador %d no existe.' % (name, fkname, fk)))
- raise redirect('new', **data)
- data.pop(fkname + 'ID', None)
- data[fkname] = fk
- return fk
-
def validate_get(id):
return val.validate_get(cls, name, id)
def validate_set(id, data):
- validate_fk(data)
return val.validate_set(cls, name, id, data)
def validate_new(data):
- validate_fk(data)
return val.validate_new(cls, name, data)
def validate_del(id):
def get_docentes():
return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
-def get_cursos():
- return [(0, u'---')] + [(fk1.id, fk1.shortrepr()) for fk1 in Curso.select()]
+def get_docentes_inscriptos(id):
+ def func():
+ return [(fk1.id, fk1.shortrepr()) for fk1 in DocenteInscripto.select(DocenteInscripto.q.cursoID==id)]
+ return func
ajax = u"""
function alumnos_agregar_a_la_lista(texto, lista)
alert("No deberias ver esto, y quiere decir que tu form esta roto.\\nTe falta un combo de curso");
return;
}
- if (curso.options[curso.selectedIndex].value <= 0) {
+ if (curso.value <= 0) {
alert('Debes seleccionar un curso primero');
return;
}
- url = "/grupo/get_inscripto?cursoid="+curso.options[curso.selectedIndex].value+"&padron="+t.value;
+ url = "/curso/grupo/get_inscripto?cursoid="+curso.value+"&padron="+t.value;
t.value = "";
return url;
}
}
/* Obtengo el curso */
l = MochiKit.DOM.getElement('form_cursoID');
- cursoid = l.options[l.selectedIndex].value;
+ cursoid = l.value;
if (cursoid <= 0) {
alert('Debe seleccionar un curso');
return;
}
- url = "/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron;
+ url = "/curso/grupo/get_inscripto?cursoid="+cursoid+'&padron='+padron;
var d = loadJSONDoc(url);
d.addCallbacks(procesar, err);
}
MochiKit.DOM.addLoadEvent(prepare)
"""
-def get_docentes():
- return [(fk1.id, fk1.shortrepr()) for fk1 in Docente.select()]
class GrupoForm(W.TableForm):
class Fields(W.WidgetsList):
- cursoID = W.SingleSelectField(label=_(u'Curso'), options = get_cursos, validator = V.Int(not_empty=True))
+ cursoID = W.HiddenField()
nombre = W.TextField(label=_(u'Nombre'), validator=V.UnicodeString(not_empty=True,strip=True))
responsable = CustomTextField(label=_(u'Responsable'), validator=V.UnicodeString(), attrs=dict(size='8'))
miembros = AjaxMultiSelect(label=_(u'Miembros'), validator=V.Int(), on_add="alumnos_agregar_a_la_lista")
tutores = W.MultipleSelectField(label=_(u'Tutores'), validator=V.Int(), options=get_docentes)
fields = Fields()
- javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('curso');"), W.JSSource(ajax)]
+ javascript = [W.JSSource("MochiKit.DOM.focusOnLoad('form_nombre');"), W.JSSource(ajax)]
form_attrs = dict(onsubmit='return doSubmit()')
-def get_cursos():
- return [(0, u'---')] + [(fk1.id, fk1.shortrepr()) for fk1 in Curso.select()]
-
-class GrupoFiltros(W.TableForm):
- class Fields(W.WidgetsList):
- cursoID = W.SingleSelectField(label=_(u'Curso'), options = get_cursos, validator = V.Int(not_empty=True))
- fields = Fields()
-
-filtro = GrupoFiltros()
form = GrupoForm()
#}}}
@expose()
def default(self, tg_errors=None):
"""handle non exist urls"""
- raise redirect('list')
+ raise redirect(tg.url('/curso/list'))
@expose()
def index(self):
- raise redirect('list')
+ raise redirect(tg.url('/curso/list'))
@expose(template='kid:%s.templates.list' % __name__)
@paginate('records')
- def list(self, cursoID = 0):
+ def list(self, cursoID):
"""List records in model"""
- vfilter = dict(cursoID = cursoID)
- if int(cursoID) == 0:
- r = cls.select()
- else:
- r = cls.select(cls.q.cursoID == cursoID)
- return dict(records=r, name=name, namepl=namepl, form=filtro, vfilter=vfilter)
-
- @expose()
- def activate(self, id, activo):
- """Save or create record to model"""
- r = validate_get(id)
- raise redirect('../../list')
+ r = cls.select(cls.q.cursoID == cursoID)
+ return dict(records=r, name=name, namepl=namepl, cursoID=int(cursoID))
@expose(template='kid:%s.templates.new' % __name__)
- def new(self, **kw):
+ def new(self, cursoID, **kw):
"""Create new records in model"""
- return dict(name=name, namepl=namepl, form=form, values=kw)
+ form.fields[0].attrs['value'] = cursoID
+ form.fields[4].options = get_docentes_inscriptos(cursoID)
+ return dict(name=name, namepl=namepl, cursoID=int(cursoID), form=form, values=kw)
@validate(form=form)
@error_handler(new)
r = validate_new(kw)
flash(_(u'Se creó un nuevo %s.') % name)
- raise redirect('list')
+ raise redirect('list/%d' % int(kw['cursoID']))
@expose(template='kid:%s.templates.edit' % __name__)
def edit(self, id, **kw):
# de manera comoda y facil de formatear segun lo que espera la UI (que
# en este caso es super particular). Ese EmptyClass no se si hay algo estandar
# en python que usar, puse {} y [] pero cuando quiero hacer values.id = XX explota.
+ form.fields[4].options = get_docentes_inscriptos(r.curso.id)
class EmptyClass:
pass
values = EmptyClass()
kw['responsable'] = resp
r = validate_set(id, kw)
flash(_(u'El %s fue actualizado.') % name)
- raise redirect('../list')
+ raise redirect('../list/%d' % r.curso.id)
@expose(template='kid:%s.templates.show' % __name__)
def show(self,id, **kw):
return dict(name=name, namepl=namepl, record=r)
@expose()
- def delete(self, id):
+ def delete(self, cursoID, id):
"""Destroy record in model"""
validate_del(id)
flash(_(u'El %s fue eliminado permanentemente.') % name)
- raise redirect('../list')
+ raise redirect('../../list/%d' % int(cursoID))
@expose('json')
def get_inscripto(self, cursoid, padron):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#"
- py:extends="'../../../templates/master.kid'">
+ py:extends="'../../../../templates/master.kid'">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
<title>list</title>
<h1>Administración de <span py:replace="namepl">Objetos</span></h1>
-<div py:replace="form(value=vfilter, action=tg.url('/grupo/list'), submit_text=_(u'Filtrar'))">Filtros</div>
-
<table class="list">
<tr>
- <th>Curso</th>
<th>Nombre</th>
<th>Responsable</th>
<th>Operaciones</th>
</tr>
<tr py:for="record in records">
- <td><a href="${tg.url('/curso/show/'+str(record.curso.id))}" py:content="record.curso.shortrepr()">curso</a></td>
<td><span py:replace="record.nombre">nombre</span></td>
<td><a py:if="record.responsable is not None" href="${tg.url('/alumno/show/'+str(record.responsable.alumno.id))}" py:content="record.responsable.alumno.shortrepr()"></a></td>
<td>
- <a href="${tg.url('/grupo/show/%d' % record.id)}">Ver</a>
- <a href="${tg.url('/grupo/edit/%d' % record.id)}">Editar</a>
- <a href="${tg.url('/grupo/delete/%d' % record.id)}" onclick="if (confirm('${_(u'Estás seguro? Tal vez sólo quieras desactivarlo mejor...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
+ <a href="${tg.url('/curso/grupo/show/%d' % record.id)}">Ver</a>
+ <a href="${tg.url('/curso/grupo/edit/%d' % record.id)}">Editar</a>
+ <a href="${tg.url('/curso/grupo/delete/%d/%d' % (record.curso.id, record.id))}" onclick="if (confirm('${_(u'Estás seguro? Tal vez sólo quieras desactivarlo mejor...')}')) { var f = document.createElement('form'); this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href; f.submit(); };return false;">Eliminar</a>
</td>
</tr>
</table>
<br/>
-<a href="${tg.url('/grupo/new')}">Agregar</a>
+<a href="${tg.url('/curso/grupo/new/%d' % cursoID)}">Agregar</a> |
+<a href="${tg.url('/curso/list')}">Volver a Cursos</a>
<br/>
<br/>
<div py:for="page in tg.paginate.pages">