Show More
@@ -137,17 +137,32 b' class AuthenticatedHandler(RequestHandler):' | |||
|
137 | 137 | if not self.application.password and not self.application.read_only: |
|
138 | 138 | user_id = 'anonymous' |
|
139 | 139 | return user_id |
|
140 | ||
|
140 | ||
|
141 | @property | |
|
142 | def logged_in(self): | |
|
143 | """Is a user currently logged in? | |
|
144 | ||
|
145 | """ | |
|
146 | user = self.get_current_user() | |
|
147 | return (user and not user == 'anonymous') | |
|
148 | ||
|
149 | @property | |
|
150 | def login_available(self): | |
|
151 | """May a user proceed to log in? | |
|
152 | ||
|
153 | This returns True if login capability is available, irrespective of | |
|
154 | whether the user is already logged in or not. | |
|
155 | ||
|
156 | """ | |
|
157 | return bool(self.application.password) | |
|
158 | ||
|
141 | 159 | @property |
|
142 | 160 | def read_only(self): |
|
143 | if self.application.read_only: | |
|
144 | if self.application.password: | |
|
145 | return self.get_current_user() is None | |
|
146 | else: | |
|
147 | return True | |
|
148 | else: | |
|
149 | return False | |
|
150 | ||
|
161 | """Is the notebook read-only? | |
|
162 | ||
|
163 | """ | |
|
164 | return self.application.read_only | |
|
165 | ||
|
151 | 166 | @property |
|
152 | 167 | def ws_url(self): |
|
153 | 168 | """websocket url matching the current request |
@@ -169,6 +184,8 b' class ProjectDashboardHandler(AuthenticatedHandler):' | |||
|
169 | 184 | 'projectdashboard.html', project=project, |
|
170 | 185 | base_project_url=u'/', base_kernel_url=u'/', |
|
171 | 186 | read_only=self.read_only, |
|
187 | logged_in=self.logged_in, | |
|
188 | login_available=self.login_available | |
|
172 | 189 | ) |
|
173 | 190 | |
|
174 | 191 | |
@@ -178,6 +195,8 b' class LoginHandler(AuthenticatedHandler):' | |||
|
178 | 195 | self.render('login.html', |
|
179 | 196 | next=self.get_argument('next', default='/'), |
|
180 | 197 | read_only=self.read_only, |
|
198 | logged_in=self.logged_in, | |
|
199 | login_available=self.login_available, | |
|
181 | 200 | message=message |
|
182 | 201 | ) |
|
183 | 202 | |
@@ -203,7 +222,17 b' class LogoutHandler(AuthenticatedHandler):' | |||
|
203 | 222 | |
|
204 | 223 | def get(self): |
|
205 | 224 | self.clear_cookie('username') |
|
206 | self.render('logout.html', message={'info': 'Successfully logged out.'}) | |
|
225 | if self.login_available: | |
|
226 | message = {'info': 'Successfully logged out.'} | |
|
227 | else: | |
|
228 | message = {'warning': 'Cannot log out. Notebook authentication ' | |
|
229 | 'is disabled.'} | |
|
230 | ||
|
231 | self.render('logout.html', | |
|
232 | read_only=self.read_only, | |
|
233 | logged_in=self.logged_in, | |
|
234 | login_available=self.login_available, | |
|
235 | message=message) | |
|
207 | 236 | |
|
208 | 237 | |
|
209 | 238 | class NewHandler(AuthenticatedHandler): |
@@ -219,6 +248,8 b' class NewHandler(AuthenticatedHandler):' | |||
|
219 | 248 | base_project_url=u'/', base_kernel_url=u'/', |
|
220 | 249 | kill_kernel=False, |
|
221 | 250 | read_only=False, |
|
251 | logged_in=self.logged_in, | |
|
252 | login_available=self.login_available, | |
|
222 | 253 | mathjax_url=self.application.ipython_app.mathjax_url, |
|
223 | 254 | ) |
|
224 | 255 | |
@@ -238,6 +269,8 b' class NamedNotebookHandler(AuthenticatedHandler):' | |||
|
238 | 269 | base_project_url=u'/', base_kernel_url=u'/', |
|
239 | 270 | kill_kernel=False, |
|
240 | 271 | read_only=self.read_only, |
|
272 | logged_in=self.logged_in, | |
|
273 | login_available=self.login_available, | |
|
241 | 274 | mathjax_url=self.application.ipython_app.mathjax_url, |
|
242 | 275 | ) |
|
243 | 276 |
@@ -22,12 +22,16 b' var IPython = (function (IPython) {' | |||
|
22 | 22 | |
|
23 | 23 | LoginWidget.prototype.style = function () { |
|
24 | 24 | this.element.find('button#logout').button(); |
|
25 | this.element.find('button#login').button(); | |
|
25 | 26 | }; |
|
26 | 27 | LoginWidget.prototype.bind_events = function () { |
|
27 | 28 | var that = this; |
|
28 | 29 | this.element.find("button#logout").click(function () { |
|
29 | 30 | window.location = "/logout"; |
|
30 | 31 | }); |
|
32 | this.element.find("button#login").click(function () { | |
|
33 | window.location = "/login"; | |
|
34 | }); | |
|
31 | 35 | }; |
|
32 | 36 | |
|
33 | 37 | // Set module variables |
@@ -28,18 +28,9 b' $(document).ready(function () {' | |||
|
28 | 28 | $('div#right_panel').addClass('box-flex'); |
|
29 | 29 | |
|
30 | 30 | IPython.read_only = $('meta[name=read_only]').attr("content") == 'True'; |
|
31 | ||
|
32 | 31 | IPython.notebook_list = new IPython.NotebookList('div#notebook_list'); |
|
33 | 32 | IPython.login_widget = new IPython.LoginWidget('span#login_widget'); |
|
34 | ||
|
35 | if (IPython.read_only){ | |
|
36 | // unhide login button if it's relevant | |
|
37 | $('span#login_widget').removeClass('hidden'); | |
|
38 | $('#drag_info').remove(); | |
|
39 | } else { | |
|
40 | $('#new_notebook').removeClass('hidden'); | |
|
41 | $('#drag_info').removeClass('hidden'); | |
|
42 | } | |
|
33 | ||
|
43 | 34 | IPython.notebook_list.load_list(); |
|
44 | 35 | |
|
45 | 36 | // These have display: none in the css file and are made visible here to prevent FLOUC. |
@@ -22,11 +22,19 b'' | |||
|
22 | 22 | |
|
23 | 23 | <div id="header"> |
|
24 | 24 | <span id="ipython_notebook"><h1><img src='static/ipynblogo.png' alt='IPython Notebook'/></h1></span> |
|
25 | <span id="login_widget"> | |
|
26 | {% if current_user and current_user != 'anonymous' %} | |
|
27 | <button id="logout">Logout</button> | |
|
28 | {% end %} | |
|
29 | </span> | |
|
25 | ||
|
26 | {% block login_widget %} | |
|
27 | ||
|
28 | <span id="login_widget"> | |
|
29 | {% if logged_in %} | |
|
30 | <button id="logout">Logout</button> | |
|
31 | {% elif login_available and not logged_in %} | |
|
32 | <button id="login">Login</button> | |
|
33 | {% end %} | |
|
34 | </span> | |
|
35 | ||
|
36 | {% end %} | |
|
37 | ||
|
30 | 38 | {% block header %} |
|
31 | 39 | {% end %} |
|
32 | 40 | </div> |
@@ -1,8 +1,26 b'' | |||
|
1 | 1 | {% extends layout.html %} |
|
2 | 2 | |
|
3 | 3 | {% block content_panel %} |
|
4 | ||
|
5 | {% if login_available %} | |
|
6 | ||
|
4 | 7 | <form action="/login?next={{url_escape(next)}}" method="post"> |
|
5 | Password: <input type="password" name="password"> | |
|
8 | Password: <input type="password" name="password" id="focus"> | |
|
6 | 9 | <input type="submit" value="Sign in" id="signin"> |
|
7 | 10 | </form> |
|
11 | ||
|
12 | {% end %} | |
|
13 | ||
|
14 | {% end %} | |
|
15 | ||
|
16 | {% block login_widget %} | |
|
17 | {% end %} | |
|
18 | ||
|
19 | {% block script %} | |
|
20 | <script type="text/javascript"> | |
|
21 | $(document).ready(function() { | |
|
22 | IPython.login_widget = new IPython.LoginWidget('span#login_widget'); | |
|
23 | $('#focus').focus(); | |
|
24 | }); | |
|
25 | </script> | |
|
8 | 26 | {% end %} |
@@ -1,5 +1,28 b'' | |||
|
1 | 1 | {% extends layout.html %} |
|
2 | 2 | |
|
3 | 3 | {% block content_panel %} |
|
4 | Proceed to the <a href="/login">login page</a>. | |
|
4 | <ul> | |
|
5 | {% if read_only or not login_available %} | |
|
6 | ||
|
7 | Proceed to the <a href="/">list of notebooks</a>.</li> | |
|
8 | ||
|
9 | {% else %} | |
|
10 | ||
|
11 | Proceed to the <a href="/login">login page</a>.</li> | |
|
12 | ||
|
13 | {% end %} | |
|
14 | ||
|
15 | </ul> | |
|
16 | ||
|
17 | {% end %} | |
|
18 | ||
|
19 | {% block login_widget %} | |
|
20 | {% end %} | |
|
21 | ||
|
22 | {% block script %} | |
|
23 | <script type="text/javascript"> | |
|
24 | $(document).ready(function() { | |
|
25 | IPython.login_widget = new IPython.LoginWidget('span#login_widget'); | |
|
26 | }); | |
|
27 | </script> | |
|
5 | 28 | {% end %} |
@@ -29,8 +29,10 b'' | |||
|
29 | 29 | <link rel="stylesheet" href="static/css/base.css" type="text/css" /> |
|
30 | 30 | <link rel="stylesheet" href="static/css/notebook.css" type="text/css" /> |
|
31 | 31 | <link rel="stylesheet" href="static/css/renderedhtml.css" type="text/css" /> |
|
32 | ||
|
33 | <meta name="read_only" content="{{read_only}}"/> | |
|
32 | ||
|
33 | {% comment In the notebook, the read-only flag is used to determine %} | |
|
34 | {% comment whether to hide the side panels and switch off input %} | |
|
35 | <meta name="read_only" content="{{read_only and not logged_in}}"/> | |
|
34 | 36 | |
|
35 | 37 | </head> |
|
36 | 38 | |
@@ -52,8 +54,10 b'' | |||
|
52 | 54 | <span id="login_widget"> |
|
53 | 55 | {% comment This is a temporary workaround to hide the logout button %} |
|
54 | 56 | {% comment when appropriate until notebook.html is templated %} |
|
55 | {% if current_user and current_user != 'anonymous' %} | |
|
57 | {% if logged_in %} | |
|
56 | 58 | <button id="logout">Logout</button> |
|
59 | {% elif not logged_in and login_available %} | |
|
60 | <button id="login">Login</button> | |
|
57 | 61 | {% end %} |
|
58 | 62 | </span> |
|
59 | 63 |
@@ -19,12 +19,19 b' data-base-kernel-url={{base_kernel_url}}' | |||
|
19 | 19 | {% end %} |
|
20 | 20 | |
|
21 | 21 | {% block content_panel %} |
|
22 | {% if logged_in or not read_only %} | |
|
23 | ||
|
22 | 24 | <div id="content_toolbar"> |
|
23 |
<span id="drag_info" |
|
|
25 | <span id="drag_info">Drag files onto the list to import | |
|
26 | notebooks.</span> | |
|
27 | ||
|
24 | 28 | <span id="notebooks_buttons"> |
|
25 |
|
|
|
29 | <button id="new_notebook">New Notebook</button> | |
|
26 | 30 | </span> |
|
27 | 31 | </div> |
|
32 | ||
|
33 | {% end %} | |
|
34 | ||
|
28 | 35 | <div id="notebook_list"> |
|
29 | 36 | <div id="project_name"><h2>{{project}}</h2></div> |
|
30 | 37 | </div> |
General Comments 0
You need to be logged in to leave comments.
Login now