123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- from datetime import timedelta
- from random import randint
- from django.db import models
- from django.utils import timezone
- from django.utils.translation import ugettext_lazy as _
- """
- IP's that have exhausted their quota of sign-in attempts are automatically banned for set amount of time.
- That IP ban cuts bad IP address from signing into board by either making another sign-in attempts or
- registering "fresh" account.
- """
- class SignInAttemptsManager(models.Manager):
- """
- Attempts manager
- """
- def register_attempt(self, ip):
- attempt = SignInAttempt(ip=ip, date=timezone.now())
- attempt.save(force_insert=True)
-
- def is_jammed(self, settings, ip):
- # Limit is off, dont jam IPs?
- if settings['login_attempts_limit'] == 0:
- return False
- # Check jam
- if settings['jams_lifetime'] > 0:
- attempts = SignInAttempt.objects.filter(
- date__gt=timezone.now() - timedelta(minutes=settings['jams_lifetime']),
- ip=ip
- )
- else:
- attempts = SignInAttempt.objects.filter(ip=ip)
- return attempts.count() > settings['login_attempts_limit']
-
-
- class SignInAttempt(models.Model):
- ip = models.GenericIPAddressField(db_index=True)
- date = models.DateTimeField()
-
- objects = SignInAttemptsManager()
-
-
- class JamCache(object):
- jammed = False
- expires = timezone.now()
- def check_for_updates(self, request):
- if self.expires < timezone.now():
- self.jammed = SignInAttempt.objects.is_jammed(request.settings, request.session.get_ip(request))
- self.expires = timezone.now() + timedelta(minutes=request.settings['jams_lifetime'])
- return True
- return False
-
- def is_jammed(self):
- return self.jammed
-
- """
- Question-Answer Tests
- """
- class QATestManager(models.Manager):
- def random(self):
- count = self.aggregate(count=models.Count('id'))['count']
- random_index = randint(0, count - 1)
- return self.all()[random_index]
-
- class QATest(models.Model):
- question = models.CharField(_("Question"),max_length=255)
- helptext = models.TextField(null=True,blank=True)
- answers = models.TextField()
-
- objects = QATestManager()
-
- def is_answer_correct(self, answer):
- return unicode(answer).lower() in (name.lower() for name in unicode(self.answers).splitlines())
|