Esempio n. 1
0
    def action(**kwargs):
        """
        implementation of map-message specific actions
        :param kwargs: list of parameters: action, mid and all arguments of ajax requests
        :return: results of action
        """
        if kwargs.get('action') == 'render':
            """
            render string with restructured text engine
            """
            return getreStructuredText(kwargs.get('text'))

        elif kwargs.get('action') == 'mapconfig':
            """
            open overlay map with config values
            """
            try:
                config = json.loads(kwargs.get('config', ''))
            except ValueError:
                config = {}
            if not config.get('lat'):
                config['lat'] = Settings.get('defaultLat')
            if not config.get('lng'):
                config['lng'] = Settings.get('defaultLng')
            config['map'] = Map.getDefaultMap()
            kwargs.update(**config)
            #print ">>>>>", kwargs
            return render_template("frontend.messages_map.html", **kwargs)
        return ""
Esempio n. 2
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for birthday widget *messages.birthday.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get('template')
            n = int(kwargs['message'].get('number'))
            orientation = kwargs['message'].get('orientation')
        else:
            content = Settings.get('messages.birthday.content')
            template = ""  # todo define templates
            n = int(Settings.get('messages.birthday.number', 20))
            orientation = Settings.get('messages.birthday.orientation', 20)

        persons = sorted(Person.getPersons(onlyactive=True), key=lambda p: p.birthday)
        p = [(val.birthday - int(datetime.datetime.now().strftime('%j')), idx, persons[idx].lastname, persons[idx].birthdate) for (idx, val) in enumerate(persons)]
        idx = min(filter(lambda x: x[0] >= 0, p))

        person = OrderedDict()
        try:
            for i in range(idx[1] - (n / 2) + 1, idx[1] + (n / 2) + 2):
                _p = persons[i % (len(p))]
                if _p.birthdate.strftime('%d.%m.') not in person.keys():
                    person[_p.birthdate.strftime('%d.%m.')] = []
                person[_p.birthdate.strftime('%d.%m.')].append(_p)
            for _p in persons:
                if _p.birthdate.strftime('%d.%m.') in person.keys() and _p not in person[_p.birthdate.strftime('%d.%m.')]:
                    person[_p.birthdate.strftime('%d.%m.')].append(_p)
        except:
            pass

        kwargs.update({'content': content, 'template': template, 'persons': person, 'daynum': int((datetime.datetime.now()).strftime('%j')), 'orientation': orientation})
        self.params = kwargs
Esempio n. 3
0
    def action(**kwargs):
        """
        implementation of map-message specific actions
        :param kwargs: list of parameters: action, mid and all arguments of ajax requests
        :return: results of action
        """
        if kwargs.get('action') == 'render':
            """
            render string with restructured text engine
            """
            return getreStructuredText(kwargs.get('text'))

        elif kwargs.get('action') == 'mapconfig':
            """
            open overlay map with config values
            """
            try:
                config = json.loads(kwargs.get('config', ''))
            except ValueError:
                config = {}
            if not config.get('lat'):
                config['lat'] = Settings.get('defaultLat')
            if not config.get('lng'):
                config['lng'] = Settings.get('defaultLng')
            config['map'] = Map.getDefaultMap()
            kwargs.update(**config)
            #print ">>>>>", kwargs
            return render_template("frontend.messages_map.html", **kwargs)
        return ""
def getFrontendData(self):
    """
    Deliver frontend content of module streets (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get('action') == 'streetcoords':  # get map parameter for given streetid

        if request.args.get('id') not in ['', 'None']:
            street = Street.getStreets(id=request.args.get('id'))
            return {'lat': street.lat, 'lng': street.lng, 'zoom': street.zoom, 'way': street.navigation,
                    'cityid': street.cityid, 'cityname': street.city.name}

    elif request.args.get('action') == 'housecoords':  # deliver center of housenumbers
        if request.args.get('streetid') != '' and request.args.get('housenumber') != '':
            street = Street.getStreet(id=request.args.get('streetid'))
            hnumber = street.getHouseNumber(number=request.args.get('housenumber').split()[0])
            if hnumber:
                return hnumber.getPosition(0)

            return {'lat': street.lat, 'lng': street.lng}
        return {}

    elif request.args.get('action') == 'defaultposition':

        return {'defaultlat': float(Settings.get('defaultLat')),
                'defaultlng': float(Settings.get('defaultLng')),
                'defaultzoom': int(Settings.get('defaultZoom'))}

    elif request.args.get('action') == 'alarmposition':
        alarm = Alarm.getAlarms(id=request.args.get('alarmid'))
        if alarm:
            return {'id': request.args.get('alarmid'), 'alarmlat': alarm.lat, 'alarmlng': alarm.lng,
                    'alarmzoom': alarm.zoom, 'marker': alarm.marker, 'alarmprio': alarm.priority,
                    'alarmstreet': alarm.street.name, 'alarmstreetno': alarm.get('streetno'),
                    'alarmstreet2': alarm.get('address2'), 'alarmcity': alarm.city.name,
                    'alarmsubcity': alarm.street.subcity}
        else:
            return {'id': '0'}

    elif request.args.get('action') == 'streetslookup':
        streets = {}
        cities = {}
        for c in City.getCities():
            cities[c.id] = c.name
            for k, street in c.streets.iteritems():
                if street.active:
                    try:
                        streets[str(street.id)] = '%s (%s)' % (street.name, c.name)
                    except:
                        streets[str(street.id)] = '%s (-%s-)' % (street.name, street.cityid)
        return streets

    elif request.args.get('action') == 'defaultmap':
        dmap = Map.getDefaultMap()
        return {'tileserver': dmap.tileserver, 'name': dmap.name}

    return ""
Esempio n. 5
0
    def getExportData(exportformat, **params):
        """
        Export alarm to given format

        :param exportformat: *.html*, *.png*
        :param params:
          - style: exportstyle: *alarmmap*, *routemap*

          - filename: name of exportfile

        :return: alarm in correct format
        """
        if params['id'] and params:
            alarm = Alarm.getAlarms(id=params['id'])
            logger.debug('load export data for alarm {}, style {}, exportformat {}'.format(params['id'], params['style'], exportformat))
            if not alarm:  # create dummy alarm
                alarm = Alarm(datetime.datetime.now(), '', 2, 0)
                alarm.position = dict(lat=Settings.get('defaultLat'), lng=Settings.get('defaultLng'))
                alarm.set('id.key', '1')
                alarm.set('id.address', '1')
                alarm.set('id.city', '1')
                alarm.set('remark', 'TEST TEST TEST')
            if alarm:
                if exportformat == '.html' and 'style' in params:  # build html-template
                    params.update({'alarm': alarm})
                    try:
                        if params['style'].startswith(u'report'):
                            return render_template('{}.html'.format(params['style']), **params)
                        else:
                            return render_template('print.{}.html'.format(params['style']), **params)
                    except TemplateNotFound:
                        logger.error('template {}{} not found'.format(params['style'], exportformat))
                        return abort(404)

                elif exportformat == '.png':  # send image file

                    if params['style'].startswith('alarmmap'):  # deliver map for alarmid
                        from emonitor.modules.maps.map_utils import getAlarmMap
                        args = dict()
                        if params['style'] != 'alarmmap':
                            args = dict(style=params['style'].split('_')[-1])
                        return getAlarmMap(alarm, current_app.config.get('PATH_TILES'), **args)

                    elif params['style'] == 'routemap':  # deliver map with route
                        from emonitor.modules.maps.map_utils import getAlarmRoute
                        return getAlarmRoute(alarm, current_app.config.get('PATH_TILES'))

                    if 'filename' in params and os.path.exists("%s/inc/%s.png" % (os.path.abspath(os.path.dirname(__file__)), params['filename'])):
                        with open("%s/inc/%s.png" % (os.path.abspath(os.path.dirname(__file__)), params['filename']), 'rb') as f:
                            return f.read()
        abort(404)
Esempio n. 6
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for weather widget *messages.weather.\**
        check https://developer.yahoo.com/yql/console/ for online editor

        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            location = kwargs['message'].attributes['weather.location']
            icons = kwargs['message'].attributes['weather.icons']
            forecast = kwargs['message'].attributes['weather.forecast']
        else:
            location = Settings.get('messages.weather.location')
            icons = Settings.get('messages.weather.icons')
            forecast = Settings.get('messages.weather.forecast')

        if not self.lastcall or datetime.datetime.now() > self.lastcall + datetime.timedelta(hours=1):
            # reload data from web
            compass = ['N', 'NNO', 'NO', 'ONO', 'O', 'OSO', 'SO', 'SSO', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW', 'N']
            baseurl = "https://query.yahooapis.com/v1/public/yql?"
            yql_query = u'select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="{}") and u="c"'.format(location).encode('utf-8')
            yql_url = baseurl + urllib.urlencode({'q': yql_query}) + "&format=json"
            try:
                result = urllib2.urlopen(yql_url).read()
                self.data = json.loads(result)
                self.data = self.data['query']['results']['channel']
            except urllib2.URLError:
                self.data = {}
            try:
                self.data['wind']['directionstring'] = compass[int(int(self.data['wind']['direction']) / 22.5)]
            except (KeyError, ValueError):
                self.data['wind'] = {}
                self.data['wind']['directionstring'] = ""

            if 'astronomy' not in self.data:
                self.data['astronomy'] = {'sunrise': {}, 'sunset': {}}
            if 'am' in self.data['astronomy']['sunrise']:
                self.data['astronomy']['sunrise'] = self.data['astronomy']['sunrise'][:-3]
            if 'pm' in self.data['astronomy']['sunset']:
                self.data['astronomy']['sunset'] = self.data['astronomy']['sunset'][:-3].split(':')
                self.data['astronomy']['sunset'][0] = "%s" % (12 + int(self.data['astronomy']['sunset'][0]))
                self.data['astronomy']['sunset'] = ':'.join(self.data['astronomy']['sunset'])
            self.lastcall = datetime.datetime.now()

        try:
            self.data['lastBuildDate'] = datetime.datetime.strptime(self.data['lastBuildDate'][:-5], '%a, %d %b %Y %I:%M %p').strftime('%d.%m.%Y %H:%M')
        except ValueError:
            self.data['lastBuildDate'] = datetime.datetime.now().strftime('%d.%m.%Y %H:%M')
        kwargs.update({'location': location, 'icons': icons, 'forecast': forecast, 'data': self.data})
        self.params = kwargs
Esempio n. 7
0
def getFrontendContent(**params):
    """
    Deliver frontend content of module maps

    :return: data of maps
    """
    if 'area' not in params.keys() and request.args.get('area', '') != '':
        params['area'] = request.args.get('area')

    if 'area' in params.keys() and params['area'] in ['west', 'center', 'east']:  # select view
        tiledefs = [d for d in Settings.get('mapitemdefinition') if d['parameters']['tileserver'] == '1']

        return render_template('frontend.map.html', maps=Map.getMaps(), defaultlat=Settings.get('defaultLat'), defaultlng=Settings.get('defaultLng'), defaultzoom=Settings.get('defaultZoom'), maptype="" or Map.getDefaultMap(), tiledefs=tiledefs)
    return "default"
Esempio n. 8
0
    def msg_start(bot, update, **kwargs):
        """
        send start message and add user id to emonitor user if found
        :param bot:
        :param update:
        :param kwargs:
        """
        for person in TelegramBot.users.getPersons():
            if person.firstname == update.message.from_user[
                    'first_name'] and person.lastname == update.message.from_user[
                        'last_name']:
                TelegramBot.logger.info(
                    'add telegramid {} to user {} {}'.format(
                        update.message.from_user['id'], person.firstname,
                        person.lastname))
                _additional = person.options
                _additional['telegramid'] = update.message.from_user['id']
                person._options = yaml.safe_dump(_additional, encoding='utf-8')
                db.session.commit()

        msgtext = Settings.get('telegramsettings')[
            'welcomemsg'] or babel.gettext('telegram.default.welcomemsg')
        bot.sendMessage(update.message.chat_id,
                        text=msgtext.format(
                            vorname=update.message.from_user.first_name,
                            nachname=update.message.from_user.last_name))
        TelegramBot.logger.info(
            'send message from "msg_start" to {} {}'.format(
                update.message.from_user.first_name,
                update.message.from_user.last_name))
Esempio n. 9
0
    def updateToken(self, token=None):
        """
        update token after changes
        :return: botname
        """
        from telegram.ext import Updater
        from telegram.error import InvalidToken, Unauthorized, NetworkError
        try:
            self.updater = Updater(token or Settings.get('telegramkey'))
            if self.updater.bot.getMe():
                self.botname = self.updater.bot.getMe().name
        except InvalidToken:
            self.updater = None
            self.botname = None
            logger.error('telegram module not functional')
        except Unauthorized:
            self.botname = None
        except NetworkError:
            self.logger.error("network error")
        except:
            self.updater = None
            self.botname = None
            logger.error('telegram module not functional')

        return self.botname
Esempio n. 10
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for widget and create content of widget from MessageType
        :param kwargs: list of parameters for update
        """
        content = ""
        if 'clientid' in kwargs:
            messages = filter(lambda x: x.currentState and kwargs['clientid'] in x.monitors, Messages.getActiveMessages())
        else:
            messages = filter(lambda x: x.currentState, Messages.getActiveMessages())

        kwargs.update({'settings': Settings})
        if len(messages) > 0:
            for message in messages:
                kwargs.update({'message': message, 'count': len(messages)})
                pos = render_template('monitor.messages.position.html', number=len(messages), position=messages.index(message))
                content += '<div class="slide">%s%s</div>\n' % (message.type.getMonitorContent(**kwargs), pos)

        else:  # load default message widget
            for mt in MessageType.getMessageTypes():
                if mt[0] == Settings.get('messages.base.default'):
                    kwargs.update({'footer': 1})  # set footer
                    content = mt[1].getMonitorContent(**kwargs)

        kwargs.update({'content': content, 'count': len(messages)})
        if len(messages) > 0:
            kwargs.update({'footer': 1})
        self.params = kwargs
        return kwargs
