Browse Source

make user and group admin work fine

Damien Accorsi 10 years ago
parent
commit
b13fdec6b9

+ 0 - 130
pboard/pboard/controllers/admin.py View File

@@ -1,130 +0,0 @@
1
-# -*- coding: utf-8 -*-
2
-"""Main Controller"""
3
-
4
-import tg.predicates
5
-from tgext.admin.config import AdminConfig, CrudRestControllerConfig
6
-from sprox.formbase import AddRecordForm
7
-from sprox import formbase as sform
8
-from sprox import fillerbase as sfill
9
-from sprox import tablebase as stable
10
-from formencode import Schema
11
-from formencode.validators import FieldsMatch
12
-from tw2.forms import PasswordField, TextField, HiddenField
13
-from tw2 import forms as tw2f
14
-from formencode import validators as fev
15
-
16
-from pboard.model import auth as pma
17
-from pboard import model as pm
18
-
19
-########################################################################################################################
20
-##
21
-## GROUP RELATED STUFF
22
-##
23
-
24
-class GroupRegistrationForm(sform.AddRecordForm):
25
-    __model__ = pma.Group
26
-    __require_fields__     = ['group_name', 'display_name', 'users', 'personnal_group']
27
-    __omit_fields__        = ['created', 'permissions', '_lRights']
28
-    __field_order__        = ['group_name', 'display_name', 'users']
29
-
30
-    __headers__ = dict(group_name='Unique name', display_name='Visible name')
31
-
32
-    group_name = tw2f.TextField('group_name')
33
-    display_name = tw2f.TextField('display_name', place_holder='agaga')
34
-    display_name = tw2f.TextField('display_name', place_holder='agaga')
35
-    personnal_group = tw2f.HiddenField('personnal_group', value='off')
36
-
37
-class GroupEditForm(sform.EditableForm):
38
-    __model__ = pma.Group
39
-    __require_fields__     = ['group_name', 'display_name', 'users']
40
-    __omit_fields__        = ['personnal_group', 'created', 'permissions', '_lRights']
41
-    __field_order__        = ['group_name', 'display_name']
42
-
43
-    __headers__ = dict(group_name='Unique name', display_name='Visible name')
44
-
45
-class GroupTableFillerForm(sfill.TableFiller):
46
-
47
-    __model__ = pma.Group
48
-    __limit_fields__ = ['group_id', 'group_name', 'display_name', 'users']
49
-    #__add_fields__ = {'associated_users':None}
50
-
51
-    def _do_get_provider_count_and_objs(self, director=None, **kw):
52
-        groups = pm.DBSession.query(pma.Group).filter(pma.Group.group_id>0).all()
53
-        return len(groups), groups
54
-
55
-    def users(self, obj):
56
-        users = ''.join(['<li>{0}</li>'.format(user.getDisplayName()) for user in obj.users])
57
-        return users.join(('<ul>', '</ul>'))
58
-
59
-class GroupTable(stable.TableBase):
60
-    __model__ = pma.Group
61
-    __limit_fields__ = ['group_id', 'group_name', 'display_name', 'users']
62
-    __headers__ = dict(group_id='id', group_name='Unique name', display_name='Visible name', users='Users')
63
-    __xml_fields__ = ['users']
64
-
65
-class GroupCrudConfig(CrudRestControllerConfig):
66
-    new_form_type = GroupRegistrationForm
67
-    edit_form_type = GroupEditForm
68
-    table_filler_type = GroupTableFillerForm
69
-    table_type = GroupTable
70
-
71
-
72
-########################################################################################################################
73
-##
74
-## USER RELATED STUFF
75
-##
76
-
77
-
78
-form_validator =  Schema(chained_validators=(FieldsMatch('password',
79
-                                                         'verify_password',
80
-                                                         messages={'invalidNoMatch':
81
-                                                         'Passwords do not match'}),))
82
-class UserRegistrationForm(AddRecordForm):
83
-    pass
84
-    __model__ = pma.User
85
-    __require_fields__     = ['display_name', 'email_address', 'password']
86
-    __omit_fields__        = ['_password', 'groups', 'created', 'user_id', '_lAllNodes']
87
-    __field_order__        = ['display_name', 'email_address', 'password', 'verify_password']
88
-
89
-    __fields__ = dict(display_name='Name', email_address='Email', password='Password', verify_password='Retype Password', )
90
-
91
-    email_address          = TextField('blop')
92
-    display_name           = TextField
93
-    verify_password        = PasswordField('verify_password')
94
-    groups = tw2f.MultipleSelectionField('groups')
95
-
96
-
97
-class UserTableFiller(sfill.TableFiller):
98
-
99
-    __model__ = pma.User
100
-    __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
101
-
102
-    def groups(self, obj):
103
-        groups = ''.join(['<li>{0}</li>'.format(group.getDisplayName()) for group in obj.groups if group.group_id>0])
104
-        return groups.join(('<ul>', '</ul>'))
105
-
106
-class UserTable(stable.TableBase):
107
-    __model__ = pma.User
108
-    __limit_fields__ = ['user_id', 'email_address', 'display_name', 'groups']
109
-    __field_order__ = ['user_id', 'display_name', 'email_address', 'groups']
110
-    __omit_fields__ = ['__actions__']
111
-    __headers__ = dict(user_id='id', email_address='Email', display_name='Name', groups='Groups')
112
-    __xml_fields__ = ['groups']
113
-
114
-
115
-class UserCrudConfig(CrudRestControllerConfig):
116
-    new_form_type = UserRegistrationForm
117
-    table_filler_type = UserTableFiller
118
-    table_type = UserTable
119
-
120
-########################################################################################################################
121
-##
122
-## GENERIC STUFF
123
-##
124
-
125
-class PodAdminConfig(AdminConfig):
126
-    user = UserCrudConfig
127
-    group = GroupCrudConfig
128
-    allow_only = tg.predicates.in_group('user')
129
-
130
-

+ 109 - 0
pboard/pboard/controllers/admingroup.py View File

@@ -0,0 +1,109 @@
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())

+ 159 - 0
pboard/pboard/controllers/adminuser.py View File

@@ -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())