Added support for Generic Tags. Tags can be applied to Node, Site, Slice, Sliver...
authorSiobhan Tully <stully@verivue.com>
Fri, 21 Jun 2013 15:35:33 +0000 (11:35 -0400)
committerSiobhan Tully <stully@verivue.com>
Fri, 21 Jun 2013 15:35:33 +0000 (11:35 -0400)
planetstack/core/admin.py
planetstack/core/models/__init__.py
planetstack/core/models/node.py
planetstack/core/models/site.py
planetstack/core/models/slice.py
planetstack/core/models/slicetag.py
planetstack/core/models/sliver.py
planetstack/core/models/tag.py [new file with mode: 0644]

index aafa6e5..d947c6e 100644 (file)
@@ -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
 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
 
 class ReadonlyTabularInline(admin.TabularInline):
     can_delete = False
@@ -30,6 +31,11 @@ class ReadonlyTabularInline(admin.TabularInline):
     def has_add_permission(self, request):
         return False
 
     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']
 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',)
     ]
     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):
     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')
 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':
 
     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',)
 class NodeAdmin(admin.ModelAdmin):
     list_display = ('name', 'site', 'deployment')
     list_filter = ('deployment',)
+    inlines = [TagInline]
 
 
 class SliverForm(forms.ModelForm):
 
 
 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']
         ('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':
 
     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(Deployment, DeploymentAdmin)
 admin.site.register(Site, SiteAdmin)
 admin.site.register(Slice, SliceAdmin)
-#admin.site.register(Subnet)
-
 
 if showAll:
 
 if showAll:
+    admin.site.register(Tag)
     admin.site.register(Node, NodeAdmin)
     admin.site.register(SliceMembership, SliceMembershipAdmin)
     admin.site.register(SitePrivilege, SitePrivilegeAdmin)
     admin.site.register(Node, NodeAdmin)
     admin.site.register(SliceMembership, SliceMembershipAdmin)
     admin.site.register(SitePrivilege, SitePrivilegeAdmin)
index 4f8bd85..4e6cc83 100644 (file)
@@ -1,5 +1,6 @@
 from .plcorebase import PlCoreBase
 from .deployment import Deployment
 from .plcorebase import PlCoreBase
 from .deployment import Deployment
+from .tag import Tag
 from .site import Site
 from .site import SitePrivilege
 from .image import Image
 from .site import Site
 from .site import SitePrivilege
 from .image import Image
index fcc3a6a..0781609 100644 (file)
@@ -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 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.
 
 
 # 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')
     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)
 
     def __unicode__(self):  return u'%s' % (self.name)
index 53a1a6c..5c84d1b 100644 (file)
@@ -2,6 +2,8 @@ import os
 from django.db import models
 from core.models import PlCoreBase
 from core.models import Deployment
 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):
 
 
 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')
     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)
 
 
     def __unicode__(self):  return u'%s' % (self.name)
 
index 63754e4..74815b2 100644 (file)
@@ -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 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.
 
 
 # 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")
 
     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)
 
     serviceClass = models.ForeignKey(ServiceClass, related_name = "slices", null=True, default=ServiceClass.get_default)
     creator = models.ForeignKey(User, related_name='slices', blank=True, null=True)
 
index 38343b3..76cc669 100644 (file)
@@ -4,7 +4,7 @@ from core.models import PlCoreBase
 from core.models import Slice
 
 class SliceTag(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)
 
     NAME_CHOICES = (('privatekey', 'Private Key'), ('publickey', 'Public Key'))
     name = models.CharField(help_text="The name of this tag", max_length=30, choices=NAME_CHOICES)
index 13eb353..44a6af1 100644 (file)
@@ -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 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):
 
 # 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)
     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)
 
 
     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 (file)
index 0000000..786b036
--- /dev/null
@@ -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
+