root/adminconsoleproviderpatch/0.9/admin-provider.diff

Revision 68, 4.8 kB (checked in by athomas, 3 years ago)

AdminConsoleProviderPatch:

  • Moved !IAdminConsoleProvider to trac/scripts/admin.py
  • trac/scripts/admin.py

    old new  
    3939from trac.Milestone import Milestone 
    4040from trac.perm import PermissionSystem 
    4141from trac.ticket.model import * 
     42from trac.core import ComponentManager, ExtensionPoint, Interface 
     43from trac.loader import load_components 
    4244 
     45__all__ = [ 'IAdminConsoleProvider' ] 
     46 
    4347try: 
    4448    sum 
    4549except NameError: 
     
    5054            tot += item 
    5155        return tot 
    5256 
     57class IAdminConsoleProvider(Interface): 
     58    """ 
     59    Extension point interface for components to provide an administrative 
     60    interface from within trac-admin. 
     61    """ 
    5362 
     63    def get_console_commands(tracadm): 
     64        """ 
     65        Return an iterable of (name, help, callable, completer) tuples. 
     66 
     67        tracadm is a TracAdmin instance. 
     68 
     69        completer can be null. help is in the same format that trac-admin 
     70        uses. 
     71        """ 
     72 
     73class AdminCommands(trac.core.Component): 
     74    """ 
     75    Component end-point for IAdminConsoleProvider extensions 
     76    """ 
     77    admin_providers = ExtensionPoint(IAdminConsoleProvider) 
     78 
     79    def import_providers(self, env, tracadm): 
     80        load_components(env) 
     81        for provider in self.admin_providers: 
     82            for command in provider.get_console_commands(tracadm): 
     83                name, help, callback, completer = command 
     84                if hasattr(tracadm.__class__, 'do_' + name): 
     85                    raise Exception("Can't use IAdminConsoleProvider %s, console command '%s' already exists" % (provider.__class__.__name__, name)) 
     86                setattr(tracadm.__class__, 'do_' + name, callback) 
     87                setattr(tracadm.__class__, '_help_' + name, help) 
     88                if completer: 
     89                    setattr(tracadm.__class__, 'complete_' + name, completer) 
     90 
    5491class TracAdmin(cmd.Cmd): 
    5592    intro = '' 
    5693    license = trac.__license_long__ 
     
    64101    _date_format = '%Y-%m-%d' 
    65102    _datetime_format = '%Y-%m-%d %H:%M:%S' 
    66103    _date_format_hint = 'YYYY-MM-DD' 
     104    _admin_commands = None 
    67105 
    68106    def __init__(self, envdir=None): 
    69107        cmd.Cmd.__init__(self) 
     
    72110            self.env_set(os.path.abspath(envdir)) 
    73111 
    74112    def docmd(self, cmd='help'): 
     113        self.env_check() 
    75114        self.onecmd(cmd) 
    76115 
    77116    def emptyline(self): 
     
    84123              '%(copy)s\n\n'                                    \ 
    85124              "Type:  '?' or 'help' for help on commands.\n" %  \ 
    86125              {'ver':trac.__version__,'copy':__copyright__} 
     126        self.env_check() 
    87127        self.cmdloop() 
    88128 
    89129    ## 
     
    99139    def env_check(self): 
    100140        try: 
    101141            self.__env = Environment(self.envname) 
     142            try: 
     143                self._admin_commands = AdminCommands(self.__env) 
     144                self._admin_commands.import_providers(self.__env, self) 
     145            except Exception, e: 
     146                print "Failed to initialise extension points.", e 
     147                raise 
    102148        except: 
    103149            return 0 
    104150        return 1 
     
    117163        try: 
    118164            if not self.__env: 
    119165                self.__env = Environment(self.envname) 
     166                self._admin_commands = AdminCommands(self.__env) 
     167                self._admin_commands.import_providers(self.__env, self) 
    120168            return self.__env 
    121169        except Exception, e: 
    122170            print 'Failed to open environment.', e 
     
    209257                               xrange(0, (1 + len(sep)) * cnum + sum(colw))]) 
    210258        print 
    211259 
     260 
     261 
    212262    def print_doc(self, doc, decor=False): 
    213263        if not doc: return 
    214264        self.print_listing(['Command', 'Description'], doc, '  --', decor)  
     
    299349            except AttributeError: 
    300350                print "No documentation found for '%s'" % arg[0] 
    301351        else: 
    302             docs = (self._help_about + self._help_help + 
    303                     self._help_initenv + self._help_hotcopy + 
    304                     self._help_resync + self._help_upgrade + 
    305                     self._help_wiki + 
    306 #                    self._help_config + self._help_wiki + 
    307                     self._help_permission + self._help_component + 
    308                     self._help_ticket_type + self._help_priority + 
    309                     self._help_severity +  self._help_version + 
    310                     self._help_milestone) 
     352            # Extract documentation from all _help_* members 
     353            docs = [] 
     354            doc_strings = [doc for doc in dir(self) if doc.startswith('_help_') and doc[6:] not in ('EOF', 'exit', 'quit')] 
     355            for doc in doc_strings: 
     356                docs.extend(getattr(self, doc)) 
     357            docs.sort(lambda a, b: cmp(a[0], b[0])) 
     358 
    311359            print 'trac-admin - The Trac Administration Console %s' % trac.__version__ 
    312360            if not self.interactive: 
    313361                print 
Note: See TracBrowser for help on using the browser.