cryptonas/src/cryptobox/plugins/base.py

163 lines
4.7 KiB
Python

# $Id$
#
# parent class for all plugins of the CryptoBox
#
import os
import cherrypy
class CryptoBoxPlugin:
## default capability is "system" - the other supported capability is: "volume"
pluginCapabilities = [ "system" ]
## where should the plugin be visible by default?
pluginVisibility = [ "preferences" ]
## does this plugin require admin authentification?
requestAuth = False
## default rank (0..100) of the plugin in listings (lower value means higher priority)
rank = 80
## default icon of this plugin (relative path)
defaultIconFileName = "plugin_icon.gif"
## fallback icon file (in the common plugin directory)
fallbackIconFileName = "plugin_icon_unknown.gif"
def __init__(self, cbox, pluginDir):
self.cbox = cbox
self.hdf = {}
self.pluginDir = pluginDir
self.hdf_prefix = "Data.Plugins.%s." % self.getName()
def doAction(self, **args):
"""override doAction with your plugin code"""
raise Exception, "undefined action handler ('doAction') in plugin '%'" % self.getName()
def getStatus(self):
"""you should override this, to supply useful state information"""
raise Exception, "undefined state handler ('getStatus') in plugin '%'" % self.getName()
def getName(self):
"""the name of the python file (module) should be the name of the plugin"""
return self.__module__
@cherrypy.expose
def getIcon(self, image=None, **kargs):
"""return the image data of the icon of the plugin
the parameter 'image' may be used for alternative image locations (relative
to the directory of the plugin)
'**kargs' is necessary, as a 'weblang' attribute may be specified (and ignored)"""
import cherrypy, re
if (image is None): # or (re.search(u'[\w-\.]', image)):
plugin_icon_file = os.path.join(self.pluginDir, self.defaultIconFileName)
else:
plugin_icon_file = os.path.join(self.pluginDir, image)
if not os.access(plugin_icon_file, os.R_OK):
plugin_icon_file = os.path.join(self.cbox.prefs["Locations"]["PluginDir"], self.fallbackIconFileName)
return cherrypy.lib.cptools.serveFile(plugin_icon_file)
def getTemplateFileName(self, template_name):
"""return the filename of the template, if it is part of this plugin
use this function to check, if the plugin provides the specified template
"""
result_file = os.path.join(self.pluginDir, template_name + ".cs")
if os.access(result_file, os.R_OK) and os.path.isfile(result_file):
return result_file
else:
return None
def getLanguageData(self):
import neo_cgi, neo_util
lang_hdf = neo_util.HDF()
langFile = os.path.join(self.pluginDir, 'language.hdf')
try:
lang_hdf.readFile(langFile)
except (neo_util.Error, neo_util.ParseError), errMsg:
self.cbox.log.error("failed to load language file (%s) of plugin (%s):" % (langFile,self.getName()))
return lang_hdf
def loadDataSet(self, hdf):
for (key, value) in self.hdf.items():
hdf.setValue(key, str(value))
def isAuthRequired(self):
"""check if this plugin requires authentication
first step: check plugin configuration
second step: check default value of plugin"""
try:
if self.cbox.prefs.pluginConf[self.getName()]["requestAuth"] is None:
return self.requestAuth
if self.cbox.prefs.pluginConf[self.getName()]["requestAuth"]:
return True
else:
return False
except KeyError:
return self.requestAuth
def isEnabled(self):
"""check if this plugin is enabled
first step: check plugin configuration
second step: check default value of plugin"""
fallback = bool(self.pluginVisibility)
try:
if self.cbox.prefs.pluginConf[self.getName()]["visibility"] is None:
return fallback
return bool(self.cbox.prefs.pluginConf[self.getName()]["visibility"])
except KeyError:
return fallback
def getRank(self):
"""check the rank of this plugin
first step: check plugin configuration
second step: check default value of plugin"""
try:
if self.cbox.prefs.pluginConf[self.getName()]["rank"] is None:
return self.rank
return int(self.cbox.prefs.pluginConf[self.getName()]["rank"])
except (KeyError, TypeError):
return self.rank
def getVisibility(self):
try:
if self.cbox.prefs.pluginConf[self.getName()]["visibility"] is None:
return self.pluginVisibility[:]
return self.cbox.prefs.pluginConf[self.getName()]["visibility"]
except KeyError:
return self.pluginVisibility
def getTestClass(self):
import imp
pl_file = os.path.join(self.pluginDir, "unittests.py")
if os.access(pl_file, os.R_OK) and os.path.isfile(pl_file):
try:
return getattr(imp.load_source("unittests_%s" % self.getName(), pl_file), "unittests")
except AttributeError:
pass
try:
self.cbox.log.info("could not load unittests for plugin: %s" % self.getName())
except AttributeError:
pass
return None