blob: 554836219744d9e6fbe2668940901f3f0efd7cb9 [file] [log] [blame]
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +01001# Copyright 2016 The Chromium Authors
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
Copybara854996b2021-09-07 19:36:02 +00004
5"""Servlets for hotlist details main subtab."""
6from __future__ import print_function
7from __future__ import division
8from __future__ import absolute_import
9
10import time
11
12import ezt
13
14from features import hotlist_helpers
15from framework import framework_bizobj
16from framework import framework_helpers
Copybara854996b2021-09-07 19:36:02 +000017from framework import permissions
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010018from framework import servlet
Copybara854996b2021-09-07 19:36:02 +000019from framework import urls
20
21_MSG_DESCRIPTION_MISSING = 'Description is missing.'
22_MSG_SUMMARY_MISSING = 'Summary is missing.'
23_MSG_NAME_MISSING = 'Hotlist name is missing.'
24_MSG_COL_SPEC_MISSING = 'Hotlist default columns are missing.'
25_MSG_HOTLIST_NAME_NOT_AVAIL = 'You already have a hotlist with that name.'
26# pylint: disable=line-too-long
27_MSG_INVALID_HOTLIST_NAME = "Invalid hotlist name. Please make sure your hotlist name begins with a letter followed by any number of letters, numbers, -'s, and .'s"
28
29
30class HotlistDetails(servlet.Servlet):
31 """A page with hotlist details and editing options."""
32
33 _PAGE_TEMPLATE = 'features/hotlist-details-page.ezt'
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +010034 _MAIN_TAB_MODE = servlet.Servlet.HOTLIST_TAB_DETAILS
Copybara854996b2021-09-07 19:36:02 +000035
36 def AssertBasePermission(self, mr):
37 super(HotlistDetails, self).AssertBasePermission(mr)
38 if not permissions.CanViewHotlist(
39 mr.auth.effective_ids, mr.perms, mr.hotlist):
40 raise permissions.PermissionException(
41 'User is not allowed to view the hotlist details')
42
43 def GatherPageData(self, mr):
44 """Buil up a dictionary of data values to use when rendering the page."""
45 if mr.auth.user_id:
46 self.services.user.AddVisitedHotlist(
47 mr.cnxn, mr.auth.user_id, mr.hotlist_id)
48 cant_administer_hotlist = not permissions.CanAdministerHotlist(
49 mr.auth.effective_ids, mr.perms, mr.hotlist)
50
51 return {
52 'initial_summary': mr.hotlist.summary,
53 'initial_description': mr.hotlist.description,
54 'initial_name': mr.hotlist.name,
55 'initial_default_col_spec': mr.hotlist.default_col_spec,
56 'initial_is_private': ezt.boolean(mr.hotlist.is_private),
57 'cant_administer_hotlist': ezt.boolean(cant_administer_hotlist),
58 'viewing_user_page': ezt.boolean(True),
59 'new_ui_url': '%s/%s/settings' % (urls.HOTLISTS, mr.hotlist_id),
60 }
61
62 def ProcessFormData(self, mr, post_data):
63 """Process the posted form."""
64 if not permissions.CanAdministerHotlist(
65 mr.auth.effective_ids, mr.perms, mr.hotlist):
66 raise permissions.PermissionException(
67 'User is not allowed to update hotlist settings.')
68
69 if post_data.get('deletestate') == 'true':
70 hotlist_helpers.RemoveHotlist(mr.cnxn, mr.hotlist_id, self.services)
71 return framework_helpers.FormatAbsoluteURL(
72 mr, '/u/%s/hotlists' % mr.auth.email,
73 saved=1, ts=int(time.time()), include_project=False)
74
75 (summary, description, name, default_col_spec) = self._ParseMetaData(
76 post_data, mr)
77 is_private = post_data.get('is_private') != 'no'
78
79 if not mr.errors.AnyErrors():
80 self.services.features.UpdateHotlist(
81 mr.cnxn, mr.hotlist.hotlist_id, name=name, summary=summary,
82 description=description, is_private=is_private,
83 default_col_spec=default_col_spec)
84
85 if mr.errors.AnyErrors():
86 self.PleaseCorrect(
87 mr, initial_summary=summary, initial_description=description,
88 initial_name=name, initial_default_col_spec=default_col_spec)
89 else:
90 return framework_helpers.FormatAbsoluteURL(
91 mr, '/u/%s/hotlists/%s%s' % (
92 mr.auth.user_id, mr.hotlist_id, urls.HOTLIST_DETAIL),
93 saved=1, ts=int(time.time()),
94 include_project=False)
95
96 def _ParseMetaData(self, post_data, mr):
97 """Process a POST on the hotlist metadata."""
98 summary = None
99 description = ''
100 name = None
101 default_col_spec = None
102
103 if 'summary' in post_data:
104 summary = post_data['summary']
105 if not summary:
106 mr.errors.summary = _MSG_SUMMARY_MISSING
107 if 'description' in post_data:
108 description = post_data['description']
109 if 'name' in post_data:
110 name = post_data['name']
111 if not name:
112 mr.errors.name = _MSG_NAME_MISSING
113 else:
114 if not framework_bizobj.IsValidHotlistName(name):
115 mr.errors.name = _MSG_INVALID_HOTLIST_NAME
116 elif self.services.features.LookupHotlistIDs(
117 mr.cnxn, [name], [mr.auth.user_id]) and (
118 mr.hotlist.name.lower() != name.lower()):
119 mr.errors.name = _MSG_HOTLIST_NAME_NOT_AVAIL
120 if 'default_col_spec' in post_data:
121 default_col_spec = post_data['default_col_spec']
122 return summary, description, name, default_col_spec
Adrià Vilanova Martínezde942802022-07-15 14:06:55 +0200123
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100124 def GetHotlistDetailsPage(self, **kwargs):
125 return self.handler(**kwargs)
Adrià Vilanova Martínezde942802022-07-15 14:06:55 +0200126
Adrià Vilanova Martínezf19ea432024-01-23 20:20:52 +0100127 def PostHotlistDetailsPage(self, **kwargs):
128 return self.handler(**kwargs)