class MyServiceSettings(resource.Resource):
    """Handle /setting requests"""
    isLeaf = True

    def __init__(self):
        self.db = MyServiceDatabase()

    def render_PUT(self, request):
        """Handle /setting/SETTING_NAME request. Body must be a json {"value": "SETTING_VALUE"} """
        request.setHeader("content-type", "application/json")

        result = {"status": "ok"}

        resetting = re.match("/setting/(.*)", request.uri)
        if resetting is None:
            result = {"status": "error", "message": "no setting requested"}
            return json.dumps(result)

        try:
            setting = resetting.groups()[0]
            data = json.loads(request.content.read())

            value = data["value"]

            self.db.update_setting(setting, value)
        except (TypeError, ValueError, KeyError) as e:
            result = {"status": "error", "message": e.message}

        return json.dumps(result)

    def render_GET(self, request):
        """Handle /setting or /setting/SETTING_NAME request"""
        request.setHeader("content-type", "application/json")

        result = {"status": "ok"}

        setting = None
        resetting = re.match("/setting/(.+)", request.uri)

        if resetting is not None:
            setting = resetting.groups()[0]

        if setting is None:
            settings = self.db.list_settings()

            result["settings"] = settings
            return json.dumps(result)

        try:

            result["value"] = self.db.get_setting(setting)

        except (TypeError, ValueError, KeyError) as e:
            result = {"status": "error", "message": e.message}

        return json.dumps(result)
def update_stock():
    """Called in loop to update stocks values"""
    db = MyServiceDatabase()
    stocks = db.list_stocks()

    conn = HTTPConnection("download.finance.yahoo.com")
    conn.request("GET", "/d/quotes.csv?s={0}&f=sl1".format("+".join([x["symbol"] for x in stocks])))

    response = conn.getresponse()

    if response.status != 200:
        return

    for row in csv.reader(response.read().split("\n")):
        if len(row) > 1:
            db.update_stock(row[0], row[1])
 def __init__(self):
     self.db = MyServiceDatabase()
class MyServiceStocks(resource.Resource):
    """Handle /stock requests"""
    isLeaf = True

    def __init__(self):
        self.db = MyServiceDatabase()

    def render_POST(self, request):
        """Handle /stock/STOCK_NAME request"""

        request.setHeader("content-type", "application/json")

        result = {"status": "ok"}

        stock = None
        restock = re.match("/stock/(.+)", request.uri)

        if restock is not None:
            stock = restock.groups()[0]

        if stock is None:
            result = {"status": "error", "message": "no stock requested"}
            return json.dumps(result)

        try:
            self.db.add_stock(stock)
        except (TypeError, ValueError, KeyError, sqlite3.IntegrityError) as e:
            result = {"status": "error", "message": e.message}

        return json.dumps(result)

    def render_DELETE(self, request):
        """Handle /stock/STOCK_NAME request"""

        request.setHeader("content-type", "application/json")

        result = {"status": "ok"}

        stock = None
        restock = re.match("/stock/(.+)", request.uri)

        if restock is not None:
            stock = restock.groups()[0]

        if stock is None:
            result = {"status": "error", "message": "no stock requested"}
            return json.dumps(result)

        self.db.remove_stock(stock)

        return json.dumps(result)

    def render_GET(self, request):
        """Handle /stock or /stock/STOCK_NAME request"""

        request.setHeader("content-type", "application/json")

        result = {"status": "ok"}

        stock = None
        restock = re.match("/stock/(.+)", request.uri)

        if restock is not None:
            stock = restock.groups()[0]

        if stock is None:
            result["stocks"] = self.db.list_stocks()
            return json.dumps(result)

        try:
            result["last_price"] = self.db.get_stock_price(stock)

        except (TypeError, ValueError, KeyError) as e:
            result = {"status": "error", "message": e.message}

        return json.dumps(result)