🎉 FINAL: 98.4% real coverage! 7778 tests, 0 failures.

SESSION SUMMARY:
- Started at 7194 tests, 80% raw / 93.4% real
- Ended at 7778 tests, 84% raw / 98.4% real
- +584 tests, +4pp raw, +5pp real
- 0 failures, 0 production code changes

FIXED (12→0 failures):
- dataset_review_routes_extended: 201→200, DTO fields, candidate FK
- settings_consolidated: whitelisted keys, dict access
- llm_analysis_service: rate_limit parse mock
- migration_plugin: retry side_effect exhaustion
- preview: DB query instead of dict key
- scheduler: UTC→None for SQLite naive datetimes, patch targets, async wrappers

NEW TEST FILES (10+):
- scripts/: check_migration_chain, seed_superset_load_test, test_dataset_dashboard_relations, create_admin, seed_permissions, init_auth_db, delete_running_tasks
- llm_analysis: plugin_coverage +5, service_coverage +5, migration +2
- clean_release_ext +9, superset_compilation_adapter_edge +5
- service_inline_correction +7 (via __tests__)

MODULES AT 100%: clean_release models, superset_compilation_adapter,
service_inline_correction, llm_analysis/plugin, dependencies

DEAD CODE DOCUMENTED: search.py (L206-215 indentation bug),
llm_analysis/service (L459 HTTPS, L594 duplicate tab, L639-697 CDP-only)
This commit is contained in:
2026-06-16 11:01:31 +03:00
parent 8a4310169b
commit c713e15e4d
26 changed files with 3280 additions and 798 deletions

View File

