PageRenderTime 41ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/volunteer-portal/grails-app/controllers/au/org/ala/volunteer/TaskController.groovy

http://ala-volunteer.googlecode.com/
Groovy | 290 lines | 251 code | 28 blank | 11 comment | 47 complexity | a6b2d95cbe839b131691b049779a32e5 MD5 | raw file
  1. package au.org.ala.volunteer
  2. import grails.converters.*
  3. import org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap
  4. import java.util.concurrent.Callable
  5. import grails.plugin.executor.PersistenceContextExecutorWrapper
  6. class TaskController {
  7. static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
  8. def taskService
  9. def fieldSyncService
  10. def fieldService
  11. def authService
  12. def taskLoadService
  13. def ROLE_ADMIN = grailsApplication.config.auth.admin_role
  14. def ROLE_VALIDATOR = grailsApplication.config.auth.validator_role
  15. def load = {
  16. [projectList: Project.list()]
  17. }
  18. def project = {
  19. params.max = Math.min(params.max ? params.int('max') : 20, 50)
  20. params.order = params.order ? params.order : "asc"
  21. params.sort = params.sort ? params.sort : "id"
  22. //render(view: "list", model:[taskInstanceList: Task.list(params), taskInstanceTotal: Task.count()])
  23. if (params.id) {
  24. renderProjectListWithSearch(params, ["catalogNumber","scientificName"], "list")
  25. } else {
  26. render(view: "list", model:[taskInstanceList: Task.list(params), taskInstanceTotal: Task.count()])
  27. }
  28. }
  29. def projectAdmin = {
  30. def currentUser = authService.username()
  31. if (currentUser != null && (authService.userInRole(ROLE_ADMIN) || authService.userInRole(ROLE_VALIDATOR))) {
  32. renderProjectListWithSearch(params, ["catalogNumber","scientificName"], "adminList")
  33. } else {
  34. flash.message = "You do not have permission to view the Admin Task List page (${ROLE_ADMIN} required)"
  35. redirect(controller: "project", action: "index", id: params.id)
  36. }
  37. }
  38. def renderProjectListWithSearch(GrailsParameterMap params, List fieldNames, String view) {
  39. def projectInstance = Project.get(params.id)
  40. if (projectInstance) {
  41. params.max = Math.min(params.max ? params.int('max') : 20, 50)
  42. params.order = params.order ? params.order : "asc"
  43. params.sort = params.sort ? params.sort : "id"
  44. def taskInstanceList
  45. def taskInstanceTotal
  46. def extraFields = [:] // Map
  47. def query = params.q
  48. log.debug("q = " + query)
  49. if (query) {
  50. def fullList = Task.findAllByProject(projectInstance, [max: 999])
  51. taskInstanceList = fieldService.findAllFieldsWithTasksAndQuery(fullList, query, params)
  52. taskInstanceTotal = fieldService.countAllFieldsWithTasksAndQuery(fullList, query)
  53. if (taskInstanceTotal) {
  54. fieldNames.each {
  55. extraFields[it] = fieldService.getLatestFieldsWithTasks(it, taskInstanceList, params)
  56. }
  57. //extraField = fieldService.getLatestFieldsWithTasks(fieldName, taskInstanceList, params)
  58. }
  59. } else {
  60. taskInstanceList = Task.findAllByProject(projectInstance, params)
  61. taskInstanceTotal = Task.countByProject(projectInstance)
  62. if (taskInstanceTotal) {
  63. fieldNames.each {
  64. extraFields[it] = fieldService.getLatestFieldsWithTasks(it, taskInstanceList, params)
  65. }
  66. //extraField = fieldService.getLatestFieldsWithTasks(fieldName, taskInstanceList, params)
  67. }
  68. }
  69. // add some associated "field" values
  70. render(view: view, model: [taskInstanceList: taskInstanceList, taskInstanceTotal: taskInstanceTotal,
  71. projectInstance: projectInstance, extraFields: extraFields])
  72. }
  73. else {
  74. flash.message = "No project found for ID " + params.id
  75. }
  76. }
  77. def renderListWithSearch(GrailsParameterMap params, List fieldNames, String view) {
  78. params.max = Math.min(params.max ? params.int('max') : 20, 50)
  79. params.order = params.order ? params.order : "asc"
  80. params.sort = params.sort ? params.sort : "id"
  81. def taskInstanceList
  82. def taskInstanceTotal
  83. def extraFields = [:] // Map
  84. def query = params.q
  85. log.info("q = " + query)
  86. if (query) {
  87. def max = params.max // store it
  88. def offset = params.offset?:0
  89. params.max = 999 // to get full list
  90. params.offset = 0
  91. def fullList = Task.list(params)
  92. params.max = max // reset for paging
  93. params.offset = offset
  94. taskInstanceList = fieldService.findAllFieldsWithTasksAndQuery(fullList, query, params)
  95. taskInstanceTotal = fieldService.countAllFieldsWithTasksAndQuery(fullList, query)
  96. if (taskInstanceTotal) {
  97. fieldNames.each {
  98. extraFields[it] = fieldService.getLatestFieldsWithTasks(it, taskInstanceList, params)
  99. }
  100. }
  101. } else {
  102. taskInstanceList = Task.list(params)
  103. taskInstanceTotal = Task.count()
  104. fieldNames.each {
  105. extraFields[it] = fieldService.getLatestFieldsWithTasks(it, taskInstanceList, params)
  106. }
  107. }
  108. render(view: view, model: [taskInstanceList: taskInstanceList, taskInstanceTotal: taskInstanceTotal,
  109. extraFields: extraFields])
  110. }
  111. /**
  112. * Webservice for Google Maps to display task details in infowindow
  113. */
  114. def details = {
  115. def taskInstance = Task.get(params.id)
  116. Map recordValues = fieldSyncService.retrieveFieldsForTask(taskInstance)
  117. def jsonObj = [:]
  118. jsonObj.put("cat", recordValues?.get(0)?.catalogNumber)
  119. jsonObj.put("name", recordValues?.get(0)?.scientificName)
  120. jsonObj.put("transcriber", User.findByUserId(taskInstance.fullyTranscribedBy).displayName)
  121. render jsonObj as JSON
  122. }
  123. def loadCSV = {
  124. def projectId = params.int('projectId')
  125. if (params.csv) {
  126. def csv = params.csv;
  127. flash.message = taskService.loadCSV(projectId, csv)
  128. }
  129. }
  130. def loadCSVAsync = {
  131. def projectId = params.int('projectId')
  132. def replaceDuplicates = params.duplicateMode == 'replace'
  133. if (projectId && params.csv) {
  134. def project = Project.get(projectId)
  135. if (project) {
  136. def (success, message) = taskLoadService.loadTaskFromCSV(project, params.csv, replaceDuplicates)
  137. if (!success) {
  138. flash.message = message + " - Try again when current load is complete."
  139. }
  140. redirect( uri: "/loadProgress.gsp")
  141. }
  142. }
  143. }
  144. def cancelLoad = {
  145. taskLoadService.cancelLoad()
  146. flash.message = "Cancelled!"
  147. redirect( uri: "/loadProgress.gsp")
  148. }
  149. def index = {
  150. redirect(action: "list", params: params)
  151. }
  152. /** list all tasks */
  153. def list = {
  154. params.max = Math.min(params.max ? params.int('max') : 20, 50)
  155. params.order = params.order ? params.order : "asc"
  156. params.sort = params.sort ? params.sort : "id"
  157. //render(view: "list", model:[taskInstanceList: Task.list(params), taskInstanceTotal: Task.count()])
  158. if (params.id) {
  159. //redirect(action: "project", params: params)
  160. renderProjectListWithSearch(params, ["catalogNumber","scientificName"], "list")
  161. } else {
  162. //render(view: "list", model:[taskInstanceList: Task.list(params), taskInstanceTotal: Task.count()])
  163. renderListWithSearch(params, ["catalogNumber","scientificName"], "list")
  164. }
  165. }
  166. def thumbs = {
  167. params.max = Math.min(params.max ? params.int('max') : 8, 16)
  168. params.order = params.order ? params.order : "asc"
  169. params.sort = params.sort ? params.sort : "id"
  170. [taskInstanceList: Task.list(params), taskInstanceTotal: Task.count()]
  171. }
  172. def create = {
  173. def currentUser = authService.username()
  174. if (currentUser != null && authService.userInRole(ROLE_ADMIN)) {
  175. def taskInstance = new Task()
  176. taskInstance.properties = params
  177. return [taskInstance: taskInstance]
  178. } else {
  179. flash.message = "You do not have permission to view this page (${ROLE_ADMIN} required)"
  180. redirect(view: '/index')
  181. }
  182. }
  183. def save = {
  184. def taskInstance = new Task(params)
  185. if (taskInstance.save(flush: true)) {
  186. flash.message = "${message(code: 'default.created.message', args: [message(code: 'task.label', default: 'Task'), taskInstance.id])}"
  187. redirect(action: "show", id: taskInstance.id)
  188. }
  189. else {
  190. render(view: "create", model: [taskInstance: taskInstance])
  191. }
  192. }
  193. def show = {
  194. def taskInstance = Task.get(params.id)
  195. if (!taskInstance) {
  196. flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  197. redirect(action: "list")
  198. }
  199. else {
  200. [taskInstance: taskInstance]
  201. }
  202. }
  203. def edit = {
  204. def currentUser = authService.username()
  205. if (currentUser != null && authService.userInRole(ROLE_ADMIN)) {
  206. def taskInstance = Task.get(params.id)
  207. if (!taskInstance) {
  208. flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  209. redirect(action: "list")
  210. }
  211. else {
  212. return [taskInstance: taskInstance]
  213. }
  214. } else {
  215. flash.message = "You do not have permission to view this page (${ROLE_ADMIN} required)"
  216. redirect(view: '/index')
  217. }
  218. }
  219. def update = {
  220. def taskInstance = Task.get(params.id)
  221. if (taskInstance) {
  222. if (params.version) {
  223. def version = params.version.toLong()
  224. if (taskInstance.version > version) {
  225. taskInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'task.label', default: 'Task')] as Object[], "Another user has updated this Task while you were editing")
  226. render(view: "edit", model: [taskInstance: taskInstance])
  227. return
  228. }
  229. }
  230. taskInstance.properties = params
  231. if (!taskInstance.hasErrors() && taskInstance.save(flush: true)) {
  232. flash.message = "${message(code: 'default.updated.message', args: [message(code: 'task.label', default: 'Task'), taskInstance.id])}"
  233. redirect(action: "show", id: taskInstance.id)
  234. }
  235. else {
  236. render(view: "edit", model: [taskInstance: taskInstance])
  237. }
  238. }
  239. else {
  240. flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  241. redirect(action: "list")
  242. }
  243. }
  244. def delete = {
  245. def taskInstance = Task.get(params.id)
  246. if (taskInstance) {
  247. try {
  248. taskInstance.delete(flush: true)
  249. flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  250. redirect(action: "list")
  251. }
  252. catch (org.springframework.dao.DataIntegrityViolationException e) {
  253. flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  254. redirect(action: "show", id: params.id)
  255. }
  256. }
  257. else {
  258. flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'task.label', default: 'Task'), params.id])}"
  259. redirect(action: "list")
  260. }
  261. }
  262. }