def rwis_get_weather():
        qry_data = {}
        if request.method == 'POST':
            qry_data = request.form
        elif request.method == 'GET':
            qry_data = request.args

        sdate = qry_data.get('start_date')
        edate = qry_data.get('end_date')
        site_id = qry_data.get('site_id', None)
        sen_id = qry_data.get('sen_id', 0)

        if not site_id:
            return prot.response_fail('site_id is required')
        if not sdate or not edate:
            return prot.response_fail('starte_date and end_date are required')

        try:
            sdate = datetime.datetime.strptime(sdate, '%Y-%m-%d %H:%M:%S')
            edate = datetime.datetime.strptime(edate, '%Y-%m-%d %H:%M:%S')
        except:
            return prot.response_fail(
                'datetime format must be "yyyy-mm-dd hh:ii:ss"')

        if sdate >= edate:
            return prot.response_fail(
                'end_date must be greater than start_date')

        if (edate - sdate).seconds <= 600:
            return prot.response_fail(
                'time duration must be longer than 10 minutes')

        wd = rwis.get_weather(site_id, Period(sdate, edate, 300), sen_id)

        return prot.response_success(wd)
    def insert_all(self):
        json_str = request.form.get('data')
        json_str_list = python_json.loads(json_str)
        da_instance = self.data_access_class()
        obj_list = []
        for json_data in json_str_list:
            obj = self.json2obj(json_data)
            obj_list.append(obj)
            try:
                model_data = da_instance.insert(obj, autocommit=False)
            except exc.IntegrityError:
                print('integrity error')
                da_instance.rollback()
                da_instance.close()
                return prot.response_fail("Integrity Error")
            except Exception as ex:
                print('Unknown error')
                print(ex)
                da_instance.rollback()
                da_instance.close()
                return prot.response_fail("Unknown Error")

        da_instance.commit()
        da_instance.close()

        callback = getattr(self, 'on_insert_all_success', None)
        if callback:
            callback(obj_list)

        return prot.response_success()
Esempio n. 3
0
    def tetres_snowroute_update():
        id = request.form.get('id')
        route_json = request.form.get('data')

        snowRouteDA = SnowRouteDataAccess()

        ex = snowRouteDA.get_by_id(id)
        if not ex:
            snowRouteDA.close_session()
            return prot.response_invalid_request()

        info = json2snri(route_json)
        is_updated = snowRouteDA.update(
            id, {
                'name': info.name,
                'description': info.description,
                'prj_id': info.prj_id
            })
        if not is_updated:
            return prot.response_fail('fail to update database')

        if not snowRouteDA.commit():
            return prot.response_fail('fail to update database (commit fail)')

        tetresApi.add_actionlog(ActionLogDataAccess.INSERT,
                                snowRouteDA.get_tablename(),
                                id,
                                ActionLogDataAccess.data_description(
                                    ActionLogDataAccess.DT_SNOWROUTE, info),
                                handled=True,
                                dbsession=snowRouteDA.get_session())

        return prot.response_success(id)
    def delete(self):
        json_str = request.form.get('ids')
        ids = python_json.loads(json_str)
        da_instance = self.data_access_class()
        has_error = False
        deleted_objs = []
        for id in ids:
            try:
                ex = da_instance.get_by_id(id)
                deleted = da_instance.delete(id, autocommit=False)
            except:
                has_error = True
                break

            if not deleted:
                has_error = True
                break
            else:
                deleted_objs.append(ex)

        if has_error:
            da_instance.rollback()
            da_instance.close()
            return prot.response_fail("fail to delete items")

        da_instance.commit()
        da_instance.close()

        callback = getattr(self, 'on_delete_success', None)
        if callback:
            callback(deleted_objs)

        return prot.response_success(ids)
Esempio n. 5
0
    def insert_all(self):

        if self.requires_auth and not admin_auth.check_auth():
            return admin_auth.authenticate()

        json_str = request.form.get('data')
        json_str_list = python_json.loads(json_str)

        # db session is created and share the session with all other database access module
        da_instance = self.da_class()

        obj_list = []
        dict_list = []
        for idx, json_data in enumerate(json_str_list):
            obj = self.json2obj(json_data)
            dict_list.append(obj.get_dict())
            obj_list.append(obj)

        inserted_ids = da_instance.bulk_insert(dict_list)
        if not inserted_ids or not da_instance.commit():
            da_instance.close_session()
            return prot.response_fail("Fail to add data into database")

        tablename = da_instance.get_tablename()
        for obj_id in inserted_ids:
            insertedObj = da_instance.get_model_by_id(obj_id)
            self.add_actionlog(ActionLogDataAccess.INSERT,
                               tablename,
                               obj_id,
                               ActionLogDataAccess.data_description(self.datatype, insertedObj),
                               handled=False)

        da_instance.close_session()
        return prot.response_success()
