diff --git a/webpy_server.py b/webpy_server.py new file mode 100644 index 0000000..74c0fb3 --- /dev/null +++ b/webpy_server.py @@ -0,0 +1,139 @@ +import web +# import redis +# import csv +# import json +import time +# r = redis.StrictRedis(host='localhost', port=6379, db=0) +from pymongo import MongoClient + +urls = [ + "/set", "set_params", + "/get", "get_params", + "/refresh", "get_all", + "/confirm", "confirm_params" +] + + +dms_client = MongoClient('localhost', 27017, connect=True) +db = dms_client.test_database +db_states = db["device_states"] + + +class DataStore(object): + + """docstring for DataStore""" + + def __init__(self): + super(DataStore, self).__init__() + self.db_id = db_states.insert_one({}).inserted_id + + def __setitem__(self, key, value): + key, value = unicode(key), unicode(value) + # self.check_key(key) + update = True + param_old_wrapper_dict = db_states.find_one({"_id": self.db_id, key: {"$exists": True}}, {"_id": 0, key: 1}) + if param_old_wrapper_dict: + param_old_dict = param_old_wrapper_dict[key] + if param_old_dict["new_value"] == value: + update = False + + if update is True: + db_states.update_one(filter={"_id": self.db_id}, + update={"$set": {key: {"confirmed": False, "new_value": value}}}) + + def confirm(self, key, value): + key, value = unicode(key), unicode(value) + param_wrapper_dict = db_states.find_one({"_id": self.db_id, key: {"$exists": True}}, {"_id": 0, key: 1}) + if param_wrapper_dict: + param_dict = param_wrapper_dict[key] + if param_dict["new_value"] == value: + db_states.find_one_and_update(filter={"_id": self.db_id, key: {"$exists": True}}, + update={"$set": {key + ".confirmed": True}}) + + def __getitem__(self, key): + key = unicode(key) + param_wrapper_dict = db_states.find_one({"_id": self.db_id, key: {"$exists": True}}, {"_id": 0, key: 1}) + if param_wrapper_dict: + param_dict = param_wrapper_dict[key] + if (not param_dict["confirmed"]) and (param_dict["new_value"] is not None): + return param_dict["new_value"] + return None + + def check_key(self, key): + # todo: is needed ?? + if key not in self._dict: + self._dict[key] = {"confirmed": False, "new_value": None} + + def get_modified(self): + dict_modified = {} + param_wrapper_dict = db_states.find_one({"_id": self.db_id}, {"_id": 0}) + + for key in param_wrapper_dict: + param_dict = param_wrapper_dict[key] + confirmed = param_dict["confirmed"] + value = param_dict["new_value"] + if (not confirmed) and (value is not None): + dict_modified[key] = value + return dict_modified + + +def dict_to_response(_dict): + str_response = "" + for key in _dict: + value = _dict[key] + str_response += "=".join([key, value]) + " " + str_response += "time=" + time.ctime().replace(" ", "-") + " " + str_response = "`" + str_response + "`" + return str_response + +data = DataStore() + +data["a"] = 5 +data["c"] = 45 +data.get_modified() + + +class get_params: + + def GET(self): + global data + print("Sending data back") + print(data._dict) + return dict_to_response(data.get_modified()) + + +class set_params: + + def GET(self): + dict_input = dict(web.input()) + for key in dict_input: + value = dict_input[key] + data[key] = value + + +class get_all: + + def GET(self): + dict_all = {} + for key in data._dict: + value = data._dict[key]["new_value"] + if value is not None: + dict_all[key] = value + return dict_to_response(dict_all) + + +class confirm_params(object): + + def GET(self): + dict_input = dict(web.input()) + for key in dict_input: + value = dict_input[key] + data.confirm(key, value) + + +app = web.application(urls, globals()) +app_wsgi_func = app.wsgifunc() + +if __name__ == "__main__": + + app.run()