From 24419907835f944d6a385e551b6ddb2d0fce6fac Mon Sep 17 00:00:00 2001 From: ann26 Date: Fri, 16 Nov 2018 09:29:20 +0700 Subject: [PATCH 1/2] add email admin command --- .../commands/send_tracking_data_to_admins.py | 69 ++++++++++ bims/templates/tracking/email.html | 126 ++++++++++++++++++ core/settings/dev_docker.py | 4 +- 3 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 bims/management/commands/send_tracking_data_to_admins.py create mode 100644 bims/templates/tracking/email.html diff --git a/bims/management/commands/send_tracking_data_to_admins.py b/bims/management/commands/send_tracking_data_to_admins.py new file mode 100644 index 000000000..8282ac68c --- /dev/null +++ b/bims/management/commands/send_tracking_data_to_admins.py @@ -0,0 +1,69 @@ +# coding=utf-8 +from datetime import timedelta +from django.core.management.base import BaseCommand +from django.core.mail import mail_admins +from django.template.loader import get_template +from django.utils.timezone import now +from bims.conf import TRACK_PAGEVIEWS +from bims.models import Taxon, BiologicalCollectionRecord, Visitor, Pageview + + +class Command(BaseCommand): + help = "Script to send tracking data of BIMS site to Admins." + + def add_arguments(self, parser): + parser.add_argument( + '--from', + dest='from', + help='Start date of tracking data', + ) + + parser.add_argument( + '--to', + dest='to', + help='End date of tracking data', + ) + + def handle(self, *args, **options): + date_to = now() + date_from = date_to - timedelta(days=7) + if options['from']: + date_from = options['from'] + + if options['to']: + date_to = options['to'] + + taxon_count = Taxon.objects.count() + collections_count = \ + BiologicalCollectionRecord.objects.filter(validated=True).count() + + html = get_template('tracking/email.html') + user_stats = Visitor.objects.user_stats(date_from, date_to) + visitor_stats = Visitor.objects.stats(date_from, date_to) + if TRACK_PAGEVIEWS: + pageview_stats = Pageview.objects.stats(date_from, date_to) + else: + pageview_stats = None + context = { + 'user_stats': user_stats, + 'visitor_stats': visitor_stats, + 'pageview_stats': pageview_stats, + 'taxon_count': taxon_count, + 'collections_count': collections_count, + 'date_from': date_from, + 'date_to': date_to + } + + html_content = html.render(context) + + mail_admins( + 'BIMS site activity report', + 'Dear Admin\n' + 'The following data is the activity report of the BIMS site ' + 'from {} to {}:\n' + 'Current taxon count: {}\n' + 'Current collections count: {}\n' + 'Kind regards,\n' + 'BIMS'.format(date_from, date_to, taxon_count, collections_count), + html_message=html_content + ) diff --git a/bims/templates/tracking/email.html b/bims/templates/tracking/email.html new file mode 100644 index 000000000..30ec3006c --- /dev/null +++ b/bims/templates/tracking/email.html @@ -0,0 +1,126 @@ + + + +

Report statistics from {{ date_from }} to {{ date_to }}

+

Database Statistics

+ Taxon records: {{ taxon_count }}
+ Total validated collections: {{ collections_count }} +
+

Visitors

+ {% if visitor_stats.total %} + + + + + + + + + {% if pageview_stats %} + + {% endif %} + + + + + + + + + + {% if pageview_stats %} + + {% endif %} + + + {% if visitor_stats.guests %} + + + + + + + {% if pageview_stats %} + + {% endif %} + + + + + + + + {% if pageview_stats %} + + {% endif %} + + {% endif %} + +
TotalUnique% Returning VisitorAvg. Time on SiteAvg. Pages/Visit
Registered{{ visitor_stats.registered.total }}{{ visitor_stats.registered.unique }}{{ visitor_stats.registered.return_ratio|floatformat }}%{{ visitor_stats.registered.time_on_site|default_if_none:"n/a" }}{{ visitor_stats.registered.pages_per_visit|floatformat|default:"n/a" }}
Guests{{ visitor_stats.guests.total }}{{ visitor_stats.guests.unique }}{{ visitor_stats.guests.return_ratio|floatformat }}%{{ visitor_stats.guests.time_on_site|default_if_none:"n/a" }}{{ visitor_stats.guests.pages_per_visit|floatformat|default:"n/a" }}
Total{{ visitor_stats.total }}{{ visitor_stats.unique }}{{ visitor_stats.return_ratio|floatformat }}%{{ visitor_stats.time_on_site|default_if_none:"n/a" }}{{ visitor_stats.pages_per_visit|floatformat|default:"n/a" }}
+ {% else %} +

