OLD | NEW |
(Empty) | |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is govered by a BSD-style |
| 3 # license that can be found in the LICENSE file or at |
| 4 # https://developers.google.com/open-source/licenses/bsd |
| 5 |
| 6 """Classes for the user profile page ("my page").""" |
| 7 |
| 8 import logging |
| 9 import time |
| 10 |
| 11 from third_party import ezt |
| 12 |
| 13 from framework import framework_helpers |
| 14 from framework import framework_views |
| 15 from framework import permissions |
| 16 from framework import servlet |
| 17 from project import project_views |
| 18 from sitewide import sitewide_helpers |
| 19 |
| 20 |
| 21 class AbstractUserPage(servlet.Servlet): |
| 22 """Base class for UserProfile and UserUpdates pages.""" |
| 23 |
| 24 _PAGE_TEMPLATE = None |
| 25 |
| 26 def GatherPageData(self, mr): |
| 27 """Build up a dictionary of data values to use when rendering the page.""" |
| 28 raise NotImplementedError() |
| 29 |
| 30 |
| 31 class UserProfile(AbstractUserPage): |
| 32 """Shows a page of information about a user.""" |
| 33 |
| 34 _PAGE_TEMPLATE = 'sitewide/user-profile-page.ezt' |
| 35 |
| 36 def GatherPageData(self, mr): |
| 37 """Build up a dictionary of data values to use when rendering the page.""" |
| 38 viewing_self = mr.viewed_user_auth.user_id == mr.auth.user_id |
| 39 |
| 40 if self.services.usergroup.GetGroupSettings( |
| 41 mr.cnxn, mr.viewed_user_auth.user_id): |
| 42 url = framework_helpers.FormatAbsoluteURL( |
| 43 mr, '/g/%s/' % mr.viewed_user_auth.user_pb.email, |
| 44 include_project=False) |
| 45 self.redirect(url, abort=True) # Show group page instead. |
| 46 |
| 47 with self.profiler.Phase('GetUserProjects'): |
| 48 project_lists = sitewide_helpers.GetUserProjects( |
| 49 mr.cnxn, self.services, mr.auth.user_pb, mr.auth.effective_ids, |
| 50 mr.viewed_user_auth.effective_ids) |
| 51 |
| 52 (visible_ownership, visible_archived, visible_membership, |
| 53 visible_contrib) = project_lists |
| 54 |
| 55 # Do not obscure email if current user is a site admin. Do not obscure |
| 56 # email if current user is viewing his/her own profile. For all other |
| 57 # cases do whatever obscure_email setting for the user is. |
| 58 email_obscured = (not(mr.auth.user_pb.is_site_admin or viewing_self) |
| 59 and mr.viewed_user_auth.user_view.obscure_email) |
| 60 if email_obscured: |
| 61 _, domain, obscured_username = framework_views.ParseAndObscureAddress( |
| 62 mr.viewed_user_auth.email) |
| 63 viewed_user_display_name = '%s...@%s' % (obscured_username, domain) |
| 64 else: |
| 65 viewed_user_display_name = mr.viewed_user_auth.email |
| 66 |
| 67 with self.profiler.Phase('GetStarredProjects'): |
| 68 starred_projects = sitewide_helpers.GetViewableStarredProjects( |
| 69 mr.cnxn, self.services, mr.viewed_user_auth.user_id, |
| 70 mr.auth.effective_ids, mr.auth.user_pb) |
| 71 |
| 72 logged_in_starred_pids = [] |
| 73 if mr.auth.user_id: |
| 74 logged_in_starred_pids = self.services.project_star.LookupStarredItemIDs( |
| 75 mr.cnxn, mr.auth.user_id) |
| 76 |
| 77 starred_user_ids = self.services.user_star.LookupStarredItemIDs( |
| 78 mr.cnxn, mr.viewed_user_auth.user_id) |
| 79 starred_user_dict = framework_views.MakeAllUserViews( |
| 80 mr.cnxn, self.services.user, starred_user_ids) |
| 81 starred_users = starred_user_dict.values() |
| 82 |
| 83 is_user_starred = self._IsUserStarred( |
| 84 mr.cnxn, mr.auth.user_id, mr.viewed_user_auth.user_id) |
| 85 |
| 86 page_data = { |
| 87 'user_tab_mode': 'st2', |
| 88 'viewed_user_display_name': viewed_user_display_name, |
| 89 'viewed_user_is_banned': ezt.boolean( |
| 90 mr.viewed_user_auth.user_pb.banned), |
| 91 'viewed_user_ignore_action_limits': ( |
| 92 ezt.boolean(mr.viewed_user_auth.user_pb.ignore_action_limits)), |
| 93 'owner_of_projects': [ |
| 94 project_views.ProjectView( |
| 95 p, starred=p.project_id in logged_in_starred_pids) |
| 96 for p in visible_ownership], |
| 97 'committer_of_projects': [ |
| 98 project_views.ProjectView( |
| 99 p, starred=p.project_id in logged_in_starred_pids) |
| 100 for p in visible_membership], |
| 101 'contributor_to_projects': [ |
| 102 project_views.ProjectView( |
| 103 p, starred=p.project_id in logged_in_starred_pids) |
| 104 for p in visible_contrib], |
| 105 'owner_of_archived_projects': [ |
| 106 project_views.ProjectView(p) for p in visible_archived], |
| 107 'starred_projects': [ |
| 108 project_views.ProjectView( |
| 109 p, starred=p.project_id in logged_in_starred_pids) |
| 110 for p in starred_projects], |
| 111 'starred_users': starred_users, |
| 112 'is_user_starred': ezt.boolean(is_user_starred), |
| 113 'viewing_user_page': ezt.boolean(True), |
| 114 } |
| 115 |
| 116 settings = framework_helpers.UserSettings.GatherUnifiedSettingsPageData( |
| 117 mr.auth.user_id, mr.viewed_user_auth.user_view, |
| 118 mr.viewed_user_auth.user_pb) |
| 119 page_data.update(settings) |
| 120 |
| 121 return page_data |
| 122 |
| 123 def _IsUserStarred(self, cnxn, logged_in_user_id, viewed_user_id): |
| 124 """Return whether the logged in user starred the viewed user.""" |
| 125 if logged_in_user_id: |
| 126 return self.services.user_star.IsItemStarredBy( |
| 127 cnxn, viewed_user_id, logged_in_user_id) |
| 128 return False |
| 129 |
| 130 def ProcessFormData(self, mr, post_data): |
| 131 """Process the posted form.""" |
| 132 has_admin_perm = mr.perms.HasPerm(permissions.ADMINISTER_SITE, None, None) |
| 133 framework_helpers.UserSettings.ProcessSettingsForm( |
| 134 mr.cnxn, self.services.user, post_data, mr.viewed_user_auth.user_id, |
| 135 mr.viewed_user_auth.user_pb, admin=has_admin_perm) |
| 136 |
| 137 # TODO(jrobbins): Check all calls to FormatAbsoluteURL for include_project. |
| 138 return framework_helpers.FormatAbsoluteURL( |
| 139 mr, mr.viewed_user_auth.user_view.profile_url, include_project=False, |
| 140 saved=1, ts=int(time.time())) |
OLD | NEW |