PageRenderTime 38ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/grails-app/controllers/general/UsuarioController.groovy

http://github.com/jdmr/mateo
Groovy | 250 lines | 221 code | 26 blank | 3 comment | 50 complexity | 65ae407cd4cd9f4e6998bbaadc32a461 MD5 | raw file
  1. package general
  2. import grails.converters.JSON
  3. import grails.plugins.springsecurity.Secured
  4. import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
  5. @Secured(['ROLE_EMP'])
  6. class UsuarioController {
  7. def springSecurityService
  8. static allowedMethods = [crea: "POST", actualiza: "POST", elimina: "POST"]
  9. def index = {
  10. redirect(action: "lista", params: params)
  11. }
  12. def lista = {
  13. params.max = Math.min(params.max ? params.int('max') : 10, 100)
  14. def currentUser = springSecurityService.currentUser
  15. [usuarios: Usuario.findAllByEmpresa(currentUser.empresa, params), totalDeUsuarios: Usuario.countByEmpresa(currentUser.empresa)]
  16. }
  17. def nuevo = {
  18. def usuario = new Usuario()
  19. usuario.properties = params
  20. def roles = obtieneListaDeRoles(null)
  21. return [usuario: usuario, roles: roles]
  22. }
  23. def crea = {
  24. Usuario.withTransaction {
  25. def usuario = new Usuario(params)
  26. usuario.password = springSecurityService.encodePassword(params.password)
  27. def currentUser = springSecurityService.currentUser
  28. usuario.empresa = currentUser.empresa
  29. if (usuario.save(flush: true)) {
  30. def roles = asignaRoles(params)
  31. for(rol in roles) {
  32. UsuarioRol.create(usuario, rol, false)
  33. }
  34. flash.message = message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuario.username])
  35. redirect(action: "ver", id: usuario.id)
  36. } else {
  37. log.error("Hubo un error al crear el usuario ${usuario.errors}")
  38. render(view: "nuevo", model: [usuario: usuario])
  39. }
  40. }
  41. }
  42. def ver = {
  43. def usuario = Usuario.get(params.id)
  44. if (!usuario) {
  45. flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  46. redirect(action: "lista")
  47. }
  48. else {
  49. def roles = obtieneListaDeRoles(usuario)
  50. return [usuario: usuario, roles: roles]
  51. }
  52. }
  53. def edita = {
  54. def usuario = Usuario.get(params.id)
  55. if (!usuario) {
  56. flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  57. redirect(action: "lista")
  58. }
  59. else {
  60. def roles = obtieneListaDeRoles(usuario)
  61. return [usuario: usuario, roles: roles]
  62. }
  63. }
  64. def actualiza = {
  65. Usuario.withTransaction {
  66. def usuario = Usuario.get(params.id)
  67. if (usuario) {
  68. if (params.version) {
  69. def version = params.version.toLong()
  70. if (usuario.version > version) {
  71. usuario.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuario.label', default: 'Usuario')] as Object[], "Another user has updated this Usuario while you were editing")
  72. render(view: "edita", model: [usuario: usuario])
  73. return
  74. }
  75. }
  76. if (usuario.password != params.password) {
  77. usuario.password = springSecurityService.encodePassword(params.password)
  78. }
  79. params.remove('password')
  80. usuario.properties = params
  81. def currentUser = springSecurityService.currentUser
  82. usuario.empresa = currentUser.empresa
  83. if (!usuario.hasErrors() && usuario.save(flush: true)) {
  84. UsuarioRol.removeAll(usuario)
  85. def roles = asignaRoles(params)
  86. for(rol in roles) {
  87. UsuarioRol.create(usuario, rol, false)
  88. }
  89. flash.message = message(code: 'default.updated.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuario.username])
  90. redirect(action: "ver", id: usuario.id)
  91. }
  92. else {
  93. render(view: "edita", model: [usuario: usuario])
  94. }
  95. }
  96. else {
  97. flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  98. redirect(action: "lista")
  99. }
  100. }
  101. }
  102. def elimina = {
  103. def usuario = Usuario.get(params.id)
  104. if (usuario) {
  105. try {
  106. def nombre = usuario.username
  107. UsuarioRol.removeAll(usuario)
  108. usuario.delete(flush: true)
  109. flash.message = message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), nombre])
  110. redirect(action: "lista")
  111. }
  112. catch (org.springframework.dao.DataIntegrityViolationException e) {
  113. flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  114. redirect(action: "ver", id: params.id)
  115. }
  116. }
  117. else {
  118. flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  119. redirect(action: "lista")
  120. }
  121. }
  122. @Secured(['ROLE_USER'])
  123. def perfil = {
  124. def usuario = springSecurityService.currentUser
  125. def empresas
  126. if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) {
  127. log.debug("Buscando empresas a nivel administrador")
  128. empresas = Empresa.findAll("from Empresa e order by e.organizacion.nombre, e.nombre")
  129. } else if(SpringSecurityUtils.ifAnyGranted('ROLE_ORG')) {
  130. log.debug("Buscando empresas a nivel organizacion")
  131. empresas = Empresa.findAll("from Empresa e where e.organizacion = :organizacion order by e.organizacion.nombre, e.nombre", [organizacion:usuario.empresa.organizacion])
  132. } else {
  133. log.debug("Asignando empresa")
  134. empresas = [usuario.empresa]
  135. }
  136. return [usuario:usuario, empresas:empresas]
  137. }
  138. @Secured(['ROLE_USER'])
  139. def actualizaPerfil = {
  140. Usuario.withTransaction {
  141. def usuario = springSecurityService.currentUser
  142. if (usuario) {
  143. if (params.version) {
  144. def version = params.version.toLong()
  145. if (usuario.version > version) {
  146. usuario.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuario.label', default: 'Usuario')] as Object[], "Another user has updated this Usuario while you were editing")
  147. redirect(action: "perfil")
  148. return
  149. }
  150. }
  151. if (usuario.password != params.password) {
  152. usuario.password = springSecurityService.encodePassword(params.password)
  153. }
  154. params.remove('password')
  155. usuario.properties = params
  156. // TODO: Necesitamos validar por rol a donde se puede cambiar el usuario
  157. // para no tener un hoyo de seguridad de que un usuario se pueda cambiar
  158. // a una empresa / organizacion no permitida
  159. if (!usuario.hasErrors() && usuario.save(flush: true)) {
  160. session.organizacion = usuario.empresa.organizacion
  161. session.empresa = usuario.empresa
  162. flash.message = message(code: 'usuario.perfil.updated.message', args: [usuario.username])
  163. redirect(uri: "/")
  164. }
  165. else {
  166. redirect(action: "perfil")
  167. }
  168. }
  169. else {
  170. flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
  171. redirect(uri: "/")
  172. }
  173. }
  174. }
  175. def obtieneListaDeRoles = { usuario ->
  176. log.debug "Obteniendo lista de roles"
  177. def roles = Rol.list()
  178. def rolesFiltrados = [] as Set
  179. if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) {
  180. log.debug "Roles para ADMIN"
  181. rolesFiltrados = roles
  182. } else if(SpringSecurityUtils.ifAnyGranted('ROLE_ORG')) {
  183. log.debug "Roles para ORG"
  184. for(rol in roles) {
  185. if (!rol.authority.equals('ROLE_ADMIN') && !rol.authority.equals('ROLE_ORG')) {
  186. rolesFiltrados << rol
  187. }
  188. }
  189. } else if(SpringSecurityUtils.ifAnyGranted('ROLE_EMP')) {
  190. log.debug "Roles para EMP"
  191. for(rol in roles) {
  192. if (rol.authority.equals('ROLE_USER')) {
  193. rolesFiltrados << rol
  194. }
  195. }
  196. }
  197. roles = rolesFiltrados
  198. roles.sort { r1, r2 ->
  199. r1.authority <=> r2.authority
  200. }
  201. Set userRoleNames = []
  202. for (role in usuario?.authorities) {
  203. userRoleNames << role.authority
  204. }
  205. LinkedHashMap<Rol, Boolean> roleMap = [:]
  206. for (role in roles) {
  207. roleMap[(role)] = userRoleNames.contains(role.authority)
  208. }
  209. return roleMap
  210. }
  211. def asignaRoles = { params ->
  212. def roles = [] as Set
  213. if (params.ROLE_ADMIN) {
  214. roles << Rol.findByAuthority('ROLE_ADMIN')
  215. } else if (params.ROLE_ORG) {
  216. roles << Rol.findByAuthority('ROLE_ORG')
  217. } else if (params.ROLE_EMP) {
  218. roles << Rol.findByAuthority('ROLE_EMP')
  219. } else {
  220. roles << Rol.findByAuthority('ROLE_USER')
  221. }
  222. return roles
  223. }
  224. }