@@ -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