dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #29260
[Branch ~dhis2-devs-core/dhis2/trunk] Rev 14754: Implemented function for constraining users on dimensions for analytics
------------------------------------------------------------
revno: 14754
committer: Lars Helge Øverland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2014-04-08 21:36:25 +0200
message:
Implemented function for constraining users on dimensions for analytics
modified:
dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserCredentials.java
dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java
dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/UserCredentials.hbm.xml
dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/AddUserAction.java
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/javascript/user.js
dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm
--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk
Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserCredentials.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserCredentials.java 2014-04-08 18:25:25 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserCredentials.java 2014-04-08 19:36:25 +0000
@@ -98,6 +98,7 @@
/**
* Category option group set dimensions to constrain data analytics aggregation.
*/
+ @Scanned
private Set<CategoryOptionGroupSet> cogsDimensionConstraints = new HashSet<CategoryOptionGroupSet>();
/**
=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java'
--- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2014-04-08 18:25:25 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java 2014-04-08 19:36:25 +0000
@@ -295,16 +295,13 @@
{
User user = currentUserService.getCurrentUser();
- if ( params == null || user == null || user.getUserCredentials() == null )
- {
- return;
- }
-
- if ( !user.getUserCredentials().hasDimensionConstraints() )
- {
- return;
- }
-
+ if ( params == null || user == null ||
+ user.getUserCredentials() == null || !user.getUserCredentials().hasDimensionConstraints() )
+ {
+ log.debug( "No dimension constraint applied" );
+ return;
+ }
+
Set<DimensionalObject> dimensionConstraints = user.getUserCredentials().getDimensionConstraints();
for ( DimensionalObject dimension : dimensionConstraints )
@@ -338,7 +335,9 @@
DimensionalObject constraint = new BaseDimensionalObject( dimension.getDimension(),
dimension.getDimensionType(), null, dimension.getDisplayName(), canReadItems );
- params.getFilters().add( constraint );
+ params.getFilters().add( constraint );
+
+ log.info( "User: " + user.getUsername() + " constrained by dimension: " + constraint.getDimension() );
}
}
=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/UserCredentials.hbm.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/UserCredentials.hbm.xml 2014-03-05 05:52:03 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/org/hisp/dhis/user/hibernate/UserCredentials.hbm.xml 2014-04-08 19:36:25 +0000
@@ -33,7 +33,15 @@
<set name="userAuthorityGroups" table="userrolemembers" cascade="save-update">
<cache usage="read-write" />
<key column="userid" foreign-key="fk_userrolemembers_userid" />
- <many-to-many column="userroleid" class="org.hisp.dhis.user.UserAuthorityGroup" foreign-key="fk_userrolemembers_userroleid" />
+ <many-to-many column="userroleid" class="org.hisp.dhis.user.UserAuthorityGroup"
+ foreign-key="fk_userrolemembers_userroleid" />
+ </set>
+
+ <set name="cogsDimensionConstraints" table="users_cogsdimensionconstraints">
+ <cache usage="read-write" />
+ <key column="userid" foreign-key="fk_users_cogsconstraints_userid" />
+ <many-to-many column="categoryoptiongroupsetid" class="org.hisp.dhis.dataelement.CategoryOptionGroupSet"
+ foreign-key="fk_fk_users_cogsconstraints_categoryoptiongroupsetid" />
</set>
<property name="lastLogin" />
=== modified file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml'
--- dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml 2014-04-06 09:44:34 +0000
+++ dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml 2014-04-08 19:36:25 +0000
@@ -368,7 +368,9 @@
<cache name="org.hisp.dhis.user.UserGroup.userGroupAccesses" maxElementsInMemory="200" />
- <cache name="org.hisp.dhis.user.UserCredentials.userAuthorityGroups" maxElementsInMemory="200" />
+ <cache name="org.hisp.dhis.user.UserCredentials.userAuthorityGroups" maxElementsInMemory="2000" />
+
+ <cache name="org.hisp.dhis.user.UserCredentials.cogsDimensionConstraints" maxElementsInMemory="2000" />
<cache name="org.hisp.dhis.user.UserAuthorityGroup.authorities" maxElementsInMemory="500" />
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/AddUserAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/AddUserAction.java 2014-04-06 12:57:33 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/AddUserAction.java 2014-04-08 19:36:25 +0000
@@ -28,11 +28,16 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import com.google.common.collect.Lists;
-import com.opensymphony.xwork2.Action;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import org.apache.struts2.ServletActionContext;
import org.hisp.dhis.api.utils.ContextUtils;
import org.hisp.dhis.attribute.AttributeService;
+import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
+import org.hisp.dhis.dataelement.DataElementCategoryService;
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.oust.manager.SelectionTreeManager;
import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager;
@@ -52,9 +57,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import com.opensymphony.xwork2.Action;
/**
* @author Torgeir Lorange Ostby
@@ -89,9 +92,6 @@
this.userService = userService;
}
- @Autowired
- private UserGroupService userGroupService;
-
private SecurityService securityService;
public void setSecurityService( SecurityService securityService )
@@ -113,6 +113,12 @@
this.attributeService = attributeService;
}
+ @Autowired
+ private UserGroupService userGroupService;
+
+ @Autowired
+ private DataElementCategoryService categoryService;
+
// -------------------------------------------------------------------------
// Input & Output
// -------------------------------------------------------------------------
@@ -213,20 +219,27 @@
this.localeDb = localeDb;
}
- private List<String> urSelected = Lists.newArrayList();
+ private List<String> urSelected = new ArrayList<String>();
public void setUrSelected( List<String> urSelected )
{
this.urSelected = urSelected;
}
- private List<String> ugSelected = Lists.newArrayList();
+ private List<String> ugSelected = new ArrayList<String>();
public void setUgSelected( List<String> ugSelected )
{
this.ugSelected = ugSelected;
}
+ private List<String> dcSelected = new ArrayList<String>();
+
+ public void setDcSelected( List<String> dcSelected )
+ {
+ this.dcSelected = dcSelected;
+ }
+
private List<String> jsonAttributeValues;
public void setJsonAttributeValues( List<String> jsonAttributeValues )
@@ -315,6 +328,16 @@
userCredentials.setUserAuthorityGroups( userAuthorityGroups );
+ // ---------------------------------------------------------------------
+ // Dimension constraints
+ // ---------------------------------------------------------------------
+
+ for ( String id : dcSelected )
+ {
+ CategoryOptionGroupSet cogs = categoryService.getCategoryOptionGroupSet( id );
+ userCredentials.getCogsDimensionConstraints().add( cogs );
+ }
+
userService.addUser( user );
userService.addUserCredentials( userCredentials );
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java 2014-04-06 12:57:33 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/java/org/hisp/dhis/user/action/UpdateUserAction.java 2014-04-08 19:36:25 +0000
@@ -28,9 +28,14 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-import com.google.common.collect.Lists;
-import com.opensymphony.xwork2.Action;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import org.hisp.dhis.attribute.AttributeService;
+import org.hisp.dhis.dataelement.CategoryOptionGroupSet;
+import org.hisp.dhis.dataelement.DataElementCategoryService;
import org.hisp.dhis.organisationunit.OrganisationUnit;
import org.hisp.dhis.oust.manager.SelectionTreeManager;
import org.hisp.dhis.ouwt.manager.OrganisationUnitSelectionManager;
@@ -49,9 +54,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+import com.opensymphony.xwork2.Action;
/**
* @author Torgeir Lorange Ostby
@@ -70,9 +73,6 @@
this.userService = userService;
}
- @Autowired
- private UserGroupService userGroupService;
-
private PasswordManager passwordManager;
public void setPasswordManager( PasswordManager passwordManager )
@@ -108,6 +108,12 @@
this.attributeService = attributeService;
}
+ @Autowired
+ private UserGroupService userGroupService;
+
+ @Autowired
+ private DataElementCategoryService categoryService;
+
// -------------------------------------------------------------------------
// Input & Output
// -------------------------------------------------------------------------
@@ -175,20 +181,27 @@
this.localeDb = localeDb;
}
- private List<String> urSelected = Lists.newArrayList();
+ private List<String> urSelected = new ArrayList<String>();
public void setUrSelected( List<String> urSelected )
{
this.urSelected = urSelected;
}
- private List<String> ugSelected = Lists.newArrayList();
+ private List<String> ugSelected = new ArrayList<String>();
public void setUgSelected( List<String> ugSelected )
{
this.ugSelected = ugSelected;
}
+ private List<String> dcSelected = new ArrayList<String>();
+
+ public void setDcSelected( List<String> dcSelected )
+ {
+ this.dcSelected = dcSelected;
+ }
+
private List<String> jsonAttributeValues;
public void setJsonAttributeValues( List<String> jsonAttributeValues )
@@ -270,6 +283,18 @@
userCredentials.setUserAuthorityGroups( userAuthorityGroups );
+ // ---------------------------------------------------------------------
+ // Dimension constraints
+ // ---------------------------------------------------------------------
+
+ userCredentials.getCogsDimensionConstraints().clear();
+
+ for ( String id : dcSelected )
+ {
+ CategoryOptionGroupSet cogs = categoryService.getCategoryOptionGroupSet( id );
+ userCredentials.getCogsDimensionConstraints().add( cogs );
+ }
+
userService.updateUserCredentials( userCredentials );
userService.updateUser( user );
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties 2014-04-08 11:37:59 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/resources/org/hisp/dhis/user/i18n_module.properties 2014-04-08 19:36:25 +0000
@@ -326,4 +326,8 @@
enable=Enable
data_capture_maintenance_org_units=Data capture and maintenance organisation units
data_output_analysis_org_units=Data output and analysis organisation units
-data_capture_organisation_unit_required_for_user=User must be assigned to at least one data capture organisation unit
\ No newline at end of file
+data_capture_organisation_unit_required_for_user=User must be assigned to at least one data capture organisation unit
+available_dimension_restrictions_for_data_analytics=Available dimension restrictions for data analytics
+selected_dimension_restrictions_for_data_analytics=Selected dimension restrictions for data analytics
+show_more_options=Show more options
+show_less_options=Show less options
\ No newline at end of file
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm 2014-04-07 02:08:51 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/addUserForm.vm 2014-04-08 19:36:25 +0000
@@ -3,6 +3,7 @@
validation2('addUserForm', function( form ) {
jQuery("#urSelected").children().attr("selected", "selected");
jQuery("#ugSelected").children().attr("selected", "selected");
+ jQuery("#dcSelected").children().attr("selected", "selected");
if( $('#orgUnitTree').find('.selected').size() == 0 ) {
setHeaderDelayMessage('$encoder.jsEncode( $i18n.getString( "data_capture_organisation_unit_required_for_user" ) )');
@@ -41,6 +42,13 @@
search: $('#ugAvailableSearch'),
iterator: 'userGroups'
});
+
+ $('#dcAvailable').selected({
+ url: '../api/categoryOptionGroupSets.json',
+ target: $('#dcSelected'),
+ search: $('#dcAvailableSearch'),
+ iterator: 'categoryOptionGroupSets'
+ });
});
</script>
@@ -160,13 +168,7 @@
"i18n_selected": "selected_roles"
})
-#jqSelected({
- "prefix": "ug",
- "i18n_available": "available_user_groups",
- "i18n_selected": "selected_user_groups"
-})
-
-<table>
+<table style="margin-bottom: 20px;">
<tr>
<th>$i18n.getString( "data_capture_maintenance_org_units" )</th>
<th></th>
@@ -183,6 +185,26 @@
</tr>
</table>
+<div id="showMoreOptions" style="margin-bottom: 20px;"><a href="javascript:showUserOptions()">$i18n.getString( "show_more_options" )</a></div>
+
+<div id="moreOptions" style="display:none">
+
+#jqSelected({
+ "prefix": "ug",
+ "i18n_available": "available_user_groups",
+ "i18n_selected": "selected_user_groups"
+})
+
+#jqSelected({
+ "prefix": "dc",
+ "i18n_available": "available_dimension_restrictions_for_data_analytics",
+ "i18n_selected": "selected_dimension_restrictions_for_data_analytics"
+})
+
+<div id="showLessOptions" style="margin-bottom: 20px;"><a href="javascript:showUserOptions()">$i18n.getString( "show_less_options" )</a></div>
+
+</div>
+
<p>
<input type="submit" value="$i18n.getString( 'add' )" style="width:10em" />
<input type="button" id="cancel" value="$i18n.getString( 'cancel' )" style="width:10em" />
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/javascript/user.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/javascript/user.js 2014-02-14 14:09:37 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/javascript/user.js 2014-04-08 19:36:25 +0000
@@ -156,3 +156,9 @@
});
}
}
+
+function showUserOptions()
+{
+ $( "#showMoreOptions" ).toggle();
+ $( "#moreOptions" ).toggle();
+}
=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm 2014-04-07 07:19:13 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-user/src/main/webapp/dhis-web-maintenance-user/updateUserForm.vm 2014-04-08 19:36:25 +0000
@@ -8,6 +8,7 @@
validation2('updateUserForm', function( form ) {
jQuery("#urSelected").children().attr("selected", "selected");
jQuery("#ugSelected").children().attr("selected", "selected");
+ jQuery("#dcSelected").children().attr("selected", "selected");
if( $('#orgUnitTree').find('.selected').size() == 0 ) {
setHeaderDelayMessage('$i18n.getString( "data_capture_organisation_unit_required_for_user" )');
@@ -49,6 +50,13 @@
search: $('#ugAvailableSearch'),
iterator: 'userGroups'
});
+
+ $('#dcAvailable').selected({
+ url: '../api/categoryOptionGroupSets.json',
+ target: $('#dcSelected'),
+ search: $('#dcAvailableSearch'),
+ iterator: 'categoryOptionGroupSets'
+ });
});
</script>
@@ -153,14 +161,7 @@
"objects": $userCredentials.userAuthorityGroups
})
-#jqSelected({
- "prefix": "ug",
- "i18n_available": "available_user_groups",
- "i18n_selected": "selected_user_groups",
- "objects": $user.groups
-})
-
-<table>
+<table style="margin-bottom: 20px;">
<tr>
<th>$i18n.getString( "data_capture_maintenance_org_units" )</th>
<th></th>
@@ -177,6 +178,28 @@
</tr>
</table>
+<div id="showMoreOptions" style="margin-bottom: 20px;"><a href="javascript:showUserOptions()">$i18n.getString( "show_more_options" )</a></div>
+
+<div id="moreOptions" style="display:none">
+
+#jqSelected({
+ "prefix": "ug",
+ "i18n_available": "available_user_groups",
+ "i18n_selected": "selected_user_groups",
+ "objects": $user.groups
+})
+
+#jqSelected({
+ "prefix": "dc",
+ "i18n_available": "available_dimension_restrictions_for_data_analytics",
+ "i18n_selected": "selected_dimension_restrictions_for_data_analytics",
+ "objects": $userCredentials.cogsDimensionConstraints
+})
+
+<div id="showLessOptions" style="margin-bottom: 20px;"><a href="javascript:showUserOptions()">$i18n.getString( "show_less_options" )</a></div>
+
+</div>
+
<p>
<input type="submit" value="$i18n.getString( 'save' )" style="width:10em" />
<input type="button" id="cancel" value="$i18n.getString( 'cancel' )" style="width:10em" />