Esempio n. 11
0
    def updateToken(self, token=None):
        """
        update token after changes
        :return: botname
        """
        from telegram.ext import Updater
        from telegram.error import InvalidToken, Unauthorized, NetworkError
        try:
            self.updater = Updater(token or Settings.get('telegramkey'))
            if self.updater.bot.getMe():
                self.botname = self.updater.bot.getMe().name
        except InvalidToken:
            self.updater = None
            self.botname = None
            logger.error('telegram module not functional')
        except Unauthorized:
            self.botname = None
        except NetworkError:
            self.logger.error("network error")
        except:
            self.updater = None
            self.botname = None
            logger.error('telegram module not functional')

        return self.botname
Esempio n. 12
0
    def init_app(self, app):
        Communication.app = app

        try:  # try telegram
            import telegram
            self.__dict__['telegram'] = TelegramBot(app=app, token=Settings.get('telegramsettings')['telegramkey'] or app.config.get('TELEGRAMKEY'))
        except TypeError:
            Settings.set('telegramsettings', {'telegramkey': ''})
            self.__dict__['telegram'] = None
        except ImportError:
            logger.error("error telegram")
            self.__dict__['telegram'] = None

        try:  # try mail
            # TODO: add Mail communicator
            pass
            self.__dict__['mail'] = Mailer
        except ImportError:
            self.__dict__['mail'] = None
            logger.error("error Mail")
            # Mail = None

        app.extensions['communication'] = self

        logger.info("{} Communicator(s) loaded: {}".format(len(self.__dict__.keys()), ", ".join(self.__dict__.keys())))
        events.addHandlerClass('*', 'emonitor.communication.Communication', Communication.handleEvent, ['in.sendertype', 'in.group', 'in.id', 'in.style'])
Esempio n. 13
0
    def init_app(self, app):
        Communication.app = app

        try:  # try telegram
            import telegram
            self.__dict__['telegram'] = TelegramBot(
                app=app,
                token=Settings.get('telegramsettings')['telegramkey']
                or app.config.get('TELEGRAMKEY'))
        except TypeError:
            Settings.set('telegramsettings', {'telegramkey': ''})
            self.__dict__['telegram'] = None
        except ImportError:
            logger.error("error telegram")
            self.__dict__['telegram'] = None

        try:  # try mail
            # TODO: add Mail communicator
            pass
            self.__dict__['mail'] = Mailer
        except ImportError:
            self.__dict__['mail'] = None
            logger.error("error Mail")
            # Mail = None

        app.extensions['communication'] = self

        logger.info("{} Communicator(s) loaded: {}".format(
            len(self.__dict__.keys()), ", ".join(self.__dict__.keys())))
        events.addHandlerClass(
            '*', 'emonitor.communication.Communication',
            Communication.handleEvent,
            ['in.sendertype', 'in.group', 'in.id', 'in.style'])
Esempio n. 14
0
 def getCallString(self,
                   pdffilename="",
                   **params):  # get formated callstring
     from emonitor import app
     callstring = Settings.get('printer.callstring')
     callstring = callstring.replace('[basepath]',
                                     app.config.get('PROJECT_ROOT'))
     if self.printer == '<default>':  # use default printer
         callstring = callstring.replace('-printer [printer]', '')
     else:
         if 'printer' in params:
             callstring = callstring.replace(
                 '[printer]', '"{}"'.format(params['printer']))
         else:
             callstring = callstring.replace('[printer]',
                                             '"{}"'.format(self.printer))
     try:
         if 'copies' in params:
             callstring = callstring.replace('[copies]',
                                             "{}".format(params['copies']))
         else:
             callstring = callstring.replace('[copies]', self.settings[0])
     except IndexError:
         callstring = callstring.replace('[copies]', '1')
     callstring = callstring.replace('[filename]', pdffilename)
     return callstring
Esempio n. 15
0
 def updateCommunicator(self, commtype):
     for key, communicator in self.__dict__.items():
         if key == commtype:
             self.__dict__[key] = TelegramBot(
                 app=Communication.app,
                 token=Settings.get('telegramsettings')['telegramkey']
                 or Communication.app.config.get('TELEGRAMKEY'))
             return self.__dict__[key]
Esempio n. 16
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for birthday widget *messages.birthday.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get('template')
            n = int(kwargs['message'].get('number'))
            orientation = kwargs['message'].get('orientation')
        else:
            content = Settings.get('messages.birthday.content')
            template = ""  # todo define templates
            n = int(Settings.get('messages.birthday.number', 20))
            orientation = Settings.get('messages.birthday.orientation', 20)

        persons = sorted(Person.getPersons(onlyactive=True), key=lambda p: p.birthday)
        val, idx = min((val.birthday - int(datetime.datetime.now().strftime('%j')), idx) for (idx, val) in enumerate(persons) if val.birthday - int(datetime.datetime.now().strftime('%j')) >= 0)
        person = OrderedDict()

        # calculate correct slice of birthdays
        #for j in range(idx - (n / 2), idx + (n / 2)):
        #    p = persons[j % (len(persons))]
        #    if p.birthdate.strftime('%d.%m.') not in person.keys():
        #        person[p.birthdate.strftime('%d.%m.')] = []
        #    person[p.birthdate.strftime('%d.%m.')].append(p)

        x = 0
        while len(person.keys()) < n / 2:  # lower
            p = persons[(idx - x) % (len(persons))]
            if p.birthdate.strftime('%d.%m.') not in person.keys():
                person[p.birthdate.strftime('%d.%m.')] = []
            person[p.birthdate.strftime('%d.%m.')].append(p)
            x += 1
        x = 1
        person = OrderedDict(sorted(person.items(), key=lambda t: t[0]))  # order dates

        while len(person.keys()) < n:  # upper
            p = persons[(idx + x) % (len(persons))]
            if p.birthdate.strftime('%d.%m.') not in person.keys():
                person[p.birthdate.strftime('%d.%m.')] = []
            person[p.birthdate.strftime('%d.%m.')].append(p)
            x += 1

        kwargs.update({'content': content, 'template': template, 'persons': person, 'daynum': int((datetime.datetime.now()).strftime('%j'))})
        self.params = kwargs
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 ""
Esempio n. 18
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for birthday widget *messages.birthday.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get('template')
            n = int(kwargs['message'].get('number'))
            orientation = kwargs['message'].get('orientation')
        else:
            content = Settings.get('messages.birthday.content')
            template = ""  # todo define templates
            n = int(Settings.get('messages.birthday.number', 20))
            orientation = Settings.get('messages.birthday.orientation', 20)

        persons = sorted(Person.getPersons(onlyactive=True),
                         key=lambda p: p.birthday)
        p = [((val.birthday - int(datetime.datetime.now().strftime('%j'))) %
              365, idx, persons[idx].lastname, persons[idx].birthdate)
             for (idx, val) in enumerate(persons)]
        idx = min(filter(lambda x: x[0] >= 0, p))

        person = OrderedDict()
        try:
            for i in range(idx[1] - (n / 2) + 1, idx[1] + (n / 2) + 2):
                _p = persons[i % (len(p))]
                if _p.birthdate.strftime('%d.%m.') not in person.keys():
                    person[_p.birthdate.strftime('%d.%m.')] = []
                person[_p.birthdate.strftime('%d.%m.')].append(_p)
            for _p in persons:
                if _p.birthdate.strftime('%d.%m.') in person.keys(
                ) and _p not in person[_p.birthdate.strftime('%d.%m.')]:
                    person[_p.birthdate.strftime('%d.%m.')].append(_p)
        except:
            pass

        kwargs.update({
            'content': content,
            'template': template,
            'persons': person,
            'daynum': int((datetime.datetime.now()).strftime('%j')),
            'orientation': orientation
        })
        self.params = kwargs
