########################################################################## # # pgAdmin 4 - PostgreSQL Tools # # Copyright (C) 2013 - 2015, The pgAdmin Development Team # This software is released under the PostgreSQL Licence # ########################################################################## from flask import Blueprint from collections import defaultdict from operator import attrgetter import sys class PgAdminModule(Blueprint): """ Base class for every PgAdmin Module. This class defines a set of method and attributes that every module should implement. """ def __init__(self, name, import_name, **kwargs): kwargs.setdefault('url_prefix', '/' + name) kwargs.setdefault('template_folder', 'templates') kwargs.setdefault('static_folder', 'static') self.submodules = [] super(PgAdminModule, self).__init__(name, import_name, **kwargs) def register(self, app, options, first_registration=False): """ Override the default register function to automagically register sub-modules at once. """ if first_registration: self.submodules = list(app.find_submodules(self.import_name)) super(PgAdminModule, self).register(app, options, first_registration) for module in self.submodules: app.register_blueprint(module) def get_own_stylesheets(self): """ Returns: list: the stylesheets used by this module, not including any stylesheet needed by the submodules. """ return [] def get_own_javascripts(self): """ Returns: list: the javascripts used by this module, not including any script needed by the submodules. """ return [] def get_own_menuitems(self): """ Returns: dict: the menuitems for this module, not including any needed from the submodules. """ return defaultdict(list) def get_panels(self): """ Returns: list: a list of panel objects to add """ return [] @property def stylesheets(self): stylesheets = self.get_own_stylesheets() for module in self.submodules: stylesheets.extend(module.stylesheets) return stylesheets @property def javascripts(self): javascripts = self.get_own_javascripts() for module in self.submodules: javascripts.extend(module.javascripts) return javascripts @property def menu_items(self): menu_items = self.get_own_menuitems() for module in self.submodules: for key, value in module.menu_items.items(): menu_items[key].extend(value) menu_items = {key: sorted(values, key=attrgetter('priority')) for key, values in menu_items.items()} return menu_items