gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

253 lines
7.2KB

  1. ##########################################################################
  2. #
  3. # pgAdmin 4 - PostgreSQL Tools
  4. #
  5. # Copyright (C) 2013 - 2020, The pgAdmin Development Team
  6. # This software is released under the PostgreSQL Licence
  7. #
  8. ##########################################################################
  9. from abc import ABCMeta, abstractmethod
  10. import six
  11. from flask import url_for, render_template
  12. from flask_babelex import gettext
  13. from pgadmin.browser import BrowserPluginModule
  14. from pgadmin.browser.utils import PGChildModule
  15. from pgadmin.utils import PgAdminModule
  16. from pgadmin.utils.preferences import Preferences
  17. @six.add_metaclass(ABCMeta)
  18. class CollectionNodeModule(PgAdminModule, PGChildModule):
  19. """
  20. Base class for collection node submodules.
  21. """
  22. browser_url_prefix = BrowserPluginModule.browser_url_prefix
  23. SHOW_ON_BROWSER = True
  24. def __init__(self, import_name, **kwargs):
  25. kwargs.setdefault("url_prefix", self.node_path)
  26. kwargs.setdefault("static_url_path", '/static')
  27. PgAdminModule.__init__(
  28. self,
  29. "NODE-%s" % self.node_type,
  30. import_name,
  31. **kwargs
  32. )
  33. PGChildModule.__init__(self)
  34. @property
  35. def jssnippets(self):
  36. """
  37. Returns a snippet of javascript to include in the page
  38. """
  39. return []
  40. @property
  41. def module_use_template_javascript(self):
  42. """
  43. Returns whether Jinja2 template is used for generating the javascript
  44. module.
  45. """
  46. return True
  47. def get_own_javascripts(self):
  48. scripts = []
  49. if self.module_use_template_javascript:
  50. scripts.extend([{
  51. 'name': 'pgadmin.node.%s' % self.node_type,
  52. 'path': url_for('browser.index') +
  53. '%s/module' % self.node_type,
  54. 'when': self.script_load,
  55. 'is_template': True
  56. }])
  57. else:
  58. scripts.extend([{
  59. 'name': 'pgadmin.node.%s' % self.node_type,
  60. 'path': url_for(
  61. '%s.static' % self.name,
  62. filename=('js/%s' % self.node_type)
  63. ),
  64. 'when': self.script_load,
  65. 'is_template': False
  66. }])
  67. for module in self.submodules:
  68. scripts.extend(module.get_own_javascripts())
  69. return scripts
  70. def generate_browser_node(
  71. self, node_id, parent_id, label, icon, **kwargs
  72. ):
  73. obj = {
  74. "id": "%s/%s" % (self.node_type, node_id),
  75. "label": label,
  76. "icon": self.node_icon if not icon else icon,
  77. "inode": self.node_inode
  78. if 'inode' not in kwargs
  79. else kwargs['inode'],
  80. "_type": self.node_type,
  81. "_id": node_id,
  82. "_pid": parent_id,
  83. "module": 'pgadmin.node.%s' % self.node_type
  84. }
  85. for key in kwargs:
  86. obj.setdefault(key, kwargs[key])
  87. return obj
  88. def generate_browser_collection_node(self, parent_id, **kwargs):
  89. obj = {
  90. "id": "coll-%s/%d" % (self.node_type, parent_id),
  91. "label": self.collection_label,
  92. "icon": self.collection_icon,
  93. "inode": True,
  94. "_type": 'coll-%s' % (self.node_type),
  95. "_id": parent_id,
  96. "_pid": parent_id,
  97. "module": 'pgadmin.node.%s' % self.node_type,
  98. "nodes": [self.node_type]
  99. }
  100. for key in kwargs:
  101. obj.setdefault(key, kwargs[key])
  102. return obj
  103. @property
  104. def node_type(self):
  105. return '%s' % (self._NODE_TYPE)
  106. @property
  107. def csssnippets(self):
  108. """
  109. Returns a snippet of css to include in the page
  110. """
  111. snippets = [
  112. render_template(
  113. "browser/css/collection.css",
  114. node_type=self.node_type
  115. ),
  116. render_template(
  117. "browser/css/node.css",
  118. node_type=self.node_type,
  119. _=gettext
  120. )
  121. ]
  122. for submodule in self.submodules:
  123. snippets.extend(submodule.csssnippets)
  124. return snippets
  125. @property
  126. def collection_label(self):
  127. """
  128. Label to be shown for the collection node, do not forget to set the
  129. class level variable _COLLECTION_LABEL.
  130. """
  131. return gettext(self._COLLECTION_LABEL)
  132. @property
  133. def label(self):
  134. return gettext(self._COLLECTION_LABEL)
  135. @property
  136. def collection_icon(self):
  137. """
  138. icon to be displayed for the browser collection node
  139. """
  140. return 'icon-coll-%s' % (self.node_type)
  141. @property
  142. def node_icon(self):
  143. """
  144. icon to be displayed for the browser nodes
  145. """
  146. return 'icon-%s' % (self.node_type)
  147. @property
  148. def node_inode(self):
  149. """
  150. Override this property to make the node as leaf node.
  151. """
  152. return True
  153. @abstractmethod
  154. def get_nodes(self, sid, *args, **kwargs):
  155. """
  156. Generate the collection node
  157. You need to override this method because every node will have different
  158. url pattern for the parent.
  159. """
  160. pass
  161. @property
  162. def script_load(self):
  163. """
  164. This property defines, when to load this script.
  165. In order to allow creation of an object, we need to load script for any
  166. node at the parent level.
  167. i.e.
  168. - In order to allow creating a server object, it should be loaded at
  169. server-group node.
  170. """
  171. pass
  172. @property
  173. def node_path(self):
  174. return self.browser_url_prefix + self.node_type
  175. @property
  176. def javascripts(self):
  177. return []
  178. @property
  179. def show_node(self):
  180. """
  181. Property to check whether to show the node for this module on the
  182. browser tree or not.
  183. Relies on show_node preference object, otherwise on the SHOW_ON_BROWSER
  184. default value.
  185. """
  186. if self.pref_show_node:
  187. return self.pref_show_node.get()
  188. else:
  189. return self.SHOW_ON_BROWSER
  190. @property
  191. def show_system_objects(self):
  192. """
  193. Show/Hide the system objects in the database server.
  194. """
  195. if self.pref_show_system_objects:
  196. return self.pref_show_system_objects.get()
  197. else:
  198. return False
  199. def register_preferences(self):
  200. """
  201. register_preferences
  202. Register preferences for this module.
  203. Keep the browser preference object to be used by overriden submodule,
  204. along with that get two browser level preferences show_system_objects,
  205. and show_node will be registered to used by the submodules.
  206. """
  207. # Add the node informaton for browser, not in respective node
  208. # preferences
  209. self.browser_preference = Preferences.module('browser')
  210. self.pref_show_system_objects = self.browser_preference.preference(
  211. 'show_system_objects'
  212. )
  213. self.pref_show_node = self.browser_preference.register(
  214. 'node', 'show_node_' + self.node_type,
  215. self.collection_label, 'node', self.SHOW_ON_BROWSER,
  216. category_label=gettext('Nodes')
  217. )
上海开阖软件有限公司 沪ICP备12045867号-1