Esempio n. 19
0
 def msg_help(bot, update, **kwargs):
     """
     send information about the bot
     :param bot:
     :param update:
     :param kwargs:
     """
     msgtext = Settings.get('telegramsettings')['helpmsg'] or babel.gettext('telegram.default.helpmsg')
     bot.sendMessage(update.message.chat_id, msgtext, parse_mode='Markdown')
     TelegramBot.logger.debug("help_msg sent.")
Esempio n. 20
0
    def addParameters(self, **kwargs):
        """
        choose implementation of weather channel

        :param kwargs:
        :return: list of parameters, weather dict added
        """
        if kwargs.get('message', {'weather.type': Settings.get('messages.weather.type', '')}).get('weather.type') in ['', 'yahoo']:
            return self._addParametersYahoo(**kwargs)
        else:
            return self._addParametersOWM(**kwargs)
Esempio n. 21
0
 def msg_help(bot, update, **kwargs):
     """
     send information about the bot
     :param bot:
     :param update:
     :param kwargs:
     """
     msgtext = Settings.get('telegramsettings')['helpmsg'] or babel.gettext(
         'telegram.default.helpmsg')
     bot.sendMessage(update.message.chat_id, msgtext, parse_mode='Markdown')
     TelegramBot.logger.debug("help_msg sent.")
Esempio n. 22
0
 def updateAdminSubNavigation(self):
     """
     Add submenu entries for admin area
     """
     from sqlalchemy.exc import OperationalError
     self.adminsubnavigation = []
     try:
         for maptype in Settings.get('mapitemdefinition'):
             self.adminsubnavigation.append(('/admin/mapitems/%s' % maptype['name'], '%s' % maptype['name']))
     except OperationalError:
         pass
     self.adminsubnavigation.append(('/admin/mapitems/definition', 'mapitems.definition'))
Esempio n. 23
0
    def type(self):
        """
        Get message type as MessageType class object

        :return: :py:class:`emonitor.modules.messages.messagetype.MessageType`
        """
        if self._type == '':
            self._type = Settings.get('messages.base.type')
        impl = filter(lambda x: x[0].split('.')[0] == self._type, MessageType.getMessageTypes())
        if len(impl) == 1:
            return impl[0][1]
        return None
Esempio n. 24
0
    def convertFileType(path, inname):
        from emonitor import app
        i = t = 0
        params = Ocr.getOCRParams()
        convertparams = Ocr.getConvertParams()

        ext = os.path.splitext(inname)[-1]
        inname = os.path.splitext(inname)[0]

        if ext[1:] not in params['inputformat']:
            return 0, 0.0

        path2 = app.config.get('PATH_TMP')
        if "/" in inname or "\\" in inname or ":" in inname:
            path = path2 = ""

        while 1:
            try:
                stime = time.time()
                callstring = convertparams['callstring']
                callstring = callstring.replace('[basepath]',
                                                app.config.get('PROJECT_ROOT'))
                callstring = callstring.replace('[incomepath]', path)
                callstring = callstring.replace(
                    '[filename]', '{}{}[{}]'.format(inname, ext, i))
                callstring = callstring.replace(
                    '[tmppath]', '{}{}-%d.{}'.format(path2, inname,
                                                     convertparams['format']))
                logger.debug('run image conversion with {}'.format(callstring))
                subprocess.check_output(callstring,
                                        stderr=subprocess.STDOUT,
                                        shell=True)

                if i > -1:
                    im = Image.open('{}{}-{}.{}'.format(
                        path2, inname, i, convertparams['format']))
                    w, h = im.size
                    # remove header line = 1/4 of quality
                    if Settings.get('convert.crop' == 'True'):
                        im.crop((0, 100, w, h - 100)).save(
                            '{}{}-{}.{}'.format(path2, inname, i,
                                                convertparams['format']),
                            convertparams['format'].upper())
                i += 1
                t = time.time() - stime
                if ext[1:] in ['jpg', 'jpeg', 'tif', 'tiff',
                               'png']:  # tif and jpg with only one page
                    break

            except:
                break
        return i, t
Esempio n. 25
0
    def updateSchedules(self, reference=0):
        """
        set scheduler events for current alarm:

        * autoclose
        * autoarchive

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

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

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

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

        * autoclose
        * autoarchive

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

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

        # 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))
Esempio n. 27
0
    def addParameters(self, **kwargs):
        """
        choose implementation of weather channel

        :param kwargs:
        :return: list of parameters, weather dict added
        """
        if kwargs.get('message', {
                'weather.type': Settings.get('messages.weather.type', '')
        }).get('weather.type') in ['', 'yahoo']:
            return self._addParametersYahoo(**kwargs)
        else:
            return self._addParametersOWM(**kwargs)
Esempio n. 28
0
    def type(self):
        """
        Get message type as MessageType class object

        :return: :py:class:`emonitor.modules.messages.messagetype.MessageType`
        """
        if self._type == '':
            self._type = Settings.get('messages.base.type')
        impl = filter(lambda x: x[0].split('.')[0] == self._type,
                      MessageType.getMessageTypes())
        if len(impl) == 1:
            return impl[0][1]
        return None
    def addParameters(self, **kwargs):
        """
        Add special parameters for text widget *messages.text.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get('template')  # todo: define templates
        else:
            content = Settings.get('messages.text.content')
            template = ""  # todo define templates

        kwargs.update({'content': content, 'template': template})
        self.params = kwargs
Esempio n. 30
0
 def updateAdminSubNavigation(self):
     """
     Add submenu entries for admin area
     """
     from sqlalchemy.exc import OperationalError
     self.adminsubnavigation = []
     try:
         for maptype in Settings.get('mapitemdefinition'):
             self.adminsubnavigation.append(
                 ('/admin/mapitems/%s' % maptype['name'],
                  '%s' % maptype['name']))
     except OperationalError:
         pass
     self.adminsubnavigation.append(
         ('/admin/mapitems/definition', 'mapitems.definition'))
Esempio n. 31
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for text widget *messages.text.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get('template')  # todo: define templates
        else:
            content = Settings.get('messages.text.content')
            template = ""  # todo define templates

        mimetypes.init()
        dep = Department.getDefaultDepartment()
        kwargs.update(content=content, template=template, crest=dep.getLogoStream(), mime=mimetypes.guess_type(dep.attributes.get('logo', ''))[0])
        self.params = kwargs
Esempio n. 32
0
    def msg_start(bot, update, **kwargs):
        """
        send start message and add user id to emonitor user if found
        :param bot:
        :param update:
        :param kwargs:
        """
        for person in TelegramBot.users.getPersons():
            if person.firstname == update.message.from_user['first_name'] and person.lastname == update.message.from_user['last_name']:
                TelegramBot.logger.info('add telegramid {} to user {} {}'.format(update.message.from_user['id'], person.firstname, person.lastname))
                _additional = person.options
                _additional['telegramid'] = update.message.from_user['id']
                person._options = yaml.safe_dump(_additional, encoding='utf-8')
                db.session.commit()

        msgtext = Settings.get('telegramsettings')['welcomemsg'] or babel.gettext('telegram.default.welcomemsg')
        bot.sendMessage(update.message.chat_id, text=msgtext.format(vorname=update.message.from_user.first_name, nachname=update.message.from_user.last_name))
        TelegramBot.logger.info('send message from "msg_start" to {} {}'.format(update.message.from_user.first_name, update.message.from_user.last_name))
Esempio n. 33
0
 def getCallString(self, pdffilename="", **params):  # get formated callstring
     from emonitor import app
     callstring = Settings.get('printer.callstring')
     callstring = callstring.replace('[basepath]', app.config.get('PROJECT_ROOT'))
     if self.printer == '<default>':  # use default printer
         callstring = callstring.replace('-printer [printer]', '')
     else:
         if 'printer' in params:
             callstring = callstring.replace('[printer]', '"{}"'.format(params['printer']))
         else:
             callstring = callstring.replace('[printer]', '"{}"'.format(self.printer))
     try:
         if 'copies' in params:
             callstring = callstring.replace('[copies]', "{}".format(params['copies']))
         else:
             callstring = callstring.replace('[copies]', self.settings[0])
     except IndexError:
         callstring = callstring.replace('[copies]', '1')
     callstring = callstring.replace('[filename]', pdffilename)
     return callstring
