|
|
from datetime import datetime, timedelta
|
|
|
import hashlib
|
|
|
from django.db import transaction
|
|
|
from django.db.models import Count
|
|
|
from django.template import RequestContext
|
|
|
from django.utils import timezone
|
|
|
from django.views.generic import View
|
|
|
from boards import utils
|
|
|
from boards.models import User, Post
|
|
|
from boards.models.post import SETTING_MODERATE
|
|
|
from boards.models.user import RANK_USER, Ban
|
|
|
import neboard
|
|
|
|
|
|
BAN_REASON_SPAM = 'Autoban: spam bot'
|
|
|
|
|
|
OLD_USER_AGE_DAYS = 90
|
|
|
|
|
|
PARAMETER_FORM = 'form'
|
|
|
|
|
|
|
|
|
class BaseBoardView(View):
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
request = kwargs['request']
|
|
|
context = self._default_context(request)
|
|
|
|
|
|
context['version'] = neboard.settings.VERSION
|
|
|
context['site_name'] = neboard.settings.SITE_NAME
|
|
|
|
|
|
return context
|
|
|
|
|
|
def _default_context(self, request):
|
|
|
"""Create context with default values that are used in most views"""
|
|
|
|
|
|
context = RequestContext(request)
|
|
|
|
|
|
user = self._get_user(request)
|
|
|
context['user'] = user
|
|
|
context['tags'] = user.get_sorted_fav_tags()
|
|
|
context['posts_per_day'] = float(Post.objects.get_posts_per_day())
|
|
|
|
|
|
theme = self._get_theme(request, user)
|
|
|
context['theme'] = theme
|
|
|
context['theme_css'] = 'css/' + theme + '/base_page.css'
|
|
|
|
|
|
# This shows the moderator panel
|
|
|
moderate = user.get_setting(SETTING_MODERATE)
|
|
|
if moderate == 'True':
|
|
|
context['moderator'] = user.is_moderator()
|
|
|
else:
|
|
|
context['moderator'] = False
|
|
|
|
|
|
return context
|
|
|
|
|
|
def _get_user(self, 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)
|
|
|
|
|
|
self._delete_old_users()
|
|
|
|
|
|
session['user_id'] = user.id
|
|
|
else:
|
|
|
user = User.objects.get(id=session['user_id'])
|
|
|
|
|
|
return user
|
|
|
|
|
|
def _get_theme(self, request, user=None):
|
|
|
"""
|
|
|
Get user's CSS theme
|
|
|
"""
|
|
|
|
|
|
if not user:
|
|
|
user = self._get_user(request)
|
|
|
theme = user.get_setting('theme')
|
|
|
if not theme:
|
|
|
theme = neboard.settings.DEFAULT_THEME
|
|
|
|
|
|
return theme
|
|
|
|
|
|
def _delete_old_users(self):
|
|
|
"""
|
|
|
Delete users with no favorite tags and posted messages. These can be spam
|
|
|
bots or just old user accounts
|
|
|
"""
|
|
|
|
|
|
old_registration_date = datetime.now().date() - timedelta(
|
|
|
OLD_USER_AGE_DAYS)
|
|
|
|
|
|
for user in User.objects.annotate(tags_count=Count('fav_tags')).filter(
|
|
|
tags_count=0).filter(
|
|
|
registration_time__lt=old_registration_date):
|
|
|
if not Post.objects.filter(user=user).exists():
|
|
|
user.delete()
|
|
|
|
|
|
@transaction.atomic
|
|
|
def _ban_current_user(self, request):
|
|
|
"""
|
|
|
Add current user to the IP ban list
|
|
|
"""
|
|
|
|
|
|
ip = utils.get_client_ip(request)
|
|
|
ban, created = Ban.objects.get_or_create(ip=ip)
|
|
|
if created:
|
|
|
ban.can_read = False
|
|
|
ban.reason = BAN_REASON_SPAM
|
|
|
ban.save()
|
|
|
|
|
|
|