def install(plugins_to_install, import_defaults=True, force=False): """ :param plugins_to_install: A list of plugins to install. If the string "all" is passed then install all plugins listed in the bauble.pluginmgr.plugins dict that aren't already listed in the plugin registry. :param import_defaults: Flag passed to the plugin's install() method to indicate whether it should import its default data. :type import_defaults: bool :param force: Force, don't ask questions. :type force: book """ logger.debug('pluginmgr.install(%s)' % str(plugins_to_install)) if plugins_to_install is 'all': to_install = plugins.values() else: to_install = plugins_to_install if len(to_install) == 0: # no plugins to install return # sort the plugins by their dependency depends, unmet = _create_dependency_pairs(to_install) if unmet != {}: logger.debug(unmet) raise BaubleError('unmet dependencies') to_install = utils.topological_sort(to_install, depends) if not to_install: raise BaubleError( _('The plugins contain a dependency loop. This ' 'can happend if two plugins directly or ' 'indirectly rely on each other')) try: for p in to_install: logger.debug('install: %s' % p) p.install(import_defaults=import_defaults) # issue #28: here we make sure we don't add the plugin to the # registry twice but we should really update the version number # in the future when we accept versioned plugins (if ever) if not PluginRegistry.exists(p): PluginRegistry.add(p) except Exception, e: logger.warning('bauble.pluginmgr.install(): %s' % utils.utf8(e)) raise
def run(self, filenames, metadata, force=False): ''' A generator method for importing filenames into the database. This method periodically yields control so that the GUI can update. :param filenames: :param metadata: :param force: default=False ''' transaction = None connection = None self.__error_exc = BaubleError(_('Unknown Error.')) try: # user a contextual connect in case whoever called this # method called it inside a transaction then we can pick # up the parent connection and the transaction connection = metadata.bind.connect() transaction = connection.begin() except Exception, e: msg = _('Error connecting to database.\n\n%s') % \ utils.xml_safe(e) utils.message_dialog(msg, gtk.MESSAGE_ERROR) return
def get_plant_query(obj, session): """ """ # as of sqlalchemy 0.5.0 we have to have the order_by(None) here # so that if we want to union() the statements together later it # will work properly q = session.query(Plant).order_by(None) if isinstance(obj, Family): return q.join('accession', 'species', 'genus', 'family').\ filter_by(id=obj.id) elif isinstance(obj, Genus): return q.join('accession', 'species', 'genus').filter_by(id=obj.id) elif isinstance(obj, Species): return q.join('accession', 'species').filter_by(id=obj.id) elif isinstance(obj, VernacularName): return q.join('accession', 'species', 'vernacular_names').\ filter_by(id=obj.id) elif isinstance(obj, Plant): return q.filter_by(id=obj.id) elif isinstance(obj, Accession): return q.join('accession').filter_by(id=obj.id) elif isinstance(obj, Location): return q.filter_by(location_id=obj.id) elif isinstance(obj, Tag): plants = get_plants_pertinent_to(obj.objects, session) return q.filter(Plant.id.in_([p.id for p in plants])) else: raise BaubleError(_("Can't get plants from a %s") % type(obj).__name__)
{'plugins': utils.utf8(', '.join(sorted(not_registered)))} utils.message_dialog(utils.xml_safe(msg), type=gtk.MESSAGE_WARNING) except Exception, e: logger.warning('unhandled exception %s' % e) raise if not registered: # no plugins to initialize return deps, unmet = _create_dependency_pairs(registered) ordered = utils.topological_sort(registered, deps) if not ordered: raise BaubleError(_('The plugins contain a dependency loop. This ' 'can happen if two plugins directly or ' 'indirectly rely on each other')) # call init() for each ofthe plugins for plugin in ordered: logger.debug('about to invoke init on: %s' % plugin) try: plugin.init() logger.debug('plugin %s initialized' % plugin) except KeyError, e: # keep the plugin in the registry so if we find it again we do # not offer the user the option to reinstall it, something which # could overwrite data ordered.remove(plugin) msg = (_("The %(plugin_name)s plugin is listed in the registry " "but isn't wasn't found in the plugin directory")
def init(cls): cls.initialized = True raise BaubleError("can't init")
def install(cls, *args, **kwargs): cls.installed = True raise BaubleError("can't install")
from bauble.error import BaubleError from bauble.prefs import prefs import bauble.pluginmgr as pluginmgr ## for sake of testing, just use sqlite3. uri = 'sqlite:///:memory:' def init_bauble(uri, create=False): try: db.open(uri, verify=False) except Exception, e: print >> sys.stderr, e #debug e if not bauble.db.engine: raise BaubleError('not connected to a database') prefs.init() pluginmgr.load() db.create(create) pluginmgr.init(force=True) def update_gui(): """ Flush any GTK Events. Used for doing GUI testing. """ import gtk while gtk.events_pending(): gtk.main_iteration(block=False)