Add Draw.successful()
It can decide if the given draw was successful: * The word is accepted * Work was submitted for the word * The work was submitted on time
This commit is contained in:
parent
51035af3d0
commit
e71eb45260
20
words/migrations/0004_work_upload_time.py
Normal file
20
words/migrations/0004_work_upload_time.py
Normal file
@ -0,0 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.utils.timezone
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('words', '0003_draw_word_related'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='work',
|
||||
name='upload_time',
|
||||
field=models.DateTimeField(default=django.utils.timezone.now),
|
||||
),
|
||||
]
|
@ -2,6 +2,7 @@ from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.dateparse import parse_duration
|
||||
from django.utils.encoding import python_2_unicode_compatible
|
||||
from django.utils.translation import get_language
|
||||
|
||||
@ -57,9 +58,31 @@ class Draw(models.Model):
|
||||
accepted = models.NullBooleanField()
|
||||
timestamp = models.DateTimeField(default=timezone.now)
|
||||
|
||||
def successful(self):
|
||||
max_duration = parse_duration(settings.DRAW_TIME)
|
||||
|
||||
try:
|
||||
work = self.work
|
||||
except Work.DoesNotExist:
|
||||
work = None
|
||||
|
||||
if work is None:
|
||||
elapsed_time = timezone.now() - self.timestamp
|
||||
|
||||
if elapsed_time >= max_duration:
|
||||
return False
|
||||
|
||||
return None
|
||||
|
||||
if self.work.upload_time - self.timestamp > max_duration:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
class Meta:
|
||||
ordering = ('timestamp',)
|
||||
|
||||
class Work(models.Model):
|
||||
draw = models.OneToOneField(Draw, related_name='work', primary_key=True)
|
||||
language = models.CharField(max_length=5, db_index=True)
|
||||
upload_time = models.DateTimeField(default=timezone.now)
|
||||
|
@ -167,3 +167,31 @@ class DrawTest(TestCase):
|
||||
Word.objects.create()
|
||||
|
||||
self.assertEquals(self.word, self.user.draw_word())
|
||||
|
||||
@override_settings(DRAW_TIME='1 00:00:00')
|
||||
def test_draw_successful(self):
|
||||
# If there is no work, but we are within the time range
|
||||
draw = Draw.objects.create(
|
||||
user=self.user,
|
||||
word=Word.objects.create(),
|
||||
accepted=True,
|
||||
timestamp=timezone.now())
|
||||
self.assertIsNone(draw.successful())
|
||||
|
||||
# If there is no work and we are out of time
|
||||
draw.timestamp -= timedelta(days=2)
|
||||
draw.save()
|
||||
self.assertIsNotNone(draw.successful())
|
||||
self.assertFalse(draw.successful())
|
||||
|
||||
# If there is work and it was submitted on time
|
||||
draw.timestamp = timezone.now() + timedelta(minutes=1)
|
||||
draw.save()
|
||||
Work.objects.create(draw=draw)
|
||||
self.assertTrue(draw.successful())
|
||||
|
||||
# If there is work and it wasn’t submitted on time
|
||||
draw.timestamp = timezone.now() - timedelta(days=2)
|
||||
draw.save()
|
||||
self.assertIsNotNone(draw.successful())
|
||||
self.assertFalse(draw.successful())
|
||||
|
Loading…
Reference in New Issue
Block a user