Ejemplo n.º 1
0
def get_ewi_recipients(site_ids=None, site_codes=None, alert_level=0):
    """
    Function that get ewi recipients per site
    """

    query = UsersRelationship.query.join(UserOrganizations).join(
        Sites).options(
            DB.subqueryload("mobile_numbers").joinedload("mobile_number",
                                                         innerjoin=True),
            DB.subqueryload("organizations").joinedload("site",
                                                        innerjoin=True),
            DB.subqueryload("organizations").joinedload("organization",
                                                        innerjoin=True),
            DB.raiseload("*")).filter(Users.ewi_recipient == 1)

    if site_ids:
        query = query.filter(Sites.site_id.in_(site_ids))

    if site_codes:
        query = query.filter(Sites.site_code.in_(site_codes))

    if alert_level != 0:
        uer = UserEwiRestrictions
        query = query.join(uer).filter(
            DB.or_(uer.user_id.is_(None), uer.alert_level < alert_level))

    user_per_site_query = query.all()
    user_per_site_result = UsersRelationshipSchema(
        many=True,
        exclude=["emails", "teams", "landline_numbers",
                 "ewi_restriction"]).dump(user_per_site_query).data

    return user_per_site_result
Ejemplo n.º 2
0
def get_issues_and_reminders(offset=None,
                             limit=None,
                             start=None,
                             end=None,
                             site_ids=None,
                             include_count=None,
                             search=None,
                             event_id=None,
                             include_expired=None):
    """
        Returns one or more row/s of narratives.

        Args:
            offset (Integer) -
            limit (Integer) -
            start () -
            end () -
            include_count (Boolean)
            search (String)
            event_id (Integer)
    """
    print(get_process_status_log("get_issues_and_reminders", "start"))

    iar = IssuesAndReminders
    irp = IssuesRemindersSitePostings
    # base = DB.session.query(iar)
    base = iar.query.options(joinedload(iar.postings).joinedload(
        irp.event)).filter(iar.resolution == None)
    return_data = None

    if start and end:
        base = base.filter(iar.ts_posted.between(start, end))

    if not event_id:
        if search:
            base = base.filter(iar.detail.ilike("%" + search + "%"))

        if not include_expired:
            base = base.filter(
                DB.or_(iar.ts_expiration > datetime.now(),
                       iar.ts_expiration == None))

        issues_and_reminders = base.order_by(DB.desc(
            iar.ts_posted)).limit(limit).offset(offset).all()
        DB.session.commit()

        if include_count:
            count = get_issues_count(base)
            return_data = [issues_and_reminders, count]
        else:
            return_data = issues_and_reminders
    else:
        issues_and_reminders = base.order_by(DB.desc(
            iar.timestamp)).filter(iar.event_id == event_id).all()
        DB.session.commit()
        return_data = issues_and_reminders

    print(get_process_status_log("get_issues_and_reminders", "end"))
    return return_data
Ejemplo n.º 3
0
def find_narrative_event_id(timestamp, site_id):
    """
    """
    me = MonitoringEvents
    mea = MonitoringEventAlerts
    event_id = None

    filtering = DB.or_(
        DB.and_(mea.ts_start <= timestamp, timestamp <= mea.ts_end),
        DB.and_(mea.ts_start <= timestamp, mea.ts_end == None))

    event_alert = mea.query.options(DB.joinedload("event", innerjoin=True), DB.raiseload("*")) \
        .order_by(DB.desc(mea.event_alert_id)) \
            .join(me).filter(filtering).filter(me.site_id == site_id) \
        .first()

    if event_alert:
        event_id = event_alert.event.event_id

    return event_id
Ejemplo n.º 4
0
def get_subsurface_node_alerts(site_id, start_ts, latest_trigger_ts,
                               alert_level):
    """
    Update: Returns a list of node alerts
    Returns list of sensors with its corresponding node alerts
    """
    # NOTE: OPTIMIZE: Use TSMSensor instead of NodeAlerts OR use join() query
    try:
        tsm_sensors = tsma.query.filter(tsma.site_id == site_id).all()

        tsm_node_alerts = []
        for sensor in tsm_sensors:
            sensor_node_alerts = sensor.node_alerts.filter(
                DB.or_(na.disp_alert == alert_level, na.vel_alert == 3)) \
                .order_by(DB.desc(na.na_id)).filter(
                start_ts <= na.ts, na.ts <= latest_trigger_ts).all()
            if sensor_node_alerts:  # If there are no node alerts on sensor, skip.
                # If there is, remove duplicate node alerts. We only need the latest.
                unique_list = []
                comparator = []
                for item in sensor_node_alerts:
                    com = item.node_id
                    comparator.append(com)
                    if not (com in comparator and comparator.count(com) > 1):
                        unique_list.append(item)
                sensor_node_alerts = unique_list

                tsm_node_alerts.extend(sensor_node_alerts)
                # Save nodes to its own dictionary per sensor then put it in a list
                # entry_dict = {
                #     "logger_name": sensor.logger.logger_name,
                #     "sensor_node_alerts": sensor_node_alerts
                # }
                # tsm_node_alerts.append(entry_dict)
    except:
        raise

    return tsm_node_alerts