model validators
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user