summaryrefslogtreecommitdiff
path: root/addons/website_profile
diff options
context:
space:
mode:
authorThibault Delavallée <tde@odoo.com>2019-11-05 11:32:21 +0000
committerThibault Delavallée <tde@odoo.com>2019-11-05 15:08:34 +0000
commit1d468caf943abce460a53543f5c3b26e77285c91 (patch)
tree6ab53d8ab522dd651b2a67ff12fab20ab75fe560 /addons/website_profile
parentbfbc7c6a184b2b507b1bf4ad778430bc2f3a0e7f (diff)
[IMP] website_profile: handle both groupby and search in users page
Purpose is to support both search term and karma gain group by in the URL, using keep_query. Clean some code and move karma computation to res.users model to avoid having sql in controllers. Also fix some display issues. LINKS Task ID 2003505 PR #34594
Diffstat (limited to 'addons/website_profile')
-rw-r--r--addons/website_profile/controllers/main.py67
-rw-r--r--addons/website_profile/views/website_profile.xml11
2 files changed, 29 insertions, 49 deletions
diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py
index 703fc250f96..2148f5b78a2 100644
--- a/addons/website_profile/controllers/main.py
+++ b/addons/website_profile/controllers/main.py
@@ -215,11 +215,14 @@ class WebsiteProfile(http.Controller):
# Searches
search_term = kwargs.get('search')
group_by = kwargs.get('group_by', False)
+ render_values = {
+ 'search': search_term,
+ 'group_by': group_by or 'all',
+ }
if search_term:
dom = expression.AND([['|', ('name', 'ilike', search_term), ('company_id.name', 'ilike', search_term)], dom])
user_count = User.sudo().search_count(dom)
-
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,
@@ -229,55 +232,29 @@ class WebsiteProfile(http.Controller):
user_values = self._prepare_all_users_values(users)
# Get karma position for users (only website_published)
+ position_domain = [('karma', '>', 1), ('website_published', '=', True)]
if group_by:
- position_domain = [('karma', '>', 1), ('website_published', '=', True)]
position_map = self._get_user_tracking_karma_gain_position(position_domain, users.ids, group_by)
- max_position = max([user_data['karma_position'] for user_data in position_map.values()], default=1)
- for user in user_values:
- user_data = position_map.get(user['id'], dict())
- user['position'] = user_data.get('karma_position', max_position + 1)
- user['karma_gain'] = user_data.get('karma_gain_total', 0)
- user_values.sort(key=itemgetter('position'))
else:
- 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)
- user['karma_gain'] = False
-
- values = {
- 'group_by': group_by or 'all',
- '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': [], 'search': search_term, 'pager': dict(page_count=0)}
-
- return request.render("website_profile.users_page_main", values)
+ position_results = request.env['res.users'].browse(users.ids)._get_karma_position(position_domain)
+ position_map = dict((user_data['user_id'], dict(user_data)) for user_data in position_results)
- def _get_users_karma_position(self, domain, user_ids):
- if not user_ids:
- return {}
+ max_position = max([user_data['karma_position'] for user_data in position_map.values()], default=1)
+ for user in user_values:
+ user_data = position_map.get(user['id'], dict())
+ user['position'] = user_data.get('karma_position', max_position + 1)
+ user['karma_gain'] = user_data.get('karma_gain_total', 0)
+ user_values.sort(key=itemgetter('position'))
- where_query = request.env['res.users']._where_calc(domain)
- 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()}
+ else:
+ user_values = []
+ pager = {'page_count': 0}
+
+ render_values.update({
+ 'top3_users': user_values[:3] if not search_term and page == 1 else [],
+ 'users': user_values,
+ 'pager': pager})
+ return request.render("website_profile.users_page_main", render_values)
def _get_user_tracking_karma_gain_position(self, domain, user_ids, group_by):
""" Helper method computing boundaries to give to _get_tracking_karma_gain_position.
diff --git a/addons/website_profile/views/website_profile.xml b/addons/website_profile/views/website_profile.xml
index 9a8dacb8e2a..ba7e13efb8f 100644
--- a/addons/website_profile/views/website_profile.xml
+++ b/addons/website_profile/views/website_profile.xml
@@ -485,9 +485,12 @@
<div class="form-inline py-4 float-right">
<strong class="form-group text-white mr-2">Rank by :</strong>
<div class="form-group btn-group">
- <button type="button" t-attf-class="btn btn-secondary #{ 'active' if group_by == 'week' else ''}" onclick="location.href='/profile/users?group_by=week'">This week</button>
- <button type="button" t-attf-class="btn btn-secondary #{ 'active' if group_by == 'month' else ''}" onclick="location.href='/profile/users?group_by=month'">This month</button>
- <button type="button" t-attf-class="btn btn-secondary #{ 'active' if group_by == 'all' else ''}" onclick="location.href='/profile/users'">All time</button>
+ <a t-attf-class="btn btn-secondary #{ 'active' if group_by == 'week' else ''}"
+ t-att-href="'/profile/users?' + keep_query('search', group_by='week')">This week</a>
+ <a t-attf-class="btn btn-secondary #{ 'active' if group_by == 'month' else ''}"
+ t-att-href="'/profile/users?' + keep_query('search', group_by='month')">This month</a>
+ <a t-attf-class="btn btn-secondary #{ 'active' if group_by == 'all' else ''}"
+ t-att-href="'/profile/users?' + keep_query('search')">All time</a>
</div>
</div>
</div>
@@ -506,7 +509,7 @@
<t t-call="website_profile.all_user_card"/>
</tr>
</table>
- <t t-if='search'>
+ <t t-if='search and not users'>
<div class='alert alert-warning'>No user found for <strong><t t-esc="search"/></strong>. Try another search.</div>
</t>
<div class="form-inline justify-content-center">