Esempio n. 34
0
    def addParameters(self, **kwargs):
        """
        Add special parameters for text widget *messages.text.\**
        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            content = kwargs['message'].get('content')
            template = kwargs['message'].get(
                'template')  # todo: define templates
        else:
            content = Settings.get('messages.text.content')
            template = ""  # todo define templates

        mimetypes.init()
        dep = Department.getDefaultDepartment()
        kwargs.update(content=content,
                      template=template,
                      crest=dep.getLogoStream(),
                      mime=mimetypes.guess_type(dep.attributes['logo'])[0])
        self.params = kwargs
Esempio n. 35
0
    def convertFileType(path, inname):
        from emonitor import app
        i = t = 0
        params = Ocr.getOCRParams()
        convertparams = Ocr.getConvertParams()
        
        ext = os.path.splitext(inname)[-1]
        inname = os.path.splitext(inname)[0]

        if ext[1:] not in params['inputformat']:
            return 0, 0.0
        
        path2 = app.config.get('PATH_TMP')
        if "/" in inname or "\\" in inname or ":" in inname:
            path = path2 = ""

        while 1:
            try:
                stime = time.time()
                callstring = convertparams['callstring']
                callstring = callstring.replace('[basepath]', app.config.get('PROJECT_ROOT'))
                callstring = callstring.replace('[incomepath]', path)
                callstring = callstring.replace('[filename]', '{}{}[{}]'.format(inname, ext, i))
                callstring = callstring.replace('[tmppath]', '{}{}-%d.{}'.format(path2, inname, convertparams['format']))
                logger.debug('run image conversion with {}'.format(callstring))
                subprocess.check_output(callstring, stderr=subprocess.STDOUT, shell=True)

                if i > -1:
                    im = Image.open('{}{}-{}.{}'.format(path2, inname, i, convertparams['format']))
                    w, h = im.size
                    # remove header line = 1/4 of quality
                    if Settings.get('convert.crop' == 'True'):
                        im.crop((0, 100, w, h - 100)).save('{}{}-{}.{}'.format(path2, inname, i, convertparams['format']), convertparams['format'].upper())
                i += 1
                t = time.time() - stime
                if ext[1:] in ['jpg', 'jpeg', 'tif', 'tiff', 'png']:  # tif and jpg with only one page
                    break
                    
            except:
                break
        return i, t
Esempio n. 36
0
def getFrontendContent(**params):
    """
    Deliver frontend content of module alarms

    :return: data of alarms
    """
    from emonitor.extensions import monitorserver

    if 'alarmfilter' not in session:
        session['alarmfilter'] = '7'
    if request.args.get('alarmfilter'):  # filter for alarms last x days, -1 no filter set
        session['alarmfilter'] = request.args.get('alarmfilter', '7')

    if 'area' in request.args:
        params['area'] = request.args.get('area')
    if 'state' in request.args:
        params['activeacc'] = request.args.get('state')

    if request.form.get('action') == 'updatealarm':
        if request.form.get('alarm_id') != 'None':  # update alarm
            alarm = Alarm.getAlarms(request.form.get('alarm_id'))
        else:  # create new alarm
            d = datetime.datetime.strptime('%s %s' % (request.form.get('edit_timestamp_date'), request.form.get('edit_timestamp_time')), "%d.%m.%Y %H:%M:%S")
            alarm = Alarm(d, request.form.get('edit_keyid'), 2, 0)
            db.session.add(alarm)
            params['activeacc'] = 1
        try:
            alarm.timestamp = datetime.datetime.strptime('%s %s' % (request.form.get('edit_timestamp_date'), request.form.get('edit_timestamp_time')), "%d.%m.%Y %H:%M:%S")
        except ValueError:
            alarm.timestamp = datetime.datetime.now()
        alarm._key = request.form.get('edit_key')

        alarm.set(u'id.key', request.form.get('edit_keyid'))
        alarm.set(u'k.cars1', request.form.get('val_cars1'))
        alarm.set(u'k.cars2', request.form.get('val_cars2'))
        alarm.set(u'k.material', request.form.get('val_material'))

        alarm.set(u'marker', request.form.get('marker'))
        alarm.set(u'id.city', request.form.get('edit_city'))
        _city = City.getCities(id=request.form.get('edit_cityname'))
        if _city:
            alarm.set(u'city', _city.name)
        else:
            alarm.set(u'city', request.form.get('edit_cityname'))

        alarm.set(u'streetno', request.form.get('edit_streetno'))
        street = Street.getStreets(id=request.form.get('edit_addressid'))
        hnumber = None
        if street:
            alarm.set(u'id.address', street.id)
            try:
                hnumber = [h for h in street.housenumbers if h.number == request.form.get('edit_streetno').split()[0]]
                if len(hnumber) > 0:
                    alarm.set(u'lat', hnumber[0].points[0][0])
                    alarm.set(u'lng', hnumber[0].points[0][1])
            except IndexError:
                pass
        elif request.form.get('edit_addressid') == 'None':
            alarm.set(u'id.address', '')
        else:
            alarm.set(u'id.address', request.form.get('edit_addressid'))
        alarm.set(u'address', request.form.get('edit_address'))
        if request.form.get('edit_object') != '0':
            alarm.set(u'id.object', request.form.get('edit_object'))
        else:  # remove object definition if present
            if u'id.object' in alarm.attributes:
                del alarm.attributes[u'id.object']
            if u'object' in alarm.attributes:
                del alarm.attributes[u'object']
        alarm.set(u'priority', request.form.get('edit_priority'))
        alarm.set(u'remark', request.form.get('edit_remark'))
        alarm.set(u'person', request.form.get('edit_person'))

        if request.form.get(u'edit_address2').strip() != '':
            alarm.set(u'address2', request.form.get('edit_address2'))

        if (request.form.get(u'marker') == '1' and not hnumber) or request.form.get('update_position') == '1':
            alarm.set(u'routing', '')
            alarm.set(u'lat', request.form.get('lat'))
            alarm.set(u'lng', request.form.get('lng'))
            alarm.set(u'zoom', request.form.get('zoom'))
        try:
            d = datetime.datetime.strptime('%s %s' % (request.form.get('edit_endtimestamp_date'), request.form.get('edit_endtimestamp_time')), "%d.%m.%Y %H:%M:%S")
        except ValueError:
            d = datetime.datetime.now()
        alarm.set(u'endtimestamp', d)
        db.session.commit()
        signal.send('alarm', 'updated', alarmid=alarm.id)
        if request.form.get('alarm_id') == u'None':  # create new
            Alarm.changeState(alarm.id, 0)  # prepare alarm
            return redirect('/alarms?area=%s&state=1' % params['area'])
        elif alarm.state == 1:  # active alarm update
            monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
        return redirect('/alarms?area=%s&state=0' % params['area'])

    elif request.args.get('action') == 'editalarm':
        if request.args.get('alarmid', '0') == '0':  # add new alarm
            alarm = Alarm(datetime.datetime.now(), '', 2, 0)
            #flash(babel.gettext(u'alarms.alarmadded'), 'alarms.add')
        else:  # edit alarm
            alarm = Alarm.getAlarms(id=request.args.get('alarmid'))
        return render_template('frontend.alarms_edit.html', alarm=alarm, cities=City.getCities(), objects=AlarmObject.getAlarmObjects(), cars=Car.getCars(), departments=Department.getDepartments(), frontendarea=params['area'], frontendmodules=frontend.modules, frontendmoduledef=Settings.get('frontend.default'))

    elif request.args.get('action') == 'refresh':  # refresh alarm section
        params['area'] = request.args.get('area')
        params['activeacc'] = int(request.args.get('activeacc'))

    elif request.args.get('action') == 'finishalarm':  # finish selected alarm
        Alarm.changeState(int(request.args.get('alarmid')), 2)
        params['area'] = request.args.get('area')

    elif request.args.get('action') == 'activatealarm':  # activate selected alarm
        ret = Alarm.changeState(int(request.args.get('alarmid')), 1)
        if len(ret) > 0:
            flash(render_template_string("{{ _('alarms.carsinuse') }}</br><b>" + ", ".join([r.name for r in sorted(ret, key=attrgetter('name'))]) + "</b>"), 'alarms')
        params['area'] = request.args.get('area')
        params['activeacc'] = 0

    elif request.args.get('action') == 'deletealarm':  # delete selected alarm
        alarm = Alarm.getAlarms(id=request.args.get('alarmid'))
        refresh = 1 or alarm.state == 1  # check if alarm is active
        try:
            # delete file if not used in any other alarm
            c = Alarm.query.filter(Alarm.attributes.any(value=alarm.get('filename'), name="filename")).count()
            if c == 1 and os.path.exists("{}{}".format(current_app.config.get('PATH_DONE'), alarm.get('filename'))):
                os.remove("{}{}".format(current_app.config.get('PATH_DONE'), alarm.get('filename')))
        except:
            pass
        alarm.state = -1
        alarm.updateSchedules()
        db.session.delete(alarm)
        db.session.commit()
        if refresh:
            monitorserver.sendMessage('0', 'reset')  # refresh monitor layout
        signal.send('alarm', 'deleted', alarmid=request.args.get('alarmid'))

    elif request.args.get('action') == 'archivealarm':  # archive selected alarms, id=0 == all
        if ";" in request.args.get('alarmid'):  # archive selected alarms
            for alarmid in request.args.get('alarmid').split(';'):
                Alarm.changeState(int(alarmid), 3)
        elif int(request.args.get('alarmid')) == 0:  # archive all alarms
            Alarm.changeStates(3)
        else:  # archive single selected alarm
            Alarm.changeState(int(request.args.get('alarmid')), 3)
        params['area'] = request.args.get('area')

    stats = dict.fromkeys(Alarm.ALARMSTATES.keys() + ['3'], 0)
    for s, c in Alarm.getAlarmCount(days=int(session['alarmfilter'])):  # s=state, c=count(ids of state)
        if str(s) in stats.keys():
            stats[str(s)] = c

    if 'area' not in params:
        params['area'] = 'center'
    if 'activeacc' not in params:
        params['activeacc'] = 0
    return render_template('frontend.alarms_smallarea.html', alarmstates=Alarm.ALARMSTATES, stats=stats, frontendarea=params['area'], activeacc=str(params['activeacc']), printdefs=Printers.getActivePrintersOfModule('alarms'), frontendmodules=frontend.modules, frontendmoduledef=Settings.get('frontend.default'), alarmfilter=session['alarmfilter'])
Esempio n. 37
0
            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:
    """
    global BEFORE, AFTER, FILES, ERROR_RAISED

    if OBSERVERACTIVE == 0:
        return
    
    if 'path' in kwargs:
        path = kwargs['path']
Esempio n. 38
0
def getAdminData(self):
    """
    Deliver admin content of module mapitems (ajax)

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

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

        db.session.commit()

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

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

    return ""
Esempio n. 39
0
    def _addParametersYahoo(self, **kwargs):
        """
        Add special parameters for yahoo weather widget *messages.weather.\**
        check https://developer.yahoo.com/yql/console/ for online editor

        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            location = kwargs['message'].attributes['weather.locationid']
            icons = kwargs['message'].attributes['weather.icons']
            forecast = kwargs['message'].attributes['weather.forecast']
        else:
            location = Settings.get('messages.weather.locationid')
            icons = Settings.get('messages.weather.icons')
            forecast = Settings.get('messages.weather.forecast')

        _yahooIcons = [[], ['31', '32', '33', '34', '44'], ['36'], ['21'],
                       ['22'], ['26', '27', '28', '29', '30'],
                       ['9', '11', '12', '37', '38', '40', '45', '47'], [],
                       ['3', '4'], [], [], [],
                       ['13', '14', '15', '16', '41', '42', '43', '46'],
                       ['5', '6', '7', '18', '35'], ['8', '10', '15', '17'],
                       [], ['25'], ['19', '20'], ['0', '1', '2', '23', '24']]

        if not self.lastcall or datetime.datetime.now(
        ) > self.lastcall + datetime.timedelta(hours=1):
            # reload data from web
            yql_url = "https://query.yahooapis.com/v1/public/yql?{}&format=json".format(
                urllib.urlencode({
                    'q':
                    u'select * from weather.forecast where woeid = {} and u="c"'
                    .format(location).encode('utf-8')
                }))

            try:
                result = urllib2.urlopen(yql_url).read()
                d = json.loads(result)
                d = flatten(
                    d.get('query', {
                        'results': {}
                    }).get('results', {
                        'channel': {}
                    }).get('channel'))
            except urllib2.URLError:
                import exceptions
                raise exceptions.IOError

            self.data.set('conditioncode', d.get('item_condition_code', ''))
            self.data.set(
                'conditionicon',
                getIcon4Code(d.get('item_condition_code', 0), _yahooIcons))
            self.data.set(
                'conditioncss',
                "wi wi-yahoo-{}".format(d.get('item_condition_code', '0')))

            self.data.set('condition', d.get('item_condition_text', ''))
            self.data.set('temperature', d.get('item_condition_temp', ''))

            for fcast in d.get('item_forecast', []):
                fcast['date'] = datetime.datetime.strptime(
                    fcast.get('date'), "%d %b %Y")
                fcast['iconclass'] = "wi-yahoo-{}".format(fcast.get('code', 0))
                self.data.weather['forecast'].append(fcast)

            self.data.set('temperatureunit', d.get('units_temperature', ''))

            self.data.set('winddirection', int(d.get('wind_direction', '0')))
            self.data.set('windspeed', d.get('wind_speed', 0))
            self.data.set('windunit', d.get('units_speed', 'km/h'))
            self.data.set('humidity', d.get('atmosphere_humidity', ''))
            if d.get('atmosphere_pressure',
                     0) < 2000:  # fix error in pressure of webservice
                self.data.set('pressure', d.get('atmosphere_pressure', ''))
            self.data.set(
                'sunrise',
                datetime.datetime(*time.strptime(
                    d.get('astronomy_sunrise', time.time()).upper(),
                    "%I:%M %p")[:6]))
            self.data.set(
                'sunset',
                datetime.datetime(*time.strptime(
                    d.get('astronomy_sunset', time.time()).upper(), "%I:%M %p")
                                  [:6]))
            self.data.set('location', d.get('location_city', ''))
            self.data.set('builddate', datetime.datetime.now())

        kwargs.update({
            'location': location,
            'icons': icons,
            'forecast': forecast,
            'data': self.data
        })
        self.params = kwargs
        return kwargs
