Changeset 2895

Show
Ignore:
Timestamp:
12/13/07 19:13:12 (1 year ago)
Author:
peca
Message:

Added wiki syntax for Categories and Releases, now it's possible to display only one category or release in main donwloader view.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tracdownloaderplugin/0.10/tracdownloader/model.py

    r2894 r2895  
    122122    return years, months 
    123123 
    124 def render_downloads_table(env, req): 
     124def render_downloads_table(env, req, filter=None, f_id=None): 
    125125    """Prepares data for table of downloads.""" 
    126126     
     
    131131    categories = [] 
    132132    for category in categories_list: 
     133        releases_obj, releases_list = category.get_releases() 
     134        releases = [] 
     135         
     136        # Skip unwanted records 
     137        if filter == 'category' and f_id != category.id: 
     138            continue 
     139        elif filter == 'release': 
     140            display = False 
     141            for r in releases_list: 
     142                if r.id == f_id: 
     143                    display = True 
     144            if not display: 
     145                continue 
    133146        category_dict = {'id': category.id, 
    134147                         'name': category.name, 
     
    139152        category_dict['timestamp'] = util.format_datetime(category_dict['timestamp']) 
    140153         
    141         releases_obj, releases_list = category.get_releases() 
    142         releases = [] 
    143154        for release in releases_list: 
     155            # Skip unwanted records 
     156            if filter == 'release' and f_id != release.id: 
     157                continue 
    144158            release_dict = {'id': release.id, 
    145159                            'name': release.name, 
     
    279293        self.sort = None 
    280294        self.timestamp = time.time() 
     295        self.deleted = None 
    281296        self.is_new = True 
    282297         
    283298    def _fetch_cat(self, id): 
    284299        cursor = self.db.cursor() 
    285         cursor.execute("SELECT id, name, notes, sort, timestamp
    286             "FROM downloader_category " 
    287             "WHERE id = %s", (id,)) 
     300        cursor.execute("SELECT id, name, notes, sort, timestamp, deleted
     301                       "FROM downloader_category " 
     302                       "WHERE id = %s", (id,)) 
    288303        record = cursor.fetchone() 
     304        if not record: 
     305            raise TracError('Category with id ' + str(id) + ' not found.') 
    289306        self.id = record[0] 
    290307        self.name = record[1] 
     
    292309        self.sort = record[3] 
    293310        self.timestamp = record[4] 
     311        self.deleted = record[5] 
    294312        self.is_new = False 
    295313     
     
    394412        self.sort = None 
    395413        self.timestamp = time.time() 
     414        self.deleted = None 
    396415        self.is_new = True 
    397416         
    398417    def _fetch_rel(self, id): 
    399418        cursor = self.db.cursor() 
    400         cursor.execute("SELECT id, category, name, notes, sort, timestamp " 
     419        cursor.execute("SELECT id, category, name, notes, sort, timestamp, "  
     420            "deleted " 
    401421            "FROM downloader_release " 
    402422            "WHERE id = %s", (id,)) 
    403423        record = cursor.fetchone() 
     424        if not record: 
     425            raise TracError('Release with id ' + str(id) + ' not found.') 
    404426        self.id = record[0] 
    405427        self.category = record[1] 
     
    408430        self.sort = record[4] 
    409431        self.timestamp = record[5] 
     432        self.deleted = record[6] 
    410433        self.is_new = False 
    411434     
     
    531554        self.timestamp = time.time() 
    532555        self.architecture = None 
     556        self.deleted = None 
    533557        self.is_new = True 
    534558         
  • tracdownloaderplugin/0.10/tracdownloader/templates/downloads_list.cs

    r2875 r2895  
    1 <table class="listing<?cs if:(!in_adm&&!download_link && !subcount(quest))?> wide<?cs /if ?>"> 
     1<?cs if:href.filter ?><a href="<?cs var:href.base ?>">show all downloads</a><?cs /if  
     2?><table class="listing<?cs if:(!in_adm&&!download_link && !subcount(quest))?> wide<?cs /if ?>"> 
    23  <thead> 
    34    <tr> 
     
    1819    <tr class="<?cs var:row_class ?> category"> 
    1920      <td colspan="5"> 
    20         <?cs if in_adm ?><a href="<?cs var:href.base ?>/category/<?cs var:category.id ?>"><?cs /if  
    21             ?><?cs var:category.name ?><?cs if in_adm ?></a><?cs /if ?> 
     21        <a href="<?cs var:href.base ?>/category/<?cs var:category.id ?>"><?cs  
     22          var:category.name ?><?cs if in_adm ?></a><?cs /if ?> 
    2223        <?cs if !in_adm ?> 
    23             <a href="<?cs var:href.base ?>/notes/category/<?cs var:category.id ?>"> 
     24            <a href="<?cs var:href.base+href.filter ?>/notes/category/<?cs var:category.id ?>"> 
    2425                <img alt="Category notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    2526            </a> 
     
    3738        <td>&nbsp;</td> 
    3839        <td colspan="4"> 
    39           <?cs if in_adm ?><a href="<?cs var:href.base ?>/release/<?cs var:release.id ?>"><?cs /if ?
     40          <a href="<?cs var:href.base ?>/release/<?cs var:release.id ?>"
    4041            <?cs var:release.name ?> 
    4142          <?cs if in_adm ?></a><?cs /if ?> 
    4243          <?cs if !in_adm ?> 
    43             <a href="<?cs var:href.base ?>/notes/release/<?cs var:release.id ?>"> 
     44            <a href="<?cs var:href.base+href.filter ?>/notes/release/<?cs var:release.id ?>"> 
    4445                <img alt="Release notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    4546            </a> 
     
    5859          <td colspan="2">&nbsp;</td> 
    5960          <td> 
    60             <a href="<?cs var:href.base ?>/file/<?cs var:file.id ?>"> 
     61            <a href="<?cs var:href.base+href.filter ?>/file/<?cs var:file.id ?>"> 
    6162              <?cs var:file.name_disp ?><?cs if:!file.name_disp ?>--<?cs /if ?> 
    6263            </a> 
    6364            <?cs if !in_adm ?> 
    64                 <a href="<?cs var:href.base ?>/notes/file/<?cs var:file.id ?>"> 
     65                <a href="<?cs var:href.base+href.filter ?>/notes/file/<?cs var:file.id ?>"> 
    6566                    <img alt="File notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    6667                </a> 
  • tracdownloaderplugin/0.10/tracdownloader/web_ui.py

    r2894 r2895  
    5858        match = re.match( \ 
    5959            '/downloader(?:/([^/]+))?(?:/([^/]+))?' + \ 
    60             '(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', \ 
     60            '(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', \ 
    6161            req.path_info) 
    6262        if match: 
     
    7171            req.args['arg_5'] = match.group(5) 
    7272            self.arg_5 = match.group(5) 
     73            req.args['arg_6'] = match.group(6) 
     74            self.arg_6 = match.group(6) 
    7375            return True 
    74  
     76    ''' 
    7577    def _get_pages(self, req): 
    7678        """Return a list of available admin pages.""" 
     
    7880        pages.sort() 
    7981        return pages 
     82    ''' 
    8083 
    8184    def process_request(self, req): 
     
    445448        #self.env.log.info("Files: " + req.session.get('downloader_files')) 
    446449         
     450        filter = None 
     451        f_id = None 
    447452        if req.args.get('arg_2'): 
    448453            arg_1 = req.args.get('arg_1') 
     
    450455            arg_3 = req.args.get('arg_3') 
    451456            arg_4 = req.args.get('arg_4') 
     457            arg_5 = req.args.get('arg_5') 
     458            arg_6 = req.args.get('arg_6') 
    452459            if arg_2 == 'notes' and arg_3 and arg_4 != '': 
    453460                self._render_note(req, arg_3, arg_4) 
    454             elif arg_2 == 'file' and arg_2 != '': 
    455                 if self._serve_file(req, arg_3, arg_4): 
     461            elif arg_2 == 'file' and arg_3 != '': 
     462                href_base = self.env.href.downloader(arg_1, 
     463                                                     arg_2) 
     464                if self._serve_file(req, arg_3, arg_4, href_base): 
    456465                    return None 
     466            elif arg_2 == 'release' or arg_2 == 'category' and arg_3 != '': 
     467                try: 
     468                    f_id = int(arg_3) 
     469                    filter = arg_2 
     470                except ValueError: 
     471                    pass 
     472                req.hdf['href.filter'] = '/' + arg_2 + '/' + arg_3 
     473                if arg_4 == 'file' and arg_5 != '': 
     474                    href_base = self.env.href.downloader(arg_1, 
     475                                                         arg_2, 
     476                                                         arg_3, 
     477                                                         arg_4) 
     478                     
     479                    if self._serve_file(req, arg_5, arg_6, href_base): 
     480                        return None 
     481                elif arg_4 == 'notes' and arg_5 and arg_6 != '': 
     482                    self._render_note(req, arg_5, arg_6) 
    457483        else: 
    458484            # Test if session works 
    459485            req.session['downloader_test'] = 'test' 
    460486         
    461         render_downloads_table(self.env, req
     487        render_downloads_table(self.env, req, filter=filter, f_id=f_id
    462488         
    463489        return 'downloader.cs', None 
    464490     
    465     def _serve_file(self, req, id, file_name): 
     491    def _serve_file(self, req, id, file_name, href_base): 
    466492        """ 
    467493        Workarounds and decisions about what to do when file is clicked. 
     
    476502        # Redirect to address with filename at the end 
    477503        if file_name == '' or file_name == None: 
    478             req.redirect(self.env.href.downloader(self.arg_1,  
    479                                                   'file',  
    480                                                   id,  
    481                                                   file.name)) 
     504            req.redirect(href_base + '/' + str(id) + '/' + file.name) 
    482505            return False 
    483506         
     
    599622        # Config defaults must be set 
    600623        config_defaults(self, self.env) 
     624         
     625        if ns == 'downloader': 
     626            what = 'file' 
     627            try: 
     628                obj = File(self.env, int(target)) 
     629            except TracError, ValueError: 
     630                obj = None 
     631        elif ns == 'downloaderrel': 
     632            what = 'release' 
     633            try: 
     634                obj = Release(self.env, int(target)) 
     635            except TracError, ValueError: 
     636                obj = None 
     637        elif ns == 'downloadercat': 
     638            try: 
     639                obj = Category(self.env, int(target)) 
     640            except TracError, ValueError: 
     641                obj = None 
     642            what = 'category' 
     643             
    601644        try: 
    602645            # Try to use fancier code for Trac 10 
    603646            from trac.util.html import html 
    604             return self._format_wiki_link_10(formatter, ns, target, label) 
     647            return self._format_wiki_link_10(formatter, ns, target, label, obj, 
     648                                             what) 
    605649        except ImportError: 
    606             return self._format_wiki_link_09(formatter, ns, target, label) 
    607      
    608     def _format_wiki_link_10(self, formatter, ns, target, label): 
     650            return self._format_wiki_link_09(formatter, ns, target, label, obj, 
     651                                             what) 
     652     
     653    def _format_wiki_link_10(self, formatter, ns, target, label, obj, what): 
    609654        from trac.util.html import html 
    610         try: 
    611             file = File(self.env, int(target)) 
    612         except TracError, ValueError: 
     655         
     656        if not obj: 
    613657            return html.A(label, rel='nofollow', href='#',  
    614                           title = 'File with this id not found.') 
    615              
    616         fname = file.name 
     658                          title = '%s with this id not found.' %\ 
     659                          capitalize(what)) 
     660             
     661        name = obj.name 
    617662        if label == ns + ':' + target: 
    618             label = fname 
    619              
    620         if file.deleted: 
     663            label = name 
     664             
     665        if obj.deleted: 
    621666            return html.A(label, rel='nofollow', href='#',  
    622                           title='Sorry, file was deleted.'
    623          
    624         href = formatter.href.downloader('download', 'file', target, fname) 
     667                          title='Sorry, %s was deleted.' % what
     668         
     669        href = formatter.href.downloader('download', what, target, name) 
    625670        return html.A(label, href=href) 
    626671     
    627     def _format_wiki_link_09(self, formatter, ns, target, label): 
    628         try: 
    629             file = File(self.env, int(target)) 
    630         except TracError, ValueError: 
     672    def _format_wiki_link_09(self, formatter, ns, target, label, obj, what): 
     673        if not obj: 
    631674            return ('<a href="%s" rel="%s" title="%s">%s</a>' % \ 
    632675                   ('#', 'nofollow',  \ 
    633                     'File with this id not found.', label)) 
    634              
    635         fname = file.name 
     676                    '%s with this id not found.' % capitalize(what), label)) 
     677             
     678        name = obj.name 
    636679        if label == ns + ':' + target: 
    637             label = fname 
    638              
    639         if file.deleted: 
     680            label = name 
     681             
     682        if obj.deleted: 
    640683            return ('<a href="%s" rel="%s" title="%s">%s</a>' % \ 
    641684                   ('#', 'nofollow',  \ 
    642                    'Sorry, file was deleted.', label)) 
    643          
    644         href = formatter.href.downloader('download', 'file', target, fname) 
     685                   'Sorry, %s was deleted.' % what, label)) 
     686         
     687        href = formatter.href.downloader('download', what, target, name) 
    645688        return ('<a href="%s">%s</a>' % (href, label)) 
    646689     
     
    668711 
    669712    def get_link_resolvers(self): 
    670         yield ('downloader', self._format_wiki_link) 
     713        return [('downloader', self._format_wiki_link), 
     714                ('downloaderrel', self._format_wiki_link), 
     715                ('downloadercat', self._format_wiki_link)] 
    671716                 
    672717 
  • tracdownloaderplugin/0.9/tracdownloader/admin.py

    r2894 r2895  
    673673        listed in self.get_attrs 
    674674        """ 
    675          
    676675        if not hasattr(self, 'get_attrs') and not get_attrs: 
    677676            return '' 
  • tracdownloaderplugin/0.9/tracdownloader/model.py

    r2894 r2895  
    122122    return years, months 
    123123 
    124 def render_downloads_table(env, req): 
     124def render_downloads_table(env, req, filter=None, f_id=None): 
    125125    """Prepares data for table of downloads.""" 
    126126     
     
    131131    categories = [] 
    132132    for category in categories_list: 
     133        releases_obj, releases_list = category.get_releases() 
     134        releases = [] 
     135         
     136        # Skip unwanted records 
     137        if filter == 'category' and f_id != category.id: 
     138            continue 
     139        elif filter == 'release': 
     140            display = False 
     141            for r in releases_list: 
     142                if r.id == f_id: 
     143                    display = True 
     144            if not display: 
     145                continue 
    133146        category_dict = {'id': category.id, 
    134147                         'name': category.name, 
     
    139152        category_dict['timestamp'] = util.format_datetime(category_dict['timestamp']) 
    140153         
    141         releases_obj, releases_list = category.get_releases() 
    142         releases = [] 
    143154        for release in releases_list: 
     155            # Skip unwanted records 
     156            if filter == 'release' and f_id != release.id: 
     157                continue 
    144158            release_dict = {'id': release.id, 
    145159                            'name': release.name, 
     
    279293        self.sort = None 
    280294        self.timestamp = time.time() 
     295        self.deleted = None 
    281296        self.is_new = True 
    282297         
    283298    def _fetch_cat(self, id): 
    284299        cursor = self.db.cursor() 
    285         cursor.execute("SELECT id, name, notes, sort, timestamp
    286             "FROM downloader_category " 
    287             "WHERE id = %s", (id,)) 
     300        cursor.execute("SELECT id, name, notes, sort, timestamp, deleted
     301                       "FROM downloader_category " 
     302                       "WHERE id = %s", (id,)) 
    288303        record = cursor.fetchone() 
     304        if not record: 
     305            raise TracError('Category with id ' + str(id) + ' not found.') 
    289306        self.id = record[0] 
    290307        self.name = record[1] 
     
    292309        self.sort = record[3] 
    293310        self.timestamp = record[4] 
     311        self.deleted = record[5] 
    294312        self.is_new = False 
    295313     
     
    394412        self.sort = None 
    395413        self.timestamp = time.time() 
     414        self.deleted = None 
    396415        self.is_new = True 
    397416         
    398417    def _fetch_rel(self, id): 
    399418        cursor = self.db.cursor() 
    400         cursor.execute("SELECT id, category, name, notes, sort, timestamp " 
     419        cursor.execute("SELECT id, category, name, notes, sort, timestamp, "  
     420            "deleted " 
    401421            "FROM downloader_release " 
    402422            "WHERE id = %s", (id,)) 
    403423        record = cursor.fetchone() 
     424        if not record: 
     425            raise TracError('Release with id ' + str(id) + ' not found.') 
    404426        self.id = record[0] 
    405427        self.category = record[1] 
     
    408430        self.sort = record[4] 
    409431        self.timestamp = record[5] 
     432        self.deleted = record[6] 
    410433        self.is_new = False 
    411434     
     
    531554        self.timestamp = time.time() 
    532555        self.architecture = None 
     556        self.deleted = None 
    533557        self.is_new = True 
    534558         
  • tracdownloaderplugin/0.9/tracdownloader/templates/downloads_list.cs

    r2866 r2895  
    1 <table class="listing<?cs if:(!in_adm&&!download_link && !subcount(quest))?> wide<?cs /if ?>"> 
     1<?cs if:href.filter ?><a href="<?cs var:href.base ?>">show all downloads</a><?cs /if  
     2?><table class="listing<?cs if:(!in_adm&&!download_link && !subcount(quest))?> wide<?cs /if ?>"> 
    23  <thead> 
    34    <tr> 
     
    1819    <tr class="<?cs var:row_class ?> category"> 
    1920      <td colspan="5"> 
    20         <?cs if in_adm ?><a href="<?cs var:href.base ?>/category/<?cs var:category.id ?>"><?cs /if  
    21             ?><?cs var:category.name ?><?cs if in_adm ?></a><?cs /if ?> 
     21        <a href="<?cs var:href.base ?>/category/<?cs var:category.id ?>"><?cs  
     22          var:category.name ?><?cs if in_adm ?></a><?cs /if ?> 
    2223        <?cs if !in_adm ?> 
    23             <a href="<?cs var:href.base ?>/notes/category/<?cs var:category.id ?>"> 
     24            <a href="<?cs var:href.base+href.filter ?>/notes/category/<?cs var:category.id ?>"> 
    2425                <img alt="Category notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    2526            </a> 
     
    3738        <td>&nbsp;</td> 
    3839        <td colspan="4"> 
    39           <?cs if in_adm ?><a href="<?cs var:href.base ?>/release/<?cs var:release.id ?>"><?cs /if ?
     40          <a href="<?cs var:href.base ?>/release/<?cs var:release.id ?>"
    4041            <?cs var:release.name ?> 
    4142          <?cs if in_adm ?></a><?cs /if ?> 
    4243          <?cs if !in_adm ?> 
    43             <a href="<?cs var:href.base ?>/notes/release/<?cs var:release.id ?>"> 
     44            <a href="<?cs var:href.base+href.filter ?>/notes/release/<?cs var:release.id ?>"> 
    4445                <img alt="Release notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    4546            </a> 
     
    5859          <td colspan="2">&nbsp;</td> 
    5960          <td> 
    60             <a href="<?cs var:href.base ?>/file/<?cs var:file.id ?>"> 
     61            <a href="<?cs var:href.base+href.filter ?>/file/<?cs var:file.id ?>"> 
    6162              <?cs var:file.name_disp ?><?cs if:!file.name_disp ?>--<?cs /if ?> 
    6263            </a> 
    6364            <?cs if !in_adm ?> 
    64                 <a href="<?cs var:href.base ?>/notes/file/<?cs var:file.id ?>"> 
     65                <a href="<?cs var:href.base+href.filter ?>/notes/file/<?cs var:file.id ?>"> 
    6566                    <img alt="File notes" src="<?cs var:chrome.href ?>/downloader/img/notes.png" /> 
    6667                </a> 
  • tracdownloaderplugin/0.9/tracdownloader/web_ui.py

    r2894 r2895  
    5858        match = re.match( \ 
    5959            '/downloader(?:/([^/]+))?(?:/([^/]+))?' + \ 
    60             '(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', \ 
     60            '(?:/([^/]+))?(?:/([^/]+))?(?:/([^/]+))?(?:/(.*)$)?', \ 
    6161            req.path_info) 
    6262        if match: 
     
    7171            req.args['arg_5'] = match.group(5) 
    7272            self.arg_5 = match.group(5) 
     73            req.args['arg_6'] = match.group(6) 
     74            self.arg_6 = match.group(6) 
    7375            return True 
    74  
     76    ''' 
    7577    def _get_pages(self, req): 
    7678        """Return a list of available admin pages.""" 
     
    7880        pages.sort() 
    7981        return pages 
     82    ''' 
    8083 
    8184    def process_request(self, req): 
     
    445448        #self.env.log.info("Files: " + req.session.get('downloader_files')) 
    446449         
     450        filter = None 
     451        f_id = None 
    447452        if req.args.get('arg_2'): 
    448453            arg_1 = req.args.get('arg_1') 
     
    450455            arg_3 = req.args.get('arg_3') 
    451456            arg_4 = req.args.get('arg_4') 
     457            arg_5 = req.args.get('arg_5') 
     458            arg_6 = req.args.get('arg_6') 
    452459            if arg_2 == 'notes' and arg_3 and arg_4 != '': 
    453460                self._render_note(req, arg_3, arg_4) 
    454             elif arg_2 == 'file' and arg_2 != '': 
    455                 if self._serve_file(req, arg_3, arg_4): 
     461            elif arg_2 == 'file' and arg_3 != '': 
     462                href_base = self.env.href.downloader(arg_1, 
     463                                                     arg_2) 
     464                if self._serve_file(req, arg_3, arg_4, href_base): 
    456465                    return None 
     466            elif arg_2 == 'release' or arg_2 == 'category' and arg_3 != '': 
     467                try: 
     468                    f_id = int(arg_3) 
     469                    filter = arg_2 
     470                except ValueError: 
     471                    pass 
     472                req.hdf['href.filter'] = '/' + arg_2 + '/' + arg_3 
     473                if arg_4 == 'file' and arg_5 != '': 
     474                    href_base = self.env.href.downloader(arg_1, 
     475                                                         arg_2, 
     476                                                         arg_3, 
     477                                                         arg_4) 
     478                     
     479                    if self._serve_file(req, arg_5, arg_6, href_base): 
     480                        return None 
     481                elif arg_4 == 'notes' and arg_5 and arg_6 != '': 
     482                    self._render_note(req, arg_5, arg_6) 
    457483        else: 
    458484            # Test if session works 
    459485            req.session['downloader_test'] = 'test' 
    460486         
    461         render_downloads_table(self.env, req
     487        render_downloads_table(self.env, req, filter=filter, f_id=f_id
    462488         
    463489        return 'downloader.cs', None 
    464490     
    465     def _serve_file(self, req, id, file_name): 
     491    def _serve_file(self, req, id, file_name, href_base): 
    466492        """ 
    467493        Workarounds and decisions about what to do when file is clicked. 
     
    476502        # Redirect to address with filename at the end 
    477503        if file_name == '' or file_name == None: 
    478             req.redirect(self.env.href.downloader(self.arg_1,  
    479                                                   'file',  
    480                                                   id,  
    481                                                   file.name)) 
     504            req.redirect(href_base + '/' + str(id) + '/' + file.name) 
    482505            return False 
    483506         
     
    599622        # Config defaults must be set 
    600623        config_defaults(self, self.env) 
     624         
     625        if ns == 'downloader': 
     626            what = 'file' 
     627            try: 
     628                obj = File(self.env, int(target)) 
     629            except TracError, ValueError: 
     630                obj = None 
     631        elif ns == 'downloaderrel': 
     632            what = 'release' 
     633            try: 
     634                obj = Release(self.env, int(target)) 
     635            except TracError, ValueError: 
     636                obj = None 
     637        elif ns == 'downloadercat': 
     638            try: 
     639                obj = Category(self.env, int(target)) 
     640            except TracError, ValueError: 
     641                obj = None 
     642            what = 'category' 
     643             
    601644        try: 
    602645            # Try to use fancier code for Trac 10 
    603646            from trac.util.html import html 
    604             return self._format_wiki_link_10(formatter, ns, target, label) 
     647            return self._format_wiki_link_10(formatter, ns, target, label, obj, 
     648                                             what) 
    605649        except ImportError: 
    606             return self._format_wiki_link_09(formatter, ns, target, label) 
    607      
    608     def _format_wiki_link_10(self, formatter, ns, target, label): 
    609         try: 
    610             file = File(self.env, int(target)) 
    611         except TracError, ValueError: 
     650            return self._format_wiki_link_09(formatter, ns, target, label, obj, 
     651                                             what) 
     652     
     653    def _format_wiki_link_10(self, formatter, ns, target, label, obj, what): 
     654        from trac.util.html import html 
     655         
     656        if not obj: 
    612657            return html.A(label, rel='nofollow', href='#',  
    613                           title = 'File with this id not found.') 
    614              
    615         fname = file.name 
     658                          title = '%s with this id not found.' %\ 
     659                          capitalize(what)) 
     660             
     661        name = obj.name 
    616662        if label == ns + ':' + target: 
    617             label = fname 
    618              
    619         if file.deleted: 
     663            label = name 
     664             
     665        if obj.deleted: 
    620666            return html.A(label, rel='nofollow', href='#',  
    621                           title='Sorry, file was deleted.'
    622          
    623         href = formatter.href.downloader('download', 'file', target, fname) 
     667                          title='Sorry, %s was deleted.' % what
     668         
     669        href = formatter.href.downloader('download', what, target, name) 
    624670        return html.A(label, href=href) 
    625671     
    626     def _format_wiki_link_09(self, formatter, ns, target, label): 
    627         try: 
    628             file = File(self.env, int(target)) 
    629         except TracError, ValueError: 
     672    def _format_wiki_link_09(self, formatter, ns, target, label, obj, what): 
     673        if not obj: 
    630674            return ('<a href="%s" rel="%s" title="%s">%s</a>' % \ 
    631675                   ('#', 'nofollow',  \ 
    632                     'File with this id not found.', label)) 
    633              
    634         fname = file.name 
     676                    '%s with this id not found.' % capitalize(what), label)) 
     677             
     678        name = obj.name 
    635679        if label == ns + ':' + target: 
    636             label = fname 
    637              
    638         if file.deleted: 
     680            label = name 
     681             
     682        if obj.deleted: 
    639683            return ('<a href="%s" rel="%s" title="%s">%s</a>' % \ 
    640684                   ('#', 'nofollow',  \ 
    641                    'Sorry, file was deleted.', label)) 
    642          
    643         href = formatter.href.downloader('download', 'file', target, fname) 
     685                   'Sorry, %s was deleted.' % what, label)) 
     686         
     687        href = formatter.href.downloader('download', what, target, name) 
    644688        return ('<a href="%s">%s</a>' % (href, label)) 
    645689     
     
    667711 
    668712    def get_link_resolvers(self): 
    669         yield ('downloader', self._format_wiki_link) 
     713        return [('downloader', self._format_wiki_link), 
     714                ('downloaderrel', self._format_wiki_link), 
     715                ('downloadercat', self._format_wiki_link)] 
    670716                 
    671717