summaryrefslogtreecommitdiff
path: root/addons/website_profile/controllers/main.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2019-06-06 11:54:35 +0200
committerChristophe Simonis <chs@odoo.com>2019-06-06 11:54:35 +0200
commit71a50a2214748fec413c5a0f042d0e7172ae6ea9 (patch)
tree2e9ee11551350e23923390d9c53baf630b6ed834 /addons/website_profile/controllers/main.py
parenta7621137cb0d75ec545152d5e1d413c9d3548e45 (diff)
parent409679866b2ee8352a8cb27460e7332563526924 (diff)
[MERGE] forward port branch saas-12.3 up to 409679866b2
Diffstat (limited to 'addons/website_profile/controllers/main.py')
-rw-r--r--addons/website_profile/controllers/main.py60
1 files changed, 48 insertions, 12 deletions
diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py
index e46e72b2cfb..c3b9ba54941 100644
--- a/addons/website_profile/controllers/main.py
+++ b/addons/website_profile/controllers/main.py
@@ -191,13 +191,13 @@ class WebsiteProfile(http.Controller):
# ---------------------------------------------------
def _prepare_all_users_values(self, user):
return {
- 'position': user.karma_position,
'id': user.id,
'name': user.name,
- 'company_name': user.company_id.name,
+ 'company_name': user.partner_id.company_name,
'rank': user.rank_id.name,
'karma': user.karma,
'badge_count': len(user.badge_ids),
+ 'website_published': user.website_published
}
@http.route(['/profile/users',
@@ -212,20 +212,56 @@ class WebsiteProfile(http.Controller):
dom = expression.AND([['|', ('name', 'ilike', search_term), ('company_id.name', 'ilike', search_term)], dom])
user_count = User.sudo().search_count(dom)
- page_count = math.ceil(user_count / self._users_per_page)
- pager = request.website.pager(url="/profile/users", total=user_count, page=page, step=self._users_per_page,
- scope=page_count if page_count < self._pager_max_pages else self._pager_max_pages)
- users = User.sudo().search(dom, limit=self._users_per_page, offset=pager['offset'], order='karma DESC')
- user_values = [self._prepare_all_users_values(user) for user in users]
+ if user_count:
+ page_count = math.ceil(user_count / self._users_per_page)
+ pager = request.website.pager(url="/profile/users", total=user_count, page=page, step=self._users_per_page,
+ scope=page_count if page_count < self._pager_max_pages else self._pager_max_pages)
+
+ users = User.sudo().search(dom, limit=self._users_per_page, offset=pager['offset'], order='karma DESC')
+ user_values = [self._prepare_all_users_values(user) for user in users]
+
+ # Get karma position for users (only website_published)
+ position_domain = [('karma', '>', 1), ('website_published', '=', True)]
+ position_map = self._get_users_karma_position(position_domain, users.ids)
+ for user in user_values:
+ user['position'] = position_map.get(user['id'], 0)
+
+ values = {
+ 'top3_users': user_values[:3] if not search_term and page == 1 else None,
+ 'users': user_values[3:] if not search_term and page == 1 else user_values,
+ 'pager': pager
+ }
+ else:
+ values = {'top3_users': [], 'users': [], 'pager': dict(page_count=0)}
- values = {
- 'top3_users': user_values[:3] if not search_term and page == 1 else None,
- 'users': user_values[3:] if not search_term and page == 1 else user_values,
- 'pager': pager
- }
return request.render("website_profile.users_page_main", values)
+ def _get_users_karma_position(self, domain, user_ids):
+ if not user_ids:
+ return {}
+
+ Users = request.env['res.users']
+ where_query = Users._where_calc(domain)
+ Users._apply_ir_rules(where_query, 'read')
+ from_clause, where_clause, where_clause_params = where_query.get_sql()
+
+ # we search on every user in the DB to get the real positioning (not the one inside the subset)
+ # then, we filter to get only the subset.
+ query = """
+ SELECT sub.id, sub.karma_position
+ FROM (
+ SELECT "res_users"."id", row_number() OVER (ORDER BY res_users.karma DESC) AS karma_position
+ FROM {from_clause}
+ WHERE {where_clause}
+ ) sub
+ WHERE sub.id IN %s
+ """.format(from_clause=from_clause, where_clause=where_clause)
+
+ request.env.cr.execute(query, where_clause_params + [tuple(user_ids)])
+
+ return {item['id']: item['karma_position'] for item in request.env.cr.dictfetchall()}
+
# User and validation
# --------------------------------------------------