MrDraw/printer_webui/settings.py
Gina Häußge a85ea69fb0 Established settings mechanism
Allows reading and writing default serial port and baudrate (this also is available via the web interface) and setting the host and port on which the server should listen. Might allow persisting more options in the future.

The configuration file is stored in ~/.printerwebui/config.ini under Linux, in %APPDATA%/PrinterWebUI/config.ini under Windows and should be stored in ~/Library/Application Support/config.ini under MacOS X

Closes #1
2013-01-01 21:04:00 +01:00

114 lines
3 KiB
Python

# coding=utf-8
__author__ = "Gina Häußge <osd@foosel.net>"
__license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html'
import ConfigParser
import sys
import os
APPNAME="PrinterWebUI"
instance = None
def settings():
global instance
if instance is None:
instance = Settings()
return instance
default_settings = {
"serial": {
"port": None,
"baudrate": None
},
"server": {
"host": "0.0.0.0",
"port": 5000
}
}
class Settings(object):
def __init__(self):
self.settings_dir = None
self._config = None
self._changes = None
self.init_settings_dir()
self.load()
def init_settings_dir(self):
# taken from http://stackoverflow.com/questions/1084697/how-do-i-store-desktop-application-data-in-a-cross-platform-way-for-python
if sys.platform == "darwin":
from AppKit import NSSearchPathForDirectoriesInDomains
# http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSSearchPathForDirectoriesInDomains
# NSApplicationSupportDirectory = 14
# NSUserDomainMask = 1
# True for expanding the tilde into a fully qualified path
self.settings_dir = os.path.join(NSSearchPathForDirectoriesInDomains(14, 1, True)[0], APPNAME)
elif sys.platform == "win32":
self.settings_dir = os.path.join(os.environ["APPDATA"], APPNAME)
else:
self.settings_dir = os.path.expanduser(os.path.join("~", "." + APPNAME.lower()))
def load(self):
self._config = ConfigParser.ConfigParser(allow_no_value=True)
self._config.read(os.path.join(self.settings_dir, "config.ini"))
def save(self, force=False):
if self._changes is None and not force:
return
for section in default_settings.keys():
if self._changes.has_key(section):
for key in self._changes[section].keys():
value = self._changes[section][key]
if not self._config.has_section(section):
self._config.add_section(section)
self._config.set(section, key, value)
with open(os.path.join(self.settings_dir, "config.ini"), "wb") as configFile:
self._config.write(configFile)
self._changes = None
def get(self, section, key):
if section not in default_settings.keys():
return None
value = None
if self._config.has_option(section, key):
value = self._config.get(section, key)
if value is None:
if default_settings.has_key(section) and default_settings[section].has_key(key):
return default_settings[section][key]
else:
return None
else:
return value
def getInt(self, section, key):
value = self.get(section, key)
if value is None:
return None
try:
return int(value)
except ValueError:
return None
def set(self, section, key, value):
if section not in default_settings.keys():
return None
if self._changes is None:
self._changes = {}
if self._changes.has_key(section):
sectionConfig = self._changes[section]
else:
sectionConfig = {}
sectionConfig[key] = value
self._changes[section] = sectionConfig