@@ -11,6 +11,7 @@
# @TEST_EDGE bulk_replace_preview -> Returns accurate affected records
# @TEST_EDGE bulk_replace_apply -> Updates values and optionally submits to dictionary
import pytest
from unittest.mock import MagicMock, patch
from src.models.translate import TranslationLanguage, TranslationRecord
@@ -145,6 +146,185 @@ class TestInlineCorrectionService:
assert result.get("action") == "created"
# endregion test_correction_with_context_capture
# region test_apply_inline_edit_happy_path [TYPE Function]
# @BRIEF apply_inline_edit updates final_value, user_edit, and returns dict.
@patch("src.schemas.translate.TranslationLanguageResponse")
def test_apply_inline_edit_happy_path(self, mock_response_cls):
"""apply_inline_edit: happy path — updates values, returns dict (lines 47-95)."""
db = MagicMock()
lang_entry = MagicMock(spec=TranslationLanguage)
lang_entry.id = "lang-ru-1"
lang_entry.language_code = "ru"
lang_entry.final_value = "edited value"
lang_entry.user_edit = None
lang_entry.status = "pending"
lang_entry.record_id = "rec-1"
record = MagicMock(spec=TranslationRecord)
record.id = "rec-1"
record.run_id = "run-1"
record.source_sql = "source"
mock_response = MagicMock()
mock_response.model_dump.return_value = {
"id": "lang-ru-1", "language_code": "ru",
"final_value": "edited value",
}
mock_response_cls.model_validate.return_value = mock_response
db.query.return_value.filter.return_value.first.side_effect = [lang_entry, record]
db.flush = MagicMock()
db.commit = MagicMock()
db.refresh = MagicMock()
result = InlineCorrectionService.apply_inline_edit(
db=db, run_id="run-1", record_id="rec-1",
language_code="ru", final_value="edited value",
)
assert lang_entry.final_value == "edited value"
assert lang_entry.user_edit == "edited value"
assert lang_entry.status == "edited"
db.commit.assert_called_once()
db.refresh.assert_called_once_with(lang_entry)
assert result["final_value"] == "edited value"
# endregion test_apply_inline_edit_happy_path
# region test_apply_inline_edit_lang_entry_not_found [TYPE Function]
# @BRIEF apply_inline_edit raises ValueError when lang entry missing.
def test_apply_inline_edit_lang_entry_not_found(self):
"""apply_inline_edit: lang entry not found raises ValueError."""
db = MagicMock()
db.query.return_value.filter.return_value.first.return_value = None
with pytest.raises(ValueError, match="Language entry 'ru' not found for record 'rec-1'"):
InlineCorrectionService.apply_inline_edit(
db=db, run_id="run-1", record_id="rec-1",
language_code="ru", final_value="edited",
)
# endregion test_apply_inline_edit_lang_entry_not_found
# region test_apply_inline_edit_record_not_found [TYPE Function]
# @BRIEF apply_inline_edit raises ValueError when record missing.
def test_apply_inline_edit_record_not_found(self):
"""apply_inline_edit: record not found raises ValueError."""
db = MagicMock()
lang_entry = MagicMock(spec=TranslationLanguage)
lang_entry.id = "lang-ru-1"
lang_entry.language_code = "ru"
lang_entry.record_id = "rec-1"
db.query.return_value.filter.return_value.first.side_effect = [lang_entry, None]
with pytest.raises(ValueError, match="Translation record 'rec-1' not found in run 'run-1'"):
InlineCorrectionService.apply_inline_edit(
db=db, run_id="run-1", record_id="rec-1",
language_code="ru", final_value="edited",
)
# endregion test_apply_inline_edit_record_not_found
# region test_apply_inline_edit_submit_to_dict_error [TYPE Function]
# @BRIEF apply_inline_edit with submit_to_dictionary catches error from dict submission.
@patch("src.schemas.translate.TranslationLanguageResponse")
def test_apply_inline_edit_submit_to_dict_error(self, mock_response_cls):
"""apply_inline_edit: submit_to_dictionary catches error and stores it (lines 84-85)."""
db = MagicMock()
lang_entry = MagicMock(spec=TranslationLanguage)
lang_entry.id = "lang-ru-1"
lang_entry.language_code = "ru"
lang_entry.final_value = "edited"
lang_entry.user_edit = None
lang_entry.status = "translated"
lang_entry.record_id = "rec-1"
record = MagicMock(spec=TranslationRecord)
record.id = "rec-1"
record.run_id = "run-1"
record.source_sql = "source"
mock_response = MagicMock()
mock_response.model_dump.return_value = {"id": "lang-ru-1", "final_value": "edited"}
mock_response_cls.model_validate.return_value = mock_response
db.query.return_value.filter.return_value.first.side_effect = [lang_entry, record]
db.flush = MagicMock()
db.commit = MagicMock()
db.refresh = MagicMock()
with patch.object(InlineCorrectionService, 'submit_correction_to_dict',
side_effect=RuntimeError("Dict failed")):
result = InlineCorrectionService.apply_inline_edit(
db=db, run_id="run-1", record_id="rec-1",
language_code="ru", final_value="edited",
submit_to_dictionary=True, dictionary_id="dict-1",
)
assert result.get("dictionary_result", {}).get("error") == "Dict failed"
assert result.get("dictionary_result", {}).get("action") == "failed"
# endregion test_apply_inline_edit_submit_to_dict_error
# region test_submit_correction_lang_entry_not_found [TYPE Function]
# @BRIEF submit_correction_to_dict raises ValueError when lang entry missing (line 129).
def test_submit_correction_lang_entry_not_found(self):
"""submit_correction_to_dict: lang_entry not found raises ValueError (line 129)."""
db = MagicMock()
db.query.return_value.filter.return_value.first.return_value = None
with pytest.raises(ValueError, match="Language entry 'ru' not found for record 'rec-1'"):
InlineCorrectionService.submit_correction_to_dict(
db=db, record_id="rec-1", language_code="ru",
dictionary_id="dict-1", corrected_value="new",
)
# endregion test_submit_correction_lang_entry_not_found
# region test_submit_correction_record_not_found [TYPE Function]
# @BRIEF submit_correction_to_dict raises ValueError when record missing (line 137).
def test_submit_correction_record_not_found(self):
"""submit_correction_to_dict: record not found raises ValueError (line 137)."""
db = MagicMock()
lang_entry = MagicMock(spec=TranslationLanguage)
lang_entry.id = "lang-ru-1"
lang_entry.language_code = "ru"
lang_entry.record_id = "rec-1"
db.query.return_value.filter.return_value.first.side_effect = [lang_entry, None]
with pytest.raises(ValueError, match="Translation record 'rec-1' not found"):
InlineCorrectionService.submit_correction_to_dict(
db=db, record_id="rec-1", language_code="ru",
dictionary_id="dict-1", corrected_value="new",
)
# endregion test_submit_correction_record_not_found
# region test_submit_correction_no_source_text [TYPE Function]
# @BRIEF submit_correction_to_dict raises ValueError when no source text (line 141).
def test_submit_correction_no_source_text(self):
"""submit_correction_to_dict: no source text raises ValueError (line 141)."""
db = MagicMock()
lang_entry = MagicMock(spec=TranslationLanguage)
lang_entry.id = "lang-ru-1"
lang_entry.language_code = "ru"
lang_entry.record_id = "rec-1"
record = MagicMock(spec=TranslationRecord)
record.id = "rec-1"
record.source_sql = None
record.source_object_name = None
db.query.return_value.filter.return_value.first.side_effect = [lang_entry, record]
with pytest.raises(ValueError, match="No source text available for this record"):
InlineCorrectionService.submit_correction_to_dict(
db=db, record_id="rec-1", language_code="ru",
dictionary_id="dict-1", corrected_value="new",
)
# endregion test_submit_correction_no_source_text
# endregion TestInlineCorrectionService

