Browse Source

add routes related to user profile and password update: /api/user/change-password and /me

Damien Accorsi 10 years ago
parent
commit
daeec13d55

+ 2 - 0
pod/pod/controllers/api.py View File

@@ -29,6 +29,7 @@ from pod import model as pm
29 29
 from pod.lib.auth import can_read, can_write
30 30
 
31 31
 from pod.controllers import apimenu as pcam
32
+from pod.controllers import apiuserprofile as pcaum
32 33
 
33 34
 
34 35
 FIXME_ERROR_CODE=-1
@@ -40,6 +41,7 @@ class PODApiController(BaseController):
40 41
     allow_only = tgp.in_group('user', msg=l_('You need to login in order to access this ressource'))
41 42
 
42 43
     menu = pcam.PODApiMenuController()
44
+    user = pcaum.PODApiUserProfileController()
43 45
 
44 46
     def on_off_to_boolean(self, on_or_off):
45 47
         return True if on_or_off=='on' else False

+ 33 - 0
pod/pod/controllers/apiuserprofile.py View File

@@ -0,0 +1,33 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+import tg
4
+from tg.i18n import ugettext as _, lazy_ugettext as l_
5
+
6
+from pod.lib import base as plb
7
+from pod.lib import dbapi as pld
8
+import pod.model as pm
9
+
10
+class PODApiUserProfileController(plb.BaseController):
11
+
12
+    @tg.expose()
13
+    def change_password(self, current_password, new_password1, new_password2):
14
+        current_user = pld.PODStaticController.getCurrentUser()
15
+
16
+        redirect_url = tg.lurl('/me')
17
+        if not current_password or not new_password1 or not new_password2:
18
+            tg.flash(_('Empty password is not allowed.'))
19
+            tg.redirect(redirect_url)
20
+
21
+        if current_user.validate_password(current_password) is False:
22
+            tg.flash(_('The current password you typed is wrong'))
23
+            tg.redirect(redirect_url)
24
+        # else:
25
+        if new_password1!=new_password2:
26
+            tg.flash(_('The current password you typed is wrong'))
27
+            tg.redirect(redirect_url)
28
+        # else:
29
+        current_user.password = new_password1
30
+        pm.DBSession.flush()
31
+
32
+        tg.flash(_('The password has been successfully changed'))
33
+        tg.redirect(redirect_url)

+ 6 - 0
pod/pod/controllers/root.py View File

@@ -176,3 +176,9 @@ class RootController(BaseController):
176 176
         return dict()
177 177
 
178 178
 
179
+    @expose('pod.templates.user_profile')
180
+    @require(predicates.in_group('user', msg=l_('Please login to access this page')))
181
+    def me(self):
182
+        """Handle the about-page."""
183
+        me = pld.PODStaticController.getCurrentUser()
184
+        return dict(current_user = me)

+ 3 - 6
pod/pod/templates/master.mak View File

@@ -194,12 +194,9 @@ ${self.toggle_view_mode()}
194 194
               <li class="dropdown">
195 195
                 <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-user"></i> ${request.identity['user'].display_name}</a>
196 196
                 <ul class="dropdown-menu pull-right">
197
-                  <li class="text-center">
198
-                    <fieldset>
199
-                      <legend><i class="fa fa-key"></i> Logout</legend>
200
-                      <a class="btn btn-danger" href="${tg.url('/logout_handler')}">Logout <i class="fa fa-power-off"></i> </a>
201
-                    </fieldset>
202
-                    <p></p>
197
+                    <li><a href="${tg.url('/me')}"><i class="fa fa-user"></i> My profile</a></li>
198
+                    <li class="divider"></li>
199
+                    <li><a href="${tg.url('/logout_handler')}"><i class="fa fa-power-off"></i> Logout</a></li>
203 200
                  </ul>
204 201
               </li>
205 202
             % endif

+ 80 - 0
pod/pod/templates/user_profile.mak View File

@@ -0,0 +1,80 @@
1
+<%inherit file="local:templates.master"/>
2
+<%namespace name="POD" file="pod.templates.pod"/>
3
+
4
+<%def name="title()">
5
+pod :: your dashboard
6
+</%def>
7
+
8
+  <div class="row">
9
+      <div class="span6">
10
+          ## USER PROFILE PANEL
11
+          <div id='user-profile'>
12
+              <h3>${_("My Profile")}</h3>
13
+              <form class="form-horizontal">
14
+                  <div class="control-group">
15
+                      <label class="control-label" for="displayName">${_('Visible Name')}</label>
16
+                      <div class="controls">                        
17
+                          <div class="input-prepend">
18
+                              <span class="add-on"><i class="fa fa-user"></i></span>
19
+                              <input id="displayName" type="text" readonly="readonly" placeholder="Name" value="${current_user.display_name}">
20
+                        </div>
21
+                      </div>
22
+                  </div>
23
+
24
+                  <div class="control-group">
25
+                      <label class="control-label" for="emailAddress">${_('Email Address')}</label>
26
+                      <div class="controls">                        
27
+                          <div class="input-prepend">
28
+                              <span class="add-on"><i class="fa fa-envelope-o"></i></span>
29
+                              <input id="emailAddress" type="text" readonly="readonly" placeholder="Email Address" value="${current_user.email_address}">
30
+                        </div>
31
+                      </div>
32
+                  </div>
33
+
34
+                  <div class="control-group">
35
+                      <label class="control-label" for="displayName">${_('Groups')}</label>
36
+                      <div class="controls">
37
+                          % for group in current_user.groups:
38
+                            <span class="label">${group.getDisplayName()}</span>
39
+                          % endfor
40
+                      </div>
41
+                  </div>
42
+              </form>
43
+          </div>
44
+      </div>
45
+
46
+      <div class="span6">
47
+          <div id='user-password-change' class="well">
48
+              <p class="text-center"><b>${_('I want to change my password...')}</b></p>
49
+              <form class="form-horizontal" method="POST" action="${tg.url('/api/user/change-password')}">
50
+                  <div class="control-group">
51
+                      <label class="control-label" for="currentPassword">${_('Current Password')}</label>
52
+                      <div class="controls">
53
+                          <input type="password" id="currentPassword" name="current_password" placeholder="${_('Current Password')}">
54
+                      </div>
55
+                  </div>
56
+                  <div class="control-group">
57
+                      <label class="control-label" for="newPassword1">${_('New Password')}</label>
58
+                      <div class="controls">
59
+                          <input type="password" id="newPassword1" name="new_password1" placeholder="${_('New Password')}">
60
+                      </div>
61
+                  </div>
62
+                  <div class="control-group">
63
+                      <label class="control-label" for="newPassword2">${_('Retype New Password')}</label>
64
+                      <div class="controls">
65
+                          <input type="password" id="newPassword2" name="new_password2" placeholder="${_('Retype New Password')}">
66
+                      </div>
67
+                  </div>
68
+
69
+                  <div class="control-group">
70
+                      <div class="controls">
71
+                          <button type="submit" class="btn btn-success"><i class="fa fa-check"></i> ${_('Save changes')}</button>
72
+                      </div>
73
+                  </div>
74
+              </form>
75
+    
76
+            ## WHAT'S HOT PANEL [END]
77
+          </div>
78
+      </div>
79
+  </div>
80
+