From 3b6c4eb402b32a0c529052bc70dac3e28cd88655 Mon Sep 17 00:00:00 2001 From: Calin Crisan Date: Tue, 10 Nov 2015 16:24:02 +0200 Subject: [PATCH] added preliminary preferences support --- motioneye/handlers.py | 23 +++++++++ motioneye/prefs.py | 96 +++++++++++++++++++++++++++++++++++ motioneye/server.py | 1 + motioneye/templates/main.html | 6 +-- 4 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 motioneye/prefs.py diff --git a/motioneye/handlers.py b/motioneye/handlers.py index e1debcf..37bfc32 100644 --- a/motioneye/handlers.py +++ b/motioneye/handlers.py @@ -30,6 +30,7 @@ import config import mediafiles import motionctl import powerctl +import prefs import remote import settings import smbctl @@ -90,6 +91,12 @@ class BaseHandler(RequestHandler): logging.error('authentication failed for user %(user)s' % {'user': username}) return None + + def get_pref(self, key, default=None): + return prefs.get(self.current_user or 'anonymous', key, default) + + def set_pref(self, key, value): + return prefs.set(self.current_user or 'anonymous', key, value) def _handle_request_exception(self, exception): try: @@ -1340,6 +1347,22 @@ class MovieHandler(BaseHandler): raise HTTPError(400, 'unknown operation') +class PrefsHandler(BaseHandler): + def get(self, key): + self.finish_json(self.get_pref(key)) + + def post(self, key): + try: + value = json.loads(self.request.body) + + except Exception as e: + logging.error('could not decode json: %s' % e) + + raise + + self.set_pref(key, value) + + class RelayEventHandler(BaseHandler): @BaseHandler.auth(admin=True) def post(self): diff --git a/motioneye/prefs.py b/motioneye/prefs.py new file mode 100644 index 0000000..793277c --- /dev/null +++ b/motioneye/prefs.py @@ -0,0 +1,96 @@ + +# Copyright (c) 2013 Calin Crisan +# This file is part of motionEye. +# +# motionEye is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import json +import logging +import os.path + +import settings + + +_PREFS_FILE_NAME = 'prefs.json' +_prefs = None + + +def _load(): + global _prefs + + _prefs = {} + + file_path = os.path.join(settings.CONF_PATH, _PREFS_FILE_NAME) + + if os.path.exists(file_path): + logging.debug('loading preferences from "%s"...' % file_path) + + try: + file = open(file_path, 'r') + + except Exception as e: + logging.error('could not open preferences file "%s": %s' % (file_path, e)) + + return + + try: + _prefs = json.load(file) + + except Exception as e: + logging.error('could not read preferences from file "%s": %s'(file_path, e)) + + finally: + file.close() + + else: + logging.debug('preferences file "%s" does not exist, using default preferences') + + +def _save(): + file_path = os.path.join(settings.CONF_PATH, _PREFS_FILE_NAME) + + logging.debug('saving preferences to "%s"...' % file_path) + + try: + file = open(file_path, 'w') + + except Exception as e: + logging.error('could not open preferences file "%s": %s' % (file_path, e)) + + return + + try: + json.dump(_prefs, file, sort_keys=True, indent=4) + + except Exception as e: + logging.error('could not save preferences to file "%s": %s'(file_path, e)) + + finally: + file.close() + + +def get(username, key, default=None): + if _prefs is None: + _load() + + return _prefs.get(username, {}).get(key, default) + + +def set(username, key, value): + if _prefs is None: + _load() + + _prefs.setdefault(username, {})[key] = value + _save() + diff --git a/motioneye/server.py b/motioneye/server.py index b2eaf83..816924a 100644 --- a/motioneye/server.py +++ b/motioneye/server.py @@ -170,6 +170,7 @@ handler_mapping = [ (r'^/movie/(?P\d+)/(?Plist)/?$', handlers.MovieHandler), (r'^/movie/(?P\d+)/(?Pdownload|preview|delete)/(?P.+?)/?$', handlers.MovieHandler), (r'^/movie/(?P\d+)/(?Pdelete_all)/(?P.*?)/?$', handlers.MovieHandler), + (r'^/prefs/(?P\w+)/?$', handlers.PrefsHandler), (r'^/_relay_event/?$', handlers.RelayEventHandler), (r'^/log/(?P\w+)/?$', handlers.LogHandler), (r'^/update/?$', handlers.UpdateHandler), diff --git a/motioneye/templates/main.html b/motioneye/templates/main.html index 6ccd717..47b8677 100644 --- a/motioneye/templates/main.html +++ b/motioneye/templates/main.html @@ -108,17 +108,17 @@ - + - + - + -- 2.39.5
Show Advanced SettingsAdvanced Settings ?
Administrator UsernameAdmin Username ?
Administrator PasswordAdmin Password ?