mirror of
https://github.com/mail-in-a-box/mailinabox.git
synced 2025-04-03 00:07:05 +00:00
116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
#####
|
|
##### This file is part of Mail-in-a-Box-LDAP which is released under the
|
|
##### terms of the GNU Affero General Public License as published by the
|
|
##### Free Software Foundation, either version 3 of the License, or (at
|
|
##### your option) any later version. See file LICENSE or go to
|
|
##### https://github.com/downtownallday/mailinabox-ldap for full license
|
|
##### details.
|
|
#####
|
|
|
|
from .Timeseries import Timeseries
|
|
from .exceptions import InvalidArgsError
|
|
|
|
with open(__file__.replace('.py','.1.sql')) as fp:
|
|
select_1 = fp.read()
|
|
|
|
with open(__file__.replace('.py','.2.sql')) as fp:
|
|
select_2 = fp.read()
|
|
|
|
with open(__file__.replace('.py','.3.sql')) as fp:
|
|
select_3 = fp.read()
|
|
|
|
with open(__file__.replace('.py','.4.sql')) as fp:
|
|
select_4 = fp.read()
|
|
|
|
|
|
def messages_sent(conn, args):
|
|
'''
|
|
messages sent by local users
|
|
- delivered locally & remotely
|
|
|
|
'''
|
|
try:
|
|
ts = Timeseries(
|
|
"Messages sent by users",
|
|
args['start'],
|
|
args['end'],
|
|
args['binsize']
|
|
)
|
|
except KeyError:
|
|
raise InvalidArgsError()
|
|
|
|
s_sent = ts.add_series('sent', 'messages sent')
|
|
s_local = ts.add_series('local', 'local recipients')
|
|
s_remote = ts.add_series('remote', 'remote recipients')
|
|
|
|
c = conn.cursor()
|
|
try:
|
|
for row in c.execute(select_1.format(timefmt=ts.timefmt), {
|
|
'start_date':ts.start,
|
|
'end_date':ts.end,
|
|
'start_unixepoch':ts.start_unixepoch,
|
|
'binsize':ts.binsize
|
|
}):
|
|
idx = ts.insert_date(row['bin'])
|
|
s_sent['values'][idx] = row['sent_count']
|
|
|
|
date_idx = -1
|
|
|
|
# the returned bins are the same as select_1 because the
|
|
# querie's WHERE and JOINs are the same
|
|
for row in c.execute(select_2.format(timefmt=ts.timefmt), {
|
|
'start_date':ts.start,
|
|
'end_date':ts.end,
|
|
'start_unixepoch':ts.start_unixepoch,
|
|
'binsize':ts.binsize
|
|
}):
|
|
date_idx = ts.insert_date(row['bin'])
|
|
if row['delivery_service']=='smtp':
|
|
s_remote['values'][date_idx] = row['delivery_count']
|
|
elif row['delivery_service']=='lmtp':
|
|
s_local['values'][date_idx] = row['delivery_count']
|
|
|
|
|
|
top_senders1 = {
|
|
'start': ts.start,
|
|
'end': ts.end,
|
|
'y': 'Top 10 users by count',
|
|
'fields': ['user','count'],
|
|
'field_types': ['text/email','number/plain'],
|
|
'items': []
|
|
}
|
|
for row in c.execute(select_3, {
|
|
'start_date':ts.start,
|
|
'end_date':ts.end
|
|
}):
|
|
top_senders1['items'].append({
|
|
'user': row['username'],
|
|
'count': row['count']
|
|
})
|
|
|
|
top_senders2 = {
|
|
'start': ts.start,
|
|
'end': ts.end,
|
|
'y': 'Top 10 users by size',
|
|
'fields': ['user','size'],
|
|
'field_types': ['text/email','number/size'],
|
|
'items': []
|
|
}
|
|
for row in c.execute(select_4, {
|
|
'start_date':ts.start,
|
|
'end_date':ts.end
|
|
}):
|
|
top_senders2['items'].append({
|
|
'user': row['username'],
|
|
'size': row['message_size_total']
|
|
})
|
|
|
|
finally:
|
|
c.close()
|
|
|
|
return {
|
|
'top_senders_by_count': top_senders1,
|
|
'top_senders_by_size': top_senders2,
|
|
'ts_sent': ts.asDict(),
|
|
}
|