Exemple #1
0
def getData(module=u''):
    """
    Frontend area is reachable unter `http://[servername]:[port]/data/[module]`

    This path is used to run background operations (e.g. ajax calls) and delivers the result of the `getFrontendData`
    method of the module. If **format=json** in the url the result will be formated as json

    :param module: module name as string
    :return: return value of `getFrontendData` method of `module`
    """
    current_mod = frontend.modules['startpages']

    if module == u"frontpage" and 'action' in request.args:
        if request.args.get('action') == 'info':
            return render_template('frontend.emonitorinfo.html', app_name=current_app.config.get('PROJECT'), app_version=current_app.config.get('APP_VERSION'))
        elif request.args.get('action') == 'systeminfo':
            return render_template('frontend.systeminfo.html')
        elif request.args.get('action') == 'restart':
            from emonitor.extensions import scheduler
            scheduler.add_job(restartService)
            return ""
        elif request.args.get('action') == 'translatebaseinfo':
            return jsonify({'connection_info': babel.gettext(u'frontend.connection_info')})

    try:
        current_mod = [frontend.modules[m] for m in frontend.modules if frontend.modules[m].info['path'] == module.split('/')[0]][0]
    except IndexError:
        current_app.logger.info("module '%s' not found" % module)

    result = current_mod.getFrontendData()
    if request.args.get('format') == 'json':
        result = jsonify(result)
    return result
def loadTiles(path, tilelist):
    """
    Load map tiles into path from given tilelist

    :param path: path to store map tiles
    :param tilelist: list of tiles to load from OSM
    :return: progress information *[position, number of tiles to load]* as list
    """
    from emonitor.extensions import scheduler
    LOADTILES.append(tilelist[min(tilelist.keys())][0])  # add selected tile
    CURRENTLOADING.extend(sum(tilelist.values(), []))  # add tiles
    signal.send('map', 'tiledownloadstart', tiles=tilelist[min(tilelist.keys())][0])

    def doLoadTiles(**kwargs):

        def getTile(zoom, item):
            response = urllib2.urlopen('http://a.tile.openstreetmap.org/{}/{}/{}.png'.format(zoom, item[0], item[1]))
            with open('{}/{}/{}-{}.png'.format(path, zoom, item[0], item[1]), 'wb') as fout:
                fout.write(response.read())
            if item in CURRENTLOADING:
                CURRENTLOADING.remove(item)

        if 'path' in kwargs:
            path = kwargs['path']
        else:
            return

        if 'tilelist' in kwargs:
            tilelist = kwargs['tilelist']
        else:
            return

        errortiles = []

        for zoom in tilelist:
            if not os.path.exists('{}/{}'.format(path, zoom)):
                os.makedirs('{}/{}'.format(path, zoom))
            for item in tilelist[zoom]:
                if len(CURRENTLOADING) == 0:  # loding stopped or ended
                    return
                if (len(LOADTILES) * 5460 - len(CURRENTLOADING)) % 10 == 0:  # send state every 10 loads
                    signal.send('map', 'tiledownloadprogress', progress=(len(LOADTILES) * 5460 - len(CURRENTLOADING), len(LOADTILES) * 5460), tiles=LOADTILES)
                try:
                    getTile(zoom, item)
                except:
                    errortiles.append((zoom, item))
        # try error objects
        for err in errortiles:
            try:
                getTile(err[0], err[1])
            except:
                print "error in {}".format(err)
        signal.send('map', 'tiledownloaddone', tiles=tilelist[min(tilelist.keys())][0])

    scheduler.add_job(doLoadTiles, kwargs={'path': path, 'tilelist': tilelist})
    return 1  # loading started
Exemple #3
0
    def handleEvent(eventname, **kwargs):
        from emonitor.extensions import scheduler

        if eventname == "client_income":
            return kwargs
        params = dict()

        try:
            hdl = [
                hdl for hdl in Eventhandler.getEventhandlers(event=eventname)
                if hdl.handler == 'emonitor.monitorserver.MonitorServer'
            ][0]

            for p in [
                    v[1] for v in hdl.getParameterValues('in') if v[1] != ''
            ]:  # required parameters for method
                if p in kwargs:
                    params[p] = kwargs[p]
        except:
            hdl = []
            logger.error('handleEvent: {}'.format(traceback.format_exc()))

        if kwargs['mode'] != 'test':
            for monitorlayout in MonitorLayout.getLayouts():
                try:
                    if monitorlayout.trigger == eventname:
                        for p in hdl.getParameterValues('in'):
                            if p[0] == 'in.condition' and p[
                                    1] == '!activealarm':
                                if Alarm.getActiveAlarms().count() == 0:
                                    MonitorServer.changeLayout(
                                        monitorlayout.monitor.clientid,
                                        monitorlayout.id, **params)

                        scheduler.deleteJobForEvent('changeLayout')
                        MonitorServer.changeLayout(
                            monitorlayout.monitor.clientid, monitorlayout.id,
                            **params)
                        if monitorlayout.nextid != 0:
                            scheduler.add_job(
                                MonitorServer.changeLayout,
                                next_run_time=datetime.datetime.fromtimestamp(
                                    time.time() + monitorlayout.maxtime),
                                args=[
                                    monitorlayout.monitor.clientid,
                                    monitorlayout.nextid, params
                                ])
                except:
                    pass
                finally:
                    pass

        if 'time' not in kwargs.keys():
            kwargs['time'] = []
        kwargs['time'].append('monitorserver: message sent')
        return kwargs
def loadTiles(path, tilelist):
    """
    Load tiles from OpenStreetMap and store tiles in local directory

    :param path: store path as string
    :param tilelist: list of tiles to load
    """
    global LOADINPROGRESS
    
    def doLoadTiles(**kwargs):
        global LOADINPROGRESS
        
        def getTile(zoom, item):
            response = urllib2.urlopen('http://a.tile.openstreetmap.org/%s/%s/%s.png' % (zoom, item[0], item[1]))
            LOADINPROGRESS[1] += 1
            #print "get", LOADINPROGRESS[1]
            with open('%s/%s/%s-%s.png' % (path, zoom, item[0], item[1]), 'wb') as fout:
                fout.write(response.read())
        if 'path' in kwargs:
            path = kwargs['path']
        else:
            return
            
        if 'tilelist' in kwargs:
            tilelist = kwargs['tilelist']
        else:
            return

        errortiles = []

        for zoom in tilelist:
            if not os.path.exists('%s/%s' % (path, zoom)):
                os.makedirs('%s/%s' % (path, zoom))
            for item in tilelist[zoom]:
                try:
                    getTile(zoom, item)
                except:
                    errortiles.append((zoom, item))
        # try error objects
        for err in errortiles:
            try:
                getTile(err[0], err[1])
            except:
                print "error in {}".format(err)
            
        LOADINPROGRESS = [0, 0]
    
    if LOADINPROGRESS[0] != 0:
        return LOADINPROGRESS  # still in progress
    
    LOADINPROGRESS = [sum(map(lambda x:len(tilelist[x]), tilelist)), 0]  # init progress
    scheduler.add_job(doLoadTiles, next_run_time=datetime.datetime.fromtimestamp(time.time() + 2), kwargs={'path': path, 'tilelist': tilelist})
    return 1  # loading started
