1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
# Copyright (c) 2012, Walter Bender
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
def myblock(tw, x): # ignore second argument
''' Load journal stats to heap (Sugar only) '''
import os
import glob
from gettext import gettext as _
MAX = 19
DIROFINTEREST = 'datastore'
class ParseJournal():
''' Simple parser of datastore '''
def __init__(self):
self._dsdict = {}
self._activity_name = []
self._activity_count = []
homepath = os.environ['HOME']
for path in glob.glob(os.path.join(homepath, '.sugar', '*')):
if isdsdir(path):
self._dsdict[os.path.basename(path)] = []
dsobjdirs = glob.glob(
os.path.join(path, DIROFINTEREST, '??'))
for dsobjdir in dsobjdirs:
dsobjs = glob.glob(os.path.join(dsobjdir, '*'))
for dsobj in dsobjs:
self._dsdict[os.path.basename(path)].append({})
activity = isactivity(dsobj)
if not activity:
self._dsdict[os.path.basename(path)][-1][
'activity'] = 'media object'
else:
self._dsdict[os.path.basename(path)][-1][
'activity'] = activity
for k, v in self._dsdict.iteritems():
for a in v:
if 'activity' in a:
if a['activity'] in self._activity_name:
i = self._activity_name.index(a['activity'])
self._activity_count[i] += 1
else:
self._activity_name.append(a['activity'])
self._activity_count.append(1)
def get_sorted(self):
activity_tuples = []
for i in range(len(self._activity_name)):
activity_tuples.append((self._activity_name[i],
self._activity_count[i]))
sorted_tuples = sorted(activity_tuples, key=lambda x: x[1])
activity_list = []
count = 0
length = len(sorted_tuples)
for i in range(length):
if i < MAX:
activity_list.append([sorted_tuples[length - i - 1][0],
sorted_tuples[length - i - 1][1]])
else:
count += sorted_tuples[length - i - 1][1]
if count > 0:
activity_list.append([_('other'), count])
return activity_list
def hascomponent(path, component):
''' Return metadata attribute, if any '''
if not os.path.exists(os.path.join(path, 'metadata')):
return False
if not os.path.exists(os.path.join(path, 'metadata', component)):
return False
fd = open(os.path.join(path, 'metadata', component))
data = fd.readline()
fd.close()
if len(data) == 0:
return False
return data
def isactivity(path):
''' Return activity name '''
activity = hascomponent(path, 'activity')
if not activity:
return False
else:
return activity.split('.')[-1]
def isdsdir(path):
''' Only interested if it is a datastore directory '''
if not os.path.isdir(path):
return False
if not os.path.exists(os.path.join(path, DIROFINTEREST)):
return False
return True
data = ParseJournal()
activity_list = data.get_sorted()
for a in activity_list:
tw.lc.heap.append(a[0])
tw.lc.heap.append(a[1])
tw.lc.heap.append(activity_list[0][1])
return
|