feat: add logic to prevent edit for some user accounts
mostly for sake of online demo, so a "permanent" demo user can be established
This commit is contained in:
		
							parent
							
								
									6fd6229a9e
								
							
						
					
					
						commit
						24ddb7b905
					
				
					 6 changed files with 46 additions and 5 deletions
				
			
		| 
						 | 
					@ -661,7 +661,9 @@
 | 
				
			||||||
              </a>
 | 
					              </a>
 | 
				
			||||||
              ${h.end_form()}
 | 
					              ${h.end_form()}
 | 
				
			||||||
          % endif
 | 
					          % endif
 | 
				
			||||||
          ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
 | 
					          % if request.is_root or not request.user.prevent_edit:
 | 
				
			||||||
 | 
					              ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
 | 
				
			||||||
 | 
					          % endif
 | 
				
			||||||
          ${h.link_to("Logout", url('logout'), class_='navbar-item')}
 | 
					          ${h.link_to("Logout", url('logout'), class_='navbar-item')}
 | 
				
			||||||
        </div>
 | 
					        </div>
 | 
				
			||||||
      </div>
 | 
					      </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -157,6 +157,9 @@ class AuthView(View):
 | 
				
			||||||
        if not self.request.user:
 | 
					        if not self.request.user:
 | 
				
			||||||
            return self.redirect(self.request.route_url('home'))
 | 
					            return self.redirect(self.request.route_url('home'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if self.request.user.prevent_edit:
 | 
				
			||||||
 | 
					            raise self.forbidden()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        form = self.make_form(schema=self.change_password_make_schema(),
 | 
					        form = self.make_form(schema=self.change_password_make_schema(),
 | 
				
			||||||
                              show_button_cancel=False,
 | 
					                              show_button_cancel=False,
 | 
				
			||||||
                              show_button_reset=True)
 | 
					                              show_button_reset=True)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,8 +29,8 @@ Most apps should include this module::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
That will in turn include the following modules:
 | 
					That will in turn include the following modules:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* :mod:`wuttaweb.views.auth`
 | 
					 | 
				
			||||||
* :mod:`wuttaweb.views.common`
 | 
					* :mod:`wuttaweb.views.common`
 | 
				
			||||||
 | 
					* :mod:`wuttaweb.views.auth`
 | 
				
			||||||
* :mod:`wuttaweb.views.settings`
 | 
					* :mod:`wuttaweb.views.settings`
 | 
				
			||||||
* :mod:`wuttaweb.views.progress`
 | 
					* :mod:`wuttaweb.views.progress`
 | 
				
			||||||
* :mod:`wuttaweb.views.people`
 | 
					* :mod:`wuttaweb.views.people`
 | 
				
			||||||
| 
						 | 
					@ -43,8 +43,8 @@ That will in turn include the following modules:
 | 
				
			||||||
def defaults(config, **kwargs):
 | 
					def defaults(config, **kwargs):
 | 
				
			||||||
    mod = lambda spec: kwargs.get(spec, spec)
 | 
					    mod = lambda spec: kwargs.get(spec, spec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    config.include(mod('wuttaweb.views.auth'))
 | 
					 | 
				
			||||||
    config.include(mod('wuttaweb.views.common'))
 | 
					    config.include(mod('wuttaweb.views.common'))
 | 
				
			||||||
 | 
					    config.include(mod('wuttaweb.views.auth'))
 | 
				
			||||||
    config.include(mod('wuttaweb.views.settings'))
 | 
					    config.include(mod('wuttaweb.views.settings'))
 | 
				
			||||||
    config.include(mod('wuttaweb.views.progress'))
 | 
					    config.include(mod('wuttaweb.views.progress'))
 | 
				
			||||||
    config.include(mod('wuttaweb.views.people'))
 | 
					    config.include(mod('wuttaweb.views.people'))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,6 +95,15 @@ class UserView(MasterView):
 | 
				
			||||||
        if not user.active:
 | 
					        if not user.active:
 | 
				
			||||||
            return 'has-background-warning'
 | 
					            return 'has-background-warning'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def is_editable(self, user):
 | 
				
			||||||
 | 
					        """ """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # only root can edit certain users
 | 
				
			||||||
 | 
					        if user.prevent_edit and not self.request.is_root:
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def configure_form(self, f):
 | 
					    def configure_form(self, f):
 | 
				
			||||||
        """ """
 | 
					        """ """
 | 
				
			||||||
        super().configure_form(f)
 | 
					        super().configure_form(f)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,11 +80,18 @@ class TestAuthView(WebTestCase):
 | 
				
			||||||
        redirect = view.change_password()
 | 
					        redirect = view.change_password()
 | 
				
			||||||
        self.assertIsInstance(redirect, HTTPFound)
 | 
					        self.assertIsInstance(redirect, HTTPFound)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # now "login" the user, and set initial password
 | 
					        # set initial password
 | 
				
			||||||
        self.request.user = barney
 | 
					 | 
				
			||||||
        auth.set_user_password(barney, 'foo')
 | 
					        auth.set_user_password(barney, 'foo')
 | 
				
			||||||
        self.session.commit()
 | 
					        self.session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # forbidden if prevent_edit is set for user
 | 
				
			||||||
 | 
					        self.request.user = barney
 | 
				
			||||||
 | 
					        barney.prevent_edit = True
 | 
				
			||||||
 | 
					        self.assertRaises(HTTPForbidden, view.change_password)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # okay let's test with edit allowed
 | 
				
			||||||
 | 
					        barney.prevent_edit = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # view should now return context w/ form
 | 
					        # view should now return context w/ form
 | 
				
			||||||
        context = view.change_password()
 | 
					        context = view.change_password()
 | 
				
			||||||
        self.assertIn('form', context)
 | 
					        self.assertIn('form', context)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,6 +42,26 @@ class TestUserView(WebTestCase):
 | 
				
			||||||
        user.active = False
 | 
					        user.active = False
 | 
				
			||||||
        self.assertEqual(view.grid_row_class(user, data, 1), 'has-background-warning')
 | 
					        self.assertEqual(view.grid_row_class(user, data, 1), 'has-background-warning')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_is_editable(self):
 | 
				
			||||||
 | 
					        model = self.app.model
 | 
				
			||||||
 | 
					        view = self.make_view()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # active user is editable
 | 
				
			||||||
 | 
					        user = model.User(username='barney', active=True)
 | 
				
			||||||
 | 
					        self.assertTrue(view.is_editable(user))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # inactive also editable
 | 
				
			||||||
 | 
					        user = model.User(username='barney', active=False)
 | 
				
			||||||
 | 
					        self.assertTrue(view.is_editable(user))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # but not if prevent_edit flag is set
 | 
				
			||||||
 | 
					        user = model.User(username='barney', prevent_edit=True)
 | 
				
			||||||
 | 
					        self.assertFalse(view.is_editable(user))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # unless request user is root
 | 
				
			||||||
 | 
					        self.request.is_root = True
 | 
				
			||||||
 | 
					        self.assertTrue(view.is_editable(user))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_configure_form(self):
 | 
					    def test_configure_form(self):
 | 
				
			||||||
        model = self.app.model
 | 
					        model = self.app.model
 | 
				
			||||||
        barney = model.User(username='barney')
 | 
					        barney = model.User(username='barney')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue