Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1508 → Rev 1516

/branches/v3/impl/importRoutines.xml
129,4 → 129,9
<target name="updateCourseDepartments">
<java classname="pt.estgp.estgweb.services.courses.UpdateDepartmentsTask" classpath="${build.dir.classes}" classpathref="pathToToolsLib"/>
</target>
 
<target name="generateFreshJsonPlanosEstudosFromXml">
<java classname="pt.estgp.estgweb.services.courses.CoursesService" classpath="${build.dir.classes}" classpathref="pathToToolsLib"/>
</target>
 
</project>
/branches/v3/impl/conf/language/MessageResources.properties
1068,6 → 1068,7
course.studies.plan.users=Plano de Estudos
course.studies.plan.not.available=Não disponivel
course.studies.plan.saved=Plano de Estudos Salvo com Sucesso
course.studies.plan.cloned=Plano de Estudos Clonado com Sucesso
course.courseunit.program.objectives.todo={0} Unidades em Falta (Ficha)
course.externalSite=Site Externo
#course.studies.plan=Plano de Estudos
/branches/v3/impl/conf/berserk/sd.xml
1524,8 → 1524,45
<chain name="Admins"/>
</filterChains>
</service>
<service>
<name>CloneStudiesPlanVersionFrom</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>cloneVersionFrom</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesStudiesPlans"/>
</filterChains>
</service>
<service>
<name>AddTeacherCourseCommission</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>addTeacherCommission</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
<service>
<name>RemoveTeacherCourseCommission</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
<description>Load course by String code</description>
<isTransactional>true</isTransactional>
<defaultMethod>removeTeacherCommission</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
 
 
 
<service>
<name>SubmitCourse</name>
<implementationClass>pt.estgp.estgweb.services.courses.CoursesService</implementationClass>
1535,7 → 1572,7
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
<chain name="Admins"/>
<chain name="ServicesCoursesManagement"/>
</filterChains>
</service>
<service>
2881,9 → 2918,7
</filterChains>
</service>
 
QuestionarioSendMessage
QuestionarioSendMessageCursoAfeto
QuestionarioSendMessageUnidadeAfeta
 
<service>
<name>QuestionarioSendMessage</name>
<implementationClass>pt.estgp.estgweb.services.questionarios.QuestionariosService</implementationClass>
/branches/v3/impl/conf/berserk/fcd.xml
28,6 → 28,21
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
<filterChain>
<name>ServicesStudiesPlans</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("all") || RoleUsers("admin") || RoleUsers("servicesStudiesPlans"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
<filterChain>
<name>ServicesCoursesManagement</name>
<expression>AuthenticatedUsers &amp;&amp; (RoleUsers("all") || RoleUsers("admin") || RoleUsers("servicesCoursesManagement"))</expression>
<description>Admins Control Chain</description>
<invocationTiming>1</invocationTiming>
<filterClass>pt.estgp.estgweb.filters.chains.AdminControlFilter</filterClass>
</filterChain>
 
<filterChain>
<name>Supers</name>
<expression>AuthenticatedUsers &amp;&amp; RoleUsers("super")</expression>
<description>Super Users Control Chain</description>
/branches/v3/impl/src/java/pt/estgp/estgweb/services/courses/CoursesService.java
319,15 → 319,15
InputStream stream;
IRepositoryFile repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
long lastVersion = repositoryService.loadView(c.getStudiesPlan()).getLastVersion().getId();
stream = repositoryFile.getInput();
//stream = repositoryFile.getInput();
//TODO TIRAR
//JUST FOR DEBUG
try {
/* try {
System.out.println(StreamsUtils.readString(stream));
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}*/
repositoryFile = repositoryService.load(c.getStudiesPlan(),userSession);
stream = repositoryFile.getInput();
 
754,7 → 754,7
logger.info(msg);
 
//#############UPDATING Course Comission Members
updateCourseComissionMembers(systemUrl, code, c);
updateCourseComissionMembersAndCourseInfo(systemUrl, code, c);
 
//#############UPDATING STUDIES PLAN
updateStudiesPlanFromRemoteSystem(systemUrl, setActive, log, course, code, c);
821,13 → 821,35
* @throws IOException
* @throws JSONException
*/
private void updateCourseComissionMembers(String systemUrl, String code, Course c) throws IOException, JSONException {
private void updateCourseComissionMembersAndCourseInfo(String systemUrl, String code, Course c) throws IOException, JSONException
{
 
URL urlCourseDetails = new URL(systemUrl + "/wsjson/api?service=getCourse&code=" + code);
InputStream isCourseDetails = urlCourseDetails.openStream();
String strCourseDetails = StreamsUtils.readString(isCourseDetails);
JSONObject objCourseDetails = new JSONObject(strCourseDetails);
 
//DEPARTMENT
JSONObject department = objCourseDetails.getJSONObject("courseInfo").getJSONObject("department");
if(department != null)
{
String sigla = department.getString("sigla");
if(sigla != null)
{
CourseDepartment department1 = DaoFactory.getCourseDepartmentDaoImpl().findBySigla(sigla);
if(department1 != null)
{
c.setDepartment(department1);
}
}
}
 
 
String validationRole = objCourseDetails.getJSONObject("courseInfo").getString("validationRole");
 
 
 
 
if(validationRole == null)
{
logger.info("validationRole is not defined");
849,6 → 871,15
{
c.setCoordinator(coordinatorPersistent);
}
 
List<User> users = DaoFactory.getUserDaoImpl().loadRoleUsers(validationRole);
logger.info("Encontrados " + users.size() + " docentes com o papel de comissao " + validationRole + " vai remover");
for(User u: users)
{
logger.info("Removendo role a " + u.getName());
u.removeRole(validationRole);
}
 
for(int j = 0 ; j < courseComission.length(); j++)
{
JSONObject memberComission = courseComission.getJSONObject(j);
865,7 → 896,6
memberPersistent.addRole(validationRole);
}
}
 
}
}
}
904,7 → 934,7
DaoFactory.getCourseStudiesPlanDaoImpl().save(studiesPlan);
}
 
public void cloneVersionFrom(long sourcePlanId, long targetPlanId, long courseId, UserSession session)
public CourseStudiesPlanImpl cloneVersionFrom(long sourcePlanId, long targetPlanId, long courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(courseId);
CourseStudiesPlan source = null;
918,6 → 948,7
}
target.setXml(source.getXml());
target.setJson(source.getJson());
return (CourseStudiesPlanImpl) DaoFactory.getCourseStudiesPlanDaoImpl().narrow(target);
}
 
public Curso loadCursoPlanoFromXml(String xml)
1034,6 → 1065,19
logger.error(e,e);
}
}
 
logger.info("GENERATING JSON FOR CLASS COURSE");
for(Course course: DaoFactory.getCourseDaoImpl().findAll())
{
try {
logger.info("generating json for course: " + course.getName() + " (" + course.getCode() + ")");
generateCourseJson(course);
} catch (IOException e) {
logger.error(e,e);
} catch (TransformationException e) {
logger.error(e, e);
}
}
}
 
 
1047,6 → 1091,23
 
}
 
 
public Teacher addTeacherCommission(String teacherId,String courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
t.addRole(course.getValidationRole());
return t;
}
 
public Teacher removeTeacherCommission(String teacherId,String courseId, UserSession session)
{
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
t.removeRole(course.getValidationRole());
return t;
}
 
