Switched event system (again)
This commit is contained in:
1 parent
fd5a41435b
commit
f9523444f4
24 files changed
+580
-142
No files matched your search
@@ -1,5 +1,7 @@
|
||||
from __future__ import with_statement
|
||||
from blinker import signal, Signal
|
||||
from couchpotato.api import addApiView
|
||||
from couchpotato.core.event import addEvent
|
||||
from flask.helpers import jsonify
|
||||
import ConfigParser
|
||||
import os.path
|
||||
import time
|
||||
@@ -7,10 +9,13 @@ import time
|
||||
|
||||
class Settings():
|
||||
|
||||
on_save = Signal()
|
||||
on_register = Signal()
|
||||
|
||||
bool = {'true':True, 'false':False}
|
||||
options = {}
|
||||
|
||||
def __init__(self):
|
||||
|
||||
addApiView('settings', self.view)
|
||||
addApiView('settings.save', self.saveView)
|
||||
|
||||
def setFile(self, file):
|
||||
self.file = file
|
||||
@@ -21,7 +26,7 @@ class Settings():
|
||||
from couchpotato.core.logger import CPLog
|
||||
self.log = CPLog(__name__)
|
||||
|
||||
self.connectSignals()
|
||||
self.connectEvents()
|
||||
|
||||
def parser(self):
|
||||
return self.p
|
||||
@@ -29,18 +34,17 @@ class Settings():
|
||||
def sections(self):
|
||||
return self.p.sections()
|
||||
|
||||
def connectSignals(self):
|
||||
signal('settings.register').connect(self.registerDefaults)
|
||||
signal('settings.save').connect(self.save)
|
||||
def connectEvents(self):
|
||||
addEvent('settings.options', self.addOptions)
|
||||
addEvent('settings.register', self.registerDefaults)
|
||||
addEvent('settings.save', self.save)
|
||||
|
||||
def registerDefaults(self, section_name, options = {}, save = True):
|
||||
|
||||
self.addSection(section_name)
|
||||
for option, value in options.iteritems():
|
||||
self.setDefault(section_name, option, value)
|
||||
|
||||
self.log.debug('Defaults for "%s": %s' % (section_name, options))
|
||||
self.on_register.send(self)
|
||||
|
||||
if save:
|
||||
self.save(self)
|
||||
@@ -73,12 +77,11 @@ class Settings():
|
||||
values[section][option_name] = option_value
|
||||
return values
|
||||
|
||||
def save(self, caller = ''):
|
||||
def save(self):
|
||||
with open(self.file, 'wb') as configfile:
|
||||
self.p.write(configfile)
|
||||
|
||||
self.log.debug('Saved settings')
|
||||
self.on_save.send(self)
|
||||
|
||||
def addSection(self, section):
|
||||
if not self.p.has_section(section):
|
||||
@@ -94,3 +97,32 @@ class Settings():
|
||||
return True
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
def addOptions(self, section_name, options):
|
||||
self.options[section_name] = options
|
||||
|
||||
def getOptions(self):
|
||||
return self.options
|
||||
|
||||
|
||||
def view(self):
|
||||
|
||||
return jsonify({
|
||||
'options': self.getOptions(),
|
||||
'values': self.getValues()
|
||||
})
|
||||
|
||||
def saveView(self):
|
||||
|
||||
a = Env.getParams()
|
||||
|
||||
section = a.get('section')
|
||||
option = a.get('name')
|
||||
value = a.get('value')
|
||||
|
||||
self.set(option, section, value)
|
||||
self.save()
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
})
|
||||
@@ -1,79 +0,0 @@
|
||||
from blinker import signal
|
||||
from couchpotato.core.logger import CPLog
|
||||
import glob
|
||||
import os
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
class SettingsLoader:
|
||||
|
||||
configs = {}
|
||||
sections = {}
|
||||
|
||||
def __init__(self):
|
||||
self.settings_register = signal('settings.register')
|
||||
self.settings_save = signal('settings.save')
|
||||
|
||||
def load(self, root = ''):
|
||||
|
||||
self.paths = {
|
||||
'plugins' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')),
|
||||
'providers' : ('couchpotato.core.providers', os.path.join(root, 'couchpotato', 'core', 'providers')),
|
||||
}
|
||||
|
||||
for type, tuple in self.paths.iteritems():
|
||||
self.addFromDir(tuple[0], tuple[1])
|
||||
|
||||
def run(self):
|
||||
did_save = 0
|
||||
|
||||
for module, plugin_name in self.configs.iteritems():
|
||||
did_save += self.loadConfig(module, plugin_name, save = False)
|
||||
|
||||
if did_save:
|
||||
self.settings_save.send()
|
||||
|
||||
def addFromDir(self, module, dir):
|
||||
|
||||
for file in glob.glob(os.path.join(dir, '*')):
|
||||
name = os.path.basename(file)
|
||||
if os.path.isdir(os.path.join(dir, name)):
|
||||
self.addConfig(module, name)
|
||||
|
||||
def loadConfig(self, module, name, save = True):
|
||||
module_name = '%s.%s' % (module, name)
|
||||
try:
|
||||
m = getattr(self.loadModule(module_name), name)
|
||||
|
||||
for section in m.config:
|
||||
self.addSection(section['name'], section)
|
||||
options = {}
|
||||
for key, option in section['options'].iteritems():
|
||||
options[key] = option['default']
|
||||
self.settings_register.send(section['name'], options = options, save = save)
|
||||
|
||||
return True
|
||||
except Exception, e:
|
||||
log.error("Failed loading config for %s: %s" % (name, e))
|
||||
return False
|
||||
|
||||
def addConfig(self, module, name):
|
||||
self.configs[module] = name
|
||||
|
||||
def loadModule(self, name):
|
||||
try:
|
||||
m = __import__(name)
|
||||
splitted = name.split('.')
|
||||
for sub in splitted[1:-1]:
|
||||
m = getattr(m, sub)
|
||||
return m
|
||||
except:
|
||||
raise
|
||||
|
||||
def addSection(self, section_name, options):
|
||||
self.sections[section_name] = options
|
||||
|
||||
def getSections(self):
|
||||
return self.sections
|
||||
|
||||
settings_loader = SettingsLoader()
|
||||
Reference in new issue
Block a user