diff options
Diffstat (limited to 'sugar_network/node/stats_node.py')
-rw-r--r-- | sugar_network/node/stats_node.py | 82 |
1 files changed, 25 insertions, 57 deletions
diff --git a/sugar_network/node/stats_node.py b/sugar_network/node/stats_node.py index 6c24278..e21a8bd 100644 --- a/sugar_network/node/stats_node.py +++ b/sugar_network/node/stats_node.py @@ -76,6 +76,7 @@ class Sniffer(object): class _ObjectStats(object): + downloads = 0 reviews = 0 rating = 0 @@ -92,6 +93,12 @@ class _Stats(object): self._volume = volume self._directory = volume[self.RESOURCE] + def __getitem__(self, guid): + result = self.active.get(guid) + if result is None: + result = self.active[guid] = _ObjectStats() + return result + def log(self, request): context = None @@ -122,20 +129,8 @@ class _Stats(object): elif request.method == 'POST': context = parse_context(request.content) - if request.principal: - stats = self._stats['user'] - if request.method in ('POST', 'PUT', 'DELETE'): - stats.effective.add(request.principal) - stats.active.add(request.principal) - if context: - return self._stats['context'].active_object(context) - - def active_object(self, guid): - result = self.active.get(guid) - if result is None: - result = self.active[guid] = _ObjectStats() - return result + return self._stats['context'][context] def commit(self): pass @@ -144,10 +139,6 @@ class _Stats(object): class _ResourceStats(_Stats): total = 0 - created = 0 - updated = 0 - deleted = 0 - viewed = 0 def __init__(self, stats, volume): _Stats.__init__(self, stats, volume) @@ -156,32 +147,29 @@ class _ResourceStats(_Stats): def log(self, request): result = _Stats.log(self, request) - if request.method == 'GET': - if request.guid and not request.prop: - self.viewed += 1 - elif request.method == 'PUT': - self.updated += 1 - elif request.method == 'POST': + if request.method == 'POST': self.total += 1 - self.created += 1 elif request.method == 'DELETE': self.total -= 1 - self.deleted += 1 return result def commit(self): if type(self.active) is dict: for guid, stats in self.active.items(): - if not stats.reviews: + if not stats.reviews and not stats.downloads: continue - reviews, rating = self._directory.get(guid)['reviews'] - reviews += stats.reviews - rating += stats.rating - self._directory.update(guid, { - 'reviews': [reviews, rating], - 'rating': int(round(float(rating) / reviews)), - }) + doc = self._directory.get(guid) + updates = {} + if stats.downloads: + updates['downloads'] = stats.downloads + doc['downloads'] + if stats.reviews: + reviews, rating = doc['reviews'] + reviews += stats.reviews + rating += stats.rating + updates['reviews'] = [reviews, rating] + updates['rating'] = int(round(float(rating) / reviews)) + self._directory.update(guid, updates) result = {} for attr in dir(self): @@ -193,11 +181,6 @@ class _ResourceStats(_Stats): if type(value) in (int, long): result[attr] = value - self.created = 0 - self.updated = 0 - self.deleted = 0 - self.viewed = 0 - return result @@ -205,17 +188,6 @@ class _UserStats(_ResourceStats): RESOURCE = 'user' - def __init__(self, stats, volume): - _ResourceStats.__init__(self, stats, volume) - self.active = set() - self.effective = set() - - def commit(self): - result = _ResourceStats.commit(self) - self.active.clear() - self.effective.clear() - return result - class _ContextStats(_ResourceStats): @@ -250,6 +222,8 @@ class _ImplementationStats(_Stats): if request.method == 'GET': if request.prop == 'data': + context = self._volume['implementation'].get(request.guid) + self._stats['context'][context.context].downloads += 1 self._stats['context'].downloaded += 1 elif request.method == 'POST': self._stats['context'].released += 1 @@ -280,7 +254,7 @@ class _ReviewStats(_ResourceStats): if request.method == 'POST': if request.content.get('artifact'): artifact = self._stats['artifact'] - stats = artifact.active_object(request.content['artifact']) + stats = artifact[request.content['artifact']] artifact.reviewed += 1 else: stats = context @@ -300,9 +274,6 @@ class _FeedbackStats(_ResourceStats): OWNERS = ['context'] solutions = 0 - solved = 0 - rejected = 0 - commented = 0 def __init__(self, stats, volume): @@ -317,16 +288,12 @@ class _FeedbackStats(_ResourceStats): if request.method in ('POST', 'PUT'): if 'solution' in request.content: if request.content['solution'] is None: - self.rejected += 1 self.solutions -= 1 else: - self.solved += 1 self.solutions += 1 def commit(self): result = _ResourceStats.commit(self) - self.solved = 0 - self.rejected = 0 self.commented = 0 return result @@ -361,6 +328,7 @@ class _ArtifactStats(_ResourceStats): if request.method == 'GET': if request.prop == 'data': + self[request.guid].downloads += 1 self.downloaded += 1 def commit(self): |