Changeset 3674
- Timestamp:
- 05/13/08 12:01:59 (6 months ago)
- Files:
-
- usermanagerplugin/0.11/setup.py (modified) (2 diffs)
- usermanagerplugin/0.11/tracusermanager/account/admin_um.py (modified) (3 diffs)
- usermanagerplugin/0.11/tracusermanager/admin.py (modified) (7 diffs)
- usermanagerplugin/0.11/tracusermanager/api.py (modified) (6 diffs)
- usermanagerplugin/0.11/tracusermanager/htdocs/css/admin_um.css (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/htdocs/js/admin_um_permissions.js (added)
- usermanagerplugin/0.11/tracusermanager/permissions/admin_um.py (modified) (3 diffs)
- usermanagerplugin/0.11/tracusermanager/profile/admin.py (modified) (3 diffs)
- usermanagerplugin/0.11/tracusermanager/profile/admin_um.py (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/profile/api.py (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/profile/macros.py (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/profile/prefs.py (modified) (3 diffs)
- usermanagerplugin/0.11/tracusermanager/templates/admin_um_account.html (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/templates/admin_um.html (modified) (8 diffs)
- usermanagerplugin/0.11/tracusermanager/templates/admin_um_permissions.html (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/templates/macro_um_profile.html (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/templates/prefs_um_profile.html (modified) (2 diffs)
- usermanagerplugin/0.11/tracusermanager/tests/api.py (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/tests/__init__.py (modified) (1 diff)
- usermanagerplugin/0.11/tracusermanager/tests/macros_um_profile.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
usermanagerplugin/0.11/setup.py
r3156 r3674 1 1 #!/usr/bin/env python 2 2 # -*- coding: iso-8859-1 -*- 3 # 4 # Copyright 2007-2008 Optaros, Inc 5 # 3 6 4 7 from setuptools import setup 5 8 6 setup(name= 'TracUserManagerPlugin',7 version= '0.2',9 setup(name="TracUserManagerPlugin", 10 version="0.3", 8 11 packages=['tracusermanager', 9 12 'tracusermanager.account', … … 12 15 author="Catalin Balan", 13 16 author_email="cbalan@optaros.com", 14 url= 'http://www.optaros.com/',15 description= 'Trac User Manager',16 license= 'BSD',17 url="http://code.optaros.com/trac/oforge", 18 description="Trac User Manager", 19 license="BSD", 17 20 entry_points={'trac.plugins': [ 18 21 'tracusermanager.api = tracusermanager.api', usermanagerplugin/0.11/tracusermanager/account/admin_um.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 … … 17 14 from acct_mgr.api import AccountManager 18 15 19 from tracusermanager.admin import IUserManagerPanelProvider , IUserListCellContributor16 from tracusermanager.admin import IUserManagerPanelProvider 20 17 21 18 class AccountUserManagerPanel(Component): 22 19 23 implements(IUserManagerPanelProvider , IUserListCellContributor)20 implements(IUserManagerPanelProvider) 24 21 25 22 def get_usermanager_admin_panels(self, req): … … 57 54 58 55 return 'admin_um_account.html',{'um_account':data, 'messages':messages, 'errors':errors} 59 60 # IUserListCellContributor methods61 def get_userlist_cells(self):62 yield ('type', _('Authentication'), 3)63 64 def render_userlist_cell(self, cell_name, user):65 """Should render user cell"""66 return AccountManager(self.env).has_user(user.username) and 'Account Manager' or ' 'usermanagerplugin/0.11/tracusermanager/admin.py
r3322 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 … … 67 64 def get_admin_panels(self, req): 68 65 if req.perm.has_permission('TRAC_ADMIN'): 69 yield (' general', _('General'), 'user_management', _('User Management'))66 yield ('accounts', _('Accounts'), 'users', 'Users') 70 67 71 68 def render_admin_panel( self, req, cat, page, path_info): … … 91 88 try: 92 89 if req.args.has_key("um_newuser_create"): 93 um_data['messages'].append( self._do_create_user(req) ) 90 um_data['messages'].append( self._do_create_user(req) ) 94 91 elif req.args.has_key("um_user_delete"): 95 92 um_data['messages'].append( self._do_delete_user(req) ) … … 128 125 # adding usernamager's data to the data dict 129 126 data.update(user_manager = um_data) 130 127 131 128 try: 132 129 from acct_mgr.api import AccountManager … … 136 133 trac_managed_users_out = self._do_import_current_users(req, dry_run=True) 137 134 if len(trac_managed_users_out)>0: 138 um_data['errors'].append(html.form(html.b(_("WARNING: ")),_(" [%s] users are not added to the team.")%(', '.join(trac_managed_users_out)),html.input(type="submit", name="um_import_current_users", value=_("Add Users")), action=req.href.admin('general/user_management'), method="post") ) 135 um_data['errors'].append(html.form(html.b(_("WARNING: ")),_(" [%s] users are not added to the team.")%(', '.join(trac_managed_users_out)),html.input(type="submit", name="um_import_current_users", value=_("Add Users")), action=req.href.admin('accounts/users'), method="post") ) 136 139 137 except Exception, e: 140 138 self.log.error('Account manager not loaded') … … 153 151 154 152 is_trac_managed = req.args.get('um_newuser_type')=='trac-managed' 153 if is_trac_managed and not req.args.get('um_newuser_password'): 154 raise TracError(_('Password field it\'s mandatory')) 155 155 156 user = User(req.args.get('um_newuser_username').strip()) 156 for field in ['name', 'email']+(is_trac_managed and ['password'] or []): 157 if is_trac_managed and not req.args.get('um_newuser_%s'%(field)): 158 raise TracError(_('%s field it\'s mandatory')%(field.capitalize())) 157 for field in ['name', 'email', 'role']+(is_trac_managed and ['password'] or []): 159 158 if field=='password': 160 159 if req.args.get('um_newuser_password')==req.args.get('um_newuser_confirm_password'): … … 196 195 197 196 if len(imported_users)>0: 198 return _("Successfully imported the following users %s.")%(imported_users)197 return _("Successfully imported the following users [%s].")%(','.join(imported_users)) 199 198 else: 200 199 return _("No users imported.") 201 200 202 201 def _get_panels(self, req): 203 202 """Return a list of available admin panels.""" usermanagerplugin/0.11/tracusermanager/api.py
r3604 r3674 1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 3 # Copyright 2008 Optaros, Inc. 5 4 # 6 # @author: Catalin BALAN <cbalan@optaros.com>7 #8 5 9 6 import traceback … … 147 144 """Name of the component implementing `IAttributeProvider`, which is used 148 145 for storing user attributes""") 149 150 151 146 152 147 # Public methods … … 393 388 self.log.error('%s: %s\n%s' % (self.__class__.__name__, str(e), out.getvalue())) 394 389 raise TracError("Unable to set attribute %s for user [%s]."%(attribute, username)) 395 390 396 391 return False 397 392 … … 475 470 implements(IEnvironmentSetupParticipant) 476 471 477 overwrite_get_known_users = BoolOption('user_manager', 'overwrite_get_known_users', False,478 """Overwrite `env.get_known_users` to return user_manager's users.""")479 480 472 # IEnvironmentSetupParticipant methods 481 473 def environment_created(self): … … 483 475 484 476 def environment_needs_upgrade(self, db): 485 if not self.overwrite_get_known_users:486 return False487 488 477 def inline_overwrite_get_known_users(environment = None, cnx=None): 489 for user in UserManager(self.env).get_active_users(): 490 yield (user.username, user['name'], user['email']) 478 users = UserManager(self.env).get_active_users() 479 if len(users)>0: 480 for user in users: 481 yield (user.username, user['name'], user['email']) 482 else: 483 # No users defined, so we're returning the original list 484 for user, name, email in self.env.__class__.get_known_users(self.env): 485 yield (user, name, email) 491 486 492 487 self.env.get_known_users = inline_overwrite_get_known_users … … 496 491 def upgrade_environment(self, db): 497 492 pass 498 usermanagerplugin/0.11/tracusermanager/htdocs/css/admin_um.css
r3156 r3674 124 124 } 125 125 126 div#um_active_users .um_user_panels div.um_messages{ 127 margin-bottom:5px; 128 } 129 130 div#um_active_users .um_user_panels div.um_errors{ 131 margin-bottom:5px; 132 } 133 126 134 div#um_active_users .um_user_panels .um_user_panels_tabs { 127 135 list-style-image:none; usermanagerplugin/0.11/tracusermanager/permissions/admin_um.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 … … 10 7 from trac.util.translation import _ 11 8 from trac.perm import PermissionSystem 12 from trac.web.chrome import add_stylesheet 9 from trac.web.chrome import add_stylesheet, add_script 13 10 14 11 from tracusermanager.admin import IUserManagerPanelProvider … … 57 54 58 55 add_stylesheet(req, 'tracusermanager/css/admin_um_permissions.css') 56 add_script(req, 'tracusermanager/js/admin_um_permissions.js') 59 57 60 58 return 'admin_um_permissions.html', data usermanagerplugin/0.11/tracusermanager/profile/admin.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 … … 23 20 def get_admin_panels(self, req): 24 21 if req.perm.has_permission('TRAC_ADMIN'): 25 yield (' general', _('General'), 'um_profile_fields', _('User Profile Fields'))22 yield ('accounts', _('Accounts'), 'xum_profile_fields', _('User Profile Fields')) 26 23 27 24 def render_admin_panel(self, req, cat, page, path_info): … … 29 26 #req.perm.assert_permission('TRAC_ADMIN') 30 27 31 #add_script(req, 'customfieldadmin/js/CustomFieldAdminPage_actions.js')32 33 28 def _field_from_req(self, req): 34 29 cfdict = {'name': to_unicode(req.args.get('name')), usermanagerplugin/0.11/tracusermanager/profile/admin_um.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 usermanagerplugin/0.11/tracusermanager/profile/api.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 usermanagerplugin/0.11/tracusermanager/profile/macros.py
r3156 r3674 1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 usermanagerplugin/0.11/tracusermanager/profile/prefs.py
r3156 r3674 1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2006 Optaros, Inc. 4 # All rights reserved. 5 # 6 # @author: Catalin BALAN <cbalan@optaros.com> 3 # Copyright 2008 Optaros, Inc. 7 4 # 8 5 … … 21 18 # IPreferencePanelProvider methods 22 19 def get_preference_panels(self, req): 23 yield ('userprofile', _('My Profile')) 20 if req.session.authenticated: 21 yield ('userprofile', _('My Profile')) 24 22 25 23 def render_preference_panel(self, req, panel): … … 37 35 data['messages'].append(_("Successfully removed %s's picture.")%(user.username)) 38 36 req.redirect(req.href.prefs('userprofile')) 39 if req.args.has_key("um_profile_update"):37 else: 40 38 for field in data['um_profile_fields'].keys(): 41 39 if req.args.has_key("um_profile_%s"%(field)): usermanagerplugin/0.11/tracusermanager/templates/admin_um_account.html
r3156 r3674 7 7 py:strip=""> 8 8 <div class="um_account"> 9 <fieldset>10 <legend>Type</legend>11 <form method="post">12 <select name="um_account_type">13 <option py:for="type in um_account.TYPES" value="${type}" selected="${type==um_account.type and 'selected' or None}">${type=='trac-managed' and _('Managed by Account Manager') or _('Managed by server (default)')}</option>14 </select>15 <input type="submit" name="um_account_update_type" value="Change type"/>16 </form>17 </fieldset>18 9 <fieldset py:if="um_account.type=='trac-managed'"> 19 10 <legend>Change password</legend> usermanagerplugin/0.11/tracusermanager/templates/admin_um.html
r3605 r3674 11 11 <body> 12 12 <h2>Manage Team</h2> 13 <div class="um_messages" py:if="len(user_manager.errors)==0 and len(user_manager.messages)>0"> 14 <div py:for="message in user_manager.messages">${message}</div> 15 </div> 16 <div class="um_errors system-message" py:if="len(user_manager.errors)>0"> 17 <div py:for="error in user_manager.errors">${error}</div> 18 </div> 13 <div class="um_messages" py:if="len(user_manager.errors)==0 and len(user_manager.messages)>0 and not user_manager.panel"> 14 <div py:for="message in user_manager.messages">${message}</div> 15 </div> 16 <div class="um_errors system-message" py:if="len(user_manager.errors)>0 and not user_manager.panel"> 17 <div py:for="error in user_manager.errors">${error}</div> 18 </div> 19 19 20 <div id="um_active_users"> 20 <table class="listing" cellpading="0" cellspacing="0" py:with="users=user_manager.users">21 <table class="listing" cellpading="0" cellspacing="0" py:for="is_trac_managed, users_iter in groupby([{'is_trac_managed_hack':False}]+sorted(user_manager.users,lambda x,y:account_manager.has_user(x.username)-account_manager.has_user(y.username))+[{'is_trac_managed_hack':True}], lambda nn: nn.is_trac_managed_hack is True or account_manager.has_user(nn.username) )" py:with="users=list(filter(lambda x:not isinstance(x, dict),users_iter))"> 21 22 <thead> 22 23 <tr> 23 <th colspan="${len(user_manager.cells)+3}" > Users</th>24 <th colspan="${len(user_manager.cells)+3}" >${is_trac_managed and _('External users') or _('Users')}</th> 24 25 </tr> 25 26 <tr> … … 34 35 <tr id="um_user_${user.username}"> 35 36 <th rowspan="${(user_manager.user and user_manager.user.username==user.username) and '2' or None}"><img src="${href.chrome('tracusermanager')+'/img/user.png'}" /></th> 36 <th rowspan="1" valign="top" align="left" ><a href="${panel_href(user.username, user_manager.default_panel)}#um_user_${user.username}" class="expander${(user_manager.user and user_manager.user.username==user.username) and '_open' or ''}">${user.username}</a></th>37 <th rowspan="1" valign="top" align="left" ><a href="${panel_href(user.username, (not is_trac_managed and user_manager.default_panel!='account') and user_manager.default_panel or 'profile')}#um_user_${user.username}" class="expander${(user_manager.user and user_manager.user.username==user.username) and '_open' or ''}">${user.username}</a></th> 37 38 <th align="left" py:for="cell_dict in sorted(user_manager.cells, lambda x,y:x['order']-y['order'])" title="${cell_dict.label}">${cell_dict.render_method(cell_dict.name, user)}</th> 38 39 <th align="left" > … … 46 47 <td colspan="${len(user_manager.cells)+2}" py:if="user_manager.user and user_manager.user.username==user.username"> 47 48 <div class="um_user_panels" > 49 <div class="um_messages" py:if="len(user_manager.errors)==0 and len(user_manager.messages)>0"> 50 <div py:for="message in user_manager.messages">${message}</div> 51 </div> 52 <div class="um_errors system-message" py:if="len(user_manager.errors)>0"> 53 <div py:for="error in user_manager.errors">${error}</div> 54 </div> 48 55 <ul class="um_user_panels_tabs"> 49 <li py:for="panel in user_manager.panels" class="${panel[0]==user_manager.panel and 'on' or ''}">56 <li py:for="panel in filter(lambda p:not (p[0]=='account' and not is_trac_managed) ,user_manager.panels)" class="${panel[0]==user_manager.panel and 'on' or ''}"> 50 57 <a href="${panel_href(user.username,panel[0])}#um_user_${user.username}">${panel[1]}</a> 51 58 </li> … … 66 73 </py:for> 67 74 <tr py:if="len(users)==0"> 68 <td colspan="${len(user_manager.cells)+3}" align="center"> No users defined.</td>75 <td colspan="${len(user_manager.cells)+3}" align="center"> [ ${is_trac_managed and _('No external users defined') or _('No users defined') } ]</td> 69 76 </tr> 70 77 </tbody> 71 78 <tfoot> 79 <tr py:if="False"> 80 <th colspan="${len(user_manager.cells)+3}">.::</th> 81 </tr> 72 82 <tr> 73 83 <th colspan="${len(user_manager.cells)+3}"> 74 <form name="um_create" action="${panel_href()}" method="post">84 <form py:if="not is_trac_managed" name="um_create" action="${panel_href()}" method="post"> 75 85 <input type="hidden" name="um_newuser_type" value="server-managed"/> 76 86 <fieldset class="close"> … … 87 97 <label>Email:</label><input type="text" name="um_newuser_email"/> 88 98 </div> 99 <div class="field" > 100 <label>Role:</label><input type="text" name="um_newuser_role" /> 101 </div> 89 102 <input type="submit" name="um_newuser_create" value="Add user"/> 90 103 </div> … … 92 105 </fieldset> 93 106 </form> 94 <form py:if=" account_manager" name="um_create" action="${panel_href()}" method="post">107 <form py:if="is_trac_managed" name="um_create" action="${panel_href()}" method="post"> 95 108 <input type="hidden" name="um_newuser_type" value="trac-managed"/> 96 109 <fieldset class="close"> 97 <legend class="expander">Add user managed by Account Manager</legend>110 <legend class="expander">Add external user</legend> 98 111 <div class="field-wrapper" style="display:none"> 99 112 <div class="field" > … … 107 120 </div> 108 121 <div class="field" > 122 <label>Role:</label><input type="text" name="um_newuser_role" /> 123 </div> 124 <div class="field" > 109 125 <label>Password:</label><input type="password" name="um_newuser_password" /> 110 126 </div> … … 112 128 <label>Confirm password:</label><input type="password" name="um_newuser_confirm_password" /> 113 129 </div> 114 <input type="submit" name="um_newuser_create" value="Add user managed by Account Manager"/>130 <input type="submit" name="um_newuser_create" value="Add external user"/> 115 131 </div> 116 132 </fieldset> 117 </form> 133 </form> 118 134 </th> 119 135 </tr> usermanagerplugin/0.11/tracusermanager/templates/admin_um_permissions.html
r3156 r3674 10 10 <legend>Advanced Permissions</legend> 11 11 <form method="POST"> 12 <div py:for="group, group_actions in groupby(sorted(actions), lambda a: '_' in a and a[:a.index('_')] or a.islower() and '99_group_hack' or a) " class="um_permissions_group ${group=='99_group_hack' and 'um_permissions_group_groups' or ''}">12 <div py:for="group, group_actions in groupby(sorted(actions), lambda a: '_' in a and a[:a.index('_')] or not a.isupper() and '99_group_hack' or a) " class="um_permissions_group ${group=='99_group_hack' and 'um_permissions_group_groups' or ''}"> 13 13 <div class="um_permissions_group_name">${group=='99_group_hack' and 'Groups' or group.capitalize()}</div> 14 14 <div py:for="action in group_actions" py:if="not action in ('anonymous', 'authenticated', user_manager.user.username)"> usermanagerplugin/0.11/tracusermanager/templates/macro_um_profile.html
r3621 r3674 1 <!DOCTYPE html2 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">4 1 <html xmlns="http://www.w3.org/1999/xhtml" 5 2 xmlns:py="http://genshi.edgewall.org/" usermanagerplugin/0.11/tracusermanager/templates/prefs_um_profile.html
r3156 r3674 10 10 </head> 11 11 <body> 12 <form method="POST" enctype="multipart/form-data" py:match="div[@id='tabcontent']/form">13 12 <div py:choose="" class="um_profile_picture"> 14 13 <img py:when="user.picture_href" src="$user.picture_href"/> … … 55 54 </div> 56 55 </div> 57 <div class="um_profile_actions"> 58 <input type="submit" name="um_profile_update" value="Update Profile"/> 59 </div> 60 </form> 56 <script type="text/javascript"> 57 jQuery(document).ready(function ($) { 58 $("#tabcontent form")[0].enctype="multipart/form-data"; 59 }); 60 </script> 61 61 </body> 62 62 </html> usermanagerplugin/0.11/tracusermanager/tests/api.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 # 3 # Copyright 2008 Optaros, Inc. 4 # 2 5 3 6 import os.path usermanagerplugin/0.11/tracusermanager/tests/__init__.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 # 3 # Copyright 2008 Optaros, Inc. 4 # 2 5 3 6 import doctest usermanagerplugin/0.11/tracusermanager/tests/macros_um_profile.py
r3156 r3674 1 1 # -*- coding: utf-8 -*- 2 # 3 # Copyright 2008 Optaros, Inc. 4 # 2 5 3 6 import unittest
