| # Copyright 2016 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style |
| # license that can be found in the LICENSE file or at |
| # https://developers.google.com/open-source/licenses/bsd |
| |
| """Classes to display hotlists in templates.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import ezt |
| |
| import logging |
| |
| from framework import framework_helpers |
| from framework import permissions |
| from framework import template_helpers |
| |
| |
| class MemberView(object): |
| """EZT-view of details of how a person is participating in a project.""" |
| |
| def __init__(self, logged_in_user_id, member_id, user_view, hotlist, |
| effective_ids=None): |
| """Initialize a MemberView with the given information. |
| |
| Args: |
| logged_in_user_id: int user ID of the viewing user, or 0 for anon. |
| member_id: int user ID of the hotlist member being viewed. |
| user_ivew: UserView object for this member |
| hotlist: Hotlist PB for the currently viewed hotlist |
| effective_ids: optional set of user IDs for this user, if supplied |
| we show the highest role that they have via any group membership. |
| """ |
| |
| self.viewing_self = ezt.boolean(logged_in_user_id == member_id) |
| |
| self.user = user_view |
| member_qs_param = user_view.user_id |
| self.detail_url = '/u/%s/' % member_qs_param |
| self.role = framework_helpers.GetHotlistRoleName( |
| effective_ids or {member_id}, hotlist) |
| |
| |
| class HotlistView(template_helpers.PBProxy): |
| """Wrapper class that makes it easier to display a hotlist via EZT.""" |
| |
| def __init__( |
| self, hotlist_pb, perms, user_auth=None, |
| viewed_user_id=None, users_by_id=None, is_starred=False): |
| super(HotlistView, self).__init__(hotlist_pb) |
| |
| self.visible = permissions.CanViewHotlist( |
| user_auth.effective_ids, perms, hotlist_pb) |
| |
| self.access_is_private = ezt.boolean(hotlist_pb.is_private) |
| if not hotlist_pb.owner_ids: # Should never happen. |
| logging.error('Unowned Hotlist: id:%r, name:%r', |
| hotlist_pb.hotlist_id, |
| hotlist_pb.name) |
| self.url = '' |
| return |
| owner_id = hotlist_pb.owner_ids[0] # only one owner allowed |
| owner = users_by_id[owner_id] |
| if owner.user.banned: |
| self.visible = False |
| if owner.obscure_email or not self.visible: |
| self.url = ( |
| '/u/%d/hotlists/%s' % (owner_id, hotlist_pb.name)) |
| else: |
| self.url = ( |
| '/u/%s/hotlists/%s' % ( |
| owner.email, hotlist_pb.name)) |
| |
| self.role_name = '' |
| if viewed_user_id in hotlist_pb.owner_ids: |
| self.role_name = 'owner' |
| elif any(effective_id in hotlist_pb.editor_ids for |
| effective_id in user_auth.effective_ids): |
| self.role_name = 'editor' |
| |
| if users_by_id: |
| self.owners = [users_by_id[owner_id] for |
| owner_id in hotlist_pb.owner_ids] |
| self.editors = [users_by_id[editor_id] for |
| editor_id in hotlist_pb.editor_ids] |
| self.num_issues = len(hotlist_pb.items) |
| self.is_followed = ezt.boolean(user_auth.user_id in hotlist_pb.follower_ids) |
| # TODO(jojwang): if hotlist follower's will not be used, perhaps change |
| # from is_followed to is_member or just use is_starred |
| self.num_followers = len(hotlist_pb.follower_ids) |
| self.is_starred = ezt.boolean(is_starred) |