Ejemplo n.º 1
0
 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'
     }])
Ejemplo n.º 2
0
 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'
     }])
Ejemplo n.º 3
0
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)