##// END OF EJS Templates
Merge pull request #1079 from stefanv/htmlnotebook_login_button...
Fernando Perez -
r5726:2bfc4492 merge
parent child Browse files
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" class="hidden">Drag files onto the list to import notebooks.</span>
25 <span id="drag_info">Drag files onto the list to import
26 notebooks.</span>
27
24 28 <span id="notebooks_buttons">
25 <button id="new_notebook" class="hidden">New Notebook</button>
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