Changeset 3674

Show
Ignore:
Timestamp:
05/13/08 12:01:59 (6 months ago)
Author:
cbalan
Message:

--

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • usermanagerplugin/0.11/setup.py

    r3156 r3674  
    11#!/usr/bin/env python 
    22# -*- coding: iso-8859-1 -*- 
     3# 
     4# Copyright 2007-2008 Optaros, Inc 
     5# 
    36 
    47from setuptools import setup 
    58 
    6 setup(name='TracUserManagerPlugin'
    7       version='0.2'
     9setup(name="TracUserManagerPlugin"
     10      version="0.3"
    811      packages=['tracusermanager',  
    912                'tracusermanager.account',  
     
    1215      author="Catalin Balan",  
    1316      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"
    1720      entry_points={'trac.plugins': [ 
    1821            'tracusermanager.api = tracusermanager.api', 
  • usermanagerplugin/0.11/tracusermanager/account/admin_um.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
     
    1714from acct_mgr.api import AccountManager 
    1815 
    19 from tracusermanager.admin import IUserManagerPanelProvider, IUserListCellContributor 
     16from tracusermanager.admin import IUserManagerPanelProvider 
    2017 
    2118class AccountUserManagerPanel(Component): 
    2219     
    23     implements(IUserManagerPanelProvider, IUserListCellContributor
     20    implements(IUserManagerPanelProvider
    2421     
    2522    def get_usermanager_admin_panels(self, req): 
     
    5754         
    5855        return 'admin_um_account.html',{'um_account':data, 'messages':messages, 'errors':errors} 
    59      
    60     # IUserListCellContributor methods              
    61     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  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
     
    6764    def get_admin_panels(self, req): 
    6865        if req.perm.has_permission('TRAC_ADMIN'): 
    69             yield ('general', _('General'), 'user_management', _('User Management')
     66            yield ('accounts', _('Accounts'), 'users', 'Users'
    7067         
    7168    def render_admin_panel( self, req, cat, page, path_info): 
     
    9188            try: 
    9289                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) )                     
    9491                elif req.args.has_key("um_user_delete"): 
    9592                    um_data['messages'].append( self._do_delete_user(req) ) 
     
    128125        # adding usernamager's data to the data dict 
    129126        data.update(user_manager = um_data) 
    130          
     127                 
    131128        try: 
    132129            from acct_mgr.api import AccountManager 
     
    136133            trac_managed_users_out = self._do_import_current_users(req, dry_run=True) 
    137134            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         
    139137        except Exception, e: 
    140138            self.log.error('Account manager not loaded') 
     
    153151         
    154152        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         
    155156        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 []): 
    159158            if field=='password': 
    160159                if req.args.get('um_newuser_password')==req.args.get('um_newuser_confirm_password'): 
     
    196195            
    197196        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)
    199198        else: 
    200199            return _("No users imported.") 
    201      
     200         
    202201    def _get_panels(self, req): 
    203202        """Return a list of available admin panels.""" 
  • usermanagerplugin/0.11/tracusermanager/api.py

    r3604 r3674  
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
     3# Copyright 2008 Optaros, Inc. 
    54# 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
    7 #  
    85 
    96import traceback  
     
    147144        """Name of the component implementing `IAttributeProvider`, which is used 
    148145        for storing user attributes""") 
    149          
    150  
    151146     
    152147    # Public methods 
     
    393388            self.log.error('%s: %s\n%s' % (self.__class__.__name__, str(e), out.getvalue())) 
    394389            raise TracError("Unable to set attribute %s for user [%s]."%(attribute, username)) 
    395          
     390     
    396391        return False 
    397392     
     
    475470    implements(IEnvironmentSetupParticipant) 
    476471     
    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      
    480472    # IEnvironmentSetupParticipant methods 
    481473    def environment_created(self): 
     
    483475     
    484476    def environment_needs_upgrade(self, db): 
    485         if not self.overwrite_get_known_users: 
    486             return False 
    487          
    488477        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) 
    491486         
    492487        self.env.get_known_users = inline_overwrite_get_known_users 
     
    496491    def upgrade_environment(self, db): 
    497492        pass 
    498  
  • usermanagerplugin/0.11/tracusermanager/htdocs/css/admin_um.css

    r3156 r3674  
    124124} 
    125125 
     126div#um_active_users .um_user_panels div.um_messages{ 
     127        margin-bottom:5px;       
     128} 
     129 
     130div#um_active_users .um_user_panels div.um_errors{ 
     131        margin-bottom:5px;       
     132} 
     133 
    126134div#um_active_users .um_user_panels .um_user_panels_tabs { 
    127135        list-style-image:none; 
  • usermanagerplugin/0.11/tracusermanager/permissions/admin_um.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
     
    107from trac.util.translation import _ 
    118from trac.perm import PermissionSystem 
    12 from trac.web.chrome import add_stylesheet 
     9from trac.web.chrome import add_stylesheet, add_script 
    1310 
    1411from tracusermanager.admin import IUserManagerPanelProvider 
     
    5754 
    5855        add_stylesheet(req, 'tracusermanager/css/admin_um_permissions.css') 
     56        add_script(req, 'tracusermanager/js/admin_um_permissions.js') 
    5957         
    6058        return 'admin_um_permissions.html', data 
  • usermanagerplugin/0.11/tracusermanager/profile/admin.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
     
    2320    def get_admin_panels(self, req): 
    2421        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')) 
    2623 
    2724    def render_admin_panel(self, req, cat, page, path_info): 
     
    2926        #req.perm.assert_permission('TRAC_ADMIN') 
    3027         
    31         #add_script(req, 'customfieldadmin/js/CustomFieldAdminPage_actions.js') 
    32  
    3328        def _field_from_req(self, req): 
    3429            cfdict = {'name': to_unicode(req.args.get('name')), 
  • usermanagerplugin/0.11/tracusermanager/profile/admin_um.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
  • usermanagerplugin/0.11/tracusermanager/profile/api.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
  • usermanagerplugin/0.11/tracusermanager/profile/macros.py

    r3156 r3674  
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
  • usermanagerplugin/0.11/tracusermanager/profile/prefs.py

    r3156 r3674  
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2006 Optaros, Inc. 
    4 # All rights reserved. 
    5 
    6 # @author: Catalin BALAN <cbalan@optaros.com> 
     3# Copyright 2008 Optaros, Inc. 
    74# 
    85 
     
    2118    # IPreferencePanelProvider methods 
    2219    def get_preference_panels(self, req): 
    23         yield ('userprofile', _('My Profile'))     
     20        if req.session.authenticated: 
     21            yield ('userprofile', _('My Profile'))     
    2422         
    2523    def render_preference_panel(self, req, panel): 
     
    3735                        data['messages'].append(_("Successfully removed %s's picture.")%(user.username)) 
    3836                        req.redirect(req.href.prefs('userprofile')) 
    39             if req.args.has_key("um_profile_update")
     37            else
    4038                for field in data['um_profile_fields'].keys(): 
    4139                    if req.args.has_key("um_profile_%s"%(field)): 
  • usermanagerplugin/0.11/tracusermanager/templates/admin_um_account.html

    r3156 r3674  
    77          py:strip="">   
    88        <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>  
    189                <fieldset py:if="um_account.type=='trac-managed'"> 
    1910                        <legend>Change password</legend> 
  • usermanagerplugin/0.11/tracusermanager/templates/admin_um.html

    r3605 r3674  
    1111        <body> 
    1212                <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 
    1920                <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))">       
    2122                                <thead> 
    2223                                        <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> 
    2425                                        </tr>                    
    2526                                        <tr> 
     
    3435                                        <tr id="um_user_${user.username}"> 
    3536                                                <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> 
    3738                                                <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> 
    3839                                                <th align="left" > 
     
    4647                                                <td colspan="${len(user_manager.cells)+2}" py:if="user_manager.user and user_manager.user.username==user.username"> 
    4748                                                        <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> 
    4855                                                                <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 ''}"> 
    5057                                                                                <a href="${panel_href(user.username,panel[0])}#um_user_${user.username}">${panel[1]}</a> 
    5158                                                                        </li> 
     
    6673                                </py:for> 
    6774                                <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> 
    6976                                </tr>    
    7077                        </tbody> 
    7178                        <tfoot> 
     79                                <tr py:if="False"> 
     80                                        <th colspan="${len(user_manager.cells)+3}">.::</th> 
     81                                </tr> 
    7282                                <tr> 
    7383                                        <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"> 
    7585                                                        <input type="hidden" name="um_newuser_type" value="server-managed"/> 
    7686                                                        <fieldset class="close"> 
     
    8797                                                                                <label>Email:</label><input type="text" name="um_newuser_email"/> 
    8898                                                                        </div> 
     99                                                                        <div class="field" > 
     100                                                                                <label>Role:</label><input type="text" name="um_newuser_role"  /> 
     101                                                                        </div> 
    89102                                                                        <input type="submit" name="um_newuser_create" value="Add user"/> 
    90103                                                                </div> 
     
    92105                                                        </fieldset> 
    93106                                                </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"> 
    95108                                                        <input type="hidden" name="um_newuser_type" value="trac-managed"/> 
    96109                                                        <fieldset class="close"> 
    97                                                                 <legend class="expander">Add user managed by Account Manager</legend> 
     110                                                                <legend class="expander">Add external user</legend> 
    98111                                                                <div class="field-wrapper" style="display:none"> 
    99112                                                                        <div class="field" > 
     
    107120                                                                        </div> 
    108121                                                                        <div class="field" > 
     122                                                                                <label>Role:</label><input type="text" name="um_newuser_role"  /> 
     123                                                                        </div> 
     124                                                                        <div class="field" > 
    109125                                                                                <label>Password:</label><input type="password" name="um_newuser_password"  /> 
    110126                                                                        </div> 
     
    112128                                                                                <label>Confirm password:</label><input type="password" name="um_newuser_confirm_password" /> 
    113129                                                                        </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"/> 
    115131                                                                </div> 
    116132                                                        </fieldset> 
    117                                                 </form>                                 
     133                                                </form>  
    118134                                        </th> 
    119135                                </tr> 
  • usermanagerplugin/0.11/tracusermanager/templates/admin_um_permissions.html

    r3156 r3674  
    1010                        <legend>Advanced Permissions</legend> 
    1111                        <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 ''}"> 
    1313                                        <div class="um_permissions_group_name">${group=='99_group_hack' and 'Groups' or group.capitalize()}</div> 
    1414                                        <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 html 
    2     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    3     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
    41<html xmlns="http://www.w3.org/1999/xhtml" 
    52      xmlns:py="http://genshi.edgewall.org/" 
  • usermanagerplugin/0.11/tracusermanager/templates/prefs_um_profile.html

    r3156 r3674  
    1010        </head> 
    1111        <body> 
    12                 <form method="POST" enctype="multipart/form-data" py:match="div[@id='tabcontent']/form">         
    1312                        <div py:choose="" class="um_profile_picture"> 
    1413                                <img py:when="user.picture_href" src="$user.picture_href"/> 
     
    5554                                </div> 
    5655                        </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"> 
     57jQuery(document).ready(function ($) { 
     58  $("#tabcontent form")[0].enctype="multipart/form-data"; 
     59}); 
     60</script> 
    6161        </body> 
    6262</html> 
  • usermanagerplugin/0.11/tracusermanager/tests/api.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
     2# 
     3# Copyright 2008 Optaros, Inc. 
     4# 
    25 
    36import os.path 
  • usermanagerplugin/0.11/tracusermanager/tests/__init__.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
     2# 
     3# Copyright 2008 Optaros, Inc. 
     4# 
    25 
    36import doctest 
  • usermanagerplugin/0.11/tracusermanager/tests/macros_um_profile.py

    r3156 r3674  
    11# -*- coding: utf-8 -*- 
     2# 
     3# Copyright 2008 Optaros, Inc. 
     4# 
    25 
    36import unittest