/lib/galaxy/web/controllers/admin.py

https://bitbucket.org/cistrome/cistrome-harvard/ · Python · 635 lines · 600 code · 23 blank · 12 comment · 82 complexity · c85a25a9af4ee3daa2c99321c95daf71 MD5 · raw file

  1. from galaxy.web.base.controller import *
  2. from galaxy import model
  3. from galaxy.model.orm import *
  4. from galaxy.web.framework.helpers import time_ago, iff, grids
  5. import logging
  6. log = logging.getLogger( __name__ )
  7. from galaxy.actions.admin import AdminActions
  8. from galaxy.web.params import QuotaParamParser
  9. from galaxy.exceptions import *
  10. class UserListGrid( grids.Grid ):
  11. class EmailColumn( grids.TextColumn ):
  12. def get_value( self, trans, grid, user ):
  13. return user.email
  14. class UserNameColumn( grids.TextColumn ):
  15. def get_value( self, trans, grid, user ):
  16. if user.username:
  17. return user.username
  18. return 'not set'
  19. class StatusColumn( grids.GridColumn ):
  20. def get_value( self, trans, grid, user ):
  21. if user.purged:
  22. return "purged"
  23. elif user.deleted:
  24. return "deleted"
  25. return ""
  26. class GroupsColumn( grids.GridColumn ):
  27. def get_value( self, trans, grid, user ):
  28. if user.groups:
  29. return len( user.groups )
  30. return 0
  31. class RolesColumn( grids.GridColumn ):
  32. def get_value( self, trans, grid, user ):
  33. if user.roles:
  34. return len( user.roles )
  35. return 0
  36. class ExternalColumn( grids.GridColumn ):
  37. def get_value( self, trans, grid, user ):
  38. if user.external:
  39. return 'yes'
  40. return 'no'
  41. class LastLoginColumn( grids.GridColumn ):
  42. def get_value( self, trans, grid, user ):
  43. if user.galaxy_sessions:
  44. return self.format( user.galaxy_sessions[ 0 ].update_time )
  45. return 'never'
  46. # Grid definition
  47. webapp = "galaxy"
  48. title = "Users"
  49. model_class = model.User
  50. template='/admin/user/grid.mako'
  51. default_sort_key = "email"
  52. columns = [
  53. EmailColumn( "Email",
  54. key="email",
  55. model_class=model.User,
  56. link=( lambda item: dict( operation="information", id=item.id, webapp="galaxy" ) ),
  57. attach_popup=True,
  58. filterable="advanced" ),
  59. UserNameColumn( "User Name",
  60. key="username",
  61. model_class=model.User,
  62. attach_popup=False,
  63. filterable="advanced" ),
  64. GroupsColumn( "Groups", attach_popup=False ),
  65. RolesColumn( "Roles", attach_popup=False ),
  66. ExternalColumn( "External", attach_popup=False ),
  67. LastLoginColumn( "Last Login", format=time_ago, key="update_time" ),
  68. StatusColumn( "Status", attach_popup=False ),
  69. # Columns that are valid for filtering but are not visible.
  70. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
  71. ]
  72. columns.append( grids.MulticolFilterColumn( "Search",
  73. cols_to_filter=[ columns[0], columns[1] ],
  74. key="free-text-search",
  75. visible=False,
  76. filterable="standard" ) )
  77. global_actions = [
  78. grids.GridAction( "Create new user", dict( controller='admin', action='users', operation='create', webapp="galaxy" ) )
  79. ]
  80. operations = [
  81. grids.GridOperation( "Manage Roles and Groups",
  82. condition=( lambda item: not item.deleted ),
  83. allow_multiple=False,
  84. url_args=dict( webapp="galaxy", action="manage_roles_and_groups_for_user" ) ),
  85. grids.GridOperation( "Reset Password",
  86. condition=( lambda item: not item.deleted ),
  87. allow_multiple=True,
  88. allow_popup=False,
  89. url_args=dict( webapp="galaxy", action="reset_user_password" ) )
  90. ]
  91. #TODO: enhance to account for trans.app.config.allow_user_deletion here so that we can eliminate these operations if
  92. # the setting is False
  93. operations.append( grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), allow_multiple=True ) )
  94. operations.append( grids.GridOperation( "Undelete", condition=( lambda item: item.deleted and not item.purged ), allow_multiple=True ) )
  95. operations.append( grids.GridOperation( "Purge", condition=( lambda item: item.deleted and not item.purged ), allow_multiple=True ) )
  96. standard_filters = [
  97. grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
  98. grids.GridColumnFilter( "Deleted", args=dict( deleted=True, purged=False ) ),
  99. grids.GridColumnFilter( "Purged", args=dict( purged=True ) ),
  100. grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
  101. ]
  102. num_rows_per_page = 50
  103. preserve_state = False
  104. use_paging = True
  105. def get_current_item( self, trans, **kwargs ):
  106. return trans.user
  107. class RoleListGrid( grids.Grid ):
  108. class NameColumn( grids.TextColumn ):
  109. def get_value( self, trans, grid, role ):
  110. return role.name
  111. class DescriptionColumn( grids.TextColumn ):
  112. def get_value( self, trans, grid, role ):
  113. if role.description:
  114. return role.description
  115. return ''
  116. class TypeColumn( grids.TextColumn ):
  117. def get_value( self, trans, grid, role ):
  118. return role.type
  119. class StatusColumn( grids.GridColumn ):
  120. def get_value( self, trans, grid, role ):
  121. if role.deleted:
  122. return "deleted"
  123. return ""
  124. class GroupsColumn( grids.GridColumn ):
  125. def get_value( self, trans, grid, role ):
  126. if role.groups:
  127. return len( role.groups )
  128. return 0
  129. class UsersColumn( grids.GridColumn ):
  130. def get_value( self, trans, grid, role ):
  131. if role.users:
  132. return len( role.users )
  133. return 0
  134. # Grid definition
  135. webapp = "galaxy"
  136. title = "Roles"
  137. model_class = model.Role
  138. template='/admin/dataset_security/role/grid.mako'
  139. default_sort_key = "name"
  140. columns = [
  141. NameColumn( "Name",
  142. key="name",
  143. link=( lambda item: dict( operation="Manage users and groups", id=item.id, webapp="galaxy" ) ),
  144. model_class=model.Role,
  145. attach_popup=True,
  146. filterable="advanced" ),
  147. DescriptionColumn( "Description",
  148. key='description',
  149. model_class=model.Role,
  150. attach_popup=False,
  151. filterable="advanced" ),
  152. TypeColumn( "Type",
  153. key='type',
  154. model_class=model.Role,
  155. attach_popup=False,
  156. filterable="advanced" ),
  157. GroupsColumn( "Groups", attach_popup=False ),
  158. UsersColumn( "Users", attach_popup=False ),
  159. StatusColumn( "Status", attach_popup=False ),
  160. # Columns that are valid for filtering but are not visible.
  161. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
  162. ]
  163. columns.append( grids.MulticolFilterColumn( "Search",
  164. cols_to_filter=[ columns[0], columns[1], columns[2] ],
  165. key="free-text-search",
  166. visible=False,
  167. filterable="standard" ) )
  168. global_actions = [
  169. grids.GridAction( "Add new role", dict( controller='admin', action='roles', operation='create' ) )
  170. ]
  171. operations = [ grids.GridOperation( "Edit",
  172. condition=( lambda item: not item.deleted ),
  173. allow_multiple=False,
  174. url_args=dict( webapp="galaxy", action="rename_role" ) ),
  175. grids.GridOperation( "Delete",
  176. condition=( lambda item: not item.deleted ),
  177. allow_multiple=True,
  178. url_args=dict( webapp="galaxy", action="mark_role_deleted" ) ),
  179. grids.GridOperation( "Undelete",
  180. condition=( lambda item: item.deleted ),
  181. allow_multiple=True,
  182. url_args=dict( webapp="galaxy", action="undelete_role" ) ),
  183. grids.GridOperation( "Purge",
  184. condition=( lambda item: item.deleted ),
  185. allow_multiple=True,
  186. url_args=dict( webapp="galaxy", action="purge_role" ) ) ]
  187. standard_filters = [
  188. grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
  189. grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
  190. grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
  191. ]
  192. num_rows_per_page = 50
  193. preserve_state = False
  194. use_paging = True
  195. def apply_query_filter( self, trans, query, **kwargs ):
  196. return query.filter( model.Role.type != model.Role.types.PRIVATE )
  197. class GroupListGrid( grids.Grid ):
  198. class NameColumn( grids.TextColumn ):
  199. def get_value( self, trans, grid, group ):
  200. return group.name
  201. class StatusColumn( grids.GridColumn ):
  202. def get_value( self, trans, grid, group ):
  203. if group.deleted:
  204. return "deleted"
  205. return ""
  206. class RolesColumn( grids.GridColumn ):
  207. def get_value( self, trans, grid, group ):
  208. if group.roles:
  209. return len( group.roles )
  210. return 0
  211. class UsersColumn( grids.GridColumn ):
  212. def get_value( self, trans, grid, group ):
  213. if group.members:
  214. return len( group.members )
  215. return 0
  216. # Grid definition
  217. webapp = "galaxy"
  218. title = "Groups"
  219. model_class = model.Group
  220. template='/admin/dataset_security/group/grid.mako'
  221. default_sort_key = "name"
  222. columns = [
  223. NameColumn( "Name",
  224. key="name",
  225. link=( lambda item: dict( operation="Manage users and roles", id=item.id, webapp="galaxy" ) ),
  226. model_class=model.Group,
  227. attach_popup=True,
  228. filterable="advanced" ),
  229. UsersColumn( "Users", attach_popup=False ),
  230. RolesColumn( "Roles", attach_popup=False ),
  231. StatusColumn( "Status", attach_popup=False ),
  232. # Columns that are valid for filtering but are not visible.
  233. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
  234. ]
  235. columns.append( grids.MulticolFilterColumn( "Search",
  236. cols_to_filter=[ columns[0], columns[1], columns[2] ],
  237. key="free-text-search",
  238. visible=False,
  239. filterable="standard" ) )
  240. global_actions = [
  241. grids.GridAction( "Add new group", dict( controller='admin', action='groups', operation='create', webapp="galaxy" ) )
  242. ]
  243. operations = [ grids.GridOperation( "Rename",
  244. condition=( lambda item: not item.deleted ),
  245. allow_multiple=False,
  246. url_args=dict( webapp="galaxy", action="rename_group" ) ),
  247. grids.GridOperation( "Delete",
  248. condition=( lambda item: not item.deleted ),
  249. allow_multiple=True,
  250. url_args=dict( webapp="galaxy", action="mark_group_deleted" ) ),
  251. grids.GridOperation( "Undelete",
  252. condition=( lambda item: item.deleted ),
  253. allow_multiple=True,
  254. url_args=dict( webapp="galaxy", action="undelete_group" ) ),
  255. grids.GridOperation( "Purge",
  256. condition=( lambda item: item.deleted ),
  257. allow_multiple=True,
  258. url_args=dict( webapp="galaxy", action="purge_group" ) ) ]
  259. standard_filters = [
  260. grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
  261. grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
  262. grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
  263. ]
  264. num_rows_per_page = 50
  265. preserve_state = False
  266. use_paging = True
  267. class QuotaListGrid( grids.Grid ):
  268. class NameColumn( grids.TextColumn ):
  269. def get_value( self, trans, grid, quota ):
  270. return quota.name
  271. class DescriptionColumn( grids.TextColumn ):
  272. def get_value( self, trans, grid, quota ):
  273. if quota.description:
  274. return quota.description
  275. return ''
  276. class AmountColumn( grids.TextColumn ):
  277. def get_value( self, trans, grid, quota ):
  278. return quota.operation + quota.display_amount
  279. class StatusColumn( grids.GridColumn ):
  280. def get_value( self, trans, grid, quota ):
  281. if quota.deleted:
  282. return "deleted"
  283. elif quota.default:
  284. return "<strong>default for %s users</strong>" % quota.default[0].type
  285. return ""
  286. class UsersColumn( grids.GridColumn ):
  287. def get_value( self, trans, grid, quota ):
  288. if quota.users:
  289. return len( quota.users )
  290. return 0
  291. class GroupsColumn( grids.GridColumn ):
  292. def get_value( self, trans, grid, quota ):
  293. if quota.groups:
  294. return len( quota.groups )
  295. return 0
  296. # Grid definition
  297. webapp = "galaxy"
  298. title = "Quotas"
  299. model_class = model.Quota
  300. template='/admin/quota/grid.mako'
  301. default_sort_key = "name"
  302. columns = [
  303. NameColumn( "Name",
  304. key="name",
  305. link=( lambda item: dict( operation="Manage users and groups", id=item.id, webapp="galaxy" ) if not item.default else dict( operation="Change amount", id=item.id, webapp="galaxy" ) ),
  306. model_class=model.Quota,
  307. attach_popup=True,
  308. filterable="advanced" ),
  309. DescriptionColumn( "Description",
  310. key='description',
  311. model_class=model.Quota,
  312. attach_popup=False,
  313. filterable="advanced" ),
  314. AmountColumn( "Amount",
  315. key='amount',
  316. model_class=model.Quota,
  317. attach_popup=False,
  318. filterable="advanced" ),
  319. UsersColumn( "Users", attach_popup=False ),
  320. GroupsColumn( "Groups", attach_popup=False ),
  321. StatusColumn( "Status", attach_popup=False ),
  322. # Columns that are valid for filtering but are not visible.
  323. grids.DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
  324. ]
  325. columns.append( grids.MulticolFilterColumn( "Search",
  326. cols_to_filter=[ columns[0], columns[1], columns[2] ],
  327. key="free-text-search",
  328. visible=False,
  329. filterable="standard" ) )
  330. global_actions = [
  331. grids.GridAction( "Add new quota", dict( controller='admin', action='quotas', operation='create' ) )
  332. ]
  333. operations = [ grids.GridOperation( "Rename",
  334. condition=( lambda item: not item.deleted ),
  335. allow_multiple=False,
  336. url_args=dict( webapp="galaxy", action="rename_quota" ) ),
  337. grids.GridOperation( "Change amount",
  338. condition=( lambda item: not item.deleted ),
  339. allow_multiple=False,
  340. url_args=dict( webapp="galaxy", action="edit_quota" ) ),
  341. grids.GridOperation( "Manage users and groups",
  342. condition=( lambda item: not item.default and not item.deleted ),
  343. allow_multiple=False,
  344. url_args=dict( webapp="galaxy", action="manage_users_and_groups_for_quota" ) ),
  345. grids.GridOperation( "Set as different type of default",
  346. condition=( lambda item: item.default ),
  347. allow_multiple=False,
  348. url_args=dict( webapp="galaxy", action="set_quota_default" ) ),
  349. grids.GridOperation( "Set as default",
  350. condition=( lambda item: not item.default and not item.deleted ),
  351. allow_multiple=False,
  352. url_args=dict( webapp="galaxy", action="set_quota_default" ) ),
  353. grids.GridOperation( "Unset as default",
  354. condition=( lambda item: item.default and not item.deleted ),
  355. allow_multiple=False,
  356. url_args=dict( webapp="galaxy", action="unset_quota_default" ) ),
  357. grids.GridOperation( "Delete",
  358. condition=( lambda item: not item.deleted and not item.default ),
  359. allow_multiple=True,
  360. url_args=dict( webapp="galaxy", action="mark_quota_deleted" ) ),
  361. grids.GridOperation( "Undelete",
  362. condition=( lambda item: item.deleted ),
  363. allow_multiple=True,
  364. url_args=dict( webapp="galaxy", action="undelete_quota" ) ),
  365. grids.GridOperation( "Purge",
  366. condition=( lambda item: item.deleted ),
  367. allow_multiple=True,
  368. url_args=dict( webapp="galaxy", action="purge_quota" ) ) ]
  369. standard_filters = [
  370. grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
  371. grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
  372. grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
  373. ]
  374. num_rows_per_page = 50
  375. preserve_state = False
  376. use_paging = True
  377. class AdminGalaxy( BaseUIController, Admin, AdminActions, UsesQuota, QuotaParamParser ):
  378. user_list_grid = UserListGrid()
  379. role_list_grid = RoleListGrid()
  380. group_list_grid = GroupListGrid()
  381. quota_list_grid = QuotaListGrid()
  382. # Galaxy Quota Stuff
  383. @web.expose
  384. @web.require_admin
  385. def quotas( self, trans, **kwargs ):
  386. if 'operation' in kwargs:
  387. operation = kwargs.pop('operation').lower()
  388. if operation == "quotas":
  389. return self.quota( trans, **kwargs )
  390. if operation == "create":
  391. return self.create_quota( trans, **kwargs )
  392. if operation == "delete":
  393. return self.mark_quota_deleted( trans, **kwargs )
  394. if operation == "undelete":
  395. return self.undelete_quota( trans, **kwargs )
  396. if operation == "purge":
  397. return self.purge_quota( trans, **kwargs )
  398. if operation == "change amount":
  399. return self.edit_quota( trans, **kwargs )
  400. if operation == "manage users and groups":
  401. return self.manage_users_and_groups_for_quota( trans, **kwargs )
  402. if operation == "rename":
  403. return self.rename_quota( trans, **kwargs )
  404. if operation == "edit":
  405. return self.edit_quota( trans, **kwargs )
  406. # Render the list view
  407. return self.quota_list_grid( trans, **kwargs )
  408. @web.expose
  409. @web.require_admin
  410. def create_quota( self, trans, **kwd ):
  411. params = self.get_quota_params( kwd )
  412. if params.get( 'create_quota_button', False ):
  413. try:
  414. quota, message = self._create_quota( params )
  415. return trans.response.send_redirect( web.url_for( controller='admin',
  416. action='quotas',
  417. webapp=params.webapp,
  418. message=util.sanitize_text( message ),
  419. status='done' ) )
  420. except MessageException, e:
  421. params.message = str( e )
  422. params.status = 'error'
  423. in_users = map( int, params.in_users )
  424. in_groups = map( int, params.in_groups )
  425. new_in_users = []
  426. new_in_groups = []
  427. for user in trans.sa_session.query( trans.app.model.User ) \
  428. .filter( trans.app.model.User.table.c.deleted==False ) \
  429. .order_by( trans.app.model.User.table.c.email ):
  430. if user.id in in_users:
  431. new_in_users.append( ( user.id, user.email ) )
  432. else:
  433. params.out_users.append( ( user.id, user.email ) )
  434. for group in trans.sa_session.query( trans.app.model.Group ) \
  435. .filter( trans.app.model.Group.table.c.deleted==False ) \
  436. .order_by( trans.app.model.Group.table.c.name ):
  437. if group.id in in_groups:
  438. new_in_groups.append( ( group.id, group.name ) )
  439. else:
  440. params.out_groups.append( ( group.id, group.name ) )
  441. return trans.fill_template( '/admin/quota/quota_create.mako',
  442. webapp=params.webapp,
  443. name=params.name,
  444. description=params.description,
  445. amount=params.amount,
  446. operation=params.operation,
  447. default=params.default,
  448. in_users=new_in_users,
  449. out_users=params.out_users,
  450. in_groups=new_in_groups,
  451. out_groups=params.out_groups,
  452. message=params.message,
  453. status=params.status )
  454. @web.expose
  455. @web.require_admin
  456. def rename_quota( self, trans, **kwd ):
  457. quota, params = self._quota_op( trans, 'rename_quota_button', self._rename_quota, kwd )
  458. if not quota:
  459. return
  460. return trans.fill_template( '/admin/quota/quota_rename.mako',
  461. id=params.id,
  462. name=params.name or quota.name,
  463. description=params.description or quota.description,
  464. webapp=params.webapp,
  465. message=params.message,
  466. status=params.status )
  467. @web.expose
  468. @web.require_admin
  469. def manage_users_and_groups_for_quota( self, trans, **kwd ):
  470. quota, params = self._quota_op( trans, 'quota_members_edit_button', self._manage_users_and_groups_for_quota, kwd )
  471. if not quota:
  472. return
  473. in_users = []
  474. out_users = []
  475. in_groups = []
  476. out_groups = []
  477. for user in trans.sa_session.query( trans.app.model.User ) \
  478. .filter( trans.app.model.User.table.c.deleted==False ) \
  479. .order_by( trans.app.model.User.table.c.email ):
  480. if user in [ x.user for x in quota.users ]:
  481. in_users.append( ( user.id, user.email ) )
  482. else:
  483. out_users.append( ( user.id, user.email ) )
  484. for group in trans.sa_session.query( trans.app.model.Group ) \
  485. .filter( trans.app.model.Group.table.c.deleted==False ) \
  486. .order_by( trans.app.model.Group.table.c.name ):
  487. if group in [ x.group for x in quota.groups ]:
  488. in_groups.append( ( group.id, group.name ) )
  489. else:
  490. out_groups.append( ( group.id, group.name ) )
  491. return trans.fill_template( '/admin/quota/quota.mako',
  492. id=params.id,
  493. name=quota.name,
  494. in_users=in_users,
  495. out_users=out_users,
  496. in_groups=in_groups,
  497. out_groups=out_groups,
  498. webapp=params.webapp,
  499. message=params.message,
  500. status=params.status )
  501. @web.expose
  502. @web.require_admin
  503. def edit_quota( self, trans, **kwd ):
  504. quota, params = self._quota_op( trans, 'edit_quota_button', self._edit_quota, kwd )
  505. if not quota:
  506. return
  507. return trans.fill_template( '/admin/quota/quota_edit.mako',
  508. id=params.id,
  509. operation=params.operation or quota.operation,
  510. display_amount=params.amount or quota.display_amount,
  511. webapp=params.webapp,
  512. message=params.message,
  513. status=params.status )
  514. @web.expose
  515. @web.require_admin
  516. def set_quota_default( self, trans, **kwd ):
  517. quota, params = self._quota_op( trans, 'set_default_quota_button', self._set_quota_default, kwd )
  518. if not quota:
  519. return
  520. if params.default:
  521. default = params.default
  522. elif quota.default:
  523. default = quota.default[0].type
  524. else:
  525. default = "no"
  526. return trans.fill_template( '/admin/quota/quota_set_default.mako',
  527. id=params.id,
  528. default=default,
  529. webapp=params.webapp,
  530. message=params.message,
  531. status=params.status )
  532. @web.expose
  533. @web.require_admin
  534. def unset_quota_default( self, trans, **kwd ):
  535. quota, params = self._quota_op( trans, True, self._unset_quota_default, kwd )
  536. if not quota:
  537. return
  538. return trans.response.send_redirect( web.url_for( controller='admin',
  539. action='quotas',
  540. webapp=params.webapp,
  541. message=util.sanitize_text( params.message ),
  542. status='error' ) )
  543. @web.expose
  544. @web.require_admin
  545. def mark_quota_deleted( self, trans, **kwd ):
  546. quota, params = self._quota_op( trans, True, self._mark_quota_deleted, kwd, listify=True )
  547. if not quota:
  548. return
  549. return trans.response.send_redirect( web.url_for( controller='admin',
  550. action='quotas',
  551. webapp=params.webapp,
  552. message=util.sanitize_text( params.message ),
  553. status='error' ) )
  554. @web.expose
  555. @web.require_admin
  556. def undelete_quota( self, trans, **kwd ):
  557. quota, params = self._quota_op( trans, True, self._undelete_quota, kwd, listify=True )
  558. if not quota:
  559. return
  560. return trans.response.send_redirect( web.url_for( controller='admin',
  561. action='quotas',
  562. webapp=params.webapp,
  563. message=util.sanitize_text( params.message ),
  564. status='error' ) )
  565. @web.expose
  566. @web.require_admin
  567. def purge_quota( self, trans, **kwd ):
  568. quota, params = self._quota_op( trans, True, self._purge_quota, kwd, listify=True )
  569. if not quota:
  570. return
  571. return trans.response.send_redirect( web.url_for( controller='admin',
  572. action='quotas',
  573. webapp=params.webapp,
  574. message=util.sanitize_text( params.message ),
  575. status='error' ) )
  576. def _quota_op( self, trans, do_op, op_method, kwd, listify=False ):
  577. params = self.get_quota_params( kwd )
  578. if listify:
  579. quota = []
  580. messages = []
  581. for id in util.listify( params.id ):
  582. try:
  583. quota.append( self.get_quota( trans, id ) )
  584. except MessageException, e:
  585. messages.append( str( e ) )
  586. if messages:
  587. return None, trans.response.send_redirect( web.url_for( controller='admin',
  588. action='quotas',
  589. webapp=params.webapp,
  590. message=util.sanitize_text( ', '.join( messages ) ),
  591. status='error' ) )
  592. else:
  593. try:
  594. quota = self.get_quota( trans, params.id, deleted=False )
  595. except MessageException, e:
  596. return None, trans.response.send_redirect( web.url_for( controller='admin',
  597. action='quotas',
  598. webapp=params.webapp,
  599. message=util.sanitize_text( str( e ) ),
  600. status='error' ) )
  601. if do_op == True or ( do_op != False and params.get( do_op, False ) ):
  602. try:
  603. message = op_method( quota, params )
  604. return None, trans.response.send_redirect( web.url_for( controller='admin',
  605. action='quotas',
  606. webapp=params.webapp,
  607. message=util.sanitize_text( message ),
  608. status='done' ) )
  609. except MessageException, e:
  610. params.message = e.err_msg
  611. params.status = e.type
  612. return quota, params