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)
def handleEvent(eventname, **kwargs): """ Eventhandler for alarm class :param eventname: name of event :param kwargs: parameter list: error, fields, filename, id, incomepath, mode, time :return: all kwargs """ from emonitor import app global LASTALARM alarm_fields = dict() stime = time.time() alarmtype = None for t in AlarmType.getAlarmTypes(): #if re.search(t.keywords.replace('\r\n', '|'), unicode(kwargs['text'], errors='ignore')): if re.search(t.keywords.replace('\r\n', '|'), kwargs['text']): alarm_fields = t.interpreterclass().buildAlarmFromText(t, kwargs['text']) if u'error' in alarm_fields.keys(): kwargs['error'] = alarm_fields['error'] del alarm_fields['error'] alarmtype = t break # copy file -> original name if 'time' in alarm_fields and alarm_fields['time'][1] == 1: # found correct time t = datetime.datetime.strptime(alarm_fields['time'][0], '%d.%m.%Y - %H:%M:%S') else: t = datetime.datetime.now() if not os.path.exists('{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/'))): os.makedirs('{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/'))) try: shutil.copy2('{}{}'.format(kwargs['incomepath'], kwargs['filename']), '{}{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/%Y%m%d-%H%M%S'), os.path.splitext(kwargs['filename'])[1])) except: pass try: # remove file os.remove('{}{}'.format(kwargs['incomepath'], kwargs['filename'])) except: pass kwargs['filename'] = '{}{}'.format(t.strftime('%Y/%m/%Y%m%d-%H%M%S'), os.path.splitext(kwargs['filename'])[1]) logger.debug('alarm_fields: {}'.format(alarm_fields)) if len(alarm_fields) == 0: # no alarmfields found kwargs['id'] = 0 logger.error('no alarm fields found.') return kwargs kwargs['fields'] = '' for k in alarm_fields: kwargs['fields'] = u'{}\n-{}:\n {}'.format(kwargs['fields'], k, alarm_fields[k]) if not alarmtype: # alarmtype not found kwargs['id'] = 0 kwargs['error'] = 'alarmtype not found' logger.error('alarmtype not found.') return kwargs # position _position = dict(lat=u'0.0', lng=u'0.0') if USE_NOMINATIM == 1: try: url = 'http://nominatim.openstreetmap.org/search' params = 'format=json&city={}&street={}'.format(alarm_fields['city'][0], alarm_fields['address'][0]) if 'streetno' in alarm_fields: params += ' {}'.format(alarm_fields['streetno'][0].split()[0]) # only first value r = requests.get('{}?{}'.format(url, params)) _position = dict(lat=r.json()[0]['lat'], lng=r.json()[0]['lon']) except: pass # create alarm object if 'key' not in alarm_fields.keys() or alarm_fields['key'][0] == u'': if alarmtype.translation(u'_bma_main_') in alarm_fields['remark'][0] or alarmtype.translation(u'_bma_main_') in alarm_fields['person'][0]: alarmkey = Alarmkey.query.filter(Alarmkey.key.like(u"%{}%".format(alarmtype.translation(u'_bma_')))).all() if len(alarmkey) > 0: alarm_fields['key'] = ('{}: {}'.format(alarmkey[0].category, alarmkey[0].key), str(alarmkey[0].id)) else: alarm_fields['key'] = (alarmtype.translation(u'_bma_key_'), u'0') if 'time' in alarm_fields and alarm_fields['time'][1] == 1: # found correct time t = datetime.datetime.strptime(alarm_fields['time'][0], '%d.%m.%Y - %H:%M:%S') else: t = datetime.datetime.now() alarm = Alarm(t, alarm_fields['key'][0], 1, 0) alarm.set('id.key', alarm_fields['key'][1]) alarm.material = dict(cars1='', cars2='', material='') # set required attributes alarm.set('marker', '0') alarm.set('filename', kwargs['filename']) alarm.set('priority', '1') # set normal priority alarm.set('alarmtype', alarmtype.name) # set checker name alarm.state = 1 # city if 'city' in alarm_fields and alarm_fields['city'][1] != 0: alarm.city = City.getCities(id=alarm_fields['city'][1]) if alarm_fields['address'][1] != 0: alarm.street = Street.getStreets(id=alarm_fields['address'][1]) else: # city not found -> build from fax url = 'http://nominatim.openstreetmap.org/search' params = u'format=json&city={}&street={}'.format(alarm_fields['city'][0].split()[0], alarm_fields['address'][0]) if 'streetno' in alarm_fields and alarm_fields['streetno'][0]: params += u' {}'.format(alarm_fields['streetno'][0].split()[0]) # only first value alarm.set('streetno', alarm_fields['streetno'][0]) r = requests.get(u'{}?{}'.format(url, params)) logger.debug('load address data from nomination with parameters: city=%s street=%s' % (alarm_fields['city'][0].split()[0], alarm_fields['address'][0])) try: _position = dict(lat=r.json()[0]['lat'], lng=r.json()[0]['lon']) alarm.position = _position except: pass alarm.set('city', alarm_fields['city'][0].split()[0]) alarm.set('id.city', alarm_fields['city'][1]) alarm.set('address', alarm_fields['address'][0]) if alarm_fields['address'][1] != 0: alarm.street = Street.getStreets(id=alarm_fields['address'][1]) if 'cars' in alarm_fields: # add cars found in material for _c in alarm_fields['cars'][1].split(';'): alarm.set('k.cars1', alarm.get('k.cars1') + ';' + _c) # street / street2 if 'address' in alarm_fields and alarm_fields['address'][0] != '': # check correct city -> change if street has different city if len(str(alarm_fields['address'][1]).split(';')) > 0 and alarm_fields['address'][1] != 0: _c = [] for s in str(alarm_fields['address'][1]).split(';'): _s = Street.getStreets(id=s) if _s.cityid and _s.cityid not in _c and _s.cityid == alarm_fields['city'][1]: _c.append(_s.cityid) alarm.street = _s if 'object' in alarm_fields and str(alarm_fields['object'][1]) == '0': if 'lat' not in alarm_fields and 'lng' not in alarm_fields: alarm.position = dict(lat=_s.lat, lng=_s.lng, zoom=_s.zoom) if _position['lat'] != u'0.0' and _position['lng'] != u'0.0': # set marker if nominatim delivers result alarm.position = _position alarm.set('marker', '1') else: # add unknown street alarm.set('id.address', 0) alarm.set('address', alarm_fields['address'][0]) # houseno if 'streetno' in alarm_fields.keys(): alarm.set('streetno', alarm_fields['streetno'][0]) if 'id.streetno' in alarm_fields and 'lat' in alarm_fields and 'lng' in alarm_fields: alarm.position = dict(lat=alarm_fields['lat'][0], lng=alarm_fields['lng'][0]) alarm.set('id.streetno', alarm_fields['id.streetno'][1]) else: # new hn = alarm.street.getHouseNumber(name=alarm_fields['streetno'][0]) if hn: alarm.position = hn.getPosition(0) if 'zoom' in alarm_fields.keys(): alarm.set('zoom', alarm_fields['zoom'][0]) # crossing if 'crossing' in alarm_fields and alarm_fields['crossing'][0] != '': if 'crossing' in alarm_fields and alarm_fields['address'][1] != alarm_fields['crossing'][1]: alarm.set('id.address2', alarm_fields['crossing'][1]) alarm.set('address2', alarm_fields['crossing'][0]) else: alarm.set('id.address2', '0') alarm.set('address2', alarm_fields['crossing'][0]) # addresspart if 'addresspart' in alarm_fields and alarm_fields['addresspart'][0] != '' and alarm_fields['addresspart'][0] != alarm_fields['address'][0]: if alarm_fields['addresspart'][1] > 0: if len(str(alarm_fields['addresspart'][1]).split(';')) > 0: _c = [] for s in str(alarm_fields['addresspart'][1]).split(';'): try: _s = Street.getStreets(id=s) if _s.cityid not in _c and _s.cityid == alarm_fields['city'][1]: _c.append(_s.cityid) alarm.set('id.address2', _s.id) except: pass else: alarm.set('id.address2', alarm_fields['addresspart'][1]) else: alarm.set('id.address2', '0') alarm.set('address2', alarm_fields['addresspart'][0]) # person if 'person' in alarm_fields and alarm_fields['person'][0] != '': alarm.set('person', alarm_fields['person'][0]) # alarmplan if 'alarmplan' in alarm_fields and alarm_fields['alarmplan'][0] != '': alarm.set('alarmplan', alarm_fields['alarmplan'][0]) # alarmobject _ao = None if 'object' in alarm_fields and alarm_fields['object'][0] != '' and 'city' in alarm_fields and alarm_fields['city'][1] > 0: alarm.set('object', alarm_fields['object'][0]) alarm.set('id.object', alarm_fields['object'][1]) # alarmplan from object if alarm_fields['object'][1] != 0: _ao = AlarmObject.getAlarmObjects(id=alarm_fields['object'][1]) if _ao: if _ao.alarmplan != 0: alarm.set('alarmplan', _ao.alarmplan) if _ao.street.id != alarm_fields['address'][1]: # street config from alarmobject alarm.street = Street.getStreets(id=_ao.street.id) if _ao.streetno == "": alarm.set('streetno', alarm_fields['streetno'][0]) else: alarm.set('streetno', _ao.streetno) alarm.position = dict(lat=_ao.lat, lng=_ao.lng, zoom=_ao.zoom) # remark if 'remark' in alarm_fields and alarm_fields['remark'][0] != '': alarm.set('remark', alarm_fields['remark'][0]) if alarmtype.translation(u'_bma_main_') in alarm_fields['remark'][0] or alarmtype.translation(u'_bma_main_') in alarm_fields['person'][0]: alarmkey = Alarmkey.query.filter(Alarmkey.key.like(u"%{}%".format(alarmtype.translation(u'_bma_')))).first() if alarmkey: alarm.set('id.key', alarmkey.id) alarm._key = u'{}: {}'.format(alarmkey.category, alarmkey.key) else: alarm.set('id.key', '0') alarm._key = alarmtype.translation(u'_bma_key_') # additional remarks if 'remark2' in alarm_fields and alarm_fields['remark2'][0] != '': alarm.set('remark', u'%s\n%s' % (alarm.get('remark'), alarm_fields['remark2'][0])) # material if alarm.get('id.key') != 0 and 'city' in alarm_fields: # found key with aao if alarm_fields['city'][1] != 0: # default city if Department.getDepartments(id=alarm.city.dept).defaultcity == alarm_fields['city'][1]: # default city for dep if 'material' in alarm_fields: if str(alarm_fields['material'][1])[0] == '0': # default cars for aao try: alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.street.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.street.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.street.city.dept)])) except AttributeError: alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.city.dept)])) for _c in u'{}'.format(alarm_fields['material'][1]).split(','): # add additional cars if _c != '0' and _c not in alarm.get('k.cars1').split(','): alarm.set('k.cars1', u'{},{}'.format(alarm.get('k.cars1'), _c)) else: # only alarmed material alarm.material = dict(cars1=alarm_fields['material'][1]) else: # else city if alarm_fields['material'][1] == u'0': # default cars for aao alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.city.dept)])) else: alarm.material = dict(cars1=u','.join(list(OrderedDict.fromkeys(filter(lambda x: x != '0', str(alarm_fields['material'][1]).split(',')))))) else: # default aao of current department (without aao) if alarm_fields['city'][1] != 0: # found city -> use default aao c = City.getCities(id=alarm_fields['city'][1]).dept akc = Alarmkey.getDefault(c) alarm.material = dict(cars1=u','.join([str(c.id) for c in akc.cars1]), cars2=u",".join([str(c.id) for c in akc.cars2]), material=u",".join([str(c.id) for c in akc.materials])) l = (u'%s,%s,%s' % (alarm.get('k.cars1'), alarm.get('k.cars2'), alarm.get('k.material'))).split(',') if len(set(str(alarm_fields['material'][1]).split(',')).intersection(set(l))) == 0: _dep = Department.getDefaultDepartment() for c in alarm_fields['material'][1].split(','): if c == u'0': # default of home department needed alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(_dep.id)]), cars2=u",".join([str(c.id) for c in alarm.key.getCars2(_dep.id)]), material=u",".join([str(c.id) for c in alarm.key.getMaterial(_dep.id)])) break if u'0' not in alarm_fields['material'][1]: # only single car needed alarm.set('k.cars1', u'{},{}'.format(alarm_fields['material'][1], alarm.get('k.cars1'))) if _ao and _ao.hasOwnAAO(): # use aao of current object alarm.material = dict(cars1=u",".join([str(c.id) for c in _ao.getCars1()]), cars2=u",".join([str(c.id) for c in _ao.getCars2()]), material=u",".join([str(c.id) for c in _ao.getMaterial()])) if 'time' not in kwargs.keys(): kwargs['time'] = [] etime = time.time() kwargs['time'].append('alarm creation done in %s sec.' % (etime - stime)) if kwargs['mode'] != 'test': db.session.add(alarm) db.session.commit() signal.send('alarm', 'added', alarmid=alarm.id) Alarm.changeState(alarm.id, 1) # activate alarm logger.info('alarm created with id %s (%s)' % (alarm.id, (etime - stime))) else: kwargs['fields'] += '\n\n--------------------------\nALARM-Object\n' _cdict = Car.getCarsDict() for a in alarm.attributes: try: if a in ['k.cars1', 'k.cars2', 'k.material']: kwargs['fields'] += '\n-%s:\n %s -> %s' % (a, alarm.get(a), ", ".join([_cdict[int(_c)].name for _c in alarm.get(a).split(',') if _c != ""])) elif a in 'id.key': _k = Alarmkey.getAlarmkeys(id=alarm.get(a)) kwargs['fields'] += '\n-%s:\n %s -> %s: %s' % (a, alarm.get(a), _k.category, _k.key) elif a == 'id.address': kwargs['fields'] += '\n-%s:\n %s -> %s' % (a, alarm.get(a), Street.getStreets(id=alarm.get(a)).name) else: kwargs['fields'] += '\n-%s:\n %s' % (a, alarm.get(a)) except (AttributeError, KeyError): kwargs['fields'] += '\n-%s:\n %s (error)' % (a, alarm.get(a)) kwargs['id'] = '-0' # add dummy id db.session.rollback() logger.info('alarm created in TESTMODE (%s)' % (etime - stime)) return kwargs
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 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)
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)
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']) # 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)
def handleEvent(eventname, **kwargs): """ Eventhandler for alarm class :param eventname: name of event :param kwargs: parameter list: error, fields, filename, id, incomepath, mode, time :return: all kwargs """ try: from emonitor import app global LASTALARM alarm_fields = dict() stime = time.time() alarmtype = None for t in AlarmType.getAlarmTypes(): if re.search(t.keywords.replace('\r\n', '|'), kwargs.get('text', '')): alarm_fields = t.interpreterclass().buildAlarmFromText(t, kwargs.get('text', '')) if alarm_fields.get('error'): kwargs['error'] = alarm_fields['error'] del alarm_fields['error'] alarmtype = t break alarm = Alarm(datetime.datetime.now(), '', 1, 0) etime = time.time() _missing = 0 for p in ['time', 'city', 'address', 'key']: if p not in alarm_fields: # test required fields _missing += 1 kwargs['error'] = kwargs.get('error', 'Missing parameter:') + "<br/>- '{}'".format(p) try: t = datetime.datetime.strptime(alarm_fields.get('time')[0], '%d.%m.%Y - %H:%M:%S') except ValueError: t = datetime.datetime.now() alarm.timestamp = t kwargs['id'] = u'<ul><li>-test-</li></ul>' # add dummy id kwargs['fields'] = u'<ul>' # set evaluated fields from fax for k in sorted(alarm_fields): # add field values as unicode string if len(alarm_fields[k]) > 1: kwargs['fields'] = u'{}<li><b>{}:</b>\n <small style="color:silver">value:</small> "{}" → <small style="color:silver">id:</small> {}</li>'.format(kwargs.get('fields'), k, alarm_fields[k][0], alarm_fields[k][1]) else: kwargs['fields'] = u'{}<li><b>{}:</b>\n <small style="color:silver">value:</small> "{}"</li>'.format(kwargs.get('fields'), k, alarm_fields[k]) kwargs['fields'] = kwargs.get('fields', ' ') + '</ul></pre>\n\n<h5> ALARM-Object</h5>\n<pre><ul>' if _missing == 0: # all required parameters found if kwargs.get('mode') != 'test': if not os.path.exists('{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/'))): os.makedirs('{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/'))) try: shutil.copy2('{incomepath}{filename}'.format(**kwargs), '{}{}{}'.format(app.config.get('PATH_DONE'), t.strftime('%Y/%m/%Y%m%d-%H%M%S'), os.path.splitext(kwargs.get('filename'))[1])) except: pass try: # remove file os.remove('{incomepath}{filename}'.format(**kwargs)) except: pass kwargs['filename'] = '{}{}'.format(t.strftime('%Y/%m/%Y%m%d-%H%M%S'), os.path.splitext(kwargs['filename'])[1]) logger.debug('alarm_fields: {}'.format(alarm_fields)) if len(alarm_fields) == 0: # no alarmfields found kwargs['id'] = 0 logger.error('no alarm fields found.') return kwargs if not alarmtype: # alarmtype not found kwargs['id'] = 0 kwargs['error'] = kwargs.get('error', '') + 'alarmtype not found' logger.error('alarmtype not found.') return kwargs # position if alarm_fields.get('lat'): _position = dict(lat=alarm_fields.get('lat')[0], lng=alarm_fields.get('lng')[0]) else: _position = dict(lat=u'0.0', lng=u'0.0') if USE_NOMINATIM == 1: try: url = 'http://nominatim.openstreetmap.org/search' params = 'format=json&city={}&street={}'.format(alarm_fields['city'][0], alarm_fields['address'][0]) if 'streetno' in alarm_fields: params += ' {}'.format(alarm_fields['streetno'][0].split()[0]) # only first value r = requests.get('{}?{}'.format(url, params)) _position = dict(lat=r.json()[0]['lat'], lng=r.json()[0]['lon']) except: pass # create alarm object if alarm_fields.get('key', [u'', 0])[0] == u'': if alarmtype.translation(u'_bma_main_') in alarm_fields.get('remark', [u'', 0])[0] or alarmtype.translation(u'_bma_main_') in alarm_fields.get('person', [u'', 0])[0]: alarmkey = Alarmkey.query.filter(Alarmkey.key.like(u"%{}%".format(alarmtype.translation(u'_bma_')))).all() if len(alarmkey) > 0: alarm_fields['key'] = ('{}: {}'.format(alarmkey[0].category, alarmkey[0].key), str(alarmkey[0].id)) else: alarm_fields['key'] = (alarmtype.translation(u'_bma_key_'), u'0') if alarm_fields.get('time', [u'', 0])[1] == 1: # found correct time t = datetime.datetime.strptime(alarm_fields.get('time', [u'', 0])[0], '%d.%m.%Y - %H:%M:%S') else: t = datetime.datetime.now() alarm.timestamp = t alarm.set('id.key', alarm_fields['key'][1]) alarm._key = alarm_fields['key'][0] alarm.material = dict(cars1='', cars2='', material='') # set required attributes alarm.set('marker', '0') alarm.set('filename', kwargs['filename']) alarm.set('priority', '1') # set normal priority alarm.set('alarmtype', alarmtype.name) # set checker name alarm.position = _position alarm.state = 1 # city if alarm_fields.get('city', ['', 0])[1] > 0: alarm.city = City.getCities(id=alarm_fields.get('city')[1]) if alarm_fields.get('address'): alarm.street = Street.getStreets(id=alarm_fields.get('address')[1]) else: # city not found -> build from fax url = 'http://nominatim.openstreetmap.org/search' if len(alarm_fields.get('city', [u'', 0])[0].split()) > 0: params = u'format=json&city={}&street={}'.format(alarm_fields.get('city', [u'', 0])[0].split()[0], alarm_fields.get('address', [u'', 0])[0]) if alarm_fields.get('streetno'): try: params += u' {}'.format(alarm_fields.get('streetno')[0].split()[0]) # only first value except: pass alarm.set('streetno', alarm_fields.get('streetno')[0]) try: r = requests.get(u'{}?{}'.format(url, params)) logger.debug(u'load address data from nomination with parameters: city={} street={}'.format(alarm_fields.get('city')[0].split()[0], alarm_fields.get('address', ['', 0])[0])) _position = dict(lat=r.json()[0]['lat'], lng=r.json()[0]['lon']) alarm.position = _position except: pass if len(alarm_fields.get('city', ['', 0])[0].split()) > 0: alarm.set('city', alarm_fields.get('city', ['', 0])[0].split()[0]) alarm.set('id.city', alarm_fields.get('city')[1]) alarm.set('address', alarm_fields.get('address', ['', 0])[0]) if alarm_fields.get('address', [u'', 0])[1] != 0: alarm.street = Street.getStreets(id=alarm_fields.get('address')[1]) if alarm_fields.get('cars'): # add cars found in material for _c in alarm_fields.get('cars')[1].split(';'): alarm.set('k.cars1', alarm.get('k.cars1') + ';' + _c) # street / street2 if alarm_fields.get('address', [u'', 0]) != '': # check correct city -> change if street has different city if len(str(alarm_fields.get('address')[1]).split(';')) > 0 and alarm_fields.get('address')[1] != 0: _c = [] for s in str(alarm_fields.get('address')[1]).split(';'): _s = Street.getStreets(id=s) if _s.cityid and _s.cityid not in _c and _s.cityid == alarm_fields.get('city', [u'', 0])[1]: _c.append(_s.cityid) alarm.street = _s if alarm_fields.get('object', [u'', 0])[1] == 0: if not alarm_fields.get('lat') and not alarm_fields.get('lng'): alarm.position = dict(lat=_s.lat, lng=_s.lng, zoom=_s.zoom) if _position['lat'] != u'0.0' and _position['lng'] != u'0.0': # set marker if nominatim delivers result alarm.position = _position alarm.set('marker', '1') else: # add unknown street alarm.set('id.address', 0) alarm.set('address', alarm_fields['address'][0]) # houseno if alarm_fields.get('streetno'): alarm.set('streetno', alarm_fields.get('streetno')[0]) if alarm_fields.get('id.streetno') and alarm_fields.get('lat') and alarm_fields.get('lng'): alarm.position = dict(lat=alarm_fields.get('lat')[0], lng=alarm_fields.get('lng')[0]) alarm.set('id.streetno', alarm_fields.get('id.streetno')[1]) else: # new hn = alarm.street.getHouseNumber(name=alarm_fields.get('streetno')[0]) if hn: alarm.position = hn.getPosition(0) if alarm_fields.get('zoom'): alarm.set('zoom', alarm_fields.get('zoom')[0]) # crossing if alarm_fields.get('crossing', [u'', 0])[0] != '': if alarm_fields.get('crossing', [u'', 0])[1] != alarm_fields.get('address',[u'', 0])[1]: alarm.set('id.address2', alarm_fields.get('crossing')[1]) alarm.set('address2', alarm_fields.get('crossing')[0]) else: alarm.set('id.address2', '0') alarm.set('address2', alarm_fields.get('crossing')[0]) # addresspart if alarm_fields.get('addresspart', [u'', 0])[0] != u'' and alarm_fields.get('addresspart', [u'', 0])[0] != alarm_fields.get('address', [u'', 0])[0]: if alarm_fields.get('addresspart')[1] > 0: if len(str(alarm_fields.get('addresspart')[1]).split(';')) > 0: _c = [] for s in str(alarm_fields.get('addresspart')[1]).split(';'): try: _s = Street.getStreets(id=s) if _s.cityid not in _c and _s.cityid == alarm_fields.get('city')[1]: _c.append(_s.cityid) alarm.set('id.address2', _s.id) except: pass else: alarm.set('id.address2', alarm_fields.get('addresspart')[1]) else: alarm.set('id.address2', '0') alarm.set('address2', alarm_fields.get('addresspart')[0]) # person if alarm_fields.get('person', [u'', 0])[0] != u'': alarm.set('person', alarm_fields.get('person')[0]) # alarmplan if alarm_fields.get('alarmplan', [u'', 0])[0] != u'': alarm.set('alarmplan', alarm_fields.get('alarmplan')[0]) # alarmobject _ao = None if alarm_fields.get('object', [u'', 0])[0] != u'' and alarm_fields.get('city', [u'', 0])[1] > 0: alarm.set('object', alarm_fields.get('object')[0]) alarm.set('id.object', alarm_fields.get('object')[1]) # alarmplan from object if alarm_fields.get('object')[1] != 0: _ao = AlarmObject.getAlarmObjects(id=alarm_fields.get('object')[1]) if _ao: if _ao.alarmplan != 0: alarm.set('alarmplan', _ao.alarmplan) elif alarm_fields.get('alarmplan'): alarm.set('alarmplan', alarm_fields.get('alarmplan')[0]) if _ao.street.id != alarm_fields.get('address', [u'', 0])[1]: # street config from alarmobject alarm.street = Street.getStreets(id=_ao.street.id) if _ao.streetno == "": alarm.set('streetno', alarm_fields.get('streetno')[0]) else: alarm.set('streetno', _ao.streetno) alarm.position = dict(lat=_ao.lat, lng=_ao.lng, zoom=_ao.zoom) # remark if alarm_fields.get('remark', [u'', 0])[0] != u'': alarm.set('remark', alarm_fields.get('remark')[0]) _bma = 0 for v in alarmtype.translation(u'_bma_main_').split(): if v in alarm_fields.get('remark', [u'', 0])[0] or v in alarm_fields.get('person', [u'', 0])[0]: _bma = 1 break if _bma == 1: alarmkey = Alarmkey.query.filter(Alarmkey.key.like(u"%{}%".format(alarmtype.translation(u'_bma_')))).first() if alarmkey: alarm.set('id.key', alarmkey.id) alarm._key = u'{}: {}'.format(alarmkey.category, alarmkey.key) else: alarm.set('id.key', '0') alarm._key = alarmtype.translation(u'_bma_key_') # additional remarks if alarm_fields.get('remark2', [u'', 0])[0] != u'': alarm.set('remark', u'{}\n{}'.format(alarm.get('remark'), alarm_fields.get('remark2')[0])) # material if alarm.get('id.key') != 0 and alarm_fields.get('city'): # found key with aao if alarm_fields.get('city')[1] not in [0, -1]: # default city if Department.getDepartments(id=alarm.city.dept).defaultcity == alarm_fields.get('city')[1]: # default city for dep if alarm_fields.get('material'): if str(alarm_fields.get('material')[1])[0] == '0': # default cars for aao try: alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.street.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.street.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.street.city.dept)])) except AttributeError: alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.city.dept)])) for _c in u'{}'.format(alarm_fields.get('material')[1]).split(','): # add additional cars if _c != '0' and _c not in alarm.get('k.cars1').split(','): alarm.set('k.cars1', u'{},{}'.format(alarm.get('k.cars1'), _c)) else: # only alarmed material alarm.material = dict(cars1=alarm_fields.get('material', [u'', ''])[1]) else: # else city if alarm_fields.get('material', [u'', u''])[1] == u'0': # default cars for aao alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(alarm.city.dept)]), cars2=u','.join([str(c.id) for c in alarm.key.getCars2(alarm.city.dept)]), material=u','.join([str(c.id) for c in alarm.key.getMaterial(alarm.city.dept)])) else: alarm.material = dict(cars1=u','.join(list(OrderedDict.fromkeys(filter(lambda x: x != '0', str(alarm_fields.get('material', ['', '-1'])[1]).split(',')))))) else: # default aao of current department (without aao) if alarm_fields.get('city', [u'', 0])[1] != 0: # found city -> use default aao if City.getCities(id=alarm_fields.get('city')[1]): c = City.getCities(id=alarm_fields.get('city')[1]).dept else: c = City.getDefaultCity().dept akc = Alarmkey.getDefault(c) if len(akc.cars1) + len(akc.cars2) + len(akc.materials) == 0: # no default aao defined # use cars of fax alarm.material = {'cars1': re.sub(r'^0,', '', alarm_fields.get('material')[1]), 'cars2': '', 'material': ''} else: # use cars of default aao alarm.material = dict(cars1=u','.join([str(c.id) for c in akc.cars1]), cars2=u",".join([str(c.id) for c in akc.cars2]), material=u",".join([str(c.id) for c in akc.materials])) l = (u'{},{},{}'.format(alarm.get('k.cars1'), alarm.get('k.cars2'), alarm.get('k.material'))).split(',') if len(set(str(alarm_fields.get('material', ([], '-1'))[1]).split(',')).intersection(set(l))) == 0: _dep = Department.getDefaultDepartment() for c in str(alarm_fields.get('material', ([], '-1'))[1]).split(','): if c == u'0': # default of home department needed alarm.material = dict(cars1=u','.join([str(c.id) for c in alarm.key.getCars1(_dep.id)]), cars2=u",".join([str(c.id) for c in alarm.key.getCars2(_dep.id)]), material=u",".join([str(c.id) for c in alarm.key.getMaterial(_dep.id)])) break if u'0' not in str(alarm_fields.get('material', ([], '-1'))[1]): # only single car needed alarm.set('k.cars1', u'{},{}'.format(alarm_fields.get('material', ([], '-1'))[1], alarm.get('k.cars1'))) if _ao and _ao.hasOwnAAO(): # use aao of current object alarm.material = dict(cars1=u",".join([str(c.id) for c in _ao.getCars1()]), cars2=u",".join([str(c.id) for c in _ao.getCars2()]), material=u",".join([str(c.id) for c in _ao.getMaterial()])) if not kwargs.get('time'): kwargs['time'] = [] kwargs['time'].append('alarm creation done in {} sec.'.format(etime - stime)) if kwargs.get('mode') != 'test': db.session.add(alarm) db.session.commit() signal.send('alarm', 'added', alarmid=alarm.id) Alarm.changeState(alarm.id, 1) # activate alarm logger.info('alarm created with id {} ({})'.format(alarm.id, (etime - stime))) else: _cdict = Car.getCarsDict() for a in sorted(alarm.attributes): try: if a in ['k.cars1', 'k.cars2', 'k.material']: kwargs['fields'] += '<li><b>%s:</b>\n <small style="color:silver">id:</small> "%s" → "%s"</li>' % (a, alarm.get(a), ", ".join([_cdict[int(_c)].name for _c in alarm.get(a).split(',') if _c not in ['', '0']])) elif a in 'id.key': if alarm.get(a) > 0: _k = Alarmkey.getAlarmkeys(id=alarm.get(a)) kwargs['fields'] += '<li><b>%s:</b>\n <small style="color:silver">id:</small> "%s" → "%s: %s"</li>' % (a, alarm.get(a), _k.category, _k.key) else: kwargs['fields'] += '<li><b>%s:</b>\n <small style="color:silver">value:</small> "%s"</li>' % (a, alarm.get(a)) kwargs['fields'] += '<li><b>key:</b>\n <small style="color:silver">value:</small> "%s"</li>' % alarm._key elif a == 'id.address': kwargs['fields'] += '<li><b>%s:</b>\n <small style="color:silver">id:</small> "%s" → "%s"</li>' % (a, alarm.get(a), Street.getStreets(id=alarm.get(a)).name) elif a == 'id.object': kwargs['id.object'] = '<li><b>%s:</b>\n <small style="color:silver">value:</small> "%s"</li>' % (a, alarm.get(a)) kwargs['object'] = '<li><b>object:</b>\n <small style="color:silver">value:</small> "%s"</li>' % alarm.get('object') else: kwargs['fields'] += '<li><b>%s:</b>\n <small style="color:silver">value:</small> "%s"</li>' % (a, alarm.get(a)) except (AttributeError, KeyError): kwargs['fields'] += '<li style="color:red"><b>%s:</b>\n <small style="color:silver">value:</small> "%s" (error)</li>' % (a, alarm.get(a)) kwargs['fields'] += "</ul>" db.session.rollback() logger.info('alarm created in TESTMODE (%s)' % (etime - stime)) except: signal.send('alarm', 'error', message='alarms.errorincreation', text=kwargs.get('text', '')) return 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': 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)