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 3 3 from setuptools import setup, find_packages 4 4 5 5 PACKAGE = 'SvnAuthzAdminPlugin' 6 VERSION = '0.1 '6 VERSION = '0.1.2 (Moved to Trac 0.11)' 7 7 8 8 setup( name=PACKAGE, version=VERSION, 9 9 author = 'Gergely Kis', … … 15 15 package_dir = { 'svnauthz' : 'svnauthz', 16 16 'svnauthz_test' : 'svnauthz_test' }, 17 17 packages = ['svnauthz', 'svnauthz_test' ], 18 package_data = { 'svnauthz' : ['templates/* .cs', ]},18 package_data = { 'svnauthz' : ['templates/*', ]}, 19 19 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 = [] 22 24 ) -
0.10/svnauthz/admin_ui.py
old new 1 1 import pkg_resources 2 2 from trac.core import * 3 3 from trac.perm import PermissionSystem 4 4 5 from trac.util import sorted5 from trac.util import get_pkginfo, get_module_path, sorted 6 6 from trac.config import Option 7 from webadmin.web_ui import IAdminPageProvider7 from trac.admin.api import IAdminPanelProvider 8 8 9 9 from model import * 10 10 from io import * 11 from acct_mgr.api import AccountManager12 11 from trac.web.chrome import ITemplateProvider 13 12 14 13 from urllib import pathname2url, url2pathname … … 23 22 24 23 25 24 class SvnAuthzAdminPage(Component): 26 27 implements(IAdminPageProvider, ITemplateProvider) 25 implements(IAdminPanelProvider, ITemplateProvider) 28 26 29 27 def __init__(self): 30 28 self.authz_file = self.env.config.get("trac", "authz_file") 31 29 self.authz_module = self.env.config.get("trac", "authz_module_name") 32 30 if self.authz_module != None and self.authz_module.strip() == "": 33 31 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')] 35 40 36 # IAdminPa geProvider37 def get_admin_pa ges(self, req):41 # IAdminPanelProvider 42 def get_admin_panels(self, req): 38 43 if req.perm.has_permission('TRAC_ADMIN'): 39 44 yield ('subversion', 'Subversion', 'svnauthz', 'Subversion Access') 40 45 41 def process_admin_request(self, req, cat, page, path_info): 46 def render_admin_panel(self, req, cat, page, path_info): 47 data = {} 42 48 perm = PermissionSystem(self.env) 43 49 self.env.log.debug("SvnAuthzAdminPlugin: cat=%s page=%s path_info=%s" 44 50 % (cat, page, path_info)) 45 51 self.authz = self._get_model(); 46 52 if req.method == 'POST': 47 53 if req.args.get('addgroup'): 48 self._add_group(req)54 data.update(self._add_group(req)) 49 55 elif req.args.get('addpath'): 50 self._add_path(req)56 data.update(self._add_path(req)) 51 57 elif req.args.get('addgroupmember'): 52 self._add_group_member(req)58 data.update(self._add_group_member(req)) 53 59 elif req.args.get('removegroupmembers'): 54 self._del_group_member(req)60 data.update(self._del_group_member(req)) 55 61 elif req.args.get('removegroups'): 56 self._del_groups(req)62 data.update(self._del_groups(req)) 57 63 elif req.args.get('removepaths'): 58 self._del_paths(req)64 data.update(self._del_paths(req)) 59 65 elif req.args.get('addpathmember'): 60 self._add_path_member(req)66 data.update(self._add_path_member(req)) 61 67 elif req.args.get('changepathmembers'): 62 self._change_path_members(req)68 data.update(self._change_path_members(req)) 63 69 64 70 # Handle group and path edit mode handling 65 71 editgroup = None 66 72 editpath = None 67 73 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) 69 76 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 71 80 72 81 paths_disp = [] 73 82 for repository, path in [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()]: … … 85 94 'url' : path_disp_url, 86 95 'href': path_disp_href 87 96 }) 88 req.hdf['paths'] = sorted(paths_disp)97 data['paths'] = sorted(paths_disp) 89 98 90 99 groups_disp = [] 91 100 for group_disp in sorted([g.get_name() for g in self.authz.get_groups()]): … … 100 109 'url': group_disp_url, 101 110 'href': group_disp_href 102 111 }) 103 req.hdf['groups'] = groups_disp112 data['groups'] = groups_disp 104 113 105 114 self._persist_model(self.authz) 106 115 107 return 'admin_authz. cs', None116 return 'admin_authz.html',data 108 117 109 # ITemplateProvider110 111 def get_htdocs_dirs(self):112 """Return the absolute path of a directory containing additional113 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 provided119 ClearSilver templates.120 """121 from pkg_resources import resource_filename122 return [resource_filename(__name__, 'templates')]123 124 118 def _add_group(self, req): 125 119 groupname = req.args.get('groupname') 126 120 try: 127 121 self.authz.add_group(Group(groupname, [])) 122 return {} 128 123 except Exception, e: 129 re q.hdf['addgroup.error'] = e124 return {'addgroup_error' : e} 130 125 131 126 def _del_groups(self, req): 132 127 groups_to_del = req.args.get('selgroup') … … 137 132 for group in groups_to_del: 138 133 self.authz.del_group(url2pathname(group)) 139 134 else: 140 re q.hdf['delgroup.error'] = "Invalid type of group selection"135 return {'delgroup_error' : "Invalid type of group selection"} 141 136 except Exception, e: 142 req.hdf['delgroup.error'] = e 137 return {'delgroup_error' : e } 138 return {} 143 139 144 140 def _del_paths(self, req): 145 141 paths_to_del = req.args.get('selpath') … … 152 148 if validpath: 153 149 self.authz.del_path(validpath[1], self.authz_module) 154 150 except Exception, e: 155 re q.hdf['delpath.error'] = e151 return {'delpath_error' : e } 156 152 157 153 return {} 158 154 def _add_path(self, req): 159 155 path = req.args.get('path') 160 156 repository = None 161 157 try: 162 158 self.authz.add_path(Path(path, [], self.authz_module)) 159 return {} 163 160 except Exception, e: 164 re q.hdf['addpath.error'] = e161 return {'addpath_error' : e} 165 162 166 163 def _add_group_member(self, req): 167 164 editgroup = url2pathname(req.args.get('editgroup')) 168 165 subject = req.args.get('subject') 169 166 group = self.authz.find_group(editgroup) 170 167 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 } 173 169 try: 174 170 member = self._get_member(subject) 175 171 assert (member != None) 176 172 group.append(member) 177 173 except Exception, e: 178 req.hdf['addgroupmember.error'] = e 174 return {'addgroupmember_error':e} 175 return {} 179 176 180 177 def _add_path_member(self, req): 181 178 editpath = url2pathname(req.args.get('editpath')) … … 184 181 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 185 182 validpath = self._get_valid_path(paths, editpath) 186 183 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} 189 185 path = validpath[1] 190 186 path_members = self.authz.find_path(path, self.authz_module) 191 187 … … 208 204 assert (s != None) 209 205 path_members.append(PathAcl(s, read, write)) 210 206 except Exception, e: 211 req.hdf['addpathmember.error'] = e 207 return {'addpathmember_error' : e } 208 return {} 212 209 213 210 214 211 def _del_group_member(self, req): … … 216 213 members_to_del = req.args.get('selgroupmember') 217 214 group = self.authz.find_group(editgroup) 218 215 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 } 221 217 try: 222 218 if isinstance(members_to_del, types.StringTypes): 223 219 group.remove(self._get_member(members_to_del)) … … 225 221 for member in members_to_del: 226 222 group.remove(self._get_member(member)) 227 223 else: 228 re q.hdf['delgroupmember.error'] = "Wrong type of selection"224 return {'delgroupmember_error': "Wrong type of selection" } 229 225 except Exception, e: 230 req.hdf['delgroupmember.error'] = e 226 return {'delgroupmember_error': e} 227 228 return {} 231 229 232 230 def _change_path_members(self, req): 233 231 editpath = url2pathname(req.args.get('editpath')) 234 232 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 235 233 validpath = self._get_valid_path(paths, editpath) 236 234 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 } 239 236 path = validpath[1] 240 237 members_to_del = req.args.get('selpathmember') 241 238 member_acls = req.args.get('selpathmember_acl') … … 243 240 244 241 if len(path_members) == 0: 245 242 # Nothing to do 246 return 243 return {} 247 244 248 245 try: 249 246 if members_to_del != None: 250 247 if isinstance(members_to_del, types.StringTypes): 251 248 members_to_del = [members_to_del] 252 249 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"} 255 251 for member in members_to_del: 256 252 path_members.remove(path_members.find_path_member(self._get_member(member))) 257 253 except Exception, e: 258 req.hdf['changepathmember.error'] = e 259 return 254 return {'changepathmember_error': e} 260 255 261 256 if member_acls == None: 262 257 member_acls = "" … … 277 272 member.set_read(read) 278 273 member.set_write(write) 279 274 except Exception, e: 280 req.hdf['changepathmember.error'] = e 275 return {'changepathmember_error':e} 276 return {} 281 277 282 278 def _edit_group(self, req, cat, page, path_info): 283 279 """ 284 280 Populates the editgroup.* parts of the hdf 285 281 @return the value of editgroup.url or None 286 282 """ 283 data = {} 287 284 editgroup = url2pathname(path_info[path_info.index('/')+1:len(path_info)]) 288 285 group = self.authz.find_group(editgroup) 286 print group 289 287 if group != None: 290 req.hdf['editgroup.name'] = editgroup291 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] 293 291 294 292 # Populate member candidates 295 293 not_in_list = [m.__str__() for m in group] 296 294 not_in_list.append("@%s" % editgroup) 297 295 candidates = self._get_candidate_subjects(not_in_list) 298 296 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 302 316 303 317 def _get_candidate_subjects(self, not_in_list = []): 304 318 candidates = [] 305 users = [user for user in self. account_manager.get_users()319 users = [user for user in self._get_all_users() 306 320 if user not in not_in_list] 307 321 candidates += sorted(users) 308 322 candidates += sorted([group.__str__() for group in self.authz.get_groups() 309 323 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) 313 327 return candidates 314 328 315 329 def _edit_path(self, req, cat, page, path_info): … … 317 331 Populates the editpath.* parts of the hdf 318 332 @return the value of editgroup.url or None 319 333 """ 334 data = {} 320 335 editpath = url2pathname(path_info[path_info.index('/')+1:len(path_info)]) 321 336 paths = [(p.get_repo(), p.get_path()) for p in self.authz.get_paths()] 322 337 validpath = self._get_valid_path(paths, editpath) 323 338 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) 326 341 pathmembers = self.authz.find_path(validpath[1], validpath[0]) 327 342 editpath_members = [] 328 343 for member in pathmembers: … … 335 350 editpath_members.append({'subject' : member.get_member().__str__(), 336 351 'read' : read, 337 352 'write' : write}) 338 req.hdf['editpath.members'] = editpath_members353 data['editpath_members'] = editpath_members 339 354 340 355 # Populate member candidates 341 356 not_in_list = [m.get_member().__str__() for m in pathmembers] 342 357 candidates = self._get_candidate_subjects(not_in_list) 343 358 if candidates != []: 344 req.hdf['editpath.candidates'] = candidates345 return req.hdf['editpath.url']346 return None 359 data['editpath_candidates'] = candidates 360 return data['editpath_url'], data 361 return None, {} 347 362 348 363 def _get_valid_path(self, pathlist, path): 349 364 for repository, pathname in pathlist: -
0.10/svnauthz/model.py
old new 131 131 132 132 def serialize(self): 133 133 ret=""+ self.member.__str__() + " = " 134 134 135 if (self.r): 135 136 ret +="r" 136 137 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"> </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"> </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"> </th><th>Subversion Paths</th></tr>145 </thead><tbody><?cs146 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><?cs175 /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"> </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"> </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"> </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>
