| # 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 |
| |
| """View objects to help display projects in EZT.""" |
| from __future__ import print_function |
| from __future__ import division |
| from __future__ import absolute_import |
| |
| import logging |
| import time |
| |
| import ezt |
| |
| from framework import framework_constants |
| from framework import framework_helpers |
| from framework import permissions |
| from framework import template_helpers |
| from framework import timestr |
| from framework import urls |
| from proto import project_pb2 |
| |
| |
| class ProjectAccessView(object): |
| """Object for project access information that can be easily used in EZT.""" |
| |
| ACCESS_NAMES = { |
| project_pb2.ProjectAccess.ANYONE: 'Anyone on the Internet', |
| project_pb2.ProjectAccess.MEMBERS_ONLY: 'Project Members', |
| } |
| |
| def __init__(self, project_access_enum): |
| self.key = int(project_access_enum) |
| self.name = self.ACCESS_NAMES[project_access_enum] |
| |
| |
| class ProjectView(template_helpers.PBProxy): |
| """View object to make it easy to display a search result in EZT.""" |
| |
| _MAX_SUMMARY_CHARS = 70 |
| _LIMITED_DESCRIPTION_CHARS = 500 |
| |
| def __init__(self, pb, starred=False, now=None, num_stars=None, |
| membership_desc=None): |
| super(ProjectView, self).__init__(pb) |
| |
| self.limited_summary = template_helpers.FitUnsafeText( |
| pb.summary, self._MAX_SUMMARY_CHARS) |
| |
| self.limited_description = template_helpers.FitUnsafeText( |
| pb.description, self._LIMITED_DESCRIPTION_CHARS) |
| |
| self.state_name = str(pb.state) # Gives the enum name |
| self.relative_home_url = '/p/%s' % pb.project_name |
| |
| if now is None: |
| now = time.time() |
| |
| last_full_hour = now - (now % framework_constants.SECS_PER_HOUR) |
| self.cached_content_timestamp = max( |
| pb.cached_content_timestamp, last_full_hour) |
| self.last_updated_exists = ezt.boolean(pb.recent_activity) |
| course_grain, fine_grain = timestr.GetHumanScaleDate(pb.recent_activity) |
| if course_grain == 'Older': |
| self.recent_activity = fine_grain |
| else: |
| self.recent_activity = course_grain |
| |
| self.starred = ezt.boolean(starred) |
| |
| self.num_stars = num_stars |
| self.plural = '' if num_stars == 1 else 's' |
| self.membership_desc = membership_desc |
| |
| |
| 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, project, |
| project_commitments, effective_ids=None, ac_exclusion=False, |
| no_expand=False, is_group=False): |
| """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 project member being viewed. |
| user_view: UserView object for this member. |
| project: Project PB for the currently viewed project. |
| project_commitments: ProjectCommitments PB for the currently viewed |
| project, or None if commitments are not to be displayed. |
| effective_ids: optional set of user IDs for this user, if supplied |
| we show the highest role that they have via any group membership. |
| ac_exclusion: True when this member should not be in autocomplete. |
| no_expand: True for user groups that should not expand when generating |
| autocomplete options. |
| is_group: True if this user is actually a user group. |
| """ |
| 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 = '/p/%s%s?u=%s' % ( |
| project.project_name, urls.PEOPLE_DETAIL, member_qs_param) |
| self.role = framework_helpers.GetRoleName( |
| effective_ids or {member_id}, project) |
| self.extra_perms = permissions.GetExtraPerms(project, member_id) |
| self.notes = None |
| if project_commitments is not None: |
| for commitment in project_commitments.commitments: |
| if commitment.member_id == member_id: |
| self.notes = commitment.notes |
| break |
| |
| # Attributes needed by table_view_helpers.py |
| self.labels = [] |
| self.derived_labels = [] |
| |
| self.ac_include = ezt.boolean(not ac_exclusion) |
| self.ac_expand = ezt.boolean(not no_expand) |
| |
| self.is_group = ezt.boolean(is_group) |
| self.is_service_account = ezt.boolean(framework_helpers.IsServiceAccount( |
| self.user.email)) |