Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1879 → Rev 1891

/branches/grupo3/impl/conf/WEB-INF/web.xml
89,7 → 89,8
/layout/themes,
/wsjson/api,
/wsjson/api/app/,
/auth/
/auth/,
/engSoftTest
</param-value>
</init-param>
<init-param>
208,8 → 209,15
<!---->
<!--SERVLETS-->
 
//teste
<servlet>
<servlet-name>EngSoft</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.SubServlet</servlet-class>
</servlet>
 
 
 
 
<servlet>
<servlet-name>WsJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.json.JsonHandler</servlet-class>
371,7 → 379,15
<!--MAPPINGS-->
 
<!--SOAP Tutorial-->
 
//Teste
<servlet-mapping>
<servlet-name>EngSoft</servlet-name>
<url-pattern>/engSoftTest/*</url-pattern>
</servlet-mapping>
 
 
<servlet-mapping>
<servlet-name>ws</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
/branches/grupo3/impl/src/web/examples/angular/directives/angular-directive.jsp
New file
0,0 → 1,95
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="bacoTags" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="logic" uri="/WEB-INF/tlds/struts-logic.tld" %>
<html>
<head></head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
<h1>Uso de Directivas com Templates</h1>
<p>Este exemplo mostra como deve ser usada uma template para podermos incluir uma função
de controlo especifica da template usando directivas</p>
<p>Mostra ainda que dentro da template o scope é uma fusão dos scopes da ngApp e da propria directiva</p>
<p>Mostra também como podemos escolher dinamicamente a template ou as funcionalidades dependendo de atributos que passamos à template</p>
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
//demoApp..directive('tpl', function() {
//ou
angular.module('demoApp').directive('tpl', function() {
 
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
 
 
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2";
scope.testeSuper = "testeSuper2";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return attrs.templatename;
}
}
});
 
 
demoApp.controller('demoAppController', function ($scope) {
 
 
$scope.testeSuper = "testeSuper";
 
}
);
 
</script>
 
<p>campo testeSuper no mainmodule {{testeSuper}}</p>
 
<p>Se incluirmos o tpl2.html apenas vamos ter acesso às variaveis do scope da aplicação, neste caso o teste, a template pode estar declarada fora da app, não há problema</p>
<p>Por acaso neste exemplo temos acesso ao testeSuper porque a directiva adiciona funcionalidade ao scope da aplicação onde é chamada, mas se não chamarmos nenhuma directiva
a var testeSuper não aparece</p>
<div ng-include="'tpl2.html'"></div>
 
 
<h2>Invocando a tpl de html com directiva</h2>
<tpl templatename="tpl.html"></tpl>
 
<h2>Invocando a tpl de de javascript com directiva</h2>
<tpl templatename="tpl2.html"></tpl>
 
 
 
 
 
 
</div>
 
 
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="tpl2.html">
<div>
<h1>Usando um template de Script</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
</div>
</script>
</body>
</html>
/branches/grupo3/impl/src/web/examples/angular/directives/tpl.html
New file
0,0 → 1,5
<h1>Template de HTML</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
/branches/grupo3/impl/src/web/examples/angular/directives/angular-directive-module.jsp
New file
0,0 → 1,36
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 11/11/17
Time: 10:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
<div class="container">
<h1>Uso de Templates Generalizados e cada um com sua template</h1>
<p>O caso em questão é a existencia de um esqueleto principal para um modulo (mainmodule)</p>
<p>O main module inclui templates para cada componente usando o ng-include</p>
<p>Esse ng-include é referente ao campo @class de cada componente</p>
<p>vamos incluir esse esqueleto e todas as templates especificas dos nossos modulos</p>
<p>incluimos ainda as directivas que estiverem nos nossos modulos</p>
<p>o template do ng-include irá colocar a directiva desejada caso seja necessário</p>
<p>com a directiva podemos ter funcionalidade de scope associada ao subcomponente, que é desconhecido do main module</p>
<p>caso necessite o includemodule também tem acesso ao scope da app principal</p>
<p>o unico requesito é passar ao include module o nome da app onde ele vai inserir as directivas</p>
 
 
 
<jsp:include page="angular-directive-mainmodule.jsp"/>
<jsp:include page="angular-directive-includemodule.jsp"/>
 
</div>
</body>
</html>
/branches/grupo3/impl/src/web/examples/angular/directives/angular-directive-includemodule.jsp
New file
0,0 → 1,60
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<p>Modulo Incluido contem as directivas e os templates necessários</p>
<p>Este módulo conhece o nome do módulo da App onde vai ser incluido</p>
 
<script>
angular.module("demoApp").directive('tpl', function() {
var contentUrl;
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
//contentUrl = attrs.templatename + '.html';
 
//console.log(contentUrl);
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2modules";
//scope.testeSuper = "testeSuper2modules";
angular.element("#demoApp").scope().testeSuper = "testeSuper2modules";
}
scope.mudaCompName = function(comp){
 
comp.name = "NOVO NOME DO COMP MUDADO NA DIRECTIVA";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return "templateDirectiva";
}
}
});
</script>
 
<script type="text/ng-template" id="directive_class">
<div style="border: 1px solid #000000">
<h1>DIRECTIVE CLASS TEMPLATE</h1>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<p><input type="text" ng-model="comp.name"></p>
<tpl></tpl>
<p>Teste no scope da directiva<p>
<pre>
{{teste | json}}
</pre>
</div>
</script>
 
<script type="text/ng-template" id="templateDirectiva">
<div style="border: 1px solid green">
<h1>templateDirectiva</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<button ng-click="move()">Muda Textos</button>
<button ng-click="mudaCompName(comp)">Muda COMP NAME</button>
</div>
</script>
/branches/grupo3/impl/src/web/examples/angular/directives/angular-directive-mainmodule.jsp
New file
0,0 → 1,50
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
 
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
demoApp.controller('demoAppController', function ($scope) {
 
$scope.testeSuper = "testeSuper";
 
$scope.data =
{
comps : [
{
"@class" : "directive_class",
"name" : "componente de teste"
}
]
}
 
}
);
 
</script>
 
 
<h1>Campo testeSuper no mainmodule "{{testeSuper}}"</h1>
<h1>Campo data.comps[0].name no mainmodule "{{data.comps[0].name}}"</h1>
 
<h2>Template chamado atraves de um template de classe intermedio</h2>
<div ng-repeat="comp in data.comps" ng-include="comp['@class']">
 
</div>
 
 
<pre>
{{testeSuper | json}}
</pre>
<pre>
{{data | json}}
</pre>
 
 
</div>
/branches/grupo3/impl/src/web/user/courses/coursereport/templates.jsp
New file
0,0 → 1,694
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultYear" %>
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultSemester" %>
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultUc" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<!--
@section objeto com seccoes e componentes
@optional @chapter capitulo do documento para esta seccao para contcatenar às subsections
-->
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_CourseUnitsReportsSection">
<div class="sections">
<a name="indexCus"></a>
<span ng-repeat="cu in section.sections" ng-init="cu.taxaAprovacao = 100 * cu.courseUnitEvaluation.numAlunosAprovTotal/(cu.courseUnitEvaluation.numAlunosInscritos - cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao)">
<a href="#cu{{$index}}" ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) || cu.taxaAprovacao &lt; 75 || !cu.courseUnitEvaluation.closed || !cu.courseUnitEvaluation.teacherComplete}">
{{cu.title}}
</a> |
</span>
<div ng-repeat="cu in section.sections"
class="section panel-primary">
 
<a name="cu{{$index}}"></a>
<span ng-if="$index != 0" class="glyphicon glyphicon-backward" ></span><a ng-if="$index != 0" href="#indexCus"> Voltar atrás</a>
<div class="panel-heading"><h2>{{cu.title}}</h2></div>
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Estado do Relatório</label></h3></div>
 
<div ng-if="cu.courseUnitEvaluation.closed">
Entregue e Aceite
</div>
<div class="alert-danger" ng-if="cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Entregue mas não foi aprovado pela comissão
</div>
<div class="alert-danger" ng-if="!cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Não foi entregue pelo docente para validação
</div>
 
</div>
 
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Resultados</label></h3></div>
<div>
<table class="tablesorter-blue" width="100%">
<tr>
<th rowspan="2">
Nº Alunos Inscritos
</th>
<th rowspan="2">
Nº de alunos sem elementos de avaliação
</th>
<th colspan="5">
Nº de alunos aprovados em
</th>
<th colspan="2">
Aprovados com a classificação entre 10 e 13 valores
</th>
<th colspan="2">
Aprovados com a classificação entre 14 e 16 valores
</th>
<th colspan="2">
Aprovados com a classificação entre 17 e 20 valores
</th>
</tr>
<tr>
<th>Avaliação de frequência</th>
<th>Exame Época Normal</th>
<th>Exame Época Recurso</th>
<th>Exame Época Especial</th>
<th>Total</th>
<th>Nº</th>
<th>%</th>
<th>Nº</th>
<th>%</th>
<th>Nº</th>
<th>%</th>
</tr>
<tr>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosInscritos}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovFrequencia}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovNormal}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovRecurso}}
</td>
<td style="text-align: center">
{{cu.courseUnitEvaluation.numAlunosAprovEspecial}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovTotal}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1013}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1013Percent}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1416}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1416Percent}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1720}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1720Percent}}
</td>
</tr>
</table>
</div>
</div>
 
<div style="padding-left:20px" >
<div><h3><label class="label label-primary">Taxa de Aprovação</label></h3></div>
<div ng-class="{ 'alert-danger': cu.taxaAprovacao &lt; 75 }">{{cu.taxaAprovacao}}%</div>
</div>
 
 
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação dos resultados quantitativos obtidos pelos estudantes</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoQuantitivos}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação do funcionamento da UC</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoUC}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Percentagem de cumprimento do programa da UC</label></h3></div>
<div ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) }">
{{cu.courseUnitEvaluation.cumprimentoProgramaPercent}}%
</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação do cumprimento do programa da UC</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoCumprimentoPrograma}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Conclusões</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualConclusoes}}</div>
</div>
</div>
</div>
</script>
 
 
 
<style>
.dtpstats td, .dtpstats th{
text-align: center !important;
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_reportucsummary_UnitsDtpTable">
<div class="sections">
 
<table class="table dtpstats">
<thead>
<tr>
<th rowspan="2">Unidade Curricular</th>
<th colspan="2">Planeamento</th>
<th rowspan="2">Ficha Curricular</th>
<th rowspan="2">Sumários</th>
<th colspan="2">Avaliação</th>
<th rowspan="2">Relatório de Avaliação</th>
<th rowspan="2">Inquerito Pedagógico</th>
</tr>
<tr>
<th>Conteúdos</th>
<th>Calendarização</th>
<th>Enunciados</th>
<th>Pautas</th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="9">Semestre 1</th>
</tr>
<tr ng-repeat="dtpStat in comp.semester1.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
</tr>
<tr>
<th colspan="9">Semestre 2</th>
</tr>
<tr ng-repeat="dtpStat in comp.semester2.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
</tr>
</tbody>
</table>
</div>
</script>
 
 
 
<style>
.learning td
{
font-size: 0.7em;
}
.learning td input{
width: 50px;
}
 
.learning td input:read-only{
width: 50px;
background-color: #cccccc;
}
.learning tr.year td {
vertical-align: top;
background-color: #aaaaaa;
 
font-weight: bold;
}
.learning tr.period td {
vertical-align: top;
background-color: #dfdfdf;
 
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_UnitsLearningResultsTable">
<unitslearningresultstable>
</unitslearningresultstable>
</script>
 
 
 
<script>
angular.module("courseReportApp").directive('boundModel', function() {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
scope.$watch(attrs.boundModel, function(newValue, oldValue) {
if(newValue != oldValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
}
});
}
}
});
angular.module("courseReportApp").directive('unitslearningresultstable', function() {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
 
$scope.checkedDocuments = [];
$scope.checkUnit = function(document,collection)
{
if(document.checked)
{
var docContainer =
{
"document" : document,
"collection" : collection
}
$scope.checkedDocuments.push(docContainer);
}
else
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
if(documentContainer.document == document)
{
var index = $scope.checkedDocuments.indexOf(documentContainer);
$scope.checkedDocuments.splice(index, 1);
}
});
}
}
$scope.changeDocumentCollection = function(collection)
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
collection.ucs.push(documentContainer.document);
delete documentContainer.document.checked;
});
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
var index = documentContainer.collection.ucs.indexOf(documentContainer.document);
documentContainer.collection.ucs.splice(index, 1);
});
$scope.checkedDocuments = [];
}
$scope.avg = function(field,container, childs)
{
if(!childs || childs.length == 0)
return 0;
var sum = 0;
var c;
for(c in childs)
{
if(childs[c] && childs[c][field])
sum += 1*childs[c][field];
}
container[field] = sum / childs.length;
return container[field];
}
$scope.percent = function(n,total)
{
if(!n || n == 0 || !total || total == 0)
return 0;
return 100 * n / total;
}
$scope.reprovados = function(comp)
{
if(comp.alunosInscritos && comp.semElementos && comp.aprovados)
return comp.alunosInscritos - comp.semElementos - comp.aprovados;
return 0;
}
$scope.removeComponent = function(index,list)
{
list.splice(index,1);
}
$scope.hasYearUnits = function(year)
{
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
return false;
}
$scope.isInvalidAnfHaveUcs = function(year,years,index)
{
if(year.ano > 0)
return false;
 
var s;
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
years.splice(index,1);
return false;
}
$scope.addUc = function(semestre)
{
semestre.ucs.push(
{
"@class" : "<%=UnitsLearningResultUc.class.getName()%>",
manual : true,
periodo : semestre.semestre,
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
sigesCode : 0
}
);
}
$scope.addAno = function(comp)
{
if(!comp.years)
comp.years = [];
comp.years.push(
{
ano : 1,
"@class" : "<%=UnitsLearningResultYear.class.getName()%>",
manual : true,
"alunosInscritos": 0,
"aprovados": 0,
"aprovados1013": 0,
"aprovados1013Percent": 0,
"aprovados1416": 0,
"aprovados1416Percent": 0,
"aprovados1720": 0,
"aprovados1720Percent": 0,
"aprovadosPercent": 0,
"cumprimentoProgramaPercent": 0,
"reprovados": 0,
"reprovadosPercent": 0,
"semElementos": 0,
"semElementosPercent": 0,
semesters : [
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
semestre : "S1",
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
},
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
semestre: "S2",
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
}
]
}
);
}
 
},
templateUrl: function(elem,attrs) {
return "unitslearningresultstable";
}
}
});
</script>
<script type="text/ng-template" id="unitslearningresultstable">
 
 
<div class="sections">
<button class="btn btn-success" ng-click="addAno(comp)"><span class="glyphicon glyphicon-plus"></span> Ano Manual</button>
<table class="table learning">
<thead>
<tr>
<th rowspan="2">Mover</th>
<th rowspan="2">Código</th>
<th rowspan="2">Unidade Curricular</th>
<th rowspan="2">Cumprimento do Programa</th>
<th rowspan="2">Alunos Inscritos</th>
<th colspan="2">Sem Elementos</th>
<th colspan="2">Reprovados</th>
<th colspan="2">Aprovados</th>
<th colspan="2">Aprovados 10-13</th>
<th colspan="2">Aprovados 14-16</th>
<th colspan="2">Aprovados 17-20</th>
</tr>
<tr>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
</tr>
</thead>
<tbody>
<tr colspan="17" ng-if="false" ng-repeat-start="year in comp.years"></tr>
<tr class="year">
<td colspan="3" ng-if="year.ano &gt; 0">
 
<button ng-disabled="hasYearUnits(year)" class="btn btn-danger btn-xs" ng-click="removeComponent($index,comp.years)"><span class="glyphicon glyphicon-remove"></span></button>
<span ng-if="!year.manual">{{year.ano}}ª ano</span>
<span ng-if="year.manual">
<select ng-model="year.ano" ng-options="c.v as c.n for c in [{v:1,n:'1º Ano'},{v:2,n:'2º Ano'},{v:3,n:'3º Ano'},{v:4,n:'4º Ano'},{v:5,n:'5º Ano'}]">
</select>
</span>
 
</td>
<td colspan="3" style="font-size: 1.0em !important" ng-if="isInvalidAnfHaveUcs(year,comp.years,$index)">
Unidades que não constam do plano (Verifique a situação com os serviços Académicos antes de continuar)
poderão constar de um plano antigo ou ter o código siges desatualizado.
</td>
<td><input readonly="true" type="number" ng-model="year.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.alunosInscritos" bound-model="avg('alunosInscritos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementos" bound-model="avg('semElementos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementosPercent" bound-model="percent(year.semElementos,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovados" bound-model="reprovados(year)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovadosPercent" bound-model="percent(year.reprovados,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados" bound-model="year.aprovados1013*1 + year.aprovados1416*1 + year.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="year.aprovadosPercent" bound-model="percent(year.aprovados,year.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="year.aprovados1013" bound-model="avg('aprovados1013',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1013Percent" bound-model="percent(year.aprovados1013,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416" bound-model="avg('aprovados1416',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416Percent" bound-model="percent(year.aprovados1416,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720" bound-model="avg('aprovados1720',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720Percent" bound-model="percent(year.aprovados1720,year.aprovados)"></td>
</tr>
 
<tr ng-if="false" ng-repeat-start="s in year.semesters" ></tr>
<tr class="period" ng-if="year.ano &gt; 0 || s.ucs.length > 0">
<td colspan="3" class="period">Semestre {{s.semestre}} <button ng-click="changeDocumentCollection(s)" data-toggle="tooltip" title="Mover unidades para aqui" class="btn btn-xs btn-warning" ng-show="checkedDocuments.length"><span class="glyphicon glyphicon-arrow-left"></span></button>
 
<button class="btn btn-success pull-right" ng-click="addUc(s)"><span class="glyphicon glyphicon-plus"></span> UC Manual</button>
</td>
<td><input readonly="true" type="number" ng-model="s.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.alunosInscritos" bound-model="avg('alunosInscritos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementos" bound-model="avg('semElementos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementosPercent" bound-model="percent(s.semElementos,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovados" bound-model="reprovados(s)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovadosPercent" bound-model="percent(s.reprovados,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados" bound-model="s.aprovados1013*1 + s.aprovados1416*1 + s.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="s.aprovadosPercent" bound-model="percent(s.aprovados,s.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="s.aprovados1013" bound-model="avg('aprovados1013',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1013Percent" bound-model="percent(s.aprovados1013,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416" bound-model="avg('aprovados1416',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416Percent" bound-model="percent(s.aprovados1416,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720" bound-model="avg('aprovados1720',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720Percent" bound-model="percent(s.aprovados1720,s.aprovados)"></td>
</tr>
<tr ng-repeat="u in s.ucs" ng-class="{'alert-danger': u.error}" >
<td><input ng-model="u.error" type="hidden" bound-model="u.alunosInscritos < (u.aprovados*1 + u.semElementos*1)">
<input ng-model="u.checked" ng-click="checkUnit(u,s)" type="checkbox"></td>
<td><input type="text" ng-readonly="!u.manual || u.manual == false" ng-model="u.sigesCode"></td>
<td>
 
<input type="text" style="width: 150px" ng-if="!(!u.manual || u.manual == false)" ng-model="u.name">
<span ng-if="(!u.manual || u.manual == false)">{{u.name}}</span>
<button class="btn btn-danger btn-xs pull-right" ng-if="!(!u.manual || u.manual == false)" ng-click="removeComponent(index,s.ucs)"><span class="glyphicon glyphicon-remove"></span></button>
</td>
<td><input type="number" ng-model="u.cumprimentoProgramaPercent"></td>
<td><input type="number" ng-model="u.alunosInscritos"></td>
<td><input type="number" ng-model="u.semElementos"></td>
<td><input readonly="true" type="number" ng-model="u.semElementosPercent" bound-model="percent(u.semElementos,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovados" bound-model="reprovados(u)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovadosPercent" bound-model="percent(u.reprovados,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados" bound-model="u.aprovados1013*1 + u.aprovados1416*1 + u.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="u.aprovadosPercent" bound-model="percent(u.aprovados,u.alunosInscritos)"></td>
 
<td><input type="number" ng-model="u.aprovados1013"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1013Percent" bound-model="percent(u.aprovados1013,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1416"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1416Percent" bound-model="percent(u.aprovados1416,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1720"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1720Percent" bound-model="percent(u.aprovados1720,u.aprovados)"></td>
</tr>
<tr ng-if="false" ng-repeat-end></tr>
<tr ng-if="false" ng-repeat-end></tr>
<tr class="year">
<td colspan="3">Resultados Globais</td>
 
 
<td><input readonly="true" type="number" ng-model="comp.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.alunosInscritos" bound-model="avg('alunosInscritos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementos" bound-model="avg('semElementos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementosPercent" bound-model="percent(comp.semElementos,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovados" bound-model="reprovados(comp)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovadosPercent" bound-model="percent(comp.reprovados,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados" bound-model="comp.aprovados1013*1 + comp.aprovados1416*1 + comp.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovadosPercent" bound-model="percent(comp.aprovados,comp.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="comp.aprovados1013" bound-model="avg('aprovados1013',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1013Percent" bound-model="percent(comp.aprovados1013,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416" bound-model="avg('aprovados1416',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416Percent" bound-model="percent(comp.aprovados1416,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720" bound-model="avg('aprovados1720',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720Percent" bound-model="percent(comp.aprovados1720,comp.aprovados)"></td>
</tr>
</tbody>
</table>
<%--<pre class="code">{{ comp | json }}</pre>--%>
</div>
</script>
 
 
 
 
 
 
 
 
 
 
 
 
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg">
<globallearningresultschartimg>
</globallearningresultschartimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultschartimg', function() {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
$scope.generateChart = function(comp)
{
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateGlobalLearningResultsChartImg",
{
"courseReportDocument" : BacoJS.stringifyOrdered(angular.element($("#courseReportApp")).scope().report)
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
comp.image = repositoryFile4JsonView;
comp.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + comp.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
 
 
},
templateUrl: function(elem,attrs) {
return "globallearningresultschartimg";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartimg">
<div class="imageComponent component">
 
<div class="componentBody">
<div class="form-group clearfix">
<label class="col-md-2 control-label">Legenda</label>
<div class="col-md-10">
<input type="text" class="form-control" rows="10" ng-model="comp.title">
</div>
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button>
</div>
<div class="col-md-10">
<label ng-if="comp.image.identifier"> Limites do PDF </label>
<div ng-if="comp.image.identifier" style="text-align: center; width: 595px; border: 1px solid black; padding: 45px">
<center>
<div style="width: 200px;height: 200px; max-width: 500px; max-height: 750px" resizable on-resize="resize($evt, $ui, comp)">
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}">
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}">
</div>
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito)
</center>
</div>
</div>
</div>
</div>
</div>
</script>
/branches/grupo3/impl/src/web/user/courses/courseReportEdit.jsp
326,7 → 326,7
 
<div class="form-vertical">
<div id="courseReportApp" ng-app="courseReportApp" ng-controller="courseReportAppController">
 
<div class="web-mensages"></div>
<div ng-init="section=report;" ng-include="'pt_estgp_estgweb_utils_documentBuilder_DocumentSection'">
 
</div>
/branches/grupo4/impl/conf/WEB-INF/web.xml
89,7 → 89,8
/layout/themes,
/wsjson/api,
/wsjson/api/app/,
/auth/
/auth/,
/testeEngSoft
</param-value>
</init-param>
<init-param>
102,6 → 103,7
</filter>
 
 
 
<filter-mapping>
<filter-name>UrlDisplayFilter</filter-name>
<url-pattern>/*</url-pattern>
207,8 → 209,11
<!---->
<!--SERVLETS-->
 
<servlet>
<servlet-name>TesteEngSoft</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.SubServlet</servlet-class>
</servlet>
 
 
<servlet>
<servlet-name>WsJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.json.JsonHandler</servlet-class>
369,6 → 374,11
 
<!--MAPPINGS-->
 
<servlet-mapping>
<servlet-name>TesteEngSoft</servlet-name>
<url-pattern>/testeEngSoft/*</url-pattern>
</servlet-mapping>
 
<!--SOAP Tutorial-->
<servlet-mapping>
<servlet-name>ws</servlet-name>
/branches/grupo4/impl/src/java/pt/estgp/estgweb/web/controllers/SubServlet.java
New file
0,0 → 1,50
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserImpl;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class SubServlet extends TesteEngSoftServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
public void primeiroMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("primeiroMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
 
public void segundoMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("segundoMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
}
/branches/grupo4/impl/src/java/pt/estgp/estgweb/web/controllers/TesteEngSoftServlet.java
New file
0,0 → 1,37
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
 
public class TesteEngSoftServlet extends HttpServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
 
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String op = req.getParameter("dispatch");
 
try {
this.getClass()
.getMethod(op, new Class[]{HttpServletRequest.class, HttpServletResponse.class})
.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
 
}
}
/branches/grupo4/impl/src/web/hello.jsp
New file
0,0 → 1,41
<%@ page import="pt.estgp.estgweb.domain.User" %>
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %><%--
Created by IntelliJ IDEA.
User: daniel
Date: 23/11/2017
Time: 11:09
 
http://localhost:8080/baco/testeEngSoft/?name=super&jsp=/hello.jsp&dispatch=primeiroMetodo
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<jsp:useBean id="user" type="pt.estgp.estgweb.domain.User" scope="request"/>
<body>
<h1>Hello JSP</h1>
<%
User u = (User) request.getAttribute("user");
User uSess = (User) request.getSession().getAttribute("user");
 
AbstractDao.getCurrentSession().beginTransaction();
User loaded = DaoFactory.getUserDaoImpl().loadByUsername(u.getName());
request.setAttribute("loaded", loaded);
 
%>
u:
<%=u.getName()%>
<br>
u:
${loaded.superuser}
<br>
uSess:
<%=uSess.getName()%>
 
</body>
</html>
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
/branches/grupo5/impl/conf/WEB-INF/struts/struts-json-ws.xml
53,13 → 53,12
<action path="/secure/ws-coordinators-list" forward="/user/jsonModel.do?dispatch=executeService&amp;serviceJson=wsListCoordinators"/>
 
<!--SERVICOS ABERTOS POR ENQUANTO-->
<!--<action path="/ws-units-report-list" forward="/json/coursesServices.do?dispatch=executeService&amp;serviceJson=getCourseUnitsEvaluations"/>-->
<action path="/ws-units-report-list" forward="/json/coursesServices.do?dispatch=executeService&amp;serviceJson=getCourseUnitsEvaluations"/>
<action path="/ws-course-pedagogic-results-list" forward="/json/coursesServices.do?dispatch=executeService&amp;serviceJson=findPedagogicReport4Period"/>
<action path="/ws-units-dtp-stats" forward="/json/coursesServices.do?dispatch=executeService&amp;serviceJson=getCourseUnitDtpStats"/>
<action path="/ws-course-unit-plan-year" forward="/json/coursesServices.do?dispatch=executeService&amp;serviceJson=loadPlanYearForCourseUnitCode"/>
 
 
 
 
</action-mappings>
 
 
/branches/grupo5/impl/conf/WEB-INF/web.xml
206,10 → 206,9
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
<!---->
 
<!--SERVLETS-->
 
 
 
<servlet>
<servlet-name>WsJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.json.JsonHandler</servlet-class>
/branches/grupo5/impl/conf/app.properties
826,6 → 826,7
system.wsjson.service.course.report.quest.result.api=@system.wsjson.service.course.report.quest.result.api@
system.wsjson.service.course.units.reports.api=@system.wsjson.service.course.units.reports.api@
system.wsjson.service.course.units.dtp.stats.api=@system.wsjson.service.course.units.dtp.stats.api@
system.wsjson.service.course.unit.plan.year.api=@system.wsjson.service.course.unit.plan.year.api@
 
###AQUI PODEMOS USAR OU TRA INTRANET OU OUTRO PORTAL PUBLICO
system.intranet.url=@system.intranet.url@
/branches/grupo5/impl/conf/berserk/sd.xml
4009,5 → 4009,42
</service>
 
 
<service>
<name>LoadPlanYearForCourseUnitCode</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
@courseCode codigo do curso
@unitCode codigo da unidade
Carrega o ano da unidade curricular a partir do plano de estudos
Serviço de integração
</description>
<isTransactional>true</isTransactional>
<defaultMethod>loadPlanYearForCourseUnitCode</defaultMethod>
<filterChains>
<chain name="Logger"/>
</filterChains>
</service>
 
 
<!-- SERVICOS DE GERACAO DE RELATORIO DE CURSO -->
 
<service>
<name>CourseReportGenerateGlobalLearningResultsChartImg</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
@reportCourseDocument documento course report em json
Serviço de suporte para gerar um grafico
Coloca o grafico no report documento
e salva o documento no curso
Devolve uma classe RepositoryFile4JsonView serializada em JSON
</description>
<isTransactional>true</isTransactional>
<defaultMethod>generateGlobalLearningResultsChartImg</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
</filterChains>
</service>
 
 
</serviceDefinitions>
/branches/grupo5/impl/src/java/CopyPhotos.java
File deleted
/branches/grupo5/impl/src/java/pt/estgp/estgweb/utils/Globals.java
177,11 → 177,11
 
//LEGADO PARA REMOVER
public static final List<String> AREAS = ConfigProperties.getListValues("area");
 
public static final List<String> DEPARTAMENTOS = ConfigProperties.getListValues("departamento");
 
/*SIGES WEB SERVICES*/
//NAO É URGENTE PARA ACTUALIZACOES VAMOS DEIXAR CARREGAR DA BD E NAS ACTUALIZAÇOES MUDA AQUI
//NAO É URGENTE PARA ACTUALIZACOES VAMOS DEIXAR CARREGAR DA BD E NAS ACTUALIZAÇOES MUDA AQUI
//public static BigDecimal NATIONAL_INSTITUTION_CODE = new BigDecimal(DaoFactory.getConfigurationDaoImpl().getNationalInstitutionCodeCreateTransaction());
// DONT USE NOW IN CONFIGURATION DAO public static final BigDecimal SIGES_INSTITUTION_CODE = new BigDecimal(ConfigProperties.getIntProperty("siges.institution.code"));
// DONT USE ANY MORE NOW IS IN CONFIGURATION DAOpublic static final String SIGES_WEBSERVICE_WSDL = ConfigProperties.getProperty("ws.siges.wsdl");
331,7 → 331,7
public static final String SURVEY_QUESTION_TYPE_MATRIX = ConfigProperties.getProperty("surveys.question.type.2");
public static final String SURVEY_QUESTION_TYPE_TEXT = ConfigProperties.getProperty("surveys.question.type.3");
 
