Ticket #2612: svnauthzadminplugin_for_trac0.11.diff

File svnauthzadminplugin_for_trac0.11.diff, 29.2 kB (added by danimo, 11 months ago)
  • 0.10/setup.py

    old new  
    33from setuptools import setup, find_packages 
    44 
    55PACKAGE = 'SvnAuthzAdminPlugin' 
    6 VERSION = '0.1
     6VERSION = '0.1.2 (Moved to Trac 0.11)
    77 
    88setup(  name=PACKAGE, version=VERSION, 
    99        author = 'Gergely Kis', 
     
    1515        package_dir = { 'svnauthz' : 'svnauthz',  
    1616                        'svnauthz_test' : 'svnauthz_test' }, 
    1717        packages = ['svnauthz', 'svnauthz_test' ], 
    18         package_data = { 'svnauthz' : ['templates/*.cs', ]}, 
     18        package_data = { 'svnauthz' : ['templates/*', ]}, 
    1919        entry_points = {'trac.plugins': ['svnauthz.admin_ui = svnauthz.admin_ui', 
    20                                          'svnauthz.SvnAuthzFile = svnauthz.SvnAuthzFile']}, 
    21         install_requires = ['TracWebAdmin', 'TracAccountManager'] 
     20#                                        'svnauthz.SvnAuthzFile = svnauthz.SvnAuthzFile' 
     21                                         ]}, 
     22        zip_safe = False, 
     23        install_requires = [] 
    2224) 
  • 0.10/svnauthz/admin_ui.py

    old new  
    1  
     1import pkg_resources 
    22from trac.core import * 
    33from trac.perm import PermissionSystem 
    44 
    5 from trac.util import sorted 
     5from trac.util import get_pkginfo, get_module_path, sorted 
    66from trac.config import Option 
    7 from webadmin.web_ui import IAdminPageProvider 
     7from trac.admin.api import IAdminPanelProvider 
    88 
    99from model import * 
    1010from io import * 
    11 from acct_mgr.api import AccountManager 
    1211from trac.web.chrome import ITemplateProvider 
    1312 
    1413from urllib import pathname2url, url2pathname 
     
    2322 
    2423 
    2524class SvnAuthzAdminPage(Component): 
    26  
    27     implements(IAdminPageProvider, ITemplateProvider) 
     25    implements(IAdminPanelProvider, ITemplateProvider) 
    2826 
    2927    def __init__(self): 
    3028        self.authz_file = self.env.config.get("trac", "authz_file") 
    3129        self.authz_module = self.env.config.get("trac", "authz_module_name") 
    3230        if self.authz_module != None and self.authz_module.strip() == "": 
    3331            self.authz_module = None 
    34         self.account_manager = AccountManager(self.env) 
     32     
     33 
     34    # ITemplateProvider methods 
     35    def get_htdocs_dirs(self): 
     36        return [] 
     37 
     38    def get_templates_dirs(self): 
     39        return [pkg_resources.resource_filename('svnauthz', 'templates')] 
    3540 
    36     # IAdminPageProvider 
    37     def get_admin_pages(self, req): 
     41    # IAdminPanelProvider 
     42    def get_admin_panels(self, req): 
    3843        if req.perm.has_permission('TRAC_ADMIN'): 
    3944            yield ('subversion', 'Subversion', 'svnauthz', 'Subversion Access') 
    4045 
    41     def process_admin_request(self, req, cat, page, path_info): 
     46    def render_admin_panel(self, req, cat, page, path_info): 
     47        data = {} 
    4248        perm = PermissionSystem(self.env) 
    4349        self.env.log.debug("SvnAuthzAdminPlugin: cat=%s page=%s path_info=%s" 
    4450                           % (cat, page, path_info)) 
    4551        self.authz = self._get_model(); 
    4652        if req.method == 'POST': 
    4753           if req.args.get('addgroup'): 
    48                self._add_group(req
     54               data.update(self._add_group(req)
    4955           elif req.args.get('addpath'): 
    50                self._add_path(req
     56               data.update(self._add_path(req)
    5157           elif req.args.get('addgroupmember'): 
    52                self._add_group_member(req
     58               data.update(self._add_group_member(req)
    5359           elif req.args.get('removegroupmembers'): 
    54                self._del_group_member(req
     60               data.update(self._del_group_member(req)
    5561           elif req.args.get('removegroups'): 
    56                self._del_groups(req
     62               data.update(self._del_groups(req)
    5763           elif req.args.get('removepaths'): 
    58                self._del_paths(req
     64               data.update(self._del_paths(req)
    5965           elif req.args.get('addpathmember'): 
    60                self._add_path_member(req
     66               data.update(self._add_path_member(req)
    6167           elif req.args.get('changepathmembers'): 
    62                self._change_path_members(req
     68               data.update(self._change_path_members(req)
    6369         
    6470        # Handle group and path edit mode handling 
    6571        editgroup = None 
    6672        editpath = None                
    6773        if path_info and path_info.startswith("editgroup/"): 
    68             editgroup = self._edit_group(req, cat, page, path_info) 
     74            editgroup, d = self._edit_group(req, cat, page, path_info) 
     75            data.update(d) 
    6976        elif path_info and path_info.startswith("editpath/"): 
    70             editpath = self._edit_path(req, cat, page, path_info) 
     77            editpath, d = self._edit_path(req, cat, page, path_info) 
     78            data.update(d) 
     79        print data 
    7180 
    7281        paths_disp = [] 
    7382        for repository, path in [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()]: 
     
    8594                                'url' : path_disp_url, 
    8695                                'href': path_disp_href 
    8796                                }) 
    88         req.hdf['paths'] = sorted(paths_disp) 
     97        data['paths'] = sorted(paths_disp) 
    8998         
    9099        groups_disp = [] 
    91100        for group_disp in sorted([g.get_name() for g in self.authz.get_groups()]): 
     
    100109                                 'url': group_disp_url, 
    101110                                 'href': group_disp_href 
    102111                                }) 
    103         req.hdf['groups'] = groups_disp 
     112        data['groups'] = groups_disp 
    104113 
    105114        self._persist_model(self.authz) 
    106115 
    107         return 'admin_authz.cs', None 
     116        return 'admin_authz.html',data  
    108117  
    109     # ITemplateProvider 
    110      
    111     def get_htdocs_dirs(self): 
    112         """Return the absolute path of a directory containing additional 
    113         static resources (such as images, style sheets, etc). 
    114         """ 
    115         return [] 
    116  
    117     def get_templates_dirs(self): 
    118         """Return the absolute path of the directory containing the provided 
    119         ClearSilver templates. 
    120         """ 
    121         from pkg_resources import resource_filename 
    122         return [resource_filename(__name__, 'templates')] 
    123  
    124118    def _add_group(self, req): 
    125119        groupname = req.args.get('groupname') 
    126120        try: 
    127121            self.authz.add_group(Group(groupname, [])) 
     122            return {} 
    128123        except Exception, e: 
    129             req.hdf['addgroup.error'] = e 
     124            return {'addgroup_error' : e} 
    130125         
    131126    def _del_groups(self, req): 
    132127        groups_to_del = req.args.get('selgroup') 
     
    137132                for group in groups_to_del: 
    138133                    self.authz.del_group(url2pathname(group)) 
    139134            else: 
    140                 req.hdf['delgroup.error'] = "Invalid type of group selection"     
     135                return {'delgroup_error' : "Invalid type of group selection"}  
    141136        except Exception, e: 
    142             req.hdf['delgroup.error'] = e 
     137            return {'delgroup_error' : e } 
     138        return {} 
    143139     
    144140    def _del_paths(self, req): 
    145141        paths_to_del = req.args.get('selpath') 
     
    152148                if validpath: 
    153149                    self.authz.del_path(validpath[1], self.authz_module) 
    154150        except Exception, e: 
    155             req.hdf['delpath.error'] = e 
     151            return {'delpath_error' : e } 
    156152 
    157      
     153        return {}  
    158154    def _add_path(self, req): 
    159155        path = req.args.get('path') 
    160156        repository = None 
    161157        try: 
    162158            self.authz.add_path(Path(path, [], self.authz_module)) 
     159            return {} 
    163160        except Exception, e: 
    164             req.hdf['addpath.error'] = e 
     161            return {'addpath_error' :  e} 
    165162 
    166163    def _add_group_member(self, req): 
    167164        editgroup = url2pathname(req.args.get('editgroup')) 
    168165        subject = req.args.get('subject') 
    169166        group = self.authz.find_group(editgroup) 
    170167        if (group == None): 
    171             req.hdf['addgroupmember.error'] = "Group %s does not exist" % editgroup 
    172             return 
     168            return {'addgroupmember_error': "Group %s does not exist" % editgroup } 
    173169        try: 
    174170            member = self._get_member(subject) 
    175171            assert (member != None) 
    176172            group.append(member) 
    177173        except Exception, e: 
    178             req.hdf['addgroupmember.error'] = e 
     174            return {'addgroupmember_error':e}  
     175        return {} 
    179176 
    180177    def _add_path_member(self, req): 
    181178        editpath = url2pathname(req.args.get('editpath')) 
     
    184181        paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 
    185182        validpath = self._get_valid_path(paths, editpath) 
    186183        if not validpath: 
    187             req.hdf['changepathmember.error'] = "Not a valid path: %s" % editpath 
    188             return 
     184            return {'changepathmember_error' : "Not a valid path: %s" % editpath} 
    189185        path = validpath[1]         
    190186        path_members = self.authz.find_path(path, self.authz_module) 
    191187         
     
    208204            assert (s != None) 
    209205            path_members.append(PathAcl(s, read, write)) 
    210206        except Exception, e: 
    211             req.hdf['addpathmember.error'] = e 
     207            return {'addpathmember_error' : e } 
     208        return {} 
    212209 
    213210     
    214211    def _del_group_member(self, req): 
     
    216213        members_to_del = req.args.get('selgroupmember') 
    217214        group = self.authz.find_group(editgroup) 
    218215        if not group: 
    219             req.hdf['delgroupmember.error'] = "Group %s does not exist" % editgroup 
    220             return         
     216            return {'delgroupmember_error': "Group %s does not exist" % editgroup } 
    221217        try: 
    222218            if isinstance(members_to_del, types.StringTypes): 
    223219                group.remove(self._get_member(members_to_del)) 
     
    225221                for member in members_to_del: 
    226222                    group.remove(self._get_member(member)) 
    227223            else: 
    228                 req.hdf['delgroupmember.error'] = "Wrong type of selection" 
     224                return {'delgroupmember_error': "Wrong type of selection" } 
    229225        except Exception, e: 
    230             req.hdf['delgroupmember.error'] = e 
     226            return {'delgroupmember_error': e} 
     227 
     228        return {} 
    231229 
    232230    def _change_path_members(self, req): 
    233231        editpath = url2pathname(req.args.get('editpath')) 
    234232        paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 
    235233        validpath = self._get_valid_path(paths, editpath) 
    236234        if not validpath: 
    237             req.hdf['changepathmember.error'] = "Not a valid path: %s" % editpath 
    238             return 
     235            return {'changepathmember_error' : "Not a valid path: %s" % editpath } 
    239236        path = validpath[1] 
    240237        members_to_del = req.args.get('selpathmember') 
    241238        member_acls = req.args.get('selpathmember_acl') 
     
    243240         
    244241        if len(path_members) == 0: 
    245242            # Nothing to do 
    246             return 
     243            return {} 
    247244         
    248245        try: 
    249246            if members_to_del != None: 
    250247                if isinstance(members_to_del, types.StringTypes): 
    251248                    members_to_del = [members_to_del] 
    252249                if not isinstance(members_to_del, types.ListType): 
    253                     req.hdf['changepathmember.error'] = "Wrong type of member selection" 
    254                     return 
     250                    return {'changepathmember_error':  "Wrong type of member selection"} 
    255251                for member in members_to_del: 
    256252                    path_members.remove(path_members.find_path_member(self._get_member(member))) 
    257253        except Exception, e: 
    258             req.hdf['changepathmember.error'] = e 
    259             return 
     254            return {'changepathmember_error': e} 
    260255         
    261256        if member_acls == None: 
    262257            member_acls = "" 
     
    277272                    member.set_read(read) 
    278273                    member.set_write(write) 
    279274        except Exception, e: 
    280             req.hdf['changepathmember.error'] = e 
     275            return {'changepathmember_error':e} 
     276        return {} 
    281277     
    282278    def _edit_group(self, req, cat, page, path_info): 
    283279        """ 
    284280            Populates the editgroup.* parts of the hdf 
    285281            @return the value of editgroup.url or None 
    286282        """ 
     283        data = {} 
    287284        editgroup = url2pathname(path_info[path_info.index('/')+1:len(path_info)])             
    288285        group = self.authz.find_group(editgroup) 
     286        print group 
    289287        if group != None: 
    290             req.hdf['editgroup.name'] = editgroup 
    291             req.hdf['editgroup.url'] = pathname2url(editgroup) 
    292             req.hdf['editgroup.members'] = [m.__str__() for m in group] 
     288            data['editgroup_name'] = editgroup 
     289            data['editgroup_url'] = pathname2url(editgroup) 
     290            data['editgroup_members'] = [m.__str__() for m in group] 
    293291             
    294292            # Populate member candidates 
    295293            not_in_list = [m.__str__() for m in group] 
    296294            not_in_list.append("@%s" % editgroup) 
    297295            candidates = self._get_candidate_subjects(not_in_list) 
    298296            if candidates != []: 
    299                 req.hdf['editgroup.candidates'] = candidates 
    300             return req.hdf['editgroup.url'] 
    301         return None 
     297                data['editgroup_candidates'] = candidates 
     298            return data['editgroup_url'], data 
     299        self.env.log.debug("SvnAdminAuthz: Group %s not found." % editgroup) 
     300        return None, {}  
     301 
     302    def _get_all_users(self): 
     303      """ 
     304      Fetches all users/groups from PermissionSystem 
     305      """ 
     306      perm = PermissionSystem(self.env) 
     307      users = ["*"] 
     308      data = perm.get_all_permissions() 
     309      if not data: 
     310        return [] # we abort here 
     311 
     312      for (subject, action) in data: 
     313        if subject not in users and subject not in ["anonymous", "authenticated"]: 
     314          users.append(subject) 
     315      return users       
    302316 
    303317    def _get_candidate_subjects(self, not_in_list = []): 
    304318        candidates = [] 
    305         users = [user for user in self.account_manager.get_users()  
     319        users = [user for user in self._get_all_users()  
    306320                 if user not in not_in_list] 
    307321        candidates += sorted(users) 
    308322        candidates += sorted([group.__str__() for group in self.authz.get_groups()  
    309323                              if group.__str__() not in not_in_list]) 
    310         self.env.log.debug("Candidates:") 
    311         for c in candidates: 
    312             self.env.log.debug("   %s" % c)              
     324        #self.env.log.debug("Candidates:") 
     325        #for c in candidates: 
     326        #    self.env.log.debug("   %s" % c)              
    313327        return candidates 
    314328     
    315329    def _edit_path(self, req, cat, page, path_info): 
     
    317331            Populates the editpath.* parts of the hdf 
    318332            @return the value of editgroup.url or None 
    319333        """ 
     334        data = {} 
    320335        editpath = url2pathname(path_info[path_info.index('/')+1:len(path_info)])             
    321336        paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 
    322337        validpath = self._get_valid_path(paths, editpath) 
    323338        if validpath: 
    324             req.hdf['editpath.name'] = self._get_disp_path_name(validpath[0], validpath[1]) 
    325             req.hdf['editpath.url'] = pathname2url(editpath) 
     339            data['editpath_name'] = self._get_disp_path_name(validpath[0], validpath[1]) 
     340            data['editpath_url'] = pathname2url(editpath) 
    326341            pathmembers = self.authz.find_path(validpath[1], validpath[0]) 
    327342            editpath_members = [] 
    328343            for member in pathmembers: 
     
    335350                editpath_members.append({'subject' : member.get_member().__str__(), 
    336351                                         'read' : read, 
    337352                                         'write' : write}) 
    338             req.hdf['editpath.members'] = editpath_members  
     353            data['editpath_members'] = editpath_members  
    339354             
    340355            # Populate member candidates 
    341356            not_in_list = [m.get_member().__str__() for m in pathmembers] 
    342357            candidates = self._get_candidate_subjects(not_in_list) 
    343358            if candidates != []: 
    344                 req.hdf['editpath.candidates'] = candidates 
    345             return req.hdf['editpath.url'] 
    346         return None 
     359               data['editpath_candidates'] = candidates 
     360            return data['editpath_url'], data 
     361        return None, {}  
    347362 
    348363    def _get_valid_path(self, pathlist, path): 
    349364        for repository, pathname in pathlist: 
  • 0.10/svnauthz/model.py

    old new  
    131131         
    132132    def serialize(self): 
    133133        ret=""+ self.member.__str__() + " = " 
     134 
    134135        if (self.r): 
    135136            ret +="r" 
    136137        if (self.w): 
  • 0.10/svnauthz/templates/admin_authz.cs

    old new  
    1 <h2>Manage Subversion Access Rights</h2> 
    2  
    3  
    4 <?cs if editgroup.name ?> 
    5 <form id="addgroupmember" class="addnew" method="post"> 
    6  <input type="hidden" name="editgroup" value="<?cs var:editgroup.url ?>" /> 
    7  <fieldset> 
    8   <?cs if addgroupmember.error ?> 
    9   <div class="system-message"><p><?cs var:addgroupmember.error ?></p></div> 
    10   <?cs /if ?> 
    11  
    12   <legend>Add Group Member to <?cs var:editgroup.name ?></legend> 
    13   <div class="field"> 
    14    <label>Subject: <?cs call:hdf_select(editgroup.candidates, "subject", "", 0) ?> 
    15    </label> 
    16   </div> 
    17   <p class="help">Add a new subject to a Subversion group.</p> 
    18   <div class="buttons"> 
    19    <input type="submit" name="addgroupmember" value=" Add "> 
    20   </div> 
    21  </fieldset> 
    22 </form> 
    23 <?cs /if ?> 
    24  
    25 <?cs if editpath.name ?> 
    26 <form id="addpathmember" class="addnew" method="post"> 
    27  <input type="hidden" name="editpath" value="<?cs var:editpath.url ?>" /> 
    28  <fieldset> 
    29   <?cs if addpathmember.error ?> 
    30   <div class="system-message"><p><?cs var:addpathmember.error ?></p></div> 
    31   <?cs /if ?> 
    32  
    33   <legend>Add Path Member to <?cs var:editpath.name ?></legend> 
    34   <div class="field"> 
    35    <label>Subject: <?cs call:hdf_select(editpath.candidates, "subject", "", 0) ?> 
    36    </label> 
    37   </div> 
    38   <div class="field"> 
    39    <label>Read: <input type="checkbox" name="addpathmember_acl" value="R"/> 
    40    </label> 
    41   </div> 
    42   <div class="field"> 
    43    <label>Write: <input type="checkbox" name="addpathmember_acl" value="W"/> 
    44    </label> 
    45   </div> 
    46   <p class="help">Add a new subject to a Path.</p> 
    47   <div class="buttons"> 
    48    <input type="submit" name="addpathmember" value=" Add "> 
    49   </div> 
    50  </fieldset> 
    51 </form> 
    52 <?cs /if ?> 
    53  
    54  
    55  
    56 <form id="addgroup" class="addnew" method="post"> 
    57  <fieldset> 
    58   <?cs if addgroup.error ?> 
    59   <div class="system-message"><p><?cs var:addgroup.error ?></p></div> 
    60   <?cs /if ?> 
    61  
    62   <legend>Add Group:</legend> 
    63   <div class="field"> 
    64    <label>Group name: <input type="text" name="groupname" class="textwidget" /></label> 
    65   </div> 
    66   <p class="help">Add a new Subversion group.</p> 
    67   <div class="buttons"> 
    68    <input type="submit" name="addgroup" value=" Add "> 
    69   </div> 
    70  </fieldset> 
    71 </form> 
    72  
    73 <form id="addpath" class="addnew" method="post"> 
    74  <fieldset> 
    75   <?cs if addpath.error ?> 
    76   <div class="system-message"><p><?cs var:addpath.error ?></p></div> 
    77   <?cs /if ?> 
    78  
    79   <legend>Add Path:</legend> 
    80   <div class="field"> 
    81    <label>Path: <input type="text" name="path" class="textwidget" /></label> 
    82   </div> 
    83   <?cs if addpath.repository ?> 
    84   <div class="field"> 
    85    <label>Repository: <input type="text" name="repository" class="textwidget" /></label> 
    86   </div> 
    87   <?cs /if?> 
    88   <p class="help">Add a new Subversion path.</p> 
    89   <div class="buttons"> 
    90    <input type="submit" name="addpath" value=" Add "> 
    91   </div> 
    92  </fieldset> 
    93 </form> 
    94  
    95 <form method="post"> 
    96   <?cs if delgroup.error ?> 
    97         <div class="system-message"><p><?cs var:delgroup.error ?></p></div> 
    98   <?cs /if ?> 
    99  <table class="listing" id="grouplist"> 
    100   <thead> 
    101    <tr><th class="sel">&nbsp;</th><th>Subversion Groups</th></tr> 
    102   </thead><tbody> 
    103   <?cs each:group = groups ?> 
    104    <tr> 
    105     <td><input type="checkbox" name="selgroup" value="<?cs var:group.url ?>" /></td> 
    106     <td><a href="<?cs var:group.href ?>"><?cs var:group.name ?></a> 
    107         <?cs if editgroup.url == group.url ?> 
    108                   <?cs if delgroupmember.error ?> 
    109                         <div class="system-message"><p><?cs var:delgroupmember.error ?></p></div> 
    110                   <?cs /if ?> 
    111  
    112                         <input type="hidden" name="editgroup" value="<?cs var:editgroup.url ?>" /> 
    113                 <table class="listing" id="editgrouplist"> 
    114                         <thead> 
    115                                 <tr><th class="sel">&nbsp;</th><th>Group Members</th></tr> 
    116                         </thead><tbody>                  
    117                         <?cs each:groupmember = editgroup.members ?> 
    118                         <tr> 
    119                         <td><input type="checkbox" name="selgroupmember" value="<?cs var:groupmember ?>"/></td> 
    120                         <td><?cs var:groupmember ?></td> 
    121                         </tr> 
    122                         <?cs /each ?> 
    123                 </tbody></table> 
    124                 <div class="buttons"> 
    125                         <input type="submit" name="removegroupmembers" value="Remove selected group members" /> 
    126                 </div> 
    127         <?cs /if ?>     
    128     </td> 
    129    </tr> 
    130   <?cs /each ?> 
    131   </tbody> 
    132  </table> 
    133  <div class="buttons"> 
    134   <input type="submit" name="removegroups" value="Remove selected groups" /> 
    135  </div> 
    136 </form> 
    137  
    138 <form method="post"> 
    139   <?cs if delpath.error ?> 
    140         <div class="system-message"><p><?cs var:delpath.error ?></p></div> 
    141   <?cs /if ?> 
    142  <table class="listing" id="pathlist"> 
    143   <thead> 
    144    <tr><th class="sel">&nbsp;</th><th>Subversion Paths</th></tr> 
    145   </thead><tbody><?cs 
    146    each:path = paths ?> 
    147    <tr> 
    148     <td><input type="checkbox" name="selpath" value="<?cs var:path.url ?>" /></td> 
    149     <td><a href="<?cs var:path.href ?>"><?cs var:path.name ?></a> 
    150         <?cs if editpath.url == path.url ?> 
    151                   <?cs if changepathmember.error ?> 
    152                         <div class="system-message"><p><?cs var:changepathmember.error ?></p></div> 
    153                   <?cs /if ?> 
    154  
    155                         <input type="hidden" name="editpath" value="<?cs var:editpath.url ?>" /> 
    156                 <table class="listing" id="editpathlist"> 
    157                         <thead> 
    158                                 <tr><th class="sel">Remove</th><th>Path Members</th><th>Read</th><th>Write</th></tr> 
    159                         </thead><tbody>                  
    160                         <?cs each:pathmember = editpath.members ?> 
    161                         <tr> 
    162                         <td><input type="checkbox" name="selpathmember" value="<?cs var:pathmember.subject ?>"/></td> 
    163                         <td><?cs var:pathmember.subject ?></td> 
    164                         <td><input type="checkbox" name="selpathmember_acl" value="<?cs var:pathmember.subject ?>_R" <?cs var:pathmember.read ?> /></td> 
    165                         <td><input type="checkbox" name="selpathmember_acl" value="<?cs var:pathmember.subject ?>_W" <?cs var:pathmember.write ?> /></td> 
    166                         </tr> 
    167                         <?cs /each ?> 
    168                 </tbody></table> 
    169                 <div class="buttons"> 
    170                         <input type="submit" name="changepathmembers" value="Change path members" /> 
    171                 </div> 
    172         <?cs /if ?>     
    173     </td> 
    174    </tr><?cs 
    175   /each ?></tbody> 
    176  </table> 
    177  <div class="buttons"> 
    178   <input type="submit" name="removepaths" value="Remove selected paths" /> 
    179  </div> 
    180 </form> 
    181  
  • 0.10/svnauthz/templates/admin_authz.html

    old new  
     1<!DOCTYPE html 
     2   PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
     3   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
     4<html xmlns="http://www.w3.org/1999/xhtml" 
     5      xmlns:xi="http://www.w3.org/2001/XInclude" 
     6            xmlns:py="http://genshi.edgewall.org/"> 
     7  <xi:include href="admin.html" /> 
     8  <head> 
     9   <title>Plugins</title> 
     10   <script type="text/javascript" src="${chrome.htdocs_location}js/folding.js"></script> 
     11   <script type="text/javascript"> 
     12   $(document).ready(function(){ $("div.plugin h3").enableFolding(true) }); 
     13   </script> 
     14  </head> 
     15  <body> 
     16  <h2>Manage Subversion Access Rights</h2> 
     17 
     18<py:if test="editgroup_name"> 
     19<form id="addgroupmember" class="addnew"  method="post"> 
     20 <input type="hidden" name="editgroup" value="${editgroup_url}" /> 
     21 <fieldset> 
     22  <py:if test="addgroupmember_error"> 
     23  <div class="system-message"><p>${addgroupmember_error}</p></div> 
     24  </py:if> 
     25 
     26  <legend>Add Group Member to ${editgroup_name}</legend> 
     27  <div class="field"> 
     28   <label>Subject:  
     29    <select name="subject"> 
     30     <option py:for="candidate in editgroup_candidates" value="$candidate">$candidate</option> 
     31    </select> 
     32   </label> 
     33  </div> 
     34  <p class="help">Add a new subject to a Subversion group.</p> 
     35  <div class="buttons"> 
     36   <input type="submit" name="addgroupmember" value=" Add " /> 
     37  </div> 
     38 </fieldset> 
     39</form> 
     40</py:if> 
     41 
     42<py:if test="editpath_name"> 
     43<form id="addpathmember" class="addnew" method="post"> 
     44 <input type="hidden" name="editpath" value="${editpath_url}" /> 
     45 <fieldset> 
     46  <py:if test="addpathmember_error"> 
     47  <div class="system-message"><p>${addpathmember_error}</p></div> 
     48  </py:if> 
     49 
     50  <legend>Add Path Member to $editpath_name</legend> 
     51  <div class="field"> 
     52   <label>Subject: 
     53   <select name="subject"> 
     54        <option py:for="candidate in editpath_candidates" value="$candidate">$candidate</option> 
     55            </select> 
     56   </label> 
     57  </div> 
     58  <div class="field"> 
     59   <label>Read: <input type="checkbox" name="addpathmember_acl" value="R"/> 
     60   </label> 
     61  </div> 
     62  <div class="field"> 
     63   <label>Write: <input type="checkbox" name="addpathmember_acl" value="W"/> 
     64   </label> 
     65  </div> 
     66  <p class="help">Add a new subject to a Path.</p> 
     67  <div class="buttons"> 
     68   <input type="submit" name="addpathmember" value=" Add " /> 
     69  </div> 
     70 </fieldset> 
     71</form> 
     72</py:if> 
     73 
     74 
     75 
     76<form id="addgroup" class="addnew" method="post">  
     77 <fieldset> 
     78  <py:if test="addgroup and addgroup.error"> 
     79  <div class="system-message"><p>$addgroup.error</p></div> 
     80  </py:if> 
     81 
     82  <legend>Add Group:</legend> 
     83  <div class="field"> 
     84   <label>Group name: <input type="text" name="groupname" class="textwidget" /></label> 
     85  </div> 
     86  <p class="help">Add a new Subversion group.</p> 
     87  <div class="buttons"> 
     88   <input type="submit" name="addgroup" value=" Add " /> 
     89  </div> 
     90 </fieldset> 
     91</form> 
     92 
     93<form id="addpath" class="addnew" method="post"> 
     94 <fieldset> 
     95  <py:if test="addpath_error"> 
     96  <div class="system-message"><p>$addpath_error</p></div> 
     97  </py:if> 
     98 
     99  <legend>Add Path:</legend> 
     100  <div class="field"> 
     101   <label>Path: <input type="text" name="path" class="textwidget" /></label> 
     102  </div> 
     103  <py:if test="addpath_repository"> 
     104  <div class="field"> 
     105   <label>Repository: <input type="text" name="repository" class="textwidget" /></label> 
     106  </div> 
     107  </py:if> 
     108  <p class="help">Add a new Subversion path.</p> 
     109  <div class="buttons"> 
     110   <input type="submit" name="addpath" value=" Add " /> 
     111  </div> 
     112 </fieldset> 
     113</form> 
     114 
     115<form method="post"> 
     116  <py:if test="delgroup_error"> 
     117        <div class="system-message"><p>$delgroup_error</p></div> 
     118  </py:if> 
     119 <table class="listing" id="grouplist"> 
     120  <thead> 
     121   <tr><th class="sel">&nbsp;</th><th>Subversion Groups</th></tr> 
     122  </thead><tbody> 
     123  <py:for each="group in groups"> 
     124   <tr> 
     125    <td><input type="checkbox" name="selgroup" value="${group.url}" /></td> 
     126    <td><a href="${group.href}">${group.name}</a> 
     127        <py:if test="editgroup_url == group.url">  
     128                  <py:if test="delgroupmember_error"> 
     129                        <div class="system-message"><p>$delgroupmember_error</p></div> 
     130                  </py:if> 
     131 
     132                        <input type="hidden" name="editgroup" value="${editgroup_url}" /> 
     133                <table class="listing" id="editgrouplist"> 
     134                        <thead> 
     135                                <tr><th class="sel">&nbsp;</th><th>Group Members</th></tr> 
     136                        </thead><tbody>                  
     137                        <py:for each="groupmember in editgroup_members"> 
     138                        <tr> 
     139                        <td><input type="checkbox" name="selgroupmember" value="$groupmember"/></td> 
     140                        <td>$groupmember</td> 
     141                        </tr> 
     142                        </py:for> 
     143                </tbody></table> 
     144                <div class="buttons"> 
     145                        <input type="submit" name="removegroupmembers" value="Remove selected group members" /> 
     146                </div> 
     147        </py:if>     
     148    </td> 
     149   </tr> 
     150  </py:for> 
     151  </tbody> 
     152 </table> 
     153 <div class="buttons"> 
     154  <input type="submit" name="removegroups" value="Remove selected groups" /> 
     155 </div> 
     156</form> 
     157 
     158<form method="post"> 
     159  <py:if test="delpath_error"> 
     160        <div class="system-message"><p>$delpath_error</p></div> 
     161  </py:if> 
     162 <table class="listing" id="pathlist"> 
     163  <thead> 
     164   <tr><th class="sel">&nbsp;</th><th>Subversion Paths</th></tr> 
     165  </thead><tbody><py:for each="path in paths"> 
     166   <tr> 
     167    <td><input type="checkbox" name="selpath" value="${path.url}" /></td> 
     168    <td><a href="${path.href}">${path.name}</a> 
     169        <py:if test="path and editpath_url == path.url"> 
     170                  <py:if test="changepathmember_error"> 
     171                        <div class="system-message"><p>${changepathmember_error}</p></div> 
     172                  </py:if> 
     173 
     174                        <input type="hidden" name="editpath" value="${editpath_url}" /> 
     175                <table class="listing" id="editpathlist"> 
     176                        <thead> 
     177                                <tr><th class="sel">Remove</th><th>Path Members</th><th>Read</th><th>Write</th></tr> 
     178                        </thead><tbody>                  
     179                        <py:for each="pathmember in editpath_members"> 
     180                        <tr> 
     181                        <td><input type="checkbox" name="selpathmember" value="${pathmember.subject}"/></td> 
     182                        <td>${pathmember.subject}</td> 
     183                        <td><input type="checkbox" name="selpathmember_acl" value="${pathmember.subject}_R" checked="${pathmember.read}" /></td> 
     184                        <td><input type="checkbox" name="selpathmember_acl" value="${pathmember.subject}_W" checked="${pathmember.write}" /></td> 
     185                        </tr> 
     186                        </py:for> 
     187                </tbody></table> 
     188                <div class="buttons"> 
     189                        <input type="submit" name="changepathmembers" value="Change path members" /> 
     190                </div> 
     191        </py:if>     
     192    </td> 
     193   </tr></py:for> 
     194  </tbody> 
     195 </table> 
     196 <div class="buttons"> 
     197  <input type="submit" name="removepaths" value="Remove selected paths" /> 
     198 </div> 
     199</form> 
     200</body> 
     201</html>