Retire the Superset reader setup and the ATOMA dashboard (PD-13)

ATOMA's users use the Petrolyst app; Superset keeps admins, editors and the
app's embedded dashboards. Removed: the "ATOMA Reader" role and its rules
(petrolyst_reader.py, ReaderAccessMixin, reader.css, the head template, the
SQL-hiding patch), the atoma-reader mapping (it now maps to nothing in
Superset), the iframe allowance for the Map tab, and the "atoma" dashboard
with its Fleet/Map tab, D0 and dashboard.css. The bundle holds atoma-overview
and atoma-site only (byte-identical to before); the guest role keeps the
reader's 12 permissions in roles/atoma_guest.py. Brand files now name
petrolyst-web. SPEC marks the retired parts as history.

Checks (local): bundle checks pass; image rebuilt and healthy; import with
column drift 0 and unchanged embedding ids; the production config loads with
OAuth, embedding off, no reader hook; admin sees atoma-site with its tabs and
filter column; the app's browser tests pass 10/10. shellcheck not run (not
installed). Not deployed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Nasim SadatandClaude Opus 5.5 committed 2026-10-29 21:10:19 +01:00
1 parent 1b8e57adb4
commit da3f803947
22 files changed
+164 -702

No files matched your search

@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="89 671 1268 103" role="img" aria-label="Petrolyst">
<!-- Petrolyst's wordmark alone: petrolyst-ui/design/brand/02_Logo/Vector_Master/
<!-- Petrolyst's wordmark alone: petrolyst-web/design/brand/02_Logo/Vector_Master/
petrolyst_logo_standard_fullcolor_no_tagline.svg without the Y mark above it, paths and
colours unchanged, the viewBox cropped to the letters. The navbar logo (superset_config.py). -->

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="89 671 1268 103" role="img" aria-label="Petrolyst">
<!-- Petrolyst's wordmark alone: petrolyst-ui/design/brand/02_Logo/Vector_Master/
<!-- Petrolyst's wordmark alone: petrolyst-web/design/brand/02_Logo/Vector_Master/
petrolyst_logo_standard_white_no_tagline.svg without the Y mark above it, paths and
colours unchanged, the viewBox cropped to the letters. The navbar logo (superset_config.py). -->
<g fill="#FFFFFF"><path d="M 250.0,753.0 L 250.0,767.0 L 339.0,767.0 L 339.0,764.0 L 340.0,763.0 L 340.0,757.0 L 339.0,756.0 L 339.0,752.0 L 251.0,752.0 Z" fill="#FFFFFF" fill-rule="evenodd"/>

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

