Skip to content
Snippets Groups Projects
Commit 6aac65bd authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_12.5'

parents 05dd27b9 dd6b5e16
No related branches found
No related tags found
No related merge requests found
Showing
with 110 additions and 240 deletions
/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <hr>
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* This file has been modified by the OpenOLAT community. Changes are licensed
* under the Apache 2.0 license as the original file.
*/
package org.olat.course.statistic;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.olat.core.commons.persistence.DB;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
/**
* Simple helper class which knows about since when statistics are available.
* <p>
* NOTE: THIS CLASS NEEDS TO BE REFACTORED IN 6.4 INTO STATISTICUPDATEMANAGER.
* IN 6.3 THERE ARE MULTIPLE SPRING BEAN SCOPES - THOSE FROM
* olat_extensions.xml ARE NOT ACCESSIBLE FROM BEANS WITHIN
* olatdefaultconfig.xml.
* <P>
* Initial Date: 22.02.2010 <br>
* @author Stefan
*/
public class SimpleStatisticInfoHelper {
/** the logging object used in this class **/
private static final OLog log = Tracing.createLoggerFor(SimpleStatisticInfoHelper.class);
/** a map with all sql statements for the supported dbvendors **/
private final Map<String,String> sql;
/** the calculated creationdate **/
private Long creationDate;
private DB dbInstance;
public SimpleStatisticInfoHelper(DB dbInstance, Map<String, String> sql) {
this.dbInstance = dbInstance;
this.sql = sql;
}
/**
* Computes the creationdate_ if it's not already computed and returns it
* @return the creationdate
*/
public Date getFirstLoggingTableCreationDate() {
if (creationDate == null) {
try {
synchronized(this) {
if(creationDate == null) {
List<?> creationDates = dbInstance.getCurrentEntityManager()
.createNativeQuery(sql.get(dbInstance.getDbVendor()))
.getResultList();
creationDate = creationDates == null || creationDates.isEmpty() ? null : ((Number)creationDates.get(0)).longValue();
}
}
} catch (Exception e) {
log.error("", e);
} finally {
dbInstance.commitAndCloseSession();
}
}
return creationDate == null ? null : new Date(creationDate);
}
}
......@@ -26,7 +26,6 @@
package org.olat.course.statistic;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
......@@ -52,7 +51,6 @@ import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.logging.activity.StringResourceableType;
import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
import org.olat.core.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.core.util.resource.OresHelper;
......@@ -63,7 +61,6 @@ import org.olat.course.nodes.CourseNode;
import org.olat.repository.RepositoryEntry;
import org.olat.repository.RepositoryManager;
import org.olat.util.logging.activity.LoggingResourceable;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Base class for Statistic Display Controllers - subclass this
......@@ -93,9 +90,9 @@ public class StatisticDisplayController extends BasicController {
/** the logging object used in this class **/
private static final OLog log_ = Tracing.createLoggerFor(StatisticDisplayController.class);
private final static String CLICK_NODE_ACTION = "clicknodeaction";
private static final String CLICK_NODE_ACTION = "clicknodeaction";
public final static String CLICK_TOTAL_ACTION = "clicktotalaction";
public static final String CLICK_TOTAL_ACTION = "clicktotalaction";
/** a possible value of statisticType in the user activity logging **/
private static final String STATISTIC_TYPE_VIEW_NODE_STATISTIC = "VIEW_NODE_STATISTIC";
......@@ -112,15 +109,12 @@ public class StatisticDisplayController extends BasicController {
private final ICourse course;
private final IStatisticManager statisticManager;
private TableController tableCtr_;
private TableController tableCtr;
private TableController tableController;
private VelocityContainer statisticVc_;
private VelocityContainer statisticVc;
private Translator headerTranslator_;
@Autowired
private SimpleStatisticInfoHelper statisticInfoHelper;
private Translator headerTranslator;
public StatisticDisplayController(UserRequest ureq, WindowControl windowControl, ICourse course, IStatisticManager statisticManager) {
super(ureq, windowControl);
......@@ -133,7 +127,7 @@ public class StatisticDisplayController extends BasicController {
}
this.course = course;
this.statisticManager = statisticManager;
this.headerTranslator_ = Util.createPackageTranslator(statisticManager.getClass(), ureq.getLocale());
this.headerTranslator = Util.createPackageTranslator(statisticManager.getClass(), ureq.getLocale());
// statistic.html is under org.olat.course.statistic - no matter who subclasses BaseStatisticDisplayController
setVelocityRoot(Util.getPackageVelocityRoot(StatisticDisplayController.class));
......@@ -143,20 +137,18 @@ public class StatisticDisplayController extends BasicController {
}
protected Component createInitialComponent(UserRequest ureq) {
statisticVc_ = createVelocityContainer("statistic");
statisticVc_.contextPut("statsSince", getStatsSinceStr());
statisticVc = createVelocityContainer("statistic");
recreateTableController(ureq);
return statisticVc_;
return statisticVc;
}
protected void recreateTableController(UserRequest ureq) {
StatisticResult result = recalculateStatisticResult(ureq);
tableCtr_ = createTableController(ureq, result);
statisticVc_.put("statisticResult", tableCtr_.getInitialComponent());
statisticVc_.contextPut("hasChart", Boolean.FALSE);
tableCtr = createTableController(ureq, result);
statisticVc.put("statisticResult", tableCtr.getInitialComponent());
statisticVc.contextPut("hasChart", Boolean.FALSE);
Graph graph = calculateNodeGraph(ureq, result.getRowCount()-1);
Graph graph = calculateNodeGraph(result.getRowCount()-1);
generateCharts(graph);
}
......@@ -176,7 +168,6 @@ public class StatisticDisplayController extends BasicController {
tableController = new TableController(tableConfig, ureq, getWindowControl(), getTranslator());
listenTo(tableController);
// tableCtr.addColumnDescriptor(statisticManager.createColumnDescriptor(ureq, 0, null));
IndentedStatisticNodeRenderer indentedNodeRenderer = new IndentedStatisticNodeRenderer(Util.createPackageTranslator(statisticManager.getClass(), ureq.getLocale()));
indentedNodeRenderer.setSimpleRenderingOnExport(true);
CustomRenderColumnDescriptor nodeCD = new CustomRenderColumnDescriptor("stat.table.header.node", 0,
......@@ -184,7 +175,7 @@ public class StatisticDisplayController extends BasicController {
@Override
public int compareTo(int rowa, int rowb) {
// order by original row order
return new Integer(rowa).compareTo(rowb);
return Integer.valueOf(rowa).compareTo(rowb);
}
};
tableController.addColumnDescriptor(nodeCD);
......@@ -248,31 +239,27 @@ public class StatisticDisplayController extends BasicController {
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if (source==tableCtr_ && event instanceof TableEvent) {
if (source==tableCtr && event instanceof TableEvent) {
TableEvent tableEvent = (TableEvent)event;
if (CLICK_NODE_ACTION.equals(tableEvent.getActionId())) {
int rowId = tableEvent.getRowId();
Graph graph = calculateNodeGraph(ureq, rowId);
Graph graph = calculateNodeGraph(rowId);
generateCharts(graph);
} else if (tableEvent.getActionId().startsWith(CLICK_TOTAL_ACTION)) {
try{
int columnId = Integer.parseInt(tableEvent.getActionId().substring(CLICK_TOTAL_ACTION.length()));
Graph graph = calculateTotalGraph(ureq, columnId);
Graph graph = calculateTotalGraph(columnId);
generateCharts(graph);
} catch(NumberFormatException e) {
log_.warn("event: Could not convert event into columnId for rendering graph: "+tableEvent.getActionId());
return;
}
}
}
}
private Graph calculateNodeGraph(UserRequest ureq, int rowId) {
private Graph calculateNodeGraph(int rowId) {
Object o = tableCtr_.getTableDataModel().getValueAt(rowId, 0);
Object o = tableCtr.getTableDataModel().getValueAt(rowId, 0);
String selectionInfo = "";
if (o instanceof Map) {
Map map = (Map)o;
......@@ -287,16 +274,16 @@ public class StatisticDisplayController extends BasicController {
LoggingResourceable.wrapNonOlatResource(StringResourceableType.statisticType, "", STATISTIC_TYPE_VIEW_TOTAL_OF_NODES_STATISTIC));
selectionInfo = getTranslator().translate("statistic.chart.selectioninfo.total");
}
String chartIntroStr = headerTranslator_.translate("statistic.chart.intro", new String[] { selectionInfo, getStatsSinceStr() });
String chartIntroStr = headerTranslator.translate("statistic.chart.intro", new String[] { selectionInfo });
StringBuffer chd = new StringBuffer();
List<Integer> values = new ArrayList<Integer>();
StringBuilder chd = new StringBuilder(4096);
List<Integer> values = new ArrayList<>();
int max = 10;
int columnCnt = tableCtr_.getTableDataModel().getColumnCount();
List<String> labelList = new LinkedList<String>();
int columnCnt = tableCtr.getTableDataModel().getColumnCount();
List<String> labelList = new LinkedList<>();
for(int column=1/*we ignore the node itself*/; column<columnCnt-1/*we ignore the total*/; column++) {
Object cellValue = tableCtr_.getTableDataModel().getValueAt(rowId, column);
Object cellValue = tableCtr.getTableDataModel().getValueAt(rowId, column);
Integer v = 0;
if (cellValue instanceof Integer) {
v = (Integer)cellValue;
......@@ -308,10 +295,10 @@ public class StatisticDisplayController extends BasicController {
chd.append(v);
values.add(v);
ColumnDescriptor cd = tableCtr_.getColumnDescriptor(column);
ColumnDescriptor cd = tableCtr.getColumnDescriptor(column);
String headerKey = cd.getHeaderKey();
if (cd.translateHeaderKey()) {
headerKey = headerTranslator_.translate(headerKey);
headerKey = headerTranslator.translate(headerKey);
}
labelList.add(headerKey);
}
......@@ -323,32 +310,32 @@ public class StatisticDisplayController extends BasicController {
return result;
}
private Graph calculateTotalGraph(UserRequest ureq, int columnId) {
ColumnDescriptor cd = tableCtr_.getColumnDescriptor(columnId);
private Graph calculateTotalGraph(int columnId) {
ColumnDescriptor cd = tableCtr.getColumnDescriptor(columnId);
String headerKey = cd.getHeaderKey();
if (cd.translateHeaderKey()) {
headerKey = headerTranslator_.translate(headerKey);
headerKey = headerTranslator.translate(headerKey);
}
String selectionInfo = headerKey;
String chartIntroStr;
if (columnId==tableCtr_.getTableDataModel().getColumnCount()-1) {
if (columnId==tableCtr.getTableDataModel().getColumnCount()-1) {
ThreadLocalUserActivityLogger.log(StatisticLoggingAction.VIEW_TOTAL_TOTAL_STATISTIC, getClass(),
LoggingResourceable.wrapNonOlatResource(StringResourceableType.statisticType, "", STATISTIC_TYPE_VIEW_TOTAL_TOTAL_STATISTIC));
chartIntroStr = headerTranslator_.translate("statistic.chart.pernode.total.intro", new String[] { getStatsSinceStr() });
chartIntroStr = headerTranslator.translate("statistic.chart.pernode.total.intro");
} else {
ThreadLocalUserActivityLogger.log(StatisticLoggingAction.VIEW_TOTAL_BY_VALUE_STATISTIC, getClass(),
LoggingResourceable.wrapNonOlatResource(StringResourceableType.statisticType, "", STATISTIC_TYPE_VIEW_TOTAL_BY_VALUE_STATISTIC),
LoggingResourceable.wrapNonOlatResource(StringResourceableType.statisticColumn, "", selectionInfo));
chartIntroStr = headerTranslator_.translate("statistic.chart.pernode.intro", new String[] { selectionInfo });
chartIntroStr = headerTranslator.translate("statistic.chart.pernode.intro", new String[] { selectionInfo });
}
StringBuffer chd = new StringBuffer();
StringBuilder chd = new StringBuilder(4096);
int max = 10;
List<String> labelList = new LinkedList<String>();
for(int row=0; row<tableCtr_.getTableDataModel().getRowCount()-1; row++) {
Object cellValue = tableCtr_.getTableDataModel().getValueAt(row, columnId);
List<String> labelList = new LinkedList<>();
for(int row=0; row<tableCtr.getTableDataModel().getRowCount()-1; row++) {
Object cellValue = tableCtr.getTableDataModel().getValueAt(row, columnId);
Integer v = 0;
if (cellValue instanceof Integer) {
v = (Integer)cellValue;
......@@ -359,7 +346,7 @@ public class StatisticDisplayController extends BasicController {
}
chd.append(v);
Map m = (Map)tableCtr_.getTableDataModel().getValueAt(row, 0);
Map m = (Map)tableCtr.getTableDataModel().getValueAt(row, 0);
headerKey = "n/a";
if (m!=null) {
headerKey = (String) m.get(AssessmentHelper.KEY_TITLE_SHORT);
......@@ -370,12 +357,12 @@ public class StatisticDisplayController extends BasicController {
Graph result = new Graph();
result.labelList = labelList;
result.chartIntroStr = chartIntroStr;
result.numElements = tableCtr_.getTableDataModel().getRowCount()-1;
result.numElements = tableCtr.getTableDataModel().getRowCount()-1;
return result;
}
private void generateCharts(Graph graph) {
statisticVc_.contextPut("hasChart", Boolean.FALSE);
statisticVc_.contextPut("hasChartError", Boolean.FALSE);
statisticVc.contextPut("hasChart", Boolean.FALSE);
statisticVc.contextPut("hasChartError", Boolean.FALSE);
if (graph==null || graph.numElements==0) {
Component ic = getInitialComponent();
if (ic!=null) {
......@@ -384,10 +371,10 @@ public class StatisticDisplayController extends BasicController {
return;
}
try{
statisticVc_.contextPut("chartAlt", getTranslator().translate("chart.alt"));
statisticVc_.contextPut("chartIntro", graph.chartIntroStr);
statisticVc_.contextPut("hasChart", Boolean.TRUE);
statisticVc_.contextPut("hasChartError", Boolean.FALSE);
statisticVc.contextPut("chartAlt", getTranslator().translate("chart.alt"));
statisticVc.contextPut("chartIntro", graph.chartIntroStr);
statisticVc.contextPut("hasChart", Boolean.TRUE);
statisticVc.contextPut("hasChartError", Boolean.FALSE);
BarChartComponent chartCmp = new BarChartComponent("stats");
List<String> labels = graph.getLabels();
......@@ -399,7 +386,7 @@ public class StatisticDisplayController extends BasicController {
serie.add(value, category);
}
chartCmp.addSeries(serie);
statisticVc_.put("chart", chartCmp);
statisticVc.put("chart", chartCmp);
} catch(RuntimeException re) {
log_.warn("generateCharts: RuntimeException during chart generation: "+re, re);
......@@ -409,14 +396,6 @@ public class StatisticDisplayController extends BasicController {
ic.setDirty(true);
}
}
protected String getStatsSinceStr() {
Date d = statisticInfoHelper.getFirstLoggingTableCreationDate();
if (d==null) {
return "n/a";
}
return Formatter.getInstance(getLocale()).formatDate(d);
}
@Override
protected void doDispose() {
......
......@@ -36,6 +36,8 @@ import java.util.Map;
import java.util.Set;
import org.olat.core.gui.components.table.TableDataModel;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;
import org.olat.core.util.nodes.INode;
import org.olat.course.ICourse;
import org.olat.course.assessment.AssessmentHelper;
......@@ -43,17 +45,19 @@ import org.olat.course.nodes.CourseNode;
/** work in progress **/
public class StatisticResult implements TableDataModel {
private static final OLog log = Tracing.createLoggerFor(StatisticResult.class);
/** token representing the title cell in the total row - renderers must know how to render this **/
static final Object TOTAL_ROW_TITLE_CELL = new Object();
public static final String KEY_NODE = "result_key_node";
private List<String> columnHeaders_ = new LinkedList<String>();
private List<String> columnHeaders_ = new LinkedList<>();
private List<CourseNode> orderedNodesList_ = new LinkedList<CourseNode>();
private List<CourseNode> orderedNodesList_ = new LinkedList<>();
private Map<CourseNode,Map<String,Integer>> statistic_ = new HashMap<CourseNode, Map<String,Integer>>();
private Map<CourseNode,Map<String,Integer>> statistic_ = new HashMap<>();
/**
* mysql> select businesspath,day,value from o_stat_dayofweek where businesspath like '[RepositoryEntry:393216]%';
......@@ -65,13 +69,13 @@ public class StatisticResult implements TableDataModel {
| [RepositoryEntry:393216][CourseNode:73156787421533] | 4 | 34 |
*/
public StatisticResult(ICourse course, List<Object[]> result) {
final Set<String> groupByKeys = new HashSet<String>();
final Set<String> groupByKeys = new HashSet<>();
doAddQueryListResultsForNodeAndChildren(course.getRunStructure().getRootNode(), result, groupByKeys);
if (result.size()!=0) {
System.out.println("ERROR - should have 0 left....: "+result.size());
if (!result.isEmpty()) {
log.error("ERROR - should have 0 left....: " + result.size());
}
columnHeaders_ = new LinkedList<String>(groupByKeys);
columnHeaders_ = new LinkedList<>(groupByKeys);
Collections.sort(columnHeaders_, new Comparator<String>() {
@Override
......@@ -96,11 +100,11 @@ public class StatisticResult implements TableDataModel {
}
public List<String> getColumnHeaders() {
return new ArrayList<String>(columnHeaders_);
return new ArrayList<>(columnHeaders_);
}
public void setColumnHeaders(List<String> columnHeaders) {
columnHeaders_ = new ArrayList<String>(columnHeaders);
columnHeaders_ = new ArrayList<>(columnHeaders);
}
private void doAddQueryListResultsForNodeAndChildren(CourseNode node, List<Object[]> result, Set<String> groupByKeys) {
......@@ -123,7 +127,7 @@ public class StatisticResult implements TableDataModel {
Map<String,Integer> nodeMap = statistic_.get(node);
if (nodeMap==null) {
nodeMap = new HashMap<String,Integer>();
nodeMap = new HashMap<>();
statistic_.put(node, nodeMap);
}
......@@ -166,9 +170,9 @@ public class StatisticResult implements TableDataModel {
// Store node data in hash map. This hash map serves as data model for
// the user assessment overview table. Leave user data empty since not used in
// this table. (use only node data)
Map<String,Object> nodeData = new HashMap<String, Object>();
Map<String,Object> nodeData = new HashMap<>();
// indent
nodeData.put(AssessmentHelper.KEY_INDENT, new Integer(recursionLevel));
nodeData.put(AssessmentHelper.KEY_INDENT, Integer.valueOf(recursionLevel));
// course node data
nodeData.put(AssessmentHelper.KEY_TYPE, node.getType());
nodeData.put(AssessmentHelper.KEY_TITLE_SHORT, node.getShortTitle());
......@@ -181,7 +185,7 @@ public class StatisticResult implements TableDataModel {
}
public List<String> getHeaders() {
return new ArrayList<String>(columnHeaders_);
return new ArrayList<>(columnHeaders_);
}
@Override
......@@ -224,8 +228,8 @@ public class StatisticResult implements TableDataModel {
if (statisticMap==null) {
continue;
}
for (Iterator it2 = statisticMap.values().iterator(); it2.hasNext();) {
Integer num = (Integer) it2.next();
for (Iterator<Integer> it2 = statisticMap.values().iterator(); it2.hasNext();) {
Integer num = it2.next();
if (num!=null) {
total+=num;
}
......
......@@ -2,7 +2,7 @@
<fieldset class="o_form form-horizontal">
<legend>
$r.translate("statistic.title")</legend>
<div class="o_desc">$r.translate("statistic.intro", $statsSince)</div>
<div class="o_desc">$r.translate("statistic.intro")</div>
</fieldset>
$r.render("statisticResult")
#if($hasChart)
......
......@@ -454,23 +454,4 @@ insert into o_stat_hourofday (businesspath, resid, hour, value)
<constructor-arg value="${cluster.singleton.services}"/>
<property name="taskExecutorManager" ref="taskExecutorManager"/>
</bean>
<bean class="org.olat.course.statistic.SimpleStatisticInfoHelper" >
<constructor-arg>
<ref bean="database"/>
</constructor-arg>
<constructor-arg>
<map>
<entry key="mysql">
<value>select unix_timestamp(creationdate) from o_loggingtable limit 1;</value>
</entry>
<entry key="postgresql">
<value>select round(date_part('epoch', creationdate)) from o_loggingtable limit 1;</value>
</entry>
<entry key="oracle">
<value>select round((creationdate - TO_DATE('19700101000000','YYYYMMDDHH24MISS'))*86400) from o_loggingtable where rownum=1</value>
</entry>
</map>
</constructor-arg>
</bean>
</beans>
\ No newline at end of file
......@@ -39,9 +39,7 @@ import org.olat.course.statistic.StatisticResult;
public class DailyStatisticDisplayController extends StatisticDisplayController {
private VelocityContainer dailyStatisticFormVc_;
private VelocityContainer dailyStatisticVc_;
private DateChooserForm form_;
private DateChooserForm dateChooser;
public DailyStatisticDisplayController(UserRequest ureq, WindowControl windowControl, ICourse course, IStatisticManager statisticManager) {
super(ureq, windowControl, course, statisticManager);
......@@ -51,24 +49,24 @@ public class DailyStatisticDisplayController extends StatisticDisplayController
protected Component createInitialComponent(UserRequest ureq) {
setVelocityRoot(Util.getPackageVelocityRoot(getClass()));
dailyStatisticVc_ = this.createVelocityContainer("dailystatisticparent");
VelocityContainer dailyStatisticVc = this.createVelocityContainer("dailystatisticparent");
dailyStatisticFormVc_ = this.createVelocityContainer("dailystatisticform");
form_ = new DateChooserForm(ureq, getWindowControl(), 7);
listenTo(form_);
dailyStatisticFormVc_.put("statisticForm", form_.getInitialComponent());
dailyStatisticFormVc_.contextPut("statsSince", getStatsSinceStr());
VelocityContainer dailyStatisticFormVc = this.createVelocityContainer("dailystatisticform");
dateChooser = new DateChooserForm(ureq, getWindowControl(), 7);
listenTo(dateChooser);
dailyStatisticFormVc.put("statisticForm", dateChooser.getInitialComponent());
dailyStatisticVc_.put("dailystatisticform", dailyStatisticFormVc_);
dailyStatisticVc.put("dailystatisticform", dailyStatisticFormVc);
Component parentInitialComponent = super.createInitialComponent(ureq);
dailyStatisticVc_.put("statistic", parentInitialComponent);
dailyStatisticVc.put("statistic", parentInitialComponent);
return dailyStatisticVc_;
return dailyStatisticVc;
}
@Override
public void event(UserRequest ureq, Controller source, Event event) {
if (source == form_ && event == Event.DONE_EVENT) {
if (source == dateChooser && event == Event.DONE_EVENT) {
// need to regenerate the statisticResult
if (!(getStatisticManager() instanceof DailyStatisticManager)) {
......@@ -86,10 +84,7 @@ public class DailyStatisticDisplayController extends StatisticDisplayController
@Override
protected StatisticResult recalculateStatisticResult(UserRequest ureq) {
// recalculate the statistic result based on the from and to dates.
// do this by going via sql (see DailyStatisticManager)
DailyStatisticManager dailyStatisticManager = (DailyStatisticManager)getStatisticManager();
StatisticResult statisticResult =
dailyStatisticManager.generateStatisticResult(ureq, getCourse(), getCourseRepositoryEntryKey(), form_.getFromDate(), form_.getToDate());
return statisticResult;
// do this by going via sql (see DailyStatisticManager)
return getStatisticManager().generateStatisticResult(ureq, getCourse(), getCourseRepositoryEntryKey(), dateChooser.getFromDate(), dateChooser.getToDate());
}
}
......@@ -60,7 +60,7 @@ public class DailyStatisticManager implements IStatisticManager {
/** the SimpleDateFormat with which the column headers will be created formatted by the database,
* so change this in coordination with any db changes if you really need to
**/
private final SimpleDateFormat columnHeaderFormat_ = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
private final SimpleDateFormat columnHeaderFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
@Override
public StatisticResult generateStatisticResult(UserRequest ureq, ICourse course, long courseRepositoryEntryKey) {
......@@ -79,7 +79,7 @@ public class DailyStatisticManager implements IStatisticManager {
String header = headerId;
try{
Date d = columnHeaderFormat_.parse(headerId);
Date d = columnHeaderFormat.parse(headerId);
Calendar c = Calendar.getInstance(ureq.getLocale());
c.setTime(d);
......@@ -139,19 +139,19 @@ public class DailyStatisticManager implements IStatisticManager {
}
try{
String firstDate = columnHeaders.get(0);
Date fromDate = columnHeaderFormat_.parse(firstDate);
Date fromDate = columnHeaderFormat.parse(firstDate);
Date previousDate = new Date(fromDate.getTime()); // copy fromDate
final long DAY_DIFF = 24*60*60*1000;
final long DAY_DIFF = 24l * 60l * 60l * 1000l;
for (int i = 1; i < columnHeaders.size(); i++) {
String aDate = columnHeaders.get(i);
Date currDate = columnHeaderFormat_.parse(aDate);
Date currDate = columnHeaderFormat.parse(aDate);
long diff = currDate.getTime() - previousDate.getTime();
// note that we should have full days - we have the HH:MM:SS set to 00:00:00 - hence the
// difference should always be a full day
if (diff>DAY_DIFF) {
// then we should add a few days in here
Date additionalDate = new Date(previousDate.getTime() + DAY_DIFF);
String additionalDateStr = columnHeaderFormat_.format(additionalDate);
String additionalDateStr = columnHeaderFormat.format(additionalDate);
columnHeaders.add(i, additionalDateStr);
previousDate = additionalDate;
} else {
......@@ -164,5 +164,4 @@ public class DailyStatisticManager implements IStatisticManager {
log.warn("fillGapsInColumnHeaders: Got a ParseException while trying to fill gaps. Giving up. ",e);
}
}
}
<fieldset class="o_form form-horizontal">
<legend>
$r.translate("statistic.title")</legend>
<div class="o_desc">$r.translate("statistic.intro", $statsSince)</div>
<legend>$r.translate("statistic.title")</legend>
<div class="o_desc">$r.translate("statistic.intro")</div>
$r.render("statisticForm")
</fieldset>
......@@ -14,8 +14,8 @@ stat.table.header.day6=\u0627\u0644\u062C\u0645\u0639\u0629
stat.table.header.day7=\u0627\u0644\u0633\u0628\u062A
stat.table.header.node=\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631
stat.table.header.total=\u0627\u0644\u0645\u062C\u0645\u0648\u0639
statistic.chart.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A {0} \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630{1}) \u0641\u0649 \u0643\u0644 \u064A\u0648\u0645.
statistic.chart.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A {0} \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 \u0641\u0649 \u0643\u0644 \u064A\u0648\u0645.
statistic.chart.pernode.intro=.{0} \u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0641\u0649
statistic.chart.pernode.total.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u062E\u0644\u0627\u0644 \u0627\u0644\u0641\u062A\u0631\u0629 \u0627\u0644\u0645\u062D\u062F\u062F\u0629.
statistic.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0625\u062D\u0635\u0627\u0621 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630{0}) \u0641\u0649 \u0643\u0644 \u064A\u0648\u0645.
statistic.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0625\u062D\u0635\u0627\u0621 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 \u0641\u0649 \u0643\u0644 \u064A\u0648\u0645.
statistic.title=\u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A \u0627\u0644\u064A\u0648\u0645\u064A\u0629
......@@ -2,8 +2,8 @@ menu.createstatfile=T\u00E4glich
menu.createstatfile.alt=T\u00E4gliche Statistik anzeigen
statistic.title=T\u00E4gliche Statistik
statistic.intro=Diese Statistik zeigt alle Zugriffe auf die Kursbausteine basierend auf allen verf\u00FCgbaren Kursdaten (seit {0}) pro Tag.
statistic.chart.intro=Diese Grafik zeigt alle Zugriffe {0} basierend auf allen verf\u00FCgbaren Kursdaten (seit {1}) pro Tag.
statistic.intro=Diese Statistik zeigt alle Zugriffe auf die Kursbausteine basierend auf allen verf\u00FCgbaren Kursdaten pro Tag.
statistic.chart.intro=Diese Grafik zeigt alle Zugriffe {0} basierend auf allen verf\u00FCgbaren Kursdaten pro Tag.
statistic.chart.pernode.intro=Diese Grafik zeigt die Zugriffe auf die Kursbausteine am {0}.
statistic.chart.pernode.total.intro=Diese Grafik zeigt alle Zugriffe auf die Kursbausteine w\u00e4hrend der gew\u00e4hlten Zeitspanne.
......
......@@ -14,8 +14,8 @@ stat.table.header.day6=\u03A0\u03B1\u03C1\u03B1\u03C3\u03BA\u03B5\u03C5\u03AE
stat.table.header.day7=\u03A3\u03AC\u03B2\u03B2\u03B1\u03C4\u03BF
stat.table.header.node=\u03A3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03BF \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2
stat.table.header.total=\u03A3\u03CD\u03BD\u03BF\u03BB\u03BF
statistic.chart.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 {0} \u03B2\u03AC\u03C3\u03B5\u03B9 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03C9\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD (\u03B1\u03C0\u03CC {1}) \u03B1\u03BD\u03AC \u03B7\u03BC\u03AD\u03C1\u03B1.
statistic.chart.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 {0} \u03B2\u03AC\u03C3\u03B5\u03B9 \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03C9\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03B1\u03BD\u03AC \u03B7\u03BC\u03AD\u03C1\u03B1.
statistic.chart.pernode.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C3\u03C4\u03B9\u03C2 {0}.
statistic.chart.pernode.total.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B1\u03C1\u03BF\u03C5\u03C3\u03B9\u03AC\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03BA\u03B1\u03C4\u03AC \u03C4\u03B7 \u03B4\u03B9\u03AC\u03C1\u03BA\u03B5\u03B9\u03B1 \u03C4\u03BF\u03C5 \u03C7\u03C1\u03BF\u03BD\u03B9\u03BA\u03BF\u03CD \u03B4\u03B9\u03B1\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C0\u03BF\u03C5 \u03AD\u03C7\u03B5\u03B9 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03B5\u03AF.
statistic.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B2\u03AC\u03C3\u03B5\u03BF \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03C9\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD (\u03B1\u03C0\u03CC {0}) \u03B1\u03BD\u03AC \u03B7\u03BC\u03AD\u03C1\u03B1.
statistic.intro=\u0391\u03C5\u03C4\u03CC \u03C4\u03BF \u03C3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03CC \u03B5\u03BC\u03C6\u03B1\u03BD\u03AF\u03B6\u03B5\u03B9 \u03CC\u03BB\u03B5\u03C2 \u03C4\u03B9\u03C2 \u03C0\u03C1\u03BF\u03C3\u03B2\u03AC\u03C3\u03B5\u03B9\u03C2 \u03C3\u03B5 \u03C3\u03C4\u03BF\u03B9\u03C7\u03B5\u03AF\u03B1 \u03BC\u03B1\u03B8\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03B2\u03AC\u03C3\u03B5\u03BF \u03CC\u03BB\u03C9\u03BD \u03C4\u03C9\u03BD \u03B4\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03C9\u03BD \u03B4\u03B5\u03B4\u03BF\u03BC\u03AD\u03BD\u03C9\u03BD \u03C4\u03C9\u03BD \u03BC\u03B1\u03B8\u03B7\u03BC\u03AC\u03C4\u03C9\u03BD \u03B1\u03BD\u03AC \u03B7\u03BC\u03AD\u03C1\u03B1.
statistic.title=\u0397\u03BC\u03B5\u03C1\u03AE\u03C3\u03B9\u03B1 \u03C3\u03C4\u03B1\u03C4\u03B9\u03C3\u03C4\u03B9\u03BA\u03AC
......@@ -14,8 +14,8 @@ stat.table.header.day6=Friday
stat.table.header.day7=Saturday
stat.table.header.node=Course element
stat.table.header.total=Total
statistic.chart.intro=This chart shows all accesses {0} based on the entire course data available (since {1}) per day.
statistic.chart.intro=This chart shows all accesses {0} based on the entire course data available per day.
statistic.chart.pernode.intro=This chart shows all accesses to course elements on {0}.
statistic.chart.pernode.total.intro=This chart shows all accesses to course elements during the time period selected.
statistic.intro=This statistic shows all accesses to course elements based on the entire course data available (since {0}) per day.
statistic.intro=This statistic shows all accesses to course elements based on the entire course data available per day.
statistic.title=Daily statistics
......@@ -14,8 +14,8 @@ stat.table.header.day6=Vendredi
stat.table.header.day7=Samedi
stat.table.header.node=\u00E9l\u00E9ment de cours
stat.table.header.total=total
statistic.chart.intro=Ce graphique montre tous les acc\u00E8s {0} bas\u00E9 sur tous les donn\u00E9es de cours disponibles (par {1}) par jour.
statistic.chart.intro=Ce graphique montre tous les acc\u00E8s {0} bas\u00E9 sur tous les donn\u00E9es de cours disponibles par jour.
statistic.chart.pernode.intro=Ce graphique montre tous les acc\u00E8s sur les \u00E9l\u00E9ments de cours le {0}.
statistic.chart.pernode.total.intro=Ce graphique montre tous les acc\u00E8s sur les \u00E9l\u00E9ments de cours pendant la p\u00E9riode s\u00E9lectionn\u00E9.
statistic.intro=Ces statistiques montre tous les acc\u00E8s sur les \u00E9l\u00E9ments de cours bas\u00E9 sur tous les donn\u00E9es de cours disponibles (depuis {0}) par jour.
statistic.intro=Ces statistiques montre tous les acc\u00E8s sur les \u00E9l\u00E9ments de cours bas\u00E9 sur tous les donn\u00E9es de cours disponibles par jour.
statistic.title=Statistiques quotidiennes
......@@ -14,8 +14,8 @@ stat.table.header.day6=venerd\u00EC
stat.table.header.day7=sabato
stat.table.header.node=Elemento di corso
stat.table.header.total=Totale
statistic.chart.intro=Questa grafica mostra tutti i clic {0} sulla base di tutti i dati disponibili (dal {1}) per giorno.
statistic.chart.intro=Questa grafica mostra tutti i clic {0} sulla base di tutti i dati disponibili per giorno.
statistic.chart.pernode.intro=Questa grafica mostra i clic sugli elementi di corso il {0}.
statistic.chart.pernode.total.intro=Questa grafica mostra tutti i clic sugli elementi di corso durante il periodo stabilito.
statistic.intro=Questa grafica mostra tutti i clic sugli elementi di corso sulla base di tutti i dati disponibili (dal {0}) per giorno.
statistic.intro=Questa grafica mostra tutti i clic sugli elementi di corso sulla base di tutti i dati disponibili per giorno.
statistic.title=Statistica giornaliera
......@@ -14,8 +14,8 @@ stat.table.header.day6=Vrijdag
stat.table.header.day7=Zaterdag
stat.table.header.node=Cursuselement
stat.table.header.total=Totaal
statistic.chart.intro=Deze grafiek toont alle toegangen {0} gebaseerd op de volledige cursusdata die beschikbaar is (sinds (1)) per dag.
statistic.chart.intro=Deze grafiek toont alle toegangen {0} gebaseerd op de volledige cursusdata die beschikbaar is per dag.
statistic.chart.pernode.intro=Deze grafiek toont alle toegangen tot cursuselementen op {0}.
statistic.chart.pernode.total.intro=Deze grafiek toont alle toegangen tot cursuselementen tijdens de geselecteerde tijdsperiode.
statistic.intro=Deze statistiek toont alle toegangen tot cursuselementen gebaseerd op de volledige cursusdata beschikbaar (sinds {0} per dag.
statistic.intro=Deze statistiek toont alle toegangen tot cursuselementen gebaseerd op de volledige cursusdata beschikbaar per dag.
statistic.title=Dagelijkse statistieken
......@@ -12,8 +12,8 @@ stat.table.header.day6=Pi\u0105tek
stat.table.header.day7=Sobota
stat.table.header.node=Element kursu
stat.table.header.total=Razem
statistic.chart.intro=Ten wykres przedstawia wszystkie dzienne zapytania {0}, bazuj\u0105ce na wszystkich dost\u0119pnych danych dla kursu (od {1}).
statistic.chart.intro=Ten wykres przedstawia wszystkie dzienne zapytania {0}, bazuj\u0105ce na wszystkich dost\u0119pnych danych dla kursu.
statistic.chart.pernode.intro=Ten wykres przedstawia wszystkie zapytania dla elementu kursu {0}.
statistic.chart.pernode.total.intro=Ten wykres przedstawia wszystkie zapytania dla element\u00F3w kursu, przez ca\u0142y wybrany okres.
statistic.intro=Ten wykres przedstawia wszystkie zapytania dzienne, bazuj\u0105ce na wszystkich danych, dost\u0119pnych dla kursu (od {0}).
statistic.intro=Ten wykres przedstawia wszystkie zapytania dzienne, bazuj\u0105ce na wszystkich danych, dost\u0119pnych dla kursu.
statistic.title=Statystyki dzienne
......@@ -14,8 +14,8 @@ stat.table.header.day6=Sexta-Feira
stat.table.header.day7=S\u00E1bado
stat.table.header.node=Elemento de Curso
stat.table.header.total=Total
statistic.chart.intro=Este gr\u00E1fico mostra todos os acessos {0} baseados em todos os dados de curso dispon\u00EDveis (desde {1}) por dia.
statistic.chart.intro=Este gr\u00E1fico mostra todos os acessos {0} baseados em todos os dados de curso dispon\u00EDveis por dia.
statistic.chart.pernode.intro=Este gr\u00E1fico mostra todos os acessos aos elementos do curso em {0}.
statistic.chart.pernode.total.intro=Este gr\u00E1fico mostra todos os acessos aos elementos do curso, durante o per\u00EDodo de tempo selecionado.
statistic.intro=Esta estat\u00EDstica mostra todos os acessos aos elementos de curso com base em todos os dados dispon\u00EDveis (desde {0}) por dia.
statistic.intro=Esta estat\u00EDstica mostra todos os acessos aos elementos de curso com base em todos os dados dispon\u00EDveis por dia.
statistic.title=Estat\u00EDsticas Di\u00E1rias
......@@ -14,8 +14,8 @@ stat.table.header.day6=\u5468\u4E94
stat.table.header.day7=\u5468\u516D
stat.table.header.node=\u5B66\u7A0B\u6A21\u5757
stat.table.header.total=\u603B\u4F53
statistic.chart.intro=\u6B64\u56FE\u50CF\u663E\u793A\u6240\u6709\u7684\u8981\u6C42{0},\u57FA\u4E8E\u6BCF\u5929\u6240\u6709\u6709\u4EF7\u503C\u7684\u6570\u636E(\u81EA\u4ECE{1})
statistic.chart.intro=\u6B64\u56FE\u50CF\u663E\u793A\u6240\u6709\u7684\u8981\u6C42{0},\u57FA\u4E8E\u6BCF\u5929\u6240\u6709\u6709\u4EF7\u503C\u7684\u6570\u636E
statistic.chart.pernode.intro=\u6B64\u56FE\u663E\u793A\u4E86\u5728{0}\u4E2D\u70B9\u51FB\u5B66\u7A0B\u5143\u7D20\u7684\u6B21\u6570\u3002
statistic.chart.pernode.total.intro=\u6B64\u56FE\u6807\u663E\u793A\u4E86\u5728\u6307\u5B9A\u65F6\u95F4\u6BB5\u5185\u8BBF\u95EE\u5B66\u7A0B\u5143\u7D20\u7684\u6240\u6709\u8BB0\u5F55\u3002
statistic.intro=\u57FA\u4E8E\u6240\u6709\u6709\u6548\u7684\u5B66\u7A0B\u6570\u636E\uFF0C\u6B64\u7EDF\u8BA1\u663E\u793A\u4E86\u5B66\u7A0B\u5143\u7D20\u6BCF\u5929\u6240\u6709\u7684\u8BBF\u95EE\u8BB0\u5F55{\u81EA\u4ECE{0}\u8D77\u6BCF\u5929\u7684\u8BB0\u5F55}\u3002
statistic.intro=\u57FA\u4E8E\u6240\u6709\u6709\u6548\u7684\u5B66\u7A0B\u6570\u636E\uFF0C\u6B64\u7EDF\u8BA1\u663E\u793A\u4E86\u5B66\u7A0B\u5143\u7D20\u6BCF\u5929\u6240\u6709\u7684\u8BBF\u95EE\u8BB0\u5F55\u3002
statistic.title=\u6BCF\u65E5\u7EDF\u8BA1
......@@ -62,7 +62,7 @@ public class DayOfWeekStatisticManager implements IStatisticManager {
Calendar c = Calendar.getInstance(ureq.getLocale());
int firstDayOfWeek = c.getFirstDayOfWeek();
List<String> columnHeaders = new ArrayList<String>(7);
List<String> columnHeaders = new ArrayList<>(7);
for(int i=firstDayOfWeek; i<firstDayOfWeek+7; i++) {
int mod = i%7;
if (mod==0) {
......
......@@ -13,8 +13,8 @@ stat.table.header.day6=\u0627\u0644\u062C\u0645\u0639\u0629
stat.table.header.day7=\u0627\u0644\u0633\u0628\u062A
stat.table.header.node=\u0639\u0646\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631
stat.table.header.total=\u0627\u0644\u0645\u062C\u0645\u0648\u0639
statistic.chart.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A {0} \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630 {1}) \u0644\u0643\u0644 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639.
statistic.chart.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A {0} \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u062A\u0627\u062D\u0629 \u0644\u0643\u0644 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639.
statistic.chart.pernode.intro=.{0} \u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0641\u0649
statistic.chart.pernode.total.intro={0} \u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630).
statistic.intro=.\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630 {0}) \u0644\u0643\u0644 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639
statistic.chart.pernode.total.intro=\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 (\u0645\u0646\u0630).
statistic.intro=.\u064A\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0645\u062E\u0637\u0637 \u0643\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0645\u0642\u0631\u0631 \u0628\u0646\u0627\u0621\u0627\u064B \u0639\u0644\u0649 \u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0645\u0642\u0631\u0631 \u0627\u0644\u0645\u062A\u0627\u062D\u0629 \u0644\u0643\u0644 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639
statistic.title=\u0627\u0644\u0625\u062D\u0635\u0627\u0626\u064A\u0627\u062A \u0644\u0643\u0644 \u0623\u064A\u0627\u0645 \u0627\u0644\u0623\u0633\u0628\u0648\u0639
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment