forked from uweschmitt/emzed
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuserConfig.py
executable file
·201 lines (159 loc) · 6.08 KB
/
userConfig.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
import os, sys
import ConfigParser
import functools
import version
class _GlobalConfig(object):
def __init__(self):
emzedFolder = getEmzedFolder()
if not os.path.exists(emzedFolder):
os.makedirs(emzedFolder)
self.configFilePath=os.path.join(emzedFolder, "global.ini")
if not os.path.exists(self.configFilePath):
self.exchangeFolder = None
self.metlinToken = None
self.editConfig()
else:
p = ConfigParser.ConfigParser()
p.readfp(open(self.configFilePath))
self.exchangeFolder = p.get("DEFAULT", "exchange_folder")
if p.has_option("DEFAULT", "metlin_token"):
self.metlinToken = p.get("DEFAULT", "metlin_token")
else:
self.metlinToken = None
self.editConfig()
def getExchangeFolder(self):
return self.exchangeFolder
def getMetlinToken(self):
return self.metlinToken
def setMetlinToken(self, token):
self.metlinToken = token
self.saveConfig()
def editConfig(self):
import guidata
app = guidata.qapplication() # singleton !
import guidata.dataset.datatypes as dt
import guidata.dataset.dataitems as di
def check_value(self, value):
if not isinstance(value, self.type):
return False
if str(value).strip()=="":
return True
return di.DirectoryItem._check_value(self, value)
di.DirectoryItem._check_value = di.DirectoryItem.check_value
di.DirectoryItem.check_value = check_value
class ConfigEditor(dt.DataSet):
""" ConfigEditor
Please provide a global exchange folder for databases,
scripts and configs shared among your lab.
If you do not have such an exchange folder, leave the
field empty.
You need a metlin token for accessing the metlin
web service. To register for this token go to
http://metlin.scripps.edu/soap/register.php
You can leave this field empty.
If you want to modify these values later, enter
>>> import userConfig
>>> userConfig.setMetlinToken("....")
"""
exchangeFolder = di.DirectoryItem("Global exchange folder:",
notempty=False, default=self.exchangeFolder or "")
metlinToken = di.StringItem("Metlin token:",
default = self.metlinToken or "")
dlg = ConfigEditor()
dlg.edit()
self.exchangeFolder = dlg.exchangeFolder
self.metlinToken = dlg.metlinToken
di.DirectoryItem.check_value = di.DirectoryItem._check_value
self.saveConfig()
def saveConfig(self):
p = ConfigParser.ConfigParser()
p.set("DEFAULT", "exchange_folder", self.exchangeFolder or "")
p.set("DEFAULT", "metlin_token", self.metlinToken or "")
p.write(open(self.configFilePath, "w"))
def userShellFolderKey():
import _winreg
key =_winreg.OpenKey(_winreg.HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion"
"\\Explorer\\User Shell Folders")
return key
def _query(key, subKey):
import _winreg
val, _ = _winreg.QueryValueEx(key, subKey)
return _winreg.ExpandEnvironmentStrings(val)
def linuxdefault(path):
def wrapper(fun, path=path):
@functools.wraps(fun)
def new_fun():
if sys.platform == "win32":
return fun()
else:
return path
return new_fun
return wrapper
@linuxdefault(os.environ.get("HOME"))
def getDocumentFolder():
key = userShellFolderKey()
return _query(key, "Personal")
@linuxdefault(os.environ.get("HOME"))
def getAppDataFolder():
key = userShellFolderKey()
return _query(key, "AppData")
@linuxdefault(os.environ.get("HOME"))
def getLocalAppDataFolder():
key = userShellFolderKey()
return _query(key, "Local AppData")
def getEmzedFolder():
if sys.platform == "win32":
return os.path.join(getAppDataFolder(), "emzed")
else:
return os.path.join(getAppDataFolder(), ".emzed")
def getDataHome():
dataHome = os.path.join(getDocumentFolder(), "emzed_files")
return dataHome
#def getExchangeFolder():
# import warnings
# warnings.warn("getExchangeFolder is depreciated. Please use"\
# " getVersionedExchangeFolder() instead")
# return getVersionedExchangeFolder()
def getExchangeSubFolder(subfolder):
folder = _GlobalConfig().getExchangeFolder()
if folder:
folder = os.path.join(folder, subfolder)
try:
if not os.path.exists(folder):
os.makedirs(folder)
os.stat(folder)
except:
# not reachable, may happen for network folders
return None
return folder
# no global exchange folder set, use local folder instead:
folder = os.path.join(getDataHome(), "shared")
folder = os.path.join(folder, subfolder)
if not os.path.exists(folder):
os.makedirs(folder)
return folder
def getTablesExchangeFolder():
return getExchangeSubFolder("tables_1.3.2_or_newer")
def getVersionedExchangeFolder():
return getExchangeSubFolder(version.version)
def getScriptsExchangeFolder():
return getExchangeSubFolder("scripts_%s" % version.version)
def getMetlinToken():
return _GlobalConfig().getMetlinToken()
def setMetlinToken(token):
return _GlobalConfig().setMetlinToken(token)
# maintains state between setRVersion and getRVersion:"
_pseudo_globals = dict()
def setRVersion(r_version, g=_pseudo_globals):
g["R_VERSION"] = r_version
def getRLibsFolder(g=_pseudo_globals):
r_version = g.get("R_VERSION")
if r_version is None:
return getExchangeSubFolder("r_libs")
return getExchangeSubFolder("r_libs_%s" % r_version)
#return getExchangeFolder("r_libs_3")
root = getVersionedExchangeFolder()
if root is None:
return None
return os.path.join(root, "r_libs")