*************
Code Snippets
*************


This document contains code for some of the important classes, listed as
below:

* PgAdminModule_


.. _PgAdminModule:

PgAdminModule
*************


PgAdminModule is inherted from Flask.Blueprint module.
This module defines a set of methods, properties and attributes,
that every module should implement.


.. code-block:: python

    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 = []
            self.parentmodules = []

            super(PgAdminModule, self).__init__(name, import_name, **kwargs)

            def create_module_preference():
                # Create preference for each module by default
                if hasattr(self, 'LABEL'):
                    self.preference = Preferences(self.name, self.LABEL)
                else:
                    self.preference = Preferences(self.name, None)

                self.register_preferences()

            # Create and register the module preference object and preferences for
            # it just before the first request
            self.before_app_first_request(create_module_preference)

        def register_preferences(self):
            pass

        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:
                if first_registration:
                    module.parentmodules.append(self)
                app.register_blueprint(module)
                app.register_logout_hook(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_messages(self):
            """
            Returns:
                dict: the i18n messages used by this module, not including any
                    messages needed by the submodules.
            """
            return dict()

        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 []

        def get_exposed_url_endpoints(self):
            """
            Returns:
                list: a list of url endpoints exposed to the client.
            """
            return []

        @property
        def stylesheets(self):
            stylesheets = self.get_own_stylesheets()
            for module in self.submodules:
                stylesheets.extend(module.stylesheets)
            return stylesheets

        @property
        def messages(self):
            res = self.get_own_messages()

            for module in self.submodules:
                res.update(module.messages)
            return res

        @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 = dict((key, sorted(value, key=attrgetter('priority')))
                              for key, value in menu_items.items())
            return menu_items

        @property
        def exposed_endpoints(self):
            res = self.get_exposed_url_endpoints()

            for module in self.submodules:
                res += module.exposed_endpoints

            return res
