diff --git a/HACKING.rst b/HACKING.rst index 082212cb7..f66b75f69 100644 --- a/HACKING.rst +++ b/HACKING.rst @@ -228,8 +228,6 @@ Microsoft Windows # Copy downloaded *.jar file to JAVA_HOME location: (e.g. C:\Program Files\Java\jdk1.7.0_80\jre\lib\ext) # Put downloaded *.jar file to Tomcat lib location: (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib) -* Download latest ``.war`` file from SourceForge.net (for PostgreSQL) and rename it to libreplan.war:: - # http://sourceforge.net/projects/libreplan/files/LibrePlan/ * Create database:: @@ -266,15 +264,12 @@ Microsoft Windows GRANT ALL PRIVILEGES ON DATABASE libreplan TO libreplan; -* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup:: - * Create an Environment Variable JAVA_HOME # You need to set it to your JDK installed directory * Configure Apache Tomcat Server - # Put your libreplan.war file to Apache Tomcat webapps folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\) # Go to (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\Catalina\localhost\) and create there libreplan.xml file with this lines of code: @@ -288,13 +283,7 @@ Microsoft Windows url="jdbc:postgresql://localhost/libreplan" /> -* Start Apache Tomcat server - - # Possible location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe - -* Go to http://localhost:8080/libreplan ======= -* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup * Download source code:: @@ -316,8 +305,12 @@ Microsoft Windows * Launch application:: - # cd libreplan-webapp - # mvn jetty:run + * Get *.war file from project folder (e.g ../libreplan/libreplan-webapp/target/libreplan-webapp.war) + * Rename it to libreplan.war + * Put your libreplan.war file to Apache Tomcat webapps folder (e.g. C:\Program Files\Apache Software Foundation\Tomcat 6.0\webapps\) + * Start Apache Tomcat server + + # Possible location: C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\Tomcat6.exe * Go to http://localhost:8080/libreplan-webapp/ diff --git a/INSTALL.rst b/INSTALL.rst index ab8a3d74b..8e14342fb 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -326,7 +326,7 @@ Microsoft Windows Instructions: -* Download and install latest Java Runtime Environment 7u79 (JRE7u79):: +* Download and install latest Java Runtime Environment 7u80 (JRE7u79):: # http://www.oracle.com/technetwork/java/javase/downloads/jre7-downloads-1880261.html @@ -367,7 +367,7 @@ Instructions: ON ALL TABLES IN SCHEMA public TO libreplan; -* Restore PostgreSQL dump - scripts/database/postgresql_1.4.1.backup:: +* Restore PostgreSQL / MySQL dump:: * Create an Environment Variable JRE_HOME diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java b/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java new file mode 100644 index 000000000..e95b248ea --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/common/daos/ILimitsDAO.java @@ -0,0 +1,39 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2015 LibrePlan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.business.common.daos; + +import org.libreplan.business.common.entities.Limits; + +import java.util.List; + +/** + * DAO interface for the Limits entity. + * Contract for {@link LimitsDAO} + * + * Created by + * @author Vova Perebykivskiy + * on 17.12.2015. + */ +public interface ILimitsDAO extends IGenericDAO { + List getAll(); + + Limits getUsersType(); + Limits getResourcesType(); +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java b/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java new file mode 100644 index 000000000..87a7c7565 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/common/daos/LimitsDAO.java @@ -0,0 +1,58 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2015 LibrePlan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.business.common.daos; + +import org.libreplan.business.common.entities.Limits; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * DAO for {@link Limits} + * + * Created by + * @author Vova Perebykivskiy + * on 24.09.15. + */ + +@Repository +public class LimitsDAO extends GenericDAOHibernate implements ILimitsDAO { + + @Override + public List getAll() { + return list(Limits.class); + } + + @Override + public Limits getUsersType() { + List list = list(Limits.class); + for (Limits item : list) + if (item.getType().equals("users")) return item; + return null; + } + + @Override + public Limits getResourcesType() { + List list = list(Limits.class); + for (Limits item : list) + if (item.getType().equals("workers+machines")) return item; + return null; + } +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/common/entities/Limits.java b/libreplan-business/src/main/java/org/libreplan/business/common/entities/Limits.java new file mode 100644 index 000000000..1b2a041d1 --- /dev/null +++ b/libreplan-business/src/main/java/org/libreplan/business/common/entities/Limits.java @@ -0,0 +1,53 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2015 LibrePlan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.business.common.entities; + +import org.libreplan.business.common.BaseEntity; + +/** + * Limits entity, represents a limits for any functionality. + * This class is intended to work as a Hibernate component. + * It represents the limit that can be modified only in database. + * + * Created by + * @author Vova Perebykivskiy + * on 17.12.2015. + */ +public class Limits extends BaseEntity{ + + private String type; + + private Integer value; + + + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + + public Integer getValue() { + return value; + } + public void setValue(Integer value) { + this.value = value; + } +} diff --git a/libreplan-business/src/main/java/org/libreplan/business/email/daos/EmailTemplateDAO.java b/libreplan-business/src/main/java/org/libreplan/business/email/daos/EmailTemplateDAO.java index efebb758a..d7ab0a0d6 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/email/daos/EmailTemplateDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/email/daos/EmailTemplateDAO.java @@ -30,7 +30,7 @@ import java.util.List; * * Created by * @author Vova Perebykivskiy - * on 24.09.15. + * on 24.09.2015. */ @Repository public class EmailTemplateDAO extends GenericDAOHibernate implements IEmailTemplateDAO{ diff --git a/libreplan-business/src/main/java/org/libreplan/business/email/daos/IEmailTemplateDAO.java b/libreplan-business/src/main/java/org/libreplan/business/email/daos/IEmailTemplateDAO.java index ab2fe1635..db40ffae4 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/email/daos/IEmailTemplateDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/email/daos/IEmailTemplateDAO.java @@ -30,7 +30,7 @@ import java.util.List; * * Created by * @author Vova Perebykivskiy - * on 29.09.15. + * on 29.09.2015. */ public interface IEmailTemplateDAO extends IGenericDAO{ diff --git a/libreplan-business/src/main/java/org/libreplan/business/email/entities/EmailTemplate.java b/libreplan-business/src/main/java/org/libreplan/business/email/entities/EmailTemplate.java index a4f6d2c10..6ba95b0dd 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/email/entities/EmailTemplate.java +++ b/libreplan-business/src/main/java/org/libreplan/business/email/entities/EmailTemplate.java @@ -29,7 +29,7 @@ import org.libreplan.business.settings.entities.Language; * * Created by * @author Vova Perebykivskiy - * on 29.09.15. + * on 29.09.2015. */ public class EmailTemplate extends BaseEntity { diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IResourceDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IResourceDAO.java index 3b3bf3bfe..9855b15ac 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IResourceDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IResourceDAO.java @@ -120,4 +120,6 @@ public interface IResourceDAO extends IIntegrationEntityDAO { */ List getWorkingHoursPerWorker(Integer year, Integer month); + Number getRowCount(); + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java index b75034983..913ed8702 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/IWorkerDAO.java @@ -36,7 +36,6 @@ import org.springframework.transaction.annotation.Transactional; * @author Fernando Bellas Permuy * @author Manuel Rego Casasnovas * @author Diego Pino Garcia - * */ public interface IWorkerDAO extends IIntegrationEntityDAO { diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/MachineDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/MachineDAO.java index 620fc72d3..062c859a8 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/MachineDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/MachineDAO.java @@ -23,6 +23,7 @@ package org.libreplan.business.resources.daos; import java.util.List; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.common.exceptions.InstanceNotFoundException; diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/ResourceDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/ResourceDAO.java index c4e155095..018040c33 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/ResourceDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/ResourceDAO.java @@ -27,6 +27,7 @@ import java.util.Iterator; import java.util.List; import org.hibernate.Query; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.labels.entities.Label; @@ -248,6 +249,11 @@ public class ResourceDAO extends IntegrationEntityDAO implements return result; } + @Override + public Number getRowCount() { + return (Number) getSession().createCriteria(Resource.class).setProjection(Projections.rowCount()).uniqueResult(); + } + private List toDTO(List rows) { List result = new ArrayList(); diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java index 9c52c4645..341fb01e6 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/daos/WorkerDAO.java @@ -26,6 +26,7 @@ import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.IntegrationEntityDAO; import org.libreplan.business.common.exceptions.InstanceNotFoundException; @@ -43,7 +44,6 @@ import org.springframework.transaction.annotation.Transactional; * @author Fernando Bellas Permuy * @author Manuel Rego Casasnovas * @author Diego Pino Garcia - * */ @Repository @Scope(BeanDefinition.SCOPE_SINGLETON) @@ -198,5 +198,4 @@ public class WorkerDAO extends IntegrationEntityDAO criteria.add(Restrictions.isNotNull("user")); return criteria.list(); } - } \ No newline at end of file diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java b/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java index a6ed0d376..1d868eb1b 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/daos/IUserDAO.java @@ -35,6 +35,7 @@ import org.libreplan.business.users.entities.User; * * @author Fernando Bellas Permuy * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ public interface IUserDAO extends IGenericDAO{ @@ -102,4 +103,5 @@ public interface IUserDAO extends IGenericDAO{ List findAll(); + Number getRowCount(); } diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java b/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java index b7cb401db..2f3bab8cf 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/daos/UserDAO.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; +import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.libreplan.business.common.daos.GenericDAOHibernate; import org.libreplan.business.common.exceptions.InstanceNotFoundException; @@ -44,6 +45,7 @@ import org.springframework.transaction.annotation.Transactional; * @author Fernando Bellas Permuy * @author Jacobo Aragunde Perez * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ @Repository public class UserDAO extends GenericDAOHibernate @@ -179,4 +181,8 @@ public class UserDAO extends GenericDAOHibernate return list(User.class); } + @Override + public Number getRowCount() { + return (Number) getSession().createCriteria(User.class).setProjection(Projections.rowCount()).uniqueResult(); + } } diff --git a/libreplan-business/src/main/resources/db.changelog-1.4.xml b/libreplan-business/src/main/resources/db.changelog-1.4.xml index 6535a3098..a92cccb40 100644 --- a/libreplan-business/src/main/resources/db.changelog-1.4.xml +++ b/libreplan-business/src/main/resources/db.changelog-1.4.xml @@ -1,7 +1,7 @@ @@ -14,9 +14,9 @@ Add foreign key constraint to new id_cost_category column on cost_category id + baseTableName="criterion" baseColumnNames="id_cost_category" + referencedTableName="cost_category" referencedColumnNames="id" + onDelete="SET NULL" /> @@ -25,11 +25,11 @@ + defaultValueBoolean="FALSE" /> + columnName="automatic_budget_enabled" + defaultNullValue="FALSE" + columnDataType="BOOLEAN" /> @@ -41,8 +41,32 @@ + baseTableName="configuration" baseColumnNames="automatic_budget_type_of_work_hours" + referencedTableName="type_of_work_hours" referencedColumnNames="id" /> + + + + + + + + + + + + + + + + INSERT INTO limits VALUES(0, 'users', 5); + INSERT INTO limits VALUES(1, 'workers+machines', 10); + diff --git a/libreplan-business/src/main/resources/libreplan-business-spring-config.xml b/libreplan-business/src/main/resources/libreplan-business-spring-config.xml index 4f00767e4..e8f7d79b7 100644 --- a/libreplan-business/src/main/resources/libreplan-business-spring-config.xml +++ b/libreplan-business/src/main/resources/libreplan-business-spring-config.xml @@ -100,6 +100,9 @@ org/libreplan/business/logs/entities/Logs.hbm.xml + + org/libreplan/business/common/entities/Limits.hbm.xml + diff --git a/libreplan-business/src/main/resources/org/libreplan/business/common/entities/Limits.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/common/entities/Limits.hbm.xml new file mode 100644 index 000000000..1d9b3807d --- /dev/null +++ b/libreplan-business/src/main/resources/org/libreplan/business/common/entities/Limits.hbm.xml @@ -0,0 +1,18 @@ + + + + + + + + + 100 + + + + + + + + + \ No newline at end of file diff --git a/libreplan-business/src/main/resources/org/libreplan/business/workreports/entities/WorkReports.hbm.xml b/libreplan-business/src/main/resources/org/libreplan/business/workreports/entities/WorkReports.hbm.xml index 72cdd1b13..78b9f849d 100644 --- a/libreplan-business/src/main/resources/org/libreplan/business/workreports/entities/WorkReports.hbm.xml +++ b/libreplan-business/src/main/resources/org/libreplan/business/workreports/entities/WorkReports.hbm.xml @@ -93,7 +93,7 @@ - + diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java index 5e62a9ed4..45f5b8da1 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java @@ -244,7 +244,8 @@ public class ConfigurationController extends GenericForwardComposer { if ( getSelectedConnector() != null && getSelectedConnector().getName().equals("E-mail") && isEmailFieldsValid() == false ) { - messages.showMessage(Level.ERROR, _("Check username/password/sender fields")); + messages.showMessage(Level.ERROR, _("Check all fields")); + } else { ConstraintChecker.isValid(configurationWindow); if (checkValidEntitySequenceRows()) { @@ -1297,7 +1298,8 @@ public class ConfigurationController extends GenericForwardComposer { key.equals(PredefinedConnectorProperties.JIRA_HOURS_TYPE) || key.equals(PredefinedConnectorProperties.HOST) || key.equals(PredefinedConnectorProperties.PORT) || - key.equals(PredefinedConnectorProperties.EMAIL_SENDER) ) { + key.equals(PredefinedConnectorProperties.EMAIL_SENDER) || + key.equals(PredefinedConnectorProperties.PROTOCOL) ) { ((InputElement) comp).setConstraint("no empty:" + _("cannot be empty")); } else if ( key @@ -1326,14 +1328,15 @@ public class ConfigurationController extends GenericForwardComposer { } private boolean isEmailFieldsValid(){ - if ( protocolsCombobox.getSelectedItem().getLabel().equals("STARTTLS") && - emailUsernameTextbox.getValue() != null && - emailPasswordTextbox.getValue() != null && - emailUsernameTextbox.getValue().length() != 0 && - emailPasswordTextbox.getValue().length() != 0 && - emailSenderTextbox.getValue().matches("^\\S+@\\S+\\.\\S+$") ) - return true; - - else return false; + if ( protocolsCombobox != null && protocolsCombobox.getSelectedItem() != null ){ + if ( protocolsCombobox.getSelectedItem().getLabel().equals("STARTTLS") && + emailUsernameTextbox.getValue() != null && + emailPasswordTextbox.getValue() != null && + emailUsernameTextbox.getValue().length() != 0 && + emailPasswordTextbox.getValue().length() != 0 && + emailSenderTextbox.getValue().matches("^\\S+@\\S+\\.\\S+$") ) + return true; + } + return false; } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/ILimitsModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/ILimitsModel.java new file mode 100644 index 000000000..36b35f8cb --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/ILimitsModel.java @@ -0,0 +1,38 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2015 LibrePlan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.common; + +import org.libreplan.business.common.entities.Limits; + +import java.util.List; + +/** + * Contract for {@link Limits} + * + * Created by + * @author Vova Perebykivskiy + * on 17.12.2015. + */ +public interface ILimitsModel { + List getAll(); + + Limits getUsersType(); + Limits getResourcesType(); +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java new file mode 100644 index 000000000..5ee7c81a4 --- /dev/null +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/LimitsModel.java @@ -0,0 +1,64 @@ +/* + * This file is part of LibrePlan + * + * Copyright (C) 2015 LibrePlan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package org.libreplan.web.common; + +import org.libreplan.business.common.daos.ILimitsDAO; +import org.libreplan.business.common.entities.Limits; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * Model for operations related to {@link Limits}. + * + * Created by + * @author Vova Perebykivskiy + * on 17.12.15. + */ + +@Service +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class LimitsModel implements ILimitsModel { + + @Autowired + private ILimitsDAO limitsDAO; + + @Override + @Transactional(readOnly = true) + public List getAll() { + return limitsDAO.getAll(); + } + + @Override + @Transactional(readOnly = true) + public Limits getUsersType() { + return limitsDAO.getUsersType(); + } + + @Override + @Transactional(readOnly = true) + public Limits getResourcesType() { + return limitsDAO.getResourcesType(); + } +} diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/email/IEmailTemplateModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/email/IEmailTemplateModel.java index 74740e622..0393363d5 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/email/IEmailTemplateModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/email/IEmailTemplateModel.java @@ -32,7 +32,7 @@ import java.util.List; * * Created by * @author Vova Perebykivskiy - * on 28.09.15. + * on 28.09.2015. */ public interface IEmailTemplateModel { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/IMachineModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/IMachineModel.java index 3458b5227..9ad7e649d 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/IMachineModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/IMachineModel.java @@ -34,7 +34,7 @@ import org.libreplan.business.resources.entities.Worker; import org.libreplan.web.common.IIntegrationEntityModel; import org.libreplan.web.resources.search.ResourcePredicate; -/* +/** * This interface contains the operations to create/edit a machine. * * Conversation state: the Machine instance and associated entities. @@ -107,5 +107,4 @@ public interface IMachineModel extends IIntegrationEntityModel { void confirmRemove(Machine machine) throws InstanceNotFoundException; void removeCalendar(); - } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java index c55db303c..6860100b3 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java @@ -31,8 +31,10 @@ import java.util.Set; import org.joda.time.LocalDate; import org.libreplan.business.calendars.entities.BaseCalendar; import org.libreplan.business.calendars.entities.ResourceCalendar; +import org.libreplan.business.common.entities.Limits; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; +import org.libreplan.business.resources.daos.IResourceDAO; import org.libreplan.business.resources.entities.Machine; import org.libreplan.web.calendars.BaseCalendarEditionController; import org.libreplan.web.calendars.IBaseCalendarModel; @@ -40,13 +42,16 @@ import org.libreplan.web.common.BaseCRUDController; import org.libreplan.web.common.ConstraintChecker; import org.libreplan.web.common.Level; import org.libreplan.web.common.Util; +import org.libreplan.web.common.ILimitsModel; import org.libreplan.web.common.components.bandboxsearch.BandboxMultipleSearch; import org.libreplan.web.common.components.finders.FilterPair; import org.libreplan.web.costcategories.ResourcesCostCategoryAssignmentController; import org.libreplan.web.resources.search.ResourcePredicate; import org.libreplan.web.resources.worker.CriterionsController; import org.libreplan.web.resources.worker.CriterionsMachineController; +import org.libreplan.web.resources.worker.IWorkerModel; import org.libreplan.web.resources.worker.WorkerCRUDController.LimitingResourceEnum; +import org.springframework.beans.factory.annotation.Autowired; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.CheckEvent; @@ -75,11 +80,19 @@ import org.zkoss.zul.api.Window; * Controller for {@link Machine} resource
* @author Diego Pino Garcia * @author Lorenzo Tilve Álvaro + * @author Vova Perebykivskiy */ public class MachineCRUDController extends BaseCRUDController { + @Autowired + private ILimitsModel limitsModel; + + @Autowired private IMachineModel machineModel; + @Autowired + private IResourceDAO resourceDAO; + private Component configurationUnits; private CriterionsMachineController criterionsController; @@ -149,9 +162,9 @@ public class MachineCRUDController extends BaseCRUDController { private void setupResourcesCostCategoryAssignmentController(Component comp) { Component costCategoryAssignmentContainer = - editWindow.getFellowIfAny("costCategoryAssignmentContainer"); + editWindow.getFellowIfAny("costCategoryAssignmentContainer"); resourcesCostCategoryAssignmentController = (ResourcesCostCategoryAssignmentController) - costCategoryAssignmentContainer.getVariable("assignmentController", true); + costCategoryAssignmentContainer.getVariable("assignmentController", true); } @Override @@ -447,11 +460,11 @@ public class MachineCRUDController extends BaseCRUDController { LocalDate finishDate = null; if (filterStartDate.getValue() != null) { startDate = LocalDate.fromDateFields(filterStartDate - .getValue()); + .getValue()); } if (filterFinishDate.getValue() != null) { finishDate = LocalDate.fromDateFields(filterFinishDate - .getValue()); + .getValue()); } final Listitem item = filterLimitingResource.getSelectedItem(); @@ -488,7 +501,7 @@ public class MachineCRUDController extends BaseCRUDController { private void setupFilterLimitingResourceListbox() { for(LimitingResourceEnum resourceEnum : - LimitingResourceEnum.getLimitingResourceFilterOptionList()) { + LimitingResourceEnum.getLimitingResourceFilterOptionList()) { Listitem item = new Listitem(); item.setParent(filterLimitingResource); item.setValue(resourceEnum); @@ -566,7 +579,7 @@ public class MachineCRUDController extends BaseCRUDController { row.addEventListener(Events.ON_CLICK, new EventListener() { @Override - public void onEvent(Event event) { + public void onEvent(Event event) { goToEditForm(machine); } }); @@ -611,4 +624,27 @@ public class MachineCRUDController extends BaseCRUDController { return machineModel.getMachine(); } + public boolean isCreateButtonDisabled(){ + Limits resourcesTypeLimit = limitsModel.getResourcesType(); + Integer resourcesCount = (Integer) resourceDAO.getRowCount(); + + if ( resourcesTypeLimit != null ) + if ( resourcesCount >= resourcesTypeLimit.getValue() ) + return true; + + return false; + } + + public String getShowCreateFormLabel(){ + Limits resourcesTypeLimit = limitsModel.getResourcesType(); + Integer resourcesCount = (Integer) resourceDAO.getRowCount(); + + int resourcesLeft = resourcesTypeLimit.getValue() - resourcesCount; + if ( resourcesTypeLimit != null ) + if ( resourcesCount >= resourcesTypeLimit.getValue() ) + return _("Machines limit reached"); + + return _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineModel.java index 3f83b5855..3b11c5bb0 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineModel.java @@ -402,5 +402,4 @@ public class MachineModel extends IntegrationEntityModel implements calendarToRemove = machine.getCalendar(); machine.setCalendar(null); } - } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/IWorkerModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/IWorkerModel.java index fbcceee94..ab11c7be7 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/IWorkerModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/IWorkerModel.java @@ -146,5 +146,4 @@ public interface IWorkerModel extends IIntegrationEntityModel { void setBoundUser(User user); User getBoundUserFromDB(Worker worker); - } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java index 0df7794c0..5a5169343 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java @@ -35,8 +35,10 @@ import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.libreplan.business.calendars.entities.BaseCalendar; import org.libreplan.business.calendars.entities.ResourceCalendar; +import org.libreplan.business.common.entities.Limits; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; +import org.libreplan.business.resources.daos.IResourceDAO; import org.libreplan.business.resources.entities.ResourceType; import org.libreplan.business.resources.entities.VirtualWorker; import org.libreplan.business.resources.entities.Worker; @@ -44,13 +46,14 @@ import org.libreplan.business.users.entities.User; import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.calendars.BaseCalendarEditionController; import org.libreplan.web.calendars.IBaseCalendarModel; -import org.libreplan.web.common.BaseCRUDController.CRUDControllerState; import org.libreplan.web.common.ConstraintChecker; import org.libreplan.web.common.IMessagesForUser; import org.libreplan.web.common.Level; import org.libreplan.web.common.MessagesForUser; import org.libreplan.web.common.OnlyOneVisible; import org.libreplan.web.common.Util; +import org.libreplan.web.common.ILimitsModel; +import org.libreplan.web.common.BaseCRUDController.CRUDControllerState; import org.libreplan.web.common.components.bandboxsearch.BandboxMultipleSearch; import org.libreplan.web.common.components.bandboxsearch.BandboxSearch; import org.libreplan.web.common.components.finders.FilterPair; @@ -98,6 +101,7 @@ import org.zkoss.zul.api.Window; * @author Óscar González Fernández * @author Lorenzo Tilve Álvaro * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ public class WorkerCRUDController extends GenericForwardComposer implements IWorkerCRUDControllerEntryPoints { @@ -105,6 +109,15 @@ public class WorkerCRUDController extends GenericForwardComposer implements @Autowired private IDBPasswordEncoderService dbPasswordEncoderService; + @Autowired + private ILimitsModel limitsModel; + + @Autowired + private IWorkerModel workerModel; + + @Autowired + private IResourceDAO resourceDAO; + @Resource private IUserCRUDController userCRUD; @@ -112,8 +125,6 @@ public class WorkerCRUDController extends GenericForwardComposer implements private Window editWindow; - private IWorkerModel workerModel; - private IURLHandlerRegistry URLHandlerRegistry; private OnlyOneVisible visibility; @@ -200,10 +211,10 @@ public class WorkerCRUDController extends GenericForwardComposer implements } public WorkerCRUDController(Window listWindow, Window editWindow, - Window editCalendarWindow, - IWorkerModel workerModel, - IMessagesForUser messages, - IWorkerCRUDControllerEntryPoints workerCRUD) { + Window editCalendarWindow, + IWorkerModel workerModel, + IMessagesForUser messages, + IWorkerCRUDControllerEntryPoints workerCRUD) { this.listWindow = listWindow; this.editWindow = editWindow; this.workerModel = workerModel; @@ -504,7 +515,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements Radio radio = new Radio(_(option.label)); if (option.equals(UserBindingOption.CREATE_NEW_USER) && !SecurityUtils - .isSuperuserOrUserInRoles(UserRole.ROLE_USER_ACCOUNTS)) { + .isSuperuserOrUserInRoles(UserRole.ROLE_USER_ACCOUNTS)) { radio.setDisabled(true); radio.setTooltiptext(_("You do not have permissions to create new users")); } @@ -524,7 +535,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements this.filterStartDate = (Datebox) listWindow .getFellowIfAny("filterStartDate"); this.filterLimitingResource = (Listbox) listWindow - .getFellowIfAny("filterLimitingResource"); + .getFellowIfAny("filterLimitingResource"); this.bdFilters = (BandboxMultipleSearch) listWindow .getFellowIfAny("bdFilters"); this.txtfilter = (Textbox) listWindow.getFellowIfAny("txtfilter"); @@ -534,9 +545,9 @@ public class WorkerCRUDController extends GenericForwardComposer implements private void setupResourcesCostCategoryAssignmentController(Component comp) { Component costCategoryAssignmentContainer = - editWindow.getFellowIfAny("costCategoryAssignmentContainer"); + editWindow.getFellowIfAny("costCategoryAssignmentContainer"); resourcesCostCategoryAssignmentController = (ResourcesCostCategoryAssignmentController) - costCategoryAssignmentContainer.getVariable("assignmentController", true); + costCategoryAssignmentContainer.getVariable("assignmentController", true); } private void editAsignedCriterions() { @@ -646,7 +657,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements } private Window getCurrentWindow() { - return editWindow; + return editWindow; } private void updateCalendarController() { @@ -912,7 +923,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements private void setupFilterLimitingResourceListbox() { for(LimitingResourceEnum resourceEnum : - LimitingResourceEnum.getLimitingResourceFilterOptionList()) { + LimitingResourceEnum.getLimitingResourceFilterOptionList()) { Listitem item = new Listitem(); item.setParent(filterLimitingResource); item.setValue(resourceEnum); @@ -1010,7 +1021,7 @@ public class WorkerCRUDController extends GenericForwardComposer implements row.addEventListener(Events.ON_CLICK, new EventListener() { @Override - public void onEvent(Event event) { + public void onEvent(Event event) { goToEditForm(worker); } }); @@ -1054,19 +1065,19 @@ public class WorkerCRUDController extends GenericForwardComposer implements String title; switch (state) { - case CREATE: - if (StringUtils.isEmpty(humanId)) { - title = _("Create {0}", entityType); - } else { - title = _("Create {0}: {1}", entityType, humanId); - } - break; - case EDIT: - title = _("Edit {0}: {1}", entityType, humanId); - break; - default: - throw new IllegalStateException( - "You should be in creation or edition mode to use this method"); + case CREATE: + if (StringUtils.isEmpty(humanId)) { + title = _("Create {0}", entityType); + } else { + title = _("Create {0}: {1}", entityType, humanId); + } + break; + case EDIT: + title = _("Edit {0}: {1}", entityType, humanId); + break; + default: + throw new IllegalStateException( + "You should be in creation or edition mode to use this method"); } ((Caption) editWindow.getFellow("caption")).setLabel(title); } @@ -1159,4 +1170,27 @@ public class WorkerCRUDController extends GenericForwardComposer implements return ""; } + public boolean isCreateButtonDisabled(){ + Limits resourcesTypeLimit = limitsModel.getResourcesType(); + Integer resourcesCount = (Integer) resourceDAO.getRowCount(); + + if ( resourcesTypeLimit != null ) + if ( resourcesCount >= resourcesTypeLimit.getValue() ) + return true; + + return false; + } + + public String getShowCreateFormLabel(){ + Limits resourcesTypeLimit = limitsModel.getResourcesType(); + Integer resourcesCount = (Integer) resourceDAO.getRowCount(); + + int resourcesLeft = resourcesTypeLimit.getValue() - resourcesCount; + if ( resourcesTypeLimit != null ) + if ( resourcesCount >= resourcesTypeLimit.getValue() ) + return _("Workers limit reached"); + + return _("Create") + " ( " + resourcesLeft + " " + _("left") + " )"; + } + } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java index 3ad9a9265..aa82fdd70 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java @@ -49,6 +49,8 @@ import org.libreplan.business.planner.daos.IDayAssignmentDAO; import org.libreplan.business.planner.daos.IResourceAllocationDAO; import org.libreplan.business.resources.daos.ICriterionDAO; import org.libreplan.business.resources.daos.IResourceDAO; +import org.libreplan.business.resources.daos.IWorkerDAO; +import org.libreplan.business.resources.daos.WorkerDAO; import org.libreplan.business.resources.entities.Criterion; import org.libreplan.business.resources.entities.CriterionSatisfaction; import org.libreplan.business.resources.entities.CriterionWithItsType; @@ -81,6 +83,7 @@ import org.springframework.transaction.annotation.Transactional; * @author Fernando Bellas Permuy * @author Diego Pino García * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -96,6 +99,9 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel @Autowired private IBaseCalendarDAO baseCalendarDAO; + @Autowired + private IWorkerDAO workerDAO; + private final ICriterionType[] laboralRelatedTypes = { PredefinedCriterionTypes.LOCATION, PredefinedCriterionTypes.CATEGORY, PredefinedCriterionTypes.SKILL }; @@ -696,5 +702,4 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel } return null; } - } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/IUserModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/IUserModel.java index 86023176e..8d389db45 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/IUserModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/IUserModel.java @@ -34,6 +34,7 @@ import org.libreplan.business.users.entities.UserRole; * * @author Jacobo Aragunde Perez * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ public interface IUserModel { @@ -134,4 +135,5 @@ public interface IUserModel { List getAllProfiles(); + Number getRowCount(); } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java index da39fc474..775f3ee32 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java @@ -32,6 +32,7 @@ import java.util.List; import javax.annotation.Resource; import org.apache.commons.logging.LogFactory; +import org.libreplan.business.common.entities.Limits; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.common.exceptions.ValidationException; import org.libreplan.business.resources.entities.Worker; @@ -40,12 +41,14 @@ import org.libreplan.business.users.entities.User; import org.libreplan.business.users.entities.User.UserAuthenticationType; import org.libreplan.business.users.entities.UserRole; import org.libreplan.web.common.BaseCRUDController; +import org.libreplan.web.common.ILimitsModel; import org.libreplan.web.common.Util; import org.libreplan.web.common.entrypoints.EntryPointsHandler; import org.libreplan.web.common.entrypoints.IURLHandlerRegistry; import org.libreplan.web.resources.worker.IWorkerCRUDControllerEntryPoints; import org.libreplan.web.security.SecurityUtils; import org.libreplan.web.users.bootstrap.PredefinedUsers; +import org.springframework.beans.factory.annotation.Autowired; import org.zkoss.zk.ui.Component; import org.zkoss.zk.ui.WrongValueException; import org.zkoss.zk.ui.event.Event; @@ -61,12 +64,15 @@ import org.zkoss.zul.RowRenderer; import org.zkoss.zul.Textbox; import org.zkoss.zul.api.Groupbox; +import static org.libreplan.web.I18nHelper._; + /** * Controller for CRUD actions over a {@link User} * * @author Jacobo Aragunde Perez * @author Manuel Rego Casasnovas * @author Javier Moran Rua + * @author Vova Perebykivskiy */ @SuppressWarnings("serial") public class UserCRUDController extends BaseCRUDController implements @@ -77,6 +83,10 @@ public class UserCRUDController extends BaseCRUDController implements @Resource private IWorkerCRUDControllerEntryPoints workerCRUD; + @Autowired + private ILimitsModel limitsModel; + + @Autowired private IUserModel userModel; private Textbox passwordBox; @@ -89,6 +99,8 @@ public class UserCRUDController extends BaseCRUDController implements private Combobox profilesCombo; + private Button showCreateForm; + private IURLHandlerRegistry URLHandlerRegistry; private RowRenderer usersRenderer = new RowRenderer() { @@ -107,16 +119,16 @@ public class UserCRUDController extends BaseCRUDController implements Button[] buttons = Util.appendOperationsAndOnClickEvent(row, new EventListener() { - @Override - public void onEvent(Event event) throws Exception { - goToEditForm(user); - } - }, new EventListener() { - @Override - public void onEvent(Event event) throws Exception { - confirmDelete(user); - } - }); + @Override + public void onEvent(Event event) throws Exception { + goToEditForm(user); + } + }, new EventListener() { + @Override + public void onEvent(Event event) throws Exception { + confirmDelete(user); + } + }); // Disable remove button for default admin as it's mandatory if (isDefaultAdmin(user)) { @@ -248,7 +260,7 @@ public class UserCRUDController extends BaseCRUDController implements userModel.setPassword(password); //update the constraint on the confirmation password box ((Textbox)editWindow.getFellowIfAny("passwordConfirmation")). - clearErrorMessage(true); + clearErrorMessage(true); } public Constraint validatePasswordConfirmation() { @@ -370,11 +382,11 @@ public class UserCRUDController extends BaseCRUDController implements Button removeButton = Util .createRemoveButton(new EventListener() { - @Override - public void onEvent(Event event) throws Exception { - removeRole(role); - } - }); + @Override + public void onEvent(Event event) throws Exception { + removeRole(role); + } + }); removeButton.setDisabled(areRolesAndProfilesDisabled() || role.equals(UserRole.ROLE_BOUND_USER) || isUserDefaultAdmin()); @@ -491,4 +503,23 @@ public class UserCRUDController extends BaseCRUDController implements } } + public boolean isCreateButtonDisabled(){ + Limits usersTypeLimit = limitsModel.getUsersType(); + Integer usersCount = (Integer) userModel.getRowCount(); + if (usersTypeLimit != null) + if ( usersCount >= usersTypeLimit.getValue() ) + return true; + return false; + } + + public String getShowCreateFormLabel(){ + Limits usersTypeLimit = limitsModel.getUsersType(); + Integer usersCount = (Integer) userModel.getRowCount(); + int usersLeft = usersTypeLimit.getValue() - usersCount; + if (usersTypeLimit != null) + if ( usersCount >= usersTypeLimit.getValue() ) + return _("User limit reached"); + + return _("Create") + " ( " + usersLeft + " " + _("left") + " )"; + } } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserModel.java index c9e9bbf4f..a78e8c38c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/users/UserModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/users/UserModel.java @@ -50,6 +50,7 @@ import org.springframework.transaction.annotation.Transactional; * @author Jacobo Aragunde Perez * @author Susana Montes Pedreira * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ @Service @Scope(BeanDefinition.SCOPE_PROTOTYPE) @@ -275,4 +276,11 @@ public class UserModel implements IUserModel { return profileDAO.listSorted(); } + + @Override + @Transactional(readOnly = true) + public Number getRowCount() { + return userDAO.getRowCount(); + } + } diff --git a/libreplan-webapp/src/main/resources/i18n/keys.pot b/libreplan-webapp/src/main/resources/i18n/keys.pot index abbce181b..2255f22e5 100644 --- a/libreplan-webapp/src/main/resources/i18n/keys.pot +++ b/libreplan-webapp/src/main/resources/i18n/keys.pot @@ -8631,6 +8631,9 @@ msgstr "" #: libreplan-webapp/src/main/webapp/advance/_listAdvanceTypes.zul:33 #: libreplan-webapp/src/main/webapp/unittypes/_listUnitTypes.zul:32 #: libreplan-webapp/src/main/webapp/qualityforms/_listQualityForm.zul:58 +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:523 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:640 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:1187 msgid "Create" msgstr "" @@ -9287,3 +9290,25 @@ msgstr "" #: libreplan-webapp/src/main/webapp/dashboard/_pipeline.zul:2 msgid "Show archived column data" msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:520 +msgid "User limit reached" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/users/UserCRUDController.java:523 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:640 +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:1187 +msgid "left" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerCRUDController.java:1178 +msgid "Workers limit reached" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/resources/machine/MachineCRUDController.java:631 +msgid "Machines limit reached" +msgstr "" + +#: libreplan-webapp/src/main/java/org/libreplan/web/common/ConfigurationController.java:247 +msgid "Check fields" +msgstr "" \ No newline at end of file diff --git a/libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul b/libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul index 81b876387..13697807c 100644 --- a/libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul +++ b/libreplan-webapp/src/main/webapp/resources/machine/_listMachines.zul @@ -40,6 +40,7 @@ diff --git a/libreplan-webapp/src/main/webapp/resources/worker/_list.zul b/libreplan-webapp/src/main/webapp/resources/worker/_list.zul index 66c72cba3..bd1f71b71 100644 --- a/libreplan-webapp/src/main/webapp/resources/worker/_list.zul +++ b/libreplan-webapp/src/main/webapp/resources/worker/_list.zul @@ -42,6 +42,7 @@ diff --git a/libreplan-webapp/src/main/webapp/users/_listUsers.zul b/libreplan-webapp/src/main/webapp/users/_listUsers.zul index dfc42e57c..3de9d2643 100644 --- a/libreplan-webapp/src/main/webapp/users/_listUsers.zul +++ b/libreplan-webapp/src/main/webapp/users/_listUsers.zul @@ -35,6 +35,7 @@ diff --git a/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/workreports/WorkReportServiceTest.java b/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/workreports/WorkReportServiceTest.java index 88e2b2876..d54ef6e30 100644 --- a/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/workreports/WorkReportServiceTest.java +++ b/libreplan-webapp/src/test/java/org/libreplan/web/test/ws/workreports/WorkReportServiceTest.java @@ -45,6 +45,9 @@ import javax.annotation.Resource; import javax.xml.datatype.XMLGregorianCalendar; import org.hibernate.SessionFactory; +import org.hibernate.StatelessSession; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Restrictions; import org.joda.time.LocalDate; import org.joda.time.LocalTime; import org.junit.Test; @@ -92,6 +95,7 @@ import org.springframework.transaction.annotation.Transactional; * Tests for {@link IWorkReportService}. * * @author Manuel Rego Casasnovas + * @author Vova Perebykivskiy */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { BUSINESS_SPRING_CONFIG_FILE, @@ -576,11 +580,25 @@ public class WorkReportServiceTest { instanceConstraintViolationsListDTO.instanceConstraintViolationsList .size(), equalTo(0)); - List workReports = workReportDAO.getAll(); + /** + * Default code that was before was not working with MySQL + * and works perfect with PostgreSQL + * For example: List workReports = workReportDAO.getAll(); + * was returning 0 but COUNT in DB was 1 + * Also set workReportLines in WorkReports.hbm.xml has been changed to fetch='join' + * Possible reason: Hibernate 4.3.11.Final bug / caching + */ + + StatelessSession statelessSession = sessionFactory.openStatelessSession(); + + List workReports = statelessSession.createCriteria(WorkReport.class) + .addOrder(Order.asc("code")).list(); + assertThat(workReports.size(), equalTo(previous + 1)); - WorkReport imported = workReportDAO - .findExistingEntityByCode(workReportDTO.code); + WorkReport imported = (WorkReport) statelessSession.createCriteria(WorkReport.class) + .add(Restrictions.eq("code", workReportDTO.code.trim()).ignoreCase()).uniqueResult(); + assertThat(imported.getDate(), equalTo(date)); List importedLines = new ArrayList( @@ -600,6 +618,7 @@ public class WorkReportServiceTest { WorkReportLine line = importedLines.remove(0); assertThat(line.getDate().getTime(), equalTo(asTime(each.getDate()))); } + statelessSession.close(); } private long asTime(XMLGregorianCalendar date2) {