def getAdminData(self):
    """
    Deliver admin content of module mapitems (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'loadfromosm':  # load all objects from osm
        itemdefinition = [t for t in Settings.get('mapitemdefinition') if t['name'] == request.args.get('type')][0]
        dbodmids = [int(i.osmid) for i in MapItem.getMapitems(itemtype=itemdefinition['name'])]

        for cid in itemdefinition['cities']:
            city = City.getCities(id=cid)
            for item in MapItem.loadFromOSM(itemdefinition, city.name):
                if int(item['id']) > 0 and int(item['id']) not in dbodmids:  # add item
                    attrs = item.copy()
                    del attrs['id']
                    db.session.add(MapItem(itemdefinition['name'], int(item['id']), attrs))
                else:  # update
                    pass  # TODO write update method

        db.session.commit()

    elif request.args.get('action') == 'uploadlayouter':
        if request.files:
            ufile = request.files['uploadfile']
            if not os.path.exists('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename)):
                ufile.save('%s/emonitor/modules/mapitems/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                try:
                    cls = imp.load_source('emonitor.modules.mapitems.inc', 'emonitor/modules/mapitems/inc/%s' % ufile.filename)
                    if isinstance(getattr(cls, cls.__all__[0])(), ItemLayout):
                        return "ok"
                except:
                    pass
                os.remove('%s/emonitor/modules/mapitems/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                return babel.gettext(u'admin.mapitems.layouternotvalid')
        return ""

    elif request.args.get('action') == 'buildtiles':
        itemdefinition = [t for t in Settings.get('mapitemdefinition') if t['name'] == request.args.get('type')][0]
        for layouter in MapItem.getLayouters():
            if layouter.getName() == itemdefinition['parameters']['layout']:
                scheduler.add_job(layouter.buildTiles, args=[MapItem.getMapitems(itemdefinition['name']), itemdefinition['attributes']])
                break

    return ""
Exemple #6
0
 def initMessageTrigger():
     """Init scheduler tasks for messages"""
     job = scheduler.add_job(Messages.doMessageTrigger,
                             name="messages",
                             id="messages",
                             trigger=MessageTrigger(
                                 Messages.getActiveMessages(), minutes=60))
     if len(job.trigger.messagelist
            ) == 0:  # pause job if no active messages
         job.pause()
Exemple #7
0
def getData(module=u''):
    """
    Frontend area is reachable unter `http://[servername]:[port]/data/[module]`

    This path is used to run background operations (e.g. ajax calls) and delivers the result of the `getFrontendData`
    method of the module. If **format=json** in the url the result will be formated as json

    :param module: module name as string
    :return: return value of `getFrontendData` method of `module`
    """
    current_mod = frontend.modules['startpages']

    if module == u"frontpage" and 'action' in request.args:
        if request.args.get('action') == 'info':
            return render_template(
                'frontend.emonitorinfo.html',
                app_name=current_app.config.get('PROJECT'),
                app_version=current_app.config.get('APP_VERSION'))
        elif request.args.get('action') == 'systeminfo':
            return render_template('frontend.systeminfo.html')
        elif request.args.get('action') == 'restart':
            from emonitor.extensions import scheduler
            scheduler.add_job(restartService)
            return ""
        elif request.args.get('action') == 'translatebaseinfo':
            return jsonify({
                'connection_info':
                babel.gettext(u'frontend.connection_info')
            })

    try:
        current_mod = [
            frontend.modules[m] for m in frontend.modules
            if frontend.modules[m].info['path'] == module.split('/')[0]
        ][0]
    except IndexError:
        current_app.logger.info("module '%s' not found" % module)

    result = current_mod.getFrontendData()
    if request.args.get('format') == 'json':
        result = jsonify(result)
    return result
Exemple #8
0
 def initMessageTrigger():
     """Init scheduler tasks for messages"""
     job = scheduler.add_job(Messages.doMessageTrigger,
                             name="messages",
                             id="messages",
                             trigger=MessageTrigger(
                                 Messages.getActiveMessages(), minutes=60))
     if len(job.trigger.messagelist
            ) == 0:  # pause job if no active messages
         job.pause()
     logger.info('scheduler job init done, next run at %s' %
                 job.next_run_time)
Exemple #9
0
    def handleEvent(eventname, **kwargs):
        from emonitor.extensions import scheduler

        if eventname == "client_income":
            return kwargs
        params = dict()
        
        try:
            hdl = [hdl for hdl in Eventhandler.getEventhandlers(event=eventname) if hdl.handler == 'emonitor.monitorserver.MonitorServer'][0]
            
            for p in [v[1] for v in hdl.getParameterValues('in') if v[1] != '']:  # required parameters for method
                if p in kwargs:
                    params[p] = kwargs[p]
        except:
            hdl = []
            logger.error('handleEvent: {}'.format(traceback.format_exc()))

        if kwargs['mode'] != 'test':
            for monitorlayout in MonitorLayout.getLayouts():
                try:
                    if monitorlayout.trigger == eventname:
                        for p in hdl.getParameterValues('in'):
                            if p[0] == 'in.condition' and p[1] == '!activealarm':
                                if Alarm.getActiveAlarms().count() == 0:
                                    MonitorServer.changeLayout(monitorlayout.monitor.clientid, monitorlayout.id, **params)

                        scheduler.deleteJobForEvent('changeLayout')
                        MonitorServer.changeLayout(monitorlayout.monitor.clientid, monitorlayout.id, **params)
                        if monitorlayout.nextid != 0:
                            scheduler.add_job(MonitorServer.changeLayout, next_run_time=datetime.datetime.fromtimestamp(time.time() + monitorlayout.maxtime), args=[monitorlayout.monitor.clientid, monitorlayout.nextid, params])
                except:
                    pass
                finally: pass
        
        if 'time' not in kwargs.keys():
            kwargs['time'] = []
        kwargs['time'].append('monitorserver: message sent')
        return kwargs
def getData(module=u""):
    """
    Frontend area is reachable unter `http://[servername]:[port]/data/[module]`

    This path is used to run background operations (e.g. ajax calls) and delivers the result of the `getFrontendData`
    method of the module. If **format=json** in the url the result will be formated as json

    :param module: module name as string
    :return: return value of `getFrontendData` method of `module`
    """
    current_mod = frontend.modules["startpages"]

    if module == u"frontpage" and "action" in request.args:
        if request.args.get("action") == "info":
            return render_template(
                "frontend.emonitorinfo.html",
                app_name=current_app.config.get("PROJECT"),
                app_version=current_app.config.get("APP_VERSION"),
            )
        elif request.args.get("action") == "restart":
            from emonitor.extensions import scheduler

            scheduler.add_job(restartService)
            return ""

    try:
        current_mod = [
            frontend.modules[m] for m in frontend.modules if frontend.modules[m].info["path"] == module.split("/")[0]
        ][0]
    except IndexError:
        current_app.logger.info("module '%s' not found" % module)

    result = current_mod.getFrontendData()
    if request.args.get("format") == "json":
        result = jsonify(result)
    return result
    def updateSchedules(self, reference=0):
        """
        set scheduler events for current alarm:

        * autoclose
        * autoarchive

        :param reference: 0 (default)= time.time()
                          1 = alarm.timestamp
        """
        for job in scheduler.get_jobs():  # remove schedules of current alarm
            if job.name.startswith('alarms_') and job.name.endswith('_{}'.format(self.id)):
                scheduler.remove_job(job.id)

        if reference == 0:
            reference = time.time()
        else:
            reference = time.mktime(self.timestamp.timetuple())

        # test autoclose
        if self.state == 1 and self.type == 1 and Settings.get('alarms.autoclose', '0') != '0':  # only for open alarms
            closingtime = reference + float(Settings.get('alarms.autoclose', 30)) * 60.0  # minutes -> seconds
            if closingtime > time.time():  # close alarm in future
                logger.debug("add close schedule in future for alarmid {}".format(self.id))
                scheduler.add_job(self.changeState, run_date=datetime.datetime.fromtimestamp(closingtime), args=[self.id, 2], name="alarms_close_{}".format(self.id))
            else:  # close alarm now
                logger.debug("add close schedule now for alarmid {}".format(self.id))
                scheduler.add_job(self.changeState, args=[self.id, 2], name="alarms_close_{}".format(self.id))
                self.state = 2

        # test autoarchive
        if self.state == 2 and Settings.get('alarms.autoarchive', '0') != '0':  # only closed alarms
            archivetime = reference + float(Settings.get('alarms.autoarchive', 12)) * 3600.0  # hours -> seconds
            if archivetime > time.time():  # archive alarm in future
                logger.debug("add archive schedule in future for alarmid {}".format(self.id))
                scheduler.add_job(self.changeState, run_date=datetime.datetime.fromtimestamp(archivetime), args=[self.id, 3], name="alarms_archive_{}".format(self.id))
            else:  # archive alarm now
                logger.debug("add archive schedule now for alarmid {}".format(self.id))
                scheduler.add_job(self.changeState, args=[self.id, 3], name="alarms_archive_{}".format(self.id))
Exemple #12
0
    def updateSchedules(self, reference=0):
        """
        set scheduler events for current alarm:

        * autoclose
        * autoarchive

        :param reference: 0 (default)= time.time()
                          1 = alarm.timestamp
        """
        for job in scheduler.get_jobs():  # remove schedules of current alarm
            if job.name.startswith('alarms_') and job.name.endswith('_{}'.format(self.id)):
                scheduler.remove_job(job.id)

        if reference == 0:
            reference = time.time()
        else:
            reference = time.mktime(self.timestamp.timetuple())

        # autoclose
        if self.state == 1 and self.type == 1 and Settings.get('alarms.autoclose', '0') != '0':  # only for open alarms
            closingtime = reference + float(Settings.get('alarms.autoclose', 30)) * 60.0  # minutes -> seconds
            if closingtime > time.time():  # close alarm in future
                logger.debug("add close schedule in future for alarmid {}".format(self.id))
                scheduler.add_job(Alarm.changeState, run_date=datetime.datetime.fromtimestamp(closingtime), args=[self.id, 2], name="alarms_close_{}".format(self.id))
            else:  # close alarm now
                logger.debug("add close schedule now for alarmid {}".format(self.id))
                scheduler.add_job(Alarm.changeState, args=[self.id, 2], name="alarms_close_{}".format(self.id))
                self.state = 2

        # autoarchive
        if self.state == 2 and Settings.get('alarms.autoarchive', '0') != '0':  # only closed alarms
            archivetime = reference + float(Settings.get('alarms.autoarchive', 12)) * 3600.0  # hours -> seconds
            if archivetime > time.time():  # archive alarm in future
                logger.debug("add archive schedule in future for alarmid {}".format(self.id))
                scheduler.add_job(Alarm.changeState, run_date=datetime.datetime.fromtimestamp(archivetime), args=[self.id, 3], name="alarms_archive_{}".format(self.id))
            else:  # archive alarm now
                logger.debug("add archive schedule now for alarmid {}".format(self.id))
                scheduler.add_job(Alarm.changeState, args=[self.id, 3], name="alarms_archive_{}".format(self.id))
Exemple #13
0
 def initMessageTrigger():
     """Init scheduler tasks for messages"""
     job = scheduler.add_job(Messages.doMessageTrigger, name="messages", id="messages", trigger=MessageTrigger(Messages.getActiveMessages(), minutes=60))
     if len(job.trigger.messagelist) == 0:  # pause job if no active messages
         job.pause()
    def changeState(id, state):
        """
        Change state of alarm with given id. Adds entry in alarmhistory and sends signal

        :param id: id of alarm
        :param state: new state as :py:attr:`emonitor.modules.alarms.alarm.Alarm.ALARMSTATES`
        """
        from emonitor.extensions import monitorserver
        global LASTALARM
        alarm = Alarm.getAlarms(id=id)
        if not alarm:
            return []

        if alarm.state != state:  # only change
            _op = 'changestate'
        else:
            _op = 'added'

        if alarm.get('alarmtype', '') != '':
            _type = '.{}'.format(alarm.get('alarmtype'))
        else:
            _type = ''

        alarm.state = state
        try:
            alarm.addHistory('autochangeState', Alarm.ALARMSTATES[str(state)])
        except KeyError:
            alarm.addHistory('autochangeState', 'archived')
        db.session.commit()

        if state == 1:  # activate alarm
            c = []
            for a in Alarm.getActiveAlarms():  # check cars
                if a.id == id:
                    continue
                c.extend(set(a.cars1).intersection(set(alarm.cars1)))
                c.extend(set(a.cars2).intersection(set(alarm.cars2)))
                c.extend(set(a.material).intersection(set(alarm.material)))

            if time.time() - LASTALARM < 60.0:
                try:
                    ids = [a.id for a in Alarm.getActiveAlarms()]
                    for j in [job for job in scheduler.get_jobs() if job.name == 'changeLayout']:
                        for i in ids:
                            if "'alarmid', %s" % i in str(j.args):  # layout changes for given alarm
                                scheduler.unschedule_job(j)
                except:
                    logger.error('%s' % [a.id for a in Alarm.getActiveAlarms()])
            LASTALARM = time.time()
            alarm.updateSchedules(reference=0)  # use current time + delta
            j = scheduler.add_job(events.raiseEvent, next_run_time=datetime.datetime.fromtimestamp(LASTALARM), args=['alarm_{}{}'.format(_op, _type)], kwargs={'alarmid': id}, name="alarms_activate_{}".format(id))
            signal.send('alarm', 'added', alarmid=id)
            try:
                flash(babel.gettext(u'alarms.statechangeactivated'), 'alarms.activate')
            except:
                pass
            finally:
                monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
                #signal.send('alarm', 'changestate', newstate=1)
                return list(set(c))

        elif state == 2:  # close alarm
            LASTALARM = 0.0
            alarm.updateSchedules(reference=1)  # use alarm.timestamp + delta
            monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
            signal.send('alarm', 'changestate', newstate=2)
            return []

        elif state == 3:  # archive alarm
            alarm.updateSchedules()
            signal.send('alarm', 'changestate', newstate=3)
            return []

        signal.send('alarm', 'changestate', newstate=state)
Exemple #15
0
def getAdminData(self):
    """
    Deliver admin content of module streets (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'loadcitiesfromosm':  # get city list from osm
        return loadCitiesFromOsm()

    elif request.args.get('action') == 'createcity':  # create cities from osm
        osmids = [c[0] for c in db.get(City.osmid).all()]
        i = 0
        for c in request.args.get('values').split(","):
            _id, name = c.split('|')
            if int(_id) not in osmids:  # add city
                db.session.add(City(name, 1, '', 0, '', '', int(_id), ''))
                db.session.commit()
                i += 1

        flash(babel.gettext('%(i)s admin.streets.cities.osmcitiesadded', i=i))
        self.updateAdminSubNavigation()
        return '1'

    elif request.args.get('action') == 'loadstreetsfromosm':  # get street list from osm
        return loadStreetsFromOsm(City.getCities(id=request.args.get('cityid')))

    elif request.args.get('action') == 'createstreet':  # create streets from osm
        city = City.getCities(id=request.args.get('cityid'))
        ids = [int(i) for i in request.args.get('values').split(",")]  # ids to create
        osmdata = loadStreetsFromOsm(city=city, format='data')

        i = 0
        for sname in osmdata:
            if len(set(osmdata[sname]['osmids']).intersection(set(ids))) > 0:  # add street
                _s = osmdata[sname]
                city.addStreet(
                    Street(sname, '', int(request.args.get('cityid')), '', _s['center'][0], _s['center'][1], 17, 1,
                           _s['osmids'][0]))
                i += 1
        flash(babel.gettext('%(i)s admin.streets.osmstreetsadded', i=i))
        return '1'

    elif request.args.get('action') == 'loadhnumbersfromosm':
        if 'streetid' in request.args:
            streets = Street.getStreets(id=int(request.args.get('streetid')))
        elif 'cityid' in request.args:
            streets = [City.getCities(id=request.args.get('cityid'))]
        else:
            streets = Street.getStreets()
        return str(scheduler.add_job(loadHousenumbersFromOsm, args=[streets]))

    elif request.args.get('action') == 'loadhnumbers':  # load all housenumbers for street
        street = Street.getStreets(id=request.args.get('streetid'))
        ret = dict()
        for hn in street.housenumbers:
            ret[hn.id] = hn.points
        return ret

    elif request.args.get('action') == 'delhousenumber':  # delete housenumber
        hn = Housenumber.getHousenumbers(id=request.args.get('housenumberid'))
        street = hn.street
        db.session.delete(hn)
        db.session.commit()
        return render_template('admin.streets.housenumber.html', hnumbers=street.housenumbers)

    elif request.args.get('action') == 'addhousenumber':  # add housenumber
        street = Street.getStreets(id=request.args.get('streetid'))
        points = []
        p = request.args.get('points').split(';')
        points.append((float(p[0]), float(p[1])))
        street.addHouseNumber(request.args.get('hnumber'), points)
        return render_template('admin.streets.housenumber.html', hnumbers=street.housenumbers)

    return "NONE"
Exemple #16
0
def monitorContent(clientid=0):
    """
    Create monitor area under url */monitor*

    :return: rendered template */emonitor/monitor/templates/monitor.html*
    """
    alarmid = None
    footer = 0
    count = []
    pos = 0

    if 'alarmid' in request.args:  # eval active alarms or defined id
        alarmid = int(request.args.get('alarmid'))
        if len(Alarm.getActiveAlarms()) > 0:
            count = Alarm.getActiveAlarms()
    elif len(Alarm.getActiveAlarms()) > 0:
        alarmid = Alarm.getActiveAlarms()[0].id
        count = Alarm.getActiveAlarms()
    alarm = Alarm.getAlarms(id=alarmid)

    defmonitor = Monitor.getMonitors(clientid=int(clientid))
    try:
        layout = defmonitor.currentlayout
    except AttributeError:
        return render_template('monitor-test.html')

    if 'layoutid' in request.args:  # eval current layout
        layout = defmonitor.layout(int(request.args.get('layoutid')))
    else:
        try: layout = defmonitor.getLayouts(triggername='default')[0]
        except: pass

    if len(count) > 0:  # eval layout for current and next alarm
        footer = 1
        nextalarm = currentalarm = count[0]
        for c in count:
            if c.id == alarmid:
                pos = count.index(c) + 1
                currentalarm = count[(pos - 1) % len(count)]
                nextalarm = count[pos % len(count)]

            for j in [job for job in scheduler.get_jobs(name='changeLayout') if "'alarmid', %s" % c.id in str(job.args)]:
                scheduler.remove_job(j.id)  # layout changes for given alarm

        for l in defmonitor.getLayouts(triggername='alarm_added'):
            for tr in l.trigger.split(';'):  # support more than one trigger for layout
                if ('.' in tr and len(count) >= 1 and tr.split('.')[-1] == currentalarm.get('alarmtype')) or ('.' not in tr and currentalarm.get('alarmtype', '') == ""):
                    layout = l
                    break

        if len(count) > 1:
            for l in defmonitor.getLayouts(triggername='alarm_added'):
                for tr in l.trigger.split(';'):  # support more than one trigger for layout
                    if ('.' in tr and tr.split('.')[-1] == nextalarm.get('alarmtype')) or ('.' not in tr and nextalarm.get('alarmtype', '') == ""):
                        if int(l.mintime) != 0:
                            #scheduler.add_job(monitorserver.changeLayout, next_run_time=datetime.datetime.fromtimestamp(time.time() + float(l.mintime)), args=[defmonitor.clientid, l.id, [('alarmid', nextalarm.id), ('monitorid', defmonitor.id)]])
                            scheduler.add_job(monitorserver.changeLayout, next_run_time=datetime.datetime.fromtimestamp(time.time() + float(l.mintime)), args=[defmonitor.clientid, l.id], kwargs=dict(alarmid=nextalarm.id))  # TODO

    # render content for monitor
    content = '<div id="content">%s</div>' % layout.htmllayout
    for w in re.findall('\[\[\s?(.+?)\s?\]\]', content):
        for widgets in current_app.blueprints['widget'].modules:
            for widget in widgets.getMonitorWidgets():
                if widget.getName() == w:
                    params = widget.addParameters(alarmid=alarmid, alarm=alarm, clientid=clientid, layout=layout)
                    if params and 'footer' in params and params['footer'] == 1:
                        footer = 1
                    content = content.replace(u'[[%s]]' % w, widget.getHTML(request))

    return render_template('monitor.html', content=content, clientid=clientid, theme=layout.theme, activecount=len(count), footer=footer, position=pos, app_name=current_app.config.get('PROJECT'), app_version=current_app.config.get('APP_VERSION'))
Exemple #17
0
def getAdminData(self):
    """
    Deliver admin content of module alarms (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'upload':
        if request.files:
            ufile = request.files['uploadfile']
            fname = os.path.join(current_app.config.get('PATH_TMP'), ufile.filename)
            ufile.save(fname)

            scheduler.add_job(processFile, args=[current_app.config.get('PATH_TMP'), ufile.filename])  # schedule operation
        return ""

    elif request.args.get('action') == 'uploadchecker':
        if request.files:
            ufile = request.files['uploadfile']
            if not os.path.exists('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename)):
                ufile.save('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                try:
                    cls = imp.load_source('emonitor.modules.alarms.inc', 'emonitor/modules/alarms/inc/%s' % ufile.filename)
                    if isinstance(getattr(cls, cls.__all__[0])(), AlarmFaxChecker):
                        return "ok"
                except:
                    pass
                os.remove('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                return babel.gettext(u'admin.alarms.checkernotvalid')
        return ""

    elif request.args.get('action') == 'uploaddefinition':
        """
        add alarmtype with given config for uploadfile
        """
        alarmtype = AlarmType.buildFromConfigFile(request.files['uploadfile'])
        if not alarmtype:
            db.session.rollback()
            return babel.gettext(u'admin.alarms.incorrecttypedefinition')
        db.session.add(alarmtype)
        db.session.commit()
        return "ok"

    elif request.args.get('action') == 'gettypedefinition':
        """
        export alarmtype definition as cfg-file
        """
        alarmtype = AlarmType.getAlarmTypes(request.args.get('alarmtype'))
        if alarmtype:
            return Response(alarmtype.getConfigFile(), mimetype="application/x.download; charset=utf-8")
        else:
            return None

    elif request.args.get('action') == 'getkeywords':
        """
        send list with all keywords of alarmtype
        """
        for f in [f for f in os.listdir('%s/emonitor/modules/alarms/inc/' % current_app.config.get('PROJECT_ROOT')) if f.endswith('.py')]:
            if f == request.args.get('checker'):
                cls = imp.load_source('emonitor.modules.alarms.inc', 'emonitor/modules/alarms/inc/%s' % f)
                cls = getattr(cls, cls.__all__[0])()
                return {u'keywords': "\n".join(cls.getDefaultConfig()[u'keywords']), u'variables': cls.getDefaultConfig()[u'translations'], u'attributes': cls.getDefaultConfig()[u'attributes']}
        return ""

    elif request.args.get('action') == 'alarmsforstate':
        alarms = Alarm.getAlarms(state=int(request.args.get('state')))
        return render_template('admin.alarms_alarm.html', alarms=alarms)

    elif request.args.get('action') == 'alarmsarchive':
        for id in request.args.get('alarmids').split(','):
            Alarm.changeState(int(id), 3)
        return ""

    elif request.args.get('action') == 'savefieldorder':  # change order of fields
        fields = []
        deptid = '0'
        for f in request.args.get('order').split(','):
            t, deptid, name = f.split('.')
            fields.append(name)
        if int(deptid):
            for dbfield in AlarmField.getAlarmFields(dept=deptid):
                dbfield.position = fields.index(dbfield.fieldtype)
            db.session.commit()
        return ""

    elif request.args.get('action') == 'addreport':
        f = request.files['template']
        fname = "{}.{}".format(random.random(), f.filename.split('.')[-1])
        fpath = '{}alarmreports/{}'.format(current_app.config.get('PATH_DATA'), fname[2:])
        f.save(fpath)

        if f.filename.endswith('pdf'):
            fields = getFormFields(fpath)
            content = render_template('admin.alarms.report_fields.html', filepath='{}alarmreports/{}'.format(current_app.config.get('PATH_DATA'), fname[2:]), fileinfo=getPDFInformation(fpath), fields=fields, multi=max(fields.values()) > 1)
        else:
            content = ""
            fields = []
        return {'filename': fname, 'content': content}

    elif request.args.get('action') == 'reportdetails':
        return render_template('admin.alarms.report_details.html', report=AlarmReport.getReports(id=request.args.get('reportid')), reporttype=AlarmReport.getReportTypes(request.args.get('template')), departments=request.args.get('departments'))

    elif request.args.get('action') == 'reportfieldlookup':
        ret = OrderedDict()

        ret['basic'] = []  # add basic information from AFBasic class
        for f in AFBasic().getFields():
            ret['basic'].append({'id': f.name, 'value': f.id})

        alarmfields = {}
        for alarmfield in AlarmField.getAlarmFields():
            if str(alarmfield.dept) not in request.args.get('departments').split(','):
                continue
            if alarmfield.fieldtype not in alarmfields:
                alarmfields[alarmfield.fieldtype] = []
            alarmfields[alarmfield.fieldtype].append(alarmfield)

        l = ""
        for alarmfield in list(chain.from_iterable([f for f in alarmfields.values() if len(f) == len(request.args.get('departments').split(','))])):
            if '%s' % alarmfield.name not in ret:
                ret['%s' % alarmfield.name] = [{'id': '%s-list' % alarmfield.fieldtype, 'value': '%s (%s)' % (alarmfield.name, babel.gettext('admin.alarms.list'))}]
            for f in alarmfield.getFields():
                if f.getLabel().strip() not in ["", '<leer>']:  # dismiss empty values
                    if f.name[0] != ' ':
                        value = '%s' % babel.gettext(f.getLabel())
                        l = value
                    else:  # add name of kategory
                        value = '%s > %s' % (l, babel.gettext(f.getLabel()))
                    ret['%s' % alarmfield.name].append({'id': '%s-%s' % (alarmfield.fieldtype, f.id), 'value': value})
        return ret
Exemple #18
0
def getAdminData(self):
    """
    Deliver admin content of module mapitems (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get(
            'action') == 'loadfromosm':  # load all objects from osm
        itemdefinition = [
            t for t in Settings.get('mapitemdefinition')
            if t['name'] == request.args.get('type')
        ][0]
        dbodmids = [
            int(i.osmid)
            for i in MapItem.getMapitems(itemtype=itemdefinition['name'])
        ]

        for cid in itemdefinition['cities']:
            city = City.getCities(id=cid)
            for item in MapItem.loadFromOSM(itemdefinition, city.name):
                if int(item['id']) > 0 and int(
                        item['id']) not in dbodmids:  # add item
                    attrs = item.copy()
                    del attrs['id']
                    db.session.add(
                        MapItem(itemdefinition['name'], int(item['id']),
                                attrs))
                else:  # update
                    pass  # TODO write update method

        db.session.commit()

    elif request.args.get('action') == 'uploadlayouter':
        if request.files:
            ufile = request.files['uploadfile']
            if not os.path.exists(
                    '%s/emonitor/modules/alarms/inc/%s' %
                (current_app.config.get('PROJECT_ROOT'), ufile.filename)):
                ufile.save(
                    '%s/emonitor/modules/mapitems/inc/%s' %
                    (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                try:
                    cls = imp.load_source(
                        'emonitor.modules.mapitems.inc',
                        'emonitor/modules/mapitems/inc/%s' % ufile.filename)
                    if isinstance(getattr(cls, cls.__all__[0])(), ItemLayout):
                        return "ok"
                except:
                    pass
                os.remove(
                    '%s/emonitor/modules/mapitems/inc/%s' %
                    (current_app.config.get('PROJECT_ROOT'), ufile.filename))
                return babel.gettext(u'admin.mapitems.layouternotvalid')
        return ""

    elif request.args.get('action') == 'buildtiles':
        itemdefinition = [
            t for t in Settings.get('mapitemdefinition')
            if t['name'] == request.args.get('type')
        ][0]
        for layouter in MapItem.getLayouters():
            if layouter.getName() == itemdefinition['parameters']['layout']:
                scheduler.add_job(layouter.buildTiles,
                                  args=[
                                      MapItem.getMapitems(
                                          itemdefinition['name']),
                                      itemdefinition['attributes']
                                  ])
                break

    return ""
def getAdminData(self, **params):
    """
    Deliver admin content of module maps (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'checkpath':
        if os.path.exists(request.args.get('path')):
            return '1'
        return '0'

    elif request.args.get('action') == 'loadmap':  # load tiles

        tile_path = request.args.get('path')

        def calcSubItems((pos)):
            return [(2 * int(pos[0]), 2 * int(pos[1])), (2 * int(pos[0]) + 1, 2 * int(pos[1])), (2 * int(pos[0]), 2 * int(pos[1]) + 1), (2 * int(pos[0]) + 1, 2 * int(pos[1]) + 1)]

        #def getTile(zoom, pos):
        #    global tile_path
        #    response = urllib2.urlopen('http://a.tile.openstreetmap.org/%s/%s/%s.png' % (zoom, pos[0], pos[1]))
        #    #fout = open(tile_path + str(zoom)+'/'+str(pos[0])+'-'+str(pos[1])+'.png', 'wb')
        #    fout = open("%s%s/%s-%s.png" % (tile_path, zoom, pos[0], pos[1]), 'wb')
        #    fout.write(response.read())
        #    fout.close()

        _items = {12: [], 13: [], 14: [], 15: [], 16: [], 17: [], 18: []}
        for t in request.args.get('tiles').split("-"):
            if t != '':
                _items[12].append(t.split(","))

        for zoom in range(13, 19):
            for i in _items[zoom - 1]:
                _items[zoom] += calcSubItems(i)

        result = map_utils.loadTiles('%s%s' % (current_app.config.get('PATH_TILES'), request.args.get('path')), _items)
        if result == 0:
            return babel.gettext('settings.map.loadinginprogress')  # loading still active
        elif result == 1:
            return babel.gettext('settings.map.loadingstarted')  # loading started
        return ""

    elif request.args.get('action') == 'stoptileload':  # stop tile download
        for i in map_utils.LOADTILES:
            signal.send('map', 'tiledownloaddone', tiles=i)
        map_utils.LOADTILES = []
        map_utils.CURRENTLOADING = []
        return {}

    elif request.args.get('action') == 'maptiles':
        _map = Map.getMaps(id=request.args.get('id'))
        if _map:
            return Map.getMapBox(tilepath=current_app.config.get('PATH_TILES'), mappath=_map.path)
        return Map.getMapBox()

    elif request.args.get('action') == 'loadosmdata':  # load all data from openstreetmap
        from emonitor.extensions import scheduler
        from emonitor.lib.osm.loaddata import parseOsmData
        #import time, datetime
        mapdata = Map.getMaps()[0].getMapBox(tilepath=current_app.config.get('PATH_TILES'))

        lat = [mapdata['min_latdeg']]
        while lat[-1] + .05 < mapdata['max_latdeg']:
            lat.append(lat[-1] + .05)
        lat.append(mapdata['max_latdeg'])

        lng = [mapdata['min_lngdeg']]
        while lng[-1] + .05 < mapdata['max_lngdeg']:
            lng.append(lng[-1] + .05)
        lng.append(mapdata['max_lngdeg'])

        scheduler.add_job(parseOsmData, kwargs={'lat': lat, 'lng': lng, 'path': current_app.config.get('PATH_DATA')})
        return {'job': 'started'}

    elif request.args.get('action') == 'findcity':  # search citystring and deliver position
        return map_utils.loadPositionOfCity(request.args.get('cityname'))

    return ""
Exemple #20
0
    def changeState(id, state):
        """
        Change state of alarm with given id. Adds entry in alarmhistory and sends signal

        :param id: id of alarm
        :param state: new state as :py:attr:`emonitor.modules.alarms.alarm.Alarm.ALARMSTATES`
        """
        from emonitor.extensions import monitorserver
        global LASTALARM
        alarm = Alarm.getAlarms(id=id)
        if not alarm:
            return []

        if alarm.state != state and alarm.state != 0:  # only change
            _op = 'changestate'
        else:
            _op = 'added'

        if alarm.get('alarmtype', '') != '':
            _type = '.{}'.format(alarm.get('alarmtype'))
        else:
            _type = ''

        alarm.state = state
        try:
            alarm.addHistory('autochangeState', Alarm.ALARMSTATES[str(state)])
        except KeyError:
            alarm.addHistory('autochangeState', 'archived')
        db.session.commit()

        if state == 1:  # activate alarm
            c = []
            for a in Alarm.getActiveAlarms():  # check cars
                if a.id == id:
                    continue
                c.extend(set(a.cars1).intersection(set(alarm.cars1)))
                c.extend(set(a.cars2).intersection(set(alarm.cars2)))
                c.extend(set(a.material).intersection(set(alarm.material)))

            if time.time() - LASTALARM < 60.0:
                try:
                    ids = [a.id for a in Alarm.getActiveAlarms()]
                    for j in [job for job in scheduler.get_jobs() if job.name == 'changeLayout']:
                        for i in ids:
                            if "'alarmid', %s" % i in str(j.args):  # layout changes for given alarm
                                scheduler.unschedule_job(j)
                except:
                    logger.error('%s' % [a.id for a in Alarm.getActiveAlarms()])
            LASTALARM = time.time()
            alarm.updateSchedules(reference=0)  # use current time + delta
            j = scheduler.add_job(events.raiseEvent, next_run_time=datetime.datetime.fromtimestamp(LASTALARM), args=['alarm_{}{}'.format(_op, _type)], kwargs={'alarmid': id}, name="alarms_activate_{}".format(id))
            signal.send('alarm', _op, alarmid=id, newstate=state)
            try:
                flash(babel.gettext(u'alarms.statechangeactivated'), 'alarms.activate')
            except:
                pass
            finally:
                monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
                return list(set(c))

        elif state == 2:  # close alarm
            LASTALARM = 0.0
            alarm.updateSchedules(reference=1)  # use alarm.timestamp + delta
            monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
            signal.send('alarm', 'changestate', newstate=2)
            return []

        elif state == 3:  # archive alarm
            alarm.updateSchedules()
            signal.send('alarm', 'changestate', newstate=3)
            return []

        signal.send('alarm', 'changestate', newstate=state)
Exemple #21
0
def getAdminData(self, **params):
    """
    Deliver admin content of module maps (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'checkpath':
        if os.path.exists(request.args.get('path')):
            return '1'
        return '0'

    elif request.args.get('action') == 'loadmap':  # load tiles

        tile_path = request.args.get('path')

        def calcSubItems((pos)):
            return [(2 * int(pos[0]), 2 * int(pos[1])),
                    (2 * int(pos[0]) + 1, 2 * int(pos[1])),
                    (2 * int(pos[0]), 2 * int(pos[1]) + 1),
                    (2 * int(pos[0]) + 1, 2 * int(pos[1]) + 1)]

        #def getTile(zoom, pos):
        #    global tile_path
        #    response = urllib2.urlopen('http://a.tile.openstreetmap.org/%s/%s/%s.png' % (zoom, pos[0], pos[1]))
        #    #fout = open(tile_path + str(zoom)+'/'+str(pos[0])+'-'+str(pos[1])+'.png', 'wb')
        #    fout = open("%s%s/%s-%s.png" % (tile_path, zoom, pos[0], pos[1]), 'wb')
        #    fout.write(response.read())
        #    fout.close()

        _items = {12: [], 13: [], 14: [], 15: [], 16: [], 17: [], 18: []}
        for t in request.args.get('tiles').split("-"):
            if t != '':
                _items[12].append(t.split(","))

        for zoom in range(13, 19):
            for i in _items[zoom - 1]:
                _items[zoom] += calcSubItems(i)

        result = map_utils.loadTiles(
            '%s%s' %
            (current_app.config.get('PATH_TILES'), request.args.get('path')),
            _items)
        if result == 0:
            return babel.gettext(
                'settings.map.loadinginprogress')  # loading still active
        elif result == 1:
            return babel.gettext(
                'settings.map.loadingstarted')  # loading started
        return ""

    elif request.args.get('action') == 'stoptileload':  # stop tile download
        for i in map_utils.LOADTILES:
            signal.send('map', 'tiledownloaddone', tiles=i)
        map_utils.LOADTILES = []
        map_utils.CURRENTLOADING = []
        return {}

    elif request.args.get('action') == 'maptiles':
        _map = Map.getMaps(id=request.args.get('id'))
        if _map:
            return Map.getMapBox(tilepath=current_app.config.get('PATH_TILES'),
                                 mappath=_map.path)
        return Map.getMapBox()

    elif request.args.get(
            'action') == 'loadosmdata':  # load all data from openstreetmap
        from emonitor.extensions import scheduler
        from emonitor.lib.osm.loaddata import parseOsmData
        #import time, datetime
        mapdata = Map.getMaps()[0].getMapBox(
            tilepath=current_app.config.get('PATH_TILES'))

        lat = [mapdata['min_latdeg']]
        while lat[-1] + .05 < mapdata['max_latdeg']:
            lat.append(lat[-1] + .05)
        lat.append(mapdata['max_latdeg'])

        lng = [mapdata['min_lngdeg']]
        while lng[-1] + .05 < mapdata['max_lngdeg']:
            lng.append(lng[-1] + .05)
        lng.append(mapdata['max_lngdeg'])

        scheduler.add_job(parseOsmData,
                          kwargs={
                              'lat': lat,
                              'lng': lng,
                              'path': current_app.config.get('PATH_DATA')
                          })
        return {'job': 'started'}

    elif request.args.get(
            'action') == 'findcity':  # search citystring and deliver position
        return map_utils.loadPositionOfCity(request.args.get('cityname'))

    return ""
Exemple #22
0
 def initMessageTrigger():
     """Init scheduler tasks for messages"""
     job = scheduler.add_job(Messages.doMessageTrigger, name="messages", id="messages", trigger=MessageTrigger(Messages.getActiveMessages(), minutes=60))
     if len(job.trigger.messagelist) == 0:  # pause job if no active messages
         job.pause()
     logger.info('scheduler job init done, next run at %s' % job.next_run_time)
Exemple #23
0
def loadTiles(path, tilelist):
    """
    Load map tiles into path from given tilelist

    :param path: path to store map tiles
    :param tilelist: list of tiles to load from OSM
    :return: progress information *[position, number of tiles to load]* as list
    """
    from emonitor.extensions import scheduler
    LOADTILES.append(tilelist[min(tilelist.keys())][0])  # add selected tile
    CURRENTLOADING.extend(sum(tilelist.values(), []))  # add tiles
    signal.send('map',
                'tiledownloadstart',
                tiles=tilelist[min(tilelist.keys())][0])

    def doLoadTiles(**kwargs):
        def getTile(zoom, item):
            response = urllib2.urlopen(
                'http://a.tile.openstreetmap.org/{}/{}/{}.png'.format(
                    zoom, item[0], item[1]))
            with open('{}/{}/{}-{}.png'.format(path, zoom, item[0], item[1]),
                      'wb') as fout:
                fout.write(response.read())
            if item in CURRENTLOADING:
                CURRENTLOADING.remove(item)

        if 'path' in kwargs:
            path = kwargs['path']
        else:
            return

        if 'tilelist' in kwargs:
            tilelist = kwargs['tilelist']
        else:
            return

        errortiles = []

        for zoom in tilelist:
            if not os.path.exists('{}/{}'.format(path, zoom)):
                os.makedirs('{}/{}'.format(path, zoom))
            for item in tilelist[zoom]:
                if len(CURRENTLOADING) == 0:  # loding stopped or ended
                    return
                if (len(LOADTILES) * 5460 - len(CURRENTLOADING)
                    ) % 10 == 0:  # send state every 10 loads
                    signal.send(
                        'map',
                        'tiledownloadprogress',
                        progress=(len(LOADTILES) * 5460 - len(CURRENTLOADING),
                                  len(LOADTILES) * 5460),
                        tiles=LOADTILES)
                try:
                    getTile(zoom, item)
                except:
                    errortiles.append((zoom, item))
        # try error objects
        for err in errortiles:
            try:
                getTile(err[0], err[1])
            except:
                print "error in {}".format(err)
        signal.send('map',
                    'tiledownloaddone',
                    tiles=tilelist[min(tilelist.keys())][0])

    scheduler.add_job(doLoadTiles, kwargs={'path': path, 'tilelist': tilelist})
    return 1  # loading started
Exemple #24
0
def loadTiles(path, tilelist):
    """
    Load tiles from OpenStreetMap and store tiles in local directory

    :param path: store path as string
    :param tilelist: list of tiles to load
    """
    global LOADINPROGRESS

    def doLoadTiles(**kwargs):
        global LOADINPROGRESS

        def getTile(zoom, item):
            response = urllib2.urlopen(
                'http://a.tile.openstreetmap.org/%s/%s/%s.png' %
                (zoom, item[0], item[1]))
            LOADINPROGRESS[1] += 1
            #print "get", LOADINPROGRESS[1]
            with open('%s/%s/%s-%s.png' % (path, zoom, item[0], item[1]),
                      'wb') as fout:
                fout.write(response.read())

        if 'path' in kwargs:
            path = kwargs['path']
        else:
            return

        if 'tilelist' in kwargs:
            tilelist = kwargs['tilelist']
        else:
            return

        errortiles = []

        for zoom in tilelist:
            if not os.path.exists('%s/%s' % (path, zoom)):
                os.makedirs('%s/%s' % (path, zoom))
            for item in tilelist[zoom]:
                try:
                    getTile(zoom, item)
                except:
                    errortiles.append((zoom, item))
        # try error objects
        for err in errortiles:
            try:
                getTile(err[0], err[1])
            except:
                print "error in {}".format(err)

        LOADINPROGRESS = [0, 0]

    if LOADINPROGRESS[0] != 0:
        return LOADINPROGRESS  # still in progress

    LOADINPROGRESS = [sum(map(lambda x: len(tilelist[x]), tilelist)),
                      0]  # init progress
    scheduler.add_job(
        doLoadTiles,
        next_run_time=datetime.datetime.fromtimestamp(time.time() + 2),
        kwargs={
            'path': path,
            'tilelist': tilelist
        })
    return 1  # loading started
Exemple #25
0
def getAdminData(self):
    """
    Deliver admin content of module streets (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'loadcitiesfromosm':  # get city list from osm
        return loadCitiesFromOsm()

    elif request.args.get('action') == 'createcity':  # create cities from osm
        osmids = [c[0] for c in db.get(City.osmid).all()]
        i = 0
        for c in request.args.get('values').split(","):
            _id, name = c.split('|')
            if int(_id) not in osmids:  # add city
                db.session.add(City(name, 1, '', 0, '', '', int(_id), ''))
                db.session.commit()
                i += 1

        flash(babel.gettext('%(i)s admin.streets.cities.osmcitiesadded', i=i))
        self.updateAdminSubNavigation()
        return '1'

    elif request.args.get('action') == 'loadstreetsfromosm':  # get street list from osm
        return loadStreetsFromOsm(City.getCities(id=request.args.get('cityid')))

    elif request.args.get('action') == 'createstreet':  # create streets from osm
        city = City.getCities(id=request.args.get('cityid'))
        ids = [int(i) for i in request.args.get('values').split(",")]  # ids to create
        osmdata = loadStreetsFromOsm(city=city, format='data')

        i = 0
        for sname in osmdata:
            if len(set(osmdata[sname]['osmids']).intersection(set(ids))) > 0:  # add street
                _s = osmdata[sname]
                city.addStreet(
                    Street(sname, '', int(request.args.get('cityid')), '', _s['center'][0], _s['center'][1], 17, 1,
                           _s['osmids'][0]))
                i += 1
        flash(babel.gettext('%(i)s admin.streets.osmstreetsadded', i=i))
        return '1'

    elif request.args.get('action') == 'loadhnumbersfromosm':
        if 'streetid' in request.args:
            streets = [Street.getStreets(id=int(request.args.get('streetid')))]
        elif 'cityid' in request.args:
            #streets = list(City.getCities(id=request.args.get('cityid')).streets)
            streets = Street.getStreets(cityid=int(request.args.get('cityid')))
        else:
            streets = Street.getStreets()
        return str(scheduler.add_job(loadHousenumbersFromOsm, args=[streets]))

    elif request.args.get('action') == 'loadhnumbers':  # load all housenumbers for street
        street = Street.getStreets(id=request.args.get('streetid'))
        ret = dict()
        for hn in street.housenumbers:
            ret[hn.id] = hn.points
        return ret

    elif request.args.get('action') == 'delhousenumber':  # delete housenumber
        hn = Housenumber.getHousenumbers(id=request.args.get('housenumberid'))
        street = hn.street
        db.session.delete(hn)
        db.session.commit()
        return render_template('admin.streets.housenumber.html', hnumbers=street.housenumbers)

    elif request.args.get('action') == 'addhousenumber':  # add housenumber
        street = Street.getStreets(id=request.args.get('streetid'))
        points = []
        p = request.args.get('points').split(';')
        points.append((float(p[0]), float(p[1])))
        street.addHouseNumber(request.args.get('hnumber'), points)
        return render_template('admin.streets.housenumber.html', hnumbers=street.housenumbers)

    return "NONE"