Esempio n. 40
0
def configure_extensions(app):
    """
    Confgure all extensions with current app object

    :param app: :py:class:`Flask`
    """
    # alembic
    alembic.init_app(app)

    # flask-sqlalchemy
    db.init_app(app)
    db.app = app
    db.create_all()

    with app.app_context():
        _dbversion = alembic.migration_context.get_current_heads()
        if len(_dbversion) > 0 and _dbversion[0] != current_app.config.get(
                'DB_VERSION'):  # update version
            try:
                alembic.upgrade(current_app.config.get('DB_VERSION'))
            except (alembicutil.CommandError, OperationalError):
                pass
        db.reflect()  # check init
        db.create_all()
        try:
            alembic.stamp()  # set stamp to latest version
        except:
            pass

    # babel
    babel.init_app(app)

    # flask-cache
    cache.init_app(app)

    # signals
    signal.init_app(app)

    # events
    events.init_app(app)
    events.addEvent('default', handlers=[], parameters=[])

    # scheduler
    if not scheduler.running:
        scheduler.start()
    scheduler.initJobs(app)

    # monitorserver
    monitorserver.init_app(app)
    monitorserver.sendMessage('0', 'reset')

    # printers
    printers.init_app(app)

    # flask-login
    login_manager.login_view = 'login.loginform'
    login_manager.login_message = "admin.login.needed"
    login_manager.unauthorized_handler = "frontend.login_page"
    login_manager.init_app(app)

    # jinja2 filters
    from utils import getmarkdown, getreStructuredText, getJavaSafe
    app.jinja_env.filters['markdown'] = getmarkdown
    app.jinja_env.filters['rst'] = getreStructuredText
    app.jinja_env.filters['javasafe'] = getJavaSafe

    # user
    if User.query.count() == 0:
        User.getUsers(1)

    @login_manager.user_loader
    def load_user(id):
        return User.getUsers(userid=id)

    # communication
    communication.init_app(app)

    # add global elements
    from emonitor.scheduler import eMonitorIntervalTrigger
    from emonitor.modules.settings.settings import Settings
    from emonitor.observer import observeFolder, OBSERVERTYPE
    try:
        _jping = scheduler.add_job(
            monitorserver.getClients,
            trigger=eMonitorIntervalTrigger(minutes=int(
                Settings.get('monitorping', app.config.get('MONITORPING',
                                                           2)))),
            name='monitorping')
    except:
        _jping = scheduler.add_job(
            monitorserver.getClients,
            trigger=eMonitorIntervalTrigger(
                minutes=int(app.config.get('MONITORPING', 2))),
            name='monitorping')

    if str(Settings.get('monitorping', app.config.get('MONITORPING'))) == '0':
        _jping.pause()

    try:
        if OBSERVERTYPE == "watchdog":
            _jobserver = scheduler.add_job(observeFolder,
                                           kwargs={
                                               'path':
                                               app.config.get(
                                                   'PATH_INCOME',
                                                   app.config.get('PATH_DATA'))
                                           },
                                           name='observerinterval')
        else:
            _jobserver = scheduler.add_job(
                observeFolder,
                trigger=eMonitorIntervalTrigger(seconds=int(
                    Settings.get('observer.interval',
                                 app.config.get('OBSERVERINTERVAL', 2)))),
                kwargs={
                    'path':
                    app.config.get('PATH_INCOME', app.config.get('PATH_DATA'))
                },
                name='observerinterval')
    except ValueError:
        _jobserver = scheduler.add_job(
            observeFolder,
            trigger=eMonitorIntervalTrigger(
                seconds=int(app.config.get('OBSERVERINTERVAL', 2))),
            kwargs={
                'path': app.config.get('PATH_INCOME',
                                       app.config.get('PATH_DATA'))
            },
            name='observerinterval')
    if str(
            Settings.get('observer.interval',
                         app.config.get('OBSERVERINTERVAL'))) == '0':
        _jobserver.pause()
    if str(
            Settings.get('observer.interval',
                         app.config.get('OBSERVERINTERVAL'))) == '0':
        _jobserver.pause()
def getAdminContent(self, **params):
    module = request.view_args['module'].split('/')

    if len(module) < 2:
        module.append(u'1')

    if len(module) > 2 and module[2] == 'upload':  # upload persons
        params.update({'': int(module[1]), 'depid': module[1]})
        return render_template('admin.persons.upload.html', **params)

    if request.method == 'POST':
        if request.form.get('action') == 'createperson':  # add person
            params.update({'person': Person('', '', '', '', '', '', False, datetime.now(), '', int(module[1])), 'settings': Settings.get('persons.settings')})
            return render_template('admin.persons_edit.html', **params)

        elif request.form.get('action').startswith('editperson_'):  # edit person
            params.update({'person': Person.getPersons(id=request.form.get('action').split('_')[-1]), 'settings': Settings.get('persons.settings')})
            return render_template('admin.persons_edit.html', **params)

        elif request.form.get('action') == 'updateperson':  # save person
            if request.form.get('person_id') != 'None':
                person = Person.getPersons(id=request.form.get('person_id'))
            else:
                person = Person('', '', '', '', '', '', False, datetime.now(), '', int(module[1]))
                db.session.add(person)

            person.firstname = request.form.get('firstname')
            person.lastname = request.form.get('lastname')
            person.salutation = request.form.get('salutation')
            person.grade = request.form.get('grade')
            person._dept = int(request.form.get('dept'))
            person.position = request.form.get('position')
            person.active = 'active' in request.form.keys()
            try:
                person.birthdate = datetime.strptime('{} 00:00:00'.format(request.form.get('birthdate')), "%d.%m.%Y %H:%M:%S")
            except ValueError:
                pass
            person.identifier = request.form.get('identifier')
            person.remark = request.form.get('remark')
            db.session.commit()

        elif request.form.get('action').startswith('deleteperson_'):
            db.session.delete(Person.getPersons(id=request.form.get('action').split('_')[-1]))
            db.session.commit()

        elif request.form.get('action') == 'updategrades':
            grades = request.form.getlist('grade')
            while grades[-1] == grades[-2] == u"":  # remove last empty entries
                grades = grades[:-2]
            _settings = Settings.get('persons.settings')
            if 'positions' not in _settings.keys():
                _settings['positions'] = []
            _settings['grades'] = zip(*[grades[i::2] for i in range(2)])
            Settings.set('persons.settings', _settings)
            db.session.commit()

        elif request.form.get('action') == 'updatepositions':
            _settings = Settings.get('persons.settings')
            if 'grades' not in _settings.keys():
                _settings['grades'] = []
            _settings['positions'] = request.form.get('positions').replace('\r', '').split('\n')
            Settings.set('persons.settings', _settings)
            db.session.commit()

    if int(module[1]) == 0:
        params.update({'settings': Settings.get('persons.settings')})
        return render_template("admin.persons.settings.html", **params)
    persons = Person.getPersons(dept=int(module[1]))
    chars = {}
    for p in persons:
        chars[p.fullname[0].upper()] = 0
    params.update({'persons': persons, 'chars': sorted(chars), 'depid': module[1]})
    return render_template("admin.persons.html", **params)
