Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions pgmanage/app/migrations/0031_userdetails_show_system_catalogs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 4.2.23 on 2025-11-14 12:09

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0030_populate_mssql-technology'),
]

operations = [
migrations.AddField(
model_name='userdetails',
name='show_system_catalogs',
field=models.BooleanField(default=False),
),
]
1 change: 1 addition & 0 deletions pgmanage/app/models/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class UserDetails(models.Model):
pigz_path = models.CharField(max_length=256, null=True)
restore_tabs = models.BooleanField(default=True)
scroll_tree = models.BooleanField(default=True)
show_system_catalogs = models.BooleanField(default=False)

def get_pigz_path(self):

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,15 @@
</div>
</div>

<div class="row">
<div class="col-6">
<div class="form-check form-switch">
<input v-model="showSystemCatalogs" id="show_system_catalogs" type="checkbox" class="form-check-input" >
<label for="show_system_catalogs" class="form-check-label fw-bold mb-2">Show System Catalogs</label>
</div>
</div>
</div>

<div class="row">
<div class="form-group col-6">
<label for="date_format" class="fw-bold mb-2">Date format</label>
Expand Down Expand Up @@ -358,6 +367,14 @@ export default {
settingsStore.setScrollTree(value)
}
},
showSystemCatalogs: {
get() {
return settingsStore.showSystemCatalogs
},
set(value) {
settingsStore.setShowSystemCatalogs(value)
}
},
shortcuts() {
return settingsStore.shortcuts
},
Expand Down
6 changes: 6 additions & 0 deletions pgmanage/app/static/pgmanage_frontend/src/stores/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const useSettingsStore = defineStore("settings", {
shortcuts: {},
currentOS: "Unknown OS",
max_upload_size: "",
showSystemCatalogs: "",
}),
actions: {
async getSettings() {
Expand All @@ -43,6 +44,7 @@ const useSettingsStore = defineStore("settings", {
? "YYYY-MM-DD, HH:mm:ss"
: userSettings.date_format,
max_upload_size: userSettings.max_upload_size,
showSystemCatalogs: userSettings.show_system_catalogs,
});

this.shortcuts = Object.assign(
Expand Down Expand Up @@ -74,6 +76,7 @@ const useSettingsStore = defineStore("settings", {
pigz_path: this.pigzPath,
restore_tabs: this.restoreTabs,
scroll_tree: this.scrollTree,
show_system_catalogs: this.showSystemCatalogs,
},
});

Expand Down Expand Up @@ -121,6 +124,9 @@ const useSettingsStore = defineStore("settings", {
setScrollTree(value) {
this.scrollTree = value;
},
setShowSystemCatalogs(value) {
this.showSystemCatalogs = value;
},
showModal() {
Modal.getOrCreateInstance("#modal_settings", {
backdrop: "static",
Expand Down
23 changes: 21 additions & 2 deletions pgmanage/app/tests/test_postgresql12.py
Original file line number Diff line number Diff line change
Expand Up @@ -987,15 +987,34 @@ def test_get_schemas_postgresql_nosession(self):
response = self.client_nosession.post('/get_schemas_postgresql/')
assert 401 == response.status_code

def test_get_schemas_postgresql_session(self):
def test_get_schemas_postgresql_session_with_system_catalogs(self):
user = User.objects.get(username="admin")
user.userdetails.show_system_catalogs = True
user.userdetails.save()

response = self.client_session.post('/get_schemas_postgresql/', {'data': '{"database_index": 0, "workspace_id": 0}'})
assert 200 == response.status_code
data = json.loads(response.content.decode())
data = response.json()
assert self.lists_equal([a['name'] for a in data], [
'public',
'pg_catalog',
'information_schema'
])

def test_get_schemas_postgresql_session_without_system_catalogs(self):
user = User.objects.get(username="admin")
user.userdetails.show_system_catalogs = False
user.userdetails.save()

response = self.client_session.post('/get_schemas_postgresql/', {'data': '{"database_index": 0, "workspace_id": 0}'})
assert response.status_code == 200

data = json.loads(response.content.decode())

assert self.lists_equal(
[a['name'] for a in data],
['public']
)

def test_get_columns_postgresql_nosession(self):
response = self.client_nosession.post('/get_columns_postgresql/')
Expand Down
2 changes: 2 additions & 0 deletions pgmanage/app/views/tree_mariadb.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ def get_indexes_columns(request, database):
def get_databases(request, database):
try:
conn_object = Connection.objects.get(id=database.conn_id)
system_dbs = {"mysql", "information_schema", "performance_schema", "sys"}

databases = database.QueryDatabases()
list_databases = [
Expand All @@ -261,6 +262,7 @@ def get_databases(request, database):
"pinned": db[0] in conn_object.pinned_databases,
}
for db in databases.Rows
if request.user.userdetails.show_system_catalogs or db[0] not in system_dbs
]
except Exception as exc:
return JsonResponse(data={"data": str(exc)}, status=400)
Expand Down
6 changes: 6 additions & 0 deletions pgmanage/app/views/tree_mssql.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,14 @@ def get_tree_info(request, database):
@database_required(check_timeout=True, open_connection=True)
def get_databases(request, database):
list_databases = []
system_dbs = {"master", "model", "msdb", "tempdb"}

try:
conn_object = Connection.objects.get(id=database.conn_id)
databases = database.QueryDatabases()
for database_object in databases.Rows:
if not request.user.userdetails.show_system_catalogs and database_object[0] in system_dbs:
continue
database_data = {
"name": database_object[0],
"pinned": database_object[0] in conn_object.pinned_databases,
Expand All @@ -75,10 +78,13 @@ def get_databases(request, database):
@database_required(check_timeout=True, open_connection=True)
def get_schemas(request, database):
schemas_list = []
system_schemas = {"sys", "INFORMATION_SCHEMA"}

try:
schemas = database.QuerySchemas()
for schema in schemas.Rows:
if not request.user.userdetails.show_system_catalogs and schema["schema_name"] in system_schemas:
continue
schema_data = {
"name": schema["schema_name"],
}
Expand Down
2 changes: 2 additions & 0 deletions pgmanage/app/views/tree_mysql.py
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,7 @@ def get_indexes_columns(request, database):
def get_databases(request, database):
try:
conn_object = Connection.objects.get(id=database.conn_id)
system_dbs = {"mysql", "information_schema", "performance_schema", "sys"}

databases = database.QueryDatabases()
list_databases = [
Expand All @@ -290,6 +291,7 @@ def get_databases(request, database):
"pinned": db[0] in conn_object.pinned_databases,
}
for db in databases.Rows
if request.user.userdetails.show_system_catalogs or db[0] not in system_dbs
]
except Exception as exc:
return JsonResponse(data={"data": str(exc)}, status=400)
Expand Down
4 changes: 3 additions & 1 deletion pgmanage/app/views/tree_postgresql.py
Original file line number Diff line number Diff line change
Expand Up @@ -817,10 +817,12 @@ def get_mview_definition(request, database):
@database_required(check_timeout=True, open_connection=True)
def get_schemas(request, database):
schemas_list = []

system_schemas = {"information_schema", "pg_catalog"}
try:
schemas = database.QuerySchemas()
for schema in schemas.Rows:
if not request.user.userdetails.show_system_catalogs and schema["schema_name"] in system_schemas:
continue
schema_data = {
"name": schema["schema_name"],
"oid": schema["oid"],
Expand Down