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
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 ""
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 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 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)
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))
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))
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)
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"
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'))
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
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 ""
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)
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 ""
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)
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
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 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"