diff options
| author | Thibault Delavallée <tde@odoo.com> | 2019-11-05 11:32:21 +0000 |
|---|---|---|
| committer | Thibault Delavallée <tde@odoo.com> | 2019-11-05 15:08:34 +0000 |
| commit | 1d468caf943abce460a53543f5c3b26e77285c91 (patch) | |
| tree | 6ab53d8ab522dd651b2a67ff12fab20ab75fe560 /addons/website_profile | |
| parent | bfbc7c6a184b2b507b1bf4ad778430bc2f3a0e7f (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.py | 67 | ||||
| -rw-r--r-- | addons/website_profile/views/website_profile.xml | 11 |
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"> |
