Hi Jim,
         This works like a charm. Thank you for this. It is what I expected 
and wanted to achieve with Auth. I'll check my new project for what I may 
be doing wrong, for now it seems that the scaffolding admin interface I 
want to use for my app is the one that is the culprit. It has lots of 
custom js and css files. I would need to figure out a way to merge them 
with it properly.  Again, Thank you! for your patience and wonderful 
support. And thank you everyone. 

Regards,

Rahul. 

On Sunday, October 28, 2018 at 6:33:25 AM UTC+5:30, Jim S wrote:
>
> Rahul
>
> Let's try this a different way.
>
> Attached is a simple multi-tenant app with one table.
>
> Does this do what you need?
>
> 1.  Create a new project in web2py
> 2.  Replace db.py in your models dir with this one
> 3.  Replace default.py in your controllers dir with this one
> 4.  Replace index.html in views/default with this one
> 5.  Add notes.html to views/default
> 6.  Replace storage.sqlite in your databases dir with this one
>
> Depending on your version of web2py this should all work.
>
> I've created 2 logins
>
> elvis - password is password
> blueeyes - password is password
>
> Click on the notes link logged in as each of them and you'll see different 
> notes show up based on the common filter.
>
> -Jim
>
> On Sat, Oct 27, 2018 at 12:52 PM Rahul <rahul....@gmail.com <javascript:>> 
> wrote:
>
>> Hi Dave and Jim,
>>            Please find the files in the zipped archive. I have added 
>> default.py, db.py, index.html and also layout file which I am converting to 
>> use with web2py. called ace.html. I have also attached the views\login.html 
>> file since I am extending this file  specifically for login form as it is 
>> different than layout file. Let me know. Thanks!
>>
>>
>> Regards,
>>
>> Rahul 
>>
>> On Friday, October 26, 2018 at 5:11:12 PM UTC+5:30, Jim S wrote:
>>>
>>> Can you show the entire db.py, default py and index.html?
>>>
>>> Jim
>>>
>>>
>>> On Fri, Oct 26, 2018, 1:44 AM Rahul <rahul....@gmail.com> wrote:
>>>
>>>> Nope - doesnt help. I commented out all the user functions defined in 
>>>> the controller and 
>>>>
>>>>
>>>> # ---- User functions ---
>>>> '''def login(): return dict(form=auth.login())
>>>> def register(): return dict(form=auth.register())
>>>> def retrieve_password(): return dict(form=auth.reset_password())
>>>> def logout(): return dict(form=auth.logout())
>>>> def profile(): return dict(form=auth.profile())
>>>> '''
>>>>
>>>> I even decorated index - It does take me to the login screen but from 
>>>> there nothing happens. It just wont log me in like it did before. Also,  I 
>>>> have two users in database but none work now.  Again, register seems to 
>>>> fail (It did work earlier) but now it doesnt. See screenshot of both 
>>>> screens. Looks like I must be really doing something weird. If this wont 
>>>> work by this Sunday. I may go back to my old style of coding and do it all 
>>>> by myself. I've seriously lost 10 days reading and experimenting with Auth 
>>>> to make it work . Not too much coded. 
>>>>
>>>> @auth.requires_login()
>>>> def index():
>>>>     response.flash = T("Hello User")
>>>>     #redirect(URL(r=request, c='default/user', f='login')) # Redirects 
>>>> user to login page
>>>>     return dict(message=T('Welcome to web2py!'))
>>>>
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Rahul
>>>>
>>>>
>>>>
>>>> On Thursday, October 25, 2018 at 6:02:45 PM UTC+5:30, Jim S wrote:
>>>>>
>>>>> Having the default user() functions is all you need.  I'd try 
>>>>> commenting out your 'user' functions.
>>>>>
>>>>> -Jim
>>>>>
>>>>> On Wednesday, October 24, 2018 at 10:59:45 PM UTC-5, Rahul wrote:
>>>>>>
>>>>>> Yes this is in default.py. Please excuse me for my bad code as I am 
>>>>>> still experimenting with Auth and not totally familiar with the 
>>>>>> implementation. Is this the right way that I am doing it? or only having 
>>>>>> user() function is enough ? 
>>>>>>
>>>>>> Thanks, Rahul
>>>>>>
>>>>>> On Wednesday, October 24, 2018 at 9:45:21 PM UTC+5:30, Jim S wrote:
>>>>>>>
>>>>>>> I'm confused.  Is this code in your controller somewhere?
>>>>>>>
>>>>>>> # ---- User functions ---
>>>>>>> def login(): return dict(form=auth.login())
>>>>>>> def register(): return dict(form=auth.register())
>>>>>>> def retrieve_password(): return dict(form=auth.reset_password())
>>>>>>> def logout(): return dict(form=auth.logout())
>>>>>>> def profile(): return dict(form=auth.profile())
>>>>>>>
>>>>>>> You shouldn't need it.  To override the default login stuff I've 
>>>>>>> just modified the one in default.py.
>>>>>>>
>>>>>>> -Jim
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Tuesday, October 23, 2018 at 11:26:45 PM UTC-5, Rahul wrote:
>>>>>>>>
>>>>>>>> The user function remains as-is - No modifications done. 
>>>>>>>>
>>>>>>>> def user():
>>>>>>>>     """
>>>>>>>>     exposes:
>>>>>>>>     http://..../[app]/default/user/login
>>>>>>>>     http://..../[app]/default/user/logout
>>>>>>>>     http://..../[app]/default/user/register
>>>>>>>>     http://..../[app]/default/user/profile
>>>>>>>>     http://..../[app]/default/user/retrieve_password
>>>>>>>>     http://..../[app]/default/user/change_password
>>>>>>>>     http://..../[app]/default/user/bulk_register
>>>>>>>>     use @auth.requires_login()
>>>>>>>>         @auth.requires_membership('group name')
>>>>>>>>         @auth.requires_permission('read','table name',record_id)
>>>>>>>>     to decorate functions that need access control
>>>>>>>>     also notice there is http://..../[app]/appadmin/manage/auth to 
>>>>>>>> allow administrator to manage users
>>>>>>>>     """
>>>>>>>>     return dict(form=auth())
>>>>>>>>
>>>>>>>> I am using the specified functions to expose methods as below - 
>>>>>>>> # ---- User functions ---
>>>>>>>> def login(): return dict(form=auth.login())
>>>>>>>> def register(): return dict(form=auth.register())
>>>>>>>> def retrieve_password(): return dict(form=auth.reset_password())
>>>>>>>> def logout(): return dict(form=auth.logout())
>>>>>>>> def profile(): return dict(form=auth.profile())
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> and the corresponding files reside in \views\  *not in* 
>>>>>>>> \views\default - I am not sure if the application is even picking up 
>>>>>>>> these 
>>>>>>>> files. 
>>>>>>>>
>>>>>>>> Note - I have extended the Auth (auth_user) table and added 
>>>>>>>> workspace and other fields - This will be specified everytime I add a 
>>>>>>>> new 
>>>>>>>> user. I would filter out the results as you mentioned but only after 
>>>>>>>> all 
>>>>>>>> the login stuff works properly.
>>>>>>>>
>>>>>>>> auth.settings.extra_fields['auth_user'] = [
>>>>>>>>     Field ('workspace', length=128),
>>>>>>>>
>>>>>>>> Sincerely,
>>>>>>>>
>>>>>>>> Rahul 
>>>>>>>>
>>>>>>>> On Tuesday, October 23, 2018 at 7:49:48 PM UTC+5:30, Jim S wrote:
>>>>>>>>>
>>>>>>>>> Did you modify the user() function in default.py?  Or, are you 
>>>>>>>>> using your own custom login functions?
>>>>>>>>>
>>>>>>>>> -Jim
>>>>>>>>>
>>>>>>>>> On Tuesday, October 23, 2018 at 7:59:21 AM UTC-5, Rahul wrote:
>>>>>>>>>>
>>>>>>>>>> Hi Jim, All,
>>>>>>>>>>          Okay I tried this - And I also decorated index() 
>>>>>>>>>> function in controller like below as I want to redirect the user to 
>>>>>>>>>> login 
>>>>>>>>>> page rather than directly jumping to index.html 
>>>>>>>>>>
>>>>>>>>>> # ---- example index page ----
>>>>>>>>>> @auth.requires_login()
>>>>>>>>>> def index():
>>>>>>>>>>     response.flash= T("Hello World")
>>>>>>>>>>     return dict(message=T('Welcome to web2py!'))
>>>>>>>>>>
>>>>>>>>>> However, now when I put the credentials username and password, it 
>>>>>>>>>> doesnt log me in - I generates the below URL like below and appends 
>>>>>>>>>> it to 
>>>>>>>>>> url box. What might I be missing because it was logging me in fine 
>>>>>>>>>> sometime 
>>>>>>>>>> ago but now it doesnt allow. Note I did cleanup a lot of HTML code 
>>>>>>>>>> from my 
>>>>>>>>>> login page. There sure is something going on here that I am not 
>>>>>>>>>> catching - 
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> http://
>>>>>>>>>> 127.0.0.1:8000/scaffolding_app/default/user/login?username=rahul&password=integer10&_next=%2Fscaffolding_ace_admin%2Fdefault%2Findex&_formkey=0c0c022a-377d-47dd-bd72-a13e8ee6f387&_formname=login
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  
>>>>>>>>>>
>>>>>>>>>> Sincerely, Rahul D. 
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Friday, October 19, 2018 at 12:24:19 PM UTC+5:30, Rahul wrote:
>>>>>>>>>>>
>>>>>>>>>>> Hi Jim,
>>>>>>>>>>>         That makes sense. I will check it out on which option to 
>>>>>>>>>>> go. Thanks! for all the guidance. 
>>>>>>>>>>>
>>>>>>>>>>> Thank you,
>>>>>>>>>>>
>>>>>>>>>>> *Rahul Dhakate*
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday, October 17, 2018 at 7:57:32 PM UTC+5:30, Jim S 
>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Rahul
>>>>>>>>>>>>
>>>>>>>>>>>> First, what I was referring to was common_filters, not common 
>>>>>>>>>>>> fields.  Here is the scenario as I see it.
>>>>>>>>>>>>
>>>>>>>>>>>> In you auth_user table you have a workspace field.  Then in 
>>>>>>>>>>>> other tables that are workspace-specific you also have a workspace 
>>>>>>>>>>>> field to 
>>>>>>>>>>>> show which workspace they relate to
>>>>>>>>>>>>
>>>>>>>>>>>> Here is how I think I would handle it, assuming I am 
>>>>>>>>>>>> understanding your need.  And, assuming that the workspace 
>>>>>>>>>>>> identifier is 
>>>>>>>>>>>> stored on the user record.  You wouldn't gather it on the login 
>>>>>>>>>>>> page.
>>>>>>>>>>>>
>>>>>>>>>>>> In db.py I'd have code that would check to see if the user is 
>>>>>>>>>>>> logged in.  If so, then set the common filters for the 
>>>>>>>>>>>> workspace-specific 
>>>>>>>>>>>> tables
>>>>>>>>>>>>
>>>>>>>>>>>> if auth.is_logged_in:
>>>>>>>>>>>>>     db.related_table_1._common_filter = lambda query: 
>>>>>>>>>>>>> db.related_table_1.workspace = auth.user.workspace
>>>>>>>>>>>>>     db.related_table_2._common_filter = lambda query: 
>>>>>>>>>>>>> db.related_table_2.workspace = auth.user.workspace
>>>>>>>>>>>>>     db.related_table_3._common_filter = lambda query: 
>>>>>>>>>>>>> db.related_table_3.workspace = auth.user.workspace
>>>>>>>>>>>>>     db.related_table_4._common_filter = lambda query: 
>>>>>>>>>>>>> db.related_table_4.workspace = auth.user.workspace
>>>>>>>>>>>>>     ...etc...
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Make sense?
>>>>>>>>>>>>
>>>>>>>>>>>> Anyone else out there that's done this and can show a better 
>>>>>>>>>>>> way?  
>>>>>>>>>>>>
>>>>>>>>>>>> -Jim
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> NOTE - you might also skip the common filters if you're logging 
>>>>>>>>>>>> in as an admin.  Then you might want to see data for all workspaces
>>>>>>>>>>>>
>>>>>>>>>>>> NOTE 2 - If you really want people to specify their workspace 
>>>>>>>>>>>> when they login (meaning they have access to all of them but they 
>>>>>>>>>>>> choose 
>>>>>>>>>>>> which one on login) then you'd have to override the default login 
>>>>>>>>>>>> code to 
>>>>>>>>>>>> gather that extra variable and store it in your session somewhere. 
>>>>>>>>>>>>  Then 
>>>>>>>>>>>> use that instead of auth.user.workspace when building your filters.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, Oct 17, 2018 at 2:06 AM Rahul <rahul....@gmail.com> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi Jim,
>>>>>>>>>>>>>           I am afraid no I didn't check that section but I 
>>>>>>>>>>>>> just finished reading it. Thanks! for directing me to it. Looks 
>>>>>>>>>>>>> like a new 
>>>>>>>>>>>>> addition to DAL (might be a couple of versions back) & looks 
>>>>>>>>>>>>> promising. So 
>>>>>>>>>>>>> now, we can specify something like request_tenant using 
>>>>>>>>>>>>> db._common_fields  
>>>>>>>>>>>>> field parameter. 
>>>>>>>>>>>>>
>>>>>>>>>>>>> I would need it for all tables so is there a specific syntax 
>>>>>>>>>>>>> like below that I am required to specify in each table I create ?
>>>>>>>>>>>>>
>>>>>>>>>>>>> db._common_fields.append(Field('request_tenant',
>>>>>>>>>>>>>                                default=request.env.http_host,
>>>>>>>>>>>>>                                writable=False))
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Also, can we set the default value to a field value that we 
>>>>>>>>>>>>> can query or pass as a session variable like session.workspace == 
>>>>>>>>>>>>> 'some 
>>>>>>>>>>>>> workspace name'  while the user logs in ? 
>>>>>>>>>>>>>
>>>>>>>>>>>>> default=session.workspace,
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> If yes - what do I need to modify to add this additional field 
>>>>>>>>>>>>> in Auth so it will be an input field for the user to key in the 
>>>>>>>>>>>>> workspace 
>>>>>>>>>>>>> name. Then I can store this workspace in session variable and use 
>>>>>>>>>>>>> it. The 
>>>>>>>>>>>>> reason is I want a group of users (accessing the same app and 
>>>>>>>>>>>>> database from 
>>>>>>>>>>>>> different locations) belonging to same workspace.  This is how 
>>>>>>>>>>>>> they are 
>>>>>>>>>>>>> grouped. please see the screenshot posted from my actual 
>>>>>>>>>>>>> application login. 
>>>>>>>>>>>>> In it I use workspace name as well to validate but after reading 
>>>>>>>>>>>>> the book 
>>>>>>>>>>>>> seems like we would not require workspace for validation if we 
>>>>>>>>>>>>> can have the 
>>>>>>>>>>>>> user provide the field for redirection and for us to grab the 
>>>>>>>>>>>>> session 
>>>>>>>>>>>>> variable. 
>>>>>>>>>>>>>
>>>>>>>>>>>>> Or is this not needed at all after we use common fields ?  
>>>>>>>>>>>>>
>>>>>>>>>>>>> I hope I am clear and make sense  :-) 
>>>>>>>>>>>>>
>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>
>>>>>>>>>>>>> Rahul
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Tuesday, October 16, 2018 at 7:49:49 PM UTC+5:30, Jim S 
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Have you looked at common filters?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> http://web2py.com/books/default/chapter/29/06/the-database-abstraction-layer?search=common+filter#Common-filters
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> -Jim
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Tuesday, October 16, 2018 at 7:35:04 AM UTC-5, Rahul wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Hey Everyone,
>>>>>>>>>>>>>>>        Greetings! I have a question. I went through Auth 
>>>>>>>>>>>>>>> documentation and understood that we can add extra fields to 
>>>>>>>>>>>>>>> the Auth 
>>>>>>>>>>>>>>> tables. However, I still want to be a little more clear to 
>>>>>>>>>>>>>>> achieve below - 
>>>>>>>>>>>>>>> I am currently using three fields for a multi-tenant system 
>>>>>>>>>>>>>>> like workspace, 
>>>>>>>>>>>>>>> username and password. Here workspace depicts where the user 
>>>>>>>>>>>>>>> belongs to 
>>>>>>>>>>>>>>> (see explanation in Q1 below) I am currently using my own code 
>>>>>>>>>>>>>>> to manage 
>>>>>>>>>>>>>>> this stuff manually (almost everything that auth does), now 
>>>>>>>>>>>>>>> though I want 
>>>>>>>>>>>>>>> to give Auth a try and tailor it to fit my needs. I dont want 
>>>>>>>>>>>>>>> to maintain 
>>>>>>>>>>>>>>> that amount of code and use the existing API. Can I get help on 
>>>>>>>>>>>>>>> achieving 
>>>>>>>>>>>>>>> that in the simplest way. If it works, I would switch to using 
>>>>>>>>>>>>>>> Auth 
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> * Q1]* How can we use Auth to add one more extra field for 
>>>>>>>>>>>>>>> authentication when I want a system to validate login based on 
>>>>>>>>>>>>>>> three 
>>>>>>>>>>>>>>> parameters like - Validation needs to be done based on all 
>>>>>>>>>>>>>>> three parameters 
>>>>>>>>>>>>>>> specified. For each application I can use 'n' number of unique 
>>>>>>>>>>>>>>> workspaces 
>>>>>>>>>>>>>>> and 'n' number of users would belong to these workspaces. How 
>>>>>>>>>>>>>>> to do this ?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>    1. *workspace *- An alpha numeric field that would store 
>>>>>>>>>>>>>>>    a unique name denoting users belonging to a particular set   
>>>>>>>>>>>>>>> (For example 
>>>>>>>>>>>>>>>    users working in a specific  location like los-angeles or 
>>>>>>>>>>>>>>> washington)  or 
>>>>>>>>>>>>>>>    an office location like michigan, nevada or Zones like 
>>>>>>>>>>>>>>> north, south  .. 
>>>>>>>>>>>>>>>    sort-of etc. )
>>>>>>>>>>>>>>>    2. *username *- Its available already 
>>>>>>>>>>>>>>>    3. *password *- Its available already
>>>>>>>>>>>>>>>    
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> *Q2]* Which all tables need to be modified ? 
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> *Q3] *Any changes in any other code in any files ? 
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I know I can clone my app multiple times and support 
>>>>>>>>>>>>>>> multi-tenancy however, if this can be achieved with Auth - that 
>>>>>>>>>>>>>>> would be 
>>>>>>>>>>>>>>> great. 
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> *Rahul *
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>> -- 
>>>>>>>>>>>>> Resources:
>>>>>>>>>>>>> - http://web2py.com
>>>>>>>>>>>>> - http://web2py.com/book (Documentation)
>>>>>>>>>>>>> - http://github.com/web2py/web2py (Source code)
>>>>>>>>>>>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>>>>>>>>>>> --- 
>>>>>>>>>>>>> You received this message because you are subscribed to a 
>>>>>>>>>>>>> topic in the Google Groups "web2py-users" group.
>>>>>>>>>>>>> To unsubscribe from this topic, visit 
>>>>>>>>>>>>> https://groups.google.com/d/topic/web2py/6SscBvMorU0/unsubscribe
>>>>>>>>>>>>> .
>>>>>>>>>>>>> To unsubscribe from this group and all its topics, send an 
>>>>>>>>>>>>> email to web2py+un...@googlegroups.com.
>>>>>>>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>>>>>>>
>>>>>>>>>>>> -- 
>>>> Resources:
>>>> - http://web2py.com
>>>> - http://web2py.com/book (Documentation)
>>>> - http://github.com/web2py/web2py (Source code)
>>>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>>>> --- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "web2py-users" group.
>>>> To unsubscribe from this topic, visit 
>>>> https://groups.google.com/d/topic/web2py/6SscBvMorU0/unsubscribe.
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>> web2py+un...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> -- 
>> Resources:
>> - http://web2py.com
>> - http://web2py.com/book (Documentation)
>> - http://github.com/web2py/web2py (Source code)
>> - https://code.google.com/p/web2py/issues/list (Report Issues)
>> --- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "web2py-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/web2py/6SscBvMorU0/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> web2py+un...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to