fix bugs. refactor
[plstackapi.git] / planetstack / core / models / site.py
1 import os
2 from django.db import models
3 from core.models import PlCoreBase
4 #from core.models import Deployment
5 from core.models import Tag
6 from django.contrib.contenttypes import generic
7 from geoposition.fields import GeopositionField
8
9 class Site(PlCoreBase):
10     """
11         A logical grouping of Nodes that are co-located at the same geographic location, which also typically corresponds to the Nodes' location in the physical network.
12     """
13     tenant_id = models.CharField(null=True, blank=True, max_length=200, help_text="Keystone tenant id")
14     name = models.CharField(max_length=200, help_text="Name for this Site")
15     site_url = models.URLField(null=True, blank=True, max_length=512, help_text="Site's Home URL Page")
16     enabled = models.BooleanField(default=True, help_text="Status for this Site")
17     location = GeopositionField()
18     longitude = models.FloatField(null=True, blank=True)
19     latitude = models.FloatField(null=True, blank=True)
20     login_base = models.CharField(max_length=50, unique=True, help_text="Prefix for Slices associated with this Site")
21     is_public = models.BooleanField(default=True, help_text="Indicates the visibility of this site to other members")
22     abbreviated_name = models.CharField(max_length=80)
23
24     deployments = models.ManyToManyField('Deployment', blank=True, related_name='sites')
25     #deployments = models.ManyToManyField('Deployment', through='SiteDeployments', blank=True)
26     tags = generic.GenericRelation(Tag)
27
28     def __unicode__(self):  return u'%s' % (self.name)
29
30     def can_update(self, user):
31         if user.is_readonly:
32             return False
33         if user.is_admin:
34             return True
35         site_privs = SitePrivilege.objects.filter(user=user, site=self)
36         for site_priv in site_privs:
37             if site_priv.role.role == 'pi':
38                 return True
39         return False 
40
41     @staticmethod
42     def select_by_user(user):
43         if user.is_admin:
44             qs = Site.objects.all()
45         else:
46             site_ids = [sp.site.id for sp in SitePrivilege.objects.filter(user=user)]
47             site_ids.append(user.site.id)
48             qs = Site.objects.filter(id__in=site_ids)
49         return qs
50
51
52 class SiteRole(PlCoreBase):
53
54     ROLE_CHOICES = (('admin','Admin'),('pi','PI'),('tech','Tech'),('billing','Billing'))
55     role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
56
57     def __unicode__(self):  return u'%s' % (self.role)
58
59 class SitePrivilege(PlCoreBase):
60
61     user = models.ForeignKey('User', related_name='site_privileges')
62     site = models.ForeignKey('Site', related_name='site_privileges')
63     role = models.ForeignKey('SiteRole')
64
65     def __unicode__(self):  return u'%s %s %s' % (self.site, self.user, self.role)
66
67     def save(self, *args, **kwds):
68         super(SitePrivilege, self).save(*args, **kwds)
69
70     def delete(self, *args, **kwds):
71         super(SitePrivilege, self).delete(*args, **kwds)
72
73     def can_update(self, user):
74         return self.site.can_update(user)
75
76     @staticmethod
77     def select_by_user(user):
78         if user.is_admin:
79             qs = SitePrivilege.objects.all()
80         else:
81             sp_ids = [sp.id for sp in SitePrivilege.objects.filter(user=user)]
82             qs = SitePrivilege.objects.filter(id__in=sp_ids)
83         return qs
84
85 class Deployment(PlCoreBase):
86     name = models.CharField(max_length=200, unique=True, help_text="Name of the Deployment")
87     #sites = models.ManyToManyField('Site', through='SiteDeployments', blank=True)
88
89     def __unicode__(self):  return u'%s' % (self.name)
90
91
92 class DeploymentRole(PlCoreBase):
93
94     ROLE_CHOICES = (('admin','Admin'),)
95     role = models.CharField(choices=ROLE_CHOICES, unique=True, max_length=30)
96
97     def __unicode__(self):  return u'%s' % (self.role)
98
99 class DeploymentPrivilege(PlCoreBase):
100
101     user = models.ForeignKey('User', related_name='deployment_privileges')
102     deployment = models.ForeignKey('Deployment', related_name='deployment_privileges')
103     role = models.ForeignKey('DeploymentRole')
104
105     def __unicode__(self):  return u'%s %s %s' % (self.deployment, self.user, self.role)
106
107     def can_update(self, user):
108         if user.is_readonly:
109             return False
110         if user.is_admin:
111             return True
112         dprivs = DeploymentPrivilege.objects.filter(user=user)
113         for dpriv in dprivs:
114             if dpriv.role.role == 'admin':
115                 return True
116         return False
117
118     @staticmethod
119     def select_by_user(user):
120         if user.is_admin:
121             qs = DeploymentPrivilege.objects.all()
122         else:
123             dpriv_ids = [dp.id for dp in DeploymentPrivilege.objects.filter(user=user)]
124             qs = DeploymentPrivilege.objects.filter(id__in=dpriv_ids)
125         return qs 
126
127 class SiteDeployments(PlCoreBase):
128     site = models.ForeignKey(Site)
129     deployment = models.ForeignKey(Deployment)
130
131     #class Meta:
132     #    db_table = 'core_site_deployments'
133     #    #auto_created = Site
134