=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/CurrentUserController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/CurrentUserController.java 2014-09-29 18:38:31 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/user/CurrentUserController.java 2014-10-21 22:42:27 +0000 @@ -37,6 +37,7 @@ import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -55,6 +56,7 @@ import org.hisp.dhis.dataset.DataSet; import org.hisp.dhis.dataset.DataSetService; import org.hisp.dhis.dxf2.utils.JacksonUtils; +import org.hisp.dhis.hibernate.exception.UpdateAccessDeniedException; import org.hisp.dhis.i18n.I18nService; import org.hisp.dhis.interpretation.Interpretation; import org.hisp.dhis.interpretation.InterpretationService; @@ -67,6 +69,7 @@ import org.hisp.dhis.system.util.TextUtils; import org.hisp.dhis.user.CurrentUserService; import org.hisp.dhis.user.User; +import org.hisp.dhis.user.UserGroup; import org.hisp.dhis.user.UserGroupService; import org.hisp.dhis.user.UserService; import org.hisp.dhis.user.UserSettingService; @@ -693,4 +696,83 @@ response.setContentType( MediaType.APPLICATION_JSON_VALUE ); JacksonUtils.toJson( response.getOutputStream(), forms ); } + + @RequestMapping( method = RequestMethod.POST, value = "/groups" ) + public void joinUserGroup( + HttpServletResponse response, @RequestParam( value = "groupUid", required = true ) String groupUid ) + throws NotAuthenticatedException + { + User currentUser = currentUserService.getCurrentUser(); + + if ( currentUser == null ) + { + throw new NotAuthenticatedException(); + } + + UserGroup group = manager.get( UserGroup.class, groupUid ); + + if ( group == null ) + { + ContextUtils.notFoundResponse( response, "UserGroup does not exist: " + groupUid ); + return; + } + + Collection userGroups = currentUser.getGroups(); + + if ( userGroups.contains( group ) ) + { + ContextUtils.okResponse( response, "Already a member of this group." ); + return; + } + + if ( !aclService.canUpdate( currentUser, group ) ) + { + throw new UpdateAccessDeniedException( "You don't have permissions modify this group." ); + } + + group.addUser( currentUser ); + + manager.update( group ); + + ContextUtils.okResponse( response, "Joined group." ); + } + + @RequestMapping( method = RequestMethod.DELETE, value = "/groups/{uid}" ) + public void leaveUserGroup( HttpServletResponse response, @PathVariable( "uid" ) String groupUid ) + throws NotAuthenticatedException + { + User currentUser = currentUserService.getCurrentUser(); + + if ( currentUser == null ) + { + throw new NotAuthenticatedException(); + } + + UserGroup group = manager.get( UserGroup.class, groupUid ); + + if ( group == null ) + { + ContextUtils.notFoundResponse( response, "UserGroup does not exist: " + groupUid ); + return; + } + + Collection userGroups = currentUser.getGroups(); + + if ( !userGroups.contains( group ) ) + { + ContextUtils.okResponse( response, "Not a member of this UserGroup." ); + return; + } + + if ( !aclService.canUpdate( currentUser, group ) ) + { + throw new UpdateAccessDeniedException( "You don't have permissions modify this group." ); + } + + group.removeUser( currentUser ); + + manager.update( group ); + + ContextUtils.okResponse( response, "Left group." ); + } } === modified file 'dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/java/org/hisp/dhis/dashboard/usergroup/action/GetUserGroupListAction.java' --- dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/java/org/hisp/dhis/dashboard/usergroup/action/GetUserGroupListAction.java 2014-10-16 06:17:19 +0000 +++ dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/java/org/hisp/dhis/dashboard/usergroup/action/GetUserGroupListAction.java 2014-10-21 16:15:25 +0000 @@ -31,9 +31,13 @@ import static org.apache.commons.lang.StringUtils.isNotBlank; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.hisp.dhis.paging.ActionPagingSupport; +import org.hisp.dhis.user.CurrentUserService; +import org.hisp.dhis.user.User; import org.hisp.dhis.user.UserGroup; import org.hisp.dhis.user.UserGroupService; @@ -51,6 +55,13 @@ this.userGroupService = userGroupService; } + private CurrentUserService currentUserService; + + public void setCurrentUserService( CurrentUserService currentUserService ) + { + this.currentUserService = currentUserService; + } + // ------------------------------------------------------------------------- // Parameters // ------------------------------------------------------------------------- @@ -62,6 +73,13 @@ return userGroupList; } + private Map isCurrentUserMemberMap; + + public Map getIsCurrentUserMemberMap() + { + return isCurrentUserMemberMap; + } + private String key; public String getKey() @@ -93,7 +111,28 @@ userGroupList = new ArrayList<>( userGroupService.getUserGroupsBetween( paging.getStartPos(), paging.getPageSize() ) ); } + + isCurrentUserMemberMap = populateMemberShipMap( userGroupList ); return SUCCESS; } + + // ------------------------------------------------------------------------- + // Supportive methods + // ------------------------------------------------------------------------- + + private Map populateMemberShipMap( List userGroups ) + { + User currentUser = currentUserService.getCurrentUser(); + + Map map = new HashMap<>(); + + for( UserGroup ug : userGroups ) + { + map.put( ug, ug.getMembers().contains( currentUser ) ); + } + + return map; + } } + === modified file 'dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/resources/META-INF/dhis/beans.xml 2014-06-12 16:30:25 +0000 +++ dhis-2/dhis-web/dhis-web-dashboard-integration/src/main/resources/META-INF/dhis/beans.xml 2014-10-21 16:15:25 +0000 @@ -69,7 +69,7 @@ scope="prototype"/> - + @@ -85,6 +85,7 @@ + @@ -33,15 +47,38 @@ $i18n.getString( "name" ) + #foreach( $userGroup in $userGroupList ) - - $encoder.htmlEncode( $!userGroup.displayName ) + data-can-delete="$security.canDelete( $userGroup )" + #if( $isCurrentUserMemberMap.get( $userGroup ) && $security.canUpdate( $userGroup ) ) + data-can-join="false" + data-can-leave="true" + #elseif ( $security.canUpdate( $userGroup ) ) + data-can-join="true" + data-can-leave="false" + #else + data-can-join="false" + data-can-leave="false" + #end > + $encoder.htmlEncode( $!userGroup.displayName ) + + #end @@ -50,7 +87,6 @@ #parse( "/dhis-web-commons/paging/paging.vm" ) -