diff options
| -rw-r--r-- | bitbake/lib/toaster/orm/admin.py | 23 | ||||
| -rw-r--r-- | bitbake/lib/toaster/orm/models.py | 27 |
2 files changed, 45 insertions, 5 deletions
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 @@ | |||
| 1 | from django.contrib import admin | 1 | from django.contrib import admin |
| 2 | from django.contrib.admin.filters import RelatedFieldListFilter | 2 | from django.contrib.admin.filters import RelatedFieldListFilter |
| 3 | from .models import Branch, LayerSource, ToasterSetting | 3 | from .models import BitbakeVersion, Release, LayerSource, ToasterSetting |
| 4 | from django.forms.widgets import Textarea | ||
| 5 | from django import forms | ||
| 6 | import django.db.models as models | ||
| 7 | |||
| 8 | from django.contrib.admin import widgets, helpers | ||
| 4 | 9 | ||
| 5 | class LayerSourceAdmin(admin.ModelAdmin): | 10 | class LayerSourceAdmin(admin.ModelAdmin): |
| 6 | pass | 11 | pass |
| 7 | 12 | ||
| 8 | class BranchAdmin(admin.ModelAdmin): | 13 | class BitbakeVersionAdmin(admin.ModelAdmin): |
| 14 | |||
| 15 | # we override the formfield for db URLField because of broken URL validation | ||
| 16 | |||
| 17 | def formfield_for_dbfield(self, db_field, **kwargs): | ||
| 18 | if isinstance(db_field, models.fields.URLField): | ||
| 19 | return forms.fields.CharField() | ||
| 20 | return super(BitbakeVersionAdmin, self).formfield_for_dbfield(db_field, **kwargs) | ||
| 21 | |||
| 22 | |||
| 23 | |||
| 24 | class ReleaseAdmin(admin.ModelAdmin): | ||
| 9 | pass | 25 | pass |
| 10 | 26 | ||
| 11 | class ToasterSettingAdmin(admin.ModelAdmin): | 27 | class ToasterSettingAdmin(admin.ModelAdmin): |
| 12 | pass | 28 | pass |
| 13 | 29 | ||
| 14 | admin.site.register(LayerSource, LayerSourceAdmin) | 30 | admin.site.register(LayerSource, LayerSourceAdmin) |
| 15 | admin.site.register(Branch, BranchAdmin) | 31 | admin.site.register(BitbakeVersion, BitbakeVersionAdmin) |
| 32 | admin.site.register(Release, ReleaseAdmin) | ||
| 16 | admin.site.register(ToasterSetting, ToasterSettingAdmin) | 33 | admin.site.register(ToasterSetting, ToasterSettingAdmin) |
| 17 | 34 | ||
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 | |||
| 24 | from django.utils.encoding import python_2_unicode_compatible | 24 | from django.utils.encoding import python_2_unicode_compatible |
| 25 | from django.utils import timezone | 25 | from django.utils import timezone |
| 26 | 26 | ||
| 27 | |||
| 28 | from django.core import validators | ||
| 29 | |||
| 30 | class GitURLValidator(validators.URLValidator): | ||
| 31 | import re | ||
| 32 | regex = re.compile( | ||
| 33 | r'^(?:ssh|git|http|ftp)s?://' # http:// or https:// | ||
| 34 | r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... | ||
| 35 | r'localhost|' # localhost... | ||
| 36 | r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|' # ...or ipv4 | ||
| 37 | r'\[?[A-F0-9]*:[A-F0-9:]+\]?)' # ...or ipv6 | ||
| 38 | r'(?::\d+)?' # optional port | ||
| 39 | r'(?:/?|[/?]\S+)$', re.IGNORECASE) | ||
| 40 | |||
| 41 | def GitURLField(**kwargs): | ||
| 42 | r = models.URLField(**kwargs) | ||
| 43 | for i in xrange(len(r.validators)): | ||
| 44 | if isinstance(r.validators[i], validators.URLValidator): | ||
| 45 | r.validators[i] = GitURLValidator() | ||
| 46 | return r | ||
| 47 | |||
| 48 | |||
| 27 | class ToasterSetting(models.Model): | 49 | class ToasterSetting(models.Model): |
| 28 | name = models.CharField(max_length=63) | 50 | name = models.CharField(max_length=63) |
| 29 | helptext = models.TextField() | 51 | helptext = models.TextField() |
| @@ -663,8 +685,9 @@ class LayerIndexLayerSource(LayerSource): | |||
| 663 | pass | 685 | pass |
| 664 | 686 | ||
| 665 | class BitbakeVersion(models.Model): | 687 | class BitbakeVersion(models.Model): |
| 688 | |||
| 666 | name = models.CharField(max_length=32, unique = True) | 689 | name = models.CharField(max_length=32, unique = True) |
| 667 | giturl = models.URLField() | 690 | giturl = GitURLField() |
| 668 | branch = models.CharField(max_length=32) | 691 | branch = models.CharField(max_length=32) |
| 669 | dirpath = models.CharField(max_length=255) | 692 | dirpath = models.CharField(max_length=255) |
| 670 | 693 | ||
| @@ -708,7 +731,7 @@ class Layer(models.Model): | |||
| 708 | name = models.CharField(max_length=100) | 731 | name = models.CharField(max_length=100) |
| 709 | local_path = models.FilePathField(max_length=255, null = True, default = None) | 732 | local_path = models.FilePathField(max_length=255, null = True, default = None) |
| 710 | layer_index_url = models.URLField() | 733 | layer_index_url = models.URLField() |
| 711 | vcs_url = models.URLField(default = None, null = True) | 734 | vcs_url = GitURLField(default = None, null = True) |
| 712 | vcs_web_file_base_url = models.URLField(null = True, default = None) | 735 | vcs_web_file_base_url = models.URLField(null = True, default = None) |
| 713 | 736 | ||
| 714 | summary = models.CharField(max_length=200, help_text='One-line description of the layer', null = True, default = None) | 737 | summary = models.CharField(max_length=200, help_text='One-line description of the layer', null = True, default = None) |
