|
|
"""
|
|
|
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
|
|
|
|