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
> >
> >
>

Reply via email to