public static void main(String[] args)
{
AbstractDao.getCurrentSession().beginTransaction();
/branches/v3/impl/src/java/pt/estgp/estgweb/services/users/LoadUsersService.java
66,12 → 66,13
return null;
return UserView.getViews(users);
}
public List<UserView> LoadTeachersWithUnitsInLast3Years(String area) throws ServiceException
public List<UserView> LoadTeachersWithUnitsInLast3Years() throws ServiceException
{
List<User> users = DaoFactory.getTeacherDaoImpl().loadByAreaWithUnitsInLast3Years(area, DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
if(users == null)
//area no more implemented
List<Long> usersIds = DaoFactory.getTeacherDaoImpl().loadByAreaWithUnitsInLast3Years(DaoFactory.getConfigurationDaoImpl().getInterfaceImportYear());
if(usersIds == null)
return null;
return UserView.getViews(users);
return UserView.getViewsFromIds(usersIds);
}
 
 
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/CourseView.java
105,6 → 105,10
 
private Course course;
 
public CourseDepartment getCourseDepartment(){
return course.getDepartment();
}
 
public boolean isStatus() {
return status;
}
149,7 → 153,12
courseYearViews.add(courseYearView);
}
 
 
this.course = course;
if(course.getDepartment() != null)
{
course.getDepartment().getName();
}
this.id = course.getId();
this.code = course.getCode();
this.area = course.getArea();
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/views/UserView.java
654,6 → 654,18
}
return views;
}
 
public static List<UserView> getViewsFromIds(List<Long> usersIds)
{
if(usersIds == null)
return null;
List<UserView> views = new ArrayList<UserView>();
for(Long uId: usersIds)
{
views.add(new UserView(DaoFactory.getUserDaoImpl().load(uId)));
}
return views;
}
public static List<UserView> getTeacherViews(List<Teacher> users)
{
if(users == null)
/branches/v3/impl/src/java/pt/estgp/estgweb/domain/dao/impl/TeacherDaoImpl.java
1,6 → 1,9
package pt.estgp.estgweb.domain.dao.impl;
 
import jomm.dao.impl.AbstractDao;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.exception.GenericJDBCException;
22,6 → 25,7
*/
public class TeacherDaoImpl extends TeacherDao
{
private static final Logger logger = Logger.getLogger(TeacherDaoImpl.class);
private TeacherDaoImpl(){}
 
// protected Class getReferenceClass() {
64,25 → 68,34
}
}
 
