class JavManagerDB: def __init__(self): self.jav_db = FileBackend('jav_manager.db') def create_indexes(self): print('creating index for stat') self.jav_db.create_index(JavObj, 'stat') def rebuild_index(self): self.jav_db.rebuild_index(self.jav_db.get_collection_for_cls(JavObj), 'stat') def bulk_list(self): return self.jav_db.filter(JavObj, {}) def partial_search(self, search_string: str): rt = self.jav_db.filter(JavObj, {'pk': { '$regex': search_string.upper() }})[:20] return rt def query_on_filter(self, filter_on: dict, page=1, limit=8): rt = self.jav_db.filter(JavObj, filter_on) rt_max_page = ceil(len(rt) / limit) rt_list = rt[(page - 1) * limit:(page) * limit] return [dict(x) for x in rt_list], rt_max_page def upcreate_jav(self, jav_obj: dict): # uniform car to upper case jav_obj['car'] = str(jav_obj['car']).upper() # set pk to car jav_obj['pk'] = jav_obj['car'] # pull existing data since this is update function try: current_jav_obj = dict(self.get_by_pk(jav_obj['car'])) # overwrite current db dict with input dict current_jav_obj.update(jav_obj) except DoesNotExist: # set default to no opinion #0-want, 1-viewed, 2-no opinion 3-local 4-downloading jav_obj.setdefault('stat', 2) _jav_doc = JavObj(jav_obj) _jav_doc.save(self.jav_db) self.jav_db.commit() print('writed ', jav_obj) def get_by_pk(self, pk: str): return self.jav_db.get(JavObj, {'pk': pk.upper()}) def pk_exist(self, pk: str): try: self.jav_db.get(JavObj, {'pk': pk.upper()}) return True except DoesNotExist: return False
print("Backend Saved and committed:", os.path.realpath(os.curdir)) # print(backend.get(Movie,{'pk':1})) # or... the_godfather = backend.get(Movie, {'name': 'The Godfather'}) print("the_godfather", the_godfather) the_godfather.cast = { 'Don Vito Corleone': marlon_brando, 'Michael Corleone': al_pacino } #Documents stored within other objects will be automatically converted to database references. marlon_brando.performances = [the_godfather] al_pacino.performances = [the_godfather] marlon_brando.save(backend) al_pacino.save(backend) the_godfather.save(backend) backend.create_index(Actor, 'performances') #Will create an index on the 'performances' field, for fast querying godfather_cast = backend.filter(Actor, {'movies': the_godfather}) print("godfather_cast", godfather_cast) #Will return 'Al Pacino' and 'Marlon Brando' print(backend.get(Movie, {'name': 'The Godfather'}))
def start(args): """ Start the app :param args: input parameters :type args: Namespace """ # -------------------------------------------------------------------------- # Set Database connection # -------------------------------------------------------------------------- if args.DB_TYPE == "file": # File oriented DB if not args.FILE_DB_PATH: _path = os.path.join(os.getcwd(), "service_db") else: _path = os.path.join(args.FILE_DB_PATH, "service_db") backend = FileBackend(_path, {'serializer_class': 'pickle'}) backend.create_index(Service, 'name', ephemeral=False, fields=["name"]) else: import socket from pymongo import MongoClient, DESCENDING if not args.MONGODB_HOST: raise ValueError("You must specify a MongoDB host") _mongo_password = "" if not args.MONGODB_PASSWORD else args.MONGODB_PASSWORD _mongo_user = "" if not args.MONGODB_USER else args.MONGODB_USER _mongo_port = 27018 if not args.MONGODB_PORT else args.MONGODB_PORT _mongo_uri = 'mongodb://%(user)s%(sep)s%(password)s%(arr)s%(host)s' % dict( user=_mongo_user, sep=":" if _mongo_user else "", arr="@" if _mongo_user else "", password=_mongo_password, host=args.MONGODB_HOST ) # PyMongo doesn't check socket timeout -> test manually try: sock = socket.socket() sock.connect((args.MONGODB_HOST, _mongo_port)) except socket.error: raise ConnectionError("Can't connect to MongoDB host") # MongoDB c = MongoClient(_mongo_uri, port=_mongo_port, connectTimeoutMS=5000) # Get database and scheme db = c["pyregister" if not args.MONGODB_DB else args.MONGODB_DB] col = db["services" if not args.MONGODB_SCHEME else args.MONGODB_SCHEME] # Create index col.create_index([("name", DESCENDING)]) # create a new BlitzDB backend using a MongoDB database backend = MongoBackend(col) # # Link backend to web-server property # backend.autocommit = True # -------------------------------------------------------------------------- # Routes # -------------------------------------------------------------------------- # Catalog routes_catalog(app) app.config['APP_DB'] = backend # -------------------------------------------------------------------------- # Enable doc? # -------------------------------------------------------------------------- if args.NOD_DOC is False: Swagger(app) app.run(host=args.IP, port=args.PORT)
#or... the_godfather = backend.get(Movie,{'name' : 'The Godfather'}) print the_godfather movies_from_1972 = backend.filter(Movie,{'year' : 1972}) the_godfather.cast = {'Don Vito Corleone' : marlon_brando, 'Michael Corleone' : al_pacino} #Documents stored within other objects will be automatically converted to database references. marlon_brando.performances = [the_godfather] al_pacino.performances = [the_godfather] marlon_brando.save(backend) al_pacino.save(backend) backend.create_index(Actor,'performances') #Will create an index for fast querying godfather_cast = backend.filter(Actor,{'performances' : the_godfather}) #Will return 'Al Pacino' and 'Marlon Brando' print "Godfather cast:",list(godfather_cast) star_wars_iv = Movie({'name' : 'Star Wars - Episode IV: A New Hope','year': 1977}) star_wars_iv.save(backend) movies_from_the_seventies = backend.filter(Movie,{'year': lambda year : True if year >= 1970 and year < 1980 else False}) print "Movies from the seventies:",list(movies_from_the_seventies)
def create_app(configfile=None): app = Flask(__name__) AppConfig(app, configfile) # Flask-Appconfig is not necessary, but # highly recommend =) # https://github.com/mbr/flask-appconfig Bootstrap(app) login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view = 'login' #NoSQL Backend backend = FileBackend("/tmp/wakeonlan.db") backend.create_index(Device, fields={'id': 1}, unique=True) #TEST Devices alldevices = backend.filter(Device, {}) if len(alldevices) == 0: try: pc1 = Device({ "id": "001122334411", "name": "PC 1", "mac": "00:11:22:33:44:11", "ip": "192.168.222.111", 'status': '' }) backend.save(pc1) pc2 = Device({ "id": "001122334422", "name": "PC 2", "mac": "00:11:22:33:44:22", "ip": "192.168.222.112", 'status': '' }) backend.save(pc2) pc3 = Device({ "id": "001122334433", "name": "Router", "mac": "00:11:22:33:44:33", "ip": "192.168.222.1", 'status': '' }) backend.save(pc3) backend.commit() except: backend.revert() pass # in a real app, these should be configured through Flask-Appconfig app.config['SECRET_KEY'] = 'devkey' # app.config['RECAPTCHA_PUBLIC_KEY'] = \ # '6Lfol9cSAAAAADAkodaYl9wvQCwBMr3qGR_PPHcw' def getDeviceById(id): device = None try: device = backend.get(Device, {'id': id}) except: pass return device def pingDeviceById(id): #Get Device device = backend.get(Device, {'id': id}) if device: #Get Device's IP ip = device['ip'] result = pingDeviceByIp(ip) #Update Status UP/Down/'' if result == 0: device['status'] = 'UP' else: device['status'] = 'DOWN' backend.save(device) return result return None def wolDeviceById(id): #Get Device device = backend.get(Device, {'id': id}) if device: #WoL for Device MAC mac = device['mac'] wolDeviceByMac(mac) return None @login_manager.user_loader def user_loader(user_id): """Given *user_id*, return the associated User object. :param unicode user_id: user_id (email) user to retrieve """ user_entry = User.getById(user_id) if user_entry is not None: user = User(user_entry[0], user_entry[1]) return user else: return None @app.route('/', methods=('GET', 'POST')) @login_required def index(): form = ExampleForm() form.validate_on_submit() # to get error messages to the browser # flash('critical message', 'critical') # flash('error message', 'error') # flash('warning message', 'warning') # flash('info message', 'info') # flash('debug message', 'debug') # flash('different message', 'different') # flash('uncategorized message') alldevices = None alldevices = backend.filter(Device, {}).sort('name') #app.logger.info('Devices: %s' % (len(alldevices) ) ) return render_template('index.html', form=form, devices=alldevices) @app.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'GET': form = LoginForm() form.validate_on_submit() # to get error messages to the browser return render_template('login.html', form=form) username = request.form['username'] password = request.form['password'] user_entry = User.get(username, password) if user_entry is None: flash('Username or Passord is invalid', 'error') return redirect(url_for('login')) user = User(user_entry[0], user_entry[1]) login_user(user, remember=True) return redirect(request.args.get('next') or url_for('index')) @app.route("/logout", methods=["GET"]) @login_required def logout(): """Logout the current user.""" user = current_user user.authenticated = False logout_user() return redirect(url_for('login')) @app.route('/addDevice', methods=('GET', 'POST')) @login_required def addDevice(): if request.method == 'GET': form = AddDeviceForm() form.validate_on_submit() # to get error messages to the browser return render_template('add_device.html', form=form) name = request.form['name'] mac = request.form['mac'] ip = request.form['ip'] id = mac.replace(':', '') try: newDevice = Device({ "id": id, "name": name, "mac": mac, "ip": ip, 'status': '' }) backend.save(newDevice) backend.commit() except: flash('Error creating new Device', 'error') pass return redirect(url_for('index')) @app.route('/editListDevice', methods=('GET', 'POST')) @login_required def editListDevice(): alldevices = None alldevices = backend.filter(Device, {}).sort('name') return render_template('list_device.html', devices=alldevices) @app.route('/pingDevice/<deviceId>', methods=('GET', 'POST')) @login_required def pingDevice(deviceId): app.logger.info('pingDevice: %s' % (deviceId)) device = getDeviceById(deviceId) result = pingDeviceById(deviceId) app.logger.info('pingDevice: %s' % (result)) if result is None: flash('Ping - Error on device %s' % (device['name']), 'error') elif result == 0: flash('Device %s is UP' % (device['name']), 'info') else: flash('Device %s is DOWN' % (device['name']), 'error') return redirect(url_for('index')) @app.route('/wolDevice/<deviceId>', methods=('GET', 'POST')) @login_required def wolDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId)) device = getDeviceById(deviceId) result = wolDeviceById(deviceId) if device: flash('WoL sent to %s' % (device['name']), 'info') else: flash('WoL error', 'error') return redirect(url_for('index')) @app.route('/deleteDevice/<deviceId>', methods=('GET', 'POST')) @login_required def deleteDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId)) device = getDeviceById(deviceId) try: backend.delete(device) backend.commit() flash('%s Deleted' % (device['name']), 'info') except: flash('Delete error', 'error') pass return redirect(url_for('editListDevice')) return app
def create_app(configfile=None): app = Flask(__name__) AppConfig(app, configfile) # Flask-Appconfig is not necessary, but # highly recommend =) # https://github.com/mbr/flask-appconfig Bootstrap(app) login_manager = LoginManager() login_manager.init_app(app) login_manager.login_view='login' #NoSQL Backend backend = FileBackend("/tmp/wakeonlan.db") backend.create_index(Device, fields={'id':1}, unique=True) #TEST Devices alldevices = backend.filter(Device, {}) if len(alldevices) == 0 : try: pc1 = Device({"id" : "001122334411", "name" : "PC 1", "mac" : "00:11:22:33:44:11", "ip":"192.168.222.111", 'status' : ''}) backend.save(pc1) pc2 = Device({"id" : "001122334422","name" : "PC 2", "mac" : "00:11:22:33:44:22", "ip":"192.168.222.112", 'status' : ''}) backend.save(pc2) pc3 = Device({"id" : "001122334433","name" : "Router", "mac" : "00:11:22:33:44:33", "ip":"192.168.222.1", 'status' : ''}) backend.save(pc3) backend.commit() except: backend.revert() pass # in a real app, these should be configured through Flask-Appconfig app.config['SECRET_KEY'] = 'devkey' # app.config['RECAPTCHA_PUBLIC_KEY'] = \ # '6Lfol9cSAAAAADAkodaYl9wvQCwBMr3qGR_PPHcw' def getDeviceById(id): device = None try: device = backend.get(Device, {'id':id}) except: pass return device def pingDeviceById(id): #Get Device device = backend.get(Device, {'id':id}) if device: #Get Device's IP ip = device['ip'] result = pingDeviceByIp(ip) #Update Status UP/Down/'' if result==0: device['status'] = 'UP' else: device['status'] = 'DOWN' backend.save(device) return result return None def wolDeviceById(id): #Get Device device = backend.get(Device, {'id':id}) if device: #WoL for Device MAC mac = device['mac'] wolDeviceByMac(mac) return None @login_manager.user_loader def user_loader(user_id): """Given *user_id*, return the associated User object. :param unicode user_id: user_id (email) user to retrieve """ user_entry = User.getById(user_id) if user_entry is not None: user = User(user_entry[0], user_entry[1]) return user else: return None @app.route('/', methods=('GET', 'POST')) @login_required def index(): form = ExampleForm() form.validate_on_submit() # to get error messages to the browser # flash('critical message', 'critical') # flash('error message', 'error') # flash('warning message', 'warning') # flash('info message', 'info') # flash('debug message', 'debug') # flash('different message', 'different') # flash('uncategorized message') alldevices = None alldevices = backend.filter(Device, {}).sort('name') #app.logger.info('Devices: %s' % (len(alldevices) ) ) return render_template('index.html', form=form, devices = alldevices) @app.route('/login', methods=('GET', 'POST')) def login(): if request.method == 'GET': form = LoginForm() form.validate_on_submit() # to get error messages to the browser return render_template('login.html', form=form) username = request.form['username'] password = request.form['password'] user_entry = User.get(username, password) if user_entry is None: flash('Username or Passord is invalid', 'error') return redirect(url_for('login')) user = User(user_entry[0], user_entry[1]) login_user(user, remember=True) return redirect(request.args.get('next') or url_for('index')) @app.route("/logout", methods=["GET"]) @login_required def logout(): """Logout the current user.""" user = current_user user.authenticated = False logout_user() return redirect(url_for('login')) @app.route('/addDevice', methods=('GET', 'POST')) @login_required def addDevice(): if request.method == 'GET': form = AddDeviceForm() form.validate_on_submit() # to get error messages to the browser return render_template('add_device.html', form=form) name = request.form['name'] mac = request.form['mac'] ip = request.form['ip'] id = mac.replace(':','') try: newDevice = Device({"id" : id, "name" : name, "mac" : mac, "ip":ip, 'status' : ''}) backend.save(newDevice) backend.commit() except: flash('Error creating new Device', 'error') pass return redirect(url_for('index')) @app.route('/editListDevice', methods=('GET', 'POST')) @login_required def editListDevice(): alldevices = None alldevices = backend.filter(Device, {}).sort('name') return render_template('list_device.html', devices = alldevices) @app.route('/pingDevice/<deviceId>', methods=('GET', 'POST')) @login_required def pingDevice(deviceId): app.logger.info('pingDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) result = pingDeviceById(deviceId) app.logger.info('pingDevice: %s' % (result ) ) if result is None: flash('Ping - Error on device %s' % (device['name']), 'error') elif result == 0: flash('Device %s is UP' % (device['name']), 'info') else: flash('Device %s is DOWN' % (device['name']), 'error') return redirect(url_for('index')) @app.route('/wolDevice/<deviceId>', methods=('GET', 'POST')) @login_required def wolDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) result = wolDeviceById(deviceId) if device: flash('WoL sent to %s' % (device['name']), 'info') else: flash('WoL error', 'error') return redirect(url_for('index')) @app.route('/deleteDevice/<deviceId>', methods=('GET', 'POST')) @login_required def deleteDevice(deviceId): app.logger.info('wolDevice: %s' % (deviceId ) ) device = getDeviceById(deviceId) try: backend.delete(device) backend.commit() flash('%s Deleted' % (device['name']), 'info') except: flash('Delete error', 'error') pass return redirect(url_for('editListDevice')) return app