From de5450d5e78802e77c397f0833a6f176c137ef81 Mon Sep 17 00:00:00 2001 From: Siobhan Tully Date: Fri, 21 Jun 2013 11:35:33 -0400 Subject: [PATCH] Added support for Generic Tags. Tags can be applied to Node, Site, Slice, Sliver. Adjusted relation_name for SliceTags to not conflict with generic tag. --- planetstack/core/admin.py | 17 ++++++++++++----- planetstack/core/models/__init__.py | 1 + planetstack/core/models/node.py | 3 +++ planetstack/core/models/site.py | 3 +++ planetstack/core/models/slice.py | 4 ++++ planetstack/core/models/slicetag.py | 2 +- planetstack/core/models/sliver.py | 4 +++- planetstack/core/models/tag.py | 21 +++++++++++++++++++++ 8 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 planetstack/core/models/tag.py diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py index aafa6e5..d947c6e 100644 --- a/planetstack/core/admin.py +++ b/planetstack/core/admin.py @@ -11,8 +11,9 @@ from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.contrib.auth.signals import user_logged_in from django.utils import timezone -import django_evolution +from django.contrib.contenttypes import generic +import django_evolution class ReadonlyTabularInline(admin.TabularInline): can_delete = False @@ -30,6 +31,11 @@ class ReadonlyTabularInline(admin.TabularInline): def has_add_permission(self, request): return False +class TagInline(generic.GenericTabularInline): + model = Tag + exclude = ['enacted'] + extra = 1 + class SliverInline(admin.TabularInline): model = Sliver fields = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'node', 'deploymentNetwork'] @@ -186,7 +192,7 @@ class SiteAdmin(PlanetStackBaseAdmin): ] list_display = ('name', 'login_base','site_url', 'enabled') filter_horizontal = ('deployments',) - inlines = [NodeInline, UserInline, SitePrivilegeInline] + inlines = [TagInline, NodeInline, UserInline, SitePrivilegeInline] search_fields = ['name'] def queryset(self, request): @@ -262,7 +268,7 @@ class SitePrivilegeAdmin(PlanetStackBaseAdmin): class SliceAdmin(PlanetStackBaseAdmin): fields = ['name', 'site', 'serviceClass', 'description', 'slice_url'] list_display = ('name', 'site','serviceClass', 'slice_url') - inlines = [SliverInline, SliceMembershipInline, SliceTagInline] + inlines = [SliverInline, SliceMembershipInline, TagInline, SliceTagInline] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'site': @@ -371,6 +377,7 @@ class ImageAdmin(admin.ModelAdmin): class NodeAdmin(admin.ModelAdmin): list_display = ('name', 'site', 'deployment') list_filter = ('deployment',) + inlines = [TagInline] class SliverForm(forms.ModelForm): @@ -389,6 +396,7 @@ class SliverAdmin(PlanetStackBaseAdmin): ('Sliver', {'fields': ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork']}) ] list_display = ['ip', 'instance_name', 'slice', 'numberCores', 'image', 'key', 'node', 'deploymentNetwork'] + inlines = [TagInline] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'slice': @@ -684,10 +692,9 @@ showAll = False admin.site.register(Deployment, DeploymentAdmin) admin.site.register(Site, SiteAdmin) admin.site.register(Slice, SliceAdmin) -#admin.site.register(Subnet) - if showAll: + admin.site.register(Tag) admin.site.register(Node, NodeAdmin) admin.site.register(SliceMembership, SliceMembershipAdmin) admin.site.register(SitePrivilege, SitePrivilegeAdmin) diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py index 4f8bd85..4e6cc83 100644 --- a/planetstack/core/models/__init__.py +++ b/planetstack/core/models/__init__.py @@ -1,5 +1,6 @@ from .plcorebase import PlCoreBase from .deployment import Deployment +from .tag import Tag from .site import Site from .site import SitePrivilege from .image import Image diff --git a/planetstack/core/models/node.py b/planetstack/core/models/node.py index fcc3a6a..0781609 100644 --- a/planetstack/core/models/node.py +++ b/planetstack/core/models/node.py @@ -3,6 +3,8 @@ from django.db import models from core.models import PlCoreBase from core.models import Site from core.models import Deployment +from core.models import Tag +from django.contrib.contenttypes import generic # Create your models here. @@ -10,5 +12,6 @@ class Node(PlCoreBase): name = models.CharField(max_length=200, unique=True, help_text="Name of the Node") site = models.ForeignKey(Site, related_name='nodes') deployment = models.ForeignKey(Deployment, related_name='nodes') + tags = generic.GenericRelation(Tag) def __unicode__(self): return u'%s' % (self.name) diff --git a/planetstack/core/models/site.py b/planetstack/core/models/site.py index 53a1a6c..5c84d1b 100644 --- a/planetstack/core/models/site.py +++ b/planetstack/core/models/site.py @@ -2,6 +2,8 @@ import os from django.db import models from core.models import PlCoreBase from core.models import Deployment +from core.models import Tag +from django.contrib.contenttypes import generic class Site(PlCoreBase): @@ -16,6 +18,7 @@ class Site(PlCoreBase): abbreviated_name = models.CharField(max_length=80) deployments = models.ManyToManyField(Deployment, blank=True, related_name='sites') + tags = generic.GenericRelation(Tag) def __unicode__(self): return u'%s' % (self.name) diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py index 63754e4..74815b2 100644 --- a/planetstack/core/models/slice.py +++ b/planetstack/core/models/slice.py @@ -6,6 +6,8 @@ from core.models import User from core.models import Role from core.models import Deployment from core.models import ServiceClass +from core.models import Tag +from django.contrib.contenttypes import generic # Create your models here. @@ -21,6 +23,8 @@ class Slice(PlCoreBase): router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id") subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id") + tags = generic.GenericRelation(Tag) + serviceClass = models.ForeignKey(ServiceClass, related_name = "slices", null=True, default=ServiceClass.get_default) creator = models.ForeignKey(User, related_name='slices', blank=True, null=True) diff --git a/planetstack/core/models/slicetag.py b/planetstack/core/models/slicetag.py index 38343b3..76cc669 100644 --- a/planetstack/core/models/slicetag.py +++ b/planetstack/core/models/slicetag.py @@ -4,7 +4,7 @@ from core.models import PlCoreBase from core.models import Slice class SliceTag(PlCoreBase): - slice = models.ForeignKey(Slice, related_name='tags') + slice = models.ForeignKey(Slice, related_name='slicetags') NAME_CHOICES = (('privatekey', 'Private Key'), ('publickey', 'Public Key')) name = models.CharField(help_text="The name of this tag", max_length=30, choices=NAME_CHOICES) diff --git a/planetstack/core/models/sliver.py b/planetstack/core/models/sliver.py index 13eb353..44a6af1 100644 --- a/planetstack/core/models/sliver.py +++ b/planetstack/core/models/sliver.py @@ -8,6 +8,8 @@ from core.models import Node from core.models import Site from core.models import Deployment from core.models import User +from core.models import Tag +from django.contrib.contenttypes import generic # Create your models here. class Sliver(PlCoreBase): @@ -22,7 +24,7 @@ class Sliver(PlCoreBase): node = models.ForeignKey(Node, related_name='slivers') deploymentNetwork = models.ForeignKey(Deployment, verbose_name='deployment', related_name='sliver_deploymentNetwork') numberCores = models.IntegerField(verbose_name="Number of Cores", help_text="Number of cores for sliver", default=0) - + tags = generic.GenericRelation(Tag) def __unicode__(self): return u'%s' % (self.instance_name) diff --git a/planetstack/core/models/tag.py b/planetstack/core/models/tag.py new file mode 100644 index 0000000..786b036 --- /dev/null +++ b/planetstack/core/models/tag.py @@ -0,0 +1,21 @@ +import os +from django.db import models +from core.models import PlCoreBase +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic + +# Create your models here. + +class Tag(PlCoreBase): + + name = models.SlugField(help_text="The name of this tag", max_length=128) + value = models.CharField(help_text="The value of this tag", max_length=1024) + + # The required fields to do a ObjectType lookup, and object_id assignment + content_type = models.ForeignKey(ContentType) + object_id = models.PositiveIntegerField() + content_object = generic.GenericForeignKey('content_type', 'object_id') + + def __unicode__(self): + return self.name + -- 2.43.0