""" This module contains helper functions and helper classes. """ import time import hmac from django.core.cache import cache from django.db.models import Model from django.utils import timezone from neboard import settings KEY_CAPTCHA_FAILS = 'key_captcha_fails' KEY_CAPTCHA_DELAY_TIME = 'key_captcha_delay_time' KEY_CAPTCHA_LAST_ACTIVITY = 'key_captcha_last_activity' def get_client_ip(request): x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') if x_forwarded_for: ip = x_forwarded_for.split(',')[-1].strip() else: ip = request.META.get('REMOTE_ADDR') return ip # TODO The output format is not epoch because it includes microseconds def datetime_to_epoch(datetime): return int(time.mktime(timezone.localtime( datetime,timezone.get_current_timezone()).timetuple()) * 1000000 + datetime.microsecond) def get_websocket_token(user_id='', timestamp=''): """ Create token to validate information provided by new connection. """ sign = hmac.new(settings.CENTRIFUGE_PROJECT_SECRET.encode()) sign.update(settings.CENTRIFUGE_PROJECT_ID.encode()) sign.update(user_id.encode()) sign.update(timestamp.encode()) token = sign.hexdigest() return token def cached_result(function): """ Caches method result in the Django's cache system, persisted by object name, object name and model id if object is a Django model. """ def inner_func(obj, *args, **kwargs): # TODO Include method arguments to the cache key cache_key = obj.__class__.__name__ + '_' + function.__name__ if isinstance(obj, Model): cache_key += '_' + str(obj.id) persisted_result = cache.get(cache_key) if persisted_result: result = persisted_result else: result = function(obj, *args, **kwargs) cache.set(cache_key, result) return result return inner_func