summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Reports/reports/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Server/Reports/reports/models.py')
-rw-r--r--src/lib/Server/Reports/reports/models.py102
1 files changed, 58 insertions, 44 deletions
diff --git a/src/lib/Server/Reports/reports/models.py b/src/lib/Server/Reports/reports/models.py
index 1963a9090..c2be40870 100644
--- a/src/lib/Server/Reports/reports/models.py
+++ b/src/lib/Server/Reports/reports/models.py
@@ -29,6 +29,7 @@ TYPE_CHOICES = (
(TYPE_EXTRA, 'Extra'),
)
+
def convert_entry_type_to_id(type_name):
"""Convert a entry type to its entry id"""
for e_id, e_name in TYPE_CHOICES:
@@ -36,23 +37,25 @@ def convert_entry_type_to_id(type_name):
return e_id
return -1
+
class ClientManager(models.Manager):
"""Extended client manager functions."""
def active(self, timestamp=None):
- """returns a set of clients that have been created and have not yet been
- expired as of optional timestmamp argument. Timestamp should be a
- datetime object."""
-
+ """returns a set of clients that have been created and have not
+ yet been expired as of optional timestmamp argument. Timestamp
+ should be a datetime object."""
+
if timestamp == None:
timestamp = datetime.now()
elif not isinstance(timestamp, datetime):
raise ValueError, 'Expected a datetime object'
else:
try:
- timestamp = datetime(*strptime(timestamp, "%Y-%m-%d %H:%M:%S")[0:6])
+ timestamp = datetime(*strptime(timestamp,
+ "%Y-%m-%d %H:%M:%S")[0:6])
except ValueError:
return self.none()
-
+
return self.filter(Q(expiration__gt=timestamp) | Q(expiration__isnull=True),
creation__lt=timestamp)
@@ -65,25 +68,27 @@ class Client(models.Model):
null=True, blank=True,
related_name="parent_client")
expiration = models.DateTimeField(blank=True, null=True)
-
+
def __str__(self):
return self.name
objects = ClientManager()
-
+
class Admin:
pass
+
class Ping(models.Model):
"""Represents a ping of a client (sparsely)."""
client = models.ForeignKey(Client, related_name="pings")
starttime = models.DateTimeField()
endtime = models.DateTimeField()
- status = models.CharField(max_length=4, choices=PING_CHOICES)#up/down
+ status = models.CharField(max_length=4, choices=PING_CHOICES) # up/down
class Meta:
get_latest_by = 'endtime'
-
+
+
class InteractiveManager(models.Manager):
"""Manages interactions objects."""
@@ -94,31 +99,31 @@ class InteractiveManager(models.Manager):
This method uses aggregated queries to return a ValuesQueryDict object.
Faster then raw sql since this is executed as a single query.
"""
-
- return self.values('client').annotate(max_timestamp=Max('timestamp')).values()
- def interaction_per_client(self, maxdate = None, active_only=True):
+ return list(self.values('client').annotate(max_timestamp=Max('timestamp')).values())
+
+ def interaction_per_client(self, maxdate=None, active_only=True):
"""
Returns the most recent interactions for clients as of a date
Arguments:
maxdate -- datetime object. Most recent date to pull. (dafault None)
active_only -- Include only active clients (default True)
-
+
"""
- if maxdate and not isinstance(maxdate,datetime):
+ if maxdate and not isinstance(maxdate, datetime):
raise ValueError, 'Expected a datetime object'
- return self.filter(id__in = self.get_interaction_per_client_ids(maxdate, active_only))
+ return self.filter(id__in=self.get_interaction_per_client_ids(maxdate, active_only))
- def get_interaction_per_client_ids(self, maxdate = None, active_only=True):
+ def get_interaction_per_client_ids(self, maxdate=None, active_only=True):
"""
Returns the ids of most recent interactions for clients as of a date.
Arguments:
maxdate -- datetime object. Most recent date to pull. (dafault None)
active_only -- Include only active clients (default True)
-
+
"""
from django.db import connection
cursor = connection.cursor()
@@ -127,10 +132,10 @@ class InteractiveManager(models.Manager):
sql = 'select reports_interaction.id, x.client_id from (select client_id, MAX(timestamp) ' + \
'as timer from reports_interaction'
if maxdate:
- if not isinstance(maxdate,datetime):
+ if not isinstance(maxdate, datetime):
raise ValueError, 'Expected a datetime object'
sql = sql + " where timestamp <= '%s' " % maxdate
- cfilter = "(expiration is null or expiration > '%s') and creation <= '%s'" % (maxdate,maxdate)
+ cfilter = "(expiration is null or expiration > '%s') and creation <= '%s'" % (maxdate, maxdate)
sql = sql + ' GROUP BY client_id) x, reports_interaction where ' + \
'reports_interaction.client_id = x.client_id AND reports_interaction.timestamp = x.timer'
if active_only:
@@ -144,16 +149,17 @@ class InteractiveManager(models.Manager):
pass
return []
+
class Interaction(models.Model):
"""Models each reconfiguration operation interaction between client and server."""
client = models.ForeignKey(Client, related_name="interactions",)
- timestamp = models.DateTimeField()#Timestamp for this record
- state = models.CharField(max_length=32)#good/bad/modified/etc
- repo_rev_code = models.CharField(max_length=64)#repo revision at time of interaction
- client_version = models.CharField(max_length=32)#Client Version
- goodcount = models.IntegerField()#of good config-items
- totalcount = models.IntegerField()#of total config-items
- server = models.CharField(max_length=256) # Name of the server used for the interaction
+ timestamp = models.DateTimeField() # Timestamp for this record
+ state = models.CharField(max_length=32) # good/bad/modified/etc
+ repo_rev_code = models.CharField(max_length=64) # repo revision at time of interaction
+ client_version = models.CharField(max_length=32) # Client Version
+ goodcount = models.IntegerField() # of good config-items
+ totalcount = models.IntegerField() # of total config-items
+ server = models.CharField(max_length=256) # Name of the server used for the interaction
bad_entries = models.IntegerField(default=-1)
modified_entries = models.IntegerField(default=-1)
extra_entries = models.IntegerField(default=-1)
@@ -163,25 +169,25 @@ class Interaction(models.Model):
def percentgood(self):
if not self.totalcount == 0:
- return (self.goodcount/float(self.totalcount))*100
+ return (self.goodcount / float(self.totalcount)) * 100
else:
return 0
def percentbad(self):
if not self.totalcount == 0:
- return ((self.totalcount-self.goodcount)/(float(self.totalcount)))*100
+ return ((self.totalcount - self.goodcount) / (float(self.totalcount))) * 100
else:
return 0
-
+
def isclean(self):
if (self.bad_entry_count() == 0 and self.goodcount == self.totalcount):
return True
else:
return False
-
+
def isstale(self):
- if (self == self.client.current_interaction):#Is Mostrecent
- if(datetime.now()-self.timestamp > timedelta(hours=25) ):
+ if (self == self.client.current_interaction): # Is Mostrecent
+ if(datetime.now() - self.timestamp > timedelta(hours=25)):
return True
else:
return False
@@ -194,10 +200,11 @@ class Interaction(models.Model):
return True
else:
return False
+
def save(self):
- super(Interaction, self).save() #call the real save...
+ super(Interaction, self).save() # call the real save...
self.client.current_interaction = self.client.interactions.latest()
- self.client.save()#save again post update
+ self.client.save() # save again post update
def delete(self):
'''Override the default delete. Allows us to remove Performance items'''
@@ -239,35 +246,38 @@ class Interaction(models.Model):
self.extra_entries = Entries_interactions.objects.filter(interaction=self, type=TYPE_EXTRA).count()
self.save()
return self.extra_entries
-
+
objects = InteractiveManager()
class Admin:
list_display = ('client', 'timestamp', 'state')
list_filter = ['client', 'timestamp']
pass
+
class Meta:
get_latest_by = 'timestamp'
ordering = ['-timestamp']
unique_together = ("client", "timestamp")
+
class Reason(models.Model):
"""reason why modified or bad entry did not verify, or changed."""
owner = models.TextField(max_length=128, blank=True)
current_owner = models.TextField(max_length=128, blank=True)
group = models.TextField(max_length=128, blank=True)
current_group = models.TextField(max_length=128, blank=True)
- perms = models.TextField(max_length=4, blank=True)#txt fixes typing issue
+ perms = models.TextField(max_length=4, blank=True) # txt fixes typing issue
current_perms = models.TextField(max_length=4, blank=True)
- status = models.TextField(max_length=3, blank=True)#on/off/(None)
- current_status = models.TextField(max_length=1, blank=True)#on/off/(None)
+ status = models.TextField(max_length=3, blank=True) # on/off/(None)
+ current_status = models.TextField(max_length=1, blank=True) # on/off/(None)
to = models.TextField(max_length=256, blank=True)
current_to = models.TextField(max_length=256, blank=True)
version = models.TextField(max_length=128, blank=True)
current_version = models.TextField(max_length=128, blank=True)
- current_exists = models.BooleanField()#False means its missing. Default True
+ current_exists = models.BooleanField() # False means its missing. Default True
current_diff = models.TextField(max_length=1280, blank=True)
is_binary = models.BooleanField(default=False)
+
def _str_(self):
return "Reason"
@@ -278,7 +288,7 @@ class Reason(models.Model):
cursor = connection.cursor()
cursor.execute('delete from reports_reason where not exists (select rei.id from reports_entries_interactions rei where rei.reason_id = reports_reason.id)')
transaction.set_dirty()
-
+
class Entries(models.Model):
"""Contains all the entries feed by the client."""
@@ -295,19 +305,22 @@ class Entries(models.Model):
cursor = connection.cursor()
cursor.execute('delete from reports_entries where not exists (select rei.id from reports_entries_interactions rei where rei.entry_id = reports_entries.id)')
transaction.set_dirty()
-
+
+
class Entries_interactions(models.Model):
"""Define the relation between the reason, the interaction and the entry."""
entry = models.ForeignKey(Entries)
reason = models.ForeignKey(Reason)
interaction = models.ForeignKey(Interaction)
type = models.IntegerField(choices=TYPE_CHOICES)
-
+
+
class Performance(models.Model):
"""Object representing performance data for any interaction."""
interaction = models.ManyToManyField(Interaction, related_name="performance_items")
metric = models.CharField(max_length=128)
value = models.DecimalField(max_digits=32, decimal_places=16)
+
def __str__(self):
return self.metric
@@ -318,7 +331,8 @@ class Performance(models.Model):
cursor = connection.cursor()
cursor.execute('delete from reports_performance where not exists (select ri.id from reports_performance_interaction ri where ri.performance_id = reports_performance.id)')
transaction.set_dirty()
-
+
+
class InternalDatabaseVersion(models.Model):
"""Object that tell us to witch version is the database."""
version = models.IntegerField()