Esempio n. 6
0
    def insert(self):

        if self.requires_auth and not admin_auth.check_auth():
            return admin_auth.authenticate()

        # db session is created and share the session with all other database access module
        da_instance = self.da_class()

        json_data = request.form.get('data')
        obj = self.json2obj(json_data)

        # obj.id = da_instance.da_base.get_next_pk()
        model_data = da_instance.insert(obj)

        if model_data is False or not da_instance.commit():
            da_instance.close_session()
            return prot.response_fail("Fail to insert data")

        inserted_id = model_data.id

        self.add_actionlog(ActionLogDataAccess.INSERT,
                           da_instance.get_tablename(),
                           model_data.id,
                           ActionLogDataAccess.data_description(self.datatype, model_data),
                           handled=False,
                           dbsession=da_instance.get_session())

        da_instance.close_session()

        return prot.response_success(obj=inserted_id)
    def tetres_client_download_data():
        """ Called when the client tries to download the data """
        try:
            outdir, filename = compress_data()
        except Exception as e:
            return prot.response_fail(message='Failed to compress data')

        return send_file(outdir + '/' + filename, as_attachment=True)
Esempio n. 8
0
    def tetres_admin_route_from_cfg():
        file_content = request.form.get('cfgfile')
        r = rc.loader.load_from_contents(base64.b64decode(file_content))
        if not isinstance(r, Route):
            return prot.response_fail(
                'fail to load_data route configuration file')

        return prot.response_success(r)
    def tetres_client_upload_data():
        """ Called when the client tries to upload the data """
        if 'file' not in request.files:
            return prot.response_fail('No file part')
        file = request.files['file']
        if file.filename == '':
            return prot.response_fail('No selected file')
        if file and allowed_file(file.filename):
            filename = 'data.zip'
            filedir = common.DATA_PATH + "/tetres/clientdatafiles"

            file.save(os.path.join(filedir, filename))
            success = extract_data(filedir, filename)
            if success:
                return prot.response_success()
            else:
                return prot.response_fail('Failed to extract data')
        return prot.response_fail('Failed to save/extract data')
Esempio n. 10
0
    def tetres_client_upload_file():
        """ Called when the client tries to upload a single file """
        if 'file' not in request.files:
            return prot.response_fail('No file part')
        file = request.files['file']
        if file.filename == '':
            return prot.response_fail('No selected file')
        if file and allowed_file(file.filename):

            filedir = common.DATA_PATH

            path = os.path.join(filedir, file.filename)
            success = file.save(path)
            if success:
                return prot.response_success()
            else:
                return prot.response_fail('Failed to save file')
        return prot.response_fail('Failed to save file')
Esempio n. 11
0
    def _wz_insert_from_wz(wzi):
        """
        :type wzi: WorkZoneInfo
        """
        if not isinstance(wzi,
                          WorkZoneInfo) or not wzi.route1 or not wzi.route2:
            return prot.response_invalid_request()

        wzDA = WorkZoneDataAccess()

        wzi.route1.name = 'route1 - %s' % wzi.route1.rnodes[0].corridor.name
        wzi.route1.desc = ''
        wzi.route2.name = 'route2 - %s' % wzi.route2.rnodes[0].corridor.name
        wzi.route2.desc = ''
        # wzi.id = wzDA.da_base.get_next_pk()

        wzm = wzDA.insert(wzi)
        if wzm is False or not wzDA.commit():
            return prot.response_fail('fail to save workzone route data (1)')

        wzi.id = wzm.id

        inserted = _wz_insert_feature(wzi)

        if inserted:

            inserted_id = wzi.id

            tetres_api.add_actionlog(ActionLogDataAccess.INSERT,
                                     wzDA.get_tablename(),
                                     inserted_id,
                                     ActionLogDataAccess.data_description(
                                         ActionLogDataAccess.DT_WORKZONE, wzi),
                                     handled=False,
                                     dbsession=wzDA.get_session())

            wzDA.close_session()
            return prot.response_success(obj=inserted_id)
        else:
            # if failed to add features
            wzDA.delete(wzm.id)
            wzDA.close_session()
            return prot.response_fail('fail to save workzone route data (2)')
