1
from . import launchpad, stats
3
from operator import itemgetter
4
from datetime import datetime
7
def __init__(self, lpid=None, email=None, name=None):
16
if type(email) != unicode:
17
email = unicode(email, errors="replace")
18
self.emails += [ email ]
20
if type(name) != unicode:
21
name = unicode(name, errors="replace")
22
self.names += [ name ]
24
def add_email(self, email):
26
if type(email) != unicode:
27
email = unicode(email, errors="replace")
28
if not email in self.emails:
29
self.emails += [ email ]
31
def add_name(self, name):
33
if type(name) != unicode:
34
name = unicode(name, errors="replace")
35
if not name in self.names:
36
self.names += [ name ]
39
class PersonList(object):
44
def __init__(self, lp=None):
45
data = stats.read_data(self.filename)
49
person.__dict__ = entry
50
self.all_folks += [ person ]
54
for person in self.all_folks:
55
data += [ person.__dict__ ]
56
stats.dump(self.filename, data)
59
return len(self.all_folks)
61
def number_of_uploaders(self):
62
return len(self.get_uploaders())
64
def get_non_uploaders(self):
65
return filter(lambda a: not getattr(a, "uploader", False),
68
def get_uploaders(self):
69
return filter(lambda a: getattr(a, "uploader", False),
72
def find(self, lpid=None, email=None, name=None):
74
matches = filter(lambda a: a.lpid == lpid, self.all_folks)
78
matches = filter(lambda a: email in a.emails, self.all_folks)
82
matches = filter(lambda a: name in a.names, self.all_folks)
87
def add(self, lpid=None, email=None, name=None):
88
person = self.find(lpid, email, name)
90
person = Person(lpid, email, name)
91
self.all_folks += [person]
94
self.lp = launchpad.lp_login("stats")
95
person.lpid = launchpad.lookup_email(self.lp, email)
96
person.add_email(email)
100
class Upload(object):
101
def __init__(self, timestamp, pkg, sponsor=None):
102
if type(timestamp) == datetime:
103
self.timestamp = timestamp.strftime("%Y-%m-%d")
105
self.timestamp = timestamp
108
self.sponsor = sponsor
110
class UploadList(object):
116
data = stats.read_data(self.filename)
117
self.releases = stats.read_data("all-releases")
118
self.releases.reverse()
120
for release in data.keys():
121
for who in data[release].keys():
122
for upload in data[release][who]:
123
self.add(release, who,
124
upload["timestamp"], upload["pkg"])
128
for release in self.uploads.keys():
130
for who in self.uploads[release].keys():
131
data[release][who] = []
132
for upload in self.uploads[release][who]:
133
data[release][who] += [ upload.__dict__ ]
134
stats.dump(self.filename, data)
136
def add(self, release, who, timestamp, pkg, sponsor=None):
137
if not self.uploads.has_key(release):
138
self.uploads[release] = {}
139
if not self.uploads[release].has_key(who):
140
self.uploads[release][who] = []
141
self.uploads[release][who] += [ Upload(timestamp, pkg, sponsor) ]
143
def get_first_release_contributed_to(self, uploader):
144
for release in self.releases:
145
if self.uploads[release].has_key(uploader):
149
def get_first_time_uploaders_in(self, release, pl=None):
150
uploaders = set(self.uploads[release].keys())
152
# if PersonList pl is passed we make sure that only real uploaders
153
# are included in the list
155
real_uploaders = set([b.lpid for b in pl.get_uploaders()])
156
uploaders = uploaders.intersection(real_uploaders)
158
return filter(lambda a: self.get_first_release_contributed_to(a) == release, uploaders)
160
def get_first_time_uploads_in(self, release, pl=None):
162
uploaders = self.get_first_time_uploaders_in(release, pl)
163
for uploader in uploaders:
164
uploads[uploader] = sorted([(a.pkg, a.timestamp) for a in \
165
self.uploads[release][uploader]],