//Filipe Matos
//Filipe Matos
public static final String ASSESSMENT_TYPE_EVALUATION = ConfigProperties.getProperty("assessments.type.0");
public static final String ASSESSMENT_TYPE_SELFEVALUATION = ConfigProperties.getProperty("assessments.type.1");
public static final String ASSESSMENT_QUESTION_TYPE_RADIO = ConfigProperties.getProperty("assessments.question.type.0");
347,7 → 347,7
public static final String ASSESSMENT_ANSWER_INCORRECT = ConfigProperties.getProperty("assessment.answer.incorrect");
public static final String ASSESSMENT_ANSWER_IMCOMPLETE = ConfigProperties.getProperty("assessment.answer.imcomplete");
//
 
public static final String TEMPLATE_COURSE_XSL_PATH = "/template/xsd/fragmentoCurso.xsl";
public static final String TEMPLATE_XSD_PATH = "/template/xsd";
public static final String TEMPLATE_EMAIL_PATH = "/template/email";
450,6 → 450,7
public static final String SYSTEM_WSJSON_SERVICE_COURSE_QUESTIONARIOS_REPORT_RESULTS = ConfigProperties.getProperty("system.wsjson.service.course.report.quest.result.api");
public static final String SYSTEM_WSJSON_SERVICE_COURSE_UNITS_EVALUATION_REPORT = ConfigProperties.getProperty("system.wsjson.service.course.units.reports.api");
public static final String SYSTEM_WSJSON_SERVICE_COURSE_UNITS_DTP_STATS = ConfigProperties.getProperty("system.wsjson.service.course.units.dtp.stats.api");
public static final String SYSTEM_WSJSON_SERVICE_COURSE_UNIT_PLAN_YEAR = ConfigProperties.getProperty("system.wsjson.service.course.unit.plan.year.api");
 
 
public static final String SYSTEM_EMAIL_CERTIFICATED_HOME_PAGE = ConfigProperties.getProperty("system.mail.standard.certificated.home.page");
533,4 → 534,4
public static final int SIGES_SUMARIO_FALTOU_CODIGO = ConfigProperties.getIntProperty("siges.summaries.faltou.code");
public static final int SIGES_SUMARIO_CANCELADO_CODIGO = ConfigProperties.getIntProperty("siges.summaries.cancelado.code");
public static final int SIGES_SUMARIO_PRELANCADO_CODIGO = ConfigProperties.getIntProperty("siges.summaries.prelancado.code");
}
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java
7,27 → 7,26
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.CourseUnit;
import pt.estgp.estgweb.domain.CourseUnitEvaluationImpl;
import pt.estgp.estgweb.domain.CourseUnitImpl;
import pt.estgp.estgweb.domain.DomainObjectFactory;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.filters.chains.ResourceAccessControlEnum;
import pt.estgp.estgweb.services.courses.coursereport.CourseReportUtils;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.*;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.courseunitreport.CourseUnitSection;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultSemester;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultUc;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultYear;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultsTable;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.LearningGlobalAnalysisSection;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.*;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.reportucsummary.CourseUnitDtpStat;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.reportucsummary.UnitDtpSemester;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.reportucsummary.UnitsDtpTable;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.surveys.SurveysResultsSection;
import pt.estgp.estgweb.services.data.RepositoryFile4JsonView;
import pt.estgp.estgweb.services.data.RepositoryService;
import pt.estgp.estgweb.services.questionarios.QuestionariosReportsService;
import pt.estgp.estgweb.services.questionarios.pedagogico.reportprocessors.utils.DataTable;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.documentBuilder.DocumentSection;
import pt.estgp.estgweb.utils.documentBuilder.QuestionariosDataTableComponent;
import pt.estgp.estgweb.web.controllers.utils.FileUploaded;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
import java.io.IOException;
66,16 → 65,20
*/
public CourseReportDocument createNewCourseReportDocument(String courseCode,String year) throws IOException, JSONException
{
 
Course course = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
 
CourseReportDocument reportCourseDocument = new CourseReportDocument();
reportCourseDocument.init();
reportCourseDocument.init(course,year);
 
 
 
//FIRST SERVICE TO CALL TO OBTAIN UNITS AND EVALUATIONS
//THIS IS THE BASE FOR THE REMAIN SERVICE CALLS
List<DocumentSection> courseUnitSections = updateCleanCourseUnitSections(courseCode, year, reportCourseDocument);
 
//A tabela de resultados globais não vai ser utilizada
//PARA CORRER ESTE SERVICO A PARTIR DA INTERFACE É PRECISO
//A tabela de resultados globais não vai ser utilizada
//PARA CORRER ESTE SERVICO A PARTIR DA INTERFACE É PRECISO
//PERCEBER QUE DEPENDE DO SERVICO DE UPDATE DAS SECOES DAS COURSEUNITS
UnitsLearningResultsTable unitsLearningResultsTable = updateCleanLearningResultsFromCourseUnitsSections(reportCourseDocument);
 
84,7 → 87,7
UnitsDtpTable unitsDtpTable = updateDtpStatsTable4Course(reportCourseDocument, courseCode, year);
 
 
//Atualiza as tabelas dos Quesitonários pedagogicos
//Atualiza as tabelas dos Quesitonários pedagogicos
SurveysResultsSection surveysResultsSection = updateSurveysDataTables(courseCode, year, reportCourseDocument);
 
 
108,7 → 111,7
}
 
/**
* Este serviço atualiza a tabela de resultados de aprendizagem com base nas courseunitssections
* Este serviço atualiza a tabela de resultados de aprendizagem com base nas courseunitssections
* @param reportCourseDocument
* @return UnitsLearningResultsTable
*/
157,7 → 160,7
uc.setAprovados1720(unitSection.getCourseUnitEvaluation().getNumAlunosAprov1720());
uc.setSemElementos(unitSection.getCourseUnitEvaluation().getNumAlunosSemElementosAvaliacao());
uc.setAprovados(unitSection.getCourseUnitEvaluation().getNumAlunosAprovTotal());
uc.setReprovados(unitSection.getCourseUnitEvaluation().getNumAlunosReprovados());
uc.setReprovados(unitSection.getCourseUnitEvaluation().getNumAlunosInscritos() - unitSection.getCourseUnitEvaluation().getNumAlunosAprovTotal() - unitSection.getCourseUnitEvaluation().getNumAlunosSemElementosAvaliacao());
 
