import logging import serial import time from emonitor.extensions import events from flask import current_app from .extensions import scheduler logger = logging.getLogger(__name__) connected = False events.addEvent('incoming_serial_data', handlers=[], parameters=['out.text']) def handleIncomingData(data): timestr = "alarm{}.log".format(time.strftime("%Y%m%d-%H%M%S")) fname = "{}{}".format(current_app.config.get('PATH_DATA'), timestr) text_file = open(fname, "w") text_file.write(data) text_file.close() logger.debug('Incoming serial alarm message: {}'.format(data)) events.raiseEvent('incoming_serial_data', text=data) def readFromPort(ser): global connected data = '' while connected: data += ser.read(1) if data.endswith('\x03'): handleIncomingData(data) data = '' #firstData = ser.read(1);
def on_created(self, event): incomepath, filename = os.path.split(event.src_path) incomepath += '/' events.raiseEvent('file_added', incomepath=incomepath, filename=filename) logger.info(u"file_added: {}{}".format(incomepath, filename)) except: OBSERVERTYPE = "other" logger = logging.getLogger(__name__) BEFORE = AFTER = {} events.addEvent('file_added', handlers=[], parameters=['out.incomepath', 'out.filename']) events.addEvent('file_removed', handlers=[], parameters=['out.incomepath', 'out.filename']) OBSERVERACTIVE = 1 ERROR_RAISED = 0 FILES = [] INPUTFORMAT = Settings.get('ocr.inputformat', ['pdf']) + Settings.get( 'ocr.inputtextformat', []) # noinspection PyPep8Naming def observeFolder(**kwargs):
events.raiseEvent('file_removed', incomepath=incomepath, filename=filename) logger.info(u"file_removed: {}{}".format(incomepath, filename)) def on_created(self, event): incomepath, filename = os.path.split(event.src_path) incomepath += '/' events.raiseEvent('file_added', incomepath=incomepath, filename=filename) logger.info(u"file_added: {}{}".format(incomepath, filename)) except: OBSERVERTYPE = "other" logger = logging.getLogger(__name__) BEFORE = AFTER = {} events.addEvent('file_added', handlers=[], parameters=['out.incomepath', 'out.filename']) events.addEvent('file_removed', handlers=[], parameters=['out.incomepath', 'out.filename']) OBSERVERACTIVE = 1 ERROR_RAISED = 0 FILES = [] INPUTFORMAT = Settings.get('ocr.inputformat', ['pdf']) + Settings.get('ocr.inputtextformat', []) # noinspection PyPep8Naming def observeFolder(**kwargs): """ Observer method to observe given folder :param kwargs: """
def __init__(self, app): """ Add specific parameters and configuration to app object :param app: flask wsgi application """ Module.__init__(self, app) # add template path app.jinja_loader.searchpath.append("{}/emonitor/modules/alarms/templates".format(app.config.get('PROJECT_ROOT'))) # subnavigation self.adminsubnavigation = [('/admin/alarms', 'alarms.base'), ('/admin/alarms/types', 'module.alarms.types'), ('/admin/alarms/report', 'module.alarms.report'), ('/admin/alarms/config', 'module.alarms.config'), ('/admin/alarms/test', 'module.alarms.test')] # create database tables from emonitor.modules.alarms.alarm import Alarm from emonitor.modules.alarms.alarmhistory import AlarmHistory from emonitor.modules.alarms.alarmattribute import AlarmAttribute from emonitor.modules.alarms.alarmsection import AlarmSection from emonitor.modules.alarms.alarmtype import AlarmType self.widgets = [AlarmIncomeWidget('alarms_income'), AlarmWidget('alarms'), AlarmTimerWidget('alarms_timer'), AlarmRemarkWidget('alarms_remark')] # eventhandlers for f in [f for f in os.listdir('{}/emonitor/modules/alarms/inc/'.format(app.config.get('PROJECT_ROOT'))) if f.endswith('.py')]: if not f.startswith('__'): cls = imp.load_source('emonitor.modules.alarms.inc', '{}/emonitor/modules/alarms/inc/{}'.format(app.config.get('PROJECT_ROOT'), f)) checker = getattr(cls, cls.__all__[0])() if isinstance(checker, AlarmFaxChecker) and checker.getId() != 'Dummy': events.addEvent('alarm_added.{}'.format(checker.getId()), handlers=[], parameters=['out.alarmid']) events.addEvent('alarm_changestate.{}'.format(checker.getId()), handlers=[], parameters=['out.alarmid', 'out.state']) events.addEvent('alarm_added', handlers=[], parameters=['out.alarmid']) # for all checkers events.addEvent('alarm_changestate', handlers=[], parameters=['out.alarmid', 'out.state']) # for all checkers events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarm.Alarms', Alarm.handleEvent, ['in.text', 'out.id', 'out.fields']) events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarmtype.AlarmTypes', AlarmType.handleEvent, ['in.text', 'out.type']) # signals and handlers signal.addSignal('alarm', 'changestate') signal.addSignal('alarm', 'added') signal.addSignal('alarm', 'updated') signal.connect('alarm', 'changestate', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'added', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'updated', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'deleted', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'testupload_start', adminAlarmHandler.handleAlarmTestUpload) # static folders @app.route('/alarms/inc/<path:filename>') def alarms_static(filename): return send_from_directory("{}/emonitor/modules/alarms/inc/".format(app.config.get('PROJECT_ROOT')), filename) @app.route('/alarms/export/<path:filename>') # filename = [id]-[style].pdf def export_static(filename): filename, extension = os.path.splitext(filename) try: id, template = filename.split('-') if extension not in ['.pdf', '.html', '.png']: abort(404) elif extension == '.pdf': return Response(Module.getPdf(Alarm.getExportData('.html', id=id, style=template, args=request.args)), mimetype="application/pdf") elif extension == '.html': return Response(Alarm.getExportData(extension, id=id, style=template, args=request.args), mimetype="text/html") elif extension == '.png': return Response(Alarm.getExportData(extension, id=id, style=template, filename=filename, args=request.args), mimetype="image/png") except ValueError: return abort(404) # add reportfolder if not os.path.exists('{}/alarmreports/'.format(app.config.get('PATH_DATA'))): os.makedirs('{}/alarmreports/'.format(app.config.get('PATH_DATA'))) # translations babel.gettext(u'module.alarms') babel.gettext(u'alarms.base') babel.gettext(u'module.alarms.types') babel.gettext(u'module.alarms.report') babel.gettext(u'module.alarms.config') babel.gettext(u'module.alarms.test') babel.gettext(u'alarms_income') babel.gettext(u'alarms_timer') babel.gettext(u'alarms_remark') babel.gettext(u'alarms') babel.gettext(u'alarms.prio0') babel.gettext(u'alarms.prio1') babel.gettext(u'alarms.prio2') babel.gettext(u'emonitor.modules.alarms.alarm.Alarms') babel.gettext(u'emonitor.modules.alarms.alarmtype.AlarmTypes') babel.gettext(u'alarms.test.protocol') babel.gettext(u'alarms.test.result') babel.gettext(u'alarmstate.active') babel.gettext(u'alarmstate.created') babel.gettext(u'alarmstate.done') babel.gettext(u'alarmstate.archive') babel.gettext(u'active') babel.gettext(u'created') babel.gettext(u'done') babel.gettext(u'archive') babel.gettext(u'alarms.statechangeactivated') babel.gettext(u'alarms.prioshort0') babel.gettext(u'alarms.prioshort1') babel.gettext(u'alarms.prioshort2') babel.gettext(u'alarms.carsinuse') babel.gettext(u'history.autochangeState') babel.gettext(u'history.message') babel.gettext(u'trigger.alarm_added') babel.gettext(u'trigger.alarm_changestate') babel.gettext(u'trigger.alarm_added_sub') babel.gettext(u'trigger.alarm_changestate_sub') babel.gettext(u'alarms.print.slightleft') babel.gettext(u'alarms.print.slightright') babel.gettext(u'alarms.print.right') babel.gettext(u'alarms.print.left') babel.gettext(u'alarms.print.straight') babel.gettext(u'alarms.print.exit') babel.gettext(u'alarms.print.bus') babel.gettext(u'alarms.print.positive') babel.gettext(u'alarms.print.negative') babel.gettext(u'alarms.filter.0') babel.gettext(u'alarms.filter.1') babel.gettext(u'alarms.filter.7') babel.gettext(u'alarms.filter.31') babel.gettext(u'internal') babel.gettext(u'external') babel.gettext(u'AFAlerting') babel.gettext(u'AFCars') babel.gettext(u'AFMaterial') babel.gettext(u'AFReport') babel.gettext(u'AFTime') babel.gettext(u'AFDamage') babel.gettext(u'AFOthers') babel.gettext(u'AFPersons') babel.gettext(u'alarms.fields.simple') babel.gettext(u'alarms.fields.extended') babel.gettext(u'alarms.fields.persons.field.sum') babel.gettext(u'alarms.fields.persons.field.house') babel.gettext(u'alarms.fields.persons.field.pa_alarm') babel.gettext(u'alarms.fields.persons.field.el') babel.gettext(u'alarms.fields.persons.field.alarm') babel.gettext(u'alarms.fields.persons.field.pa') babel.gettext(u'alarms.fields.persons.field.pa_house') babel.gettext(u'alarms.fields.persons.field.elgrade') babel.gettext(u'alarms.fields.persons.field.style.simple') babel.gettext(u'alarms.fields.persons.field.style.extended') # init # Do init script for alarms at start and add alarms (state = 1 or 2) (active or done) for aalarm in Alarm.query.filter(Alarm.state in [1, 2]).all(): aalarm.updateSchedules(reference=1)
def getAdminContent(self, **params): """ Deliver admin content of module alarms :param params: use given parameters of request :return: rendered template as string """ module = request.view_args['module'].split('/') if len(module) > 1: if module[1] == 'types': impl = [] # load implementations of faxchecker 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 not f.startswith('__'): cls = imp.load_source('emonitor.modules.alarms.inc', 'emonitor/modules/alarms/inc/%s' % f) if isinstance(getattr(cls, cls.__all__[0])(), AlarmFaxChecker): impl.append((f, getattr(cls, cls.__all__[0])(), AlarmType.getAlarmTypeByClassname(f))) if request.method == 'POST': if request.form.get('action') == 'createtype': # add type params.update({'alarmtype': AlarmType('', ''), 'interpreter': impl}) return render_template('admin.alarms.type_actions.html', **params) elif request.form.get('action').startswith('deleteinterpreter_'): # delete checker for cls in impl: if cls[0] == request.form.get('action')[18:]: if os.path.exists('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), cls[0])): os.remove('%s/emonitor/modules/alarms/inc/%s' % (current_app.config.get('PROJECT_ROOT'), cls[0])) if os.path.exists('%s/emonitor/modules/alarms/inc/%sc' % (current_app.config.get('PROJECT_ROOT'), cls[0])): os.remove('%s/emonitor/modules/alarms/inc/%sc' % (current_app.config.get('PROJECT_ROOT'), cls[0])) impl.remove(cls) elif request.form.get('action').startswith('editalarmtype_'): # edit type params.update({'alarmtype': AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1])), 'interpreter': impl}) return render_template('admin.alarms.type_actions.html', **params) elif request.form.get('action').startswith('deletetype_'): # delete type atype = AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1])) for e in [e for e in events.events if e.name in ['alarm_added.{}'.format(atype.name), 'alarm_changestate.{}'.format(atype.name)]]: # delete event handlers and monitor layout for eh in Eventhandler.getEventhandlers(event=e.name): for ml in MonitorLayout.query.filter(MonitorLayout.trigger.like('%{}%'.format(eh.event))).all(): if ';' in ml.trigger: _tr = ml.trigger.split(';') del _tr[_tr.index(e.name)] ml.trigger = ";".join(_tr) else: db.session.remove(ml) db.session.delete(eh) # delete event del events.events[events.events.index(e)] db.session.delete(atype) db.session.commit() elif request.form.get('action') == 'updatetype': # update type if request.form.get('type_id') == 'None': # add type atype = AlarmType('', '') db.session.add(atype) events.addEvent('alarm_added.{}'.format(request.form.get('edit_name')), handlers=[], parameters=[]) events.addEvent('alarm_changestate.{}'.format(request.form.get('edit_name')), handlers=[], parameters=[]) else: # update type atype = AlarmType.getAlarmTypes(id=int(request.form.get('type_id'))) for e in [e for e in events.events if e.name in ['alarm_added.{}'.format(atype.name), 'alarm_changestate.{}'.format(atype.name)]]: # update event handler and monitor layout newname = '{}.{}'.format(e.name.split('.')[0], request.form.get('edit_name')) for eh in Eventhandler.getEventhandlers(event=e.name): for ml in MonitorLayout.query.filter(MonitorLayout.trigger.like('%{}%'.format(eh.event))).all(): ml.trigger = ml.trigger.replace(e.name, newname) eh.event = newname # update event e.name = newname atype.name = request.form.get('edit_name') atype.keywords = request.form.get('edit_keywords') atype.interpreter = request.form.get('edit_interpreter') atype.attributes = dict(zip(request.form.getlist('attribute_name'), request.form.getlist('attribute_value'))) atype.translations = dict(zip(request.form.getlist('alarmtypevariables'), request.form.getlist('alarmtypetranslation'))) db.session.commit() if request.form.get('type_id') == 'None': # add predefined keywords and sections # add pre-defined sections for checker in [i for i in impl if i[0] == request.form.get('edit_interpreter')]: if request.form.get('edit_keywords') == "": atype.keywords = "\n".join(checker[1].getDefaultConfig()['keywords']) sections = checker[1].getDefaultConfig()['sections'] i = 1 for key in sections: db.session.add(AlarmSection(atype.id, key, sections[key][0], 1, sections[key][1], i)) i += 1 db.session.commit() elif request.form.get('action').startswith('createsection_'): # add section alarmtype = AlarmType.getAlarmTypes(id=int(request.form.get('action').split('_')[-1])) params.update({'alarmtype': alarmtype, 'section': AlarmSection(alarmtype.id, '', '', 0, '', 0), 'functions': alarmtype.interpreterclass().getEvalMethods()}) return render_template('admin.alarms.sections_actions.html', **params) elif request.form.get('action') == 'updatesection': # save section db.session.rollback() if request.form.get('section_id') == 'None': # add section = AlarmSection(request.form.get('edit_tid'), '', '', '', '', '') section.orderpos = 1 + len(AlarmSection.getSections()) db.session.add(section) else: # update section = AlarmSection.getSections(id=int(request.form.get('section_id'))) section.orderpos = request.form.get('edit_orderpos') section.tid = request.form.get('edit_tid') section.name = request.form.get('edit_name') section.key = request.form.get('edit_key') section.method = request.form.get('edit_method') section.active = request.form.get('edit_active') alarmtype = AlarmType.getAlarmTypes(request.form.get('edit_tid')) if alarmtype.interpreterclass().configtype == 'generic': attrs = {'start': request.form.get('edit_start'), 'end': request.form.get('edit_end')} if 'edit_multiline' in request.form.keys(): attrs['multiline'] = 'True' section.attributes = attrs db.session.commit() elif request.form.get('action') == 'updateorder': for item in [i for i in request.form if i.startswith('position_')]: ids = request.form.getlist(item) for _id in ids: AlarmSection.getSections(id=_id).orderpos = ids.index(_id) + 1 db.session.commit() elif request.form.get('action').startswith('editalarmsection_'): # edit section section = AlarmSection.getSections(id=int(request.form.get('action').split('_')[-1])) params.update({'section': section, 'functions': section.alarmtype.interpreterclass().getEvalMethods(), 'alarmtype': AlarmType.getAlarmTypes(section.tid)}) return render_template('admin.alarms.sections_actions.html', **params) elif request.form.get('action').startswith('deletealarmsection_'): # delete section section = AlarmSection.getSections(id=int(request.form.get('action').split('_')[-1])) db.session.delete(section) db.session.commit() params.update({'alarmtypes': AlarmType.getAlarmTypes(), 'interpreters': impl}) return render_template('admin.alarms.type.html', **params) elif module[1] == 'report': if request.method == 'POST': if request.form.get('action') == 'createreport': # add report params.update({'report': AlarmReport('', '', '', 1, []), 'departments': Department.getDepartments(), 'reporttypes': AlarmReport.getReportTypes()}) return render_template('admin.alarms.report_action.html', **params) elif request.form.get('action') == 'updatereport': if request.form.get('report_id') == 'None': # add new report report = AlarmReport('', '', '', '') db.session.add(report) else: report = AlarmReport.getReports(request.form.get('report_id')) report.name = request.form.get('edit_name') if not request.form.get('template').startswith(current_app.config.get('PATH_DATA')): # internal template report._reporttype = 'internal' report.filename = request.form.get('template').replace("{}/emonitor/modules/alarms/templates/".format(current_app.config.get('PROJECT_ROOT')).replace('\\', '/'), "") else: report._reporttype = 'external' report.filename = request.form.get('template').replace("{}".format(current_app.config.get('PATH_DATA')), "") report.fields = json.loads(request.form.get('fielddefinition')) report.departments = request.form.getlist('edit_department') db.session.commit() elif request.form.get('action').startswith('editreport_'): # edit report report = AlarmReport.getReports(request.form.get('action').split('_')[-1]) params.update({'report': report, 'departments': Department.getDepartments(), 'reporttypes': AlarmReport.getReportTypes(), 'alarmfields': AlarmField.getAlarmFields()}) return render_template('admin.alarms.report_action.html', **params) elif request.form.get('action').startswith('deletereport_'): # delete report report = AlarmReport.getReports(request.form.get('action').split('_')[-1]) if AlarmReport.query.filter(AlarmReport.filename == report.filename).count() == 1 and os.path.exists(report.filename): os.remove(report.filename) db.session.delete(report) db.session.commit() params.update({'reports': AlarmReport.getReports(), 'departments': Department.getDepartments()}) return render_template('admin.alarms.report.html', **params) elif module[1] == 'config': if request.method == 'POST': if request.form.get('action') == 'alarmcarsprio': for k in Alarm.ALARMSTATES.keys(): if 'used_cars{}'.format(k) in request.form.keys(): Settings.set('alarms.spc_cars.{}'.format(k), request.form.get('used_cars{}'.format(k))) db.session.commit() elif request.form.get('action') == 'alarmsettings': Settings.set('alarms.autoclose', request.form.get('settings.autoclose')) for aalarm in [a for a in Alarm.getAlarms() if a.state == 1]: # only active alarms aalarm.updateSchedules(reference=1) # use alarmtime as refernce elif request.form.get('action') == 'archivesettings': Settings.set('alarms.autoarchive', request.form.get('settings.autoarchive')) for aalarm in [a for a in Alarm.getAlarms() if a.state == 2]: # only closed alarms aalarm.updateSchedules(reference=1) # use alarmtime as refernce elif request.form.get('action').startswith('save_'): if request.form.get('fieldid') == 'None': field = AlarmField.getAlarmFieldForType(request.form.get('action').split('_')[1], dept=request.form.get('action').split('_')[2]) db.session.add(field) else: field = AlarmField.getAlarmFields(id=request.form.get('fieldid')) field.saveConfigForm(request) db.session.commit() elif request.form.get('action').startswith('field_delete_'): # delete definition of field db.session.delete(AlarmField.getAlarmFields(id=request.form.get('action').split('_')[-1])) db.session.commit() elif request.form.get('action').startswith('field_add_'): # add field for department field = AlarmField.getAlarmFieldForType(request.form.get('action').split('_')[-2], dept=request.form.get('action').split('_')[-1]) field.name = babel.gettext(field.name) db.session.add(field) db.session.commit() fields = {} for dept in Department.getDepartments(): fields[dept.id] = AlarmField.getAlarmFieldsForDepartment(dept.id) params.update({'cars': Car.getCars(), 'alarmstates': Alarm.ALARMSTATES, 'settings': Settings, 'departments': Department.getDepartments(), 'fields': fields}) return render_template('admin.alarms.config.html', **params) elif module[1] == 'test': params.update({'uploadfileformat': filter(None, sum([Settings.get('ocr.inputformat', []), Settings.get('ocr.inputtextformat', [])], []))}) return render_template('admin.alarms.test.html', **params) else: params.update({'alarms': dict(Alarm.getAlarmCount()), 'alarmstates': Alarm.ALARMSTATES, 'help': self.hasHelp('admin')}) return render_template('admin.alarms.html', **params)
import os import logging from emonitor.extensions import events from emonitor.modules.settings.settings import Settings logger = logging.getLogger(__name__) BEFORE = AFTER = {} events.addEvent("file_added", handlers=[], parameters=["out.incomepath", "out.filename"]) events.addEvent("file_removed", handlers=[], parameters=["out.incomepath", "out.filename"]) OBSERVERACTIVE = 1 ERROR_RAISED = 0 FILES = [] INPUTFORMAT = Settings.get("ocr.inputformat", ["pdf"]) + Settings.get("ocr.inputtextformat", []) def observeFolder(**kwargs): """ Observer method to observe given folder :param kwargs: """ global BEFORE, AFTER, FILES, ERROR_RAISED if OBSERVERACTIVE == 0: return if "path" in kwargs: path = kwargs["path"] else:
def __init__(self, app): """ Add specific parameters and configuration to app object :param app: flask wsgi application """ Module.__init__(self, app) # add template path app.jinja_loader.searchpath.append( "{}/emonitor/modules/alarms/templates".format( app.config.get('PROJECT_ROOT'))) # subnavigation self.adminsubnavigation = [ ('/admin/alarms', 'alarms.base'), ('/admin/alarms/types', 'module.alarms.types'), ('/admin/alarms/report', 'module.alarms.report'), ('/admin/alarms/config', 'module.alarms.config'), ('/admin/alarms/test', 'module.alarms.test') ] # create database tables from emonitor.modules.alarms.alarm import Alarm from emonitor.modules.alarms.alarmhistory import AlarmHistory from emonitor.modules.alarms.alarmattribute import AlarmAttribute from emonitor.modules.alarms.alarmsection import AlarmSection from emonitor.modules.alarms.alarmtype import AlarmType self.widgets = [ AlarmIncomeWidget('alarms_income'), AlarmWidget('alarms'), AlarmTimerWidget('alarms_timer'), AlarmRemarkWidget('alarms_remark') ] # eventhandlers for f in [ f for f in os.listdir('{}/emonitor/modules/alarms/inc/'.format( app.config.get('PROJECT_ROOT'))) if f.endswith('.py') ]: if not f.startswith('__'): cls = imp.load_source( 'emonitor.modules.alarms.inc', '{}/emonitor/modules/alarms/inc/{}'.format( app.config.get('PROJECT_ROOT'), f)) checker = getattr(cls, cls.__all__[0])() if isinstance(checker, AlarmFaxChecker) and checker.getId() != 'Dummy': for at in AlarmType.getAlarmTypes(): if at.interpreter == f: events.addEvent('alarm_added.{}'.format(at.name), handlers=[], parameters=['out.alarmid']) events.addEvent( 'alarm_changestate.{}'.format(at.name), handlers=[], parameters=['out.alarmid', 'out.state']) events.addEvent('alarm_added', handlers=[], parameters=['out.alarmid']) # for all checkers events.addEvent('alarm_changestate', handlers=[], parameters=['out.alarmid', 'out.state']) # for all checkers events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarm.Alarms', Alarm.handleEvent, ['in.text', 'out.id', 'out.fields']) events.addHandlerClass('file_added', 'emonitor.modules.alarms.alarmtype.AlarmTypes', AlarmType.handleEvent, ['in.text', 'out.type']) events.addHandlerClass('incoming_serial_data', 'emonitor.modules.alarms.alarm.Alarms', Alarm.handleSerialEvent, ['in.text', 'out.id', 'out.fields']) events.addHandlerClass('incoming_serial_data', 'emonitor.modules.alarms.alarmtype.AlarmTypes', AlarmType.handleEvent, ['in.text', 'out.type']) # signals and handlers signal.addSignal('alarm', 'changestate') signal.addSignal('alarm', 'added') signal.addSignal('alarm', 'updated') signal.addSignal('alarm', 'error') signal.connect('alarm', 'changestate', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'added', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'updated', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'deleted', frontendAlarmHandler.handleAlarmChanges) signal.connect('alarm', 'error', frontendAlarmHandler.handleAlarmErrors) signal.connect('alarm', 'testupload_start', adminAlarmHandler.handleAlarmTestUpload) # static folders @app.route('/alarms/inc/<path:filename>') def alarms_static(filename): if filename.startswith('sample_'): # deliver sample checker file clsname = filename.split('_')[1] return Response(AlarmType.getAlarmTypes( clsname).interpreterclass().getSampleLayout(), mimetype="image/jpeg") return send_from_directory( "{}/emonitor/modules/alarms/inc/".format( app.config.get('PROJECT_ROOT')), filename) @app.route('/alarms/export/<path:filename>' ) # filename = [id]-[style].pdf def export_static(filename): filename, extension = os.path.splitext(filename) try: id, template = filename.split('-') if extension not in ['.pdf', '.html', '.png']: abort(404) elif extension == '.pdf': return Response(Module.getPdf( Alarm.getExportData('.html', id=id, style=template, args=request.args)), mimetype="application/pdf") elif extension == '.html': return Response(Alarm.getExportData(extension, id=id, style=template, args=request.args), mimetype="text/html") elif extension == '.png': return Response(Alarm.getExportData(extension, id=id, style=template, filename=filename, args=request.args), mimetype="image/png") except ValueError: return abort(404) # add reportfolder if not os.path.exists('{}/alarmreports/'.format( app.config.get('PATH_DATA'))): os.makedirs('{}/alarmreports/'.format(app.config.get('PATH_DATA'))) # translations babel.gettext(u'module.alarms') babel.gettext(u'alarms.base') babel.gettext(u'module.alarms.types') babel.gettext(u'module.alarms.report') babel.gettext(u'module.alarms.config') babel.gettext(u'module.alarms.test') babel.gettext(u'alarms_income') babel.gettext(u'alarms_timer') babel.gettext(u'alarms_remark') babel.gettext(u'alarms') babel.gettext(u'alarms.prio0') babel.gettext(u'alarms.prio1') babel.gettext(u'alarms.prio2') babel.gettext(u'emonitor.modules.alarms.alarm.Alarms') babel.gettext(u'emonitor.modules.alarms.alarmtype.AlarmTypes') babel.gettext(u'alarms.test.protocol') babel.gettext(u'alarms.test.result') babel.gettext(u'alarmstate.active') babel.gettext(u'alarmstate.created') babel.gettext(u'alarmstate.done') babel.gettext(u'alarmstate.archive') babel.gettext(u'active') babel.gettext(u'created') babel.gettext(u'done') babel.gettext(u'archive') babel.gettext(u'alarms.statechangeactivated') babel.gettext(u'alarms.prioshort0') babel.gettext(u'alarms.prioshort1') babel.gettext(u'alarms.prioshort2') babel.gettext(u'alarms.carsinuse') babel.gettext(u'history.autochangeState') babel.gettext(u'history.message') babel.gettext(u'trigger.alarm_added') babel.gettext(u'trigger.alarm_changestate') babel.gettext(u'trigger.alarm_added_sub') babel.gettext(u'trigger.alarm_changestate_sub') babel.gettext(u'alarms.print.slightleft') babel.gettext(u'alarms.print.slightright') babel.gettext(u'alarms.print.right') babel.gettext(u'alarms.print.left') babel.gettext(u'alarms.print.straight') babel.gettext(u'alarms.print.exit') babel.gettext(u'alarms.print.bus') babel.gettext(u'alarms.print.positive') babel.gettext(u'alarms.print.negative') babel.gettext(u'alarms.filter.0') babel.gettext(u'alarms.filter.1') babel.gettext(u'alarms.filter.7') babel.gettext(u'alarms.filter.31') babel.gettext(u'internal') babel.gettext(u'external') babel.gettext(u'AFAlerting') babel.gettext(u'AFCars') babel.gettext(u'AFMaterial') babel.gettext(u'AFReport') babel.gettext(u'AFTime') babel.gettext(u'AFDamage') babel.gettext(u'AFOthers') babel.gettext(u'AFPersons') babel.gettext(u'alarms.fields.simple') babel.gettext(u'alarms.fields.extended') babel.gettext(u'alarms.fields.persons.field.sum') babel.gettext(u'alarms.fields.persons.field.house') babel.gettext(u'alarms.fields.persons.field.pa_alarm') babel.gettext(u'alarms.fields.persons.field.el') babel.gettext(u'alarms.fields.persons.field.alarm') babel.gettext(u'alarms.fields.persons.field.pa') babel.gettext(u'alarms.fields.persons.field.pa_house') babel.gettext(u'alarms.fields.persons.field.elgrade') babel.gettext(u'alarms.fields.persons.field.style.simple') babel.gettext(u'alarms.fields.persons.field.style.extended') # init # Do init script for alarms at start and add alarms (state = 1 or 2) (active or done) for aalarm in Alarm.query.filter(Alarm.state == 1 or Alarm.state == 2).all(): aalarm.updateSchedules(reference=1)