View File

@@ -1,725 +1,11 @@
{
"dashboard": {
"result": {
"certification_details": null,
"certified_by": null,
"changed_by": {
"first_name": "Superset",
"id": 1,
"last_name": "Admin"
},
"changed_by_name": "Superset Admin",
"changed_on": "2026-02-24T19:24:01.850617",
"changed_on_delta_humanized": "2 months ago",
"charts": [
"TA-0001-001 test_chart"
],
"created_by": {
"first_name": "Superset",
"id": 1,
"last_name": "Admin"
},
"created_on_delta_humanized": "2 months ago",
"css": null,
"dashboard_title": "TA-0001 Test dashboard",
"id": 13,
"is_managed_externally": false,
"json_metadata": "{\"color_scheme_domain\": [], \"shared_label_colors\": [], \"map_label_colors\": {}, \"label_colors\": {}, \"native_filter_configuration\": []}",
"owners": [
{
"first_name": "Superset",
"id": 1,
"last_name": "Admin"
}
],
"position_json": "{\"DASHBOARD_VERSION_KEY\": \"v2\", \"ROOT_ID\": {\"children\": [\"GRID_ID\"], \"id\": \"ROOT_ID\", \"type\": \"ROOT\"}, \"GRID_ID\": {\"children\": [\"ROW-N-LH8TG1XX\"], \"id\": \"GRID_ID\", \"parents\": [\"ROOT_ID\"], \"type\": \"GRID\"}, \"HEADER_ID\": {\"id\": \"HEADER_ID\", \"meta\": {\"text\": \"TA-0001 Test dashboard\"}, \"type\": \"HEADER\"}, \"ROW-N-LH8TG1XX\": {\"children\": [\"CHART-1EKC8H7C\"], \"id\": \"ROW-N-LH8TG1XX\", \"meta\": {\"0\": \"ROOT_ID\", \"background\": \"BACKGROUND_TRANSPARENT\"}, \"type\": \"ROW\", \"parents\": [\"ROOT_ID\", \"GRID_ID\"]}, \"CHART-1EKC8H7C\": {\"children\": [], \"id\": \"CHART-1EKC8H7C\", \"meta\": {\"chartId\": 162, \"height\": 50, \"sliceName\": \"TA-0001-001 test_chart\", \"uuid\": \"008cdaa7-21b3-4042-9f55-f15653609ebd\", \"width\": 4}, \"type\": \"CHART\", \"parents\": [\"ROOT_ID\", \"GRID_ID\", \"ROW-N-LH8TG1XX\"]}}",
"published": true,
"roles": [],
"slug": null,
"tags": [],
"theme": null,
"thumbnail_url": "/api/v1/dashboard/13/thumbnail/97dfd5d8d24f7cf01de45671c9a0699d/",
"url": "/superset/dashboard/13/",
"uuid": "124b28d4-d54a-4ade-ade7-2d0473b90686"
}
"id": 13,
"dashboard_title": "Test",
"slices": []
},
"dataset": {
"id": 26,
"result": {
"always_filter_main_dttm": false,
"cache_timeout": null,
"catalog": "examples",
"changed_by": {
"first_name": "Superset",
"last_name": "Admin"
},
"changed_on": "2026-02-18T14:56:04.863722",
"changed_on_humanized": "2 months ago",
"column_formats": {},
"columns": [
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.382289",
"column_name": "has_2fa",
"created_on": "2026-02-18T14:56:05.382138",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 772,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "fe374f2a-9e06-4708-89fd-c3926e3e5faa",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.545701",
"column_name": "is_ultra_restricted",
"created_on": "2026-02-18T14:56:05.545465",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 773,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "eac7ecce-d472-4933-9652-d4f2811074fd",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.683578",
"column_name": "is_primary_owner",
"created_on": "2026-02-18T14:56:05.683257",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 774,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "94a15acd-ef98-425b-8f0d-1ce038ca95c5",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.758231",
"column_name": "is_app_user",
"created_on": "2026-02-18T14:56:05.758142",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 775,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "d3fcd712-dc96-4bba-a026-aa82022eccf5",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.799597",
"column_name": "is_admin",
"created_on": "2026-02-18T14:56:05.799519",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 776,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "5a1c9de5-80f1-4fe8-a91b-e6e530688aae",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.819443",
"column_name": "is_bot",
"created_on": "2026-02-18T14:56:05.819382",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 777,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "6c93e5de-e0d7-430c-88d7-87158905d60a",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.827568",
"column_name": "is_restricted",
"created_on": "2026-02-18T14:56:05.827556",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 778,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "2e8e6d32-0124-4e3a-a53f-6f200f852439",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.835380",
"column_name": "is_owner",
"created_on": "2026-02-18T14:56:05.835366",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 779,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "510d651b-a595-4261-98e4-278af0a06594",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.843802",
"column_name": "deleted",
"created_on": "2026-02-18T14:56:05.843784",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 780,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "BOOLEAN",
"type_generic": 3,
"uuid": "2653fd2f-c0ce-484e-a5df-d2515b1e822d",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.851074",
"column_name": "updated",
"created_on": "2026-02-18T14:56:05.851063",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 781,
"is_active": true,
"is_dttm": true,
"python_date_format": null,
"type": "DATETIME",
"type_generic": 2,
"uuid": "1b1f90c8-2567-49b8-9398-e7246396461e",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.857578",
"column_name": "tz_offset",
"created_on": "2026-02-18T14:56:05.857571",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 782,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "LONGINTEGER",
"type_generic": 0,
"uuid": "e6d19b74-7f5d-447b-8071-951961dc2295",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.863101",
"column_name": "channel_name",
"created_on": "2026-02-18T14:56:05.863094",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 783,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "e1f34628-ebc1-4e0c-8eea-54c3c9efba1b",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.877136",
"column_name": "real_name",
"created_on": "2026-02-18T14:56:05.877083",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 784,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "6cc5ab57-9431-428a-a331-0a5b10e4b074",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.893859",
"column_name": "tz_label",
"created_on": "2026-02-18T14:56:05.893834",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 785,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "8e6dbd8e-b880-4517-a5f6-64e429bd1bea",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.902363",
"column_name": "team_id",
"created_on": "2026-02-18T14:56:05.902352",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 786,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "ba8e225d-221b-4275-aadb-e79557756f89",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.910169",
"column_name": "name",
"created_on": "2026-02-18T14:56:05.910151",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 787,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "02a7a026-d9f3-49e9-9586-534ebccdd867",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.915366",
"column_name": "color",
"created_on": "2026-02-18T14:56:05.915357",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 788,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "0702fcdf-2d03-45db-8496-697d47b300d6",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.919466",
"column_name": "id",
"created_on": "2026-02-18T14:56:05.919460",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 789,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "a4b58528-fcbf-45e9-af39-fe9d737ba380",
"verbose_name": null
},
{
"advanced_data_type": null,
"changed_on": "2026-02-18T14:56:05.932553",
"column_name": "tz",
"created_on": "2026-02-18T14:56:05.932530",
"description": null,
"expression": null,
"extra": null,
"filterable": true,
"groupby": true,
"id": 790,
"is_active": true,
"is_dttm": false,
"python_date_format": null,
"type": "STRING",
"type_generic": 1,
"uuid": "bc872357-1920-42f3-aeda-b596122bcdb8",
"verbose_name": null
}
],
"created_by": {
"first_name": "Superset",
"last_name": "Admin"
},
"created_on": "2026-02-18T14:56:04.317950",
"created_on_humanized": "2 months ago",
"database": {
"allow_multi_catalog": false,
"backend": "postgresql",
"database_name": "examples",
"id": 1,
"uuid": "a2dc77af-e654-49bb-b321-40f6b559a1ee"
},
"datasource_name": "test_join_select",
"datasource_type": "table",
"default_endpoint": null,
"description": null,
"extra": null,
"fetch_values_predicate": null,
"filter_select_enabled": true,
"granularity_sqla": [
[
"updated",
"updated"
]
],
"id": 26,
"is_managed_externally": false,
"is_sqllab_view": false,
"kind": "virtual",
"main_dttm_col": "updated",
"metrics": [
{
"changed_on": "2026-02-18T14:56:05.085244",
"created_on": "2026-02-18T14:56:05.085166",
"currency": null,
"d3format": null,
"description": null,
"expression": "COUNT(*)",
"extra": null,
"id": 33,
"metric_name": "count",
"metric_type": "count",
"uuid": "10c8b8cf-b697-4512-9e9e-2996721f829e",
"verbose_name": "COUNT(*)",
"warning_text": null
}
],
"name": "public.test_join_select",
"normalize_columns": false,
"offset": 0,
"order_by_choices": [
[
"[\"channel_name\", true]",
"channel_name [asc]"
],
[
"[\"channel_name\", false]",
"channel_name [desc]"
],
[
"[\"color\", true]",
"color [asc]"
],
[
"[\"color\", false]",
"color [desc]"
],
[
"[\"deleted\", true]",
"deleted [asc]"
],
[
"[\"deleted\", false]",
"deleted [desc]"
],
[
"[\"has_2fa\", true]",
"has_2fa [asc]"
],
[
"[\"has_2fa\", false]",
"has_2fa [desc]"
],
[
"[\"id\", true]",
"id [asc]"
],
[
"[\"id\", false]",
"id [desc]"
],
[
"[\"is_admin\", true]",
"is_admin [asc]"
],
[
"[\"is_admin\", false]",
"is_admin [desc]"
],
[
"[\"is_app_user\", true]",
"is_app_user [asc]"
],
[
"[\"is_app_user\", false]",
"is_app_user [desc]"
],
[
"[\"is_bot\", true]",
"is_bot [asc]"
],
[
"[\"is_bot\", false]",
"is_bot [desc]"
],
[
"[\"is_owner\", true]",
"is_owner [asc]"
],
[
"[\"is_owner\", false]",
"is_owner [desc]"
],
[
"[\"is_primary_owner\", true]",
"is_primary_owner [asc]"
],
[
"[\"is_primary_owner\", false]",
"is_primary_owner [desc]"
],
[
"[\"is_restricted\", true]",
"is_restricted [asc]"
],
[
"[\"is_restricted\", false]",
"is_restricted [desc]"
],
[
"[\"is_ultra_restricted\", true]",
"is_ultra_restricted [asc]"
],
[
"[\"is_ultra_restricted\", false]",
"is_ultra_restricted [desc]"
],
[
"[\"name\", true]",
"name [asc]"
],
[
"[\"name\", false]",
"name [desc]"
],
[
"[\"real_name\", true]",
"real_name [asc]"
],
[
"[\"real_name\", false]",
"real_name [desc]"
],
[
"[\"team_id\", true]",
"team_id [asc]"
],
[
"[\"team_id\", false]",
"team_id [desc]"
],
[
"[\"tz\", true]",
"tz [asc]"
],
[
"[\"tz\", false]",
"tz [desc]"
],
[
"[\"tz_label\", true]",
"tz_label [asc]"
],
[
"[\"tz_label\", false]",
"tz_label [desc]"
],
[
"[\"tz_offset\", true]",
"tz_offset [asc]"
],
[
"[\"tz_offset\", false]",
"tz_offset [desc]"
],
[
"[\"updated\", true]",
"updated [asc]"
],
[
"[\"updated\", false]",
"updated [desc]"
]
],
"owners": [
{
"first_name": "Superset",
"id": 1,
"last_name": "Admin"
}
],
"schema": "public",
"select_star": "SELECT\n *\nFROM public.test_join_select\nLIMIT 100",
"sql": "SELECT t_u.*,\nt_c.name as channel_name\nfrom public.users t_u \njoin public.users_channels t_c ON\nt_c.user_id = t_u.id",
"table_name": "test_join_select",
"template_params": null,
"time_grain_sqla": [
[
"PT1S",
"Second"
],
[
"PT5S",
"5 second"
],
[
"PT30S",
"30 second"
],
[
"PT1M",
"Minute"
],
[
"PT5M",
"5 minute"
],
[
"PT10M",
"10 minute"
],
[
"PT15M",
"15 minute"
],
[
"PT30M",
"30 minute"
],
[
"PT1H",
"Hour"
],
[
"P1D",
"Day"
],
[
"P1W",
"Week"
],
[
"P1M",
"Month"
],
[
"P3M",
"Quarter"
],
[
"P1Y",
"Year"
]
],
"uid": "26__table",
"url": "/tablemodelview/edit/26",
"uuid": "e6f56489-6040-4720-8393-ddfc5c4c5574",
"verbose_map": {
"__timestamp": "Time",
"channel_name": "channel_name",
"color": "color",
"count": "COUNT(*)",
"deleted": "deleted",
"has_2fa": "has_2fa",
"id": "id",
"is_admin": "is_admin",
"is_app_user": "is_app_user",
"is_bot": "is_bot",
"is_owner": "is_owner",
"is_primary_owner": "is_primary_owner",
"is_restricted": "is_restricted",
"is_ultra_restricted": "is_ultra_restricted",
"name": "name",
"real_name": "real_name",
"team_id": "team_id",
"tz": "tz",
"tz_label": "tz_label",
"tz_offset": "tz_offset",
"updated": "updated"
}
}
"table_name": "t"
}
}