Esempio n. 12
0
    def insert(self):
        json_data = request.form.get('data')
        obj = self.json2obj(json_data)
        da_instance = self.data_access_class()
        try:
            model_data = da_instance.insert(obj, autocommit=True)
        except exc.IntegrityError:
            da_instance.close()
            return prot.response_fail("Integrity Error")
        except:
            da_instance.close()
            return prot.response_fail("Unknown Error")

        da_instance.close()

        callback = getattr(self, 'on_insert_success', None)
        if callback:
            callback(obj)

        return prot.response_success(obj=model_data.id)
Esempio n. 13
0
    def tetres_snowroute_insert():
        route_json = request.form.get('data')
        info = json2snri(route_json)

        snowRouteDA = SnowRouteDataAccess()

        ex = snowRouteDA.get_by_name(info.name)
        if ex:
            snowRouteDA.close_session()
            return prot.response_fail('already exist')

        route2 = route.opposite_route(info.route1)
        cfg2 = info.route1.cfg.clone()
        rc.route_config.reverse(cfg2)
        route2.cfg = cfg2
        info.route2 = route2
        info.route1.name = 'route1 - %s' % info.route1.rnodes[0].corridor.name
        info.route1.desc = ''
        info.route2.name = 'route2 - %s' % info.route2.rnodes[0].corridor.name
        info.route2.desc = ''

        snrm = snowRouteDA.insert(info)
        if not snrm:
            snowRouteDA.close_session()
            return prot.response_fail('Fail to insert data')

        snowRouteDA.commit()

        tetresApi.add_actionlog(ActionLogDataAccess.INSERT,
                                snowRouteDA.get_tablename(),
                                snrm.id,
                                ActionLogDataAccess.data_description(
                                    ActionLogDataAccess.DT_SNOWROUTE, snrm),
                                handled=False,
                                dbsession=snowRouteDA.get_session())

        inserted_id = snrm.id

        snowRouteDA.close_session()

        return prot.response_success(obj=inserted_id)
Esempio n. 14
0
    def update(self):
        if self.requires_auth and not admin_auth.check_auth():
            return admin_auth.authenticate()

        id = request.form.get('id')
        json_data = request.form.get('data')

        # db session is created and share the session with all other database access module
        da_instance = self.da_class()

        obj = self.json2obj(json_data)
        exobj = da_instance.get_by_id(id)
        if not exobj:
            da_instance.close_session()
            return prot.response_fail("item does not exist (id={})".format(id))

        is_updated = da_instance.update(id, obj.get_dict())
        if not is_updated:
            da_instance.close_session()
            return prot.response_fail("fail to update (id={})".format(id))

        if not da_instance.commit():
            return prot.response_fail("fail to update (id={})".format(id))

        callback = getattr(self, 'on_update_success', None)
        if callback:
            callback(obj, da_instance.get_session())

        exobj = da_instance.get_by_id(id)
        self.add_actionlog(ActionLogDataAccess.UPDATE,
                           da_instance.get_tablename(),
                           id,
                           ActionLogDataAccess.data_description(self.datatype, exobj),
                           self._is_handled(exobj, obj),
                           dbsession=da_instance.get_session())

        da_instance.close_session()

        return prot.response_success(obj=id)
Esempio n. 15
0
    def tetres_route_opposite_route():
        route_id = request.form.get('id')

        da = TTRouteDataAccess()
        ttri = da.get_by_id(route_id)
        da.close_session()

        route_setup(ttri.route)
        opposite_route = route.opposite_route(ttri.route)
        if not isinstance(opposite_route, Route):
            return prot.response_fail(
                'fail to load_data route configuration file')
        return prot.response_success(opposite_route)
Esempio n. 16
0
 def update(self):
     id = request.form.get('id')
     json_data = request.form.get('data')
     da_instance = self.data_access_class()
     obj = self.json2obj(json_data)
     updated = da_instance.update(id, obj.get_dict(), autocommit=True)
     da_instance.close()
     if updated:
         callback = getattr(self, 'on_update_success', None)
         if callback:
             callback(obj)
         return prot.response_success(obj=id)
     else:
         return prot.response_fail("fail to update (id={})".format(id))
Esempio n. 17
0
    def delete(self):
        if self.requires_auth and not admin_auth.check_auth():
            return admin_auth.authenticate()

        json_str = request.form.get('ids')
        ids = python_json.loads(json_str)

        # db session is created and share the session with all other database access module
        da_instance = self.da_class()

        deleted_objs = [da_instance.get_by_id(id) for id in ids]
        deleted_objs = [v for v in deleted_objs if v]
        ex_ids = [v.id for v in deleted_objs if v]
        is_deleted = da_instance.delete_items(ex_ids, print_exception=True)
        if not is_deleted:
            da_instance.close_session()
            return prot.response_fail("fail to delete items")

        if not da_instance.commit():
            return prot.response_fail("fail to delete items")

        callback = getattr(self, 'on_delete_success', None)
        if callback:
            callback(deleted_objs, da_instance.get_session())

        for idx, obj_id in enumerate(ex_ids):
            deletedObj = deleted_objs[idx]
            self.add_actionlog(ActionLogDataAccess.DELETE,
                               da_instance.get_tablename(),
                               obj_id,
                               ActionLogDataAccess.data_description(self.datatype, deletedObj),
                               handled=True,
                               dbsession=da_instance.get_session())

        da_instance.close_session()

        return prot.response_success(ids)
