def add_artifacts(ref_ids, update_solr=True, update_refs=True, solr_hosts=None): ''' Add the referenced artifacts to SOLR and shortlinks. :param solr_hosts: a list of solr hosts to use instead of the defaults :type solr_hosts: [str] ''' from allura import model as M from allura.lib.search import find_shortlinks, solarize if solr_hosts: solr = make_solr_from_config(solr_hosts) else: solr = g.solr exceptions = [] solr_updates = [] with _indexing_disabled(M.session.artifact_orm_session._get()): for ref in M.ArtifactReference.query.find(dict(_id={'$in': ref_ids})): try: artifact = ref.artifact s = solarize(artifact) if s is None: continue if update_solr: solr_updates.append(s) if update_refs: if isinstance(artifact, M.Snapshot): continue # Find shortlinks in the raw text, not the escaped html # created by the `solarize()`. ref.references = [ link.ref_id for link in find_shortlinks(artifact.index().get('text') or '')] except Exception: log.error('Error indexing artifact %s', ref._id) exceptions.append(sys.exc_info()) solr.add(solr_updates) if len(exceptions) == 1: raise exceptions[0][0], exceptions[0][1], exceptions[0][2] if exceptions: raise CompoundError(*exceptions)
def __init__(self): self.__dict__ = self.__shared_state if self.__shared_state: return self.allura_templates = pkg_resources.resource_filename( 'allura', 'templates') # Setup SOLR self.solr_server = aslist(config.get('solr.server'), ',') # skip empty strings in case of extra commas self.solr_server = [s for s in self.solr_server if s] self.solr_query_server = config.get('solr.query_server') if asbool(config.get('solr.mock')): self.solr = self.solr_short_timeout = MockSOLR() elif self.solr_server: self.solr = make_solr_from_config(self.solr_server, self.solr_query_server) self.solr_short_timeout = make_solr_from_config( self.solr_server, self.solr_query_server, timeout=int(config.get('solr.short_timeout', 10))) else: # pragma no cover self.solr = None self.solr_short_timeout = None self.use_queue = asbool(config.get('use_queue', False)) # Load login/logout urls; only used for SFX logins self.login_url = config.get('auth.login_url', '/auth/') self.logout_url = config.get('auth.logout_url', '/auth/logout') self.login_fragment_url = config.get('auth.login_fragment_url', '/auth/login_fragment') # Setup Gravatar self.gravatar = gravatar.url self.oid_store = M.OpenIdStore() # Setup pygments self.pygments_formatter = utils.LineAnchorCodeHtmlFormatter( cssclass='codehilite', linenos='table') # Setup Pypeline self.pypeline_markup = pypeline_markup # Setup analytics accounts = config.get('ga.account', 'UA-XXXXX-X') accounts = accounts.split(' ') self.analytics = analytics.GoogleAnalytics(accounts=accounts) self.icons = dict( admin=Icon('x', 'ico-admin'), pencil=Icon('p', 'ico-pencil'), help=Icon('h', 'ico-help'), search=Icon('s', 'ico-search'), history=Icon('N', 'ico-history'), feed=Icon('f', 'ico-feed'), mail=Icon('M', 'ico-mail'), reply=Icon('w', 'ico-reply'), tag=Icon('z', 'ico-tag'), flag=Icon('^', 'ico-flag'), undelete=Icon('+', 'ico-undelete'), delete=Icon('#', 'ico-delete'), close=Icon('D', 'ico-close'), table=Icon('n', 'ico-table'), stats=Icon('Y', 'ico-stats'), pin=Icon('@', 'ico-pin'), folder=Icon('o', 'ico-folder'), fork=Icon('R', 'ico-fork'), merge=Icon('J', 'ico-merge'), plus=Icon('+', 'ico-plus'), conversation=Icon('q', 'ico-conversation'), group=Icon('g', 'ico-group'), user=Icon('U', 'ico-user'), secure=Icon('(', 'ico-lock'), unsecure=Icon(')', 'ico-unlock'), star=Icon('S', 'ico-star'), watch=Icon('E', 'ico-watch'), expand=Icon('`', 'ico-expand'), restore=Icon('J', 'ico-restore'), # Permissions perm_read=Icon('E', 'ico-focus'), perm_update=Icon('0', 'ico-sync'), perm_create=Icon('e', 'ico-config'), perm_register=Icon('e', 'ico-config'), perm_delete=Icon('-', 'ico-minuscirc'), perm_tool=Icon('x', 'ico-config'), perm_admin=Icon('(', 'ico-lock'), perm_has_yes=Icon('3', 'ico-check'), perm_has_no=Icon('d', 'ico-noentry'), perm_has_inherit=Icon('2', 'ico-checkcircle'), ) # Cache some loaded entry points def _cache_eps(section_name, dict_cls=dict): d = dict_cls() for ep in h.iter_entry_points(section_name): value = ep.load() d[ep.name] = value return d class entry_point_loading_dict(dict): def __missing__(self, key): self[key] = _cache_eps(key) return self[key] self.entry_points = entry_point_loading_dict( tool=_cache_eps('allura', dict_cls=utils.CaseInsensitiveDict), auth=_cache_eps('allura.auth'), registration=_cache_eps('allura.project_registration'), theme=_cache_eps('allura.theme'), user_prefs=_cache_eps('allura.user_prefs'), spam=_cache_eps('allura.spam'), stats=_cache_eps('allura.stats'), site_stats=_cache_eps('allura.site_stats'), admin=_cache_eps('allura.admin'), ) # Zarkov logger self._zarkov = None # Set listeners to update stats statslisteners = [] for name, ep in self.entry_points['stats'].iteritems(): statslisteners.append(ep()) self.statsUpdater = PostEvent(statslisteners) self.tmpdir = os.getenv('TMPDIR', '/tmp')
def __init__(self): self.__dict__ = self.__shared_state if self.__shared_state: return self.allura_templates = pkg_resources.resource_filename("allura", "templates") # Setup SOLR self.solr_server = aslist(config.get("solr.server"), ",") # skip empty strings in case of extra commas self.solr_server = [s for s in self.solr_server if s] self.solr_query_server = config.get("solr.query_server") if self.solr_server: self.solr = make_solr_from_config(self.solr_server, self.solr_query_server) self.solr_short_timeout = make_solr_from_config( self.solr_server, self.solr_query_server, timeout=int(config.get("solr.short_timeout", 10)) ) else: # pragma no cover log.warning("Solr config not set; using in-memory MockSOLR") self.solr = self.solr_short_timeout = MockSOLR() self.use_queue = asbool(config.get("use_queue", False)) # Load login/logout urls; only used for customized logins self.login_url = config.get("auth.login_url", "/auth/") self.logout_url = config.get("auth.logout_url", "/auth/logout") self.login_fragment_url = config.get("auth.login_fragment_url", "/auth/login_fragment") # Setup Gravatar self.gravatar = gravatar.url # Setup pygments self.pygments_formatter = utils.LineAnchorCodeHtmlFormatter(cssclass="codehilite", linenos="table") # Setup Pypeline self.pypeline_markup = pypeline_markup # Setup analytics accounts = config.get("ga.account", "UA-XXXXX-X") accounts = accounts.split(" ") self.analytics = analytics.GoogleAnalytics(accounts=accounts) self.icons = dict( admin=Icon("x", "ico-admin"), pencil=Icon("p", "ico-pencil"), help=Icon("h", "ico-help"), search=Icon("s", "ico-search"), history=Icon("N", "ico-history"), feed=Icon("f", "ico-feed"), mail=Icon("M", "ico-mail"), reply=Icon("w", "ico-reply"), tag=Icon("z", "ico-tag"), flag=Icon("^", "ico-flag"), undelete=Icon("+", "ico-undelete"), delete=Icon("#", "ico-delete"), close=Icon("D", "ico-close"), table=Icon("n", "ico-table"), stats=Icon("Y", "ico-stats"), pin=Icon("@", "ico-pin"), folder=Icon("o", "ico-folder"), fork=Icon("R", "ico-fork"), merge=Icon("J", "ico-merge"), plus=Icon("+", "ico-plus"), conversation=Icon("q", "ico-conversation"), group=Icon("g", "ico-group"), user=Icon("U", "ico-user"), secure=Icon("(", "ico-lock"), unsecure=Icon(")", "ico-unlock"), star=Icon("S", "ico-star"), watch=Icon("E", "ico-watch"), expand=Icon("`", "ico-expand"), restore=Icon("J", "ico-restore"), # Permissions perm_read=Icon("E", "ico-focus"), perm_update=Icon("0", "ico-sync"), perm_create=Icon("e", "ico-config"), perm_register=Icon("e", "ico-config"), perm_delete=Icon("-", "ico-minuscirc"), perm_tool=Icon("x", "ico-config"), perm_admin=Icon("(", "ico-lock"), perm_has_yes=Icon("3", "ico-check"), perm_has_no=Icon("d", "ico-noentry"), perm_has_inherit=Icon("2", "ico-checkcircle"), ) # Cache some loaded entry points def _cache_eps(section_name, dict_cls=dict): d = dict_cls() for ep in h.iter_entry_points(section_name): value = ep.load() d[ep.name] = value return d class entry_point_loading_dict(dict): def __missing__(self, key): self[key] = _cache_eps(key) return self[key] self.entry_points = entry_point_loading_dict( tool=_cache_eps("allura", dict_cls=utils.CaseInsensitiveDict), auth=_cache_eps("allura.auth"), registration=_cache_eps("allura.project_registration"), theme=_cache_eps("allura.theme"), user_prefs=_cache_eps("allura.user_prefs"), spam=_cache_eps("allura.spam"), stats=_cache_eps("allura.stats"), site_stats=_cache_eps("allura.site_stats"), admin=_cache_eps("allura.admin"), site_admin=_cache_eps("allura.site_admin"), # macro eps are used solely for ensuring that external macros are # imported (after load, the ep itself is not used) macros=_cache_eps("allura.macros"), ) # Zarkov logger self._zarkov = None # Set listeners to update stats statslisteners = [] for name, ep in self.entry_points["stats"].iteritems(): statslisteners.append(ep()) self.statsUpdater = PostEvent(statslisteners) self.tmpdir = os.getenv("TMPDIR", "/tmp")
def __get_solr(solr_hosts=None): return make_solr_from_config(solr_hosts) if solr_hosts else g.solr
def __init__(self): self.__dict__ = self.__shared_state if self.__shared_state: return self.allura_templates = pkg_resources.resource_filename( 'allura', 'templates') # Setup SOLR self.solr_server = aslist(config.get('solr.server'), ',') # skip empty strings in case of extra commas self.solr_server = [s for s in self.solr_server if s] self.solr_query_server = config.get('solr.query_server') if self.solr_server: self.solr = make_solr_from_config( self.solr_server, self.solr_query_server) self.solr_short_timeout = make_solr_from_config( self.solr_server, self.solr_query_server, timeout=int(config.get('solr.short_timeout', 10))) else: # pragma no cover log.warning('Solr config not set; using in-memory MockSOLR') self.solr = self.solr_short_timeout = MockSOLR() # Load login/logout urls; only used for customized logins self.login_url = config.get('auth.login_url', '/auth/') self.logout_url = config.get('auth.logout_url', '/auth/logout') self.login_fragment_url = config.get( 'auth.login_fragment_url', '/auth/login_fragment/') # Setup Gravatar self.gravatar = gravatar.url # Setup pygments self.pygments_formatter = utils.LineAnchorCodeHtmlFormatter( cssclass='codehilite', linenos='table') # Setup Pypeline self.pypeline_markup = pypeline_markup # Setup analytics accounts = config.get('ga.account', 'UA-XXXXX-X') accounts = accounts.split(' ') self.analytics = analytics.GoogleAnalytics(accounts=accounts) self.icons = dict( move=Icon('fa fa-arrows', 'Move'), edit=Icon('fa fa-edit', 'Edit'), admin=Icon('fa fa-gear', 'Admin'), send=Icon('fa fa-send-o', 'Send'), add=Icon('fa fa-plus-circle', 'Add'), moderate=Icon('fa fa-hand-stop-o', 'Moderate'), pencil=Icon('fa fa-pencil', 'Edit'), help=Icon('fa fa-question-circle', 'Help'), eye=Icon('fa fa-eye', 'View'), search=Icon('fa fa-search', 'Search'), history=Icon('fa fa-calendar', 'History'), feed=Icon('fa fa-rss', 'Feed'), mail=Icon('fa fa-envelope-o', 'Subscribe'), reply=Icon('fa fa-reply', 'Reply'), tag=Icon('fa fa-tag', 'Tag'), flag=Icon('fa fa-flag-o', 'Flag'), undelete=Icon('fa fa-undo', 'Undelete'), delete=Icon('fa fa-trash-o', 'Delete'), close=Icon('fa fa-close', 'Close'), table=Icon('fa fa-table', 'Table'), stats=Icon('fa fa-line-chart', 'Stats'), pin=Icon('fa fa-mail-pin', 'Pin'), folder=Icon('fa fa-folder', 'Folder'), fork=Icon('fa fa-code-fork', 'Fork'), merge=Icon('fa fa-code-fork upside-down', 'Merge'), conversation=Icon('fa fa-comments', 'Conversation'), group=Icon('fa fa-group', 'Group'), user=Icon('fa fa-user', 'User'), secure=Icon('fa fa-lock', 'Lock'), unsecure=Icon('fa fa-unlock', 'Unlock'), star=Icon('fa fa-star', 'Star'), expand=Icon('fa fa-expand', 'Maximize'), restore=Icon('fa fa-compress', 'Restore'), check=Icon('fa fa-check-circle', 'Check'), caution=Icon('fa fa-ban', 'Caution'), vote_up=Icon('fa fa-plus', 'Vote Up'), vote_down=Icon('fa fa-minus', 'Vote Down'), download=Icon('fa fa-download', 'Download'), revert=Icon('fa fa-history', 'Revert'), browse_commits=Icon('fa fa-list', 'Browse Commits'), file=Icon('fa fa-file-o', 'File'), # Permissions perm_read=Icon('fa fa-eye', 'Read'), perm_update=Icon('fa fa-rotate-left', 'Update'), perm_create=Icon('fa fa-flash', 'Create'), perm_register=Icon('fa fa-gear', 'Config'), perm_delete=Icon('fa fa-minus-circle', 'Remove'), perm_tool=Icon('fa fa-gear', 'Tool'), perm_admin=Icon('fa fa-gear', 'Admin'), perm_has_yes=Icon('fa fa-check', 'Check'), perm_has_no=Icon('fa fa-ban', 'No entry'), perm_has_inherit=Icon('fa fa-check-circle', 'Has inherit'), ) # Cache some loaded entry points def _cache_eps(section_name, dict_cls=dict): d = dict_cls() for ep in h.iter_entry_points(section_name): value = ep.load() d[ep.name] = value return d class entry_point_loading_dict(dict): def __missing__(self, key): self[key] = _cache_eps(key) return self[key] self.entry_points = entry_point_loading_dict( tool=_cache_eps('allura', dict_cls=utils.CaseInsensitiveDict), auth=_cache_eps('allura.auth'), registration=_cache_eps('allura.project_registration'), theme=_cache_eps('allura.theme'), user_prefs=_cache_eps('allura.user_prefs'), spam=_cache_eps('allura.spam'), phone=_cache_eps('allura.phone'), stats=_cache_eps('allura.stats'), site_stats=_cache_eps('allura.site_stats'), admin=_cache_eps('allura.admin'), site_admin=_cache_eps('allura.site_admin'), # macro eps are used solely for ensuring that external macros are # imported (after load, the ep itself is not used) macros=_cache_eps('allura.macros'), webhooks=_cache_eps('allura.webhooks'), ) # Neighborhood cache duration = asint(config.get('neighborhood.cache.duration', 0)) self.neighborhood_cache = NeighborhoodCache(duration) # Set listeners to update stats statslisteners = [] for name, ep in self.entry_points['stats'].iteritems(): statslisteners.append(ep()) self.statsUpdater = PostEvent(statslisteners) self.tmpdir = os.getenv('TMPDIR', '/tmp')
def __init__(self): self.__dict__ = self.__shared_state if self.__shared_state: return self.allura_templates = pkg_resources.resource_filename( 'allura', 'templates') # Setup SOLR self.solr_server = aslist(config.get('solr.server'), ',') # skip empty strings in case of extra commas self.solr_server = [s for s in self.solr_server if s] self.solr_query_server = config.get('solr.query_server') if self.solr_server: self.solr = make_solr_from_config(self.solr_server, self.solr_query_server) self.solr_short_timeout = make_solr_from_config( self.solr_server, self.solr_query_server, timeout=int(config.get('solr.short_timeout', 10))) else: # pragma no cover log.warning('Solr config not set; using in-memory MockSOLR') self.solr = self.solr_short_timeout = MockSOLR() # Load login/logout urls; only used for customized logins self.login_url = config.get('auth.login_url', '/auth/') self.logout_url = config.get('auth.logout_url', '/auth/logout') self.login_fragment_url = config.get('auth.login_fragment_url', '/auth/login_fragment/') # Setup Gravatar self.gravatar = gravatar.url # Setup pygments self.pygments_formatter = utils.LineAnchorCodeHtmlFormatter( cssclass='codehilite', linenos='table') # Setup Pypeline self.pypeline_markup = pypeline_markup # Setup analytics accounts = config.get('ga.account', 'UA-XXXXX-X') accounts = accounts.split(' ') self.analytics = analytics.GoogleAnalytics(accounts=accounts) self.icons = dict( move=Icon('fa fa-arrows', 'Move'), edit=Icon('fa fa-edit', 'Edit'), admin=Icon('fa fa-gear', 'Admin'), send=Icon('fa fa-send-o', 'Send'), add=Icon('fa fa-plus-circle', 'Add'), moderate=Icon('fa fa-hand-stop-o', 'Moderate'), pencil=Icon('fa fa-pencil', 'Edit'), help=Icon('fa fa-question-circle', 'Help'), eye=Icon('fa fa-eye', 'View'), search=Icon('fa fa-search', 'Search'), history=Icon('fa fa-calendar', 'History'), feed=Icon('fa fa-rss', 'Feed'), mail=Icon('fa fa-envelope-o', 'Subscribe'), reply=Icon('fa fa-reply', 'Reply'), tag=Icon('fa fa-tag', 'Tag'), flag=Icon('fa fa-flag-o', 'Flag'), undelete=Icon('fa fa-undo', 'Undelete'), delete=Icon('fa fa-trash-o', 'Delete'), close=Icon('fa fa-close', 'Close'), table=Icon('fa fa-table', 'Table'), stats=Icon('fa fa-line-chart', 'Stats'), pin=Icon('fa fa-mail-pin', 'Pin'), folder=Icon('fa fa-folder', 'Folder'), fork=Icon('fa fa-code-fork', 'Fork'), merge=Icon('fa fa-code-fork upside-down', 'Merge'), conversation=Icon('fa fa-comments', 'Conversation'), group=Icon('fa fa-group', 'Group'), user=Icon('fa fa-user', 'User'), secure=Icon('fa fa-lock', 'Lock'), unsecure=Icon('fa fa-unlock', 'Unlock'), star=Icon('fa fa-star', 'Star'), expand=Icon('fa fa-expand', 'Maximize'), restore=Icon('fa fa-compress', 'Restore'), check=Icon('fa fa-check-circle', 'Check'), caution=Icon('fa fa-ban', 'Caution'), vote_up=Icon('fa fa-plus', 'Vote Up'), vote_down=Icon('fa fa-minus', 'Vote Down'), download=Icon('fa fa-download', 'Download'), revert=Icon('fa fa-history', 'Revert'), browse_commits=Icon('fa fa-list', 'Browse Commits'), file=Icon('fa fa-file-o', 'File'), # Permissions perm_read=Icon('fa fa-eye', 'Read'), perm_update=Icon('fa fa-rotate-left', 'Update'), perm_create=Icon('fa fa-flash', 'Create'), perm_register=Icon('fa fa-gear', 'Config'), perm_delete=Icon('fa fa-minus-circle', 'Remove'), perm_tool=Icon('fa fa-gear', 'Tool'), perm_admin=Icon('fa fa-gear', 'Admin'), perm_has_yes=Icon('fa fa-check', 'Check'), perm_has_no=Icon('fa fa-ban', 'No entry'), perm_has_inherit=Icon('fa fa-check-circle', 'Has inherit'), ) # Cache some loaded entry points def _cache_eps(section_name, dict_cls=dict): d = dict_cls() for ep in h.iter_entry_points(section_name): try: value = ep.load() except Exception: log.exception('Could not load entry point [%s] %s', section_name, ep) else: d[ep.name] = value return d class entry_point_loading_dict(dict): def __missing__(self, key): self[key] = _cache_eps(key) return self[key] self.entry_points = entry_point_loading_dict( tool=_cache_eps('allura', dict_cls=utils.CaseInsensitiveDict), auth=_cache_eps('allura.auth'), registration=_cache_eps('allura.project_registration'), theme=_cache_eps('allura.theme'), user_prefs=_cache_eps('allura.user_prefs'), spam=_cache_eps('allura.spam'), phone=_cache_eps('allura.phone'), stats=_cache_eps('allura.stats'), site_stats=_cache_eps('allura.site_stats'), admin=_cache_eps('allura.admin'), site_admin=_cache_eps('allura.site_admin'), # macro eps are used solely for ensuring that external macros are # imported (after load, the ep itself is not used) macros=_cache_eps('allura.macros'), webhooks=_cache_eps('allura.webhooks'), multifactor_totp=_cache_eps('allura.multifactor.totp'), multifactor_recovery_code=_cache_eps( 'allura.multifactor.recovery_code'), ) # Set listeners to update stats statslisteners = [] for name, ep in self.entry_points['stats'].iteritems(): statslisteners.append(ep()) self.statsUpdater = PostEvent(statslisteners) self.tmpdir = os.getenv('TMPDIR', '/tmp')
def __init__(self): self.__dict__ = self.__shared_state if self.__shared_state: return self.allura_templates = pkg_resources.resource_filename('allura', 'templates') # Setup SOLR self.solr_server = aslist(config.get('solr.server'), ',') # skip empty strings in case of extra commas self.solr_server = [s for s in self.solr_server if s] self.solr_query_server = config.get('solr.query_server') if asbool(config.get('solr.mock')): self.solr = self.solr_short_timeout = MockSOLR() elif self.solr_server: self.solr = make_solr_from_config(self.solr_server, self.solr_query_server) self.solr_short_timeout = make_solr_from_config( self.solr_server, self.solr_query_server, timeout=int(config.get('solr.short_timeout', 10))) else: # pragma no cover self.solr = None self.solr_short_timeout = None self.use_queue = asbool(config.get('use_queue', False)) # Load login/logout urls; only used for SFX logins self.login_url = config.get('auth.login_url', '/auth/') self.logout_url = config.get('auth.logout_url', '/auth/logout') # Setup Gravatar self.gravatar = gravatar.url self.oid_store = M.OpenIdStore() # Setup pygments self.pygments_formatter = utils.LineAnchorCodeHtmlFormatter( cssclass='codehilite', linenos='table') # Setup Pypeline self.pypeline_markup = pypeline_markup # Setup analytics accounts = config.get('ga.account', 'UA-XXXXX-X') accounts = accounts.split(' ') self.analytics = analytics.GoogleAnalytics(accounts=accounts) self.icons = dict( admin=Icon('x', 'ico-admin'), pencil=Icon('p', 'ico-pencil'), help=Icon('h', 'ico-help'), search=Icon('s', 'ico-search'), history=Icon('N', 'ico-history'), feed=Icon('f', 'ico-feed'), mail=Icon('M', 'ico-mail'), reply=Icon('w', 'ico-reply'), tag=Icon('z', 'ico-tag'), flag=Icon('^', 'ico-flag'), undelete=Icon('+', 'ico-undelete'), delete=Icon('#', 'ico-delete'), close=Icon('D', 'ico-close'), table=Icon('n', 'ico-table'), stats=Icon('Y', 'ico-stats'), pin=Icon('@', 'ico-pin'), folder=Icon('o', 'ico-folder'), fork=Icon('R', 'ico-fork'), merge=Icon('J', 'ico-merge'), plus=Icon('+', 'ico-plus'), conversation=Icon('q', 'ico-conversation'), group=Icon('g', 'ico-group'), user=Icon('U', 'ico-user'), secure=Icon('(', 'ico-lock'), unsecure=Icon(')', 'ico-unlock'), star=Icon('S', 'ico-star'), watch=Icon('E', 'ico-watch'), # Permissions perm_read=Icon('E', 'ico-focus'), perm_update=Icon('0', 'ico-sync'), perm_create=Icon('e', 'ico-config'), perm_register=Icon('e', 'ico-config'), perm_delete=Icon('-', 'ico-minuscirc'), perm_tool=Icon('x', 'ico-config'), perm_admin=Icon('(', 'ico-lock'), perm_has_yes=Icon('3', 'ico-check'), perm_has_no=Icon('d', 'ico-noentry'), perm_has_inherit=Icon('2', 'ico-checkcircle'), ) # Cache some loaded entry points def _cache_eps(section_name, dict_cls=dict): d = dict_cls() for ep in pkg_resources.iter_entry_points(section_name): value = ep.load() d[ep.name] = value return d class entry_point_loading_dict(dict): def __missing__(self, key): self[key] = _cache_eps(key) return self[key] self.entry_points = entry_point_loading_dict( tool=_cache_eps('allura', dict_cls=utils.CaseInsensitiveDict), auth=_cache_eps('allura.auth'), registration=_cache_eps('allura.project_registration'), theme=_cache_eps('allura.theme'), user_prefs=_cache_eps('allura.user_prefs'), spam=_cache_eps('allura.spam'), stats=_cache_eps('allura.stats'), site_stats=_cache_eps('allura.site_stats'), ) # Zarkov logger self._zarkov = None # Set listeners to update stats statslisteners = [] for name, ep in self.entry_points['stats'].iteritems(): statslisteners.append(ep()) self.statsUpdater = PostEvent(statslisteners) self.tmpdir = os.getenv('TMPDIR', '/tmp')