diff options
Diffstat (limited to 'tipboard/redis_utils.py')
-rw-r--r-- | tipboard/redis_utils.py | 104 |
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 |