Enhanced GENERAL plugins for flexible API: added data and process to GENERAL plugindata, more details at http://www.gramps-project.org/wiki/index.php?title=Addons_development#General_Plugins
svn: r15701
This commit is contained in:
parent
abd7b09450
commit
0199cd7da5
@ -290,7 +290,7 @@ class CLIManager(object):
|
|||||||
"""
|
"""
|
||||||
self._pmgr.reg_plugins(const.PLUGINS_DIR, dbstate, uistate)
|
self._pmgr.reg_plugins(const.PLUGINS_DIR, dbstate, uistate)
|
||||||
self._pmgr.reg_plugins(const.USER_PLUGINS, dbstate, uistate,
|
self._pmgr.reg_plugins(const.USER_PLUGINS, dbstate, uistate,
|
||||||
append=False)
|
append=False, load_on_reg=True)
|
||||||
|
|
||||||
def startcli(errors, argparser):
|
def startcli(errors, argparser):
|
||||||
"""
|
"""
|
||||||
|
@ -96,7 +96,8 @@ class BasePluginManager(object):
|
|||||||
self.__registereddir_set = set()
|
self.__registereddir_set = set()
|
||||||
self.__loaded_plugins = {}
|
self.__loaded_plugins = {}
|
||||||
|
|
||||||
def reg_plugins(self, direct, dbstate=None, uistate=None, append=True):
|
def reg_plugins(self, direct, dbstate=None, uistate=None,
|
||||||
|
append=True, load_on_reg=False):
|
||||||
"""
|
"""
|
||||||
Searches the specified directory, and registers python plugin that
|
Searches the specified directory, and registers python plugin that
|
||||||
are being defined in gpr.py files.
|
are being defined in gpr.py files.
|
||||||
@ -125,11 +126,24 @@ class BasePluginManager(object):
|
|||||||
self.__registereddir_set.add(dirpath)
|
self.__registereddir_set.add(dirpath)
|
||||||
self.__pgr.scan_dir(dirpath)
|
self.__pgr.scan_dir(dirpath)
|
||||||
|
|
||||||
# load plugins that request to be loaded on startup
|
if load_on_reg:
|
||||||
|
# Run plugins that request to be loaded on startup and
|
||||||
|
# have a load_on_reg callable.
|
||||||
for plugin in self.__pgr.filter_load_on_reg():
|
for plugin in self.__pgr.filter_load_on_reg():
|
||||||
mod = self.load_plugin(plugin)
|
mod = self.load_plugin(plugin)
|
||||||
if hasattr(mod, "load_on_reg"):
|
if hasattr(mod, "load_on_reg"):
|
||||||
mod.load_on_reg(dbstate, uistate)
|
try:
|
||||||
|
results = mod.load_on_reg(dbstate, uistate, plugin)
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
print "Plugin '%s' did not run; continuing..." % plugin.name
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
iter(results)
|
||||||
|
plugin.data += results
|
||||||
|
except:
|
||||||
|
plugin.data = results
|
||||||
|
|
||||||
def is_loaded(self, pdata_id):
|
def is_loaded(self, pdata_id):
|
||||||
"""
|
"""
|
||||||
@ -354,6 +368,72 @@ class BasePluginManager(object):
|
|||||||
"""
|
"""
|
||||||
return self.__pgr.docgen_plugins()
|
return self.__pgr.docgen_plugins()
|
||||||
|
|
||||||
|
def get_reg_general(self, category=None):
|
||||||
|
""" Return list of registered general libs
|
||||||
|
"""
|
||||||
|
return self.__pgr.general_plugins(category)
|
||||||
|
|
||||||
|
def get_plugin_data(self, category):
|
||||||
|
"""
|
||||||
|
Gets all of the data from general plugins of type category.
|
||||||
|
plugin.data maybe a single item, an iterable, or a callable.
|
||||||
|
|
||||||
|
>>> PLUGMAN.get_plugin_data('CSS')
|
||||||
|
<a list of raw data items>
|
||||||
|
"""
|
||||||
|
retval = []
|
||||||
|
data = None
|
||||||
|
for plugin in self.__pgr.general_plugins(category):
|
||||||
|
if callable(plugin.data):
|
||||||
|
try:
|
||||||
|
data = plugin.data()
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
else:
|
||||||
|
data = plugin.data
|
||||||
|
try:
|
||||||
|
iter(data)
|
||||||
|
retval.extend(data)
|
||||||
|
except:
|
||||||
|
retval.append(data)
|
||||||
|
return retval
|
||||||
|
|
||||||
|
def process_plugin_data(self, category):
|
||||||
|
"""
|
||||||
|
Gathers all of the data from general plugins of type category,
|
||||||
|
and pass it to a single process function from one of those
|
||||||
|
plugins.
|
||||||
|
|
||||||
|
>>> PLUGMAN.process_plugin_data('CSS')
|
||||||
|
<a list of processed data items>
|
||||||
|
"""
|
||||||
|
retval = []
|
||||||
|
data = None
|
||||||
|
process = None
|
||||||
|
for plugin in self.__pgr.general_plugins(category):
|
||||||
|
if plugin.process is not None:
|
||||||
|
mod = self.load_plugin(plugin)
|
||||||
|
if hasattr(mod, plugin.process):
|
||||||
|
process = getattr(mod, plugin.process)
|
||||||
|
if callable(plugin.data):
|
||||||
|
try:
|
||||||
|
data = plugin.data()
|
||||||
|
except:
|
||||||
|
import traceback
|
||||||
|
traceback.print_exc()
|
||||||
|
else:
|
||||||
|
data = plugin.data
|
||||||
|
if data:
|
||||||
|
try:
|
||||||
|
iter(data)
|
||||||
|
retval.extend(data)
|
||||||
|
except:
|
||||||
|
retval.append(data)
|
||||||
|
if process:
|
||||||
|
return process(retval)
|
||||||
|
return retval
|
||||||
|
|
||||||
def get_import_plugins(self):
|
def get_import_plugins(self):
|
||||||
"""
|
"""
|
||||||
Get the list of import plugins.
|
Get the list of import plugins.
|
||||||
|
@ -398,6 +398,9 @@ class PluginData(object):
|
|||||||
self._menu_label = ''
|
self._menu_label = ''
|
||||||
#VIEW and SIDEBAR attr
|
#VIEW and SIDEBAR attr
|
||||||
self._order = END
|
self._order = END
|
||||||
|
#GENERAL attr
|
||||||
|
self._data = []
|
||||||
|
self._process = None
|
||||||
|
|
||||||
def _set_id(self, id):
|
def _set_id(self, id):
|
||||||
self._id = id
|
self._id = id
|
||||||
@ -878,6 +881,26 @@ class PluginData(object):
|
|||||||
|
|
||||||
order = property(_get_order, _set_order)
|
order = property(_get_order, _set_order)
|
||||||
|
|
||||||
|
#GENERAL attr
|
||||||
|
def _set_data(self, data):
|
||||||
|
if not self._ptype in (GENERAL,):
|
||||||
|
raise ValueError, 'data may only be set for GENERAL plugins'
|
||||||
|
self._data = data
|
||||||
|
|
||||||
|
def _get_data(self):
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
def _set_process(self, process):
|
||||||
|
if not self._ptype in (GENERAL,):
|
||||||
|
raise ValueError, 'process may only be set for GENERAL plugins'
|
||||||
|
self._process = process
|
||||||
|
|
||||||
|
def _get_process(self):
|
||||||
|
return self._process
|
||||||
|
|
||||||
|
data = property(_get_data, _set_data)
|
||||||
|
process = property(_get_process, _set_process)
|
||||||
|
|
||||||
def newplugin():
|
def newplugin():
|
||||||
"""
|
"""
|
||||||
Function to create a new plugindata object, add it to list of
|
Function to create a new plugindata object, add it to list of
|
||||||
@ -1043,6 +1066,8 @@ class PluginRegister(object):
|
|||||||
rmlist = []
|
rmlist = []
|
||||||
ind = lenpd-1
|
ind = lenpd-1
|
||||||
for plugin in self.__plugindata[lenpd:]:
|
for plugin in self.__plugindata[lenpd:]:
|
||||||
|
if plugin.category == 'TEST':
|
||||||
|
import pdb; pdb.set_trace()
|
||||||
ind += 1
|
ind += 1
|
||||||
plugin.directory = dir
|
plugin.directory = dir
|
||||||
if not valid_plugin_version(plugin.gramps_target_version):
|
if not valid_plugin_version(plugin.gramps_target_version):
|
||||||
@ -1150,10 +1175,14 @@ class PluginRegister(object):
|
|||||||
"""
|
"""
|
||||||
return self.type_plugins(DOCGEN)
|
return self.type_plugins(DOCGEN)
|
||||||
|
|
||||||
def general_plugins(self):
|
def general_plugins(self, category=None):
|
||||||
"""Return a list of PluginData that are of type GENERAL
|
"""Return a list of PluginData that are of type GENERAL
|
||||||
"""
|
"""
|
||||||
return self.type_plugins(GENERAL)
|
plugins = self.type_plugins(GENERAL)
|
||||||
|
if category:
|
||||||
|
return [plugin for plugin in plugins
|
||||||
|
if plugin.category == category]
|
||||||
|
return plugins
|
||||||
|
|
||||||
def mapservice_plugins(self):
|
def mapservice_plugins(self):
|
||||||
"""Return a list of PluginData that are of type MAPSERVICE
|
"""Return a list of PluginData that are of type MAPSERVICE
|
||||||
@ -1184,4 +1213,5 @@ class PluginRegister(object):
|
|||||||
"""Return a list of PluginData that have load_on_reg == True
|
"""Return a list of PluginData that have load_on_reg == True
|
||||||
"""
|
"""
|
||||||
return [self.get_plugin(id) for id in
|
return [self.get_plugin(id) for id in
|
||||||
set([x.id for x in self.__plugindata if x.load_on_reg == True])]
|
set([x.id for x in self.__plugindata
|
||||||
|
if x.load_on_reg == True])]
|
||||||
|
@ -312,3 +312,8 @@ class GuiPluginManager(gen.utils.Callback):
|
|||||||
"""
|
"""
|
||||||
return [plg for plg in self.basemgr.get_reg_docgens()
|
return [plg for plg in self.basemgr.get_reg_docgens()
|
||||||
if plg.id not in self.__hidden_plugins]
|
if plg.id not in self.__hidden_plugins]
|
||||||
|
|
||||||
|
def get_reg_general(self, category=None):
|
||||||
|
return [plg for plg in self.basemgr.get_reg_general(category)
|
||||||
|
if plg.id not in self.__hidden_plugins]
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user