""" This module contains helper functions and helper classes. """ import hashlib import time from django.utils import timezone import boards from neboard import settings from boards.models import User from boards.models.user import RANK_USER KEY_CAPTCHA_FAILS = 'key_captcha_fails' KEY_CAPTCHA_DELAY_TIME = 'key_captcha_delay_time' KEY_CAPTCHA_LAST_ACTIVITY = 'key_captcha_last_activity' def need_include_captcha(request): """ Check if request is made by a user. It contains rules which check for bots. """ if not settings.ENABLE_CAPTCHA: return False enable_captcha = False #newcomer if KEY_CAPTCHA_LAST_ACTIVITY not in request.session: return settings.ENABLE_CAPTCHA last_activity = request.session[KEY_CAPTCHA_LAST_ACTIVITY] current_delay = int(time.time()) - last_activity delay_time = (request.session[KEY_CAPTCHA_DELAY_TIME] if KEY_CAPTCHA_DELAY_TIME in request.session else settings.CAPTCHA_DEFAULT_SAFE_TIME) if current_delay < delay_time: enable_captcha = True print 'ENABLING' + str(enable_captcha) return enable_captcha def update_captcha_access(request, passed): """ Update captcha fields. It will reduce delay time if user passed captcha verification and it will increase it otherwise. """ session = request.session delay_time = (request.session[KEY_CAPTCHA_DELAY_TIME] if KEY_CAPTCHA_DELAY_TIME in request.session else settings.CAPTCHA_DEFAULT_SAFE_TIME) print "DELAY TIME = " + str(delay_time) if passed: delay_time -= 2 if delay_time >= 7 else 5 else: delay_time += 10 session[KEY_CAPTCHA_LAST_ACTIVITY] = int(time.time()) session[KEY_CAPTCHA_DELAY_TIME] = delay_time 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 def datetime_to_epoch(datetime): return int(time.mktime(timezone.localtime( datetime,timezone.get_current_timezone()).timetuple()) * 1000000 + datetime.microsecond) def get_user(request): """ Get current user from the session. If the user does not exist, create a new one. """ session = request.session if not 'user_id' in session: request.session.save() md5 = hashlib.md5() md5.update(session.session_key) new_id = md5.hexdigest() while User.objects.filter(user_id=new_id).exists(): md5.update(str(timezone.now())) new_id = md5.hexdigest() time_now = timezone.now() user = User.objects.create(user_id=new_id, rank=RANK_USER, registration_time=time_now) session['user_id'] = user.id else: user = User.objects.select_related('fav_tags').get( id=session['user_id']) return user def get_theme(request, user=None): """ Get user's CSS theme """ if not user: user = get_user(request) theme = user.get_setting('theme') if not theme: theme = boards.settings.DEFAULT_THEME return theme