From 97c0beb0eb127f05e70a9c3a7202b0cba16d7152 Mon Sep 17 00:00:00 2001 From: Alexandru DAMIAN Date: Thu, 9 Oct 2014 12:37:30 +0100 Subject: bitbake: toaster: use modified validators for git url fields The default django URL validator marks git URLs as not valid, so we change the default validators to a URLValidator-derived that adds git and ssh protocol schemas and inhibits the frontend URL validator. (Bitbake rev: 7223619505c0939358287e5baf84da0a91cb8d34) Signed-off-by: Alexandru DAMIAN Signed-off-by: Richard Purdie --- bitbake/lib/toaster/orm/admin.py | 23 ++++++++++++++++++++--- bitbake/lib/toaster/orm/models.py | 27 +++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 5 deletions(-) (limited to 'bitbake/lib/toaster/orm') diff --git a/bitbake/lib/toaster/orm/admin.py b/bitbake/lib/toaster/orm/admin.py index 9383630486..6739980bfc 100644 --- a/bitbake/lib/toaster/orm/admin.py +++ b/bitbake/lib/toaster/orm/admin.py @@ -1,17 +1,34 @@ from django.contrib import admin from django.contrib.admin.filters import RelatedFieldListFilter -from .models import Branch, LayerSource, ToasterSetting +from .models import BitbakeVersion, Release, LayerSource, ToasterSetting +from django.forms.widgets import Textarea +from django import forms +import django.db.models as models + +from django.contrib.admin import widgets, helpers class LayerSourceAdmin(admin.ModelAdmin): pass -class BranchAdmin(admin.ModelAdmin): +class BitbakeVersionAdmin(admin.ModelAdmin): + + # we override the formfield for db URLField because of broken URL validation + + def formfield_for_dbfield(self, db_field, **kwargs): + if isinstance(db_field, models.fields.URLField): + return forms.fields.CharField() + return super(BitbakeVersionAdmin, self).formfield_for_dbfield(db_field, **kwargs) + + + +class ReleaseAdmin(admin.ModelAdmin): pass class ToasterSettingAdmin(admin.ModelAdmin): pass admin.site.register(LayerSource, LayerSourceAdmin) -admin.site.register(Branch, BranchAdmin) +admin.site.register(BitbakeVersion, BitbakeVersionAdmin) +admin.site.register(Release, ReleaseAdmin) admin.site.register(ToasterSetting, ToasterSettingAdmin) diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py index 3c7f6611dc..309f8ea5be 100644 --- a/bitbake/lib/toaster/orm/models.py +++ b/bitbake/lib/toaster/orm/models.py @@ -24,6 +24,28 @@ from django.db.models import F from django.utils.encoding import python_2_unicode_compatible from django.utils import timezone + +from django.core import validators + +class GitURLValidator(validators.URLValidator): + import re + regex = re.compile( + r'^(?:ssh|git|http|ftp)s?://' # http:// or https:// + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... + r'localhost|' # localhost... + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # ...or ipv4 + r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # ...or ipv6 + r'(?::\d+)?' # optional port + r'(?:/?|[/?]\S+)$', re.IGNORECASE) + +def GitURLField(**kwargs): + r = models.URLField(**kwargs) + for i in xrange(len(r.validators)): + if isinstance(r.validators[i], validators.URLValidator): + r.validators[i] = GitURLValidator() + return r + + class ToasterSetting(models.Model): name = models.CharField(max_length=63) helptext = models.TextField() @@ -663,8 +685,9 @@ class LayerIndexLayerSource(LayerSource): pass class BitbakeVersion(models.Model): + name = models.CharField(max_length=32, unique = True) - giturl = models.URLField() + giturl = GitURLField() branch = models.CharField(max_length=32) dirpath = models.CharField(max_length=255) @@ -708,7 +731,7 @@ class Layer(models.Model): name = models.CharField(max_length=100) local_path = models.FilePathField(max_length=255, null = True, default = None) layer_index_url = models.URLField() - vcs_url = models.URLField(default = None, null = True) + vcs_url = GitURLField(default = None, null = True) vcs_web_file_base_url = models.URLField(null = True, default = None) summary = models.CharField(max_length=200, help_text='One-line description of the layer', null = True, default = None) -- cgit v1.2.3-54-g00ecf