Esempio n. 18
0
 def _wz_insert_from_route(wzi, route_json):
     """
     :type wzi: WorkZoneInfo
     :type route_json: str
     """
     route1 = json2route(route_json)
     route2 = route.opposite_route(route1)
     if not isinstance(route2, Route):
         return prot.response_fail(
             'fail to load_data route configuration file')
     cfg2 = route1.cfg.clone()
     route2.cfg = rc.route_config.reverse(cfg2)
     wzi.route1 = route1
     wzi.route2 = route2
     return _wz_insert_from_wz(wzi)
    def tetres_pi_get():
        route_id = request.form.get('route_id')
        depart_time = request.form.get('depart_time')
        weather_type = request.form.get('weather_type', None)

        try:
            depart_time = datetime.datetime.strptime(depart_time,
                                                     '%Y-%m-%d %H:%M')
        except:
            return prot.response_fail(
                'depart_time format must be "%Y-%m-%d %H:%M:00"')

        try:
            reliabilites, traveltimes = traveltime_info.traveltime_info(
                route_id, weather_type, depart_time)
        except Exception as ex:
            tb.traceback(ex)
            return prot.response_fail(
                'fail to extract data for the given route')

        return prot.response_success({
            'reliabilities': reliabilites,
            'traveltimes': traveltimes
        })
Esempio n. 20
0
 def tetres_admin_xlsx_content_from_route():
     route_content = request.form.get('route')
     r = json2route(route_content)
     try:
         tmp_dir = Infra.get_infra().get_path('tmp', create=True)
         uid = str(uuid.uuid4())
         filepath = os.path.join(tmp_dir, '%s.xlsx' % uid)
         if not r.cfg:
             r.cfg = route_config.create_route_config(r.rnodes)
         rc.writer.write(filepath, r)
         with open(filepath, 'rb') as f:
             file_content = f.read()
             encoded = base64.b64encode(file_content)
             return prot.response_success(obj=encoded.decode('utf-8'))
     except Exception as ex:
         tb.traceback(ex)
         return prot.response_fail('fail to write route')
    def tetres_user_get_result():
        uid = request.form.get('uid')
        if not uid:
            return prot.response_error('invalid request')

        output_path = util.output_path(uid, create=False)
        output_filepath = '%s.zip' % output_path

        # file is ready
        if os.path.exists(output_filepath):
            return prot.response_success('file is ready')

        # process is runninng
        elif os.path.exists(output_path):
            return prot.response_fail('process is running')

        # invalid uid
        else:
            return prot.response_error('invalid uid')
    def tetres_syscfg_update():
        cfginfo_json = request.form.get('cfg', None)
        if not cfginfo_json:
            return prot.response_invalid_request()

        cfginfo = json.loads(cfginfo_json, SystemConfigInfo)

        if not cfginfo or not isinstance(cfginfo, SystemConfigInfo):
            return prot.response_invalid_request()

        for k, v in cfginfo.__dict__.items():
            if k.startswith('_'):
                continue
            if v is None:
                return prot.response_invalid_request()

        prev_syscfg = systemconfig.set_system_config_info(cfginfo)
        if not prev_syscfg:
            return prot.response_fail('fail to update configuration')

        put_task_to_actionlog(prev_syscfg)

        return prot.response_success()
    def ncrtes_ts_update():
        year = int(request.form.get('year'))
        station_id = request.form.get('station_id')
        detectors = request.form.get('detectors')

        infra = ncrtes.get_infra()
        str_detectors = str(detectors)

        if not year:
            return prot.response_fail('Year Info must be entered.')

        if not station_id:
            return prot.response_fail('Station Info must be entered.')

        if not detectors:
            return prot.response_fail('Detectors must be entered.')

        station = infra.get_rnode(station_id)
        if not station:
            return prot.response_fail('Station %s does not exists.' %
                                      station_id)

        station_detectors = [det.name for det in station.detectors]
        detectors = [x.strip() for x in detectors.split(',')]
        for det_name in detectors:
            det = infra.get_detector(det_name)
            if not det:
                return prot.response_fail('Detector %s does not exists.' %
                                          det_name)
            if det.name not in station_detectors:
                return prot.response_fail(
                    'Detector %s does not exists on the station.' % det_name)

        wsDA = WinterSeasonDataAccess()
        wsi = wsDA.get_by_year(year)
        if not wsi:
            months = get_normal_months_from_year(year)
            wsi = itypes.WinterSeasonInfo()
            wsi.set_months(months)
            wsi.name = 'WinterSeason %s-%s' % (months[0][0], months[-1][0])
            wsDA.insert(wsi, autocommit=True)
        wsDA.close()

        tsDA = TargetStationDataAccess()
        ex_tsi = tsDA.get_by_station_id(year, station_id)
        tsDA.close()

        tlcDA = TargetLaneConfigDataAccess()
        ex_tlci = tlcDA.get_by_station_id(year, station_id)
        if not ex_tlci:
            ex_tlci = itypes.TargetLaneConfigInfo()
            ex_tlci.winterseason_id = wsi.id
            ex_tlci.station_id = station_id
            ex_tlci.detectors = ''
            ex_tlci.corridor_name = station.corridor.name
            model = tlcDA.insert(ex_tlci, autocommit=True)
            ex_tlci.id = model.id

        # update normal function
        if ex_tsi and ex_tlci.detectors != str_detectors:
            target_station = infra.get_rnode(ex_tlci.station_id)
            valid_detectors = [
                infra.get_detector(det_name) for det_name in detectors
            ]
            normal_months = get_normal_months_from_year(year)
            nf, nfi = None, None
            try:
                nf, nfi = _update_normal_function(target_station,
                                                  normal_months,
                                                  valid_detectors)
            except Exception as ex:
                from pyticas.tool import tb
                tb.traceback(ex)

        # query to update database
        ex_tlci.detectors = ','.join(detectors)
        updated = tlcDA.update(ex_tlci.id, ex_tlci.get_dict(), autocommit=True)

        tlcDA.close()
        if updated:
            return prot.response_success(obj=ex_tlci.id)
        else:
            return prot.response_fail("fail to update (id={})".format(
                ex_tlci.id))
