Subversion Repositories bacoAlunos

Compare Revisions

Ignore whitespace Rev 1930 → Rev 1931

/branches/grupo6/impl/conf/berserk/sd.xml
4065,13 → 4065,12
</filterChains>
</service>
 
<!-- SEGUNDO GRÁFICO -->
<service>
<name>CourseReportGenerateGlobalLearningResultsChartYearImg</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
@reportCourseDocument documento course report em json
Serviço de suporte para gerar um grafico de aproveitamento por notas e ano curricular
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
4085,7 → 4084,27
</service>
 
 
<!-- SEGUNDO GRÁFICO -->
<service>
<name>CourseReportGenerateLearningResultsSemesterImg</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
@reportCourseDocument documento course report em json
Serviço de suporte para gerar um grafico de aproveitamento por notas e ano curricular
Coloca o grafico no report documento
e salva o documento no curso
Devolve uma classe RepositoryFile4JsonView serializada em JSON
</description>
<isTransactional>true</isTransactional>
<defaultMethod>generateLearningResultsSemesterImg</defaultMethod>
<filterChains>
<chain name="Logger"/>
<chain name="Session"/>
</filterChains>
</service>
 
 
<service>
<name>CourseReportSave</name>
<implementationClass>pt.estgp.estgweb.services.courses.CourseReportServices</implementationClass>
<description>
/branches/grupo6/impl/src/java/pt/estgp/estgweb/utils/documentBuilder/DocumentSection.java
50,4 → 50,18
}
return null;
}
 
public DocComponent findDocComponentWithCode(Class compClass, String semesterCode)
{
if(getComponents() != null)
for(DocComponent comp: getComponents())
{
if(comp.getClass().equals(compClass) && comp.getInternalCode().equals(semesterCode))
{
return comp;
}
}
return null;
}
 
}
/branches/grupo6/impl/src/java/pt/estgp/estgweb/utils/documentBuilder/DocComponent.java
3,5 → 3,12
/**
* Created by jorgemachado on 11/10/17.
*/
public class DocComponent extends ExtensibleDocObject {
public class DocComponent extends ExtensibleDocObject
{
public String getInternalCode()
{
return "";
}
 
 
}
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/CourseReportServices.java
9,11 → 9,11
import org.json.JSONObject;
import pt.estgp.estgweb.domain.*;
import pt.estgp.estgweb.domain.dao.DaoFactory;
import pt.estgp.estgweb.domain.dao.impl.CourseYearDaoImpl;
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.LearningAnalysisSection;
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;
455,6 → 455,45
return chartImg.toJson();
}
 
public String generateLearningResultsSemesterImg(String reportDocumentJson, String semesterCode,
UserSession session) throws IOException {
 
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
LearningResultsSection learningResultsSection = (LearningResultsSection) reportDocument.findDocumentSection(LearningResultsSection.class);
LearningAnalysisSection learningAnalysisSection = (LearningAnalysisSection) learningResultsSection.findSection(LearningAnalysisSection.class);
LearningResultsChartSem chartImg = (LearningResultsChartSem) learningAnalysisSection.findDocComponentWithCode(LearningResultsChartSem.class, semesterCode);
 
UnitsLearningResultsTable table = (UnitsLearningResultsTable) learningResultsSection.findDocComponent(UnitsLearningResultsTable.class);
 
 
FileUploaded fileUploaded = chartImg.generateChart2tmp(table,reportDocument);
 
RepositoryService repositoryService = new RepositoryService();
 
boolean imageInitialized = chartImg.getImage() != null
&&
chartImg.getImage().getIdentifier() != null;
 
RepositoryFile4JsonView view;
if(imageInitialized)
{
String identifier = chartImg.getImage().getIdentifier();
view = repositoryService.replaceRepositoryFileFromFileUpload(identifier, fileUploaded, ResourceAccessControlEnum.publicDomain, session);
}
else
{
view = repositoryService.storeRepositoryFileFromFileUpload(fileUploaded,ResourceAccessControlEnum.publicDomain,session);
}
chartImg.setImage(view);
 
chartImg.setWidth(500);
float relative = 500 / GlobalLearningResultsChartYearImg.WIDTH;
float height = relative * GlobalLearningResultsChartYearImg.HEIGHT;
chartImg.setHeight((int) height);
//TODO FALTA GUARDAR O JSON NO CURSO
return chartImg.toJson();
}
 
