Index: appengine/monorail/project/project_views.py |
diff --git a/appengine/monorail/project/project_views.py b/appengine/monorail/project/project_views.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4b6904bea618d140362a54940874678bf2b1ab19 |
--- /dev/null |
+++ b/appengine/monorail/project/project_views.py |
@@ -0,0 +1,109 @@ |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is govered 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.""" |
+ |
+import logging |
+import time |
+ |
+from third_party 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): |
+ """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. |
+ """ |
+ 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 = [] |