string doCrearEvaluacionUsuario(string modeloID, string grupo, string email, int width) { //el usuario quiere crer una evaluacion Grupo g = app.getGrupo(grupo); Usuario u = null; Evaluacion ev = null; string ret = ""; lock (g) { ModeloEvaluacion m; m = g.organizacion.getModeloEvaluacion(modeloID); //genero evlacuacion HTML y guardo u = g.getUsuario(email); string html = m.toHTML(u.prevista.propuestas[0], g, email, width, ModeloEvaluacion.eModo.finalizado); //escribo int docID = g.queso.lastEvalID++; string fname = m.nombre + "_" + docID.ToString("0000"); string docPath = "evaluaciones\\" + m.carpeta() + "\\" + docID.ToString("0000"); string URL = g.URL + "/grupos/" + g.nombre + "/" + docPath.Replace('\\', '/') + "/" + fname + ".html"; //creo carpeta se salida if (!System.IO.Directory.Exists(g.path + "\\" + docPath)) { System.IO.Directory.CreateDirectory(g.path + "\\" + docPath); System.IO.Directory.CreateDirectory(g.path + "\\" + docPath + "\\res\\documentos"); System.IO.File.Copy(g.path + "\\..\\..\\styles.css", g.path + "\\" + docPath + "\\styles.css"); System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(g.path + "\\..\\..\\res\\documentos"); foreach (System.IO.FileInfo fi in di.GetFiles()) { System.IO.File.Copy(fi.FullName, g.path + "\\" + docPath + "\\res\\documentos\\" + fi.Name); } } System.IO.File.WriteAllText(g.path + "\\" + docPath + "\\" + fname + ".html", html, System.Text.Encoding.UTF8); //crea evalaucion Propuesta prop = u.prevista.propuestas[0]; ev = new Evaluacion(); ev.email = email; ev.id = g.queso.lastEvalID++; ev.preguntas = m.getPreguntas(prop); string msg = doCrearEvaluacion(m, g, email, ev); //devuelvo el queso Personal ret = Tools.toJson(g.queso.getQuesoPersonal(email, msg)); } //guardo //app.saveGrupos(); return(ret); }
string doProponer(int id, string modeloID, string grupo, string email) { string ret = ""; Grupo g = app.getGrupo(grupo); lock (g) { Arbol a = g.arbol; //obtengo cabeza del debate Nodo nodo = a.getNodo(id); Nodo debate; List <Nodo> path = a.getPath(id); if (path.Count >= 2) { debate = path[path.Count - 2]; } else { debate = nodo; } if (nodo.consensoAlcanzado) { throw new appException(Tools.tr("Este debate ya ha alcanzado el acuerdo", g.idioma)); } else { //agrego propuestas de la prevista guardada Usuario u = g.getUsuario(email); foreach (Propuesta p in u.prevista.propuestas) { if (nodo.nivel == 0) { p.etiqueta = u.prevista.etiqueta; } else { p.etiqueta = a.getEtiqueta(u.prevista.etiqueta, debate); } p.titulo = u.prevista.titulo; nodo = a.addNodo(nodo, p); } } //devuelvo el arbolPersonal ret = Tools.toJson(a.getArbolPersonal(email, nodo.id)); } app.saveGrupos(); return(ret); }
string doCrearEvaluacion(ModeloEvaluacion m, Grupo g, string email, Evaluacion ev) { string msg = ""; //tema string idTema = m.nombre + ":" + m.getEvaluadoID(); Tema t = g.queso.getTema(idTema); if (t == null) { t = new Tema(); t.id = idTema; t.modeloEvaluacionID = m.id; t.nombre = m.getTemaNombre(); t.icono = m.getTemaIcono(); t.URL = m.getTemaURL(); t.evaluadoID = m.getEvaluadoID(); t.autor = m.getTemaAutor(); g.queso.temas.Add(t); } //agrego evaluacion (reemplazo anterior si hay) if (ev != null) { msg = ""; foreach (Evaluacion e in t.evaluaciones) { if (e.email == email) { t.evaluaciones.Remove(e); msg = Tools.tr("La evaluacion anterior ha sido reemplazada", g.idioma); break; } } t.evaluaciones.Add(ev); } //limpio Usuario u = g.getUsuario(email); if (u != null) { u.prevista = null; } //actualizo queso g.queso.evaluar(); return(msg); }
string doLogin(string email, string clave, string grupo) { string ret = ""; Grupo g = app.getGrupo(grupo); lock (g) { Arbol a = g.arbol; g.ts = DateTime.Now; Usuario u = g.getUsuario(email, clave); if (u != null && u.habilitado) { //login correcto //devuelvo el arbol personal con las flores de este usuario y sus modelos a.actualizarModelosEnUso(); //knowtypes para modelos List <Type> tipos = new List <Type>(); tipos.Add((new Alerta()).GetType()); foreach (Modelo m in g.organizacion.getModelosDocumento()) { tipos.Add(m.GetType()); } foreach (ModeloEvaluacion m in g.organizacion.getModelosEvaluacion()) { tipos.Add(m.GetType()); } ret = "{\"msg\":\"\", \"grupo\":" + g.toJson() + ", "; ret += "\"modelos\":" + Tools.toJson(g.organizacion.getModelosDocumento(), tipos) + ", "; ret += "\"modelosEvaluacion\":" + Tools.toJson(g.organizacion.getModelosEvaluacion(), tipos) + ", "; ret += "\"arbolPersonal\":" + Tools.toJson(a.getArbolPersonal(u.email)) + "}"; u.lastLogin = DateTime.Now; } else if (u != null && !u.habilitado) { app.addLog("login", Request.UserHostAddress, grupo, email, "fail!"); throw new appException(Tools.tr("Usuario no habilitado", grupo, g.idioma)); } else { app.addLog("login", Request.UserHostAddress, grupo, email, "fail!"); throw new appException(Tools.tr("Usuario o clave incorrectos", grupo, g.idioma)); } //envio mails a usuarios inactivos verifyInactivos(g); return(ret); } }
string doRevisar(string modeloID, string grupo, string email, int width) { string ret = ""; Grupo g = app.getGrupo(grupo); ModeloEvaluacion m = g.organizacion.getModeloEvaluacion(modeloID); lock (g) { //preparo propuestas de nodos ancestros g.ts = DateTime.Now; //agrego las propuestas de prevista Usuario u = g.getUsuario(email); //genro revision ret = m.toHTML(u.prevista.propuestas[0], g, email, width, ModeloEvaluacion.eModo.revisar); //las propuesta debe ir en orden de nivel } return(ret); }
public void limpiarCaducados() { int indext = 0; while (indext < temas.Count) { Tema t = temas[indext]; int indexe = 0; while (indexe < t.evaluaciones.Count) { Evaluacion e = t.evaluaciones[indexe]; if (DateTime.Now.Subtract(e.born).TotalDays > caducaDias) { Usuario u = grupo.getUsuario(e.email); if (u != null) { u.alertas.Add(new Alerta(Tools.tr("Evaluacion caida para el tema [%1]", t.nombre, grupo.idioma))); } t.evaluaciones.RemoveAt(indexe); if (t.evaluaciones.Count == 0) { temas.RemoveAt(indext); break; } } else { indexe++; } } if (t.evaluaciones.Count == 0 && DateTime.Now.Subtract(t.born).TotalDays > caducaDias) { temas.RemoveAt(indext); } else { indext++; } } }
string doRevisar(int id, string modeloID, string grupo, string email, int width) { string ret = ""; List <Propuesta> props = new List <Propuesta>(); Grupo g = app.getGrupo(grupo); Modelo m = g.organizacion.getModeloDocumento(modeloID); lock (g) { //preparo propuestas de nodos ancestros Arbol a = g.arbol; List <Nodo> path = a.getPath(id); g.ts = DateTime.Now; foreach (Nodo n in path) { Propuesta op = a.getPropuesta(n); //comparo textox con hermanos y resalto palarbas nuevas if (n.nivel > 0 && op != null) { props.Add(op); } } //agrego las propuestas de prevista Usuario u = g.getUsuario(email); if (u.prevista != null) { foreach (Propuesta p in u.prevista.propuestas) { props.Add(p); } } //genro revision ret = m.toHTML(props, g, email, width, Modelo.eModo.revisar); //las propuesta debe ir en orden de nivel } return(ret); }
public string toHTML(List<Propuesta> props, Grupo g, string email, int width, eModo modo) { string ret = ""; this.modo = modo; this.grupo = g; //reinicio el modelo errores.Clear(); crearVariables(); consensoAlcanzado = false; bool tieneFlores = false; Usuario u = g.getUsuario(email); if (u != null) tieneFlores = u.floresDisponibles().Count > 0; //ordeno las propuestas por nivel props.Sort(); if (modo == eModo.consenso) { //header HTML ret += "<html>"; ret += "<head>"; ret += "<title></title>"; ret += "<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1' />"; ret += "<link rel='stylesheet' type='text/css' href='styles.css'>"; ret += "</head>"; ret += "<body>"; } //todo el documento for (int q = 1; q <= niveles; q++) { Propuesta prop = getProp(q, props); bool editar = (prop == null && tieneFlores && modo != eModo.prevista && modo != eModo.consenso) || (prop != null && prop.esPrevista() && (modo == eModo.revisar || modo == eModo.editar)); if (prop != null && prop.consensoAlcanzado) consensoAlcanzado = true; //veo si falta la propuesta anterior (se ha saltado una) if (prop != null && q > 1 && getProp(q - 1, props) == null) { //se ha saltado una propuesta addError(q, "Las propuestas deben completarse por niveles correlativos, te has saltado el nivel anterior."); //esto evita que pueda proponer } ret += "<table style='width: " + (width - 10) + "px;'>"; //mensaje de nivel if (q > 1 && modo != eModo.consenso) { ret += "<tr>"; ret += "<td><hr></td>"; ret += "<td><span style='color:gray;font-size:10px;'>" + tr("Nivel en el arbol:") + " " + q + "</span></td>"; ret += "</tr>"; } ret += "<tr>"; //contenido de la propuesta int contenidoWidth = modo == eModo.consenso ? width : width - 340; ret += "<td "; ret += "style='width: " + contenidoWidth + "px;vertical-align:top;' "; if (editar && !consensoAlcanzado) ret += "class='editar'"; ret += ">"; ret += toHTMLContenido(q, prop, g, email, contenidoWidth); ret += " </td>"; //comentarios if (modo != eModo.consenso) { if (prop != null && !prop.esPrevista()) { //se puede comentar ret += "<td id='comentarios" + prop.nodoID + "' style='width: " + 250 + "px;vertical-align:top;' class='comentarios'>"; ret += toHTMLComentarios(q, prop, g, email, 246, !consensoAlcanzado); ret += "</td>"; } else { ret += "<td style='width: " + (250) + "px;vertical-align:top;' >"; ret += "</td>"; } } ret += "</tr>"; ret += "</table>"; } //botones de poantalla o firma de consenso ret += "<br>"; if (modo == eModo.consenso) { //firma ret += firmaConsenso; ret += "</body>"; firmaConsenso = ""; //por las dudas } else if (modo == eModo.editar) { //modo muestra if (consensoAlcanzado) ret += "<div class='comentario'><b>" + tr("Consenso alcanzado") + "</b></div><br>"; ret += "<input type='button' class='btn' value='" + tr("Cerrar") + "' onclick='doCerrarDocumento();' />"; if (tieneFlores && !consensoAlcanzado) ret += "<input type='button' class='btn' value='" + tr("Prevista de propuesta") + "' title='" + tr("Enseña vista previa antes de proponer") + "' onclick='doPrevista();' />"; } else if (modo == eModo.prevista) { ret += "<input type='button' class='btn' value='" + tr("Cancelar") + "' onclick='doCerrarDocumento();' />"; ret += "<input type='button' class='btn' value='" + tr("Revisar propuesta") + "' title='" + tr("Permite corregir errores") + "' onclick='doRevisar();' />"; if (!hayError() && props[props.Count - 1].esPrevista()) //permito crear //tiene que haber almenos una propuesa nueva para poder crear algo ret += "<input type='button' class='btn' value='" + tr("Crear propuesta") + "' title='" + tr("Crea la propuesta") + "' onclick='doProponer();' />"; } else if (modo == eModo.revisar) { //permito prevista ret += "<input type='button' class='btn' value='" + tr("Cancelar") + "' onclick='doCerrarDocumento();' />"; if (tieneFlores && !consensoAlcanzado) ret += "<input type='button' class='btn' value='" + tr("Prevista de propuesta") + "' title='" + tr("Enseña vista previa antes de proponer") + "' onclick='doPrevista();' />"; } //ret += "<a id='btnDownload' href='' target='_blank'><font size='1'>Descargar esta versión</font></a>"; return ret; }