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