I had syntax error : @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)\ & (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)\ & (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) db.auth_membership.user_id.readable=\ db.auth_membership.user_id.writable=False chmbshp = crud.update(db.auth_membership,membershipID,deletable=False) 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(chmbshp=chmbshp, active_gr=active_gr, membershipID=membershipID, groupSet=groupSet) except AttributeError: pass There is a major threat with that design... The the permission to the auth_membership table has to be open to any user... The only other solution I can see for now is to triggering the change on the active_gr field of the added table auth_group_allowed... Richard On Wed, Sep 22, 2010 at 3:08 PM, Richard Vézina <ml.richard.vez...@gmail.com > wrote: > Forgot to "writable=False" : > > db.auth_membership.user_id.represent=\ > lambda value: "%(first_name)s %(last_name)s (%(id)s)" > %db.auth_user[value] > db.auth_membership.group_id.represent=\ > lambda value: "%(role)s (%(id)s)" %db.auth_group[value] > > 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)') > > @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) > db.auth_membership.user_id.writable=False > 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,'accueil','index')) > session.flash = T('invalid request') > > Thanks. > > Richard > > On Wed, Sep 22, 2010 at 2:53 PM, mdipierro <mdipie...@cs.depaul.edu>wrote: > >> will look asap. Thank you. >> >> On Sep 22, 11:49 am, Richard Vézina <ml.richard.vez...@gmail.com> >> wrote: >> > 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 >> > >> > >> > >