in auth_user I have the request_tenant field, as we have already discussed.
It is set like this:
if 'auth' in session:
db.auth_user.request_tenant.default = session.auth.user.request_tenant
else:
db.auth_user.request_tenant.default = ''
Each tenant has a different domain of the form tenant.example.com.
I create an auth_user record for the tenant's administrator and make his
request_tenant field the same as his domain.
Then when the administrator creates other users, the request tenant default
makes the new user's request_tenant same as the administrator's.
I have two other tables something like this.
db.define_table('tenant', Field('name', ....), Field('domain', ...), ...)
db.define_table('tenant_group', Field('tenant', db.tenant,),
Field('group_id'), Field('is_default', 'boolean', default=False)...)
db.tenant_group.tenant.requires = IS_IN_DB(db, 'tenant.domain', '%(name)s')
I need the tenant group table because some tenants have different access
rights.
The is_default field identifies which access rights for all the users
related to the tenant.
Then the controller is something like this:
def add():
form = SQLFORM(db.auth_user, ...)
if form.process().accepted:
query = ((db.tenant_group.tenant==session.auth.user.request_tenant) &
(db.tenant_group.is_default==True))
rows = db(query).select(db.tenant_group.group_id)
for r in rows:
# this would be faster with a bulk insert!
db.auth_membership[0] = dict(user_id=form.vars.id,
group_id=r.group_id)
session.flash = blah
redirect(URL('edit')) # This is so the admin can further refine the
user's access privileges.
On Monday, July 2, 2012 7:56:16 PM UTC-4, Ovidio Marinho wrote:
>
> You mean that this routine makes your administrators register users so
> their instances. How this works can explain?
>
>
>
> Ovidio Marinho Falcao Neto
> Web Developer
> [email protected]
> [email protected]
> ITJP - itjp.net.br
> 83 8826 9088 - Oi
> 83 9334 0266 - Claro
> Brasil
>
>
>
>
> 2012/1/17 howesc <[email protected]>
>
>> i do this for admins of one of my sites: (note that i have
>> customizations to my auth_user table so this is not a drop-in method for
>> your site).
>>
>> @auth.requires_membership('admin')
>> def auth_user():
>> users_form=None
>> retval = dict(aahome=A("Forms Home", _href=URL(r=request, f='index')))
>> role_values = []
>> #remove bio requirements from auth pane
>> db.auth_user.bio.requires=None
>>
>> table = db.auth_user
>>
>> if request.args and request.args[0]:
>> selected_membership = db(db.auth_membership.user_id ==
>> request.args[0]).select(db.auth_membership.group_id)
>> #build the current roles list, before the update
>> query = None
>> for r in selected_membership:
>> if query == None:
>> query = db(db.auth_group.id ==
>> r.group_id).select(orderby=db.auth_group.role)
>> else:
>> query = query | db(db.auth_group.id ==
>> r.group_id).select(orderby=db.auth_group.role)
>>
>> #@TODO: remove user specific roles from query
>> roles = query
>>
>> retval['all roles for %s' % request.args[0]] =
>> SQLTABLE(roles,linkto,orderby=True,_class='sortable')
>> for role in roles:
>> role_values.append(role.id)
>>
>> #check the form submit
>> users_form = SQLFORM(table, request.args[0])
>> if users_form.accepts(request.vars, session,
>> formname='userupdate'):
>> for role in request.vars.roles:
>> # currently trusts that only valid role id's will be
>> submitted
>> if not auth.has_membership(role, users_form.vars.id):
>> auth.add_membership(role, users_form.vars.id)
>> for role in roles:
>> #delete roles that have been removed
>> if str(role.id) not in request.vars.roles:
>> auth.del_membership(role.id,
>> users_form.vars.id)
>>
>> redirect(URL(r=request,f='auth_user', args=request.args))
>>
>>
>> #add roles multi-select to the form
>> rows = db(db.auth_group.id > 0).select(db.auth_group.id,
>> db.auth_group.role, orderby=db.auth_group.role)
>>
>> import logging
>> logging.info(rows)
>> logging.info(role_values)
>> opts = [OPTION(r['role'], _value=r['id']) for r in rows]
>>
>> users_form.components[0].insert(-1,
>> TR(TD('Roles:'),
>> TD(SELECT(opts, _name="roles",
>> #@TODO: add better requires if
>> we can
>> # make it work with lists
>> requires=IS_NOT_EMPTY(),
>> _multiple=True,
>> value=role_values))))
>>
>> else:
>> users_form = SQLFORM(table)
>> if users_form.accepts(request.vars, session,
>> formname='userupdate'):
>> #create role
>> auth.add_membership(auth.add_group('user_%d' %
>> users_form.vars.id,'user_%d' % users_form.vars.id), users_form.vars.id)
>> ## a group for this user
>>
>>
>> #get list of users to display
>> orderby=request.vars.orderby
>> if orderby == None:
>> orderby=db.auth_user.id
>> rows = db( db.auth_user.id > 0
>> ).select(db.auth_user.id,
>> db.auth_user.first_name,
>> db.auth_user.last_name,
>> db.auth_user.email,
>> db.auth_user.registration_key)
>>
>> headers = {'auth_user.id':T("ID"),
>> 'auth_user.first_name':T("First Name"),
>> 'auth_user.last_name':T("Last Name"),
>> 'auth_user.email':T("Email"),
>> 'auth_user.registration_key':T("Registration Key")}
>> tbl = SQLTABLE(rows,linkto,orderby=True,_class='sortable',
>> truncate=128,
>> headers=headers)
>>
>> retval['aform'] = users_form
>> retval['users'] = tbl
>>
>> return retval
>>
>>
>