aboutsummaryrefslogtreecommitdiffstats
path: root/tipboard/redis_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'tipboard/redis_utils.py')
-rw-r--r--tipboard/redis_utils.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/tipboard/redis_utils.py b/tipboard/redis_utils.py
new file mode 100644
index 0000000..6492ed3
--- /dev/null
+++ b/tipboard/redis_utils.py
@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+
+from datetime import datetime
+import json
+import logging
+import time
+
+import redis
+
+from tipboard import settings
+
+log = logging.getLogger(__name__)
+
+db_events_path = lambda: '{}:events'.format(settings.PROJECT_NAME)
+
+
+class KeyNotFound(Exception):
+ def __init__(self, key):
+ self.key = key
+ self.message = "Key '{}' was not found in db".format(self.key)
+
+
+def redis_actions(method, tile_id, value=None, tile=None):
+ key = '%s:tile:%s' % (settings.PROJECT_NAME, tile_id)
+ try:
+ redis_db = redis.Redis(**settings.REDIS_SYNC)
+ except Exception as e:
+ raise TypeError('Redis: %s' % e)
+ else:
+ if method.lower() == 'post':
+ try:
+ last_tile_data = get_redis_value(tile_id)
+ except KeyNotFound as e:
+ meta = {}
+ else:
+ meta = last_tile_data.get('meta')
+ localtime = datetime.now().strftime("%Y-%m-%dT%H:%M:%S")
+ tz = '{0:+06.2f}'.format(-float(time.altzone) / 3600)
+ iso_time = localtime + tz.replace('.', ':') # ISO-8601
+ required_structure = dict(
+ id=tile_id,
+ tile_template=tile,
+ data=json.loads(value),
+ meta=meta,
+ modified=iso_time,
+ )
+ dumped_value = json.dumps(required_structure)
+ redis_db.set(key, dumped_value)
+ log.debug(
+ 'db key: {} set to value: {}'.format(
+ repr(key), repr(dumped_value)
+ )
+ )
+ redis_db.publish(db_events_path(), key)
+ return 'Push success.'
+
+ elif method.lower() == 'get':
+ db_value = redis_db.get(key)
+ log.debug('got db value: {}'.format(db_value))
+ return db_value
+ elif method.lower() == 'delete':
+ redis_db.delete(key)
+ log.debug('deleted db key: {} '.format(key))
+ return 'Deleted.'
+ else:
+ return 'Unkown method.'
+
+
+def get_redis_value(tile_id):
+ key = '%s:tile:%s' % (settings.PROJECT_NAME, tile_id)
+ try:
+ redis_db = redis.Redis(**settings.REDIS_SYNC)
+ except Exception as e:
+ raise TypeError('Redis: %s' % e)
+ else:
+ jsoned = redis_db.get(key)
+ if not jsoned:
+ raise KeyNotFound(key)
+ db_data = json.loads(jsoned)
+ return db_data
+
+
+def set_redis_value(tile_id, data):
+ key = '%s:tile:%s' % (settings.PROJECT_NAME, tile_id)
+ try:
+ redis_db = redis.Redis(**settings.REDIS)
+ except Exception as e:
+ raise TypeError('Redis: %s' % e)
+ else:
+ dumped_value = json.dumps(data)
+ redis_db.set(key, dumped_value)
+ redis_db.publish(db_events_path(), key)
+
+
+def key_exist(key_id):
+ key = '%s:tile:%s' % (settings.PROJECT_NAME, key_id)
+ redis_db = redis.Redis(**settings.REDIS)
+ return True if redis_db.get(key) else False