if(uc.getAlunosInscritos() > 0)
{
196,32 → 199,32
 
//UPDATE TOTAIS DE SEMESTRES E DE ANOS
float totalCumProgPercentGlobal = 0;
int totalInscritosGlobal = 0;
float totalInscritosGlobal = 0;
float totalReprovadosPercentGlobal = 0;
float totalAprovadosPercentGlobal = 0;
float totalSemElementosPercentGlobal = 0;
int totalAprovados1013PercentGlobal = 0;
float totalAprovados1013PercentGlobal = 0;
float totalAprovados1416PercentGlobal = 0;
float totalAprovados1720PercentGlobal = 0;
for(UnitsLearningResultYear learningYearLine: learningResultsTable.getYears())
{
float totalCumProgPercentAno = 0;
int totalInscritosAno = 0;
float totalInscritosAno = 0;
float totalReprovadosPercentAno = 0;
float totalAprovadosPercentAno = 0;
float totalSemElementosPercentAno = 0;
int totalAprovados1013PercentAno = 0;
float totalAprovados1013PercentAno = 0;
float totalAprovados1416PercentAno = 0;
float totalAprovados1720PercentAno = 0;
 
for(UnitsLearningResultSemester semester: learningYearLine.getSemesters())
{
float totalCumProgPercent = 0;
int totalInscritos = 0;
float totalInscritos = 0;
float totalReprovadosPercent = 0;
float totalAprovadosPercent = 0;
float totalSemElementosPercent = 0;
int totalAprovados1013Percent = 0;
float totalAprovados1013Percent = 0;
float totalAprovados1416Percent = 0;
float totalAprovados1720Percent = 0;
for(UnitsLearningResultUc uc: semester.getUcs())
239,7 → 242,7
if(semester.getUcs().size() > 0)
{
semester.setCumprimentoProgramaPercent( totalCumProgPercent / ((float)semester.getUcs().size()));
semester.setAlunosInscritos( totalInscritos / (semester.getUcs().size()));
semester.setAlunosInscritos( totalInscritos / ((float)semester.getUcs().size()));
semester.setAprovadosPercent( totalAprovadosPercent / ((float)semester.getUcs().size()));
semester.setReprovadosPercent( totalReprovadosPercent / ((float)semester.getUcs().size()));
semester.setSemElementosPercent( totalSemElementosPercent / ((float)semester.getUcs().size()));
260,7 → 263,7
if(learningYearLine.getSemesters().size() > 0)
{
learningYearLine.setCumprimentoProgramaPercent( totalCumProgPercentAno / ((float)learningYearLine.getSemesters().size()));
learningYearLine.setAlunosInscritos( totalInscritosAno / (learningYearLine.getSemesters().size()));
learningYearLine.setAlunosInscritos( totalInscritosAno / ((float)learningYearLine.getSemesters().size()));
learningYearLine.setAprovadosPercent( totalAprovadosPercentAno / ((float)learningYearLine.getSemesters().size()));
learningYearLine.setReprovadosPercent( totalReprovadosPercentAno / ((float)learningYearLine.getSemesters().size()));
learningYearLine.setSemElementosPercent( totalSemElementosPercentAno / ((float)learningYearLine.getSemesters().size()));
289,22 → 292,13
learningResultsTable.setAprovados1416Percent( totalAprovados1416PercentGlobal / ((float)learningResultsTable.getYears().size()));
learningResultsTable.setAprovados1720Percent( totalAprovados1720PercentGlobal / ((float)learningResultsTable.getYears().size()));
}
 
 
 
 
return learningResultsTable;
//CRIAR A TABELA DE RESUTLADOS GLOBAIS GERAIS COMO UM RESUMO DA ANTERIOR
/*for(UnitsLearningResultYear learningYearLine: learningResultsTable.getYears())
{
 
}*/
}
 
 
/**
* Gera uma tabela de estatisticas dos DTP recorrendo ao servico WS de
* load de tabelas DTP, caso o serviço nao devolva unidades são criadas novas
* load de tabelas DTP, caso o serviço nao devolva unidades são criadas novas
* com os valores a falso.
*
* @param courseCode
411,51 → 405,63
 
 
 
public static void main(String[] args) throws IOException, JSONException {
AbstractDao.getCurrentSession().beginTransaction();
/**
* Este servico gera um grafico com a taxa global de aproveitamento e grava-o no repositorio digital
* devolvendo o respectivo RepositoryFile4JsonView em json para poder ser anexado ao objecto imagem do
* widget do grafico
* @param reportDocumentJson
* @param session
* @return
* @throws IOException
*/
public String generateGlobalLearningResultsChartImg(String reportDocumentJson,UserSession session) throws IOException {
 
CourseReportDocument reportCourseDocument = new CourseReportServices().createNewCourseReportDocument("44","201617");
System.out.println(reportCourseDocument.toJson());
AbstractDao.getCurrentSession().getTransaction().commit();
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
LearningResultsSection learningResultsSection = (LearningResultsSection) reportDocument.findDocumentSection(LearningResultsSection.class);
LearningGlobalAnalysisSection learningGlobalAnalysisSection = (LearningGlobalAnalysisSection) learningResultsSection.findSection(LearningGlobalAnalysisSection.class);
GlobalLearningResultsChartImg chartImg = (GlobalLearningResultsChartImg) learningGlobalAnalysisSection.findDocComponent(GlobalLearningResultsChartImg.class);
 
//System.setProperty("javax.net.ssl.trustStore", "/JORGE/COPIAS/.keystore");
//System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
UnitsLearningResultsTable table = (UnitsLearningResultsTable) learningResultsSection.findDocComponent(UnitsLearningResultsTable.class);
 
/*URL url = new URL("http://pae.ipportalegre.pt/wsjson/api/app/ws-course-pedagogic-results-list?code=44&year=201617&period=S1");
FileUploaded fileUploaded = chartImg.generateChart2tmp(table,reportDocument);
 
RepositoryService repositoryService = new RepositoryService();
 
boolean imageInitialized = chartImg.getImage() != null
&&
chartImg.getImage().getIdentifier() != null;
 
System.out.println(StreamsUtils.readString(url.openStream()));*/
RepositoryFile4JsonView view;
if(imageInitialized)
{
String identifier = chartImg.getImage().getIdentifier();
view = repositoryService.replaceRepositoryFileFromFileUpload(identifier, fileUploaded, ResourceAccessControlEnum.privateDomain, session);
}
else
{
view = repositoryService.storeRepositoryFileFromFileUpload(fileUploaded,ResourceAccessControlEnum.privateDomain,session);
}
chartImg.setImage(view);
//TODO FALTA GUARDAR O JSON NO CURSO
return view.toJson();
}
 
/*
 
public String loadUnitsAndCreateLearningResultsTables4Course(String courseCode, String year) throws IOException, JSONException
{
 
}
*/
//TODO loadUnitsAndCreateLearningResultsTables4Course
//HIPOTESE DEVOLVER DOIS OBJECTOS
//SERVICO DE ARRANQUE
//DEVOLVE UM REPORT DOCUMENT E O CHAMADOR USA O QUE QUISER
//A GERACAO DE GRAFICOS FAZ-SE APENAS A PEDIDO
 
// SE ELE PEDIR PARA ATUALIZAR TUDO CARREGA-SE UNIDADES E TABELAS NU DOC NOVO
// E NO BROWSER SUBSTITUI-SE ESSES ELEMENTOS NOS ANTIGOS a seccao das unidades
// e as as tabelas
 
 
/****************************************************************************/
/*
 
 
 
SERVICOS WS-API
 
 
 
 
*/
/****************************************************************************/
/* SERVICOS WS-API
/****************************************************************************/
 
 
/**
504,7 → 510,10
return json;
}
JSONObject jsonObject = new JSONObject(json);
return jsonObject.get("response").toString();
if(jsonObject.get("service").equals("ok"))
return jsonObject.get("response").toString();
else
return json;
}
}
 
513,10 → 522,10
 
/**
*
* Para um determinado curso e ano o serviço faz uma listagem de todas as suas unidades curriculares
* e lista a sua informação básica juntamente com o relatório de avaliação disponivel
* O serviço adiciona ainda o Ano de cada unidade por inspeção do Plano de Estudos
* caso a unidade não seja encontrada no Plano de estudos o ano irá ser preenchido com -1
* Para um determinado curso e ano o serviço faz uma listagem de todas as suas unidades curriculares
* e lista a sua informação básica juntamente com o relatório de avaliação disponivel
* O serviço adiciona ainda o Ano de cada unidade por inspeção do Plano de Estudos
* caso a unidade não seja encontrada no Plano de estudos o ano irá ser preenchido com -1
*
* @param courseCode codigo Siges na base de dados
* @param year 201617, 201718
532,6 → 541,18
for(CourseUnit cu: units)
{
CourseUnitSection courseUnitSection = CourseReportUtils.createCourseUnitEvaluationSection((CourseUnitImpl) cu);
if(courseUnitSection.getAnoPlano() < 0)
{
logger.info("Ano do Plano not available from courseUnitsEvaluation Service, will read from API loadPlanYearForCourseUnitCode");
try{
String json = loadPlanYearForCourseUnitCode(courseCode,cu.getCode(),cu.getSemestre());
int ano = new JSONObject(json).getInt("year");
courseUnitSection.setAnoPlano(ano);
}catch(Throwable e )
{
logger.error("Nao conseguiu obter o ano do plano da API: " + e.toString(),e);
}
}
array.put(courseUnitSection.toJsonObject());
}
 
559,9 → 580,104
}
 
JSONObject jsonObject = new JSONObject(json);
return jsonObject.get("response").toString();
if(jsonObject.get("service").equals("ok"))
return jsonObject.get("response").toString();
else
return json;
}
}
 
 
}
/**
*
*
* @param courseCode codigo Siges na base de dados
* @param unitCode
* @return Json com o ano do plano exemplo: { year : 1 }
* ou -1 se não for encontrado
*/
public String loadPlanYearForCourseUnitCode(String courseCode,String unitCode,String period) throws JSONException, IOException {
 
 
if(Globals.SYSTEM_WSJSON_SERVICE_COURSE_UNIT_PLAN_YEAR.indexOf("localhost")>=0)
{
CourseImpl c = DaoFactory.getCourseDaoImpl().findCourseByCode(courseCode);
int year = c.getUnidadeAnoPlano(period,unitCode);
return "{ year : " + year + " }";
 
}
else
{
String json = "{ year : -1 }";
String serviceUrl = Globals.SYSTEM_WSJSON_SERVICE_COURSE_UNIT_PLAN_YEAR + "?courseCode=" + courseCode + "&unitCode=" + unitCode + "&period=" + period;
try{
URL url = new URL(serviceUrl);
 
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
 
json = StreamsUtils.readString(is);
is.close();
}catch(Throwable e)
{
logger.error("Connecting " + serviceUrl,e);
return json;
}
 
JSONObject jsonObject = new JSONObject(json);
if(jsonObject.get("service").equals("ok"))
return jsonObject.get("response").toString();
else
return json;
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
public static void main(String[] args) throws IOException, JSONException {
AbstractDao.getCurrentSession().beginTransaction();
 
CourseReportDocument reportCourseDocument = new CourseReportServices().createNewCourseReportDocument("44","201617");
System.out.println(reportCourseDocument.toJson());
AbstractDao.getCurrentSession().getTransaction().commit();
 
//System.setProperty("javax.net.ssl.trustStore", "/JORGE/COPIAS/.keystore");
//System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
 
/*URL url = new URL("http://pae.ipportalegre.pt/wsjson/api/app/ws-course-pedagogic-results-list?code=44&year=201617&period=S1");
 
 
 
System.out.println(StreamsUtils.readString(url.openStream()));*/
}
 
/*
 
public String loadUnitsAndCreateLearningResultsTables4Course(String courseCode, String year) throws IOException, JSONException
{
 
}
*/
//TODO loadUnitsAndCreateLearningResultsTables4Course
//HIPOTESE DEVOLVER DOIS OBJECTOS
//SERVICO DE ARRANQUE
//DEVOLVE UM REPORT DOCUMENT E O CHAMADOR USA O QUE QUISER
//A GERACAO DE GRAFICOS FAZ-SE APENAS A PEDIDO
 
// SE ELE PEDIR PARA ATUALIZAR TUDO CARREGA-SE UNIDADES E TABELAS NU DOC NOVO
// E NO BROWSER SUBSTITUI-SE ESSES ELEMENTOS NOS ANTIGOS a seccao das unidades
// e as as tabelas
 
 
 
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/CoursesService.java
9,10 → 9,10
import jomm.utils.StreamsUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.hibernate.Query;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.views.CourseView;
27,6 → 27,7
import pt.estgp.estgweb.services.users.UserRoleConfigService;
import pt.estgp.estgweb.utils.ConfigProperties;
import pt.estgp.estgweb.utils.Dom4jUtil;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.StringsUtils;
import pt.utl.ist.berserk.logic.serviceManager.IService;
 
181,7 → 182,7
{
c = DaoFactory.getCourseDaoImpl().findCourseByCodeAndYear(courseView.getCode(),courseView.getImportYear());
if(c != null)
throw new AlreadyExistsException(AlreadyExistsException.ALREADY_EXISTS_COURSE);
throw new AlreadyExistsException(AlreadyExistsException.ALREADY_EXISTS_COURSE);
c = DomainObjectFactory.createCourseImpl();
DaoFactory.getCourseDaoImpl().save(c);
}
219,7 → 220,7
}
htmlTrasformationResult = generateHtmlCache(userSession, c);
//####New#### Generating XML with JaxB
//ISTO SO É CHAMADO NO CASO DE SE FAZER UPLOAD DE UM NOVO PLANO PELO MECANISMO ANTIGO
//ISTO SO É CHAMADO NO CASO DE SE FAZER UPLOAD DE UM NOVO PLANO PELO MECANISMO ANTIGO
generateXmlJaxbStudiesPlanVersionFromRepositoryOldPlanStream(userSession, c, forceUrlFichas, systemUrl);
}
return htmlTrasformationResult;
287,7 → 288,7
/**
* ##NEW METHOD###
* Gera o XML normalizado para o JAXB a partir do XML importado do XML do plano XML quese usou no upload
* para garantir que está bem formado
* para garantir que está bem formado
* @param userSession
* @param c
* @return
298,7 → 299,7
CourseStudiesPlan courseStudiesPlan;
if(c.getStudiesPlan() == null || c.getStudiesPlan().trim().length() == 0)
{
//ESTE É O STREAM DO PLANO DE UPLOAD
//ESTE É O STREAM DO PLANO DE UPLOAD
logger.warn("Course does not have studies plan XML file stream to use in update");
return;
}
308,7 → 309,7
logger.info("Generating first study plan");
courseStudiesPlan = DomainObjectFactory.createCourseStudiesPlanImpl();
courseStudiesPlan.setVersion(1);
courseStudiesPlan.setVersionDescription("Auto gerado durante a importação de um XML com o plano de estudos a " + new Date().toString());
courseStudiesPlan.setVersionDescription("Auto gerado durante a importação de um XML com o plano de estudos a " + new Date().toString());
courseStudiesPlan.setCourse(c);
if(c.getStudiesPlans() == null)
c.setStudiesPlans(new HashSet<CourseStudiesPlan>());
377,8 → 378,8
 
 
/**
* Apenas é chamado quando se tenta injectar um programa a partir de um upload que foi feito
* pelo user ou pela sincronização remota
* Apenas é chamado quando se tenta injectar um programa a partir de um upload que foi feito
* pelo user ou pela sincronização remota
* @param curso
* @param systemUrl
* @param force
410,7 → 411,7
if(!url.endsWith("/"))
url = url + "/";
 
//Nao fornece o ano pois o servico irá assumir o ultimo
//Nao fornece o ano pois o servico irá assumir o ultimo
unidadeType.setUrlFichaCurricular(url + "startLoadCourseUnitProgramSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
unidadeType.setUrlUnidadeCurricular(url + "startLoadCourseUnitSiges.do?unitCode=" + unidadeType.getSiges() + "&courseCode=" + curso.getSiges() + "&semestre=" + semestre.getId());
}
600,12 → 601,12
 
/**
*
* * Serviço invocado para obter o JSON de um curso
* * Serviço invocado para obter o JSON de um curso
* O JSON tem dois campos o courseInfo e o plano de estudos colocados separadamente
*
* Atenção o plano de estudos usado é o ultimo considerando o seu ID
* Nota: O plano de Estudos é uma classe persistente que tem apenas versão e descrição
* deverá ter como campo o XML e o JSON já gerados do plano de estudos que comporta
* Atenção o plano de estudos usado é o ultimo considerando o seu ID
* Nota: O plano de Estudos é uma classe persistente que tem apenas versão e descrição
* deverá ter como campo o XML e o JSON já gerados do plano de estudos que comporta
*
* //TODO REVER
* @param code
633,8 → 634,8
{
JSONObject courseObj = new JSONObject(course.getJson());
coursesResponse.put("courseInfo",courseObj);
//Este caso apenas se dá se o plano nunca tiver sido editado ou sincronizado
//Nesse caso o sistema irá tentar obtê-lo da stream do repositorio
//Este caso apenas se dá se o plano nunca tiver sido editado ou sincronizado
//Nesse caso o sistema irá tentar obtê-lo da stream do repositorio
if(course.getStudiesPlans() == null || course.getStudiesPlans().size() == 0)
{
logger.info("status JSON NOT EXIST FOR STUDIES PLAN IN THIS COURSE, will try generate from studies plan OLD Stream");
699,8 → 700,8
logger.error(e,e);
return "<error>" + e.toString() + ". see log for details</error>";
}
}
}
 
if(course.getStudiesPlans() != null && course.getStudiesPlans().size() > 0)
{
return course.getStudiesPlans().iterator().next().getXml();
1008,7 → 1009,7
}
}
}
//Garante-se mas depois não vai para o JSON
//Garante-se mas depois não vai para o JSON
planoEditado.setSiges(course.getCode());//GARANTIR QUE O CODIGO SIGEST ESTA CORRECTO
planoEditado.setNome(course.getName());
planoEditado.setDep(course.getArea());
1178,39 → 1179,16
String normalizedName = StringsUtils.getNormalizedNameSafeforCode(c.getName());
if(normalizedName == null)
throw new RuntimeException("Erro o curso " + c.getId() +" + nao tem nome");
 
String roleValidation = "courseValidateProgram" + normalizedName;
UserRoleConfigImpl newUserRoleConfig = DomainObjectFactory.createUserRoleConfigImpl();
newUserRoleConfig.setRole(roleValidation);
newUserRoleConfig.setValid(true);
newUserRoleConfig.setValue("Comissão de Curso de " + c.getName());
newUserRoleConfig.setValuePt("Comissão de Curso de " + c.getName());
newUserRoleConfig.setValueEn("");
newUserRoleConfig.setValueEs("");
newUserRoleConfig.setValueFr("");
 
try {
 
ReplaceRoleResult result;
if(c.getValidationRole() == null || c.getValidationRole().trim().length() == 0)
{
result = new UserRoleConfigService().addUpdateRole(newUserRoleConfig,userSession,false);
}
else
{
String oldValidationRole = c.getValidationRole();
result = new UserRoleConfigService().updateOldRoleWithView(oldValidationRole, newUserRoleConfig, userSession,false);
}
 
 
if(result.roleKeyAlreadyExist)
{
logger.error("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
throw new AccessDeniedException("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
}
String oldValidationRole = c.getValidationRole();
String nomeRole = "Comissão de Curso de " + c.getName();
try{
ReplaceRoleResult result = new UserRoleConfigService().createNewNormalizedRoleService(oldValidationRole,nomeRole,roleValidation,userSession);
c.setValidationRole(roleValidation);
return result;
} catch (AccessDeniedException e) {
logger.error("Tentado alterar um Role e não é Administrador nem Super user");
}catch(AccessDeniedException e)
{
throw e;
}
}
1229,9 → 1207,20
public CourseDepartmentImpl updateDepartmentFromJson(String json,UserSession session) throws IOException
{
CourseDepartmentImpl courseDepartment = CourseDepartmentImpl.loadFromJson(json);
CourseDepartmentImpl courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().load(courseDepartment.getSigla());
 
 
 
if(!courseDepartment.getSiglaNova().equals(courseDepartment.getSigla()))
courseDepartmentPersistent.setSigla(courseDepartment.getSiglaNova());
{
//courseDepartmentPersistent.setSigla(courseDepartment.getSiglaNova());
Query q = AbstractDao.getCurrentSession().createQuery("update " + CourseDepartment.class.getName() + " d " +
" set d.sigla = :siglaNova where d.sigla = :sigla");
q.setString("siglaNova",courseDepartment.getSiglaNova());
q.setString("sigla",courseDepartment.getSigla());
q.executeUpdate();
//courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().load(courseDepartment.getSiglaNova());
}
CourseDepartmentImpl courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().load(courseDepartment.getSiglaNova());
//courseDepartmentPersistent.setSigla(courseDepartment.getSigla());
courseDepartmentPersistent.setActive(courseDepartment.isActive());
courseDepartmentPersistent.setName(courseDepartment.getName());
1273,7 → 1262,55
 
}
 
/**
* Cria um conjunto de roles novos para um determinado departamento
* chama o serviço tier1 UserRoleConfigService.createNewNormalizedRoleService
* @param session
* @return
* @throws IOException
* @throws AccessDeniedException
*/
public CourseDepartmentImpl newDepartmentRolesFromJson(String json,UserSession session) throws IOException, AccessDeniedException {
CourseDepartmentImpl courseDepartment = CourseDepartmentImpl.loadFromJson(json);
CourseDepartmentImpl courseDepartmentPersistent = (CourseDepartmentImpl) DaoFactory.getCourseDepartmentDaoImpl().findBySigla(courseDepartment.getSigla());
 
UserRoleConfigService userRoleConfigService = new UserRoleConfigService();
String normalizedName = StringsUtils.getNormalizedNameSafeforCode(courseDepartmentPersistent.getName());
if(normalizedName == null)
throw new RuntimeException("Erro o Departamento " + courseDepartmentPersistent.getSigla() +" + nao tem nome");
 
 
String nomeRole = "Departamento Direcção - " + courseDepartmentPersistent.getName();
String oldRole = courseDepartmentPersistent.getBoardRole();
String newRoleStr = "department.board." + normalizedName;
try
{
userRoleConfigService.createNewNormalizedRoleService(oldRole,nomeRole,newRoleStr, session);
courseDepartmentPersistent.setBoardRole(newRoleStr);
} catch (AccessDeniedException e) {
logger.error(e,e);
throw e;
}
 
 
nomeRole = "Departamento Diretor - " + courseDepartmentPersistent.getName();
oldRole = courseDepartmentPersistent.getDirectorRole();
newRoleStr = "department.diretor." + normalizedName;
 
try {
userRoleConfigService.createNewNormalizedRoleService(oldRole,nomeRole,newRoleStr, session);
courseDepartmentPersistent.setDirectorRole(newRoleStr);
} catch (AccessDeniedException e) {
logger.error(e,e);
throw e;
}
 
return courseDepartmentPersistent;
}
 
 
 
 
public CourseSchoolImpl updateSchoolFromJson(String json,UserSession session) throws IOException
{
CourseSchoolImpl courseSchool = CourseSchoolImpl.loadFromJson(json);
1307,6 → 1344,7
 
}
 
 
public CourseSchoolImpl newSchoolFromJson(UserSession session) throws IOException
{
CourseSchoolImpl courseSchoolPersistent = DomainObjectFactory.createCourseSchoolImpl();
1329,7 → 1367,7
/*
public static void main(String[] args) throws JAXBException, IOException {
 
String json = "{\"anoPlanoSiges\":null,\"codigoPlanoSiges\":null,\"dep\":null,\"descPlanoSiges\":null,\"nome\":null,\"semestre\":[{\"id\":\"S1\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Português — Língua e Literatura\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:12\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"},\"eCTS\":\"6\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Geografia\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:16\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"História\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:20\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Linguística e Análise do Discurso\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:24\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"},\"eCTS\":\"6\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Matemática no 1.o Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:28\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Educação para a Saúde\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:32\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Música, Emoção e Criatividade\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:36\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Educação para a Cidadania\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:40\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Descobrir a Matemática\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:44\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"}],\"type\":\"semestre\",\"$$hashKey\":\"object:6\"},{\"id\":\"S2\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Português no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:54\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Estudo do Meio no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:58\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática da Matemática no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:62\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática das Expressões no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:66\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Psicologia da Educação\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:70\",\"eCTS\":\"3\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Investigação em Educação\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:74\",\"eCTS\":\"3\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"}}],\"type\":\"semestre\",\"$$hashKey\":\"object:48\"},{\"id\":\"S3\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Prática de Ensino Supervisionada no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"500\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:90\",\"eCTS\":\"20\",\"horasContacto\":{\"s\":\"30\",\"e\":\"270\",\"oT\":\"45\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Seminário de Investigação I\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"50\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:98\",\"eCTS\":\"2\",\"horasContacto\":{\"s\":\"20\",\"oT\":\"10\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática da História e Geografia de Portugal no 2º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"100\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:94\",\"eCTS\":\"4\",\"horasContacto\":{\"tP\":\"35\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Português no 2º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"100\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:102\",\"eCTS\":\"4\",\"horasContacto\":{\"oT\":\"15\",\"tP\":\"35\"}}],\"type\":\"semestre\",\"$$hashKey\":\"object:78\"},{\"id\":\"S4\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:106\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:110\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:114\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:118\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:122\"}],\"type\":\"semestre\",\"$$hashKey\":\"object:84\"}],\"siges\":null}";
String json = "{\"anoPlanoSiges\":null,\"codigoPlanoSiges\":null,\"dep\":null,\"descPlanoSiges\":null,\"nome\":null,\"semestre\":[{\"id\":\"S1\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Português — Língua e Literatura\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:12\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"},\"eCTS\":\"6\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Geografia\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:16\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"História\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:20\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Linguística e Análise do Discurso\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:24\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"},\"eCTS\":\"6\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Matemática no 1.o Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"125\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:28\",\"horasContacto\":{\"tP\":\"45\",\"oT\":\"15\"},\"eCTS\":\"5\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Educação para a Saúde\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:32\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Música, Emoção e Criatividade\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:36\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Educação para a Cidadania\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:40\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Descobrir a Matemática\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:44\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"},\"eCTS\":\"3\"}],\"type\":\"semestre\",\"$$hashKey\":\"object:6\"},{\"id\":\"S2\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Português no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:54\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Estudo do Meio no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:58\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática da Matemática no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:62\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática das Expressões no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"150\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:66\",\"eCTS\":\"6\",\"horasContacto\":{\"tP\":\"60\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Psicologia da Educação\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:70\",\"eCTS\":\"3\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Investigação em Educação\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"75\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:74\",\"eCTS\":\"3\",\"horasContacto\":{\"tP\":\"30\",\"oT\":\"7\"}}],\"type\":\"semestre\",\"$$hashKey\":\"object:48\"},{\"id\":\"S3\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Prática de Ensino Supervisionada no 1º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"500\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:90\",\"eCTS\":\"20\",\"horasContacto\":{\"s\":\"30\",\"e\":\"270\",\"oT\":\"45\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Seminário de Investigação I\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"50\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:98\",\"eCTS\":\"2\",\"horasContacto\":{\"s\":\"20\",\"oT\":\"10\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática da História e Geografia de Portugal no 2º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"100\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:94\",\"eCTS\":\"4\",\"horasContacto\":{\"tP\":\"35\",\"oT\":\"15\"}},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"Didática do Português no 2º Ciclo do Ensino Básico\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":\"100\",\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:102\",\"eCTS\":\"4\",\"horasContacto\":{\"oT\":\"15\",\"tP\":\"35\"}}],\"type\":\"semestre\",\"$$hashKey\":\"object:78\"},{\"id\":\"S4\",\"notas\":null,\"perfil\":[],\"semestreDesc\":\"Semestre 1\",\"semestreDescEn\":\"Semester 1\",\"semestreDescEs\":\"Semestre 1\",\"semestreDescFr\":\"Semestre 1\",\"semestreId\":null,\"unidade\":[{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:106\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:110\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:114\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:118\"},{\"dep\":\"\",\"ects\":\"\",\"nome\":\"\",\"nomeEn\":null,\"nomeEs\":null,\"nomeFr\":null,\"obs\":\"\",\"removed\":null,\"siges\":null,\"totalHoras\":0,\"urlFichaCurricular\":\"\",\"urlUnidadeCurricular\":\"\",\"type\":\"unidade\",\"$$hashKey\":\"object:122\"}],\"type\":\"semestre\",\"$$hashKey\":\"object:84\"}],\"siges\":null}";
CursoImpl c = CursoImpl.loadFromJson(json);
 
JAXBContext jc = JAXBContext.newInstance(Curso.class);
1341,4 → 1379,4
}*/
 
 
}
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/GlobalLearningResultsChartImg.java
1,11 → 1,129
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components;
 
import pt.estgp.estgweb.utils.documentBuilder.AutoImageWraperComponent;
import jomm.utils.BytesUtils;
import jomm.utils.MimeTypeGuesser;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.RingPlot;
import org.jfree.data.general.DefaultPieDataset;
import pt.estgp.estgweb.services.courses.coursereport.documentmodel.CourseReportDocument;
import pt.estgp.estgweb.utils.Globals;
import pt.estgp.estgweb.utils.documentBuilder.ImageComponent;
import pt.estgp.estgweb.web.controllers.utils.FileUploaded;
 
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
* Created by jorgemachado on 31/10/17.
*/
public class GlobalLearningResultsChartImg extends AutoImageWraperComponent
public class GlobalLearningResultsChartImg extends ImageComponent
{
/**
*
* @param results
* @return the tmp path for generated chart
* @throws IOException
*/
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results,CourseReportDocument courseReportDocument) throws IOException
{
float aprovados = results.getAprovados();
float reprovados = results.getReprovados();
float semElementos = results.getSemElementos();
double aprovadosPercent = ((int)(results.getAprovadosPercent()*100.0))/100.0;
double reprovadosPercent = ((int)(results.getReprovadosPercent()*100.0))/100.0;
double semElementosPercent = ((int)(results.getSemElementosPercent()*100.0))/100.0;
 
}
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultPieDataset data = new DefaultPieDataset();
if(reprovados > 0)
data.setValue("Reprovados " + reprovadosPercent + "%", new Double(reprovados));
if(aprovados > 0)
data.setValue("Aprovados " + aprovadosPercent + "%", new Double(aprovados));
if(semElementos > 0)
data.setValue("Sem Elementos " + semElementosPercent + "%", new Double(semElementos));
JFreeChart chart = ChartFactory.createRingChart(null, data, false, true, false);
chart.setBackgroundPaint(new Color(255,255,255));
PiePlot plot = (RingPlot) chart.getPlot();
plot.setLabelBackgroundPaint(new Color(255, 249, 235));
plot.setLabelPaint(new Color(88, 88, 90));
//plot.setDrawingSupplier(new ChartBuilderUtil.ChartDrawingSupplier());
 
plot.setSectionPaint(0, new Color(255, 0, 0));
plot.setSectionPaint(1, new Color(15, 218, 10));
plot.setSectionPaint(2, new Color(200, 200, 200));
plot.setBackgroundPaint(new Color(255, 255, 255));
plot.setOutlineVisible(false);
 
 
 
plot.setLabelFont(new Font(
"Helvetica", Font.PLAIN, 30));
 
 
BufferedImage image = chart.createBufferedImage( 300*4, 200*4);
String pathGraficoTiposAlunos = Globals.TMP_DIR + java.io.File.separator + tempName;
java.io.File output = new java.io.File(pathGraficoTiposAlunos);
ImageIO.write(image, "png", new FileOutputStream(output));
 
FileUploaded fileUploaded = new FileUploaded();
fileUploaded.setTmpName(tempName);
fileUploaded.setTitle("Taxa global de aproveitamento");
fileUploaded.setDescription("Curso: " + courseReportDocument.getCourseName() + " (" + courseReportDocument.getCourseCode()+ ") ano " + courseReportDocument.getYear());
fileUploaded.setContentType(MimeTypeGuesser.getInstance().guessMimeType(output));
fileUploaded.setFileSize(output.length());
fileUploaded.setExtension("png");
return fileUploaded;
}
 
public static void main(String [] args) throws IOException {
float aprovados = 10;
float reprovados = 2;
float semElementos = 4;
double aprovadosPercent = ((int)10/16*100.0)/100.0;
double reprovadosPercent = ((int)2/16*100.0)/100.0;
double semElementosPercent = ((int)4/16*100.0)/100.0;
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultPieDataset data = new DefaultPieDataset();
if(reprovados > 0)
data.setValue("Reprovados " + reprovadosPercent + "%", new Double(reprovados));
if(aprovados > 0)
data.setValue("Aprovados " + aprovadosPercent + "%", new Double(aprovados));
if(semElementos > 0)
data.setValue("Sem Elementos " + semElementosPercent + "%", new Double(semElementos));
JFreeChart chart = ChartFactory.createRingChart(null, data, false, true, false);
chart.setBackgroundPaint(new Color(255,255,255));
PiePlot plot = (RingPlot) chart.getPlot();
plot.setLabelBackgroundPaint(new Color(255, 249, 235));
plot.setLabelPaint(new Color(88, 88, 90));
//plot.setDrawingSupplier(new ChartBuilderUtil.ChartDrawingSupplier());
 
plot.setSectionPaint(0, new Color(255, 0, 0));
plot.setSectionPaint(1, new Color(15, 218, 10));
plot.setSectionPaint(2, new Color(200, 200, 200));
plot.setBackgroundPaint(new Color(255, 255, 255));
plot.setOutlineVisible(false);
 
 
 
plot.setLabelFont(new Font(
"Helvetica", Font.PLAIN, 30));
 
 
BufferedImage image = chart.createBufferedImage( 300*4, 200*4);
String pathGraficoTiposAlunos = Globals.TMP_DIR + java.io.File.separator + tempName;
java.io.File output = new java.io.File(pathGraficoTiposAlunos);
ImageIO.write(image, "png", new FileOutputStream(output));
 
 
}
 
 
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/UnitsLearningResult.java
6,21 → 6,31
public class UnitsLearningResult
{
float cumprimentoProgramaPercent;
int alunosInscritos;
float alunosInscritos;
 
int semElementos;
float semElementos;
float semElementosPercent;
int aprovados;
float aprovados;
float aprovadosPercent;
int reprovados;
float reprovados;
float reprovadosPercent;
int aprovados1013;
float aprovados1013;
float aprovados1013Percent;
int aprovados1416;
float aprovados1416;
float aprovados1416Percent;
int aprovados1720;
float aprovados1720;
float aprovados1720Percent;
 
private boolean manual;
 
public boolean isManual() {
return manual;
}
 
public void setManual(boolean manual) {
this.manual = manual;
}
 
public float getCumprimentoProgramaPercent() {
return cumprimentoProgramaPercent;
}
29,19 → 39,19
this.cumprimentoProgramaPercent = cumprimentoProgramaPercent;
}
 
public int getAlunosInscritos() {
public float getAlunosInscritos() {
return alunosInscritos;
}
 
public void setAlunosInscritos(int alunosInscritos) {
public void setAlunosInscritos(float alunosInscritos) {
this.alunosInscritos = alunosInscritos;
}
 
public int getSemElementos() {
public float getSemElementos() {
return semElementos;
}
 
public void setSemElementos(int semElementos) {
public void setSemElementos(float semElementos) {
this.semElementos = semElementos;
}
 
53,11 → 63,11
this.semElementosPercent = semElementosPercent;
}
 
public int getAprovados() {
public float getAprovados() {
return aprovados;
}
 
public void setAprovados(int aprovados) {
public void setAprovados(float aprovados) {
this.aprovados = aprovados;
}
 
69,11 → 79,11
this.aprovadosPercent = aprovadosPercent;
}
 
public int getReprovados() {
public float getReprovados() {
return reprovados;
}
 
public void setReprovados(int reprovados) {
public void setReprovados(float reprovados) {
this.reprovados = reprovados;
}
 
85,11 → 95,11
this.reprovadosPercent = reprovadosPercent;
}
 
public int getAprovados1013() {
public float getAprovados1013() {
return aprovados1013;
}
 
public void setAprovados1013(int aprovados1013) {
public void setAprovados1013(float aprovados1013) {
this.aprovados1013 = aprovados1013;
}
 
101,11 → 111,11
this.aprovados1013Percent = aprovados1013Percent;
}
 
public int getAprovados1416() {
public float getAprovados1416() {
return aprovados1416;
}
 
public void setAprovados1416(int aprovados1416) {
public void setAprovados1416(float aprovados1416) {
this.aprovados1416 = aprovados1416;
}
 
117,11 → 127,11
this.aprovados1416Percent = aprovados1416Percent;
}
 
public int getAprovados1720() {
public float getAprovados1720() {
return aprovados1720;
}
 
public void setAprovados1720(int aprovados1720) {
public void setAprovados1720(float aprovados1720) {
this.aprovados1720 = aprovados1720;
}
 
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/UnitsLearningResultsTable.java
12,31 → 12,23
{
 
float cumprimentoProgramaPercent;
int alunosInscritos;
float alunosInscritos;
 
int semElementos;
float semElementos;
float semElementosPercent;
int aprovados;
float aprovados;
float aprovadosPercent;
int reprovados;
float reprovados;
float reprovadosPercent;
int aprovados1013;
float aprovados1013;
float aprovados1013Percent;
int aprovados1416;
float aprovados1416;
float aprovados1416Percent;
int aprovados1720;
float aprovados1720;
float aprovados1720Percent;
 
List<UnitsLearningResultYear> years = new ArrayList<UnitsLearningResultYear>();
 
public List<UnitsLearningResultYear> getYears() {
return years;
}
 
public void setYears(List<UnitsLearningResultYear> years) {
this.years = years;
}
 
public float getCumprimentoProgramaPercent() {
return cumprimentoProgramaPercent;
}
45,19 → 37,19
this.cumprimentoProgramaPercent = cumprimentoProgramaPercent;
}
 
public int getAlunosInscritos() {
public float getAlunosInscritos() {
return alunosInscritos;
}
 
public void setAlunosInscritos(int alunosInscritos) {
public void setAlunosInscritos(float alunosInscritos) {
this.alunosInscritos = alunosInscritos;
}
 
public int getSemElementos() {
public float getSemElementos() {
return semElementos;
}
 
public void setSemElementos(int semElementos) {
public void setSemElementos(float semElementos) {
this.semElementos = semElementos;
}
 
69,11 → 61,11
this.semElementosPercent = semElementosPercent;
}
 
public int getAprovados() {
public float getAprovados() {
return aprovados;
}
 
public void setAprovados(int aprovados) {
public void setAprovados(float aprovados) {
this.aprovados = aprovados;
}
 
85,11 → 77,11
this.aprovadosPercent = aprovadosPercent;
}
 
public int getReprovados() {
public float getReprovados() {
return reprovados;
}
 
public void setReprovados(int reprovados) {
public void setReprovados(float reprovados) {
this.reprovados = reprovados;
}
 
101,11 → 93,11
this.reprovadosPercent = reprovadosPercent;
}
 
public int getAprovados1013() {
public float getAprovados1013() {
return aprovados1013;
}
 
public void setAprovados1013(int aprovados1013) {
public void setAprovados1013(float aprovados1013) {
this.aprovados1013 = aprovados1013;
}
 
117,11 → 109,11
this.aprovados1013Percent = aprovados1013Percent;
}
 
public int getAprovados1416() {
public float getAprovados1416() {
return aprovados1416;
}
 
public void setAprovados1416(int aprovados1416) {
public void setAprovados1416(float aprovados1416) {
this.aprovados1416 = aprovados1416;
}
 
133,11 → 125,11
this.aprovados1416Percent = aprovados1416Percent;
}
 
public int getAprovados1720() {
public float getAprovados1720() {
return aprovados1720;
}
 
public void setAprovados1720(int aprovados1720) {
public void setAprovados1720(float aprovados1720) {
this.aprovados1720 = aprovados1720;
}
 
148,4 → 140,12
public void setAprovados1720Percent(float aprovados1720Percent) {
this.aprovados1720Percent = aprovados1720Percent;
}
 
public List<UnitsLearningResultYear> getYears() {
return years;
}
 
public void setYears(List<UnitsLearningResultYear> years) {
this.years = years;
}
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/CourseReportDocument.java
5,6 → 5,7
import org.apache.log4j.Logger;
import org.json.JSONException;
import org.json.JSONObject;
import pt.estgp.estgweb.domain.Course;
import pt.estgp.estgweb.domain.utils.JsonView;
import pt.estgp.estgweb.utils.documentBuilder.Document;
import pt.estgp.estgweb.utils.documentBuilder.DocumentSection;
20,20 → 21,53
 
private static final Logger logger = Logger.getLogger(CourseReportDocument.class);
 
private String courseCode;
private String courseName;
private String year;
 
 
 
public CourseReportDocument()
{
 
}
 
public void init()
public String getCourseCode() {
return courseCode;
}
 
public void setCourseCode(String courseCode) {
this.courseCode = courseCode;
}
 
public String getCourseName() {
return courseName;
}
 
public void setCourseName(String courseName) {
this.courseName = courseName;
}
 
public String getYear() {
return year;
}
 
public void setYear(String year) {
this.year = year;
}
 
public void init(Course c,String year)
{
setYear(year);
setCourseCode(c.getCode());
setCourseName(c.getName());
 
//1 - Introducao
IntroSection introSection = new IntroSection();
introSection.init();
getSections().add(introSection);
 
//2 - Mapa Sintese dos Relatórios dos Responsáveis das UC's
//2 - Mapa Sintese dos Relatórios dos Responsáveis das UC's
ReportsUcSummarySection reportsUcSummarySection = new ReportsUcSummarySection();
reportsUcSummarySection.init();
getSections().add(reportsUcSummarySection);
43,12 → 77,12
learningResultsSection.init();
getSections().add(learningResultsSection);
 
//4 - Inquéritos
//4 - Inquéritos
SurveysSection surveysSection = new SurveysSection();
surveysSection.init();
getSections().add(surveysSection);
 
//5 - Conclusões
//5 - Conclusões
ConclusionsSection conclusionsSection = new ConclusionsSection();
conclusionsSection.init();
getSections().add(conclusionsSection);
126,4 → 160,4
 
 
 
}
}
/branches/grupo5/impl/src/java/pt/estgp/estgweb/services/users/UserRoleConfigService.java
55,6 → 55,55
}
 
 
/**
* Serviço Tear 1 para substituição de Roles ou criação de Novos
* @param oldRole
* @param nomeRole
* @param newRoleStr
* @param session
* @return
* @throws AccessDeniedException
*/
public ReplaceRoleResult createNewNormalizedRoleService(String oldRole,String nomeRole,String newRoleStr,UserSession session) throws AccessDeniedException {
ReplaceRoleResult result;
 
UserRoleConfigImpl newUserRoleConfig = DomainObjectFactory.createUserRoleConfigImpl();
newUserRoleConfig.setRole(newRoleStr);
newUserRoleConfig.setValid(true);
newUserRoleConfig.setValue(nomeRole);
newUserRoleConfig.setValuePt(nomeRole);
newUserRoleConfig.setValueEn("");
newUserRoleConfig.setValueEs("");
newUserRoleConfig.setValueFr("");
 
try {
 
if(oldRole == null || oldRole.trim().length() == 0)
{
result = new UserRoleConfigService().addUpdateRole(newUserRoleConfig,session,false);
}
else
{
 
result = new UserRoleConfigService().updateOldRoleWithView(oldRole, newUserRoleConfig, session,false);
}
 
 
if(result.roleKeyAlreadyExist)
{
logger.error("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
throw new AccessDeniedException("Tentado CRIAR um Role que já existe e não é Administrador nem Super user");
}
 
 
} catch (AccessDeniedException e) {
logger.error("Tentado alterar um Role e não é Administrador nem Super user");
throw e;
}
 
return result;
}
 
public ReplaceRoleResult updateOldRoleWithView(String oldRole,UserRoleConfigImpl newViewRoleConfig, UserSession sess)
throws AccessDeniedException
{
111,7 → 160,7
}
else
{
throw new AccessDeniedException("Nao pode alterar o código do papel porque não é administrador");
throw new AccessDeniedException("Nao pode alterar o código do papel porque não é administrador");
}
}
else
147,9 → 196,9
 
 
/**
* Serviço de nível SUPORTE
* Usado pelo update de Roles e Pela normalização de Roles de Comissões de Curso
* Substitui a presença de um ROLE por um NOVO
* Serviço de nível SUPORTE
* Usado pelo update de Roles e Pela normalização de Roles de Comissões de Curso
* Substitui a presença de um ROLE por um NOVO
*
*
* @param oldRole if null does not find old users for replace
237,7 → 286,7
result.afetectedCoursesValidatePrograms = courses.size();
for(Course c :courses)
{
c.setValidationRole(newRole);
c.setValidationRole(newRole);
}
}
 
372,214 → 421,214
}
 
private static final String INIT_ROLES = "user.role.all=Todos\n" +
"user.role.admin=Administrador\n" +
"user.role.student=Estudante\n" +
"user.role.comissao.avaliacao.desempenho.docente=Comissão de Avaliação de Desempenho Docente\n" +
"user.role.erasmusStudent=Estudante de Erasmus\n" +
"user.role.teacher=Professor\n" +
"user.role.teacher.eg=Professor da Área de Engenharia\n" +
"user.role.teacher.dg=Professor da Área de Design\n" +
"user.role.teacher.ce=Professor da Área de Ciencias Empresariais\n" +
"user.role.teacher.ch=Professor da Área de Ciencias Humanas\n" +
"user.role.teacher.td=Professor do DTD\n" +
"user.role.teacher.cesh=Professor do DCESH\n" +
"user.role.student.eg=Aluno da Área de Engenharia\n" +
"user.role.student.dg=Aluno da Área de Design\n" +
"user.role.student.ce=Aluno da Área de Ciencias Empresariais\n" +
"user.role.student.ch=Aluno da Área de Ciencias Humanas\n" +
"user.role.student.td=Aluno do DTD\n" +
"user.role.student.cesh=Aluno do DCESH\n" +
"user.role.ci=Centro Informático\n" +
"user.role.worker=Funcionário\n" +
"user.role.invited=Convidado\n" +
"user.role.services=Serviços\n" +
"user.role.questionarios.tipologias.admin=Questionarios - Verificação de Tipologias\n" +
"user.role.questionarios.atribuicoes.admin=Questionarios - Atribuições de Cursos\n" +
"user.role.questionarios.atribuicoes.check_teachers=Questionarios - Verificação de Professores\n" +
"user.role.questionarios.admin=Questionários - Super Administrador\n" +
"user.role.questionarios.gerais=Questionários - Permissões Básicas (necessário)\n" +
"user.role.servicesPrograms=Gestão de Programas Curriculares\n" +
"user.role.servicesStudiesPlans=Gestão de Planos de Estudos\n" +
"user.role.servicesCoursesManagement=Gestão de Cursos\n" +
"user.role.servicesRolesManagement=Gestão de Papeis Institucionais\n" +
"user.role.event_class_manager=Gestão de Classes de Eventos\n" +
"user.role.event_manager_nfc=Gestão de Eventos do Nucleo de Formacao Continua\n" +
"user.role.administrativeCouncil=Membro da Direcção\n" +
"user.role.administrativeCouncil.director=Director\n" +
"user.role.administrativeCouncil.vice=Vice Director\n" +
"user.role.schoolSecretary=Secretário da Escola\n" +
"user.role.administrativeCouncilSecretariat=Secretaria da Direcção\n" +
"user.role.teachersSecretariat=Secretaria de Pessoal Docente\n" +
"user.role.dtd.president=Presidente do DTD\n" +
"user.role.cesh.president=Presidente do DCESH\n" +
"user.role.dtd.presidency=Membro da Presidencia do DTD\n" +
"user.role.cesh.presidency=Membro da Presidencia do DCESH\n" +
"user.role.scientificCouncil.president=CTC Presidente (Não utilizado)\n" +
"user.role.admin=Administrador\n" +
"user.role.student=Estudante\n" +
"user.role.comissao.avaliacao.desempenho.docente=Comissão de Avaliação de Desempenho Docente\n" +
"user.role.erasmusStudent=Estudante de Erasmus\n" +
"user.role.teacher=Professor\n" +
"user.role.teacher.eg=Professor da Área de Engenharia\n" +
"user.role.teacher.dg=Professor da Área de Design\n" +
"user.role.teacher.ce=Professor da Área de Ciencias Empresariais\n" +
"user.role.teacher.ch=Professor da Área de Ciencias Humanas\n" +
"user.role.teacher.td=Professor do DTD\n" +
"user.role.teacher.cesh=Professor do DCESH\n" +
"user.role.student.eg=Aluno da Área de Engenharia\n" +
"user.role.student.dg=Aluno da Área de Design\n" +
"user.role.student.ce=Aluno da Área de Ciencias Empresariais\n" +
"user.role.student.ch=Aluno da Área de Ciencias Humanas\n" +
"user.role.student.td=Aluno do DTD\n" +
"user.role.student.cesh=Aluno do DCESH\n" +
"user.role.ci=Centro Informático\n" +
"user.role.worker=Funcionário\n" +
"user.role.invited=Convidado\n" +
"user.role.services=Serviços\n" +
"user.role.questionarios.tipologias.admin=Questionarios - Verificação de Tipologias\n" +
"user.role.questionarios.atribuicoes.admin=Questionarios - Atribuições de Cursos\n" +
"user.role.questionarios.atribuicoes.check_teachers=Questionarios - Verificação de Professores\n" +
"user.role.questionarios.admin=Questionários - Super Administrador\n" +
"user.role.questionarios.gerais=Questionários - Permissões Básicas (necessário)\n" +
"user.role.servicesPrograms=Gestão de Programas Curriculares\n" +
"user.role.servicesStudiesPlans=Gestão de Planos de Estudos\n" +
"user.role.servicesCoursesManagement=Gestão de Cursos\n" +
"user.role.servicesRolesManagement=Gestão de Papeis Institucionais\n" +
"user.role.event_class_manager=Gestão de Classes de Eventos\n" +
"user.role.event_manager_nfc=Gestão de Eventos do Nucleo de Formacao Continua\n" +
"user.role.administrativeCouncil=Membro da Direcção\n" +
"user.role.administrativeCouncil.director=Director\n" +
"user.role.administrativeCouncil.vice=Vice Director\n" +
"user.role.schoolSecretary=Secretário da Escola\n" +
"user.role.administrativeCouncilSecretariat=Secretaria da Direcção\n" +
"user.role.teachersSecretariat=Secretaria de Pessoal Docente\n" +
"user.role.dtd.president=Presidente do DTD\n" +
"user.role.cesh.president=Presidente do DCESH\n" +
"user.role.dtd.presidency=Membro da Presidencia do DTD\n" +
"user.role.cesh.presidency=Membro da Presidencia do DCESH\n" +
"user.role.scientificCouncil.president=CTC Presidente (Não utilizado)\n" +
 
 
 
"user.role.representativeCouncil.president=Presidente do Conselho de Representantes\n" +
"user.role.pedagogicCouncil.president=Presidente do Conselho Pedagógico\n" +
"user.role.representativeCouncil=Conselho de Representantes\n" +
"user.role.scientificCouncil=CTC Membro (Não utilizado)\n" +
"user.role.erasmusCouncil=Conselho Erasmus\n" +
"user.role.pedagogicCouncil=Conselho Pedagógico\n" +
"user.role.courseCoordinator=Coordenadores\n" +
"user.role.futureStudent=Futuros Alunos\n" +
"user.role.oldStudent=Antigos Alunos\n" +
"user.role.studentAssociation=Associação de Estudantes\n" +
"user.role.computerCenter=Centro Informático\n" +
"user.role.courseDirector=Presidente de Departamento\n" +
"user.role.identifiersManager=Utilizador de Gestão de Identificadores\n" +
"user.role.identifiersCollectionCreator=Administrador de Colecções de Identificadores\n" +
"user.role.studentsID=Alunos de Informação e Documentação\n" +
"user.role.studentsFSIR=Alunos de Fontes de Informação e Serviço de Referência\n" +
"user.role.sendMailMessages=Enviar Mensagens de Correio Electronico\n" +
"user.role.pedagogicCouncilSecretariat=Secretariado do Conselho Pedagógico\n" +
"user.role.directionSecretariat=Secretariado da Direcção\n" +
"user.role.studentsSecretariat=Secretaria de Alunos\n" +
"user.role.assessementsTester=Testador de Provas de Avaliação\n" +
"user.role.processes.admin=Inspector de Processos" +
"user.role.validate.ei=Comissão de Curso de Engenharia Informática\n" +
"user.role.courseValidateProgramGPME=Comissão de Curso de Gestão de PME\n" +
"user.role.courseValidateProgramCET_TD=Comissão de Curso de CETS de TD\n" +
"user.role.courseValidateProgramEI=Comissão de Curso de EI\n" +
"user.role.courseValidateProgramEC=Comissão de Curso de EC\n" +
"user.role.courseValidateProgramBioEng=Comissão de Curso de BioEng\n" +
"user.role.courseValidateProgramEGI=Comissão de Curso de EGI\n" +
"user.role.courseValidateProgramEERA=Comissão de Curso de EERA\n" +
"user.role.courseValidateProgramDC=Comissão de Curso de DC\n" +
"user.role.courseValidateProgramDA=Comissão de Curso de DA\n" +
"user.role.courseValidateProgramTVAPE=Comissão de Curso de TVAPE\n" +
"user.role.courseValidateProgramMI=Comissão de Curso de MI\n" +
"user.role.courseValidateProgramEGPMEestranho=Comissão de Curso de EPGME\n" +
"user.role.courseValidatePrograms=Validação de Programas\n" +
"user.role.courseValidateProgramCET_CESH=Comissão de Curso de CETS de CESH\n" +
"user.role.courseValidateProgramAPM=Comissão de Curso de APM\n" +
"user.role.courseValidateProgramAA=Comissão de Curso de AA\n" +
"user.role.courseValidateProgramG=Comissão de Curso de G\n" +
"user.role.courseValidateProgramID=Comissão de Curso de ID\n" +
"user.role.courseValidateProgramRPS=Comissão de Curso de RPS\n" +
"user.role.courseValidateProgramTGI=Comissão de Curso de TGI\n" +
"user.role.courseValidateProgramRU=Comissão de Curso de RU\n" +
"user.role.courseValidateProgramCF=Comissão de Curso de Contabilidade e Finanças\n" +
"user.role.courseValidateProgramNONE=Nenhuma\n" +
"user.role.courseValidateProgramTPB=Comissão de Curso de Tecnologias de Produção de Biocombustíveis\n"+
"user.role.board.institution=Board de Direcção do Instituto Politecnico\n"+
"user.role.repositoryDocs=Administração do Repositório Digital\n"+
"user.role.repositoryDeposit=Depositante do Repositório Digital\n"+
"user.role.representativeCouncil.president=Presidente do Conselho de Representantes\n" +
"user.role.pedagogicCouncil.president=Presidente do Conselho Pedagógico\n" +
"user.role.representativeCouncil=Conselho de Representantes\n" +
"user.role.scientificCouncil=CTC Membro (Não utilizado)\n" +
"user.role.erasmusCouncil=Conselho Erasmus\n" +
"user.role.pedagogicCouncil=Conselho Pedagógico\n" +
"user.role.courseCoordinator=Coordenadores\n" +
"user.role.futureStudent=Futuros Alunos\n" +
"user.role.oldStudent=Antigos Alunos\n" +
"user.role.studentAssociation=Associação de Estudantes\n" +
"user.role.computerCenter=Centro Informático\n" +
"user.role.courseDirector=Presidente de Departamento\n" +
"user.role.identifiersManager=Utilizador de Gestão de Identificadores\n" +
"user.role.identifiersCollectionCreator=Administrador de Colecções de Identificadores\n" +
"user.role.studentsID=Alunos de Informação e Documentação\n" +
"user.role.studentsFSIR=Alunos de Fontes de Informação e Serviço de Referência\n" +
"user.role.sendMailMessages=Enviar Mensagens de Correio Electronico\n" +
"user.role.pedagogicCouncilSecretariat=Secretariado do Conselho Pedagógico\n" +
"user.role.directionSecretariat=Secretariado da Direcção\n" +
"user.role.studentsSecretariat=Secretaria de Alunos\n" +
"user.role.assessementsTester=Testador de Provas de Avaliação\n" +
"user.role.processes.admin=Inspector de Processos" +
"user.role.validate.ei=Comissão de Curso de Engenharia Informática\n" +
"user.role.courseValidateProgramGPME=Comissão de Curso de Gestão de PME\n" +
"user.role.courseValidateProgramCET_TD=Comissão de Curso de CETS de TD\n" +
"user.role.courseValidateProgramEI=Comissão de Curso de EI\n" +
"user.role.courseValidateProgramEC=Comissão de Curso de EC\n" +
"user.role.courseValidateProgramBioEng=Comissão de Curso de BioEng\n" +
"user.role.courseValidateProgramEGI=Comissão de Curso de EGI\n" +
"user.role.courseValidateProgramEERA=Comissão de Curso de EERA\n" +
"user.role.courseValidateProgramDC=Comissão de Curso de DC\n" +
"user.role.courseValidateProgramDA=Comissão de Curso de DA\n" +
"user.role.courseValidateProgramTVAPE=Comissão de Curso de TVAPE\n" +
"user.role.courseValidateProgramMI=Comissão de Curso de MI\n" +
"user.role.courseValidateProgramEGPMEestranho=Comissão de Curso de EPGME\n" +
"user.role.courseValidatePrograms=Validação de Programas\n" +
"user.role.courseValidateProgramCET_CESH=Comissão de Curso de CETS de CESH\n" +
"user.role.courseValidateProgramAPM=Comissão de Curso de APM\n" +
"user.role.courseValidateProgramAA=Comissão de Curso de AA\n" +
"user.role.courseValidateProgramG=Comissão de Curso de G\n" +
"user.role.courseValidateProgramID=Comissão de Curso de ID\n" +
"user.role.courseValidateProgramRPS=Comissão de Curso de RPS\n" +
"user.role.courseValidateProgramTGI=Comissão de Curso de TGI\n" +
"user.role.courseValidateProgramRU=Comissão de Curso de RU\n" +
"user.role.courseValidateProgramCF=Comissão de Curso de Contabilidade e Finanças\n" +
"user.role.courseValidateProgramNONE=Nenhuma\n" +
"user.role.courseValidateProgramTPB=Comissão de Curso de Tecnologias de Produção de Biocombustíveis\n"+
"user.role.board.institution=Board de Direcção do Instituto Politecnico\n"+
"user.role.repositoryDocs=Administração do Repositório Digital\n"+
"user.role.repositoryDeposit=Depositante do Repositório Digital\n"+
 
 
 
 
//ESCOLAS
//ESCOLAS
 
 
 
//ESTG
"user.role.school.president.estg=Escola Director da ESTG\n"+
"user.role.school.board.estg=Escola Board de Direcção da ESTG\n"+
"user.role.school.secretariado.estg=Escola Secretariado da ESTG\n"+
//CTC
"user.role.scientificCouncil.president.estg=CTC ESTG Presidente\n" +
"user.role.scientificCouncil.board.estg=CTC ESTG Membro\n" +
"user.role.scientificCouncil.secretariado.estg=CTC ESTG Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.estg=Pedagógico ESTG Presidente\n" +
"user.role.pedagogicCouncil.board.estg=Pedagógico ESTG Membro\n" +
"user.role.pedagogicCouncil.secretariado.estg=Pedagógico ESTG Secretariado\n" +
//ESTG
"user.role.school.president.estg=Escola Director da ESTG\n"+
"user.role.school.board.estg=Escola Board de Direcção da ESTG\n"+
"user.role.school.secretariado.estg=Escola Secretariado da ESTG\n"+
//CTC
"user.role.scientificCouncil.president.estg=CTC ESTG Presidente\n" +
"user.role.scientificCouncil.board.estg=CTC ESTG Membro\n" +
"user.role.scientificCouncil.secretariado.estg=CTC ESTG Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.estg=Pedagógico ESTG Presidente\n" +
"user.role.pedagogicCouncil.board.estg=Pedagógico ESTG Membro\n" +
"user.role.pedagogicCouncil.secretariado.estg=Pedagógico ESTG Secretariado\n" +
 
//MEMBROS ESCOLAS
"user.role.worker.estg=Funcionário ESTG\n" +
"user.role.worker.esae=Funcionário ESAE\n" +
"user.role.worker.esecs=Funcionário ESECS\n" +
"user.role.worker.ess=Funcionário ESS\n" +
//MEMBROS ESCOLAS
"user.role.worker.estg=Funcionário ESTG\n" +
"user.role.worker.esae=Funcionário ESAE\n" +
"user.role.worker.esecs=Funcionário ESECS\n" +
"user.role.worker.ess=Funcionário ESS\n" +
 
"user.role.teacher.estg=Docentes ESTG\n" +
"user.role.teacher.esae=Docentes ESAE\n" +
"user.role.teacher.esecs=Docentes ESECS\n" +
"user.role.teacher.ess=Docentes ESS\n" +
"user.role.teacher.estg=Docentes ESTG\n" +
"user.role.teacher.esae=Docentes ESAE\n" +
"user.role.teacher.esecs=Docentes ESECS\n" +
"user.role.teacher.ess=Docentes ESS\n" +
 
"user.role.student.estg=Estudantes ESTG\n" +
"user.role.student.esae=Estudantes ESAE\n" +
"user.role.student.esecs=Estudantes ESECS\n" +
"user.role.student.ess=Estudantes ESS\n" +
"user.role.student.estg=Estudantes ESTG\n" +
"user.role.student.esae=Estudantes ESAE\n" +
"user.role.student.esecs=Estudantes ESECS\n" +
"user.role.student.ess=Estudantes ESS\n" +
 
 
//ESAE
"user.role.school.president.asae=Escola Director da ESAE\n"+
"user.role.school.board.esae=Escola Board de Direcção da ESAE\n"+
"user.role.school.secretariado.esae=Escola Secretariado da ESAE\n"+
//CTC
"user.role.scientificCouncil.president.esae=CTC ESAE Presidente\n" +
"user.role.scientificCouncil.board.esae=CTC ESAE Membro\n" +
"user.role.scientificCouncil.secretariado.esae=CTC ESAE Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.esae=Pedagógico ESAE Presidente\n" +
"user.role.pedagogicCouncil.board.esae=Pedagógico ESAE Membro\n" +
"user.role.pedagogicCouncil.secretariado.esae=Pedagógico ESAE Secretariado\n" +
//ESAE
"user.role.school.president.asae=Escola Director da ESAE\n"+
"user.role.school.board.esae=Escola Board de Direcção da ESAE\n"+
"user.role.school.secretariado.esae=Escola Secretariado da ESAE\n"+
//CTC
"user.role.scientificCouncil.president.esae=CTC ESAE Presidente\n" +
"user.role.scientificCouncil.board.esae=CTC ESAE Membro\n" +
"user.role.scientificCouncil.secretariado.esae=CTC ESAE Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.esae=Pedagógico ESAE Presidente\n" +
"user.role.pedagogicCouncil.board.esae=Pedagógico ESAE Membro\n" +
"user.role.pedagogicCouncil.secretariado.esae=Pedagógico ESAE Secretariado\n" +
 
 
 
//ESECS
"user.role.school.president.esecs=Escola Director da ESECS\n"+
"user.role.school.board.esecs=Escola Board de Direcção da ESECS\n"+
"user.role.school.secretariado.esecs=Escola Secretariado da ESECS\n"+
//CTC
"user.role.scientificCouncil.president.esecs=CTC ESECS Presidente\n" +
"user.role.scientificCouncil.board.esecs=CTC ESECS Membro\n" +
"user.role.scientificCouncil.secretariado.esecs=CTC ESECS Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.esecs=Pedagógico ESECS Presidente\n" +
"user.role.pedagogicCouncil.board.esecs=Pedagógico ESECS Membro\n" +
"user.role.pedagogicCouncil.secretariado.esecs=Pedagógico ESECS Secretariado\n" +
//ESECS
"user.role.school.president.esecs=Escola Director da ESECS\n"+
"user.role.school.board.esecs=Escola Board de Direcção da ESECS\n"+
"user.role.school.secretariado.esecs=Escola Secretariado da ESECS\n"+
//CTC
"user.role.scientificCouncil.president.esecs=CTC ESECS Presidente\n" +
"user.role.scientificCouncil.board.esecs=CTC ESECS Membro\n" +
"user.role.scientificCouncil.secretariado.esecs=CTC ESECS Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.esecs=Pedagógico ESECS Presidente\n" +
"user.role.pedagogicCouncil.board.esecs=Pedagógico ESECS Membro\n" +
"user.role.pedagogicCouncil.secretariado.esecs=Pedagógico ESECS Secretariado\n" +
 
 
 
//ESS
"user.role.school.president.ess=Escola Director da ESS\n"+
"user.role.school.board.ess=Escola Board de Direcção da ESS\n"+
"user.role.school.secretariado.ess=Escola Secretariado da ESS\n"+
//CTC
"user.role.scientificCouncil.president.ess=CTC ESS Presidente\n" +
"user.role.scientificCouncil.board.ess=CTC ESS Membro\n" +
"user.role.scientificCouncil.secretariado.ess=CTC ESS Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.ess=Pedagógico ESS Presidente\n" +
"user.role.pedagogicCouncil.board.ess=Pedagógico ESS Membro\n" +
"user.role.pedagogicCouncil.secretariado.ess=Pedagógico ESS Secretariado\n" +
//ESS
"user.role.school.president.ess=Escola Director da ESS\n"+
"user.role.school.board.ess=Escola Board de Direcção da ESS\n"+
"user.role.school.secretariado.ess=Escola Secretariado da ESS\n"+
//CTC
"user.role.scientificCouncil.president.ess=CTC ESS Presidente\n" +
"user.role.scientificCouncil.board.ess=CTC ESS Membro\n" +
"user.role.scientificCouncil.secretariado.ess=CTC ESS Secretariado\n" +
//Pedagogico
"user.role.pedagogicCouncil.president.ess=Pedagógico ESS Presidente\n" +
"user.role.pedagogicCouncil.board.ess=Pedagógico ESS Membro\n" +
"user.role.pedagogicCouncil.secretariado.ess=Pedagógico ESS Secretariado\n" +
 
 
 
 
 
//ESCOLAS ANTIGOS NAO USAR
"user.role.board.school.estg=Board de Direcção da ESTG\n"+
"user.role.board.school.esae=Board de Direcção da ESAE\n"+
"user.role.board.school.esecs=Board de Direcção da ESECS\n"+
"user.role.board.school.ess=Board de Direcção da ESS\n"+
//ESCOLAS ANTIGOS NAO USAR
"user.role.board.school.estg=Board de Direcção da ESTG\n"+
"user.role.board.school.esae=Board de Direcção da ESAE\n"+
"user.role.board.school.esecs=Board de Direcção da ESECS\n"+
"user.role.board.school.ess=Board de Direcção da ESS\n"+
 
 
//ESAE
"user.role.department.board.agric.recurs.nat=Departamento Direção - Agricultura e Recursos Naturais\n" +
"user.role.department.board.cienc.tecnol.ani=Departamento Direção - Ciência e Tecnologia Animal\n" +
"user.role.department.diretor.agric.recurs.nat=Departamento Diretor - Agricultura e Recursos Naturais\n" +
"user.role.department.diretor.cienc.tecnol.ani=Departamento Diretor - Ciência e Tecnologia Animal\n" +
//ESECS
"user.role.department.board.comun.artes.tecn=Departamento Direção - Comunicação, Artes e Tecnologias\n" +
"user.role.department.board.educac.formac=Departamento Direção - Educação e Formação\n" +
"user.role.department.board.inter.des.soc=Departamento Direção - Intervenção e Desenvolvimento Social\n" +
"user.role.department.diretor.comun.artes.tecn=Departamento Diretor - Comunicação, Artes e Tecnologias\n" +
"user.role.department.diretor.educac.formac=Departamento Diretor - Educação e Formação\n" +
"user.role.department.diretor.inter.des.soc=Departamento Diretor - Intervenção e Desenvolvimento Social\n" +
//ESS
"user.role.department.board.cienc.tec.saude=Departamento Direção - Ciências e Tecnologias da Saúde\n" +
"user.role.department.diretor.cienc.tec.saude=Departamento Diretor - Ciências e Tecnologias da Saúde\n" +
//ESTG
"user.role.department.board.cienc.empre.sh=Departamento Direção - Ciências Empresariais, Sociais e Humanas\n" +
"user.role.department.board.tecnolo.design=Departamento Direção - Tecnologias e Design\n" +
"user.role.department.diretor.cienc.empre.sh=Departamento Diretor - Ciências Empresariais, Sociais e Humanas\n" +
"user.role.department.diretor.tecnolo.design=Departamento Diretor - Tecnologias e Design\n"
//ESAE
"user.role.department.board.agric.recurs.nat=Departamento Direção - Agricultura e Recursos Naturais\n" +
"user.role.department.board.cienc.tecnol.ani=Departamento Direção - Ciência e Tecnologia Animal\n" +
"user.role.department.diretor.agric.recurs.nat=Departamento Diretor - Agricultura e Recursos Naturais\n" +
"user.role.department.diretor.cienc.tecnol.ani=Departamento Diretor - Ciência e Tecnologia Animal\n" +
//ESECS
"user.role.department.board.comun.artes.tecn=Departamento Direção - Comunicação, Artes e Tecnologias\n" +
"user.role.department.board.educac.formac=Departamento Direção - Educação e Formação\n" +
"user.role.department.board.inter.des.soc=Departamento Direção - Intervenção e Desenvolvimento Social\n" +
"user.role.department.diretor.comun.artes.tecn=Departamento Diretor - Comunicação, Artes e Tecnologias\n" +
"user.role.department.diretor.educac.formac=Departamento Diretor - Educação e Formação\n" +
"user.role.department.diretor.inter.des.soc=Departamento Diretor - Intervenção e Desenvolvimento Social\n" +
//ESS
"user.role.department.board.cienc.tec.saude=Departamento Direção - Ciências e Tecnologias da Saúde\n" +
"user.role.department.diretor.cienc.tec.saude=Departamento Diretor - Ciências e Tecnologias da Saúde\n" +
//ESTG
"user.role.department.board.cienc.empre.sh=Departamento Direção - Ciências Empresariais, Sociais e Humanas\n" +
"user.role.department.board.tecnolo.design=Departamento Direção - Tecnologias e Design\n" +
"user.role.department.diretor.cienc.empre.sh=Departamento Diretor - Ciências Empresariais, Sociais e Humanas\n" +
"user.role.department.diretor.tecnolo.design=Departamento Diretor - Tecnologias e Design\n"
;
 
 
/branches/grupo5/impl/src/java/pt/estgp/estgweb/web/controllers/widgetmodel/CoursesServicesWidgetController.java
71,17 → 71,32
 
String code = request.getParameter("code");
String year = request.getParameter("year");
String semestre = request.getParameter("semestre");
 
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"LoadCourseUnitDtpStats",
new Object[]{code, year});
new Object[]{code, year, semestre});
return new JSONObject(json);
}
 
 
public JSONObject loadPlanYearForCourseUnitCode(ActionForm form,HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseCode = request.getParameter("courseCode");
String unitCode = request.getParameter("unitCode");
String period = request.getParameter("period");
 
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"LoadPlanYearForCourseUnitCode",
new Object[]{courseCode, unitCode, period});
return new JSONObject(json);
}
 
 
/**
* * For Json Services
* @param form
110,7 → 125,7
service2.put("parameter1","code = siges code");
service2.put("parameter2","period = \"S1,S2\"");
service2.put("parameter3","year = \"201617,201718,...\"");
service2.put("return","uma tabela em JSON com toda a informação de reusltados do pedagogico nesse ano");
service2.put("return","uma tabela em JSON com toda a informação de reusltados do pedagogico nesse ano");
 
JSONObject service3 = new JSONObject();
service3.put("service","/wsjson/api/app/ws-units-dtp-stats");
118,7 → 133,7
service3.put("parameter1","code = siges code");
service3.put("parameter2","period = \"S1,S2\"");
service3.put("parameter3","year = \"201617,201718,...\"");
service3.put("return","uma tabela em JSON com toda a informação de estatistica do preenchimento das pastas DTP");
service3.put("return","uma tabela em JSON com toda a informação de estatistica do preenchimento das pastas DTP");
 
 
JSONArray services = new JSONArray();
147,4 → 162,4
System.out.println(json);
}
*/
}
}
/branches/grupo5/impl/src/web/admin/courses/departments.jsp
56,43 → 56,62
$scope.schools = ${jsonArraySchools};
$scope.setDirty = function(department)
{
department.dirty = "true";
department.dirty = "true";
}
$scope.save = function(department)
{
var d = JSON.stringify(department);
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"updateCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
department.dirty = "false";
$scope.$apply();
}
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"updateCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
department.dirty = "false";
$scope.$apply();
}
 
);
}
 
$scope.createRoles = function(department)
{
var d = JSON.stringify(department);
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"createRolesForDeparment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
window.location.reload();
}
 
);
}
$scope.removeDepartment = function(department,$index)
{
 
var d = JSON.stringify(department);
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"removeCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
$scope.departments.splice($index,1);
$scope.$apply();
}
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"removeCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
$scope.departments.splice($index,1);
$scope.$apply();
}
 
);
}
100,15 → 119,15
{
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"newCourseDepartment",{},
".form-horizontal",
function(departmentJson)
{
departmentJson.dirty = "true";
$scope.departments.push(departmentJson);
$scope.$apply();
}
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"newCourseDepartment",{},
".form-horizontal",
function(departmentJson)
{
departmentJson.dirty = "true";
$scope.departments.push(departmentJson);
$scope.$apply();
}
 
);
}
118,12 → 137,12
 
 
 
<p><label class="label-info">Papeis dos Departamentos:</label> Os papeis de departamento são escolhidos da lista de papeis do sistema considerando-se todos os papeis com os prefixos:</p>
<p><label class="label-info">Papeis dos Departamentos:</label> Os papeis de departamento são escolhidos da lista de papeis do sistema considerando-se todos os papeis com os prefixos:</p>
<ul>
<li>department.board: para membros da direcção</li>
<li>department.diretor: para diretores direcção</li>
<li>department.board: para membros da direcção</li>
<li>department.diretor: para diretores direcção</li>
</ul>
<p>Caso seja necessário um novo papel deverá administrar os papeis institucionais dirija-se <html:link action="/user/configurationUserRoles">Aqui</html:link></p>
<p>Caso seja necessário um novo papel deverá administrar os papeis institucionais dirija-se <html:link action="/user/configurationUserRoles">Aqui</html:link></p>
<button class="btn btn-default" data-toggle="collapse" data-target=".languageNames">Mostrar Campos Multinliguisticos</button>
 
<button class="btn btn-success pull-right" ng-click="newDepartment()"><span class="glyphicon glyphicon-plus"/></button>
131,87 → 150,94
<div class="web-messages"></div>
<table class="tablesorter-blue">
<thead>
<tr>
<th>Identificador</th>
<th>Trocar Para Identificador * </th>
<th>Ativo</th>
<th>Instituição</th>
<th style="width: 30%">Nome</th>
<th>Papel para Membro da Direcao</th>
<th>Papel para Director</th>
<th></th>
<th></th>
</tr>
<tr>
<th>Identificador</th>
<th>Trocar Para Identificador * </th>
<th>Ativo</th>
<th>Instituição</th>
<th style="width: 30%">Nome</th>
<th>Papel para Membro da Direcao</th>
<th>Papel para Director</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-class="{dirty: d.dirty=='true'}" ng-repeat="d in departments | orderBy:name:false">
<td>
<div class="row">
<div class="col-md-8">
<input readonly="true" class="form-control" type="text" ng-model="d.sigla" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
<tr ng-class="{dirty: d.dirty=='true'}" ng-repeat="d in departments | orderBy:name:false">
<td>
<div class="row">
<div class="col-md-8">
<input readonly="true" class="form-control" type="text" ng-model="d.sigla" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</div>
 
</td>
<td>
<div class="row">
<div class="col-md-8">
<input class="form-control" type="text" ng-model="d.siglaNova" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</td>
<td>
<div class="row">
<div class="col-md-8">
<input class="form-control" type="text" ng-model="d.siglaNova" ng-keyup="setDirty(d)">
</div>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.active" ng-change="setDirty(d)">
<option ng-value="true" ng-selected="d.active == true">Ativo</option>
<option ng-value="false" ng-selected="d.active == false">Inativo</option>
</select>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.courseSchool.id" ng-change="setDirty(d)" ng-options="s.id as s.name for s in schools">
</select>
</td>
<td>
<input class="form-control" type="text" ng-model="d.name" ng-keyup="setDirty(d)">
<div class="languageNames collapse">
EN:<input class="form-control" type="text" ng-model="d.nameEn" ng-keyup="setDirty(d)">
ES:<input class="form-control" type="text" ng-model="d.nameEs" ng-keyup="setDirty(d)">
FR:<input class="form-control" type="text" ng-model="d.nameFr" ng-keyup="setDirty(d)">
</div>
</td>
<div class="col-md-2">*</div>
</div>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.active" ng-change="setDirty(d)">
<option ng-value="true" ng-selected="d.active == true">Ativo</option>
<option ng-value="false" ng-selected="d.active == false">Inativo</option>
</select>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.courseSchool.id" ng-change="setDirty(d)" ng-options="s.id as s.name for s in schools">
</select>
</td>
<td>
<input class="form-control" type="text" ng-model="d.name" ng-keyup="setDirty(d)">
<div class="languageNames collapse">
EN:<input class="form-control" type="text" ng-model="d.nameEn" ng-keyup="setDirty(d)">
ES:<input class="form-control" type="text" ng-model="d.nameEs" ng-keyup="setDirty(d)">
FR:<input class="form-control" type="text" ng-model="d.nameFr" ng-keyup="setDirty(d)">
</div>
</td>
 
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.boardRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesBoardDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.directorRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesDiretorDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td>
<button type="button" class="btn btn-success btn-xs" ng-click="save(d)">
<span class="glyphicon glyphicon-ok"/>
</button>
</td>
<td>
<bacoTags:confirm msg="Tem a certeza que deseja remover o departamento {{d.name}}" targetFunction="angular.element($('#departmentsModule')).scope().removeDepartment({{d}},{{$index}});angular.element($('#departmentsModule')).scope().$apply();" btnClass="btn btn-danger btn-xs" icon="glyphicon glyphicon-remove"/>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.boardRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesBoardDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.directorRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesDiretorDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td>
<button type="button" class="btn btn-success btn-xs" ng-click="save(d)">
<span class="glyphicon glyphicon-ok"/>
</button>
</td>
<td>
<bacoTags:confirm msg="Tem a certeza que deseja remover o departamento {{d.name}}" targetFunction="angular.element($('#departmentsModule')).scope().removeDepartment({{d}},{{$index}});angular.element($('#departmentsModule')).scope().$apply();" btnClass="btn btn-danger btn-xs" icon="glyphicon glyphicon-remove"/>
</td>
<td>
<button ng-if="!d.directorRole && !d.boardRole" data-toggle="tooltip" data-title="Criar Roles para este departamento" type="button" class="btn btn-success btn-xs" ng-click="createRoles(d)">
<span class="glyphicon glyphicon-user"/>
</button>
</td>
 
 
 
</tr>
</tr>
</tbody>
</table>
<p class="label label-warning">* - A sigla é o identificador do departamento, altere a sigla apenas se perceber as suas implicações. Existem Classes no sistema que dependem da sigla do departamento, a sigla tem de ser unica</p>
<h2 class="label label-warning">* - A sigla é o identificador do departamento, altere a sigla apenas se perceber as suas implicações. Existem Classes no sistema que dependem da sigla do departamento, a sigla tem de ser unica</h2>
<h2 class="label label-warning">* - A sigla apenas pode ser alterada se não houver docentes nem cursos a apontar para o departamento que pretende alterar</h2>
<%--
<model:id name="department" property="id"/>
<model:field name="department" property="name"/>
219,12 → 245,12
<model:field name="department" property="nameEs"/>
<model:field name="department" property="nameFr"/>
<model:remove name="department"/>
--%>
--%>
</div>
 
<pre>
<!--<pre>
{{departments | json}}
</pre>
</pre>-->
<%-- DEBUG
<pre>
{{departments | json}}
238,7 → 264,7
 
</div>
 
<p>* Atenção o identificador é a base dos papeis, deverá trocar também as chaves dos papeis na administração de papeis institucionais, procurando pelos papeis respectivos e alterando a sua chave para a nova sigla ou criando novos papeis</p>
<p>* Atenção o identificador é a base dos papeis, deverá trocar também as chaves dos papeis na administração de papeis institucionais, procurando pelos papeis respectivos e alterando a sua chave para a nova sigla ou criando novos papeis</p>
 
 
<%
/branches/grupo5/impl/build.xml
577,9 → 577,9
<replacefilter token="@system.wsjson.service.course.report.quest.result.api@" value="${system.wsjson.service.course.report.quest.result.api}"/>
<replacefilter token="@system.wsjson.service.course.units.reports.api@" value="${system.wsjson.service.course.units.reports.api}"/>
<replacefilter token="@system.wsjson.service.course.units.dtp.stats.api@" value="${system.wsjson.service.course.units.dtp.stats.api}"/>
<replacefilter token="@system.wsjson.service.course.unit.plan.year.api@" value="${system.wsjson.service.course.unit.plan.year.api}"/>
 
 
 
<replacefilter token="@system.intranet.url@" value="${system.intranet.url}"/>
<replacefilter token="@system.public.url@" value="${system.public.url}"/>
 
/branches/grupo7/impl/conf/WEB-INF/web.xml
89,7 → 89,8
/layout/themes,
/wsjson/api,
/wsjson/api/app/,
/auth/
/auth/,
/engSoftTeste
</param-value>
</init-param>
<init-param>
208,6 → 209,10
<!---->
<!--SERVLETS-->
 
<servlet>
<servlet-name>EngSoftware</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.TesteEngSoftServlet</servlet-class>
</servlet>
 
 
<servlet>
372,6 → 377,11
 
<!--SOAP Tutorial-->
<servlet-mapping>
<servlet-name>EngSoftware</servlet-name>
<url-pattern>/engSoftTeste</url-pattern>
</servlet-mapping>
 
<servlet-mapping>
<servlet-name>ws</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
/branches/grupo7/impl/src/java/pt/estgp/estgweb/web/controllers/SubServlet.java
New file
0,0 → 1,56
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserImpl;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
* Created by joaoe on 23/11/2017.
*/
public class SubServlet extends TesteEngSoftServlet
{
private static final Logger logger = Logger.getLogger(SubServlet.class);
 
public void primeiroMetodo(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
logger.info("OLA");
 
String name = request.getParameter("name");
String jsp = request.getParameter("jsp");
 
User u = new UserImpl();
u.setName("Joao Esteves");
 
request.setAttribute("utilizador",u);
 
if(request.getSession().getAttribute("utilizador") == null)
request.getSession().setAttribute("utilizador",u);
 
//resp.getWriter().println("<html><body><h1>OLA A TODOS</h1></body></html>");
request.getRequestDispatcher(jsp).forward(request,resp);
 
}
 
public void segundoMetodo(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
logger.info("OLA");
 
String name = request.getParameter("name");
String jsp = request.getParameter("jsp");
 
User u = new UserImpl();
u.setName("Joao Esteves" + jsp);
 
request.setAttribute("utilizador",u);
 
if(request.getSession().getAttribute("utilizador") == null)
request.getSession().setAttribute("utilizador",u);
 
//resp.getWriter().println("<html><body><h1>OLA A TODOS</h1></body></html>");
request.getRequestDispatcher(jsp).forward(request,resp);
}
 
}
/branches/grupo7/impl/src/java/pt/estgp/estgweb/web/controllers/TesteEngSoftServlet.java
New file
0,0 → 1,44
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserImpl;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
 
/**
* Created by joaoe on 23/11/2017.
*/
public class TesteEngSoftServlet extends HttpServlet
{
public static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
 
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String op = req.getParameter("op");
 
try{
this.getClass()
.getMethod(op, new Class[]{HttpServletRequest.class,HttpServletResponse.class})
.invoke(this, req, resp);
 
}catch(NoSuchMethodException e)
 
{
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
}
}
/branches/grupo7/impl/src/web/ola.jsp
New file
0,0 → 1,44
<%@ page import="pt.estgp.estgweb.domain.User" %>
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %>
<%--
Created by IntelliJ IDEA.
User: joaoe
Date: 23/11/2017
Time: 11:11
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<jsp:useBean id="utilizador" type="pt.estgp.estgweb.domain.User" scope="request"/>
<body>
<h1>YUPPPP</h1>
 
<%
User u = (User) request.getAttribute("utilizador");
User uSess = (User) request.getSession().getAttribute("utilizador");
 
AbstractDao.getCurrentSession().beginTransaction();
 
User loaded = DaoFactory.getUserDaoImpl().loadByUsername(u.getName());
request.setAttribute("loaded",loaded);
%>
<jsp:useBean id="loaded" type="pt.estgp.estgweb.domain.User" scope="request"/>
 
 
u:
<%=u.getName()%>
<br>
${utilizador.name}
<br>
uSess:
<%uSess.getName();%>
<br>
</body>
</html>
<%
AbstractDao.getCurrentSession().beginTransaction().commit();
%>
/branches/v3ComRoadMap/impl/conf/WEB-INF/struts-config.xml
New file
0,0 → 1,12
<?xml version="1.0" encoding="UTF-8"?>
 
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
 
<struts-config>
<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property value="/WEB-INF/tiles-defs.xml" property="definitions-config"/>
</plug-in>
</struts-config>
/branches/v3ComRoadMap/impl/conf/WEB-INF/tiles-defs.xml
New file
0,0 → 1,9
<?xml version="1.0" encoding="UTF-8" ?>
 
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
"http://struts.apache.org/dtds/tiles-config_1_1.dtd">
 
<tiles-definitions>
<definition name="example"/>
</tiles-definitions>
/branches/v3ComRoadMap/impl/conf/app.properties
8,6 → 8,7
##Em testes colocar true
test.control.var=@test.control.var@
 
 
import.year=201516
tmp.dir=@tmp.dir@
data.dir=@data.dir@
/branches/grupo1/impl/conf/WEB-INF/web.xml
89,7 → 89,8
/layout/themes,
/wsjson/api,
/wsjson/api/app/,
/auth/
/auth/,
/engSoftTeste
</param-value>
</init-param>
<init-param>
209,6 → 210,10
<!--SERVLETS-->
 
 
<servlet>
<servlet-name>TesteEngSoft</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.SubServlet</servlet-class>
</servlet>
 
<servlet>
<servlet-name>WsJson</servlet-name>
372,6 → 377,11
 
<!--SOAP Tutorial-->
<servlet-mapping>
<servlet-name>TesteEngSoft</servlet-name>
<url-pattern>/testeEngSoft/*</url-pattern>
</servlet-mapping>
 
<servlet-mapping>
<servlet-name>ws</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
/branches/grupo1/impl/src/java/pt/estgp/estgweb/web/controllers/SubServlet.java
New file
0,0 → 1,50
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserImpl;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class SubServlet extends TesteEngSoftServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
public void primeiroMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("primeiroMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
 
public void segundoMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("segundoMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
}
/branches/grupo1/impl/src/java/pt/estgp/estgweb/web/controllers/TesteEngSoftServlet.java
New file
0,0 → 1,37
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
 
public class TesteEngSoftServlet extends HttpServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
 
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String op = req.getParameter("dispatch");
 
try {
this.getClass()
.getMethod(op, new Class[]{HttpServletRequest.class, HttpServletResponse.class})
.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
 
}
}
/branches/grupo1/impl/src/web/ola.jsp
New file
0,0 → 1,41
<%@ page import="pt.estgp.estgweb.domain.User" %>
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %><%--
Created by IntelliJ IDEA.
User: daniel
Date: 23/11/2017
Time: 11:09
 
http://localhost:8080/baco/testeEngSoft/?name=super&jsp=/ola.jsp&dispatch=primeiroMetodo
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<jsp:useBean id="user" type="pt.estgp.estgweb.domain.User" scope="request"/>
<body>
<h1>Hello JSP</h1>
<%
User u = (User) request.getAttribute("user");
User uSess = (User) request.getSession().getAttribute("user");
 
AbstractDao.getCurrentSession().beginTransaction();
User loaded = DaoFactory.getUserDaoImpl().loadByUsername(u.getName());
request.setAttribute("loaded", loaded);
 
%>
u:
<%=u.getName()%>
<br>
u:
${loaded.superuser}
<br>
uSess:
<%=uSess.getName()%>
 
</body>
</html>
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
/branches/grupo2/impl/conf/WEB-INF/web.xml
89,7 → 89,8
/layout/themes,
/wsjson/api,
/wsjson/api/app/,
/auth/
/auth/,
/testeEngSoft
</param-value>
</init-param>
<init-param>
208,8 → 209,11
<!---->
<!--SERVLETS-->
 
<servlet>
<servlet-name>TesteEngSoft</servlet-name>
<servlet-class>pt.estgp.estgweb.web.controllers.SubServlet</servlet-class>
</servlet>
 
 
<servlet>
<servlet-name>WsJson</servlet-name>
<servlet-class>pt.estgp.estgweb.web.json.JsonHandler</servlet-class>
370,6 → 374,11
 
<!--MAPPINGS-->
 
<servlet-mapping>
<servlet-name>TesteEngSoft</servlet-name>
<url-pattern>/testeEngSoft/*</url-pattern>
</servlet-mapping>
 
<!--SOAP Tutorial-->
<servlet-mapping>
<servlet-name>ws</servlet-name>
/branches/grupo2/impl/src/java/pt/estgp/estgweb/web/controllers/SubServlet.java
New file
0,0 → 1,50
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
import pt.estgp.estgweb.domain.User;
import pt.estgp.estgweb.domain.UserImpl;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
public class SubServlet extends TesteEngSoftServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
public void primeiroMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("primeiroMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
 
public void segundoMetodo(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("segundoMetodo");
 
String name = req.getParameter("name");
String jsp = req.getParameter("jsp");
 
User u = new UserImpl();
u.setName(name);
 
req.setAttribute("user", u);
if (req.getSession().getAttribute("user") == null) {
req.getSession().setAttribute("user", u);
}
 
//resp.getWriter().println("<html><body><h1>Hello</h1></body></html>");
req.getRequestDispatcher(jsp).forward(req, resp);
}
}
/branches/grupo2/impl/src/java/pt/estgp/estgweb/web/controllers/TesteEngSoftServlet.java
New file
0,0 → 1,37
package pt.estgp.estgweb.web.controllers;
 
import org.apache.log4j.Logger;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
 
public class TesteEngSoftServlet extends HttpServlet {
private static final Logger logger = Logger.getLogger(TesteEngSoftServlet.class);
 
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
 
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String op = req.getParameter("dispatch");
 
try {
this.getClass()
.getMethod(op, new Class[]{HttpServletRequest.class, HttpServletResponse.class})
.invoke(this, req, resp);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
 
}
}
/branches/grupo2/impl/src/web/admin/courses/departments.jsp
42,229 → 42,229
 
<div class="container-fluid">
 
<div id="departmentsModule"
ng-app="departmentsModule"
ng-controller="departmentsModuleController">
<div id="departmentsModule"
ng-app="departmentsModule"
ng-controller="departmentsModuleController">
 
<script>
//DECLARACAO DA APLICACAO LOCAL EM ANGULAR
var departmentsModule = angular.module('departmentsModule', []);
GLOBAL_BacoAngularAppDependencies.push('departmentsModule');
<script>
//DECLARACAO DA APLICACAO LOCAL EM ANGULAR
var departmentsModule = angular.module('departmentsModule', []);
GLOBAL_BacoAngularAppDependencies.push('departmentsModule');
 
departmentsModule.controller('departmentsModuleController', function($scope) {
$scope.departments = ${jsonArrayDepartments};
$scope.schools = ${jsonArraySchools};
$scope.setDirty = function(department)
{
department.dirty = "true";
}
$scope.save = function(department)
{
var d = JSON.stringify(department);
departmentsModule.controller('departmentsModuleController', function($scope) {
$scope.departments = ${jsonArrayDepartments};
$scope.schools = ${jsonArraySchools};
$scope.setDirty = function(department)
{
department.dirty = "true";
}
$scope.save = function(department)
{
var d = JSON.stringify(department);
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"updateCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
department.dirty = "false";
$scope.$apply();
}
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"updateCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
department.dirty = "false";
$scope.$apply();
}
 
);
}
);
}
 
$scope.createRoles = function(department)
{
var d = JSON.stringify(department);
$scope.createRoles = function(department)
{
var d = JSON.stringify(department);
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"createRolesForDeparment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
window.location.reload();
}
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"createRolesForDeparment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
window.location.reload();
}
 
);
}
$scope.removeDepartment = function(department,$index)
{
);
}
$scope.removeDepartment = function(department,$index)
{
 
var d = JSON.stringify(department);
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"removeCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
$scope.departments.splice($index,1);
$scope.$apply();
}
var d = JSON.stringify(department);
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"removeCourseDepartment",
{
"courseDepartmentJson" : d
},
".form-horizontal",
function(departmentJson)
{
$scope.departments.splice($index,1);
$scope.$apply();
}
 
);
}
$scope.newDepartment = function()
{
);
}
$scope.newDepartment = function()
{
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"newCourseDepartment",{},
".form-horizontal",
function(departmentJson)
{
departmentJson.dirty = "true";
$scope.departments.push(departmentJson);
$scope.$apply();
}
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/admin/adminDepartment.do",
"newCourseDepartment",{},
".form-horizontal",
function(departmentJson)
{
departmentJson.dirty = "true";
$scope.departments.push(departmentJson);
$scope.$apply();
}
 
);
}
);
}
 
});
</script>
});
</script>
 
 
 
<p><label class="label-info">Papeis dos Departamentos:</label> Os papeis de departamento são escolhidos da lista de papeis do sistema considerando-se todos os papeis com os prefixos:</p>
<ul>
<li>department.board: para membros da direcção</li>
<li>department.diretor: para diretores direcção</li>
</ul>
<p>Caso seja necessário um novo papel deverá administrar os papeis institucionais dirija-se <html:link action="/user/configurationUserRoles">Aqui</html:link></p>
<button class="btn btn-default" data-toggle="collapse" data-target=".languageNames">Mostrar Campos Multinliguisticos</button>
<p><label class="label-info">Papeis dos Departamentos:</label> Os papeis de departamento são escolhidos da lista de papeis do sistema considerando-se todos os papeis com os prefixos:</p>
<ul>
<li>department.board: para membros da direcção</li>
<li>department.diretor: para diretores direcção</li>
</ul>
<p>Caso seja necessário um novo papel deverá administrar os papeis institucionais dirija-se <html:link action="/user/configurationUserRoles">Aqui</html:link></p>
<button class="btn btn-default" data-toggle="collapse" data-target=".languageNames">Mostrar Campos Multinliguisticos</button>
 
<button class="btn btn-success pull-right" ng-click="newDepartment()"><span class="glyphicon glyphicon-plus"/></button>
<div class="form-horizontal">
<div class="web-messages"></div>
<table class="tablesorter-blue">
<thead>
<tr>
<th>Identificador</th>
<th>Trocar Para Identificador * </th>
<th>Ativo</th>
<th>Instituição</th>
<th style="width: 30%">Nome</th>
<th>Papel para Membro da Direcao</th>
<th>Papel para Director</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-class="{dirty: d.dirty=='true'}" ng-repeat="d in departments | orderBy:name:false">
<td>
<div class="row">
<div class="col-md-8">
<input readonly="true" class="form-control" type="text" ng-model="d.sigla" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</div>
<button class="btn btn-success pull-right" ng-click="newDepartment()"><span class="glyphicon glyphicon-plus"/></button>
<div class="form-horizontal">
<div class="web-messages"></div>
<table class="tablesorter-blue">
<thead>
<tr>
<th>Identificador</th>
<th>Trocar Para Identificador * </th>
<th>Ativo</th>
<th>Instituição</th>
<th style="width: 30%">Nome</th>
<th>Papel para Membro da Direcao</th>
<th>Papel para Director</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr ng-class="{dirty: d.dirty=='true'}" ng-repeat="d in departments | orderBy:name:false">
<td>
<div class="row">
<div class="col-md-8">
<input readonly="true" class="form-control" type="text" ng-model="d.sigla" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</div>
 
</td>
<td>
<div class="row">
<div class="col-md-8">
<input class="form-control" type="text" ng-model="d.siglaNova" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</div>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.active" ng-change="setDirty(d)">
<option ng-value="true" ng-selected="d.active == true">Ativo</option>
<option ng-value="false" ng-selected="d.active == false">Inativo</option>
</select>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.courseSchool.id" ng-change="setDirty(d)" ng-options="s.id as s.name for s in schools">
</select>
</td>
<td>
<input class="form-control" type="text" ng-model="d.name" ng-keyup="setDirty(d)">
<div class="languageNames collapse">
EN:<input class="form-control" type="text" ng-model="d.nameEn" ng-keyup="setDirty(d)">
ES:<input class="form-control" type="text" ng-model="d.nameEs" ng-keyup="setDirty(d)">
FR:<input class="form-control" type="text" ng-model="d.nameFr" ng-keyup="setDirty(d)">
</div>
</td>
</td>
<td>
<div class="row">
<div class="col-md-8">
<input class="form-control" type="text" ng-model="d.siglaNova" ng-keyup="setDirty(d)">
</div>
<div class="col-md-2">*</div>
</div>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.active" ng-change="setDirty(d)">
<option ng-value="true" ng-selected="d.active == true">Ativo</option>
<option ng-value="false" ng-selected="d.active == false">Inativo</option>
</select>
</td>
<td>
<select class="chosenOff form-control" ng-model="d.courseSchool.id" ng-change="setDirty(d)" ng-options="s.id as s.name for s in schools">
</select>
</td>
<td>
<input class="form-control" type="text" ng-model="d.name" ng-keyup="setDirty(d)">
<div class="languageNames collapse">
EN:<input class="form-control" type="text" ng-model="d.nameEn" ng-keyup="setDirty(d)">
ES:<input class="form-control" type="text" ng-model="d.nameEs" ng-keyup="setDirty(d)">
FR:<input class="form-control" type="text" ng-model="d.nameFr" ng-keyup="setDirty(d)">
</div>
</td>
 
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.boardRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesBoardDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.directorRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesDiretorDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td>
<button type="button" class="btn btn-success btn-xs" ng-click="save(d)">
<span class="glyphicon glyphicon-ok"/>
</button>
</td>
<td>
<bacoTags:confirm msg="Tem a certeza que deseja remover o departamento {{d.name}}" targetFunction="angular.element($('#departmentsModule')).scope().removeDepartment({{d}},{{$index}});angular.element($('#departmentsModule')).scope().$apply();" btnClass="btn btn-danger btn-xs" icon="glyphicon glyphicon-remove"/>
</td>
<td>
<button ng-if="!d.directorRole && !d.boardRole" data-toggle="tooltip" data-title="Criar Roles para este departamento" type="button" class="btn btn-success btn-xs" ng-click="createRoles(d)">
<span class="glyphicon glyphicon-user"/>
</button>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.boardRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesBoardDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td style="font-size: 0.7em !important">
<select class="chosenOff form-control" ng-model="d.directorRole" ng-change="setDirty(d)">
<option value="">Escolha</option>
<logic:iterate id="role" name="rolesDiretorDepartamento">
<option value="${role}"><bean:message key="user.role.${role}"/></option>
</logic:iterate>
</select>
</td>
<td>
<button type="button" class="btn btn-success btn-xs" ng-click="save(d)">
<span class="glyphicon glyphicon-ok"/>
</button>
</td>
<td>
<bacoTags:confirm msg="Tem a certeza que deseja remover o departamento {{d.name}}" targetFunction="angular.element($('#departmentsModule')).scope().removeDepartment({{d}},{{$index}});angular.element($('#departmentsModule')).scope().$apply();" btnClass="btn btn-danger btn-xs" icon="glyphicon glyphicon-remove"/>
</td>
<td>
<button ng-if="!d.directorRole && !d.boardRole" data-toggle="tooltip" data-title="Criar Roles para este departamento" type="button" class="btn btn-success btn-xs" ng-click="createRoles(d)">
<span class="glyphicon glyphicon-user"/>
</button>
</td>
 
 
 
</tr>
</tbody>
</table>
<h2 class="label label-warning">* - A sigla é o identificador do departamento, altere a sigla apenas se perceber as suas implicações. Existem Classes no sistema que dependem da sigla do departamento, a sigla tem de ser unica</h2>
<h2 class="label label-warning">* - A sigla apenas pode ser alterada se não houver docentes nem cursos a apontar para o departamento que pretende alterar</h2>
<%--
<model:id name="department" property="id"/>
<model:field name="department" property="name"/>
<model:field name="department" property="nameEn"/>
<model:field name="department" property="nameEs"/>
<model:field name="department" property="nameFr"/>
<model:remove name="department"/>
--%>
</div>
</tr>
</tbody>
</table>
<h2 class="label label-warning">* - A sigla é o identificador do departamento, altere a sigla apenas se perceber as suas implicações. Existem Classes no sistema que dependem da sigla do departamento, a sigla tem de ser unica</h2>
<h2 class="label label-warning">* - A sigla apenas pode ser alterada se não houver docentes nem cursos a apontar para o departamento que pretende alterar</h2>
<%--
<model:id name="department" property="id"/>
<model:field name="department" property="name"/>
<model:field name="department" property="nameEn"/>
<model:field name="department" property="nameEs"/>
<model:field name="department" property="nameFr"/>
<model:remove name="department"/>
--%>
</div>
 
<!--<pre>
{{departments | json}}
</pre>-->
<%-- DEBUG
<pre>
{{departments | json}}
</pre>
<pre>
{{schools | json}}
</pre>
--%>
</div>
<!--<pre>
{{departments | json}}
</pre>-->
<%-- DEBUG
<pre>
{{departments | json}}
</pre>
<pre>
{{schools | json}}
</pre>
--%>
</div>
 
 
</div>
 
<p>* Atenção o identificador é a base dos papeis, deverá trocar também as chaves dos papeis na administração de papeis institucionais, procurando pelos papeis respectivos e alterando a sua chave para a nova sigla ou criando novos papeis</p>
<p>* Atenção o identificador é a base dos papeis, deverá trocar também as chaves dos papeis na administração de papeis institucionais, procurando pelos papeis respectivos e alterando a sua chave para a nova sigla ou criando novos papeis</p>
 
 
<%
/branches/grupo2/impl/src/web/hello.jsp
New file
0,0 → 1,41
<%@ page import="pt.estgp.estgweb.domain.User" %>
<%@ page import="jomm.dao.impl.AbstractDao" %>
<%@ page import="pt.estgp.estgweb.domain.dao.DaoFactory" %><%--
Created by IntelliJ IDEA.
User: daniel
Date: 23/11/2017
Time: 11:09
 
http://localhost:8080/baco/testeEngSoft/?name=super&jsp=/hello.jsp&dispatch=primeiroMetodo
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<jsp:useBean id="user" type="pt.estgp.estgweb.domain.User" scope="request"/>
<body>
<h1>Hello JSP</h1>
<%
User u = (User) request.getAttribute("user");
User uSess = (User) request.getSession().getAttribute("user");
 
AbstractDao.getCurrentSession().beginTransaction();
User loaded = DaoFactory.getUserDaoImpl().loadByUsername(u.getName());
request.setAttribute("loaded", loaded);
 
%>
u:
<%=u.getName()%>
<br>
u:
${loaded.superuser}
<br>
uSess:
<%=uSess.getName()%>
 
</body>
</html>
<%
AbstractDao.getCurrentSession().getTransaction().commit();
%>
/branches/grupo2/impl/src/web/examples/angular/directives/angular-directive.jsp
New file
0,0 → 1,95
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="bacoTags" tagdir="/WEB-INF/tags" %>
<%@ taglib prefix="logic" uri="/WEB-INF/tlds/struts-logic.tld" %>
<html>
<head></head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
<h1>Uso de Directivas com Templates</h1>
<p>Este exemplo mostra como deve ser usada uma template para podermos incluir uma função
de controlo especifica da template usando directivas</p>
<p>Mostra ainda que dentro da template o scope é uma fusão dos scopes da ngApp e da propria directiva</p>
<p>Mostra também como podemos escolher dinamicamente a template ou as funcionalidades dependendo de atributos que passamos à template</p>
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
//demoApp..directive('tpl', function() {
//ou
angular.module('demoApp').directive('tpl', function() {
 
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
 
 
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2";
scope.testeSuper = "testeSuper2";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return attrs.templatename;
}
}
});
 
 
demoApp.controller('demoAppController', function ($scope) {
 
 
$scope.testeSuper = "testeSuper";
 
}
);
 
</script>
 
<p>campo testeSuper no mainmodule {{testeSuper}}</p>
 
<p>Se incluirmos o tpl2.html apenas vamos ter acesso às variaveis do scope da aplicação, neste caso o teste, a template pode estar declarada fora da app, não há problema</p>
<p>Por acaso neste exemplo temos acesso ao testeSuper porque a directiva adiciona funcionalidade ao scope da aplicação onde é chamada, mas se não chamarmos nenhuma directiva
a var testeSuper não aparece</p>
<div ng-include="'tpl2.html'"></div>
 
 
<h2>Invocando a tpl de html com directiva</h2>
<tpl templatename="tpl.html"></tpl>
 
<h2>Invocando a tpl de de javascript com directiva</h2>
<tpl templatename="tpl2.html"></tpl>
 
 
 
 
 
 
</div>
 
 
 
<!--TEMPLATE RECURSIVO-->
<script type="text/ng-template" id="tpl2.html">
<div>
<h1>Usando um template de Script</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
</div>
</script>
</body>
</html>
/branches/grupo2/impl/src/web/examples/angular/directives/tpl.html
New file
0,0 → 1,5
<h1>Template de HTML</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<button ng-click="move()">Muda Textos</button>
/branches/grupo2/impl/src/web/examples/angular/directives/angular-directive-module.jsp
New file
0,0 → 1,36
<%--
Created by IntelliJ IDEA.
User: jorgemachado
Date: 11/11/17
Time: 10:20
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body ng-app="BacoAngularApp">
<jsp:include page="/layout/themes/scripts-default.jsp"/>
<jsp:include page="/layout/headerTools.jsp"/>
 
<div class="container">
<h1>Uso de Templates Generalizados e cada um com sua template</h1>
<p>O caso em questão é a existencia de um esqueleto principal para um modulo (mainmodule)</p>
<p>O main module inclui templates para cada componente usando o ng-include</p>
<p>Esse ng-include é referente ao campo @class de cada componente</p>
<p>vamos incluir esse esqueleto e todas as templates especificas dos nossos modulos</p>
<p>incluimos ainda as directivas que estiverem nos nossos modulos</p>
<p>o template do ng-include irá colocar a directiva desejada caso seja necessário</p>
<p>com a directiva podemos ter funcionalidade de scope associada ao subcomponente, que é desconhecido do main module</p>
<p>caso necessite o includemodule também tem acesso ao scope da app principal</p>
<p>o unico requesito é passar ao include module o nome da app onde ele vai inserir as directivas</p>
 
 
 
<jsp:include page="angular-directive-mainmodule.jsp"/>
<jsp:include page="angular-directive-includemodule.jsp"/>
 
</div>
</body>
</html>
/branches/grupo2/impl/src/web/examples/angular/directives/angular-directive-includemodule.jsp
New file
0,0 → 1,60
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<p>Modulo Incluido contem as directivas e os templates necessários</p>
<p>Este módulo conhece o nome do módulo da App onde vai ser incluido</p>
 
<script>
angular.module("demoApp").directive('tpl', function() {
var contentUrl;
return {
restrict: 'E', //A ou E define se é o nome do elemento ou um atributo
link: function(scope, element, attrs) {
// concatenating the directory to the ver attr to select the correct excerpt for the day
//contentUrl = attrs.templatename + '.html';
 
//console.log(contentUrl);
 
scope.teste = "teste";
scope.move = function(){
 
scope.teste = "teste2modules";
//scope.testeSuper = "testeSuper2modules";
angular.element("#demoApp").scope().testeSuper = "testeSuper2modules";
}
scope.mudaCompName = function(comp){
 
comp.name = "NOVO NOME DO COMP MUDADO NA DIRECTIVA";
}
},
// passing in contentUrl variable
templateUrl: function(elem,attrs) {
return "templateDirectiva";
}
}
});
</script>
 
<script type="text/ng-template" id="directive_class">
<div style="border: 1px solid #000000">
<h1>DIRECTIVE CLASS TEMPLATE</h1>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<p><input type="text" ng-model="comp.name"></p>
<tpl></tpl>
<p>Teste no scope da directiva<p>
<pre>
{{teste | json}}
</pre>
</div>
</script>
 
<script type="text/ng-template" id="templateDirectiva">
<div style="border: 1px solid green">
<h1>templateDirectiva</h1>
<p>TESTE</p>
<p>{{teste}}</p>
<p>{{testeSuper}}</p>
<p>COMP ELEMENTO DIRECTIVA:{{comp.name}}</p>
<button ng-click="move()">Muda Textos</button>
<button ng-click="mudaCompName(comp)">Muda COMP NAME</button>
</div>
</script>
/branches/grupo2/impl/src/web/examples/angular/directives/angular-directive-mainmodule.jsp
New file
0,0 → 1,50
 
 
<div id="demoApp" ng-app="demoApp" ng-controller="demoAppController">
 
 
 
<script>
 
var demoApp = angular.module('demoApp', []);
GLOBAL_BacoAngularAppDependencies.push('demoApp');
 
 
demoApp.controller('demoAppController', function ($scope) {
 
$scope.testeSuper = "testeSuper";
 
$scope.data =
{
comps : [
{
"@class" : "directive_class",
"name" : "componente de teste"
}
]
}
 
}
);
 
</script>
 
 
<h1>Campo testeSuper no mainmodule "{{testeSuper}}"</h1>
<h1>Campo data.comps[0].name no mainmodule "{{data.comps[0].name}}"</h1>
 
<h2>Template chamado atraves de um template de classe intermedio</h2>
<div ng-repeat="comp in data.comps" ng-include="comp['@class']">
 
</div>
 
 
<pre>
{{testeSuper | json}}
</pre>
<pre>
{{data | json}}
</pre>
 
 
</div>
/branches/grupo2/impl/src/web/user/courses/coursereport/templates.jsp
New file
0,0 → 1,694
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultYear" %>
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultSemester" %>
<%@ page
import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.UnitsLearningResultUc" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<!--
@section objeto com seccoes e componentes
@optional @chapter capitulo do documento para esta seccao para contcatenar às subsections
-->
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_CourseUnitsReportsSection">
<div class="sections">
<a name="indexCus"></a>
<span ng-repeat="cu in section.sections" ng-init="cu.taxaAprovacao = 100 * cu.courseUnitEvaluation.numAlunosAprovTotal/(cu.courseUnitEvaluation.numAlunosInscritos - cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao)">
<a href="#cu{{$index}}" ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) || cu.taxaAprovacao &lt; 75 || !cu.courseUnitEvaluation.closed || !cu.courseUnitEvaluation.teacherComplete}">
{{cu.title}}
</a> |
</span>
<div ng-repeat="cu in section.sections"
class="section panel-primary">
 
<a name="cu{{$index}}"></a>
<span ng-if="$index != 0" class="glyphicon glyphicon-backward" ></span><a ng-if="$index != 0" href="#indexCus"> Voltar atrás</a>
<div class="panel-heading"><h2>{{cu.title}}</h2></div>
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Estado do Relatório</label></h3></div>
 
<div ng-if="cu.courseUnitEvaluation.closed">
Entregue e Aceite
</div>
<div class="alert-danger" ng-if="cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Entregue mas não foi aprovado pela comissão
</div>
<div class="alert-danger" ng-if="!cu.courseUnitEvaluation.closed && !cu.courseUnitEvaluation.teacherComplete">
Não foi entregue pelo docente para validação
</div>
 
</div>
 
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Resultados</label></h3></div>
<div>
<table class="tablesorter-blue" width="100%">
<tr>
<th rowspan="2">
Nº Alunos Inscritos
</th>
<th rowspan="2">
Nº de alunos sem elementos de avaliação
</th>
<th colspan="5">
Nº de alunos aprovados em
</th>
<th colspan="2">
Aprovados com a classificação entre 10 e 13 valores
</th>
<th colspan="2">
Aprovados com a classificação entre 14 e 16 valores
</th>
<th colspan="2">
Aprovados com a classificação entre 17 e 20 valores
</th>
</tr>
<tr>
<th>Avaliação de frequência</th>
<th>Exame Época Normal</th>
<th>Exame Época Recurso</th>
<th>Exame Época Especial</th>
<th>Total</th>
<th>Nº</th>
<th>%</th>
<th>Nº</th>
<th>%</th>
<th>Nº</th>
<th>%</th>
</tr>
<tr>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosInscritos}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosSemElementosAvaliacao}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovFrequencia}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovNormal}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovRecurso}}
</td>
<td style="text-align: center">
{{cu.courseUnitEvaluation.numAlunosAprovEspecial}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprovTotal}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1013}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1013Percent}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1416}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1416Percent}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1720}}
</td>
<td class="text-center">
{{cu.courseUnitEvaluation.numAlunosAprov1720Percent}}
</td>
</tr>
</table>
</div>
</div>
 
<div style="padding-left:20px" >
<div><h3><label class="label label-primary">Taxa de Aprovação</label></h3></div>
<div ng-class="{ 'alert-danger': cu.taxaAprovacao &lt; 75 }">{{cu.taxaAprovacao}}%</div>
</div>
 
 
 
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação dos resultados quantitativos obtidos pelos estudantes</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoQuantitivos}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação do funcionamento da UC</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoUC}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Percentagem de cumprimento do programa da UC</label></h3></div>
<div ng-class="{ 'alert-danger': (cu.courseUnitEvaluation.cumprimentoProgramaPercent &lt; 100) }">
{{cu.courseUnitEvaluation.cumprimentoProgramaPercent}}%
</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Apreciação do cumprimento do programa da UC</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualApreciacaoCumprimentoPrograma}}</div>
</div>
<div style="padding-left:20px">
<div><h3><label class="label label-primary">Conclusões</label></h3></div>
<div>{{cu.courseUnitEvaluation.qualConclusoes}}</div>
</div>
</div>
</div>
</script>
 
 
 
<style>
.dtpstats td, .dtpstats th{
text-align: center !important;
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_reportucsummary_UnitsDtpTable">
<div class="sections">
 
<table class="table dtpstats">
<thead>
<tr>
<th rowspan="2">Unidade Curricular</th>
<th colspan="2">Planeamento</th>
<th rowspan="2">Ficha Curricular</th>
<th rowspan="2">Sumários</th>
<th colspan="2">Avaliação</th>
<th rowspan="2">Relatório de Avaliação</th>
<th rowspan="2">Inquerito Pedagógico</th>
</tr>
<tr>
<th>Conteúdos</th>
<th>Calendarização</th>
<th>Enunciados</th>
<th>Pautas</th>
</tr>
</thead>
<tbody>
<tr>
<th colspan="9">Semestre 1</th>
</tr>
<tr ng-repeat="dtpStat in comp.semester1.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
</tr>
<tr>
<th colspan="9">Semestre 2</th>
</tr>
<tr ng-repeat="dtpStat in comp.semester2.courseUnitDtpStats">
<td>{{dtpStat.name}}</td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoConteudos }"><input type="checkbox" ng-model="dtpStat.planeamentoConteudos"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.planeamentoCalendarizacao }"><input type="checkbox" ng-model="dtpStat.planeamentoCalendarizacao"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.ficha }"><input type="checkbox" ng-model="dtpStat.ficha"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.sumarios }"><input type="checkbox" ng-model="dtpStat.sumarios"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoEnunciados }"><input type="checkbox" ng-model="dtpStat.avaliacaoEnunciados"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.avaliacaoPautas }"><input type="checkbox" ng-model="dtpStat.avaliacaoPautas"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.relatorio }"><input type="checkbox" ng-model="dtpStat.relatorio"/></td>
<td ng-class="{ 'alert-danger' : !dtpStat.inquerito }"><input type="checkbox" ng-model="dtpStat.inquerito"/></td>
</tr>
</tbody>
</table>
</div>
</script>
 
 
 
<style>
.learning td
{
font-size: 0.7em;
}
.learning td input{
width: 50px;
}
 
.learning td input:read-only{
width: 50px;
background-color: #cccccc;
}
.learning tr.year td {
vertical-align: top;
background-color: #aaaaaa;
 
font-weight: bold;
}
.learning tr.period td {
vertical-align: top;
background-color: #dfdfdf;
 
}
</style>
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_UnitsLearningResultsTable">
<unitslearningresultstable>
</unitslearningresultstable>
</script>
 
 
 
<script>
angular.module("courseReportApp").directive('boundModel', function() {
return {
require: 'ngModel',
link: function(scope, elem, attrs, ngModel) {
scope.$watch(attrs.boundModel, function(newValue, oldValue) {
if(newValue != oldValue) {
ngModel.$setViewValue(newValue);
ngModel.$render();
}
});
}
}
});
angular.module("courseReportApp").directive('unitslearningresultstable', function() {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
 
$scope.checkedDocuments = [];
$scope.checkUnit = function(document,collection)
{
if(document.checked)
{
var docContainer =
{
"document" : document,
"collection" : collection
}
$scope.checkedDocuments.push(docContainer);
}
else
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
if(documentContainer.document == document)
{
var index = $scope.checkedDocuments.indexOf(documentContainer);
$scope.checkedDocuments.splice(index, 1);
}
});
}
}
$scope.changeDocumentCollection = function(collection)
{
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
collection.ucs.push(documentContainer.document);
delete documentContainer.document.checked;
});
angular.forEach($scope.checkedDocuments, function(documentContainer, key)
{
var index = documentContainer.collection.ucs.indexOf(documentContainer.document);
documentContainer.collection.ucs.splice(index, 1);
});
$scope.checkedDocuments = [];
}
$scope.avg = function(field,container, childs)
{
if(!childs || childs.length == 0)
return 0;
var sum = 0;
var c;
for(c in childs)
{
if(childs[c] && childs[c][field])
sum += 1*childs[c][field];
}
container[field] = sum / childs.length;
return container[field];
}
$scope.percent = function(n,total)
{
if(!n || n == 0 || !total || total == 0)
return 0;
return 100 * n / total;
}
$scope.reprovados = function(comp)
{
if(comp.alunosInscritos && comp.semElementos && comp.aprovados)
return comp.alunosInscritos - comp.semElementos - comp.aprovados;
return 0;
}
$scope.removeComponent = function(index,list)
{
list.splice(index,1);
}
$scope.hasYearUnits = function(year)
{
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
return false;
}
$scope.isInvalidAnfHaveUcs = function(year,years,index)
{
if(year.ano > 0)
return false;
 
var s;
for(s in year.semesters)
{
if(year.semesters[s].ucs && year.semesters[s].ucs.length > 0)
return true;
}
years.splice(index,1);
return false;
}
$scope.addUc = function(semestre)
{
semestre.ucs.push(
{
"@class" : "<%=UnitsLearningResultUc.class.getName()%>",
manual : true,
periodo : semestre.semestre,
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
sigesCode : 0
}
);
}
$scope.addAno = function(comp)
{
if(!comp.years)
comp.years = [];
comp.years.push(
{
ano : 1,
"@class" : "<%=UnitsLearningResultYear.class.getName()%>",
manual : true,
"alunosInscritos": 0,
"aprovados": 0,
"aprovados1013": 0,
"aprovados1013Percent": 0,
"aprovados1416": 0,
"aprovados1416Percent": 0,
"aprovados1720": 0,
"aprovados1720Percent": 0,
"aprovadosPercent": 0,
"cumprimentoProgramaPercent": 0,
"reprovados": 0,
"reprovadosPercent": 0,
"semElementos": 0,
"semElementosPercent": 0,
semesters : [
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
semestre : "S1",
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
},
{
"@class" : "<%=UnitsLearningResultSemester.class.getName()%>",
manual : true,
semestre: "S2",
alunosInscritos: 0,
aprovados: 0,
aprovados1013: 0,
aprovados1013Percent: 0,
aprovados1416: 0,
aprovados1416Percent: 0,
aprovados1720: 0,
aprovados1720Percent: 0,
aprovadosPercent: 0,
cumprimentoProgramaPercent: 0,
reprovados: 0,
reprovadosPercent: 0,
semElementos: 0,
semElementosPercent: 0,
ucs : []
}
]
}
);
}
 
},
templateUrl: function(elem,attrs) {
return "unitslearningresultstable";
}
}
});
</script>
<script type="text/ng-template" id="unitslearningresultstable">
 
 
<div class="sections">
<button class="btn btn-success" ng-click="addAno(comp)"><span class="glyphicon glyphicon-plus"></span> Ano Manual</button>
<table class="table learning">
<thead>
<tr>
<th rowspan="2">Mover</th>
<th rowspan="2">Código</th>
<th rowspan="2">Unidade Curricular</th>
<th rowspan="2">Cumprimento do Programa</th>
<th rowspan="2">Alunos Inscritos</th>
<th colspan="2">Sem Elementos</th>
<th colspan="2">Reprovados</th>
<th colspan="2">Aprovados</th>
<th colspan="2">Aprovados 10-13</th>
<th colspan="2">Aprovados 14-16</th>
<th colspan="2">Aprovados 17-20</th>
</tr>
<tr>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
<th>N</th>
<th>%</th>
</tr>
</thead>
<tbody>
<tr colspan="17" ng-if="false" ng-repeat-start="year in comp.years"></tr>
<tr class="year">
<td colspan="3" ng-if="year.ano &gt; 0">
 
<button ng-disabled="hasYearUnits(year)" class="btn btn-danger btn-xs" ng-click="removeComponent($index,comp.years)"><span class="glyphicon glyphicon-remove"></span></button>
<span ng-if="!year.manual">{{year.ano}}ª ano</span>
<span ng-if="year.manual">
<select ng-model="year.ano" ng-options="c.v as c.n for c in [{v:1,n:'1º Ano'},{v:2,n:'2º Ano'},{v:3,n:'3º Ano'},{v:4,n:'4º Ano'},{v:5,n:'5º Ano'}]">
</select>
</span>
 
</td>
<td colspan="3" style="font-size: 1.0em !important" ng-if="isInvalidAnfHaveUcs(year,comp.years,$index)">
Unidades que não constam do plano (Verifique a situação com os serviços Académicos antes de continuar)
poderão constar de um plano antigo ou ter o código siges desatualizado.
</td>
<td><input readonly="true" type="number" ng-model="year.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.alunosInscritos" bound-model="avg('alunosInscritos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementos" bound-model="avg('semElementos',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.semElementosPercent" bound-model="percent(year.semElementos,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovados" bound-model="reprovados(year)"></td>
<td><input readonly="true" type="number" ng-model="year.reprovadosPercent" bound-model="percent(year.reprovados,year.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados" bound-model="year.aprovados1013*1 + year.aprovados1416*1 + year.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="year.aprovadosPercent" bound-model="percent(year.aprovados,year.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="year.aprovados1013" bound-model="avg('aprovados1013',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1013Percent" bound-model="percent(year.aprovados1013,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416" bound-model="avg('aprovados1416',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1416Percent" bound-model="percent(year.aprovados1416,year.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720" bound-model="avg('aprovados1720',year,year.semesters)"></td>
<td><input readonly="true" type="number" ng-model="year.aprovados1720Percent" bound-model="percent(year.aprovados1720,year.aprovados)"></td>
</tr>
 
<tr ng-if="false" ng-repeat-start="s in year.semesters" ></tr>
<tr class="period" ng-if="year.ano &gt; 0 || s.ucs.length > 0">
<td colspan="3" class="period">Semestre {{s.semestre}} <button ng-click="changeDocumentCollection(s)" data-toggle="tooltip" title="Mover unidades para aqui" class="btn btn-xs btn-warning" ng-show="checkedDocuments.length"><span class="glyphicon glyphicon-arrow-left"></span></button>
 
<button class="btn btn-success pull-right" ng-click="addUc(s)"><span class="glyphicon glyphicon-plus"></span> UC Manual</button>
</td>
<td><input readonly="true" type="number" ng-model="s.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.alunosInscritos" bound-model="avg('alunosInscritos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementos" bound-model="avg('semElementos',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.semElementosPercent" bound-model="percent(s.semElementos,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovados" bound-model="reprovados(s)"></td>
<td><input readonly="true" type="number" ng-model="s.reprovadosPercent" bound-model="percent(s.reprovados,s.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados" bound-model="s.aprovados1013*1 + s.aprovados1416*1 + s.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="s.aprovadosPercent" bound-model="percent(s.aprovados,s.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="s.aprovados1013" bound-model="avg('aprovados1013',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1013Percent" bound-model="percent(s.aprovados1013,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416" bound-model="avg('aprovados1416',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1416Percent" bound-model="percent(s.aprovados1416,s.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720" bound-model="avg('aprovados1720',s,s.ucs)"></td>
<td><input readonly="true" type="number" ng-model="s.aprovados1720Percent" bound-model="percent(s.aprovados1720,s.aprovados)"></td>
</tr>
<tr ng-repeat="u in s.ucs" ng-class="{'alert-danger': u.error}" >
<td><input ng-model="u.error" type="hidden" bound-model="u.alunosInscritos < (u.aprovados*1 + u.semElementos*1)">
<input ng-model="u.checked" ng-click="checkUnit(u,s)" type="checkbox"></td>
<td><input type="text" ng-readonly="!u.manual || u.manual == false" ng-model="u.sigesCode"></td>
<td>
 
<input type="text" style="width: 150px" ng-if="!(!u.manual || u.manual == false)" ng-model="u.name">
<span ng-if="(!u.manual || u.manual == false)">{{u.name}}</span>
<button class="btn btn-danger btn-xs pull-right" ng-if="!(!u.manual || u.manual == false)" ng-click="removeComponent(index,s.ucs)"><span class="glyphicon glyphicon-remove"></span></button>
</td>
<td><input type="number" ng-model="u.cumprimentoProgramaPercent"></td>
<td><input type="number" ng-model="u.alunosInscritos"></td>
<td><input type="number" ng-model="u.semElementos"></td>
<td><input readonly="true" type="number" ng-model="u.semElementosPercent" bound-model="percent(u.semElementos,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovados" bound-model="reprovados(u)"></td>
<td><input readonly="true" type="number" ng-model="u.reprovadosPercent" bound-model="percent(u.reprovados,u.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados" bound-model="u.aprovados1013*1 + u.aprovados1416*1 + u.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="u.aprovadosPercent" bound-model="percent(u.aprovados,u.alunosInscritos)"></td>
 
<td><input type="number" ng-model="u.aprovados1013"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1013Percent" bound-model="percent(u.aprovados1013,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1416"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1416Percent" bound-model="percent(u.aprovados1416,u.aprovados)"></td>
<td><input type="number" ng-model="u.aprovados1720"></td>
<td><input readonly="true" type="number" ng-model="u.aprovados1720Percent" bound-model="percent(u.aprovados1720,u.aprovados)"></td>
</tr>
<tr ng-if="false" ng-repeat-end></tr>
<tr ng-if="false" ng-repeat-end></tr>
<tr class="year">
<td colspan="3">Resultados Globais</td>
 
 
<td><input readonly="true" type="number" ng-model="comp.cumprimentoProgramaPercent" bound-model="avg('cumprimentoProgramaPercent',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.alunosInscritos" bound-model="avg('alunosInscritos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementos" bound-model="avg('semElementos',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.semElementosPercent" bound-model="percent(comp.semElementos,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovados" bound-model="reprovados(comp)"></td>
<td><input readonly="true" type="number" ng-model="comp.reprovadosPercent" bound-model="percent(comp.reprovados,comp.alunosInscritos)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados" bound-model="comp.aprovados1013*1 + comp.aprovados1416*1 + comp.aprovados1720*1"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovadosPercent" bound-model="percent(comp.aprovados,comp.alunosInscritos)"></td>
 
<td><input readonly="true" type="number" ng-model="comp.aprovados1013" bound-model="avg('aprovados1013',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1013Percent" bound-model="percent(comp.aprovados1013,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416" bound-model="avg('aprovados1416',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1416Percent" bound-model="percent(comp.aprovados1416,comp.aprovados)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720" bound-model="avg('aprovados1720',comp,comp.years)"></td>
<td><input readonly="true" type="number" ng-model="comp.aprovados1720Percent" bound-model="percent(comp.aprovados1720,comp.aprovados)"></td>
</tr>
</tbody>
</table>
<%--<pre class="code">{{ comp | json }}</pre>--%>
</div>
</script>
 
 
 
 
 
 
 
 
 
 
 
 
 
<script type="text/ng-template" id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg">
<globallearningresultschartimg>
</globallearningresultschartimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultschartimg', function() {
 
return {
restrict: 'E',
link: function($scope, element, attrs)
{
$scope.generateChart = function(comp)
{
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateGlobalLearningResultsChartImg",
{
"courseReportDocument" : BacoJS.stringifyOrdered(angular.element($("#courseReportApp")).scope().report)
},
"#courseReportApp",
function(repositoryFile4JsonView)
{
comp.image = repositoryFile4JsonView;
comp.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + comp.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function(){}
);
}
 
 
},
templateUrl: function(elem,attrs) {
return "globallearningresultschartimg";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartimg">
<div class="imageComponent component">
 
<div class="componentBody">
<div class="form-group clearfix">
<label class="col-md-2 control-label">Legenda</label>
<div class="col-md-10">
<input type="text" class="form-control" rows="10" ng-model="comp.title">
</div>
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<button class="btn btn-default" ng-click="generateChart(comp)">Refrescar/Gerar Gráfico</button>
</div>
<div class="col-md-10">
<label ng-if="comp.image.identifier"> Limites do PDF </label>
<div ng-if="comp.image.identifier" style="text-align: center; width: 595px; border: 1px solid black; padding: 45px">
<center>
<div style="width: 200px;height: 200px; max-width: 500px; max-height: 750px" resizable on-resize="resize($evt, $ui, comp)">
<img ng-if="comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}">
<img ng-if="!comp.imageUrl" style="width: 100%;height: 100%" ng-src="{{'<%=request.getContextPath()%>/repositoryStream/' + comp.image.identifier}}">
</div>
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito)
</center>
</div>
</div>
</div>
</div>
</div>
</script>
/branches/grupo2/impl/src/web/user/courses/courseReportEdit.jsp
331,7 → 331,7
 
</div>
 
<!-- <pre class="code">{{ report | json }}</pre>-->
<pre class="code">{{ report | json }}</pre>
 
 
 
/branches/grupo2/impl/src/web/user/utils/documentsBuilder.jsp
1,5 → 1,9
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<style>
.sections
{
padding-left: 20px;
}
.buttonTools
{
border: 1px solid gray;
23,7 → 27,12
}
</style>
 
<!--Require templateObj-->
<script type="text/ng-template" id="callDocumentTemplate">
 
<div ng-include="class2id(templateObj)"></div>
</script>
 
<%--
customPane Need component customPane in variable customPane
docAppSelector selector usualy an html ID for ng-app example #docReport
46,37 → 55,39
<div class="clearfix" ng-repeat="subComp in comp.components" ng-init="parent=comp;comp=subComp" ng-include="class2id(subComp)">
 
</div>
<div>
</div>
<div>
</div>
</div>
</div>
</script>
 
<script type="text/ng-template" id="pt_estgp_estgweb_utils_documentBuilder_ImageComponent">
<div class="imageComponent component">
<div ng-if="parent['@class']=='pt.estgp.estgweb.utils.documentBuilder.CustomPane'" class="buttonTools clearfix">
<button class="btn btn-danger pull-right" type="button" ng-click="removeComponent($index,parent.components)">
<span class="glyphicon glyphicon-remove"></span>
</button>
<label>Componente de Imagem (Use esta funcinalidade para adicionar gráficos ou tabelas que ache necessárias)</label>
<button class="btn btn-danger pull-right" type="button" ng-click="removeComponent($index,parent.components)">
<span class="glyphicon glyphicon-remove"></span>
</button>
<label>Componente de Imagem (Use esta funcinalidade para adicionar gráficos ou tabelas que ache necessárias)</label>
</div>
 
<div class="componentBody" ng-if="comp['@class']=='pt.estgp.estgweb.utils.documentBuilder.ImageComponent'">
<div class="form-group clearfix" ng-if="comp.image.identifier">
<label class="col-md-2 control-label">Legenda</label>
<div class="col-md-10">
<input type="text" class="form-control" rows="10" ng-model="comp.title">
</div>
<div class="componentBody">
<div class="form-group clearfix" ng-if="comp.image.identifier">
<label class="col-md-2 control-label">Legenda</label>
<div class="col-md-10">
<input type="text" class="form-control" rows="10" ng-model="comp.title">
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<a class="btn btn-default" href="#" ng-model="comp"
data-title="Escolha Imagem"
data-showmetafields="false"
data-confirmonupload="true"
data-toggle="modal"
data-target="#filesUploadModal"
data-multiple="false"
data-allowed-extensions="jpg,png,gif"
data-callback-target-function="angular.element($('{{docAppSelector}}')).scope().callbackUploadedFiles">
</div>
<div class="form-group clearfix">
<div class="col-md-2 control-label">
<a class="btn btn-default" href="#" ng-model="comp"
data-title="Escolha Imagem"
data-showmetafields="false"
data-confirmonupload="true"
data-toggle="modal"
data-target="#filesUploadModal"
data-multiple="false"
data-allowed-extensions="jpg,png,gif"
data-callback-target-function="angular.element($('{{docAppSelector}}')).scope().callbackUploadedFiles">
<span ng-if="comp.image.identifier">
Substituir Imagem
</span>
84,26 → 95,26
Carregar Imagem
</span>
 
<span class="glyphicon glyphicon-upload"/>
<span class="glyphicon glyphicon-upload"/>
 
</a>
</a>
</div>
 
<div class="col-md-10">
<div ng-if="!(comp.image.identifier)">
Clique em carregar imagens e escolha uma imagem para adicionar nesta secção.
</div>
 
<div class="col-md-10">
<div ng-if="!(comp.image.identifier)">
Clique em carregar imagens e escolha uma imagem para adicionar nesta secção.
</div>
 
<label ng-if="comp.image.identifier"> Limites do PDF </label>
<div ng-if="comp.image.identifier" style="text-align: center; width: 595px; border: 1px solid black; padding: 45px">
<center>
<div style="width: 200px;height: 200px; max-width: 500px; max-height: 750px" resizable on-resize="resize($evt, $ui, comp)">
<img style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}">
</div>
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito)
</center>
</div>
<label ng-if="comp.image.identifier"> Limites do PDF </label>
<div ng-if="comp.image.identifier" style="text-align: center; width: 595px; border: 1px solid black; padding: 45px">
<center>
<div style="width: 200px;height: 200px; max-width: 500px; max-height: 750px" resizable on-resize="resize($evt, $ui, comp)">
<img style="width: 100%;height: 100%" ng-src="{{comp.imageUrl}}">
</div>
(Se desejar altere o tamanho da imagem arrastando no canto inferior direito)
</center>
</div>
</div>
</div>
</div>
</div>
135,4 → 146,33
</div>
</div>
</div>
</script>
 
<!--
@section objeto com seccoes e componentes
@optional @chapter capitulo do documento para esta seccao para contcatenar às subsections
-->
<script type="text/ng-template" id="pt_estgp_estgweb_utils_documentBuilder_DocumentSection">
<div class="sections">
<ul class="nav nav-tabs">
<li ng-model="section" class="separatorSectionNav"
ng-class="{ active : subSection.active}"
ng-repeat="subSection in section.sections">
<a ng-click="showSep(section,subSection)"> {{$chapter}}{{$index+1}} - {{subSection.title}}</a>
</li>
</ul>
<div ng-model="subSection"
ng-class="{ hidden: !subSection.active }"
ng-repeat="subSection in section.sections"
class="separatorSection clearfix">
<div ng-repeat="comp in subSection.components"
ng-include="class2id(comp)">
 
</div>
<div ng-if="subSection.sections"
ng-init="section=subSection;$chapter=$chapter+($index+1)+'.'"
ng-include="class2id(subSection)">
</div>
</div>
</div>
</script>