Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1894)

Unified Diff: appengine/monorail/sitewide/userprofile.py

Issue 1868553004: Open Source Monorail (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Rebase Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « appengine/monorail/sitewide/test/userupdates_test.py ('k') | appengine/monorail/sitewide/userprojects.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()))
« no previous file with comments | « appengine/monorail/sitewide/test/userupdates_test.py ('k') | appengine/monorail/sitewide/userprojects.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698