Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/features/userhotlists.py b/features/userhotlists.py
new file mode 100644
index 0000000..330ab73
--- /dev/null
+++ b/features/userhotlists.py
@@ -0,0 +1,83 @@
+# 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
+
+"""Page for showing a user's hotlists."""
+from __future__ import print_function
+from __future__ import division
+from __future__ import absolute_import
+
+import ezt
+
+from features import features_bizobj
+from features import hotlist_views
+from framework import framework_views
+from framework import servlet
+
+
+class UserHotlists(servlet.Servlet):
+  """Servlet to display all of a user's hotlists."""
+
+  _PAGE_TEMPLATE = 'features/user-hotlists.ezt'
+
+  def GatherPageData(self, mr):
+    viewed_users_hotlists = self.services.features.GetHotlistsByUserID(
+        mr.cnxn, mr.viewed_user_auth.user_id)
+
+    viewed_starred_hids = self.services.hotlist_star.LookupStarredItemIDs(
+        mr.cnxn, mr.viewed_user_auth.user_id)
+    viewed_users_starred_hotlists, _ = self.services.features.GetHotlistsByID(
+        mr.cnxn, viewed_starred_hids)
+
+    viewed_users_relevant_hotlists = viewed_users_hotlists + list(
+        set(viewed_users_starred_hotlists.values()) -
+        set(viewed_users_hotlists))
+
+    users_by_id = framework_views.MakeAllUserViews(
+        mr.cnxn, self.services.user,
+        features_bizobj.UsersInvolvedInHotlists(viewed_users_relevant_hotlists))
+
+    views = [hotlist_views.HotlistView(
+        hotlist_pb, mr.perms, mr.auth, mr.viewed_user_auth.user_id,
+        users_by_id, self.services.hotlist_star.IsItemStarredBy(
+            mr.cnxn, hotlist_pb.hotlist_id, mr.auth.user_id))
+        for hotlist_pb in viewed_users_relevant_hotlists]
+
+    # visible to viewer, not viewed_user
+    visible_hotlists = [view for view in views if view.visible]
+
+    owner_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
+                         if hotlist_view.role_name == 'owner']
+    editor_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
+                          if hotlist_view.role_name == 'editor']
+    follower_of_hotlists = [hotlist_view for hotlist_view in visible_hotlists
+                         if hotlist_view.role_name == '']
+    starred_hotlists = [hotlist_view for hotlist_view in visible_hotlists
+                        if hotlist_view.hotlist_id in viewed_starred_hids]
+
+    viewed_user_display_name = framework_views.GetViewedUserDisplayName(mr)
+
+    return {
+        'user_tab_mode': 'st6',
+        'viewed_user_display_name': viewed_user_display_name,
+        'owner_of_hotlists': owner_of_hotlists,
+        'editor_of_hotlists': editor_of_hotlists,
+        'follower_of_hotlists': follower_of_hotlists,
+        'starred_hotlists': starred_hotlists,
+        'viewing_user_page': ezt.boolean(True),
+        }
+
+  def GatherHelpData(self, mr, page_data):
+    """Return a dict of values to drive on-page user help.
+
+    Args:
+      mr: common information parsed from the HTTP request.
+      page_data: Dictionary of base and page template data.
+
+    Returns:
+      A dict of values to drive on-page user help, to be added to page_data.
+    """
+    help_data = super(UserHotlists, self).GatherHelpData(mr, page_data)
+    help_data['cue'] = 'explain_hotlist_starring'
+    return help_data