public String save(String reportDocumentJson, UserSession session) throws IOException {
 
CourseReportDocument reportDocument = CourseReportDocument.fromJson(reportDocumentJson);
/branches/grupo6/impl/src/java/pt/estgp/estgweb/services/courses/coursereport/documentmodel/learningresults/components/LearningResultsChartSem.java
1,8 → 1,41
package pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components;
 
import jomm.utils.BytesUtils;
import jomm.utils.MimeTypeGuesser;
import org.apache.commons.fileupload.FileUpload;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.RingPlot;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.renderer.category.StandardBarPainter;
import org.jfree.chart.title.LegendTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
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;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.List;
 
/**
* Created by jorgemachado on 31/10/17.
*/
10,12 → 43,17
{
String semesterCode;
 
@Override
public String getInternalCode() {
return getSemesterCode();
}
 
public LearningResultsChartSem() {
}
 
public LearningResultsChartSem(String semesterCode) {
this.semesterCode = semesterCode;
 
}
 
public String getSemesterCode() {
26,5 → 64,80
this.semesterCode = semesterCode;
}
 
public FileUploaded generateChart2tmp(UnitsLearningResultsTable results, CourseReportDocument courseReportDocument) throws IOException {
List<UnitsLearningResultYear> years = results.getYears();
 
String tempName = BytesUtils.generateHexKey() + ".png";
 
DefaultCategoryDataset data = new DefaultCategoryDataset();
for (UnitsLearningResultYear year : years) {
for (UnitsLearningResultSemester semester : year.getSemesters()) {
if (semester.getSemestre().equals(getSemesterCode())) {
for (UnitsLearningResultUc uc : semester.getUcs()) {
data.addValue(new Double(uc.getSemElementosPercent()), "Sem elementos", uc.getName());
data.addValue(new Double(uc.getReprovadosPercent()), "Reprovados", uc.getName());
data.addValue(new Double(uc.getAprovadosPercent()), "Aprovados", uc.getName());
}
break;
}
}
}
 
 
JFreeChart chart = ChartFactory.createStackedBarChart(
null,
null,
null,
data,
PlotOrientation.HORIZONTAL,
true,
false,
false);
 
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setBackgroundPaint(Color.WHITE);
plot.setRangeGridlinePaint(Color.GRAY);
plot.setRangeGridlinesVisible(true);
//plot.setRangeGridlineStroke(new BasicStroke(1.0f));
 
RectangleInsets chartRectangle = new RectangleInsets(0,0,30F,0);
chart.setPadding(chartRectangle);
 
plot.getDomainAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
plot.getRangeAxis().setTickLabelFont(new Font("Helvetica", Font.PLAIN, 25));
 
StackedBarRenderer renderer = (StackedBarRenderer) plot.getRenderer();
// Remover gradiente das barras
renderer.setBarPainter(new StandardBarPainter());
renderer.setSeriesPaint(0, new Color(237,127,32));
renderer.setSeriesPaint(1, new Color(255,198,0));
renderer.setSeriesPaint(2, new Color(122,173,38));
renderer.setMaximumBarWidth(0.2);
 
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("#.##'%'")));
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelFont(new Font("Helvetica",Font.PLAIN,25));
 
LegendTitle legend = chart.getLegend();
legend.setItemFont(new Font("Helvetica", Font.PLAIN,25));
legend.setFrame(BlockBorder.NONE);
 
 
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;
}
 
}
/branches/grupo6/impl/src/java/pt/estgp/estgweb/web/controllers/courses/CoursesServicesController.java
106,6 → 106,19
return new JSONObject(json);
}
 
public JSONObject generateLearningResultsSemesterImg(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseReportDocument = request.getParameter("courseReportDocument");
 
 
IServiceManager sm = ServiceManager.getInstance();
String json = (String) sm.execute(RequestUtils.getRequester(request, response),
"CourseReportGenerateLearningResultsSemesterImg",
new Object[]{courseReportDocument,request.getParameter("semesterCode")});
// addMessageAsString(request,"Gráfico Gerado");
return new JSONObject(json);
}
 
public JSONObject save(ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Throwable {
 
String courseReportDocument = request.getParameter("courseReportDocument");
/branches/grupo6/impl/src/web/user/courses/coursereport/templates.jsp
1,9 → 1,4
<%@ 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 import="pt.estgp.estgweb.services.courses.coursereport.documentmodel.learningresults.components.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 
<!--
686,6 → 681,43
</script>
 
 
<script type="text/ng-template" id="generateGraph">
<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:'{{comp.width}}'px ;height:'{{comp.height}}'px; 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>
 
 
 
 
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartImg">
<globallearningresultschartimg>
721,46 → 753,12
 
},
templateUrl: function (elem, attrs) {
return "globallearningresultschartimg";
return "generateGraph";
}
}
});
</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:'{{comp.width}}'px ;height:'{{comp.height}}'px; 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>
 
 
<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultsChartYearImg">
<globallearningresultschartyearimg>
796,45 → 794,58
 
},
templateUrl: function (elem, attrs) {
return "globallearningresultschartyearimg";
return "generateGraph";
}
}
});
</script>
<script type="text/ng-template" id="globallearningresultschartyearimg">
<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:'{{comp.width}}'px ;height:'{{comp.height}}'px; 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>
 
 
<!-- SEGUNDO GRAFICO-->
 
<%--<script type="text/ng-template"
id="pt_estgp_estgweb_services_courses_coursereport_documentmodel_learningresults_components_GlobalLearningResultSemesterImg">--%>
<script type="text/ng-template"
id="<%=LearningResultsChartSem.class.getName().replaceAll("\\.","_")%>">
<globallearningresultssemesterimg>
</globallearningresultssemesterimg>
</script>
<script>
angular.module("courseReportApp").directive('globallearningresultssemesterimg', function () {
 
return {
restrict: 'E',
link: function ($scope, element, attrs) {
$scope.generateChart = function (comp) {
 
widgetCallWithActionParameters(
"<%=request.getContextPath()%>/user/courseReport.do",
"generateLearningResultsSemesterImg",
{
"courseReportDocument": BacoJS.stringifyOrdered(angular.element($("#courseReportApp")).scope().report),
"semesterCode": comp.semesterCode
},
"#courseReportApp",
function (chart) {
comp.image = chart.image;
comp.WIDTH = chart.WIDTH;
comp.HEIGHT = chart.HEIGHT;
comp.imageUrl = "<%=request.getContextPath()%>/repositoryStream/" + comp.image.identifier + "?" + new Date().getTime();
angular.element($("#courseReportApp")).scope().$apply();
},
function () {
}
);
}
},
templateUrl: function (elem, attrs) {
return "generateGraph";
}
}
});
</script>
 
 
<!-- TESTE -->