Esempio n. 42
0
def getAdminContent(self, **params):
    """
    Deliver admin content of module streets

    :param params: use given parameters of request
    :return: rendered template as string
    """
    module = request.view_args['module'].split('/')
    if len(module) < 2:
        if City.getDefaultCity():
            module.append(u'{}'.format(City.getDefaultCity().id))
        else:
            module.append(u'1')

    if len(module) == 2:  # cities
        if module[1] == '0':  # city list

            if request.method == 'POST':

                if request.form.get('action').startswith('detailcity_'):  # edit city
                    params.update({'city': City.getCities(id=request.form.get('action').split('_')[-1]), 'departments': Department.getDepartments(), 'maps': Map.getMaps()})
                    return render_template('admin.streets.city_edit.html', **params)

                elif request.form.get('action') == 'updatecity':  # update existing city
                    if request.form.get('city_id') != 'None':  # update city
                        city = City.getCities(id=request.form.get('city_id'))
                        city.name = request.form.get('cityname')
                        city.subcity = request.form.get('subcity')
                        city._dept = request.form.get('department')
                        city.mapname = request.form.get('citymap')
                        city.color = request.form.get('colorname')
                        city.default = request.form.get('citydefault')
                        city.osmid = request.form.get('osmid')
                        city.osmname = request.form.get('osmname')

                    else:  # add city
                        city = City(request.form.get('cityname'), request.form.get('department'),
                                    request.form.get('citymap'), request.form.get('citydefault'),
                                    request.form.get('subcity'), request.form.get('colorname'),
                                    request.form.get('osmid'), request.form.get('osmname'))
                        db.session.add(city)

                    db.session.commit()
                    cache.clear()

                elif request.form.get('action') == 'createcity':  # add city
                    params.update({'city': City('', '', '', '', '', '', 0, ''), 'departments': Department.getDepartments(), 'maps': Map.getMaps()})
                    return render_template('admin.streets.city_edit.html', **params)

                elif request.form.get('action').startswith('deletecity_'):  # delete city
                    db.session.delete(City.getCities(id=request.form.get('action').split('_')[-1]))
                    db.session.commit()
                self.updateAdminSubNavigation()
                cache.clear()

            params.update({'cities': City.getCities()})
            return render_template('admin.streets.city_list.html', **params)

        else:  # show city details
            if request.method == 'POST':
                if request.form.get('action').startswith('detailstreet_'):  # edit street
                    tileserver = {'lat': Settings.get('defaultLat'),
                                  'lng': Settings.get('defaultLng'),
                                  'zoom': Settings.get('defaultZoom'),
                                  'map': Map.getDefaultMap()}
                    params.update({'street': Street.getStreets(id=request.form.get('action').split('_')[-1]), 'cities': City.getCities(), 'maps': Map.getMaps(), 'tileserver': tileserver})
                    return render_template('admin.streets_edit.html', **params)

                elif request.form.get('action') == 'createstreet':  # add street
                    tileserver = {'lat': Settings.get('defaultLat'),
                                  'lng': Settings.get('defaultLng'),
                                  'zoom': Settings.get('defaultZoom'),
                                  'map': Map.getDefaultMap()}

                    params.update({'street': Street('', '', int(module[1]), '', '', '', '', '', ''), 'cities': City.getCities(), 'maps': Map.getMaps(), 'tileserver': tileserver})
                    return render_template('admin.streets_edit.html', **params)

                elif request.form.get('action').startswith('deletestreets_'):  # delete street
                    db.session.delete(Street.getStreets(id=request.form.get('action').split('_')[-1]))
                    db.session.commit()
                    cache.clear()

                elif request.form.get('action') == 'savestreet':  # save street
                    if request.form.get('street_id') != 'None':  # update existing street
                        street = Street.getStreets(id=request.form.get('street_id'))
                        street.name = request.form.get('edit_name')
                        street.navigation = request.form.get('edit_navigation')
                        c = request.form.get('edit_cityid').split('_')
                        if len(c) < 2:
                            c.append('')
                        street.cityid = c[0]
                        street.subcity = c[1]
                        street.lat = request.form.get('edit_lat')
                        street.lng = request.form.get('edit_lng')
                        street.zoom = request.form.get('edit_zoom')
                        street.active = request.form.get('edit_active')
                        db.session.commit()
                        #cache.delete_memoized(City.streets)

                    else:  # add street
                        c = request.form.get('edit_cityid').split('_')
                        if len(c) < 2:
                            c.append('')  # subcity
                        city = [ct for ct in City.getCities() if str(ct.id) == c[0]][0]
                        city.addStreet(Street(request.form.get('edit_name'), request.form.get('edit_navigation'), int(c[0]), c[1], request.form.get('edit_lat'), request.form.get('edit_lng'), request.form.get('edit_zoom'), request.form.get('edit_active'), ''))
                        db.session.commit()
                    cache.clear()

            try:
                streets = Street.getStreets(cityid=module[-1])
            except AttributeError:
                streets = []
            chars = {}
            for s in streets:
                chars[s.name[0].upper()] = 0
            params.update({'streets': streets, 'chars': sorted(chars.keys()), 'city': City.getCities(id=module[-1])})
            return render_template('admin.streets.html', **params)

    return "streets"
Esempio n. 43
0
def configure_extensions(app):
    """
    Confgure all extensions with current app object

    :param app: :py:class:`Flask`
    """
    # alembic
    alembic.init_app(app)

    # flask-sqlalchemy
    db.init_app(app)
    db.app = app
    db.create_all()

    with app.app_context():
        if alembic.context.get_current_revision() != current_app.config.get('DB_VERSION'):  # update version
            try:
                alembic.upgrade(current_app.config.get('DB_VERSION'))
            except (alembicutil.CommandError, OperationalError):
                pass
        db.reflect()  # check init
        db.create_all()
        try:
            alembic.stamp()  # set stamp to latest version
        except:
            pass

    # babel
    babel.init_app(app)

    # flask-cache
    cache.init_app(app)

    # signals
    signal.init_app(app)

    # events
    events.init_app(app)
    events.addEvent('default', handlers=[], parameters=[])

    # scheduler
    if not scheduler.running:
        scheduler.start()
    scheduler.initJobs(app)

    # monitorserver
    monitorserver.init_app(app)
    monitorserver.sendMessage('0', 'reset')

    # printers
    printers.init_app(app)
    
    # flask-login
    login_manager.login_view = 'login.loginform'
    login_manager.login_message = "admin.login.needed"
    login_manager.unauthorized_handler = "frontend.login_page"
    login_manager.init_app(app)

    # jinja2 filters
    from utils import getmarkdown, getreStructuredText, getJavaSafe
    app.jinja_env.filters['markdown'] = getmarkdown
    app.jinja_env.filters['rst'] = getreStructuredText
    app.jinja_env.filters['javasafe'] = getJavaSafe

    # user
    if User.query.count() == 0:
        User.getUsers(1)
    
    @login_manager.user_loader
    def load_user(id):
        return User.getUsers(userid=id)

    # communication
    communication.init_app(app)

    # add global elements
    from emonitor.scheduler import eMonitorIntervalTrigger
    from emonitor.modules.settings.settings import Settings
    from emonitor.observer import observeFolder, OBSERVERTYPE
    try:
        _jping = scheduler.add_job(monitorserver.getClients, trigger=eMonitorIntervalTrigger(minutes=int(Settings.get('monitorping', app.config.get('MONITORPING', 2)))), name='monitorping')
    except:
        _jping = scheduler.add_job(monitorserver.getClients, trigger=eMonitorIntervalTrigger(minutes=int(app.config.get('MONITORPING', 2))), name='monitorping')

    if str(Settings.get('monitorping', app.config.get('MONITORPING'))) == '0':
        _jping.pause()

    try:
        if OBSERVERTYPE == "watchdog":
            _jobserver = scheduler.add_job(observeFolder, kwargs={'path': app.config.get('PATH_INCOME', app.config.get('PATH_DATA'))}, name='observerinterval')
        else:
            _jobserver = scheduler.add_job(observeFolder, trigger=eMonitorIntervalTrigger(seconds=int(Settings.get('observer.interval', app.config.get('OBSERVERINTERVAL', 2)))), kwargs={'path': app.config.get('PATH_INCOME', app.config.get('PATH_DATA'))}, name='observerinterval')
    except ValueError:
        _jobserver = scheduler.add_job(observeFolder, trigger=eMonitorIntervalTrigger(seconds=int(app.config.get('OBSERVERINTERVAL', 2))), kwargs={'path': app.config.get('PATH_INCOME', app.config.get('PATH_DATA'))}, name='observerinterval')
    if str(Settings.get('observer.interval', app.config.get('OBSERVERINTERVAL'))) == '0':
        _jobserver.pause()
    if str(Settings.get('observer.interval', app.config.get('OBSERVERINTERVAL'))) == '0':
        _jobserver.pause()
Esempio n. 44
0
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)
Esempio n. 45
0
 def getVariables():
     return Settings.get('alarms.evalfields').split('\r\n')
Esempio n. 46
0
 def getMapItemDefinitions(self):
     return Settings.get('mapitemdefinition')
Esempio n. 47
0
def getFrontendData(self):
    """
    Deliver frontend content of module streets (ajax)

    :return: rendered template as string or json dict
    """
    if request.args.get(
            'action'
    ) == 'streetcoords':  # get map parameter for given streetid

        if request.args.get('id') not in ['', 'None']:
            street = Street.getStreets(id=request.args.get('id'))
            return {
                'lat': street.lat,
                'lng': street.lng,
                'zoom': street.zoom,
                'way': street.navigation,
                'cityid': street.cityid,
                'cityname': street.city.name
            }

    elif request.args.get(
            'action') == 'housecoords':  # deliver center of housenumbers
        if request.args.get('streetid') != '' and request.args.get(
                'housenumber') != '':
            street = Street.getStreet(id=request.args.get('streetid'))
            hnumber = street.getHouseNumber(
                number=request.args.get('housenumber').split()[0])
            if hnumber:
                return hnumber.getPosition(0)

            return {'lat': street.lat, 'lng': street.lng}
        return {}

    elif request.args.get('action') == 'defaultposition':

        return {
            'defaultlat': float(Settings.get('defaultLat')),
            'defaultlng': float(Settings.get('defaultLng')),
            'defaultzoom': int(Settings.get('defaultZoom'))
        }

    elif request.args.get('action') == 'alarmposition':
        alarm = Alarm.getAlarms(id=request.args.get('alarmid'))
        if alarm:
            return {
                'id': request.args.get('alarmid'),
                'alarmlat': alarm.lat,
                'alarmlng': alarm.lng,
                'alarmzoom': alarm.zoom,
                'marker': alarm.marker,
                'alarmprio': alarm.priority,
                'alarmstreet': alarm.street.name,
                'alarmstreetno': alarm.get('streetno'),
                'alarmstreet2': alarm.get('address2'),
                'alarmcity': alarm.city.name,
                'alarmsubcity': alarm.street.subcity
            }
        else:
            return {'id': '0'}

    elif request.args.get('action') == 'streetslookup':
        streets = {}
        cities = {}
        for c in City.getCities():
            cities[c.id] = c.name
            for k, street in c.streets.iteritems():
                if street.active:
                    try:
                        streets[str(
                            street.id)] = '%s (%s)' % (street.name, c.name)
                    except:
                        streets[str(street.id)] = '%s (-%s-)' % (street.name,
                                                                 street.cityid)
        return streets

    elif request.args.get('action') == 'defaultmap':
        dmap = Map.getDefaultMap()
        return {'tileserver': dmap.tileserver, 'name': dmap.name}

    return ""
