Failing to display details only for member groups

30 views
Skip to first unread message

mostwanted

unread,
Mar 29, 2023, 9:00:52 AM3/29/23
to web2py-users

This is supposed to be simple but i'm failing to make it work! If it were about displaying the

How can I get business owners of businesses listed in the business table also referenced in clients_order table to view only requested orders of their businesses in the client_order table? I hope I’m making sense!


MODELS

db.define_table('business',
                Field('logo', 'upload', label=SPAN('Your company logo')),
                Field('banner', 'upload', writable=False, readable=False),
                Field('company_name', ),
                Field('product', 'reference product',),
                Field('tel'),

                Field('authority', 'reference auth_user', default=auth.user_id, readable=False, writable=False)

)

db.define_table('client_order',
                Field('company', 'reference business'),
                Field('buyer_name', required=True),
                Field('buyer_contact', required=True),
                Field('delivery_location', required=True),
                Field('quoted_item','list:string', required=True),
                Field('quantities','list:string', required=True),
                Field('status', requires=IS_IN_SET(['new', 'sent']), default='new', writable=False, readable=False),
                Field('the_timestamp', 'datetime', default=request.now, writable=False),
                format='%(buyer_name)s')


CONTROLLERS

@auth.requires_login()
def wall():
    # get the business ID for the logged-in user
    business_id = db.business(authority=auth.user_id)

    # check if the user has admin rights for the business
    if not auth.has_membership(role='admin', business=business_id):
        # if not, redirect them to a page indicating they don't have access
        session.flash = 'You do not have permission to access this page'
        redirect(URL('default', 'index'))
    # get the client orders for the logged-in user's business
    details = db(db.client_order.company == business_id).select()

    return dict(details=details)


@auth.requires_membership(role='admin')
def show_details():
    db(db.client_order.id == request.args(0, cast=int)).update(status='sent')
    details = db.client_order(request.args(0, cast=int))
    return dict(details=details)

Leonel Câmara

unread,
Mar 29, 2023, 1:33:49 PM3/29/23
to web2py-users
The easiest way is to put a common filter in client_order table, do something like this in your models

db.client_order._common_filter = lambda q:(db.client_order.company.belongs(db(db.business.authority==auth.user_id)._select(db.business.id)))

This will AND this query to any other query you make on the table.

mostwanted

unread,
Mar 30, 2023, 4:40:11 AM3/30/23
to web2py-users
Worked like a charm, thank you Leonel
Reply all
Reply to author
Forward
0 new messages