Index: appengine/monorail/sitewide/userprofile.py |
diff --git a/appengine/monorail/sitewide/userprofile.py b/appengine/monorail/sitewide/userprofile.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..82427e736ff1e9675494687f897c0f770c903afb |
--- /dev/null |
+++ b/appengine/monorail/sitewide/userprofile.py |
@@ -0,0 +1,140 @@ |
+# 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 |
+ |
+"""Classes for the user profile page ("my page").""" |
+ |
+import logging |
+import time |
+ |
+from third_party import ezt |
+ |
+from framework import framework_helpers |
+from framework import framework_views |
+from framework import permissions |
+from framework import servlet |
+from project import project_views |
+from sitewide import sitewide_helpers |
+ |
+ |
+class AbstractUserPage(servlet.Servlet): |
+ """Base class for UserProfile and UserUpdates pages.""" |
+ |
+ _PAGE_TEMPLATE = None |
+ |
+ def GatherPageData(self, mr): |
+ """Build up a dictionary of data values to use when rendering the page.""" |
+ raise NotImplementedError() |
+ |
+ |
+class UserProfile(AbstractUserPage): |
+ """Shows a page of information about a user.""" |
+ |
+ _PAGE_TEMPLATE = 'sitewide/user-profile-page.ezt' |
+ |
+ def GatherPageData(self, mr): |
+ """Build up a dictionary of data values to use when rendering the page.""" |
+ viewing_self = mr.viewed_user_auth.user_id == mr.auth.user_id |
+ |
+ if self.services.usergroup.GetGroupSettings( |
+ mr.cnxn, mr.viewed_user_auth.user_id): |
+ url = framework_helpers.FormatAbsoluteURL( |
+ mr, '/g/%s/' % mr.viewed_user_auth.user_pb.email, |
+ include_project=False) |
+ self.redirect(url, abort=True) # Show group page instead. |
+ |
+ with self.profiler.Phase('GetUserProjects'): |
+ project_lists = sitewide_helpers.GetUserProjects( |
+ mr.cnxn, self.services, mr.auth.user_pb, mr.auth.effective_ids, |
+ mr.viewed_user_auth.effective_ids) |
+ |
+ (visible_ownership, visible_archived, visible_membership, |
+ visible_contrib) = project_lists |
+ |
+ # Do not obscure email if current user is a site admin. Do not obscure |
+ # email if current user is viewing his/her own profile. For all other |
+ # cases do whatever obscure_email setting for the user is. |
+ email_obscured = (not(mr.auth.user_pb.is_site_admin or viewing_self) |
+ and mr.viewed_user_auth.user_view.obscure_email) |
+ if email_obscured: |
+ _, domain, obscured_username = framework_views.ParseAndObscureAddress( |
+ mr.viewed_user_auth.email) |
+ viewed_user_display_name = '%s...@%s' % (obscured_username, domain) |
+ else: |
+ viewed_user_display_name = mr.viewed_user_auth.email |
+ |
+ with self.profiler.Phase('GetStarredProjects'): |
+ starred_projects = sitewide_helpers.GetViewableStarredProjects( |
+ mr.cnxn, self.services, mr.viewed_user_auth.user_id, |
+ mr.auth.effective_ids, mr.auth.user_pb) |
+ |
+ logged_in_starred_pids = [] |
+ if mr.auth.user_id: |
+ logged_in_starred_pids = self.services.project_star.LookupStarredItemIDs( |
+ mr.cnxn, mr.auth.user_id) |
+ |
+ starred_user_ids = self.services.user_star.LookupStarredItemIDs( |
+ mr.cnxn, mr.viewed_user_auth.user_id) |
+ starred_user_dict = framework_views.MakeAllUserViews( |
+ mr.cnxn, self.services.user, starred_user_ids) |
+ starred_users = starred_user_dict.values() |
+ |
+ is_user_starred = self._IsUserStarred( |
+ mr.cnxn, mr.auth.user_id, mr.viewed_user_auth.user_id) |
+ |
+ page_data = { |
+ 'user_tab_mode': 'st2', |
+ 'viewed_user_display_name': viewed_user_display_name, |
+ 'viewed_user_is_banned': ezt.boolean( |
+ mr.viewed_user_auth.user_pb.banned), |
+ 'viewed_user_ignore_action_limits': ( |
+ ezt.boolean(mr.viewed_user_auth.user_pb.ignore_action_limits)), |
+ 'owner_of_projects': [ |
+ project_views.ProjectView( |
+ p, starred=p.project_id in logged_in_starred_pids) |
+ for p in visible_ownership], |
+ 'committer_of_projects': [ |
+ project_views.ProjectView( |
+ p, starred=p.project_id in logged_in_starred_pids) |
+ for p in visible_membership], |
+ 'contributor_to_projects': [ |
+ project_views.ProjectView( |
+ p, starred=p.project_id in logged_in_starred_pids) |
+ for p in visible_contrib], |
+ 'owner_of_archived_projects': [ |
+ project_views.ProjectView(p) for p in visible_archived], |
+ 'starred_projects': [ |
+ project_views.ProjectView( |
+ p, starred=p.project_id in logged_in_starred_pids) |
+ for p in starred_projects], |
+ 'starred_users': starred_users, |
+ 'is_user_starred': ezt.boolean(is_user_starred), |
+ 'viewing_user_page': ezt.boolean(True), |
+ } |
+ |
+ settings = framework_helpers.UserSettings.GatherUnifiedSettingsPageData( |
+ mr.auth.user_id, mr.viewed_user_auth.user_view, |
+ mr.viewed_user_auth.user_pb) |
+ page_data.update(settings) |
+ |
+ return page_data |
+ |
+ def _IsUserStarred(self, cnxn, logged_in_user_id, viewed_user_id): |
+ """Return whether the logged in user starred the viewed user.""" |
+ if logged_in_user_id: |
+ return self.services.user_star.IsItemStarredBy( |
+ cnxn, viewed_user_id, logged_in_user_id) |
+ return False |
+ |
+ def ProcessFormData(self, mr, post_data): |
+ """Process the posted form.""" |
+ has_admin_perm = mr.perms.HasPerm(permissions.ADMINISTER_SITE, None, None) |
+ framework_helpers.UserSettings.ProcessSettingsForm( |
+ mr.cnxn, self.services.user, post_data, mr.viewed_user_auth.user_id, |
+ mr.viewed_user_auth.user_pb, admin=has_admin_perm) |
+ |
+ # TODO(jrobbins): Check all calls to FormatAbsoluteURL for include_project. |
+ return framework_helpers.FormatAbsoluteURL( |
+ mr, mr.viewed_user_auth.user_view.profile_url, include_project=False, |
+ saved=1, ts=int(time.time())) |