Here an improved version of the controller that takes care if user has membership to differents groups. The "try" is to check if the user has a set of group allowed... It could be better in the future to make a function "has_group_allowed".
You need to add this model : db.define_table('auth_group_allowed', Field('id','id'), Field('user_id','db.auth_user'), Field('group_id','db.auth_group'), Field('active_gr','boolean'), migrate=False, sequence_name='auth_group_allowed_id_seq') db.auth_group_allowed.user_id.requires=IS_IN_DB(db,'auth_user.id','%(first_name)s %(last_name)s (%(id)s)') db.auth_group_allowed.group_id.requires=IS_IN_DB(db,'auth_group.id','%(role)s (%(id)s)') Then configure your RBAC correctly... Add to user you want the permission to change his role by adding the set of allowed roles he is allowed. Then specify wich role he is already in or the function chmembership will fix it automatically anyway at first execution. Here the function : @auth.requires_login() def chmembership(): try: if db(db.auth_group_allowed.user_id==auth.user.id)\ .select(db.auth_group_allowed.user_id,distinct=True).first().user_id== auth.user.id: if auth.has_membership(auth.id_group('technician')) or auth.has_membership(auth.id_group('coordinator')) or auth.has_membership(auth.id_group('admin')): active_gr=db(db.auth_group_allowed.user_id==auth.user.id\ and db.auth_group_allowed.active_gr=='TRUE')\ .select(db.auth_group_allowed.group_id).first().group_id membershipID=db(db.auth_membership.group_id==active_gr\ and db.auth_membership.user_id==auth.user.id )\ .select(db.auth_membership.id).first().id rows=db(db.auth_group_allowed.user_id==auth.user.id ).select(db.auth_group_allowed.group_id) groupSet={} for row in rows: authgrouprole=db(db.auth_group.id ==row.group_id).select(db.auth_group.role).first().role groupSet[row.group_id]=authgrouprole db.auth_membership.group_id.requires=IS_IN_SET(groupSet) form = crud.update(db.auth_membership,membershipID) new_gr=db(db.auth_membership.id ==membershipID).select(db.auth_membership.group_id).first().group_id db(db.auth_group_allowed.user_id==auth.user.id\ and db.auth_group_allowed.active_gr=='TRUE').update(active_gr='FALSE') db(db.auth_group_allowed.user_id==auth.user.id\ and db.auth_group_allowed.group_id==new_gr).update(active_gr='TRUE') return dict(form=form, active_gr=active_gr, membershipID=membershipID, groupSet=groupSet) except AttributeError: redirect(URL(request.application,'default','index')) session.flash = T('invalid request') It is not correctly tested so there is no garranty ;-) I appreciate feed back! Regards Richard On Tue, Sep 21, 2010 at 7:09 PM, Richard Vézina <ml.richard.vez...@gmail.com > wrote: > Hello Massimo, > > Here what I found as a temporarily solution : > > I made a auth_group_allowed that is a m2m relation between auth_user and > auth_group. So, we can attribute each user a set of groups in which he is > allowed to change with. > > Then this controller can let the user pick the group he want : > > @auth.requires_login() > def chmembership(): > j=db(db.auth_membership.user_id==auth.user.id).select( > db.auth_membership.id).first().id > rows=db(db.auth_group_allowed.user_id==auth.user.id > ).select(db.auth_group_allowed.group_id) > groupSet={} > for row in rows: > authgrouprole=db(db.auth_group.id > ==row.group_id).select(db.auth_group.role).first().role > groupSet[row.group_id]=authgrouprole > db.auth_membership.group_id.requires=IS_IN_SET(groupSet) > form = crud.update(db.auth_membership,j) > > return dict(form=form, j=j, groupSet=groupSet) > > It's just the beginning since I can't handle the case were a user is > involve in more then one group for now. > > Please comment? > > Regards > > Richard > > > On Fri, Sep 17, 2010 at 9:56 AM, mdipierro <mdipie...@cs.depaul.edu>wrote: > >> no and it is very much needed. Any takers? >> >> On Sep 17, 8:50 am, Richard Vézina <ml.richard.vez...@gmail.com> >> wrote: >> > Hello, >> > >> > I need to let some of my user changing of membership into a plage of >> > existing members number. Is there mechanism already existing in web2py >> or do >> > I have to program it from scratch? >> > >> > Thanks >> > >> > Richard >> > >