From 07dccdb4addb452b5b497cb731eaf8ba3a3900d1 Mon Sep 17 00:00:00 2001 From: "Chris J. Karr" Date: Tue, 20 Dec 2016 22:42:00 -0600 Subject: [PATCH] Site work --- forms.py | 5 +- .../commands/compile_accelerometer_report.py | 10 +- .../commands/compile_barometer_report.py | 7 +- management/commands/compile_fallnet_report.py | 100 +++++++++++++ .../commands/compile_gyroscope_report.py | 7 +- management/commands/compile_labels_report.py | 7 +- .../compile_significant_motion_report.py | 7 +- ...be.py => services_fitbitbetaprobe copy.py} | 0 management/commands/run_export_jobs.py | 84 ++++++----- ...rtjob_end_date__chg_field_purplerobotex.py | 139 ++++++++++++++++++ models.py | 4 +- static/galaxy-nexus.scm | 4 +- static/nexus-5.scm | 4 +- views.py | 11 +- 14 files changed, 332 insertions(+), 57 deletions(-) create mode 100644 management/commands/compile_fallnet_report.py rename management/commands/extractors/{services_fitbitbetaprobe.py => services_fitbitbetaprobe copy.py} (100%) create mode 100644 migrations/0036_auto__chg_field_purplerobotexportjob_end_date__chg_field_purplerobotex.py diff --git a/forms.py b/forms.py index 73ebc9d..8b8d4d7 100644 --- a/forms.py +++ b/forms.py @@ -3,8 +3,9 @@ from models import PurpleRobotReading class ExportJobForm(forms.Form): - start_date = forms.DateField() - end_date = forms.DateField() + start_date = forms.DateTimeField() + end_date = forms.DateTimeField() + destination = forms.EmailField() def __init__(self, *args, **kwargs): diff --git a/management/commands/compile_accelerometer_report.py b/management/commands/compile_accelerometer_report.py index a2bfbf8..1db8130 100644 --- a/management/commands/compile_accelerometer_report.py +++ b/management/commands/compile_accelerometer_report.py @@ -1,6 +1,7 @@ import datetime import gzip import json +import pytz import sys import tempfile @@ -17,10 +18,15 @@ class Command(BaseCommand): def handle(self, *args, **options): hashes = REPORT_DEVICES - start = datetime.datetime.now() - datetime.timedelta(days=14) +# start = datetime.datetime.now() - datetime.timedelta(days=120) + start_ts = datetime.datetime(2015, 7, 3, 5, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = start_ts + datetime.timedelta(hours=1) + + # print(start_ts.isoformat()) + # print(end_ts.isoformat()) for user_hash in hashes: - payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start).order_by('logged') + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start_ts, logged__lt=end_ts).order_by('logged') count = payloads.count() diff --git a/management/commands/compile_barometer_report.py b/management/commands/compile_barometer_report.py index 1804fb3..53da195 100644 --- a/management/commands/compile_barometer_report.py +++ b/management/commands/compile_barometer_report.py @@ -1,6 +1,7 @@ import datetime import gzip import json +import pytz import sys import tempfile @@ -17,12 +18,14 @@ class Command(BaseCommand): def handle(self, *args, **options): hashes = REPORT_DEVICES # PurpleRobotPayload.objects.order_by().values('user_id').distinct() - start = datetime.datetime.now() - datetime.timedelta(days=21) +# start = datetime.datetime.now() - datetime.timedelta(days=120) + start_ts = datetime.datetime(2015, 7, 3, 5, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = start_ts + datetime.timedelta(hours=1) for user_hash in hashes: # hash = hash['user_id'] - payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start).order_by('logged') + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start_ts, logged__lt=end_ts).order_by('logged') count = payloads.count() if count > 0: diff --git a/management/commands/compile_fallnet_report.py b/management/commands/compile_fallnet_report.py new file mode 100644 index 0000000..fb952ec --- /dev/null +++ b/management/commands/compile_fallnet_report.py @@ -0,0 +1,100 @@ +import datetime +import gzip +import json +import pytz +import sys +import tempfile + +from django.core.files import File +from django.core.management.base import BaseCommand +from django.utils import timezone + +from purple_robot_app.models import PurpleRobotReading, PurpleRobotReport +from purple_robot.settings import REPORT_DEVICES + +PROBE_NAME = 'edu.northwestern.cbits.purple_robot_manager.probes.studies.fallnet.FallNetProbe' + +class Command(BaseCommand): + def handle(self, *args, **options): + hashes = REPORT_DEVICES # PurpleRobotPayload.objects.order_by().values('user_id').distinct() + + start_ts = timezone.now() - datetime.timedelta(days=120) +# start_ts = datetime.datetime(2015, 7, 3, 5, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = timezone.now() # start_ts + datetime.timedelta(hours=1) + +# print('HASHES: ' + str(hashes)) + + for user_hash in hashes: + # hash = hash['user_id'] + + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start_ts, logged__lt=end_ts).order_by('logged') + + count = payloads.count() + +# print(user_hash + ' -- ' + str(count)) + + if count > 0: + temp_file = tempfile.TemporaryFile() + + gzf = gzip.GzipFile(mode='wb', fileobj=temp_file) + gzf.write('User ID\tTimestamp\tACCELEROMETER_READING_COUNT\tGYROSCOPE_READING_COUNT\tBAROMETER_READING_COUNT\tIS_FALL\tNOT_FALL_ODDS\tNOT_FALL_SUM\tNOT_FALL_PROBABILITY\tEVALUATION_WINDOW_START\tEVALUATION_WINDOW_END\tEVALUATION_WINDOW_SIZE\n') + + index = 0 + + while index < count: + end = index + 100 + + if end > count: + end = count + + for payload in payloads[index:end]: + reading_json = json.loads(payload.payload) + + is_fall = 0 + + if reading_json['IS_FALL']: + is_fall = 1 + + accel_count = '' + + if 'ACCELEROMETER_READING_COUNT' in reading_json: + accel_count = str(reading_json['ACCELEROMETER_READING_COUNT']) + + gyro_count = '' + + if 'GYROSCOPE_READING_COUNT' in reading_json: + gyro_count = str(reading_json['GYROSCOPE_READING_COUNT']) + + baro_count = '' + + if 'BAROMETER_READING_COUNT' in reading_json: + baro_count = str(reading_json['BAROMETER_READING_COUNT']) + + eval_start = '' + + if 'EVALUATION_WINDOW_START' in reading_json: + eval_start = str(reading_json['EVALUATION_WINDOW_START']) + + eval_end = '' + + if 'EVALUATION_WINDOW_END' in reading_json: + eval_end = str(reading_json['EVALUATION_WINDOW_END']) + + eval_size = '' + + if 'EVALUATION_WINDOW_SIZE' in reading_json: + eval_end = str(reading_json['EVALUATION_WINDOW_SIZE']) + + gzf.write(user_hash + '\t' + str(reading_json['TIMESTAMP']) + '\t' + accel_count + '\t' + gyro_count + '\t' + baro_count + '\t' + str(is_fall) + '\t' + str(reading_json['NOT_FALL_ODDS']) + '\t' + str(reading_json['NOT_FALL_SUM']) + '\t' + str(reading_json['NOT_FALL_PROBABILITY']) + '\t' + eval_start + '\t' + eval_end + '\t' + eval_size + '\n') + + index += 100 + + gzf.flush() + gzf.close() + + temp_file.seek(0) + + report = PurpleRobotReport(generated=timezone.now(), mime_type='application/x-gzip', probe=PROBE_NAME, user_id=user_hash) + report.save() + report.report_file.save(user_hash + '-fallnet.txt.gz', File(temp_file)) + report.save() diff --git a/management/commands/compile_gyroscope_report.py b/management/commands/compile_gyroscope_report.py index 67f6d64..28b561d 100644 --- a/management/commands/compile_gyroscope_report.py +++ b/management/commands/compile_gyroscope_report.py @@ -1,6 +1,7 @@ import datetime import gzip import json +import pytz import sys import tempfile @@ -17,12 +18,14 @@ class Command(BaseCommand): def handle(self, *args, **options): hashes = REPORT_DEVICES # PurpleRobotPayload.objects.order_by().values('user_id').distinct() - start = datetime.datetime.now() - datetime.timedelta(days=21) +# start = datetime.datetime.now() - datetime.timedelta(days=120) + start_ts = datetime.datetime(2015, 7, 3, 5, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = start_ts + datetime.timedelta(hours=1) for user_hash in hashes: # hash = hash['user_id'] - payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start).order_by('logged') + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start_ts, logged__lt=end_ts).order_by('logged') count = payloads.count() if count > 0: diff --git a/management/commands/compile_labels_report.py b/management/commands/compile_labels_report.py index 079e4a8..43b872f 100644 --- a/management/commands/compile_labels_report.py +++ b/management/commands/compile_labels_report.py @@ -1,6 +1,7 @@ import datetime import gzip import json +import pytz import tempfile from django.core.files import File @@ -16,7 +17,9 @@ class Command(BaseCommand): def handle(self, *args, **options): hashes = REPORT_DEVICES # PurpleRobotPayload.objects.order_by().values('user_id').distinct() - start = datetime.datetime.now() - datetime.timedelta(days=21) +# start = datetime.datetime.now() - datetime.timedelta(days=120) + start_ts = datetime.datetime(2015, 11, 10, 0, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = start_ts + datetime.timedelta(days=1) labels = PurpleRobotReading.objects.exclude(probe__startswith='edu.northwestern').values('probe').distinct() @@ -24,7 +27,7 @@ def handle(self, *args, **options): for label in labels: slug_label = slugify(label['probe']) - payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=label['probe'], logged__gte=start).order_by('logged') + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=label['probe'], logged__gte=start_ts, logged__lt=end_ts).order_by('logged') count = payloads.count() diff --git a/management/commands/compile_significant_motion_report.py b/management/commands/compile_significant_motion_report.py index 8d152b0..e1bdee2 100644 --- a/management/commands/compile_significant_motion_report.py +++ b/management/commands/compile_significant_motion_report.py @@ -1,6 +1,7 @@ import datetime import gzip import json +import pytz import tempfile from django.core.files import File @@ -16,10 +17,12 @@ class Command(BaseCommand): def handle(self, *args, **options): hashes = REPORT_DEVICES # PurpleRobotPayload.objects.order_by().values('user_id').distinct() - start = datetime.datetime.now() - datetime.timedelta(days=21) +# start = datetime.datetime.now() - datetime.timedelta(days=120) + start_ts = datetime.datetime(2015, 11, 10, 0, 0, 0, 0, tzinfo=pytz.timezone('US/Central')) + end_ts = start_ts + datetime.timedelta(days=1) for user_hash in hashes: - payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start).order_by('logged') + payloads = PurpleRobotReading.objects.filter(user_id=user_hash, probe=PROBE_NAME, logged__gte=start_ts, logged__lt=end_ts).order_by('logged') count = payloads.count() if count > 0: diff --git a/management/commands/extractors/services_fitbitbetaprobe.py b/management/commands/extractors/services_fitbitbetaprobe copy.py similarity index 100% rename from management/commands/extractors/services_fitbitbetaprobe.py rename to management/commands/extractors/services_fitbitbetaprobe copy.py diff --git a/management/commands/run_export_jobs.py b/management/commands/run_export_jobs.py index 6fcbe35..041b188 100644 --- a/management/commands/run_export_jobs.py +++ b/management/commands/run_export_jobs.py @@ -1,5 +1,6 @@ +# pylint: disable=line-too-long, no-member + import datetime -import gc import gzip import json import tempfile @@ -10,82 +11,95 @@ from django.db.models import Q from django.template import Context from django.template.loader import render_to_string +from django.utils import timezone from django.utils.crypto import get_random_string -from purple_robot.settings import ADMINS, URL_PREFIX -from purple_robot_app.models import PurpleRobotExportJob, PurpleRobotReading +from django.conf import settings +from ...models import PurpleRobotExportJob, PurpleRobotReading + class Command(BaseCommand): def handle(self, *args, **options): processing = PurpleRobotExportJob.objects.filter(state='processing') pending = PurpleRobotExportJob.objects.filter(state='pending') + now = timezone.now() + if processing.count() > 0: - pass # Do nothing - already compiling a job... + pass # Do nothing - already compiling a job... elif pending.count() < 1: - pass # No work to do... + pass # No work to do... else: job = pending.order_by('pk')[0] - + job.state = 'processing' job.save() - - hashes = job.users.split() - probes = job.probes.split() - - start = datetime.datetime(job.start_date.year, job.start_date.month, job.start_date.day, 0, 0, 0, 0) - end = datetime.datetime(job.end_date.year, job.end_date.month, job.end_date.day, 23, 59, 59, 999999) - + + hashes = job.users.strip().split() + probes = job.probes.strip().split() + + start = job.start_date # datetime.datetime(job.start_date.year, job.start_date.month, job.start_date.day, 0, 0, 0, 0, tzinfo=now.tzinfo) + end = job.end_date # datetime.datetime(job.end_date.year, job.end_date.month, job.end_date.day, 23, 59, 59, 999999, tzinfo=now.tzinfo) + q_probes = None temp_file = tempfile.TemporaryFile() - gzf = gzip.GzipFile(mode='wb', fileobj=temp_file) - gzf.write('User ID\tProbe\tLogged\tPayload\n') - for probe in probes: if q_probes is None: q_probes = Q(probe=probe) else: q_probes = (q_probes | Q(probe=probe)) - + + gzf = gzip.GzipFile(mode='wb', fileobj=temp_file) + gzf.write('User ID\tProbe\tLogged\tStart\tEnd\tDuration\tPayload\n') + for user_hash in hashes: readings = None - + if q_probes is not None: readings = PurpleRobotReading.objects.filter(q_probes, user_id=user_hash, logged__gte=start, logged__lte=end).order_by('logged') else: readings = PurpleRobotReading.objects.filter(user_id=user_hash, logged__gte=start, logged__lte=end).order_by('logged') - + count = readings.count() - + for i in range(0, (count / 500) + 1): page_start = i * 500 page_end = page_start + 499 - + for reading in readings[page_start:page_end]: payload = json.loads(reading.payload) - gzf.write(user_hash + '\t' + reading.probe + '\t' + str(reading.logged) + '\t' + json.dumps(payload) + '\n') + if 'FEATURE_VALUE' in payload and 'start' in payload['FEATURE_VALUE'] and 'end' in payload['FEATURE_VALUE'] and 'duration' in payload['FEATURE_VALUE']: + range_start = payload['FEATURE_VALUE']['start'] + range_end = payload['FEATURE_VALUE']['end'] + duration = payload['FEATURE_VALUE']['duration'] + + gzf.write(user_hash + '\t' + reading.probe + '\t' + str(reading.logged) + '\t' + str(range_start) + '\t' + str(range_end) + '\t' + str(duration) + '\t' + json.dumps(payload) + '\n') + + + else: + gzf.write(user_hash + '\t' + reading.probe + '\t' + str(reading.logged) + '\t\t\t\t' + json.dumps(payload) + '\n') gzf.flush() gzf.close() - + temp_file.seek(0) - - job.export_file.save('export_' + job.start_date.isoformat() + '_' + \ - job.end_date.isoformat() + '_' + \ - get_random_string(16).lower() + '.txt.gz', \ + + job.export_file.save('export_' + job.start_date.isoformat() + '_' + + job.end_date.isoformat() + '_' + + get_random_string(16).lower() + '.txt.gz', File(temp_file)) - + job.state = 'finished' job.save() - + if job.destination is not None and job.destination != '': - c = Context() - c['job'] = job - c['prefix'] = URL_PREFIX + context = Context() + context['job'] = job + context['prefix'] = settings.URL_PREFIX + + message = render_to_string('export_email.txt', context) - message = render_to_string('export_email.txt', c) - - send_mail('Your Purple Robot data is available', message, 'Purple Robot <' + ADMINS[0][1] + '>', [job.destination], fail_silently=False) + send_mail('Your Purple Robot data is available', message, 'Purple Robot <' + settings.ADMINS[0][1] + '>', [job.destination], fail_silently=False) diff --git a/migrations/0036_auto__chg_field_purplerobotexportjob_end_date__chg_field_purplerobotex.py b/migrations/0036_auto__chg_field_purplerobotexportjob_end_date__chg_field_purplerobotex.py new file mode 100644 index 0000000..0d509c7 --- /dev/null +++ b/migrations/0036_auto__chg_field_purplerobotexportjob_end_date__chg_field_purplerobotex.py @@ -0,0 +1,139 @@ +# -*- coding: utf-8 -*- +from south.utils import datetime_utils as datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Changing field 'PurpleRobotExportJob.end_date' + db.alter_column(u'purple_robot_app_purplerobotexportjob', 'end_date', self.gf('django.db.models.fields.DateTimeField')()) + + # Changing field 'PurpleRobotExportJob.start_date' + db.alter_column(u'purple_robot_app_purplerobotexportjob', 'start_date', self.gf('django.db.models.fields.DateTimeField')()) + + def backwards(self, orm): + + # Changing field 'PurpleRobotExportJob.end_date' + db.alter_column(u'purple_robot_app_purplerobotexportjob', 'end_date', self.gf('django.db.models.fields.DateField')()) + + # Changing field 'PurpleRobotExportJob.start_date' + db.alter_column(u'purple_robot_app_purplerobotexportjob', 'start_date', self.gf('django.db.models.fields.DateField')()) + + models = { + u'purple_robot_app.purplerobotalert': { + 'Meta': {'object_name': 'PurpleRobotAlert'}, + 'action_url': ('django.db.models.fields.URLField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'dismissed': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'generated': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'manually_dismissed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'message': ('django.db.models.fields.CharField', [], {'max_length': '2048'}), + 'probe': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'severity': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'tags': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}) + }, + u'purple_robot_app.purplerobotconfiguration': { + 'Meta': {'object_name': 'PurpleRobotConfiguration'}, + 'added': ('django.db.models.fields.DateTimeField', [], {}), + 'contents': ('django.db.models.fields.TextField', [], {'max_length': '1048576'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '1024'}) + }, + u'purple_robot_app.purplerobotdevice': { + 'Meta': {'object_name': 'PurpleRobotDevice'}, + 'config_last_fetched': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'config_last_user_agent': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'configuration': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'devices'", 'null': 'True', 'to': u"orm['purple_robot_app.PurpleRobotConfiguration']"}), + 'description': ('django.db.models.fields.TextField', [], {'max_length': '1048576', 'null': 'True', 'blank': 'True'}), + 'device_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'devices'", 'null': 'True', 'to': u"orm['purple_robot_app.PurpleRobotDeviceGroup']"}), + 'device_id': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256', 'db_index': 'True'}), + 'hash_key': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mute_alerts': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'performance_metadata': ('django.db.models.fields.TextField', [], {'default': "'{}'", 'max_length': '1048576'}) + }, + u'purple_robot_app.purplerobotdevicegroup': { + 'Meta': {'object_name': 'PurpleRobotDeviceGroup'}, + 'configuration': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'groups'", 'null': 'True', 'to': u"orm['purple_robot_app.PurpleRobotConfiguration']"}), + 'description': ('django.db.models.fields.TextField', [], {'max_length': '1048576', 'null': 'True', 'blank': 'True'}), + 'group_id': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '256'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}) + }, + u'purple_robot_app.purplerobotdevicenote': { + 'Meta': {'object_name': 'PurpleRobotDeviceNote'}, + 'added': ('django.db.models.fields.DateTimeField', [], {}), + 'device': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'notes'", 'to': u"orm['purple_robot_app.PurpleRobotDevice']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'note': ('django.db.models.fields.TextField', [], {'max_length': '1024'}) + }, + u'purple_robot_app.purplerobotevent': { + 'Meta': {'object_name': 'PurpleRobotEvent'}, + 'event': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'logged': ('django.db.models.fields.DateTimeField', [], {}), + 'name': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'payload': ('django.db.models.fields.TextField', [], {'max_length': '8388608', 'null': 'True', 'blank': 'True'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'db_index': 'True'}) + }, + u'purple_robot_app.purplerobotexportjob': { + 'Meta': {'object_name': 'PurpleRobotExportJob'}, + 'destination': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {}), + 'export_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'probes': ('django.db.models.fields.TextField', [], {'max_length': '8196', 'null': 'True', 'blank': 'True'}), + 'start_date': ('django.db.models.fields.DateTimeField', [], {}), + 'state': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '512'}), + 'users': ('django.db.models.fields.TextField', [], {'max_length': '8196', 'null': 'True', 'blank': 'True'}) + }, + u'purple_robot_app.purplerobotpayload': { + 'Meta': {'object_name': 'PurpleRobotPayload'}, + 'added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'errors': ('django.db.models.fields.TextField', [], {'max_length': '65536', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'payload': ('django.db.models.fields.TextField', [], {'max_length': '8388608'}), + 'process_tags': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'db_index': 'True'}) + }, + u'purple_robot_app.purplerobotreading': { + 'Meta': {'object_name': 'PurpleRobotReading', 'index_together': "[['probe', 'user_id'], ['logged', 'user_id'], ['probe', 'logged', 'user_id']]"}, + 'attachment': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'guid': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'logged': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}), + 'payload': ('django.db.models.fields.TextField', [], {'max_length': '8388608'}), + 'probe': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'size': ('django.db.models.fields.IntegerField', [], {'default': '0', 'db_index': 'True'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'db_index': 'True'}) + }, + u'purple_robot_app.purplerobotreport': { + 'Meta': {'object_name': 'PurpleRobotReport'}, + 'generated': ('django.db.models.fields.DateTimeField', [], {}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '1024'}), + 'probe': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'report_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024'}) + }, + u'purple_robot_app.purplerobottest': { + 'Meta': {'object_name': 'PurpleRobotTest'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'frequency': ('django.db.models.fields.FloatField', [], {'default': '1.0'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {}), + 'probe': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True', 'blank': 'True'}), + 'report': ('django.db.models.fields.TextField', [], {'default': "'{}'"}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'user_id': ('django.db.models.fields.CharField', [], {'max_length': '1024'}) + } + } + + complete_apps = ['purple_robot_app'] \ No newline at end of file diff --git a/models.py b/models.py index b36394a..ab9dd09 100644 --- a/models.py +++ b/models.py @@ -840,8 +840,8 @@ class PurpleRobotExportJob(models.Model): probes = models.TextField(max_length=8196, null=True, blank=True) users = models.TextField(max_length=8196, null=True, blank=True) - start_date = models.DateField() - end_date = models.DateField() + start_date = models.DateTimeField() + end_date = models.DateTimeField() export_file = models.FileField(blank=True, upload_to='export_files') destination = models.EmailField(null=True, blank=True) diff --git a/static/galaxy-nexus.scm b/static/galaxy-nexus.scm index bfb0850..8ecc26f 100644 --- a/static/galaxy-nexus.scm +++ b/static/galaxy-nexus.scm @@ -8,7 +8,7 @@ ("config_streaming_jackson_upload_interval" . "300") ("config_http_upload_size" . "0") ("config_enable_streaming_jackson_data_server" . #t) - ("config_log_server_uri" . "http://skyfall.aetherial.net/pr/log") + ("config_log_server_uri" . "http://falls.cbitstech.net/pr/log") ("check_scheme_config" . #t) ("config_mute_warnings" . #f) ("config_log_heartbeat" . #t) @@ -18,7 +18,7 @@ ("config_external_storage" . #t) ("config_show_background" . #t) ("config_default_notification_sound" . "0") - ("config_data_server_uri" . "http://skyfall.aetherial.net/pr/") + ("config_data_server_uri" . "http://falls.cbitstech.net/pr/") ("config_http_archive" . #f) ("config_log_upload_interval" . "600") ("config_user_id" . "galaxy-nexus-tester") diff --git a/static/nexus-5.scm b/static/nexus-5.scm index 377fd88..86fd1f0 100644 --- a/static/nexus-5.scm +++ b/static/nexus-5.scm @@ -8,7 +8,7 @@ ("config_streaming_jackson_upload_interval" . "300") ("config_http_upload_size" . "0") ("config_enable_streaming_jackson_data_server" . #t) - ("config_log_server_uri" . "http://skyfall.aetherial.net/pr/log") + ("config_log_server_uri" . "http://falls.cbitstech.net/pr/log") ("check_scheme_config" . #t) ("config_mute_warnings" . #f) ("config_log_heartbeat" . #t) @@ -18,7 +18,7 @@ ("config_external_storage" . #t) ("config_show_background" . #t) ("config_default_notification_sound" . "0") - ("config_data_server_uri" . "http://skyfall.aetherial.net/pr/") + ("config_data_server_uri" . "http://falls.cbitstech.net/pr/") ("config_http_archive" . #f) ("config_log_upload_interval" . "600") ("config_user_id" . "nexus-5-tester") diff --git a/views.py b/views.py index 8521986..0cf921e 100644 --- a/views.py +++ b/views.py @@ -1,7 +1,9 @@ -import json -import hashlib import datetime +import hashlib +import json +import pytz +from django.conf import settings from django.contrib.admin.views.decorators import staff_member_required from django.core.context_processors import csrf from django.core.urlresolvers import reverse @@ -153,8 +155,9 @@ def ingest_payload_print(request): def log_event(request): try: payload = json.loads(request.POST['json']) - - logged = datetime.datetime.fromtimestamp(int(payload['timestamp'])) + + tz = pytz.timezone(settings.TIME_ZONE) + logged = tz.localize(datetime.datetime.fromtimestamp(int(payload['timestamp']))) if PurpleRobotEvent.objects.filter(logged=logged, event=payload['event_type']).count() == 0: try: