summaryrefslogtreecommitdiff
path: root/invest-applet/invest/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'invest-applet/invest/__init__.py')
-rw-r--r--invest-applet/invest/__init__.py213
1 files changed, 213 insertions, 0 deletions
diff --git a/invest-applet/invest/__init__.py b/invest-applet/invest/__init__.py
new file mode 100644
index 00000000..b86ce8ec
--- /dev/null
+++ b/invest-applet/invest/__init__.py
@@ -0,0 +1,213 @@
+import os, sys
+from os.path import join, exists, isdir, isfile, dirname, abspath, expanduser
+from types import ListType
+import datetime
+
+import gtk, gtk.gdk, mateconf, gobject
+import cPickle
+
+import networkmanager
+
+# Autotools set the actual data_dir in defs.py
+from defs import *
+
+DEBUGGING = False
+
+# central debugging and error method
+def debug(msg):
+ if DEBUGGING:
+ print "%s: %s" % (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), msg)
+
+def error(msg):
+ print "%s: ERROR: %s" % (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f"), msg)
+
+
+# Allow to use uninstalled invest ---------------------------------------------
+UNINSTALLED_INVEST = False
+def _check(path):
+ return exists(path) and isdir(path) and isfile(path+"/Makefile.am")
+
+name = join(dirname(__file__), '..')
+if _check(name):
+ UNINSTALLED_INVEST = True
+
+# Sets SHARED_DATA_DIR to local copy, or the system location
+# Shared data dir is most the time /usr/share/invest-applet
+if UNINSTALLED_INVEST:
+ SHARED_DATA_DIR = abspath(join(dirname(__file__), '..', 'data'))
+ BUILDER_DATA_DIR = SHARED_DATA_DIR
+ ART_DATA_DIR = join(SHARED_DATA_DIR, 'art')
+else:
+ SHARED_DATA_DIR = join(DATA_DIR, "mate-applets", "invest-applet")
+ BUILDER_DATA_DIR = BUILDERDIR
+ ART_DATA_DIR = SHARED_DATA_DIR
+
+USER_INVEST_DIR = expanduser("~/.mate2/invest-applet")
+if not exists(USER_INVEST_DIR):
+ try:
+ os.makedirs(USER_INVEST_DIR, 0744)
+ except Exception , msg:
+ error('Could not create user dir (%s): %s' % (USER_INVEST_DIR, msg))
+# ------------------------------------------------------------------------------
+
+# Set the cwd to the home directory so spawned processes behave correctly
+# when presenting save/open dialogs
+os.chdir(expanduser("~"))
+
+#Gconf client
+MATECONF_CLIENT = mateconf.client_get_default()
+
+# MateConf directory for invest in window mode and shared settings
+MATECONF_DIR = "/apps/invest"
+
+# MateConf key for list of enabled handlers, when uninstalled, use a debug key to not conflict
+# with development version
+#MATECONF_ENABLED_HANDLERS = MATECONF_DIR + "/enabled_handlers"
+
+# Preload mateconf directories
+#MATECONF_CLIENT.add_dir(MATECONF_DIR, mateconf.CLIENT_PRELOAD_RECURSIVE)
+
+# tests whether the given stocks are in the old labelless format
+def labelless_stock_format(stocks):
+ if len(stocks) == 0:
+ return False
+
+ # take the first element of the dict and check if its value is a list
+ if type(stocks[stocks.keys()[0]]) is ListType:
+ return True
+
+ # there is no list, so it is already the new stock file format
+ return False
+
+# converts the given stocks from the labelless format into the one with labels
+def update_to_labeled_stock_format(stocks):
+ new = {}
+
+ for k, l in stocks.items():
+ d = {'label':"", 'purchases':l}
+ new[k] = d
+
+ return new
+
+# tests whether the given stocks are in the format without exchange information
+def exchangeless_stock_format(stocks):
+ if len(stocks) == 0:
+ return False
+
+ # take the first element of the dict and check if its value is a list
+ for symbol, data in stocks.items():
+ purchases = stocks[symbol]["purchases"]
+ if len(purchases) > 0:
+ purchase = purchases[0]
+ if not purchase.has_key("exchange"):
+ return True
+
+ return False
+
+# converts the given stocks into format with exchange information
+def update_to_exchange_stock_format(stocks):
+ for symbol, data in stocks.items():
+ purchases = data["purchases"]
+ for purchase in purchases:
+ purchase["exchange"] = 0
+
+ return stocks
+
+STOCKS_FILE = join(USER_INVEST_DIR, "stocks.pickle")
+
+try:
+ STOCKS = cPickle.load(file(STOCKS_FILE))
+
+ # if the stocks file is in the stocks format without labels,
+ # then we need to convert it into the new labeled format
+ if labelless_stock_format(STOCKS):
+ STOCKS = update_to_labeled_stock_format(STOCKS);
+
+ # if the stocks file does not contain exchange rates, add them
+ if exchangeless_stock_format(STOCKS):
+ STOCKS = update_to_exchange_stock_format(STOCKS);
+except Exception, msg:
+ error("Could not load the stocks from %s: %s" % (STOCKS_FILE, msg) )
+ STOCKS = {}
+
+#STOCKS = {
+# "AAPL": {
+# "amount": 12,
+# "bought": 74.94,
+# "comission": 31,
+# },
+# "INTC": {
+# "amount": 30,
+# "bought": 25.85,
+# "comission": 31,
+# },
+# "GOOG": {
+# "amount": 1,
+# "bought": 441.4,
+# "comission": 31,
+# },
+#}
+
+CONFIG_FILE = join(USER_INVEST_DIR, "config.pickle")
+try:
+ CONFIG = cPickle.load(file(CONFIG_FILE))
+except Exception, msg:
+ CONFIG = {} # default configuration
+
+
+# set default proxy config
+PROXY = None
+
+# borrowed from Ross Burton
+# http://burtonini.com/blog/computers/postr
+# extended by exception handling and retry scheduling
+def get_mate_proxy(client):
+ sleep = 10 # sleep between attempts for 10 seconds
+ attempts = 3 # try to get configuration from mateconf at most three times
+ get_mate_proxy_retry(client, attempts, sleep)
+
+def get_mate_proxy_retry(client, attempts, sleep):
+ # decrease attempts counter
+ attempts -= 1
+
+ # sanity check if we still need to look for proxy configuration
+ global PROXY
+ if PROXY != None:
+ return
+
+ # try to get config from mateconfd
+ try:
+ if client.get_bool("/system/http_proxy/use_http_proxy"):
+ host = client.get_string("/system/http_proxy/host")
+ port = client.get_int("/system/http_proxy/port")
+ if host is None or host == "" or port == 0:
+ # mate proxy is not valid, stop here
+ return
+
+ if client.get_bool("/system/http_proxy/use_authentication"):
+ user = client.get_string("/system/http_proxy/authentication_user")
+ password = client.get_string("/system/http_proxy/authentication_password")
+ if user and user != "":
+ url = "http://%s:%s@%s:%d" % (user, password, host, port)
+ else:
+ url = "http://%s:%d" % (host, port)
+ else:
+ url = "http://%s:%d" % (host, port)
+
+ # proxy config found, memorize
+ PROXY = {'http': url}
+
+ except Exception, msg:
+ error("Failed to get proxy configuration from MateConfd:\n%s" % msg)
+ # we did not succeed, schedule retry
+ if attempts > 0:
+ error("Retrying to contact MateConfd in %d seconds" % sleep)
+ gobject.timeout_add(sleep * 1000, get_mate_proxy_retry, client, attempts, sleep)
+
+# use mateconf to get proxy config
+client = mateconf.client_get_default()
+get_mate_proxy(client)
+
+
+# connect to Network Manager to identify current network connectivity
+nm = networkmanager.NetworkManager()