Skip to content

Commit 1a7e9b6

Browse files
committed
Added support for ad-hoc trac instances, with arbitrary names and filesystem paths, but still bound to a particular group's roles for management of trac admin rights.
- Legacy-Id: 14232
1 parent 8c8b5c2 commit 1a7e9b6

1 file changed

Lines changed: 79 additions & 12 deletions

File tree

ietf/utils/management/commands/create_group_wikis.py

Lines changed: 79 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def create_svn(self, svn):
8888

8989
# --- trac ---
9090

91-
def remove_demo_components(self, group, env):
91+
def remove_demo_components(self, env):
9292
for component in Component.select(env):
9393
if component.name.startswith('component'):
9494
component.delete()
@@ -98,10 +98,10 @@ def remove_demo_milestones(self, group, env):
9898
if milestone.name.startswith('milestone'):
9999
milestone.delete()
100100

101-
def symlink_to_master_assets(self, group, env):
101+
def symlink_to_master_assets(self, path, env):
102102
master_dir = settings.TRAC_MASTER_DIR
103103
master_htdocs = os.path.join(master_dir, "htdocs")
104-
group_htdocs = os.path.join(group.trac_dir, "htdocs")
104+
group_htdocs = os.path.join(path, "htdocs")
105105
self.note(" Symlinking %s to %s" % (master_htdocs, group_htdocs))
106106
os.removedirs(group_htdocs)
107107
os.symlink(master_htdocs, group_htdocs)
@@ -149,7 +149,48 @@ def sync_default_repository(self, group, env):
149149
else:
150150
self.log("Trac environment '%s' does not have any repository" % env)
151151

152-
def create_trac(self, group):
152+
def create_adhoc_trac(self, name, path):
153+
if not os.path.exists(os.path.dirname(path)):
154+
msg = "Intended to create '%s', but parent directory is missing" % path
155+
self.log(msg)
156+
return None, msg
157+
options = copy.deepcopy(settings.TRAC_ENV_OPTIONS)
158+
# Interpolate group field names to values in the option settings:
159+
160+
remove = []
161+
for i in range(len(options)):
162+
sect, key, val = options[i]
163+
if key in ['repository_type', 'repository_dir', ]:
164+
remove = [i] + remove
165+
else:
166+
val = val.format(name=name)
167+
options[i] = sect, key, val
168+
for i in remove:
169+
del options[i]
170+
171+
# Try to creat ethe environment, remove unwanted defaults, and add
172+
# custom pages and settings.
173+
if self.dummy_run:
174+
self.note("Would create Trac for '%s' at %s" % (name, path))
175+
return None, "Dummy run, no trac created"
176+
else:
177+
try:
178+
self.note("Creating Trac for '%s' at %s" % (name, path))
179+
env = Environment(path, create=True, options=options)
180+
self.remove_demo_components(env)
181+
self.remove_demo_milestones(group, env)
182+
# Use custom assets (if any) from the master setup
183+
self.symlink_to_master_assets(path, env)
184+
self.add_custom_wiki_pages(group, env)
185+
self.add_default_wiki_pages(group, env)
186+
# Permissions will be handled during permission update later.
187+
return env, ""
188+
except TracError as e:
189+
msg = "While creating Trac instance for %s: %s" % (name, e)
190+
self.log(msg)
191+
return None, msg
192+
193+
def create_group_trac(self, group):
153194
if not os.path.exists(os.path.dirname(group.trac_dir)):
154195
msg = "Intended to create '%s', but parent directory is missing" % group.trac_dir
155196
self.log(msg)
@@ -169,12 +210,12 @@ def create_trac(self, group):
169210
try:
170211
self.note("Creating Trac for group '%s' at %s" % (group.acronym, group.trac_dir))
171212
env = Environment(group.trac_dir, create=True, options=options)
172-
self.remove_demo_components(group, env)
213+
self.remove_demo_components(env)
173214
self.remove_demo_milestones(group, env)
174215
self.maybe_add_group_url(group, 'Wiki', settings.TRAC_WIKI_URL_PATTERN % group.acronym)
175216
self.maybe_add_group_url(group, 'Issue tracker', settings.TRAC_ISSUE_URL_PATTERN % group.acronym)
176217
# Use custom assets (if any) from the master setup
177-
self.symlink_to_master_assets(group, env)
218+
self.symlink_to_master_assets(group.trac_dir, env)
178219
if group.type_id in ['wg', 'rg', 'ag', ]:
179220
self.add_wg_draft_states(group, env)
180221
self.add_custom_wiki_pages(group, env)
@@ -189,11 +230,11 @@ def create_trac(self, group):
189230
self.log(msg)
190231
return None, msg
191232

192-
def update_trac_permissions(self, group, env):
233+
def update_trac_permissions(self, name, group, env):
193234
if self.dummy_run:
194-
self.note("Would update Trac permissions for group '%s'" % group.acronym)
235+
self.note("Would update Trac permissions for '%s'" % name)
195236
else:
196-
self.note("Updating Trac permissions for group '%s'" % group.acronym)
237+
self.note("Updating Trac permissions for '%s'" % name)
197238
mgr = PermissionSystem(env)
198239
permission_list = mgr.get_all_permissions()
199240
permission_list = [ (u,a) for (u,a) in permission_list if not u in ['anonymous', 'authenticated']]
@@ -210,8 +251,11 @@ def update_trac_permissions(self, group, env):
210251
users.append(user)
211252
if not user in permissions:
212253
try:
213-
mgr.grant_permission(user, 'TRAC_ADMIN')
214254
self.note(" Granting admin permission for %s" % user)
255+
mgr.grant_permission(user, 'TRAC_ADMIN')
256+
if not user in permissions:
257+
permissions[user] = []
258+
permissions[user].append('TRAC_ADMIN')
215259
except TracError as e:
216260
self.log("While adding admin permission for %s: %s" (user, e))
217261
for user in permissions:
@@ -314,7 +358,7 @@ def handle(self, *filenames, **options):
314358
self.errors.append(err)
315359

316360
if not os.path.exists(group.trac_dir):
317-
trac_env, msg = self.create_trac(group)
361+
trac_env, msg = self.create_group_trac(group)
318362
if not trac_env:
319363
self.errors.append(msg)
320364
else:
@@ -323,13 +367,36 @@ def handle(self, *filenames, **options):
323367
if not trac_env and not self.dummy_run:
324368
continue
325369

326-
self.update_trac_permissions(group, trac_env)
370+
self.update_trac_permissions(group.acronym, group, trac_env)
327371
self.update_trac_components(group, trac_env)
328372

329373
except Exception as e:
330374
self.errors.append(e)
331375
self.log("While processing %s: %s" % (group.acronym, e))
332376
raise
333377

378+
for acronym, name, path in settings.TRAC_CREATE_ADHOC_WIKIS:
379+
try:
380+
self.note("Processing wiki '%s'" % name)
381+
382+
if not os.path.exists(path):
383+
trac_env, msg = self.create_adhoc_trac(name, path)
384+
if not trac_env:
385+
self.errors.append(msg)
386+
else:
387+
trac_env = Environment(path)
388+
389+
if not trac_env and not self.dummy_run:
390+
continue
391+
392+
group = Group.objects.get(acronym=acronym)
393+
self.update_trac_permissions(name, group, trac_env)
394+
395+
except Exception as e:
396+
self.errors.append(e)
397+
self.log("While processing %s: %s" % (name, e))
398+
raise
399+
400+
334401
if self.errors:
335402
raise CommandError("There were %s failures in WG Trac creation:\n %s" % (len(self.errors), "\n ".join(self.errors)))

0 commit comments

Comments
 (0)