Skip to content

Commit

Permalink
Merge pull request #91 from level12/fix-form-relation-loads
Browse files Browse the repository at this point in the history
Fix form relation loads
  • Loading branch information
guruofgentoo committed Dec 2, 2019
2 parents 7bbaf42 + a80092c commit 01893f9
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 22 deletions.
46 changes: 27 additions & 19 deletions keg_auth/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,29 @@ def entities_from_ids(cls, ids):
return cls.query.filter(cls.id.in_(ids)).all()


class GroupsMixin(object):
group_ids = SelectMultipleField('Groups')

def after_init(self, args, kwargs):
self.group_ids.choices = get_group_options()
if kwargs.get('obj') and self.group_ids.raw_data is None:
self.group_ids.process_data([group.id for group in kwargs['obj'].groups])
super().after_init(args, kwargs)

def get_selected_groups(self):
return entities_from_ids(flask.current_app.auth_manager.entity_registry.group_cls,
self.group_ids.data)


class PermissionsMixin(object):
permission_ids = SelectMultipleField('Permissions')

def after_init(self, args, kwargs):
self.permission_ids.choices = get_permission_options()
if kwargs.get('obj') and self.permission_ids.raw_data is None:
self.permission_ids.process_data([perm.id for perm in kwargs['obj'].permissions])
super().after_init(args, kwargs)

def get_selected_permissions(self):
return entities_from_ids(flask.current_app.auth_manager.entity_registry.permission_cls,
self.permission_ids.data)
Expand All @@ -81,6 +101,12 @@ def get_selected_permissions(self):
class BundlesMixin(object):
bundle_ids = SelectMultipleField('Bundles')

def after_init(self, args, kwargs):
self.bundle_ids.choices = get_bundle_options()
if kwargs.get('obj') and self.bundle_ids.raw_data is None:
self.bundle_ids.process_data([bundle.id for bundle in kwargs['obj'].bundles])
super().after_init(args, kwargs)

def get_selected_bundles(self):
return entities_from_ids(flask.current_app.auth_manager.entity_registry.bundle_cls,
self.bundle_ids.data)
Expand Down Expand Up @@ -114,7 +140,7 @@ def html_link(obj):
flask.url_for(endpoint, objid=obj.id)
)

class User(PermissionsMixin, BundlesMixin, ModelForm):
class User(PermissionsMixin, BundlesMixin, GroupsMixin, ModelForm):
class Meta:
model = user_cls
only = _fields
Expand Down Expand Up @@ -143,17 +169,6 @@ class FieldsMeta:
confirm = PasswordField(_('Confirm Password'))
field_order = field_order + ('reset_password', 'confirm')

group_ids = SelectMultipleField(_('Groups'))

def after_init(self, args, kwargs):
self.permission_ids.choices = get_permission_options()
self.bundle_ids.choices = get_bundle_options()
self.group_ids.choices = get_group_options()

def get_selected_groups(self):
return entities_from_ids(flask.current_app.auth_manager.entity_registry.group_cls,
self.group_ids.data)

def get_object_by_field(self, field):
return user_cls.get_by(username=field.data)

Expand Down Expand Up @@ -182,10 +197,6 @@ class Meta:
class FieldsMeta:
name = FieldMeta(extra_validators=[ValidateUnique(html_link)])

def after_init(self, args, kwargs):
self.permission_ids.choices = get_permission_options()
self.bundle_ids.choices = get_bundle_options()

def get_object_by_field(self, field):
return group_cls.get_by(name=field.data)

Expand All @@ -210,9 +221,6 @@ class Meta:
class FieldsMeta:
name = FieldMeta(extra_validators=[ValidateUnique(html_link)])

def after_init(self, args, kwargs):
self.permission_ids.choices = get_permission_options()

def get_object_by_field(self, field):
return bundle_cls.get_by(name=field.data)

Expand Down
17 changes: 14 additions & 3 deletions keg_auth/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -708,11 +708,18 @@ def test_add_with_session_key(self):
assert resp.location.endswith('/users?session_key=foo')

def test_edit(self):
user_edit = ents.User.testing_create()
user_edit = ents.User.testing_create(
groups=[ents.Group.testing_create()],
bundles=[ents.Bundle.testing_create()],
permissions=[ents.Permission.testing_create()],
)

resp = self.client.get('/users/{}/edit'.format(user_edit.id))
assert resp.pyquery('#page-content')('h1').eq(0).text() == 'Edit User'
assert resp.form['email'].value == user_edit.email
assert resp.form['group_ids'].value == [str(obj.id) for obj in user_edit.groups]
assert resp.form['bundle_ids'].value == [str(obj.id) for obj in user_edit.bundles]
assert resp.form['permission_ids'].value == [str(obj.id) for obj in user_edit.permissions]
resp.form['email'] = 'foo@bar.baz'
resp = resp.form.submit()

Expand Down Expand Up @@ -900,10 +907,13 @@ def test_add(self):
assert group.bundles == [bundle_approve]

def test_edit(self):
group_edit = ents.Group.testing_create()
group_edit = ents.Group.testing_create(bundles=[ents.Bundle.testing_create()],
permissions=[ents.Permission.testing_create()])

resp = self.client.get('/groups/{}/edit'.format(group_edit.id))
assert resp.form['name'].value == group_edit.name
assert resp.form['bundle_ids'].value == [str(obj.id) for obj in group_edit.bundles]
assert resp.form['permission_ids'].value == [str(obj.id) for obj in group_edit.permissions]
resp.form['name'] = 'test editing a group'
resp = resp.form.submit()

Expand Down Expand Up @@ -1019,10 +1029,11 @@ def test_add(self):
assert bundle.permissions == [perm_approve]

def test_edit(self):
bundle_edit = ents.Bundle.testing_create()
bundle_edit = ents.Bundle.testing_create(permissions=[ents.Permission.testing_create()])

resp = self.client.get('/bundles/{}/edit'.format(bundle_edit.id))
assert resp.form['name'].value == bundle_edit.name
assert resp.form['permission_ids'].value == [str(obj.id) for obj in bundle_edit.permissions]
resp.form['name'] = 'test editing a bundle'
resp = resp.form.submit()

Expand Down
5 changes: 5 additions & 0 deletions keg_auth_ta/model/entities.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ class User(keg_auth.UserEmailMixin, keg_auth.UserMixin, EntityMixin, db.Model):
class UserNoEmail(keg_auth.UserMixin, EntityMixin, db.Model):
__tablename__ = 'users_no_email'

# this model will not be assigned the relationships the form expects to be present
permissions = []
bundles = []
groups = []


class UserWithToken(keg_auth.UserEmailMixin, keg_auth.UserTokenMixin, EntityMixin, db.Model):
__tablename__ = 'users_with_token'
Expand Down

0 comments on commit 01893f9

Please sign in to comment.