Login Metrics Widget¶
The Login Metrics widget displays a bar chart showing number of unique logins for web, mobile, and total over the past 60 days. (The default of 60 days can be changed on line 3 of the Python script.) By unique logins, we mean that any particular user is only counted once in each category. For example, if a certain user had 14 web logins and 8 mobile logins in the past 60 days, that user would be counted only once in each of the categories (web, mobile, and total).
Note
The required data for mobile logins is only available for the custom mobile app and not for the free mobile app. So if your church has people using the free app, this widget will not show accurate results for mobile logins.
The widget utilizes an HTML file and a Python script as shown below. (No SQL script is needed.) Since the information in this widget is the same for all users, Caching should be set to all users.
HTML Code¶
Below is the HTML code for the Login Metrics widget. As supplied by TouchPoint, the file name is WidgetLoginMetricsHTML.
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 | <div class="box">
<div class="box-title hidden-xs">
<h5><a href="#">{{WidgetName}}</a></h5>
</div>
<a class="visible-xs-block" id="giving-fc-collapse" data-toggle="collapse" href="#{{WidgetId}}-section" aria-expanded="true" aria-controls="{{WidgetId}}-section">
<div class="box-title">
<h5>
<i class="fa fa-chevron-circle-right"></i> {{WidgetName}}
</h5>
</div>
</a>
<div class="collapse in" id="{{WidgetId}}-section">
<div class="box-content center">
<h4 class="text-center">Login Metrics - Last {{days}} days</h4>
<div class="chart">
</div>
</div>
</div>
</div>
<script type="text/javascript">
var data = {{{counts}}};
google.charts.load("current", {packages:["corechart"]});
google.charts.setOnLoadCallback(function() {
data = google.visualization.arrayToDataTable([
['Item', 'Logins'],
['Web', {{counts.web}}],
['Mobile', {{counts.mobile}}],
['Total', {{counts.total}}]
]);
var options = {
colors: ['#9575cd'],
vAxis: {
title: 'Unique logins'
},
legend: {
position: 'none'
}
};
var chart = new google.visualization.ColumnChart(document.querySelector('#{{WidgetId}}-section .chart'));
chart.draw(data, options);
});
</script>
|
Python Script¶
Below is the Python script for the Login Metrics widget. As supplied by TouchPoint, the file name is WidgetLoginMetricsPython.
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 | from System.DateTime import Now
Days = 60 # Report on logins for the past # of days entered here
def Get():
today = Now
StartDate = today.AddDays(-Days).Date
strToday = today.ToString('d')
strStartDate = StartDate.ToString('d')
template = Data.HTMLContent
appquery = '''
SELECT count(distinct p.peopleid) as Count
FROM dbo.MobileAppDevices mad
INNER JOIN dbo.People p on mad.PeopleId = p.PeopleId
WHERE mad.lastseen > '{}'
'''
webquery = '''
WITH loginUsers (userid) AS
(
select UserId from Users where Username in (
select distinct REPLACE(REPLACE(Activity, ' logged in', ''), 'User ', '') as Username from dbo.ActivityLog al
WHERE ActivityDate > '{}'
AND Activity like '%logged in'
)
)
SELECT count(distinct lu.userid) as Count
FROM loginUsers lu INNER JOIN dbo.Users u ON lu.Userid = u.UserId
INNER JOIN dbo.People p ON u.PeopleId = p.PeopleId
'''
combinedquery = '''
WITH loginUsers (userid) AS
(
select UserId from Users where Username in (
select distinct REPLACE(REPLACE(Activity, ' logged in', ''), 'User ', '') as Username from dbo.ActivityLog al
WHERE ActivityDate > '{}'
AND Activity like '%logged in'
)
)
,webUsers (web_userid) AS
(
SELECT lu.UserId
FROM loginUsers lu INNER JOIN dbo.Users u ON lu.Userid = u.UserId
INNER JOIN dbo.People p ON u.PeopleId = p.PeopleId
)
,appUsers (app_userid) AS
(SELECT distinct userid
FROM dbo.MobileAppDevices mad
INNER JOIN dbo.People p on mad.PeopleId = p.PeopleId
WHERE mad.lastseen > '{}'
)
SELECT count(*) as Count
FROM webUsers FULL OUTER JOIN appUsers ON webUsers.web_userid = appUsers.app_userId
'''
counts = {}
# Mobile app logins
rowcolquery = appquery.format(strStartDate)
data = q.QuerySql(rowcolquery)
for i in data:
counts["mobile"] = int(i.Count or 0)
# Web user logins
rowcolquery = webquery.format(strStartDate)
data = q.QuerySql(rowcolquery)
for i in data:
counts["web"] = int(i.Count or 0)
# Total unique login users
rowcolquery = combinedquery.format(strStartDate, strStartDate)
data = q.QuerySql(rowcolquery)
for i in data:
counts["total"] = int(i.Count or 0)
Data.days = Days
Data.counts = model.DynamicData(counts)
print model.RenderTemplate(template)
Get()
|
Latest Update | 04/30/2020 |
Added this article.