Esempio n. 48
0
    def _addParametersOWM(self, **kwargs):
        """
        Add special parameters for open-weather-map weather widget *messages.weather.\**
        check https://www.openweathermap.org/ for online help

        weather conditions: https://www.openweathermap.org/weather-conditions

        :param kwargs: list of parameters for update
        """
        if 'message' in kwargs:
            location = kwargs['message'].attributes['weather.locationid']
            icons = kwargs['message'].attributes['weather.icons']
            forecast = kwargs['message'].attributes['weather.forecast']
        else:
            location = Settings.get('messages.weather.locationid')
            icons = Settings.get('messages.weather.icons')
            forecast = Settings.get('messages.weather.forecast')
        _owmIcons = [[], [
            800,
        ], [
            904,
        ], [
            905,
        ], [711, 801], [804, 771, 802, 803],
                     [
                         310, 313, 520, 521, 522, 701, 602, 300, 301, 321, 500,
                         531, 901, 210, 211, 212, 221
                     ], [302, 311, 312, 314, 501, 502, 503, 504],
                     [200, 201, 202, 230, 231, 232], [], [], [],
                     [600, 601, 621, 622], [511, 611, 612, 615, 616, 620],
                     [
                         906,
                     ], [], [
                         903,
                     ], [731, 761, 762, 721, 741],
                     [900, 781, 901, 902,
                      957]]  # weather code mapping for png icons

        url_weather = "http://api.openweathermap.org/data/2.5/weather?id={}&units=metric&lang={}&APPID={}".format(
            location,
            current_app.config.get('LANGUAGES').keys()[0],
            Settings.get('messages.weather.owmkey', ''))
        url_forecast = "http://api.openweathermap.org/data/2.5/forecast?id={}&units=metric&lang={}&APPID={}".format(
            location,
            current_app.config.get('LANGUAGES').keys()[0],
            Settings.get('messages.weather.owmkey', ''))

        try:
            d = flatten(json.loads(urllib2.urlopen(url_weather).read()))
            f = flatten(json.loads(urllib2.urlopen(url_forecast).read()))
        except:
            import exceptions
            raise exceptions.IOError

        self.data.set(
            'condition',
            d.get('weather', [{
                'description': ''
            }])[0]['description'])
        self.data.set(
            'conditionicon',
            getIcon4Code(
                d.get('weather', [{
                    'id': '01'
                }])[0].get('id'), _owmIcons))
        self.data.set(
            'conditioncss', "wi wi-owm-{}".format(
                d.get('weather', [{
                    'id': '01'
                }])[0].get('id')))
        self.data.set('temperature', d.get('main_temp', 0))

        self.data.set('forecast', [])

        _ld = ""
        for fcast in f.get('list', []):
            _day = datetime.datetime(*time.gmtime(fcast.get('dt', 0))[:6])
            if datetime.date.today() == _day.date():
                continue

            if _ld != _day.strftime('%Y%m%d'):
                self.data.weather['forecast'].append({
                    'date':
                    _day,
                    'low':
                    fcast.get('main', {'temp_min': 0})['temp_min'],
                    'high':
                    fcast.get('main', {'temp_max': 0})['temp_max'],
                    'pressure':
                    fcast.get('main', {'pressure': 0})['pressure'],
                    'description':
                    '',
                    'code':
                    '',
                    'windspeed':
                    0,
                    'winddegree':
                    0
                })
                _ld = _day.strftime('%Y%m%d')

            if self.data.weather.get('forecast')[-1].get('low') > fcast.get(
                    'main', {'temp_min': 0})['temp_min']:
                self.data.weather.get('forecast')[-1].update(
                    {'low': fcast.get('main', {'temp_min': 0})['temp_min']})

            if self.data.weather.get('forecast')[-1].get('high') < fcast.get(
                    'main', {'temp_max': 0})['temp_max']:
                self.data.weather.get('forecast')[-1].update(
                    {'high': fcast.get('main', {'temp_max': 0})['temp_max']})

            if self.data.weather.get('forecast')[-1].get(
                    'windspeed') < fcast.get('wind', {
                        'speed': 0
                    }).get('speed'):
                self.data.weather.get('forecast')[-1].update(
                    {'windspeed': fcast.get('wind', {'speed': 0})['speed']})
                self.data.weather.get('forecast')[-1].update(
                    {'winddegree': fcast.get('wind', {'deg': 0})['deg']})

            self.data.weather.get('forecast')[-1].update({
                'pressure':
                (self.data.weather.get('forecast')[-1].get('pressure') +
                 fcast.get('main', {'pressure': 0})['pressure']) / 2.0
            })

            if _day.strftime('%H') == "12":
                self.data.weather.get('forecast')[-1].update({
                    'description':
                    fcast.get('weather', {'description': ''})[0]['description']
                })
                self.data.weather.get('forecast')[-1].update(
                    {'code': fcast.get('weather', {'id': ''})[0]['id']})
                self.data.weather.get('forecast')[-1].update({
                    'iconclass':
                    "wi-owm-{}".format(
                        fcast.get('weather', {'id': ''})[0]['id'])
                })

        self.data.set('temperatureunit', 'C')
        self.data.set('winddirection', int(d.get('wind_deg', '0')))
        self.data.set('windspeed', d.get('wind_speed', 0))
        self.data.set('windunit', 'm/s')
        self.data.set('humidity', d.get('main_humidity', ''))
        self.data.set('pressure', d.get('main_pressure', ''))
        self.data.set('clouds', d.get('clouds_all', 0))
        self.data.set(
            'sunrise',
            datetime.datetime(*time.gmtime(d.get('sys_sunrise', 0))[:6]))
        self.data.set(
            'sunset',
            datetime.datetime(*time.gmtime(d.get('sys_sunset', 0))[:6]))
        self.data.set('location', d.get('name', ''))
        self.data.set('builddate', datetime.datetime.now())
        kwargs.update({
            'location': location,
            'icons': icons,
            'forecast': forecast,
            'data': self.data
        })
        self.params = kwargs
        return kwargs
Esempio n. 49
0
def getAdminContent(self, **params):
    """
    Deliver admin content of module mapitems

    :param params: use given parameters of request
    :return: rendered template as string
    """
    module = request.view_args['module'].split('/')
    if len(module) < 2:
        module.append(
            current_app.blueprints['admin'].modules['mapitems'].
            adminsubnavigation[0][0].split('/')[-1])  # get first submenuitem

    if len(module) >= 2:
        if module[1] == 'definition':  # definition
            if request.method == 'POST':

                if request.form.get('action').startswith(
                        'edititemtype_'):  # edit/add definition TODO: fix
                    typename = request.form.get('action').split('_')
                    itemtype = [
                        d for d in Settings.get('mapitemdefinition')
                        if d['name'] == typename[1]
                    ]
                    if len(itemtype) > 0:
                        itemtype = itemtype[0]
                        if 'parameters' not in itemtype:
                            itemtype['parameters'] = {
                                'layout': '',
                                'tileserver': 0
                            }
                        if 'key' not in itemtype:
                            itemtype['key'] = []
                        if 'cities' not in itemtype:
                            itemtype['cities'] = []
                        if 'itemtype' not in itemtype:
                            itemtype['itemtype'] = 'node'
                    else:
                        itemtype = {
                            'name': '',
                            'filter': '',
                            'attributes': [],
                            'parameters': {'layout', 'tileserver'},
                            'key': [],
                            'cities': [],
                            'itemtype': 'node'
                        }
                    params.update({
                        'itemtype': itemtype,
                        'cities': City.getCities(),
                        'layouters': MapItem.getLayouters()
                    })
                    return render_template(
                        'admin.mapitems.definition_actions.html', **params)

                elif request.form.get('action').startswith(
                        'deleteitemtype_'):  # delete definition
                    itemtypes = Settings.get('mapitemdefinition')
                    for itemtype in itemtypes:
                        if itemtype['name'] == request.form.get(
                                'action').split('_')[1]:
                            del itemtypes[itemtypes.index(itemtype)]
                    Settings.set('mapitemdefinition', itemtypes)
                    db.session.commit()

                elif request.form.get(
                        'action') == 'updateitemtypes':  # save definition
                    itemtypes = Settings.get('mapitemdefinition')
                    position = -1
                    for itemtype in itemtypes:
                        if itemtype['name'] == request.form.get('edit_name'):
                            position = itemtypes.index(itemtype)
                            break
                    if position >= 0:  # update type
                        itemtypes[position]['filter'] = request.form.get(
                            'edit_filter')
                        itemtypes[position]['cities'] = [
                            int(i) for i in request.form.getlist('edit_cityid')
                        ]
                        itemtypes[position]['itemtype'] = request.form.get(
                            'edit_itemtype')
                        itemtypes[position]['attributes'] = request.form.get(
                            'edit_attributes').split('\r\n')
                        itemtypes[position]['parameters'] = {
                            'layout': request.form.get('edit_layout'),
                            'tileserver': request.form.get('edit_tileserver')
                        }
                        itemtypes[position]['key'] = request.form.get(
                            'edit_keys').split('\r\n')

                    else:  # add new type
                        it = dict()
                        it['name'] = request.form.get('edit_name')
                        it['filter'] = request.form.get('edit_filter')
                        it['cities'] = [
                            int(i) for i in request.form.getlist('edit_cityid')
                        ]
                        it['itemtype'] = request.form.get('edit_itemtype')
                        it['attributes'] = request.form.get(
                            'edit_attributes').split('\r\n')
                        it['parameters'] = {
                            'layout': request.form.get('edit_layout')
                        }
                        if itemtypes == "":
                            itemtypes = [it]
                        else:
                            itemtypes.append(it)
                        it['key'] = request.form.get('edit_keys').split('\r\n')
                    Settings.set('mapitemdefinition', itemtypes)
                    db.session.commit()
                    current_app.blueprints['admin'].modules[
                        'mapitems'].updateAdminSubNavigation()

            params.update({
                'itemtypes': Settings.get('mapitemdefinition', []),
                'layouters': MapItem.getLayouters()
            })
            return render_template('admin.mapitems.definition.html', **params)

    # deliver default list
    itemdefinition = [
        t for t in Settings.get('mapitemdefinition') if t['name'] == module[1]
    ][0]
    itemtypes = MapItem.getMapitems(itemtype=module[1])
    page = 0
    if len(module) == 3:  # pagination active
        page = int(module[2])
    pagination = Pagination(page, PER_PAGE, len(itemtypes))

    params.update({
        'itemtypes': itemtypes[page:page + PER_PAGE],
        'itemdefinition': itemdefinition,
        'pagination': pagination
    })
    return render_template('admin.mapitems.html', **params)
Esempio n. 50
0
 def getMapItemDefinitions(self):
     return Settings.get('mapitemdefinition')
Esempio n. 51
0
def get_zoom(self):  # deliver zoom  integer
    return int(self.get('zoom', Settings.get('defaultZoom', '13')))
