Changeset 3649

Show
Ignore:
Timestamp:
05/10/08 03:56:36 (6 months ago)
Author:
coderanger
Message:

Much upgraded dispatch system.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tracforgeplugin/0.11/tracforge/admin/dispatch.py

    r3408 r3649  
    1818from trac.web.href import Href 
    1919from trac.mimeview.api import Mimeview 
     20from genshi.builder import tag 
    2021 
    21 from genshi.builder import tag 
     22from tracforge.admin.model import Project 
    2223 
    2324class TracForgeIndexModule(Component): 
     
    3233        data = {} 
    3334        req.perm.require('PROJECT_LIST') 
    34      
    35         parent_dir = os.path.dirname(self.env.path) 
    36         #env_paths = dict([(filename, os.path.join(parent_dir, filename)) 
    37         #                  for filename in os.listdir(parent_dir)]) 
     35         
    3836        projects = [] 
    3937                           
    40         for env_name in os.listdir(parent_dir): 
    41             env_path = os.path.join(parent_dir, env_name) 
     38        for project_name in Project.select(self.env): 
     39            project = Project(self.env, project_name) 
    4240             
    4341            # Don't list this environment 
    44             if env_path == self.env.path: 
     42            if project.env_path == self.env.path: 
    4543                continue 
    4644             
    47             # Only bother looking at folders 
    48             if not os.path.isdir(env_path): 
    49                 continue 
    50              
    51             try: 
    52                 env = open_environment(env_path, use_cache=True) 
     45            if project.valid: 
     46                env = project.env 
    5347 
    5448                try: 
     
    6054                            'name': env.project_name, 
    6155                            'description': env.project_description, 
    62                             'href': req.href.projects(env_name), 
     56                            'href': req.href.projects(project.name), 
    6357                        }) 
    6458                except Exception, e: 
    6559                    # Only show errors to admins to prevent excessive disclosure 
    66                     if 'TRACFORFGE_ADMIN' in req.perm
     60                    if 'TRACFORGE_ADMIN' in req.perm('tracforge_project', project.name)
    6761                        projects.append({ 
    6862                            'name': env.project_name, 
    6963                            'description': e 
    7064                        }) 
    71             except Exception, e: 
    72                 if 'TRACFORGE_ADMIN' in req.perm: 
     65                    self.log.debug('tracforge.dispatch: Unable to load project %s:\n%s', project.name, e) 
     66            else: 
     67                if 'TRACFORGE_ADMIN' in req.perm('tracforge_project', project.name): 
    7368                    projects.append({ 
    74                         'name': env_path, 
    75                         'description': e
     69                        'name': project.env_path, 
     70                        'description': project.env.exc
    7671                    }) 
     72                self.log.debug('tracforge.dispatch: Unable to load project %s:\n%s', project.name, project.env.exc) 
    7773         
    7874        data['projects'] = projects 
     
    9591    # IRequestHandler methods 
    9692    def match_request(self, req): 
    97         if req.path_info.startswith('/projects'): 
    98             path_info = req.path_info[10:] 
     93        if req.path_info.startswith('/projects/'): 
     94            path_info = req.path_info[10:].lstrip('/') 
    9995            if path_info: 
    10096                self.log.debug('TracForgeDispatch: Starting WSGI relaunch for %s (%s)', path_info, req.method) 
    101                 project = path_info.split('/', 1)[0] 
     97                self.log.debug('SN = %s PI = %s', req.environ['SCRIPT_NAME'], req.environ['PATH_INFO']) 
     98                project_name = path_info.split('/', 1)[0] 
    10299                # Check that we aren't trying to recurse (possible link loop) 
    103                 if project == os.path.basename(self.env.path): 
     100                if project_name == os.path.basename(self.env.path): 
    104101                    req.redirect(req.href()) 
     102                project = Project(self.env, project_name) 
    105103                     
    106104                # Assert permissions on the desination environment 
    107                 try
    108                     project_env = open_environment(os.path.join(os.path.dirname(self.env.path), project), use_cache=True) 
    109                 except IOError
    110                     raise TracError('No such project "%s"'%project
     105                if not project.exists
     106                    raise TracError('No such project "%s"', project.name) 
     107                if not project.valid
     108                    raise TracError('Project %s is invalid:\n%s', project.name, project.env.exc
    111109                 
    112110                # Check that we have permissions in the desired project 
    113111                authname = RequestDispatcher(self.env).authenticate(req) 
    114                 project_perm = PermissionCache(project_env, authname) 
     112                project_perm = PermissionCache(project.env, authname) 
    115113                project_perm.require('PROJECT_LIST') 
    116114                 
     
    119117                 
    120118                # Setup the environment variables 
    121                 environ['SCRIPT_NAME'] = req.href.projects('/'
    122                 environ['PATH_INFO'] = path_info 
    123                 environ['trac.env_parent_dir'] = os.path.dirname(self.env.path) 
     119                environ['SCRIPT_NAME'] = req.href.projects(project.name
     120                environ['PATH_INFO'] = path_info[len(project.name):] 
     121                environ['trac.env_path'] = project.env_path 
    124122                if 'TRAC_ENV' in environ: 
    125123                    del environ['TRAC_ENV'] 
    126                 if 'trac.env_path' in environ: 
    127                     del environ['trac.env_path'] 
     124                if 'TRAC_ENV_PARENT_DIR' in environ: 
     125                    del environ['TRAC_ENV_PARENT_DIR'] 
     126                if 'trac.env_parent' in environ: 
     127                    del environ['trac.env_parent_dir'] 
    128128                environ['tracforge_master_link'] = req.href.projects() 
    129129 
  • tracforgeplugin/0.11/tracforge/admin/perm.py

    r3639 r3649  
    5050        The permissions are returned as a list of (subject, action) 
    5151        formatted tuples.""" 
     52        perms = [] 
    5253        req = self._extract_req() 
    5354        if req is None or not req.path_info == '/admin/tracforge/perm': 
     
    5556            cursor = db.cursor() 
    5657            cursor.execute("SELECT username,action FROM permission") 
    57             for username, action in cursor: 
    58                 yield username, action 
     58            perms.extend(cursor) 
    5959         
    6060        if req is None or not req.path_info == '/admin/general/perm': 
     
    6262            cursor = master_db.cursor() 
    6363            cursor.execute("SELECT username,action FROM tracforge_permission") 
    64             for username, action in cursor: 
    65                 yield username, action 
     64            perms.extend(cursor) 
     65        return perms 
    6666     
    6767    def _extract_req(self): 
  • tracforgeplugin/0.11/tracforge/templates/admin_tracforge_projects.html

    r3401 r3649  
    4444      <table class="listing" id="projectlist"> 
    4545        <thead> 
    46           <tr><th class="sel">&nbsp;</th><th>Short Name</th><th>Full Name</th><th>Env Path</th></tr> 
     46          <tr><th class="sel">&nbsp;</th><th>Short Name</th><th>Full Name</th></tr> 
    4747        </thead> 
    4848        <tbody> 
    49           <tr py:for="proj in projects"> 
     49          <tr py:for="proj in sorted(projects, key=lambda p: p.name)"> 
    5050            <td>&nbsp;</td> 
    5151            <td>$proj.name</td>