adminuser.py 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. # -*- coding: utf-8 -*-
  2. from pboard import model as pm
  3. from tgext.crud import CrudRestController
  4. from sprox.tablebase import TableBase
  5. from sprox.formbase import EditableForm, AddRecordForm
  6. from sprox.fillerbase import TableFiller, EditFormFiller
  7. from pboard.model import auth as pma
  8. from tw2 import forms as tw2f
  9. import tg
  10. from sprox.widgets import PropertyMultipleSelectField
  11. from sprox._compat import unicode_text
  12. from formencode import Schema
  13. from formencode.validators import FieldsMatch
  14. from pboard.lib import dbapi as pld
  15. class GroupField(PropertyMultipleSelectField):
  16. """ Shows a limited list of groups """
  17. def prepare(self):
  18. # self.entity = pma.Group
  19. #self.__class__.entity
  20. visible_groups = pm.DBSession.query(pma.Group).\
  21. filter(pma.Group.group_id>0).\
  22. filter(pma.Group.group_id!=pma.Group.GROUP_ID_ALL_USERS).all()
  23. self.options = [(group.group_id, group.getDisplayName()) for group in visible_groups]
  24. if not self.value:
  25. self.value = []
  26. self.value = [unicode_text(v) for v in self.value]
  27. super(PropertyMultipleSelectField, self).prepare()
  28. class AdminUserController(CrudRestController):
  29. model = pma.User
  30. class new_form_type(AddRecordForm):
  31. __model__ = pma.User
  32. __require_fields__ = ['display_name', 'email_address', 'password', 'verify_password', 'groups']
  33. __omit_fields__ = ['_password', 'created', 'user_id', '_lAllNodes']
  34. __field_order__ = ['display_name', 'email_address', 'password', 'verify_password', 'groups']
  35. email_address = tw2f.TextField('email_address')
  36. display_name = tw2f.TextField('display_name')
  37. verify_password = tw2f.PasswordField('verify_password')
  38. groups = GroupField('groups')
  39. class edit_form_type(EditableForm):
  40. __model__ = pma.User
  41. __require_fields__ = ['display_name', 'email_address', 'groups']
  42. __omit_fields__ = ['_password', 'created', 'user_id', '_lAllNodes', 'password']
  43. __field_order__ = ['display_name', 'email_address', 'groups']
  44. email_address = tw2f.TextField('email_address')
  45. display_name = tw2f.TextField('display_name')
  46. groups = GroupField('groups')
  47. class edit_filler_type(EditFormFiller):
  48. __model__ = pma.User
  49. class table_type(TableBase):
  50. __model__ = pma.User
  51. __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
  52. __field_order__ = ['user_id', 'display_name', 'email_address', 'groups']
  53. __headers__ = dict(user_id='id', email_address='Email', display_name='Name', groups='Groups')
  54. __xml_fields__ = ['groups']
  55. class table_filler_type(TableFiller):
  56. __model__ = pma.User
  57. __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
  58. def groups(self, obj):
  59. groups = ''.join(['<li>{0}</li>'.format(group.getDisplayName()) for group in obj.groups if group.group_id>0])
  60. return groups.join(('<ul>', '</ul>'))
  61. @tg.expose()
  62. #@tg.validate(new_user_validator, error_handler=CrudRestController.new)
  63. def post(self, *args, **kw):
  64. real_name = kw['display_name']
  65. email = kw['email_address']
  66. groups = kw['groups'] if 'groups' in kw else []
  67. password = kw['password']
  68. new_user = pld.PODStaticController.createNewUser(real_name, email, password, groups)
  69. if tg.request.response_type == 'application/json':
  70. if new_user is not None and self.conditional_update_field is not None:
  71. tg.response.last_modified = getattr(new_user, self.conditional_update_field)
  72. return dict(model=self.model.__name__,
  73. value=self._dictify(new_user))
  74. return tg.redirect('./', params=self._kept_params())
  75. @tg.expose()
  76. def post_delete(self, *args, **kw):
  77. user_id = int(args[0])
  78. pld.PODStaticController.deleteUser(user_id)
  79. return tg.redirect('./', params=self._kept_params())
  80. @tg.expose()
  81. def put(self, *args, **kw):
  82. """update"""
  83. print ("UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU")
  84. print(kw)
  85. user_id = kw['user_id']
  86. real_name = kw['display_name']
  87. email = kw['email_address']
  88. groups = kw['groups'] if 'groups' in kw else []
  89. updated_user = pld.PODStaticController.updateUser(user_id, real_name, email, groups)
  90. return
  91. omit_fields = []
  92. if getattr(self, 'edit_form', None):
  93. omit_fields.extend(self.edit_form.__omit_fields__)
  94. for remembered_value in self.remember_values:
  95. value = kw.get(remembered_value)
  96. if value is None or value == '':
  97. omit_fields.append(remembered_value)
  98. obj = self.provider.get_obj(self.model, kw)
  99. #This should actually by done by provider.update to make it atomic
  100. can_modify = True
  101. if obj is not None and self.conditional_update_field is not None and \
  102. tg.request.if_unmodified_since is not None and \
  103. tg.request.if_unmodified_since < getattr(obj, self.conditional_update_field):
  104. can_modify = False
  105. if obj is not None and can_modify:
  106. obj = self.provider.update(self.model, params=kw, omit_fields=omit_fields)
  107. if tg.request.response_type == 'application/json':
  108. if obj is None:
  109. tg.response.status_code = 404
  110. elif can_modify is False:
  111. tg.response.status_code = 412
  112. elif self.conditional_update_field is not None:
  113. tg.response.last_modified = getattr(obj, self.conditional_update_field)
  114. return dict(model=self.model.__name__,
  115. value=self._dictify(obj))
  116. pks = self.provider.get_primary_fields(self.model)
  117. return redirect('../' * len(pks), params=self._kept_params())