@@ -1,154 +0,0 @@
/* Readers only (petrolyst_reader.py, templates/head_custom_extra.html). Hides what Superset 6.1
shows whatever the permissions. Cosmetic: what protects is the role and the reader rules. */
/* The dashboard's title row: name, favourite, refresh, owner, last change, "…". */
[data-test="dashboard-header-container"] {
display: none !important;
}
/* ATOMA's Fleet tab: no filter column and its resize handle (no filter applies there); the
column is empty then, so the map takes the full width. Site details keeps it. Also hidden
until the dashboard's grid is there, so it does not flash up while the Fleet tab loads.
dashboards/atoma/build_bundle.py checks that this names the Fleet tab. */
body:has(.ant-tabs-tab-active[data-node-key="TAB-fleet"]) [data-test="dashboard-filters-panel"],
body:has(.ant-tabs-tab-active[data-node-key="TAB-fleet"]) div:has(+ [data-test="dashboard-filters-panel"]),
body:not(:has([data-test="grid-container"])) [data-test="dashboard-filters-panel"],
body:not(:has([data-test="grid-container"])) div:has(+ [data-test="dashboard-filters-panel"]) {
display: none !important;
}
/* Superset sizes blocks in pixels and measures again only about 0.3 s after loading, so the
map would start beside a column that is not there and then widen. Its block spans all 12
columns (build_bundle.py checks it), so the full width is always right. Its column grows to
the row's width; the blocks inside it follow.
Height: down to the window's bottom edge instead of the layout's 800 px. Above the block are
123 px (navbar, margin, tab row) and below it 16, so the map ends 32 px above the edge, as it
does from the sides. At least 592 px: the map's own minimum height, 560, and the padding. */
.grid-row > .dragdroppable-column:has(#MARKDOWN-fleet-map) {
flex-grow: 1;
}
#MARKDOWN-fleet-map > .resizable-container {
width: 100% !important;
max-width: 100% !important;
height: max(592px, 100vh - 139px) !important;
}
/* Navbar: "+" (new) and the theme switcher. */
li.ant-menu-submenu:has(> .ant-menu-submenu-title[data-menu-id$="-new-dropdown"]),
li.ant-menu-submenu:has(> .ant-menu-submenu-title[data-menu-id$="-theme-sub-menu"]) {
display: none !important;
}
/* Settings: Info and the About group (Superset's name and version); User → Logout remains. */
li.ant-menu-item[data-menu-id$="-info"],
li.ant-menu-item-group:has([data-menu-id$="-about-info"]),
li.ant-menu-item-divider:has(+ li.ant-menu-item-group [data-menu-id$="-about-info"]) {
display: none !important;
}
/* ATOMA's top-level tabs as a lens switch in the navbar, centred: Map and Insights (owner,
29 Oct). Pinned to the window, a scroll-linked animation moves it up as fast as the navbar
scrolls away. Without that support, or narrower than 900 px, the tab row stays in the page.
With the switch, the map's block grows by the tab row's 46 px: 93 px are left above and
below it. */
@supports (animation-timeline: scroll()) {
@media (min-width: 900px) {
#TABS-main > .ant-tabs-nav {
position: fixed;
top: 9px;
left: 50%;
transform: translateX(-50%);
z-index: 1000;
margin: 0;
padding: 4px;
border-radius: 12px;
background: rgba(11, 29, 51, 0.06);
animation: petrolyst-lens-scroll linear both;
animation-timeline: scroll(root block);
animation-range: 0 61px;
}
#TABS-main > .ant-tabs-nav::before,
#TABS-main > .ant-tabs-nav .ant-tabs-ink-bar,
#TABS-main > .ant-tabs-nav .anchor-link-container {
display: none;
}
#TABS-main > .ant-tabs-nav .ant-tabs-nav-list {
gap: 4px;
}
#TABS-main > .ant-tabs-nav .ant-tabs-tab {
margin: 0 !important;
padding: 7px 18px 7px 14px !important;
border-radius: 9px !important;
font-size: 15px;
font-weight: 600;
color: #3b4a5c;
}
#TABS-main > .ant-tabs-nav .ant-tabs-tab-active {
background: #0b1d33 !important;
}
#TABS-main > .ant-tabs-nav .ant-tabs-tab-active .ant-tabs-tab-btn {
color: #fff !important;
}
#TABS-main > .ant-tabs-nav [data-test="span-title"]::before {
content: "";
display: inline-block;
width: 18px;
height: 18px;
margin-right: 8px;
vertical-align: -3px;
background: currentColor;
-webkit-mask: var(--lens-icon) center / contain no-repeat;
mask: var(--lens-icon) center / contain no-repeat;
}
#TABS-main .ant-tabs-tab[data-node-key="TAB-fleet"] {
--lens-icon: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='black'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M9%204%203%206v14l6-2%206%202%206-2V4l-6%202-6-2z'/%3E%3Cpath%20d='M9%204v14M15%206v14'/%3E%3C/svg%3E");
}
#TABS-main .ant-tabs-tab[data-node-key="TAB-site"] {
--lens-icon: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='black'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M4%2020V10M10%2020V4M16%2020v-7M22%2020H2'/%3E%3C/svg%3E");
}
#MARKDOWN-fleet-map > .resizable-container {
height: max(592px, 100vh - 93px) !important;
}
/* A third lens, AI, as a teaser: greyed, tagged PRO, not a tab and not clickable (owner,
29 Oct; no AI lens is built until Botswerk exists). Drawn by the tab list itself, so the
dashboard's layout stays Map and Insights. From 1100 px only: narrower, the wider switch
would cover the logo. */
@media (min-width: 1100px) {
#TABS-main > .ant-tabs-nav .ant-tabs-nav-list::before {
content: "AI" / "AI, available with Petrolyst Pro";
order: 1;
display: flex;
align-items: center;
padding: 7px 58px 7px 40px;
border-radius: 9px;
font-size: 15px;
font-weight: 600;
line-height: 22px;
color: #8a96a3;
cursor: not-allowed;
background: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='%238a96a3'%20stroke-width='2'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%3Cpath%20d='M9.937%2015.5A2%202%200%200%200%208.5%2014.063l-6.135-1.582a.5.5%200%200%201%200-.962L8.5%209.936A2%202%200%200%200%209.937%208.5l1.582-6.135a.5.5%200%200%201%20.963%200L14.063%208.5A2%202%200%200%200%2015.5%209.937l6.135%201.581a.5.5%200%200%201%200%20.964L15.5%2014.063a2%202%200%200%200-1.437%201.437l-1.582%206.135a.5.5%200%200%201-.963%200z'/%3E%3Cpath%20d='M20%203v4M22%205h-4'/%3E%3C/svg%3E") 14px center / 18px 18px no-repeat;
}
#TABS-main > .ant-tabs-nav .ant-tabs-nav-list::after {
content: "PRO" / "";
position: absolute;
right: 14px;
top: 50%;
transform: translateY(-50%);
padding: 3px 7px;
border-radius: 999px;
background: #0f7b6c;
color: #fff;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.06em;
line-height: 1;
pointer-events: none;
}
}
}
}
@keyframes petrolyst-lens-scroll {
to {
transform: translate(-50%, -61px);
}
}