blob: adbc77e658a8d104c7c276d5c2e41efeb5ac78d3 [file] [log] [blame]
from core.models.slice import Slice, SlicePrivilege
from plus import PlusObjectMixin
class SlicePlus(Slice, PlusObjectMixin):
class Meta:
proxy = True
def getSliceInfo(self, user=None):
used_sites = {}
used_deployments = {}
sliverCount = 0
for sliver in self.slivers.all():
site = sliver.node.site_deployment.site
deployment = sliver.node.site_deployment.deployment
used_sites[site.name] = used_sites.get(site.name, 0) + 1
used_deployments[deployment.name] = used_deployments.get(deployment.name, 0) + 1
sliverCount = sliverCount + 1
roles = []
if (user!=None):
roles = [x.role.role for x in self.sliceprivileges.filter(user=user)]
return {"sitesUsed": used_sites,
"deploymentsUsed": used_deployments,
"sliverCount": sliverCount,
"siteCount": len(used_sites.keys()),
"roles": roles}
@property
def site_allocation(self):
return self.getSliceInfo()["sitesUsed"]
@site_allocation.setter
def site_allocation(self, value):
print "XXX set sitesUsed to", value
@property
def users(self):
user_ids = []
for priv in SlicePrivilege.objects.filter(slice=self):
if not (priv.user.id in user_ids):
user_ids.append(priv.user.id)
return user_ids
@users.setter
def users(self, value):
print "XXX set users to", value
@property
def network_ports(self):
# XXX this assumes there is only one network that can have ports bound
# to it for a given slice. This is intended for the tenant view, which
# will obey this field.
networkPorts = ""
for networkSlice in self.networkslices.all():
network = networkSlice.network
if network.ports:
networkPorts = network.ports
return networkPorts
@network_ports.setter
def network_ports(self, value):
print "XXX set networkPorts to", value
@staticmethod
def select_by_user(user):
if user.is_admin:
qs = SlicePlus.objects.all()
else:
slice_ids = [sp.slice.id for sp in SlicePrivilege.objects.filter(user=user)]
qs = SlicePlus.objects.filter(id__in=slice_ids)
return qs