64 lines
2.7 KiB
Python
64 lines
2.7 KiB
Python
from django.db import models
|
|
from django.contrib.auth.models import User
|
|
from django.utils.timezone import now
|
|
from django.core.validators import RegexValidator
|
|
import re
|
|
|
|
class DottedSlugField(models.CharField):
|
|
default_error_messages = {
|
|
'invalid': "Enter a valid 'slug' consisting of letters, numbers, underscores, dots or hyphens.",
|
|
}
|
|
default_validators = [
|
|
RegexValidator(re.compile(r'^[-\w.]+$'),
|
|
"Enter a valid 'slug' consisting of letters, numbers, underscores, dots or hyphens.", 'invalid')
|
|
]
|
|
|
|
|
|
class Timestampable(models.Model):
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
modified = models.DateTimeField(auto_now=True)
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class DiscardsIP(Timestampable):
|
|
ip = None
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class RequiresIP(Timestampable):
|
|
ip = models.GenericIPAddressField(blank=False,null=False)
|
|
class Meta:
|
|
abstract = True
|
|
|
|
class SiteBan(RequiresIP):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False, related_name='banned_by')
|
|
admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='banned')
|
|
lastRevision = models.DateTimeField(auto_now=True)
|
|
active = models.BooleanField(default=True, null=False)
|
|
notes = models.TextField(default='', blank=True, null=False)
|
|
def __str__(self):
|
|
return self.user.username
|
|
|
|
class Exercise(RequiresIP):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False, related_name='exercises')
|
|
title = models.CharField(default='', null=False, blank=False, max_length = 255)
|
|
description = models.TextField(default='', null=False, blank=True)
|
|
def __str__(self):
|
|
return str(self.title)+' - #'+str(self.pk)
|
|
|
|
class Submission(RequiresIP):
|
|
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False, related_name='submissions')
|
|
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, null=False, blank=False, related_name='submissions')
|
|
student = models.CharField(default='', null=False, blank=False, max_length = 255)
|
|
filename = DottedSlugField(default='', null=False, blank=False, max_length = 255)
|
|
code = models.TextField(default='', null=False, blank=False)
|
|
def __str__(self):
|
|
return str(self.student)+' - '+str(self.filename)+' - #'+str(self.pk)
|
|
|
|
class Results(DiscardsIP):
|
|
exercise = models.ForeignKey(Exercise, on_delete=models.CASCADE, null=False, blank=False, related_name='results')
|
|
label = models.CharField(default='', null=False, blank=False, max_length = 50)
|
|
data = models.BinaryField(default=None, null=True, blank=True)
|
|
def __str__(self):
|
|
return str(self.exercise.title)+' - '+str(self.label)+' - #'+str(self.pk)
|