model validators
This commit is contained in:
parent
de0ad4b210
commit
8563785746
@ -1,22 +1,35 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.core.validators import RegexValidator, validate_email, URLValidator
|
||||||
|
|
||||||
from djeuscan.managers import PackageManager, VersionLogManager, \
|
from djeuscan.managers import PackageManager, VersionLogManager, \
|
||||||
EuscanResultManager
|
EuscanResultManager
|
||||||
|
|
||||||
|
|
||||||
|
validate_category = RegexValidator("^\w+?-\w+?$")
|
||||||
|
validate_name = RegexValidator("^\S+?$")
|
||||||
|
validate_revision = RegexValidator("^r\d+?$")
|
||||||
|
validate_url = URLValidator()
|
||||||
|
|
||||||
|
|
||||||
class Herd(models.Model):
|
class Herd(models.Model):
|
||||||
"""
|
"""
|
||||||
A herd is a collection of packages
|
A herd is a collection of packages
|
||||||
"""
|
"""
|
||||||
|
|
||||||
herd = models.CharField(max_length=128, unique=True)
|
herd = models.CharField(max_length=128, unique=True,
|
||||||
email = models.CharField(max_length=128, blank=True, null=True)
|
validators=[validate_name])
|
||||||
|
email = models.CharField(max_length=128, blank=True, null=True,
|
||||||
|
validators=[validate_email])
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
if self.email:
|
if self.email:
|
||||||
return '%s <%s>' % (self.herd, self.email)
|
return '%s <%s>' % (self.herd, self.email)
|
||||||
return self.herd
|
return self.herd
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(Herd, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class Maintainer(models.Model):
|
class Maintainer(models.Model):
|
||||||
"""
|
"""
|
||||||
@ -24,21 +37,26 @@ class Maintainer(models.Model):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
email = models.CharField(max_length=128, unique=True)
|
email = models.CharField(max_length=128, unique=True,
|
||||||
|
validators=[validate_email])
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return '%s <%s>' % (self.name, self.email)
|
return '%s <%s>' % (self.name, self.email)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(Maintainer, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class Package(models.Model):
|
class Package(models.Model):
|
||||||
"""
|
"""
|
||||||
A portage package
|
A portage package
|
||||||
"""
|
"""
|
||||||
|
|
||||||
category = models.CharField(max_length=128)
|
category = models.CharField(max_length=128, validators=[validate_category])
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128, validators=[validate_name])
|
||||||
description = models.TextField(blank=True)
|
description = models.TextField(blank=True)
|
||||||
homepage = models.TextField(blank=True)
|
homepage = models.TextField(blank=True, validators=[validate_url])
|
||||||
herds = models.ManyToManyField(Herd, blank=True)
|
herds = models.ManyToManyField(Herd, blank=True)
|
||||||
maintainers = models.ManyToManyField(Maintainer, blank=True)
|
maintainers = models.ManyToManyField(Maintainer, blank=True)
|
||||||
|
|
||||||
@ -69,6 +87,10 @@ class Package(models.Model):
|
|||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return '%s/%s' % (self.category, self.name)
|
return '%s/%s' % (self.category, self.name)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(Package, self).save(*args, **kwargs)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def homepages(self):
|
def homepages(self):
|
||||||
return self.homepage.split(' ')
|
return self.homepage.split(' ')
|
||||||
@ -84,7 +106,8 @@ class Version(models.Model):
|
|||||||
revision = models.CharField(max_length=128)
|
revision = models.CharField(max_length=128)
|
||||||
version = models.CharField(max_length=128)
|
version = models.CharField(max_length=128)
|
||||||
packaged = models.BooleanField()
|
packaged = models.BooleanField()
|
||||||
overlay = models.CharField(max_length=128, default='gentoo', db_index=True)
|
overlay = models.CharField(max_length=128, default='gentoo', db_index=True,
|
||||||
|
validators=[validate_name])
|
||||||
urls = models.TextField(blank=True)
|
urls = models.TextField(blank=True)
|
||||||
alive = models.BooleanField(default=True, db_index=True)
|
alive = models.BooleanField(default=True, db_index=True)
|
||||||
|
|
||||||
@ -97,6 +120,10 @@ class Version(models.Model):
|
|||||||
self.revision, self.slot, self.overlay
|
self.revision, self.slot, self.overlay
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(Version, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class VersionLog(models.Model):
|
class VersionLog(models.Model):
|
||||||
VERSION_ADDED = 1
|
VERSION_ADDED = 1
|
||||||
@ -112,7 +139,8 @@ class VersionLog(models.Model):
|
|||||||
revision = models.CharField(max_length=128)
|
revision = models.CharField(max_length=128)
|
||||||
version = models.CharField(max_length=128)
|
version = models.CharField(max_length=128)
|
||||||
packaged = models.BooleanField()
|
packaged = models.BooleanField()
|
||||||
overlay = models.CharField(max_length=128, default='gentoo')
|
overlay = models.CharField(max_length=128, default='gentoo',
|
||||||
|
validators=[validate_name])
|
||||||
action = models.IntegerField(choices=VERSION_ACTIONS)
|
action = models.IntegerField(choices=VERSION_ACTIONS)
|
||||||
|
|
||||||
objects = VersionLogManager()
|
objects = VersionLogManager()
|
||||||
@ -126,6 +154,10 @@ class VersionLog(models.Model):
|
|||||||
)
|
)
|
||||||
return txt
|
return txt
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(VersionLog, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def tag(self):
|
def tag(self):
|
||||||
return '%s-%s:%s-[%s]' % (self.version, self.revision, self.slot,
|
return '%s-%s:%s-[%s]' % (self.version, self.revision, self.slot,
|
||||||
self.overlay)
|
self.overlay)
|
||||||
@ -141,6 +173,10 @@ class EuscanResult(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
get_latest_by = "datetime"
|
get_latest_by = "datetime"
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(EuscanResult, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class Log(models.Model):
|
class Log(models.Model):
|
||||||
"""
|
"""
|
||||||
@ -174,6 +210,10 @@ class Log(models.Model):
|
|||||||
self.n_versions_overlay, self.n_versions_upstream
|
self.n_versions_overlay, self.n_versions_upstream
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.full_clean()
|
||||||
|
super(Log, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class WorldLog(Log):
|
class WorldLog(Log):
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
@ -181,7 +221,7 @@ class WorldLog(Log):
|
|||||||
|
|
||||||
|
|
||||||
class CategoryLog(Log):
|
class CategoryLog(Log):
|
||||||
category = models.CharField(max_length=128)
|
category = models.CharField(max_length=128, validators=[validate_category])
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u'%s %s' % (self.category, Log.__unicode__(self))
|
return u'%s %s' % (self.category, Log.__unicode__(self))
|
||||||
|
@ -8,7 +8,9 @@ import factory
|
|||||||
from djeuscan.models import Herd, Maintainer, Package, Version, EuscanResult
|
from djeuscan.models import Herd, Maintainer, Package, Version, EuscanResult
|
||||||
|
|
||||||
|
|
||||||
def random_string(length=10):
|
def random_string(length=None):
|
||||||
|
if length is None:
|
||||||
|
length = random.randint(1, 30)
|
||||||
return "".join([random.choice(letters) for _ in range(length)])
|
return "".join([random.choice(letters) for _ in range(length)])
|
||||||
|
|
||||||
|
|
||||||
@ -29,7 +31,9 @@ class MaintainerFactory(factory.Factory):
|
|||||||
class PackageFactory(factory.Factory):
|
class PackageFactory(factory.Factory):
|
||||||
FACTORY_FOR = Package
|
FACTORY_FOR = Package
|
||||||
|
|
||||||
category = factory.LazyAttribute(lambda a: random_string())
|
category = factory.LazyAttribute(
|
||||||
|
lambda a: "%s-%s" % (random_string(), random_string())
|
||||||
|
)
|
||||||
name = factory.LazyAttribute(lambda a: random_string())
|
name = factory.LazyAttribute(lambda a: random_string())
|
||||||
description = "This is a test package"
|
description = "This is a test package"
|
||||||
homepage = "http://testpackage.com"
|
homepage = "http://testpackage.com"
|
||||||
|
@ -6,6 +6,7 @@ from datetime import datetime
|
|||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.db import IntegrityError
|
from django.db import IntegrityError
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from django.utils.timezone import utc
|
from django.utils.timezone import utc
|
||||||
|
|
||||||
from djeuscan.models import Package, EuscanResult
|
from djeuscan.models import Package, EuscanResult
|
||||||
@ -24,7 +25,7 @@ class VersionModelTests(TestCase):
|
|||||||
package = PackageFactory.create()
|
package = PackageFactory.create()
|
||||||
VersionFactory.create(package=package)
|
VersionFactory.create(package=package)
|
||||||
|
|
||||||
with self.assertRaises(IntegrityError):
|
with self.assertRaises((IntegrityError, ValidationError)):
|
||||||
VersionFactory.create(package=package)
|
VersionFactory.create(package=package)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user