Hi people.
i have a custom app that lists the serial numbers on the portal based on the filed partner_id on stock.production.lots
When the main user is logged in assosiated with the partner_id is connected can see the records. When i login as a user that is a child of the main user then i cannot see the records. Im sure it has to do with the domain but i cannot find the issue. Any help would be appreciated
# -*- coding: utf-8 -*-
from collections import OrderedDict
from odoo import http, _
from odoo.http import request
from odoo.osv.expression import OR, AND
from odoo.addons.portal.controllers.portal import CustomerPortal, pager as portal_pager
class ProductStatusCustomerPortal(CustomerPortal):
def _prepare_home_portal_values(self, counters):
values = super()._prepare_home_portal_values(counters)
if 'product_status_count' in counters:
Lots = request.env['stock.production.lot']
condition_id = 1
domain = Lots._product_status_get_portal_domain()
values['product_status_count'] = Lots.sudo().search_count(domain)
return values
def _get_searchbar_inputs(self):
return {
'serial': {'input': 'serial', 'label': _('Search in Serial')},
# 'product': {'input': 'product', 'label': _('Search in Parts')},
# 'owner': {'input': 'owner', 'label': _('Search in Owner')},
# 'part': {'input': 'part', 'label': _('Search in Part Number')},
# 'condition': {'input': 'condition', 'label': _('Search in Condition')},
# 'box': {'input': 'box', 'label': _('Search in Box number')},
# 'location': {'input': 'location', 'label': _('Search in Location')},
# 'all': {'input': 'all', 'label': _('Search in All')},
}
def _get_searchbar_groupby(self):
return {
'none': {'input': 'none', 'label': _('None')},
# 'owner': {'input': 'owner', 'label': _('Owner')},
'product': {'input': 'product', 'label': _('Product')},
'condition': {'input': 'condition', 'label': _('Condition')},
}
def _get_search_domain(self, search_in, search, condition_ids=None):
search_domain = []
if search and search_in in ('serial', 'owner', 'part', 'condition', 'box', 'location', 'product', 'all'):
print("\n \n::::search_in::::", search_in, search)
if search_in == 'condition':
if show_on_portal:
search_domain = [('condition_id.show_on_portal', '=', True), ('condition_id.name', 'ilike', search)]
else:
search_domain = [('condition_id', 'ilike', search)]
elif search_in == 'serial':
search_domain = [('name', 'ilike', search)]
elif search_in == 'all':
# Handle 'all' case separately or remove it from search options
pass
else:
search_domain = [(search_in, 'ilike', search)]
else:
search_domain = [('condition_id.show_on_portal', '=', True)]
return search_domain
def _get_groupby_mapping(self):
return {
'owner': 'partner_id',
'product': 'product_id',
'condition': 'condition_id',
}
def _get_searchbar_filters(self):
res = {
'all': {'label': _('All'), 'domain': self._get_search_domain('all', '')},
}
allowed_conditions = request.env['stock.production.lot.condition'].sudo().search([('show_on_portal', '=', True)])
for condition in allowed_conditions:
res[str(condition.id)]}
return res
@http.route(['/my/product_status', '/my/product_status/page/'], type='http', auth="user", website=True)
def portal_my_product_status(self, page=1, sortby=None, filterby=None, search=None, search_in='serial', groupby='none', **kw):
Lots = request.env['stock.production.lot']
domain = Lots._product_status_get_portal_domain()
Lots_sudo = Lots.sudo()
values = self._prepare_portal_layout_values()
_items_per_page = 100
searchbar_inputs = self._get_searchbar_inputs()
searchbar_groupby = self._get_searchbar_groupby()
searchbar_filters = self._get_searchbar_filters()
if search and search_in:
domain += self._get_search_domain(search_in, search)
if not filterby:
filterby = 'all'
domain = AND([domain, searchbar_filters[filterby]['domain']])
product_status_count = Lots_sudo.search_count(domain)
# pager
pager = portal_pager(
url="/my/product_status",
url_args={'sortby': sortby, 'search_in': search_in, 'search': search, 'filterby': filterby, 'groupby': groupby},
total=product_status_count,
page=page,
step=_items_per_page
)
def get_product_status():
groupby_mapping = self._get_groupby_mapping()
field = groupby_mapping.get(groupby, None)
orderby = False
product_status = Lots_sudo.search(domain, order=orderby, limit=_items_per_page, offset=pager['offset'])
if field:
raw_grouped_product_status = Lots_sudo.read_group(domain, [field, "ids:array_agg(id)"], [field])
# hope it is cached (product_qty is not stored, so can't be fetched from read_group)
grouped_product_status = [(Lots_sudo.browse(group["ids"]), sum(Lots_sudo.browse(group["ids"]).mapped('product_qty'))) for group in raw_grouped_product_status]
return product_status, grouped_product_status
grouped_product_status = [(
product_status,
False
)] if product_status else []
return product_status, grouped_product_status
product_status, grouped_product_status = get_product_status()
values.update({
'product_status': product_status,
'grouped_product_status': grouped_product_status,
'page_name': 'product_status',
'default_url': '/my/product_status',
'pager': pager,
'search_in': search_in,
'search': search,
'groupby': groupby,
'searchbar_inputs': searchbar_inputs,
'searchbar_groupby': searchbar_groupby,
'searchbar_filters': OrderedDict(sorted(searchbar_filters.items())),
'filterby': filterby,
})
return request.render("wcgh_website_lots.portal_my_product_status", values)