def test_api_aggregate_day(self): """Test api aggregate by day""" start_date = utils.get_datetime_from_iso('2017-02-12 01:01:01') self._create_record(date=start_date) self._create_record(num=256, etat='R', date=start_date) self._create_record(num=789, etat='R', date=start_date) self._create_record(date=start_date - timedelta(days=1)) self._create_record(num=256, etat='S', date=start_date - timedelta(days=1)) rv = self.app.get('/api/aggregate/day') data = json.loads(rv.data) self.assertCountEqual(data, [{ 'count': 1, 'date': '2017-02-11', 'type': 'NORMAL' }, { 'count': 1, 'date': '2017-02-11', 'type': 'SUPPR' }, { 'count': 1, 'date': '2017-02-12', 'type': 'NORMAL' }, { 'count': 2, 'date': '2017-02-12', 'type': 'RETARD' }])
def test_api_aggregate_since(self): """Test api aggregate since arg""" start_date = utils.get_datetime_from_iso('2017-02-12 01:01:01') self._create_record(date=start_date) self._create_record(date=start_date - timedelta(days=2)) since = start_date - timedelta(days=1) rv = self.app.get('/api/aggregate/hour?since=%s' % int(time.mktime(since.timetuple()))) data = json.loads(rv.data) self.assertCountEqual(data, [{ 'count': 1, 'date': '2017-02-12 01:', 'type': 'NORMAL' }])
def record(data): """Record a data row into DB and trigger alert if needed""" table = database.get()['results'] data['type'] = 'NORMAL' etat = data.get('etat', False) if etat: if etat.startswith('Suppr') or etat == 'S': data['type'] = 'SUPPR' elif etat.startswith('Retard') or etat == 'R': data['type'] = 'RETARD' else: data['type'] = etat else: data['etat'] = '' # convert to ISO data['date'] = convert_to_iso(data['date']) data['weekday'] = get_datetime_from_iso(data['date']).isoweekday() limit_date = get_limit_date() # no duplicates # date can change for same train, num supposed unique each day try: existing = table.find_one(table.table.columns.date > limit_date, num=data['num']) # AttributeError on `date` when DB is empty (first run) except AttributeError: existing = None do_notif = False if existing is None: if data['type'] == 'SUPPR': do_notif = True table.insert(data) # type has changed, maybe suppr elif data['type'] != existing.type and data['type'] == 'SUPPR': do_notif = True table.update( { 'id': existing.id, 'etat': data['etat'], 'type': data['type'] }, ['id']) # date has changed, compute delay elif data['date'] != existing['date']: data['type'] = 'RETARD' delta = get_datetime_from_iso(data['date']) - get_datetime_from_iso( existing['date']) data['delay'] = delta.seconds table.update( { 'id': existing.id, 'etat': data['etat'], 'type': data['type'], 'delay': data['delay'] }, ['id']) # no delay but RETARD?? elif data['type'] != existing['type']: table.update( { 'id': existing.id, 'etat': data['etat'], 'type': data['type'] }, ['id']) # sometimes train are "uncancelled" apparently if existing['type'] == 'SUPPR': notifications.send(data, cancel=True) if do_notif: notifications.send(data)