No visitor stats available

+ {% endif %} + +

Registered Users

+ {% if user_stats %} + + + + + + + + + + + {% for user in user_stats %} + + + + + + + {% endfor %} + +
# VisitsAvg. Time on SiteAvg. Pages/Visit
{% firstof user.get_full_name user %}{{ user.visit_count }}{{ user.time_on_site|default_if_none:"n/a" }}{{ user.pages_per_visit|floatformat|default:"n/a" }}
+ {% else %} +

No registered user stats available

+ {% endif %} + + {% if pageview_stats %} +

Pageviews

+ {% if pageview_stats.total %} + + + + + + + + + + + + + + + {% if pageview_stats.guests %} + + + + + + + + + + + {% endif %} + +
TotalUnique
Registered{{ pageview_stats.registered.total }}{{ pageview_stats.registered.unique }}
Guests{{ pageview_stats.guests.total }}{{ pageview_stats.guests.unique }}
Total{{ pageview_stats.total }}{{ pageview_stats.unique }}
+ {% else %} +

No pageview stats available

+ {% endif %} + {% endif %} + + \ No newline at end of file diff --git a/core/settings/dev_docker.py b/core/settings/dev_docker.py index 78fda473d..1e1678e4f 100644 --- a/core/settings/dev_docker.py +++ b/core/settings/dev_docker.py @@ -5,7 +5,9 @@ ALLOWED_HOSTS = ['*', u'0.0.0.0'] -ADMINS = () +ADMINS = ( + ('Anita Hapsari', 'anita@kartoza.com'), +) # Set debug to True for development DEBUG = True From 18692c9369a7971a9e42b354eec3613fe6e2809e Mon Sep 17 00:00:00 2001 From: ann26 Date: Fri, 16 Nov 2018 11:15:29 +0700 Subject: [PATCH 2/2] add send email admin to worker --- bims/tasks/email_admins.py | 51 ++++++++++++++++++++++++++++++++ core/settings/celery_settings.py | 4 +++ 2 files changed, 55 insertions(+) create mode 100644 bims/tasks/email_admins.py diff --git a/bims/tasks/email_admins.py b/bims/tasks/email_admins.py new file mode 100644 index 000000000..3a16aec23 --- /dev/null +++ b/bims/tasks/email_admins.py @@ -0,0 +1,51 @@ +# coding=utf-8 +from celery import shared_task + + +@shared_task(name='bims.tasks.email_admins', queue='update') +def email_admins(): + from datetime import timedelta + from django.core.mail import mail_admins + from django.template.loader import get_template + from django.utils.timezone import now + from bims.conf import TRACK_PAGEVIEWS + from bims.models import Taxon, BiologicalCollectionRecord, Visitor, \ + Pageview + + date_to = now() + date_from = date_to - timedelta(days=7) + + taxon_count = Taxon.objects.count() + collections_count = \ + BiologicalCollectionRecord.objects.filter(validated=True).count() + + html = get_template('tracking/email.html') + user_stats = Visitor.objects.user_stats(date_from, date_to) + visitor_stats = Visitor.objects.stats(date_from, date_to) + if TRACK_PAGEVIEWS: + pageview_stats = Pageview.objects.stats(date_from, date_to) + else: + pageview_stats = None + context = { + 'user_stats': user_stats, + 'visitor_stats': visitor_stats, + 'pageview_stats': pageview_stats, + 'taxon_count': taxon_count, + 'collections_count': collections_count, + 'date_from': date_from, + 'date_to': date_to + } + + html_content = html.render(context) + + mail_admins( + 'BIMS site activity report', + 'Dear Admin\n' + 'The following data is the activity report of the BIMS site ' + 'from {} to {}:\n' + 'Current taxon count: {}\n' + 'Current collections count: {}\n' + 'Kind regards,\n' + 'BIMS'.format(date_from, date_to, taxon_count, collections_count), + html_message=html_content + ) diff --git a/core/settings/celery_settings.py b/core/settings/celery_settings.py index 14686d390..edf1ab7df 100644 --- a/core/settings/celery_settings.py +++ b/core/settings/celery_settings.py @@ -8,6 +8,10 @@ 'task': 'bims.tasks.update_cluster', 'schedule': 18000.0, # update every 5 hours }, + 'email_admins': { + 'task': 'bims.tasks.email_admins', + 'schedule': 604800.0, # send email to admins every 7 days + } } CELERY_TIMEZONE = 'UTC'