Esempio n. 24
0
    def tetres_workzone_update():
        wz_id = request.form.get('id')
        wz_json = request.form.get('data')

        wzDA = WorkZoneDataAccess()

        exWZObj = wzDA.get_by_id(wz_id)
        if not exWZObj:
            wzDA.close_session()
            return prot.response_invalid_request()

        info = json2wzi(wz_json)
        route2 = route.opposite_route(info.route1)
        cfg2 = info.route1.cfg.clone()
        rc.route_config.reverse(cfg2)
        route2.cfg = cfg2
        info.route2 = route2
        info.route1.name = 'route1 - %s' % info.route1.rnodes[0].corridor.name
        info.route1.desc = ''
        info.route2.name = 'route2 - %s' % info.route2.rnodes[0].corridor.name
        info.route2.desc = ''

        if not isinstance(info.route2, Route):
            wzDA.close_session()
            return prot.response_fail(
                'fail to load_data route configuration file')

        wzgDA = WZGroupDataAccess(session=wzDA.get_session())

        is_updated = wzDA.update(wz_id, info.get_dict())
        if not is_updated or not wzDA.commit():
            wzDA.rollback()
            wzDA.close_session()
            return prot.response_fail('fail to update database (1)')

        is_updated = wzgDA.update_years(exWZObj.wz_group_id)
        if not is_updated or not wzgDA.commit():
            wzgDA.rollback()
            wzgDA.close_session()
            return prot.response_fail('fail to update database (2)')

        updatedWZObj = wzDA.get_by_id(wz_id)

        inserted = _wz_insert_feature(updatedWZObj)
        if not inserted:
            wzDA.close_session()
            return prot.response_fail('fail to update database (3)')

        # commit here
        # if not wzDA.commit():
        #     return prot.response_fail('fail to update database (4)')

        tetres_api.add_actionlog(ActionLogDataAccess.UPDATE,
                                 wzDA.get_tablename(),
                                 wz_id,
                                 ActionLogDataAccess.data_description(
                                     ActionLogDataAccess.DT_WORKZONE,
                                     updatedWZObj),
                                 handled=_should_be_set_as_handled(
                                     exWZObj, updatedWZObj),
                                 dbsession=wzDA.get_session())

        wzDA.close_session()

        return prot.response_success(wz_id)
Esempio n. 25
0
 def moe_rwis():
     return prot.response_fail('Not Implemented')