public List<User> loadByAreaWithUnitsInLast3Years(String area, String year)
public List<Long> loadByAreaWithUnitsInLast3Years( String importYear)
{
try
{
 
String lastYear = DatesUtils.getPreviousImportYear(year);
String lastYear = DatesUtils.getPreviousImportYear(importYear);
String twoYearsAgo = DatesUtils.getPreviousImportYear(lastYear);
 
System.out.println(lastYear);
System.out.println(twoYearsAgo);
Criteria c = createCriteria();
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
if(area != null && area.trim().length()>0)
c.add(eq("mainArea",area));
c.createAlias("teachedUnits","t", JoinFragment.INNER_JOIN).add(or(eq("t.importYear",year),or(eq("t.importYear",lastYear),eq("t.importYear",twoYearsAgo))));
return c.addOrder(Order.asc("name")).list();
 
 
Query q = AbstractDao.getCurrentSession().createQuery(
"select distinct t.id from " + Teacher.class.getName() + " t " +
"join t.teachedUnits tu " +
"where tu.importYear = :importYear or " +
"tu.importYear = :lastYear or " +
"tu.importYear = :twoYearsAgo " +
"order by t.name");
q.setString("importYear",importYear);
q.setString("lastYear",lastYear);
q.setString("twoYearsAgo",twoYearsAgo);
 
return q.list();
}
catch(GenericJDBCException e)
{
logger.error(e,e);
throw e;
}
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/form/courses/CourseStudiesPlansAdminForm.java
27,15 → 27,25
 
private String perfilId;
 
private long sourcePlanId;
 
 
 
 
public CourseStudiesPlansAdminForm()
{
 
 
}
 
public long getSourcePlanId() {
return sourcePlanId;
}
 
public void setSourcePlanId(long sourcePlanId) {
this.sourcePlanId = sourcePlanId;
}
 
public String getSemestreId() {
return semestreId;
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesController.java
4,9 → 4,13
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pt.estgp.estgweb.domain.CourseStudiesPlanImpl;
import pt.estgp.estgweb.domain.views.CourseView;
import pt.estgp.estgweb.filters.exceptions.NotFoundException;
import pt.estgp.estgweb.services.courses.CoursesService;
import pt.estgp.estgweb.services.courses.xsd.Curso;
import pt.estgp.estgweb.services.courses.xsd.PerfilImpl;
import pt.estgp.estgweb.services.courses.xsd.SemestreImpl;
import pt.estgp.estgweb.services.courses.xsd.UnidadeImpl;
import pt.estgp.estgweb.services.courseunits.DirectedCoordinatedCourses;
import pt.estgp.estgweb.services.courseunits.DirectedCoordinatedUnitsService;
28,6 → 32,7
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
 
/**
* @author Jorge Machado
562,6 → 567,36
return mapping.findForward("error500");
}
}
public ActionForward removePerfil(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String perfilId = frm.getPerfilId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre()){
Iterator<Curso.Semestre.Perfil> iterPerfil = semestre.getPerfil().iterator();
while(iterPerfil.hasNext())
{
Curso.Semestre.Perfil perfil = iterPerfil.next();
if(perfil.getPerfilId().equals(perfilId))
{
iterPerfil.remove();
break;
}
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
public ActionForward addUnidadeSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
589,8 → 624,111
}
}
 
public ActionForward removeSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
Iterator<Curso.Semestre> iteSem = frm.getPlanoEstudos().getSemestre().iterator();
while(iteSem.hasNext())
{
Curso.Semestre semestre = iteSem.next();
if(semestre.getSemestreId().equals(semestreId))
{
iteSem.remove();
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward addNewSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
frm.getPlanoEstudos().getSemestre().add(new SemestreImpl());
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward addPerfilSemestre(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
String semestreId = frm.getSemestreId();
for(Curso.Semestre semestre: frm.getPlanoEstudos().getSemestre())
{
if(semestre.getSemestreId().equals(semestreId))
{
semestre.getPerfil().add(new PerfilImpl());
break;
}
}
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
public ActionForward clonarPlano(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException
{
try
{
CourseStudiesPlansAdminForm frm = (CourseStudiesPlansAdminForm) form;
long planId = frm.getCourseStudiesPlan().getId();
long sourcePlanId = frm.getSourcePlanId();
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{sourcePlanId,planId,frm.getCourseId()};
CourseStudiesPlanImpl novoPlano = (CourseStudiesPlanImpl) sm.execute(RequestUtils.getRequester(request, response), "CloneStudiesPlanVersionFrom", args, names);
frm.setCourseStudiesPlan(novoPlano);
frm.setPlanoEstudos(new CoursesService().loadCursoPlanoFromXml(novoPlano.getXml()));
addMessage(request, "course.studies.plan.cloned");
return mapping.findForward("editStudyPlan");
}
catch (Throwable e)
{
logger.error(e, e);
return mapping.findForward("error500");
}
}
 
 
 
 
 
}
/branches/v3/impl/src/java/pt/estgp/estgweb/web/controllers/contacts/ContactsController.java
37,8 → 37,10
String area = request.getParameter("area");
request.setAttribute("area",area);
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{"area"};
Object[] args = new Object[]{area};
//String[] names = new String[]{"area"};
//Object[] args = new Object[]{area};
String[] names = new String[]{};
Object[] args = new Object[]{};
List<UserView> teachers = (List<UserView>) sm.execute(RequestUtils.getRequester(request, response), "LoadTeachersWithUnitsInLast3Years", args, names);
request.setAttribute("teachers",teachers);
return mapping.findForward("contactTeachers");
/branches/v3/impl/src/updates/version/release-09-2016-planos-Estudos
7,10 → 7,13
pt.estgp.estgweb.services.courses.UpdateDepartmentsTask
 
 
2 - Correr a sincronização de planos para arranjar o XML do JaxB com os URLS das unidades e dos PDF's
3 - Correr a sincronização de planos para arranjar o XML do JaxB com os URLS das unidades e dos PDF's
 
http://pae.ipportalegre.pt/wsjson/api?service=syncSystemPlans&systemUrl=http://www.estgp.pt&setActive=true
 
ou então correr apenas a tarefa generateFreshJsonPlanosEstudosFromXml do importRoutines para refazer o json
 
 
3 - Correr as atualizações dos papeis institucionais e reiniciar sistema para assumir os papeis
"user.role.servicesStudiesPlans=Gestão de Planos de Estudos\n" +
"user.role.servicesCoursesManagement=Gestão de Cursos\n" +
/branches/v3/impl/src/updates/version/QuestoesBacoFuturoEscolas
New file
0,0 → 1,3
 
 
-> Sincronização de Planos de Estudos de Cursos atualiza Comissões de Curso
/branches/v3/impl/src/web/admin/courses/course.jsp
274,8 → 274,10
<div class="form-group">
<label class="control-label col-sm-2">
<bean:message key="course.studies.plan"/>(Versão nova PAE)
 
<baco:hasRole role="admin,all,servicesStudiesPlans">
<a class="btn btn-default" href="<%=request.getContextPath()%>/user/adminStudyPlans.do?courseId=<%=CourseView.getId()%>">Gerir Planos</a>
<a class="btn btn-warning" href="<%=request.getContextPath()%>/user/adminStudyPlans.do?courseId=<%=CourseView.getId()%>">
<span class="glyphicon glyphicon-pencil"></span> Gerir Planos</a>
</baco:hasRole>
<baco:hasNotRole role="admin,all,servicesStudiesPlans">
<label class="text-info"> Necessita do papel de Gestão de Planos de Estudos para editar os planos</label>
/branches/v3/impl/src/web/user/courses/courseApiJson.jsp
1,45 → 1,38
<%@ page import="jomm.dao.impl.AbstractDao"%><%@ page import="org.json.JSONObject"%><%@ page import="pt.estgp.estgweb.domain.Course"%><%@ page import="pt.estgp.estgweb.domain.Teacher"%><%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory"%><%@ page contentType="application/json;charset=UTF-8" language="java" %>
<%@ page import="jomm.dao.impl.AbstractDao"%><%@ page import="org.json.JSONObject"%><%@ page import="pt.estgp.estgweb.domain.Course"%><%@ page import="pt.estgp.estgweb.domain.Teacher"%><%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory"%><%@ page import="pt.estgp.estgweb.web.UserSessionProxy"%><%@ page import="pt.estgp.estgweb.domain.UserSession"%><%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager"%><%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager"%><%@ page import="pt.estgp.estgweb.domain.CourseStudiesPlanImpl"%><%@ page import="pt.estgp.estgweb.web.utils.RequestUtils"%><%@ page contentType="application/json;charset=UTF-8" language="java" %>
<%
try{
UserSession userSession = UserSessionProxy.loadUserSessionFromRequest(request);
String service = request.getParameter("service");
JSONObject json = new JSONObject();
if(service.equals("removeCourseComissionTeacher"))
if(service.equals("removeCourseComissionTeacher") )
{
 
String teacherId = request.getParameter("teacherId");
String courseId = request.getParameter("courseId");
 
AbstractDao.getCurrentSession().beginTransaction();
 
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
 
t.removeRole(course.getValidationRole());
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{teacherId,courseId};
sm.execute(RequestUtils.getRequester(request, response), "RemoveTeacherCourseCommission", args, names);
json.put("response","done");
 
AbstractDao.getCurrentSession().getTransaction().commit();
}
else if(service.equals("addCourseComissionTeacher"))
{
 
String teacherId = request.getParameter("teacherId");
String courseId = request.getParameter("courseId");
 
AbstractDao.getCurrentSession().beginTransaction();
 
Course course = DaoFactory.getCourseDaoImpl().load(new Long(courseId));
Teacher t = DaoFactory.getTeacherDaoImpl().load(new Long(teacherId));
 
t.addRole(course.getValidationRole());
 
IServiceManager sm = ServiceManager.getInstance();
String[] names = new String[]{};
Object[] args = new Object[]{teacherId,courseId};
Teacher t = (Teacher) sm.execute(RequestUtils.getRequester(request, response), "AddTeacherCourseCommission", args, names);
json.put("response","done");
json.put("teacherName",t.getName());
json.put("teacherEmail",t.getEmail());
json.put("teacherCode",t.getSigesCode());
json.put("teacherId",t.getId());
 
AbstractDao.getCurrentSession().getTransaction().commit();
}
else if(!userSession.getUser().hasRole("servicesCoursesManagement"))
{
json.put("response","no permission");
}
 
 
 
/branches/v3/impl/src/web/user/courses/studiesPlansAdministrationEdit.jsp
3,8 → 3,9
<%@ page import="pt.estgp.estgweb.domain.CourseStudiesPlan" %>
<%@ page import="pt.estgp.estgweb.domain.CourseStudiesPlanImpl" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.services.courses.CoursesService" %>
<%@ page import="pt.estgp.estgweb.web.form.courses.CourseStudiesPlansAdminForm" %>
<%@ page import="pt.estgp.estgweb.services.courses.CoursesService" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
<%@ taglib uri="/WEB-INF/tlds/struts-html.tld" prefix="html" %>
80,8 → 81,6
<div class="panel panel-default">
<div class="panel-heading">
Edição do plano de estudos. Versão <%=versaoPlano%> <%=ultimaVersao? "(<u>é a versão em vigor</u>)":""%> do curso de <%=course.getName()%> (<%=course.getCode()%>)
 
<button data-toggle="modal" data-target="#modalNovaVersaoDePlano" title="Adicionar Versão do Plano de Estudos" class="btn btn-success pull-right"><span class="glyphicon glyphicon-plus"></span></button>
</div>
<div class="panel-body">
 
138,380 → 137,453
 
</div>
</div>
<html:form action="/user/courseControllerStudiesPlan" styleId="CourseStudiesPlansAdminForm" styleClass="form-horizontal">
<div class="panel panel-warning">
<div class="panel-heading"><span class="glyphicon glyphicon-wrench"></span> Clonagem a partir de outro plano de Estudos</div>
<div class="panel-body">
 
 
<div class="panel panel-default">
<div class="panel-heading">Plano de Estudos</div>
<div class="panel-body">
<html:form action="/user/courseControllerStudiesPlan" styleClass="form-horizontal">
<%
CourseStudiesPlansAdminForm courseStudiesPlansAdminForm = (CourseStudiesPlansAdminForm) request.getAttribute("CourseStudiesPlansAdminForm");
if(courseStudiesPlansAdminForm.getCourseStudiesPlan().getId() <= 0)
{
courseStudiesPlansAdminForm.setCourseStudiesPlan(planoEdicao);
courseStudiesPlansAdminForm.setCourseId(courseId);
courseStudiesPlansAdminForm.setVersaoVigor(ultimaVersao);
courseStudiesPlansAdminForm.setPlanoEstudos(new CoursesService().loadCursoPlanoFromXml(planoEdicao.getXml()));
}
%>
<input type="hidden" name="dispatch" value="savePlano"/>
<html:hidden property="courseId"/>
<html:hidden property="versaoVigor"/>
<html:hidden property="courseStudiesPlan.id"/>
<html:hidden styleId="semestreId" property="semestreId"/>
<html:hidden styleId="perfilId" property="perfilId"/>
 
<div class="form-group">
<label class="control-label col-sm-2">Versão</label>
<label class="control-label col-sm-2">Versão Fonte para Clonagem</label>
<div class="col-sm-10">
<html:text styleClass="form-control" property="courseStudiesPlan.version" size="3"/>
<html:select styleClass="form-control" property="sourcePlanId">
<html:option value="">Nenhuma</html:option>
<%
for(CourseStudiesPlan plan:course.getStudiesPlans())
{
if(plan.getId() != studyPlanId)
{
request.setAttribute("nowPlanId",plan.getId());
%>
<html:option value="${nowPlanId}">Versão <%=plan.getVersion()%></html:option>
<%
}
 
}
%>
</html:select>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Descrição</label>
<div class="col-sm-10">
<html:text styleClass="form-control" property="courseStudiesPlan.versionDescription"/>
</div>
</div>
<button class="btn btn-warning" type="button" data-toggle="modal" data-target="#confirm-ModalFunction" data-message="Esta operação vai sobrepor os dados do plano de estudos atual com os dados da versão escolhida!! Tem a certeza que deseja prosseguir?" data-script="set($('#CourseStudiesPlansAdminForm').get(0),'clonarPlano');$('#CourseStudiesPlansAdminForm').get(0).submit();">
Clonar para a fonte escolhida
</button>
 
<%
int dummyIndexIdUnidades = 0;
int dummyIndexPerfilId = 0;
int dummyIndexSemestreId = 0;
 
%>
<script>
 
function sendUpUnidadeCurricular(dummyIndexId)
{
sendFieldUp("removed",dummyIndexId);
sendFieldUp("siges",dummyIndexId);
sendFieldUp("nome",dummyIndexId);
sendFieldUp("nomeEn",dummyIndexId);
sendFieldUp("nomeEs",dummyIndexId);
sendFieldUp("nomeFr",dummyIndexId);
</div>
</div>
 
sendFieldUp("totalHoras",dummyIndexId);
sendFieldUp("horasContactoT",dummyIndexId);
sendFieldUp("horasContactoTP",dummyIndexId);
sendFieldUp("horasContactoP",dummyIndexId);
sendFieldUp("horasContactoPL",dummyIndexId);
sendFieldUp("horasContactoPD",dummyIndexId);
sendFieldUp("horasContactoOT",dummyIndexId);
sendFieldUp("horasContactoE",dummyIndexId);
sendFieldUp("horasContactoS",dummyIndexId);
sendFieldUp("horasContactoTC",dummyIndexId);
sendFieldUp("horasContactoO",dummyIndexId);
sendFieldUp("ECTS",dummyIndexId);
sendFieldUp("urlUnidadeCurricular",dummyIndexId);
sendFieldUp("urlFichaCurricular",dummyIndexId);
 
}
function sendDownUnidadeCurricular(dummyIndexId)
{
sendFieldDown("removed",dummyIndexId);
sendFieldDown("siges",dummyIndexId);
sendFieldDown("nome",dummyIndexId);
sendFieldDown("nomeEn",dummyIndexId);
sendFieldDown("nomeEs",dummyIndexId);
sendFieldDown("nomeFr",dummyIndexId);
<div class="panel panel-default">
<div class="panel-heading">Plano de Estudos
 
sendFieldDown("totalHoras",dummyIndexId);
sendFieldDown("horasContactoT",dummyIndexId);
sendFieldDown("horasContactoTP",dummyIndexId);
sendFieldDown("horasContactoP",dummyIndexId);
sendFieldDown("horasContactoPL",dummyIndexId);
sendFieldDown("horasContactoPD",dummyIndexId);
sendFieldDown("horasContactoOT",dummyIndexId);
sendFieldDown("horasContactoE",dummyIndexId);
sendFieldDown("horasContactoS",dummyIndexId);
sendFieldDown("horasContactoTC",dummyIndexId);
sendFieldDown("horasContactoO",dummyIndexId);
sendFieldDown("ECTS",dummyIndexId);
sendFieldDown("urlUnidadeCurricular",dummyIndexId);
sendFieldDown("urlFichaCurricular",dummyIndexId);
<button style="margin-left: 4px" type="button" class="btn btn-success pull-right" onclick="set(this.form,'addNewSemestre');this.form.submit()">
<span class="glyphicon glyphicon-plus"> </span> Semestre
</button>
</div>
<div class="panel-body">
 
}
function sendFieldUp(field,dummyIndexId){
nome = $("#" + field + "dummyIndex" + dummyIndexId).val();
$("#" + field + "dummyIndex" + (dummyIndexId)).val($("#" + field + "dummyIndex" + (dummyIndexId-1)).val());
$("#" + field + "dummyIndex" + (dummyIndexId-1)).val(nome);
}
function sendFieldDown(field,dummyIndexId){
nome = $("#" + field + "dummyIndex" + dummyIndexId).val();
$("#" + field + "dummyIndex" + (dummyIndexId)).val($("#" + field + "dummyIndex" + (dummyIndexId+1)).val());
$("#" + field + "dummyIndex" + (dummyIndexId+1)).val(nome);
}
function removeUnit(dummyIndexId)
{
$("#removed" + "dummyIndex" + dummyIndexId).val("true");
$("#removed" + "dummyIndex" + dummyIndexId).closest("tr").hide("slow");
 
}
</script>
<nested:notEmpty property="planoEstudos">
<%
CourseStudiesPlansAdminForm courseStudiesPlansAdminForm = (CourseStudiesPlansAdminForm) request.getAttribute("CourseStudiesPlansAdminForm");
//Form ainda não iniciado vai iniciar é a primeira vez
if(courseStudiesPlansAdminForm.getCourseStudiesPlan().getId() <= 0)
{
courseStudiesPlansAdminForm.setCourseStudiesPlan(planoEdicao);
courseStudiesPlansAdminForm.setCourseId(courseId);
courseStudiesPlansAdminForm.setVersaoVigor(ultimaVersao);
courseStudiesPlansAdminForm.setPlanoEstudos(new CoursesService().loadCursoPlanoFromXml(planoEdicao.getXml()));
}
%>
<input type="hidden" name="dispatch" value="savePlano"/>
<html:hidden property="courseId"/>
<html:hidden property="versaoVigor"/>
<html:hidden property="courseStudiesPlan.id"/>
<html:hidden styleId="semestreId" property="semestreId"/>
<html:hidden styleId="perfilId" property="perfilId"/>
 
<html:hidden property="planoEstudos.siges"/>
<html:hidden property="planoEstudos.nome"/>
<html:hidden property="planoEstudos.dep"/>
<nested:iterate id="semestre" property="planoEstudos.semestre" type="pt.estgp.estgweb.services.courses.xsd.Curso.Semestre">
<div class="panel panel-default">
<div class="panel-heading">
<div class="form-group">
<label class="control-label col-sm-2">Versão</label>
<div class="col-sm-10">
<html:text styleClass="form-control" property="courseStudiesPlan.version" size="3"/>
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2">Descrição</label>
<div class="col-sm-10">
<html:text styleClass="form-control" property="courseStudiesPlan.versionDescription"/>
</div>
</div>
 
<nested:select property="id">
<html:option value="S1">Semestre 1</html:option>
<html:option value="S2">Semestre 2</html:option>
<html:option value="S3">Semestre 3</html:option>
<html:option value="S4">Semestre 4</html:option>
<html:option value="S5">Semestre 5</html:option>
<html:option value="S6">Semestre 6</html:option>
<html:option value="T1">Trimestre 1</html:option>
<html:option value="T2">Trimestre 2</html:option>
<html:option value="T3">Trimestre 3</html:option>
<html:option value="T4">Trimestre 4</html:option>
<html:option value="T5">Trimestre 5</html:option>
<html:option value="T6">Trimestre 6</html:option>
<html:option value="T7">Trimestre 7</html:option>
<html:option value="T8">Trimestre 8</html:option>
</nested:select>
<%
int dummyIndexIdUnidades = 0;
int dummyIndexPerfilId = 0;
int dummyIndexSemestreId = 0;
 
<%
dummyIndexSemestreId++;
request.setAttribute("dummyIndexSemestreId",dummyIndexSemestreId);
%>
<nested:hidden property="semestreId" value="semestreDummy${dummyIndexSemestreId}"/>
<button type="button" class="btn btn-default" onclick="form.action=form.action+'#semestreDummy${dummyIndexSemestreId}';$('#semestreId').val('semestreDummy${dummyIndexSemestreId}');set(this.form,'addUnidadeSemestre');this.form.submit()">
<span class="glyphicon glyphicon-plus"> Adicionar Unidade ao Semestre</span>
</button>
<a name="semestreDummy${dummyIndexSemestreId}"></a>
</div>
<div class="panel-body">
%>
<script>
 
function sendUpUnidadeCurricular(dummyIndexId)
{
sendFieldUp("removed",dummyIndexId);
sendFieldUp("siges",dummyIndexId);
sendFieldUp("nome",dummyIndexId);
sendFieldUp("nomeEn",dummyIndexId);
sendFieldUp("nomeEs",dummyIndexId);
sendFieldUp("nomeFr",dummyIndexId);
 
<button class="btn btn-default" data-toggle="collapse" type="button" data-target=".langs">Ver Campos Multingua</button>
<nested:iterate id="perfil" property="perfil" type="pt.estgp.estgweb.services.courses.xsd.Curso.Semestre.Perfil">
<div class="panel panel-default">
<div class="panel-heading">
sendFieldUp("totalHoras",dummyIndexId);
sendFieldUp("horasContactoT",dummyIndexId);
sendFieldUp("horasContactoTP",dummyIndexId);
sendFieldUp("horasContactoP",dummyIndexId);
sendFieldUp("horasContactoPL",dummyIndexId);
sendFieldUp("horasContactoPD",dummyIndexId);
sendFieldUp("horasContactoOT",dummyIndexId);
sendFieldUp("horasContactoE",dummyIndexId);
sendFieldUp("horasContactoS",dummyIndexId);
sendFieldUp("horasContactoTC",dummyIndexId);
sendFieldUp("horasContactoO",dummyIndexId);
sendFieldUp("ECTS",dummyIndexId);
sendFieldUp("urlUnidadeCurricular",dummyIndexId);
sendFieldUp("urlFichaCurricular",dummyIndexId);
 
PERFIL <nested:text styleClass="form-control" property="nome"/>
<%
dummyIndexPerfilId++;
request.setAttribute("dummyIndexPerfilId",dummyIndexPerfilId);
%>
<nested:hidden property="perfilId" value="perfilDummy${dummyIndexPerfilId}"/>
}
function sendDownUnidadeCurricular(dummyIndexId)
{
sendFieldDown("removed",dummyIndexId);
sendFieldDown("siges",dummyIndexId);
sendFieldDown("nome",dummyIndexId);
sendFieldDown("nomeEn",dummyIndexId);
sendFieldDown("nomeEs",dummyIndexId);
sendFieldDown("nomeFr",dummyIndexId);
 
<button type="button" class="btn btn-default" onclick="form.action=form.action+'#perfilDummy${dummyIndexPerfilId}';$('#perfilId').val('perfilDummy${dummyIndexPerfilId}');set(this.form,'addUnidadePerfil');this.form.submit()">
<span class="glyphicon glyphicon-plus"> Adicionar Unidade ao Perfil</span>
sendFieldDown("totalHoras",dummyIndexId);
sendFieldDown("horasContactoT",dummyIndexId);
sendFieldDown("horasContactoTP",dummyIndexId);
sendFieldDown("horasContactoP",dummyIndexId);
sendFieldDown("horasContactoPL",dummyIndexId);
sendFieldDown("horasContactoPD",dummyIndexId);
sendFieldDown("horasContactoOT",dummyIndexId);
sendFieldDown("horasContactoE",dummyIndexId);
sendFieldDown("horasContactoS",dummyIndexId);
sendFieldDown("horasContactoTC",dummyIndexId);
sendFieldDown("horasContactoO",dummyIndexId);
sendFieldDown("ECTS",dummyIndexId);
sendFieldDown("urlUnidadeCurricular",dummyIndexId);
sendFieldDown("urlFichaCurricular",dummyIndexId);
 
}
function sendFieldUp(field,dummyIndexId){
nome = $("#" + field + "dummyIndex" + dummyIndexId).val();
$("#" + field + "dummyIndex" + (dummyIndexId)).val($("#" + field + "dummyIndex" + (dummyIndexId-1)).val());
$("#" + field + "dummyIndex" + (dummyIndexId-1)).val(nome);
}
function sendFieldDown(field,dummyIndexId){
nome = $("#" + field + "dummyIndex" + dummyIndexId).val();
$("#" + field + "dummyIndex" + (dummyIndexId)).val($("#" + field + "dummyIndex" + (dummyIndexId+1)).val());
$("#" + field + "dummyIndex" + (dummyIndexId+1)).val(nome);
}
function removeUnit(dummyIndexId)
{
$("#removed" + "dummyIndex" + dummyIndexId).val("true");
$("#removed" + "dummyIndex" + dummyIndexId).closest("tr").hide("slow");
 
}
</script>
<nested:notEmpty property="planoEstudos">
 
<html:hidden property="planoEstudos.siges"/>
<html:hidden property="planoEstudos.nome"/>
<html:hidden property="planoEstudos.dep"/>
<nested:iterate id="semestre" property="planoEstudos.semestre" type="pt.estgp.estgweb.services.courses.xsd.Curso.Semestre">
<div class="panel panel-default">
<div class="panel-heading">
 
<div class="form-group">
<%
dummyIndexSemestreId++;
request.setAttribute("dummyIndexSemestreId",dummyIndexSemestreId);
%>
<nested:hidden property="semestreId" value="semestreDummy${dummyIndexSemestreId}"/>
<div class="col-sm-1">
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#confirm-ModalFunction" data-message="Esta operação vai remover todas as unidades e perfis deste semestre!! Tem a certeza que deseja prosseguir? A operação não afeta as unidades nem os cursos do PAE, apenas o plano." data-script="$('#semestreId').val('semestreDummy${dummyIndexSemestreId}');set($('#CourseStudiesPlansAdminForm').get(0),'removeSemestre');$('#CourseStudiesPlansAdminForm').get(0).submit()">
<span class="glyphicon glyphicon-remove"> </span>
</button>
<a name="perfilDummy${dummyIndexPerfilId}"></a>
</div>
<div class="panel-body">
<table class="tablesorterfiltered">
<thead>
<tr>
<td></td>
<td></td>
<th>SIGES</th>
<th>Nome</th>
<th>Total</th>
<th>T</th>
<th>TP</th>
<th>P</th>
<th>PL</th>
<th>PD</th>
<th>OT</th>
<th>E</th>
<th>S</th>
<th>TC</th>
<th>O</th>
<th>ECTS</th>
<th>URL UNIDADE</th>
<th>FICHA URL</th>
</tr>
</thead>
<tbody>
<nested:size id="tamanho" property="unidade"/>
<nested:iterate id="unit" indexId="indexId" property="unidade" type="pt.estgp.estgweb.services.courses.xsd.UnidadeType">
<div class="col-sm-1">
Duração
</div>
<div class="col-sm-4">
<nested:select styleClass="form-control" property="id">
<html:option value="S1">Semestre 1</html:option>
<html:option value="S2">Semestre 2</html:option>
<html:option value="S3">Semestre 3</html:option>
<html:option value="S4">Semestre 4</html:option>
<html:option value="S5">Semestre 5</html:option>
<html:option value="S6">Semestre 6</html:option>
<html:option value="T1">Trimestre 1</html:option>
<html:option value="T2">Trimestre 2</html:option>
<html:option value="T3">Trimestre 3</html:option>
<html:option value="T4">Trimestre 4</html:option>
<html:option value="T5">Trimestre 5</html:option>
<html:option value="T6">Trimestre 6</html:option>
<html:option value="T7">Trimestre 7</html:option>
<html:option value="T8">Trimestre 8</html:option>
</nested:select>
</div>
<div class="col-sm-6">
 
<button style="margin-left: 4px" type="button" class="btn btn-success pull-right" onclick="form.action=form.action+'#semestreDummy${dummyIndexSemestreId}';$('#semestreId').val('semestreDummy${dummyIndexSemestreId}');set(this.form,'addUnidadeSemestre');this.form.submit()">
<span class="glyphicon glyphicon-plus"> </span> Unidade
</button>
 
<button style="margin-left: 4px" type="button" class="btn btn-success pull-right" onclick="form.action=form.action+'#semestreDummy${dummyIndexSemestreId}';$('#semestreId').val('semestreDummy${dummyIndexSemestreId}');set(this.form,'addPerfilSemestre');this.form.submit()">
<span class="glyphicon glyphicon-plus"> </span> Perfil
</button>
 
<a name="semestreDummy${dummyIndexSemestreId}"></a>
</div>
</div>
</div>
<div class="panel-body">
 
 
<button class="btn btn-default" data-toggle="collapse" type="button" data-target=".langs">Ver Campos Multingua</button>
<nested:iterate id="perfil" property="perfil" type="pt.estgp.estgweb.services.courses.xsd.Curso.Semestre.Perfil">
<div class="panel panel-default">
<div class="panel-heading">
<div class="form-group">
<%
dummyIndexIdUnidades++;
request.setAttribute("dummyIndexIdUnidades","dummyIndex" + dummyIndexIdUnidades);
dummyIndexPerfilId++;
request.setAttribute("dummyIndexPerfilId",dummyIndexPerfilId);
%>
<%
int tamanhoMinus1 = tamanho - 1;
request.setAttribute("tamanhoMinus1",tamanhoMinus1);
<a name="perfilDummy${dummyIndexPerfilId}"></a>
<nested:hidden property="perfilId" value="perfilDummy${dummyIndexPerfilId}"/>
<div class="col-sm-1">
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#confirm-ModalFunction" data-message="Esta operação vai remover todas as unidades deste perfil!! Tem a certeza que deseja prosseguir? A operação não afeta as unidades nem os cursos do PAE, apenas o plano." data-script="$('#CourseStudiesPlansAdminForm').get(0).action=$('#CourseStudiesPlansAdminForm').get(0).action+'#semestreDummy${dummyIndexSemestreId}';$('#perfilId').val('perfilDummy${dummyIndexPerfilId}');set($('#CourseStudiesPlansAdminForm').get(0),'removePerfil');$('#CourseStudiesPlansAdminForm').get(0).submit()">
<span class="glyphicon glyphicon-remove"> </span>
</button>
</div>
<div class="col-sm-1">
Perfil
</div>
<div class="col-sm-6">
<nested:text styleClass="form-control" property="nome"/>
</div>
<div class="col-sm-4">
<button type="button" class="btn btn-success pull-right" onclick="form.action=form.action+'#perfilDummy${dummyIndexPerfilId}';$('#perfilId').val('perfilDummy${dummyIndexPerfilId}');set(this.form,'addUnidadePerfil');this.form.submit()">
<span class="glyphicon glyphicon-plus"> </span> Unidade
</button>
</div>
</div>
</div>
<div class="panel-body">
<table class="tablesorterfiltered">
<thead>
<tr>
<td></td>
<td></td>
<th>SIGES</th>
<th>Nome</th>
<th>Total</th>
<th>T</th>
<th>TP</th>
<th>P</th>
<th>PL</th>
<th>PD</th>
<th>OT</th>
<th>E</th>
<th>S</th>
<th>TC</th>
<th>O</th>
<th>ECTS</th>
<th>URL UNIDADE</th>
<th>FICHA URL</th>
</tr>
</thead>
<tbody>
<nested:size id="tamanho" property="unidade"/>
<nested:iterate id="unit" indexId="indexId" property="unidade" type="pt.estgp.estgweb.services.courses.xsd.UnidadeType">
 
%>
<tr <nested:equal property="removed" value="true">class="hidden"</nested:equal>>
<td class="text-nowrap">
<%
dummyIndexIdUnidades++;
request.setAttribute("dummyIndexIdUnidades","dummyIndex" + dummyIndexIdUnidades);
%>
<%
int tamanhoMinus1 = tamanho - 1;
request.setAttribute("tamanhoMinus1",tamanhoMinus1);
 
<nested:greaterThan value="0" name="indexId">
<button type="button" class="btn btn-warning" onclick="sendUpUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-up"> </span>
%>
<tr <nested:equal property="removed" value="true">class="hidden"</nested:equal>>
<td class="text-nowrap">
 
<nested:greaterThan value="0" name="indexId">
<button type="button" class="btn btn-warning" onclick="sendUpUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-up"> </span>
</button>
</nested:greaterThan>
<nested:lessThan name="indexId" value="${tamanhoMinus1}">
<button type="button" class="btn btn-warning" onclick="sendDownUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-down"> </span>
</button>
</nested:lessThan>
</td>
<td>
<nested:hidden styleId="removed${dummyIndexIdUnidades}" property="removed"/>
<button type="button" class="btn btn-danger" onclick="removeUnit(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-remove"> </span>
</button>
</nested:greaterThan>
<nested:lessThan name="indexId" value="${tamanhoMinus1}">
<button type="button" class="btn btn-warning" onclick="sendDownUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-down"> </span>
</button>
</nested:lessThan>
</td>
<td>
<nested:hidden styleId="removed${dummyIndexIdUnidades}" property="removed"/>
<button type="button" class="btn btn-danger" onclick="removeUnit(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-remove"> </span>
</button>
</td>
<td><nested:text styleId="siges${dummyIndexIdUnidades}" styleClass="form-control" property="siges"/></td>
<td>
<div>
<div class="col-sm-1">(PT)</div>
<div class="col-sm-11"><nested:text styleId="nome${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nome"/></div>
</td>
<td><nested:text styleId="siges${dummyIndexIdUnidades}" styleClass="form-control" property="siges"/></td>
<td>
<div>
<div class="col-sm-1">(PT)</div>
<div class="col-sm-11"><nested:text styleId="nome${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nome"/></div>
 
<div class="langs collapse" >
<div class="col-sm-1">(EN)</div>
<div class="col-sm-11"><nested:text styleId="nomeEn${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEn"/></div>
<div class="col-sm-1">(ES)</div>
<div class="col-sm-11"><nested:text styleId="nomeEs${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEs"/></div>
<div class="col-sm-1">(FR)</div>
<div class="col-sm-11"><nested:text styleId="nomeFr${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeFr"/></div>
<div class="langs collapse" >
<div class="col-sm-1">(EN)</div>
<div class="col-sm-11"><nested:text styleId="nomeEn${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEn"/></div>
<div class="col-sm-1">(ES)</div>
<div class="col-sm-11"><nested:text styleId="nomeEs${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEs"/></div>
<div class="col-sm-1">(FR)</div>
<div class="col-sm-11"><nested:text styleId="nomeFr${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeFr"/></div>
</div>
</div>
</div>
 
</td>
<td><nested:text styleClass="form-control" styleId="totalHoras${dummyIndexIdUnidades}" property="totalHoras"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoT${dummyIndexIdUnidades}" property="horasContacto.t"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTP${dummyIndexIdUnidades}" property="horasContacto.TP"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoP${dummyIndexIdUnidades}" property="horasContacto.p"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPL${dummyIndexIdUnidades}" property="horasContacto.PL"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPD${dummyIndexIdUnidades}" property="horasContacto.PD"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoOT${dummyIndexIdUnidades}" property="horasContacto.OT"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoE${dummyIndexIdUnidades}" property="horasContacto.e"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoS${dummyIndexIdUnidades}" property="horasContacto.s"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTC${dummyIndexIdUnidades}" property="horasContacto.TC"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
</tr>
</nested:iterate>
</tbody>
</table>
</td>
<td><nested:text styleClass="form-control" styleId="totalHoras${dummyIndexIdUnidades}" property="totalHoras"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoT${dummyIndexIdUnidades}" property="horasContacto.t"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTP${dummyIndexIdUnidades}" property="horasContacto.TP"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoP${dummyIndexIdUnidades}" property="horasContacto.p"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPL${dummyIndexIdUnidades}" property="horasContacto.PL"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPD${dummyIndexIdUnidades}" property="horasContacto.PD"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoOT${dummyIndexIdUnidades}" property="horasContacto.OT"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoE${dummyIndexIdUnidades}" property="horasContacto.e"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoS${dummyIndexIdUnidades}" property="horasContacto.s"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTC${dummyIndexIdUnidades}" property="horasContacto.TC"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
</tr>
</nested:iterate>
</tbody>
</table>
</div>
</div>
</div>
 
</nested:iterate>
</nested:iterate>
 
<nested:notEmpty property="unidade">
<nested:notEmpty property="unidade">
 
<table class="tablesorterfiltered">
<thead>
<tr>
<th></th>
<th></th>
<th>SIGES</th>
<th>Nome</th>
<th>Total</th>
<th>T</th>
<th>TP</th>
<th>P</th>
<th>PL</th>
<th>PD</th>
<th>OT</th>
<th>E</th>
<th>S</th>
<th>TC</th>
<th>O</th>
<th>ECTS</th>
<th>URL UNIDADE</th>
<th>FICHA URL</th>
</tr>
</thead>
<tbody>
<nested:size id="tamanho" property="unidade"/>
<nested:iterate id="unit" property="unidade" indexId="indexId" type="pt.estgp.estgweb.services.courses.xsd.UnidadeType">
<%
dummyIndexIdUnidades++;
request.setAttribute("dummyIndexIdUnidades","dummyIndex" + dummyIndexIdUnidades);
%>
<%
int tamanhoMinus1 = tamanho - 1;
request.setAttribute("tamanhoMinus1",tamanhoMinus1);
<table class="tablesorterfiltered">
<thead>
<tr>
<th></th>
<th></th>
<th>SIGES</th>
<th>Nome</th>
<th>Total</th>
<th>T</th>
<th>TP</th>
<th>P</th>
<th>PL</th>
<th>PD</th>
<th>OT</th>
<th>E</th>
<th>S</th>
<th>TC</th>
<th>O</th>
<th>ECTS</th>
<th>URL UNIDADE</th>
<th>FICHA URL</th>
</tr>
</thead>
<tbody>
<nested:size id="tamanho" property="unidade"/>
<nested:iterate id="unit" property="unidade" indexId="indexId" type="pt.estgp.estgweb.services.courses.xsd.UnidadeType">
<%
dummyIndexIdUnidades++;
request.setAttribute("dummyIndexIdUnidades","dummyIndex" + dummyIndexIdUnidades);
%>
<%
int tamanhoMinus1 = tamanho - 1;
request.setAttribute("tamanhoMinus1",tamanhoMinus1);
 
%>
%>
 
<tr <nested:equal property="removed" value="true">class="hidden"</nested:equal>>
<td class="text-nowrap">
<tr <nested:equal property="removed" value="true">class="hidden"</nested:equal>>
<td class="text-nowrap">
 
<nested:greaterThan value="0" name="indexId">
<button type="button" class="btn btn-warning" onclick="sendUpUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-up"> </span>
<nested:greaterThan value="0" name="indexId">
<button type="button" class="btn btn-warning" onclick="sendUpUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-up"> </span>
</button>
</nested:greaterThan>
<nested:lessThan name="indexId" value="${tamanhoMinus1}">
<button type="button" class="btn btn-warning" onclick="sendDownUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-down"> </span>
</button>
</nested:lessThan>
</td>
<td>
<nested:hidden styleId="removed${dummyIndexIdUnidades}" property="removed"/>
<button type="button" class="btn btn-danger" onclick="removeUnit(<%=dummyIndexIdUnidades%>)" >
<span class="glyphicon glyphicon-remove"> </span>
</button>
</nested:greaterThan>
<nested:lessThan name="indexId" value="${tamanhoMinus1}">
<button type="button" class="btn btn-warning" onclick="sendDownUnidadeCurricular(<%=dummyIndexIdUnidades%>)">
<span class="glyphicon glyphicon-arrow-down"> </span>
</button>
</nested:lessThan>
</td>
<td>
<nested:hidden styleId="removed${dummyIndexIdUnidades}" property="removed"/>
<button type="button" class="btn btn-danger" onclick="removeUnit(<%=dummyIndexIdUnidades%>)" >
<span class="glyphicon glyphicon-remove"> </span>
</button>
</td>
<td><nested:text styleId="siges${dummyIndexIdUnidades}" styleClass="form-control" property="siges"/></td>
<td>
<div>
<div class="col-sm-1">(PT)</div>
<div class="col-sm-11"><nested:text styleId="nome${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nome"/></div>
</td>
<td><nested:text styleId="siges${dummyIndexIdUnidades}" styleClass="form-control" property="siges"/></td>
<td>
<div>
<div class="col-sm-1">(PT)</div>
<div class="col-sm-11"><nested:text styleId="nome${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nome"/></div>
 
<div class="langs collapse" >
<div class="col-sm-1">(EN)</div>
<div class="col-sm-11"><nested:text styleId="nomeEn${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEn"/></div>
<div class="col-sm-1">(ES)</div>
<div class="col-sm-11"><nested:text styleId="nomeEs${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEs"/></div>
<div class="col-sm-1">(FR)</div>
<div class="col-sm-11"><nested:text styleId="nomeFr${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeFr"/></div>
<div class="langs collapse" >
<div class="col-sm-1">(EN)</div>
<div class="col-sm-11"><nested:text styleId="nomeEn${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEn"/></div>
<div class="col-sm-1">(ES)</div>
<div class="col-sm-11"><nested:text styleId="nomeEs${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeEs"/></div>
<div class="col-sm-1">(FR)</div>
<div class="col-sm-11"><nested:text styleId="nomeFr${dummyIndexIdUnidades}" style="width:300px" styleClass="form-control" property="nomeFr"/></div>
</div>
</div>
</div>
 
</td>
<td><nested:text styleClass="form-control" styleId="totalHoras${dummyIndexIdUnidades}" property="totalHoras"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoT${dummyIndexIdUnidades}" property="horasContacto.t"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTP${dummyIndexIdUnidades}" property="horasContacto.TP"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoP${dummyIndexIdUnidades}" property="horasContacto.p"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPL${dummyIndexIdUnidades}" property="horasContacto.PL"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPD${dummyIndexIdUnidades}" property="horasContacto.PD"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoOT${dummyIndexIdUnidades}" property="horasContacto.OT"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoE${dummyIndexIdUnidades}" property="horasContacto.e"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoS${dummyIndexIdUnidades}" property="horasContacto.s"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTC${dummyIndexIdUnidades}" property="horasContacto.TC"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
</tr>
</nested:iterate>
</tbody>
</table>
</nested:notEmpty>
</td>
<td><nested:text styleClass="form-control" styleId="totalHoras${dummyIndexIdUnidades}" property="totalHoras"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoT${dummyIndexIdUnidades}" property="horasContacto.t"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTP${dummyIndexIdUnidades}" property="horasContacto.TP"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoP${dummyIndexIdUnidades}" property="horasContacto.p"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPL${dummyIndexIdUnidades}" property="horasContacto.PL"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoPD${dummyIndexIdUnidades}" property="horasContacto.PD"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoOT${dummyIndexIdUnidades}" property="horasContacto.OT"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoE${dummyIndexIdUnidades}" property="horasContacto.e"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoS${dummyIndexIdUnidades}" property="horasContacto.s"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoTC${dummyIndexIdUnidades}" property="horasContacto.TC"/></td>
<td><nested:text styleClass="form-control" styleId="horasContactoO${dummyIndexIdUnidades}" property="horasContacto.o"/></td>
<td><nested:text styleClass="form-control" styleId="ECTS${dummyIndexIdUnidades}" property="ECTS"/></td>
<td><nested:text styleClass="form-control" styleId="urlUnidadeCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlUnidadeCurricular"/></td>
<td><nested:text styleClass="form-control" styleId="urlFichaCurricular${dummyIndexIdUnidades}" style="width:600px" property="urlFichaCurricular"/></td>
</tr>
</nested:iterate>
</tbody>
</table>
</nested:notEmpty>
 
</div>
</div>
</div>
 
</nested:iterate>
</nested:iterate>
 
</nested:notEmpty>
</nested:notEmpty>
 
<button type="button" class="btn btn-danger" data-dismiss="modal">Cancelar</button>
<html:submit styleClass="btn btn-success" >Salvar</html:submit>
<a type="button" class="btn btn-danger" href="<%=request.getContextPath()%>/user/adminStudyPlans.do?courseId=${courseId}">Cancelar</a>
<html:submit styleClass="btn btn-success" >Salvar</html:submit>
 
 
</html:form>
 
 
</div>
</div>
</div>
</html:form>
</div>
</div>
 
/branches/v3/impl/src/web/user/courses/selectCourse.jsp
1,7 → 1,10
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.CourseDepartment" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%@ page import="pt.estgp.estgweb.domain.views.CourseView" %>
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.ServiceManager" %>
<%@ page import="pt.utl.ist.berserk.logic.serviceManager.IServiceManager" %>
<%@ page import="pt.estgp.estgweb.web.utils.RequestUtils" %>
<%@ page import="pt.estgp.estgweb.domain.views.CourseView" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="/WEB-INF/tlds/baco.tld" prefix="baco" %>
16,6 → 19,12
Object[] args = new Object[]{};
List<CourseView> courseViews = (List<CourseView>) sm.execute(RequestUtils.getRequester(request, response), "LoadCourses", args, names);
request.setAttribute("Courses", courseViews);
 
 
AbstractDao.getCurrentSession().beginTransaction();
List<CourseDepartment> departments = DaoFactory.getCourseDepartmentDaoImpl().findActives();
request.setAttribute("departaments",departments);
 
%>
<jsp:useBean id="Courses" type="java.util.List" scope="request"/>
<div class="seccao">
28,6 → 37,7
<th><bean:message key="course.code"/>(SIGES)</th>
<th class="filter-name filter-select responsiveChosenFilter"><bean:message key="course.label"/></th>
<th class="filter-name filter-select"><bean:message key="course.degree"/></th>
<th class="filter-name filter-select"><bean:message key="course.area"/></th>
<th class="filter-name filter-select"><bean:message key="course.importYear"/></th>
<th><bean:message key="course.validation.role"/></th>
<th><bean:message key="course.studies.plan"/></th>
48,6 → 58,17
<td>${course.code}</td>
<td>${course.name}</td>
<td><bean:message key="course.${course.degreeCleanCode}"/></td>
<td>
<%--<baco:hasRole role="admin,all,servicesCoursesManagement">
<html:select styleClass="form-control" name="course" property="area">
<html:option value="">Nenhum</html:option>
<logic:iterate id="area" name="departaments" type="pt.estgp.estgweb.domain.CourseDepartmentImpl">
<html:option value="${area.sigla}">${area.schoolFromInstitutionalCode} - ${area.name}</html:option>
</logic:iterate>
</html:select>
</baco:hasRole>--%>
${course.courseDepartment.name}
</td>
<td>${course.importYear}</td>
<td>
<logic:present name="course" property="validationRole">
77,4 → 98,7
</table>
 
</div>
</div>
</div>
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
/branches/v3/impl/src/web/user/contacts/menu.jsp
14,7 → 14,7
<a href="<%=request.getContextPath()%>/proxy/layoutIntranetContacts/estgp/intranet/contactos/servicos.html"><bean:message key="services"/></a>
</li>
<li>
<html:link action="/user/listTeachers?dispatch=listTeachersAZ"><bean:message key="menu.docentes"/></html:link>
<html:link action="/user/listTeachers?dispatch=listTeachersAZ">Docentes</html:link>
</li>
<li>
<a href="<%=request.getContextPath()%>/proxy/layoutIntranetContacts/estgp/intranet/contactos/laboratorios.html"><bean:message key="intranet.contacts.labs"/></a>
22,6 → 22,9
<li>
<a href="<%=request.getContextPath()%>/proxy/layoutIntranetContacts/estgp/intranet/contactos/distLists.html"><bean:message key="intranet.contacts.lists"/></a>
</li>
<li>
<a href="<%=request.getContextPath()%>/proxy/layoutIntranetContacts/estgp/intranet/contactos/funcionarios.html">Funcionários</a>
</li>
</ul>
</div>
</div>