Esempio n. 52
0
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:
    """
    global BEFORE, AFTER, FILES, ERROR_RAISED

    if OBSERVERACTIVE == 0:
        return

    if 'path' in kwargs:
Esempio n. 53
0
def get_street_proto(self, stype):  # deliver street object
    _t = {1: 'address', 2: 'address2'}
    if self.get('id.%s' % _t[stype]) and self.get('id.%s' % _t[stype], '0') not in ['-1', '0']:
        return Street.getStreets(id=self.get('id.%s' % _t[stype], '0'))
    else:
        return Street(self.get(_t[stype], ''), '', '', 1, '', float(Settings.get('defaultLat', '0')), float(Settings.get('defaultLng', '0')), float(Settings.get('defaultZoom', '13')), 1)
Esempio n. 54
0
def getAdminContent(self, **params):
    """
    Deliver admin content of module alarmobjects

    :param params: use given parameters of request
    :return: rendered template as string
    """
    module = request.view_args['module'].split('/')

    def chunks(l, n):
        return [l[i:i + n] for i in range(0, len(l), n)]

    if len(module) > 1:  # type definition
        if module[1] == 'types':
            if request.method == 'POST':
                if request.form.get(
                        'action') == 'createalarmobjecttype':  # add type
                    params.update({'alarmobjecttype': AlarmObjectType('', '')})
                    return render_template(
                        'admin.alarmobjects.types_action.html', **params)

                elif request.form.get(
                        'action') == 'savealarmobjecttype':  # save type
                    if request.form.get(
                            'alarmobjecttype_id') == 'None':  # add new type
                        alarmobjecttype = AlarmObjectType('', '')
                        db.session.add(alarmobjecttype)
                    else:  # update existing
                        alarmobjecttype = AlarmObjectType.getAlarmObjectTypes(
                            id=int(request.form.get('alarmobjecttype_id')))
                    alarmobjecttype.name = request.form.get(
                        'alarmobjecttype_name')
                    alarmobjecttype.remark = request.form.get(
                        'alarmobjecttype_remark')
                    db.session.commit()

                elif request.form.get('action').startswith(
                        'detailobjecttype'):  # edit type
                    alarmobjecttype = AlarmObjectType.getAlarmObjectTypes(
                        id=int(request.form.get('action').split('_')[-1]))
                    params.update({'alarmobjecttype': alarmobjecttype})
                    return render_template(
                        'admin.alarmobjects.types_action.html', **params)

                elif request.form.get('action').startswith(
                        'deleteobjecttype_'):  # delete type
                    db.session.delete(
                        AlarmObjectType.getAlarmObjectTypes(
                            id=int(request.form.get('action').split('_')[-1])))
                    db.session.commit()

            params.update(
                {'alarmobjecttypes': AlarmObjectType.getAlarmObjectTypes()})
            return render_template('admin.alarmobjects.types.html', **params)

        elif module[1] == 'fields':
            if request.method == 'POST':
                if request.form.get(
                        'action') == 'updatefield':  # update fields
                    Settings.set('alarmobjectfields', [
                        i for i in chunks(request.form.getlist('fieldname'), 2)
                        if i[0] != ''
                    ])
                    db.session.commit()

            params.update({'fields': Settings.get('alarmobjectfields', [])})
            return render_template('admin.alarmobjects.fields.html', **params)

    else:  # base view
        if request.method == 'POST':
            streets = Street.getStreets()
            if request.form.get(
                    'action') == 'createalarmobject':  # add alarmobject
                params.update({
                    'alarmobject':
                    AlarmObject('', 0, '', Settings.get('defaultLat'),
                                Settings.get('defaultLng'),
                                Settings.get('defaultZoom'), '', '', '', 0, 0),
                    'streets':
                    streets,
                    'selectedstreet':
                    '',
                    'map':
                    Map.getDefaultMap(),
                    'alarmobjecttypes':
                    AlarmObjectType.getAlarmObjectTypes()
                })
                return render_template('admin.alarmobjects_actions.html',
                                       **params)

            elif request.form.get('action') == 'savealarmobject':  # save
                if request.form.get('alarmobject_id') == 'None':  # add new
                    alarmobject = AlarmObject('', 0, '', 0, 0, 0, '', '', '',
                                              0, 0)
                    db.session.add(alarmobject)
                else:  # update existing
                    alarmobject = AlarmObject.getAlarmObjects(
                        id=request.form.get('alarmobject_id'))
                alarmobject.name = request.form.get('edit_name')
                alarmobject._streetid = request.form.get('streetid')
                alarmobject._objecttype = int(
                    request.form.get('edit_objecttype'))
                alarmobject.remark = request.form.get('edit_remark')
                if request.form.get('edit_position') == '1':
                    alarmobject.lat = request.form.get('edit_lat')
                    alarmobject.lng = request.form.get('edit_lng')
                    alarmobject.zoom = request.form.get('edit_zoom')
                alarmobject.streetno = request.form.get('edit_streetno')
                alarmobject.alarmplan = request.form.get('edit_alarmplan')
                alarmobject.bma = request.form.get('edit_bma')
                alarmobject.active = int(request.form.get('edit_active', '0'))
                db.session.commit()

            elif request.form.get(
                    'action'
            ) == 'savealarmobjectattributes':  # save attributes
                alarmobject = AlarmObject.getAlarmObjects(
                    id=request.form.get('alarmobject_id'))
                for field in Settings.get('alarmobjectfields',
                                          []):  # store attributes
                    if 'edit_%s' % field[0] in request.form:
                        alarmobject.set(field[0],
                                        request.form.get('edit_%s' % field[0]))
                db.session.commit()

            elif request.form.get(
                    'action') == 'savealarmobjectaao':  # save aao
                alarmobject = AlarmObject.getAlarmObjects(
                    id=request.form.get('alarmobject_id'))
                if alarmobject:
                    alarmobject.set('cars1', [
                        c for c in request.form.get('cars1').split(';')
                        if c != ''
                    ])
                    alarmobject.set('cars2', [
                        c for c in request.form.get('cars2').split(';')
                        if c != ''
                    ])
                    alarmobject.set('material', [
                        c for c in request.form.get('material').split(';')
                        if c != ''
                    ])
                    db.session.commit()

            elif request.form.get('action').startswith(
                    'editalarmobject_'):  # edit alarmobject
                alarmobject = AlarmObject.getAlarmObjects(
                    id=int(request.form.get('action').split('_')[-1]))
                params.update({
                    'alarmobject':
                    alarmobject,
                    'streets':
                    streets,
                    'selectedstreet':
                    '%s (%s)' %
                    (alarmobject.street.name, alarmobject.street.city.name),
                    'map':
                    Map.getDefaultMap(),
                    'alarmobjecttypes':
                    AlarmObjectType.getAlarmObjectTypes(),
                    'fields':
                    Settings.get('alarmobjectfields', []),
                    'cars':
                    Car.getCars(deptid=Department.getDefaultDepartment().id)
                })
                return render_template('admin.alarmobjects_actions.html',
                                       **params)

            elif request.form.get('action').startswith(
                    'deletealarmobject_'):  # delete alarmobject
                db.session.delete(
                    AlarmObject.getAlarmObjects(
                        id=int(request.form.get('action').split('_')[-1])))
                db.session.commit()

        params.update({
            'alarmobjects': AlarmObject.getAlarmObjects(active=0),
            'alarmobjecttypes': AlarmObjectType.getAlarmObjectTypes()
        })
        return render_template('admin.alarmobjects.html', **params)
Esempio n. 55
0
def getAlarmRoute(alarm):
    """
    get routing from webservice, points and description
    """
    if alarm.get('lat', '') != '':
        params = {'format': 'kml', 'flat': Settings.get('homeLat'), 'flon': Settings.get('homeLng'), 'tlat': alarm.get('lat'), 'tlon': alarm.get('lng'), 'v': 'motorcar', 'fast': '1', 'layer': 'mapnik', 'instructions': '1', 'lang': current_app.config.get('BABEL_DEFAULT_LOCALE')}
    else:
        params = {'format': 'kml', 'flat': Settings.get('homeLat'), 'flon': Settings.get('homeLng'), 'tlat': 0, 'tlon': 0, 'v': 'motorcar', 'fast': '1', 'layer': 'mapnik', 'instructions': '1', 'lang': current_app.config.get('BABEL_DEFAULT_LOCALE')}
        if alarm.object:
            params.update({'tlat': alarm.object.lat, 'tlon': alarm.object.lng})
    try:
        r = requests.get(alarm.ROUTEURL, params=params)
        tree = ET.fromstring(r.content)
    except:
        return {}
    data = {}

    def getText(items, elementname):
        for el in items:
            elname = el.tag[el.tag.find('}') + 1:]
            if elname == elementname:
                return el.text

    def getElements(items, elementname):
        for el in items:
            elname = el.tag[el.tag.find('}') + 1:]
            if elname == elementname:
                return el

    elements = getElements(tree, 'Document')

    data['distance'] = float(getText(elements, 'distance'))
    data['traveltime'] = int(getText(elements, 'traveltime'))
    data['description'] = getText(elements, 'description')
    if data['description'] is None:
        data['description'] = ""
        data['error'] = 1

    data['description'] = re.sub('\s+', ' ', data['description'].replace('\\', ''))
    description = []
    for l in data['description'].split('<br>'):
        if babel.gettext(u'alarms.print.bus') not in l.lower():
            match_dir = re.findall(r"" + babel.gettext(u'alarms.print.slightleft') + "|" + babel.gettext(u'alarms.print.left') + "|" + babel.gettext(u'alarms.print.slightright') + "|" + babel.gettext(u'alarms.print.right') + "|" + babel.gettext(u'alarms.print.straight') + "|\d\.\s" + babel.gettext(u'alarms.print.exit'), l.lower()),  # km extraction
            match_length = re.findall(r"\d*\.\d+\s*[k]?m|\d+\s*[k]?m", l)  # km extraction

            if len(match_dir) > 0 and len(match_length) > 0:
                try:
                    match_dir = re.sub('\d*\.|\s', '', match_dir[0][0].lower())  # reformat direction
                except IndexError:
                    continue
                direction = l.split('. Der Str')[0]
                if '[positive]' in direction or '[negative]' in direction or babel.gettext(u'alarms.print.highwaylong') in direction:  # eval highway
                    match_dir = 'highway'
                    direction = direction.replace(babel.gettext(u'alarms.print.highwaylong'), babel.gettext(u'alarms.print.highwayshort'))
                highwayexit = re.findall(r"auf .*;.*", l.lower())  # eval highway exit
                if len(highwayexit) > 0:
                    match_dir = 'highwayexit'
                    direction = direction.replace(babel.gettext(u'alarms.print.exitstart'), babel.gettext(u'alarms.print.exit').title()).replace(babel.gettext(u'alarms.print.straight'), babel.gettext(u'alarms.print.straightexit'))
                    direction = re.sub(';\s?', '/', direction)
                direction = direction.replace('[positive]', u'<b>%s</b>' % babel.gettext(u'alarms.print.positive'))
                direction = direction.replace('[negative]', u'<b>%s</b>' % babel.gettext(u'alarms.print.negative'))
                description.append([match_dir, match_length[0], direction])
    data['description'] = description

    f = getElements(getElements(elements, 'Folder'), 'Placemark')
    f = getElements(f, 'LineString')
    data['coordinates'] = []
    for c in getText(f, 'coordinates').split('\n'):
        if c.strip() != '':
            data['coordinates'].append((float(c.split(',')[0]), float(c.split(',')[1])))
    return data