Skip to content

Commit

Permalink
Fix/authenticated datasets access (#1210)
Browse files Browse the repository at this point in the history
* Show status of dataset on tile.

* Fixed bug where logged in user could not see
authenticated dataset.
Added chip to dataset tile showing access status.

* Fixed bug where logged in user could not see
public dataset.

* Default status to blank when dataset is authenticated.
  • Loading branch information
lmarini authored Nov 11, 2024
1 parent 700aeb1 commit 76f5353
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 49 deletions.
56 changes: 32 additions & 24 deletions backend/app/routers/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
)
from beanie import PydanticObjectId
from beanie.operators import And, Or
from bson import ObjectId, json_util
from bson import json_util
from elasticsearch import Elasticsearch
from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
from fastapi.responses import StreamingResponse
Expand Down Expand Up @@ -557,33 +557,41 @@ async def get_freeze_datasets(
skip: int = 0,
limit: int = 10,
user=Depends(get_current_user),
fs: Minio = Depends(dependencies.get_fs),
es: Elasticsearch = Depends(dependencies.get_elasticsearchclient),
allow: bool = Depends(Authorization("owner")),
authenticated: bool = Depends(CheckStatus("AUTHENTICATED")),
public: bool = Depends(CheckStatus("PUBLIC")),
admin=Depends(get_admin),
admin_mode: bool = Depends(get_admin_mode),
viewer: bool = Depends(Authorization("viewer")),
):
frozen_datasets_and_count = (
await DatasetFreezeDB.find(
DatasetFreezeDB.origin_id == PydanticObjectId(dataset_id)
if authenticated or public or (admin and admin_mode) or viewer:
frozen_datasets_and_count = (
await DatasetFreezeDB.find(
DatasetFreezeDB.origin_id == PydanticObjectId(dataset_id)
)
.aggregate(
[
_get_page_query(
skip, limit, sort_field="frozen_version_num", ascending=False
)
],
)
.to_list()
)
.aggregate(
[
_get_page_query(
skip, limit, sort_field="frozen_version_num", ascending=False
)

page_metadata = _construct_page_metadata(frozen_datasets_and_count, skip, limit)
page = Paged(
metadata=page_metadata,
data=[
DatasetFreezeOut(id=item.pop("_id"), **item)
for item in frozen_datasets_and_count[0]["data"]
],
)
.to_list()
)

page_metadata = _construct_page_metadata(frozen_datasets_and_count, skip, limit)
page = Paged(
metadata=page_metadata,
data=[
DatasetFreezeOut(id=item.pop("_id"), **item)
for item in frozen_datasets_and_count[0]["data"]
],
)
return page.dict()
return page.dict()
else:
raise HTTPException(
status_code=403,
detail=f"User {user} does not have access to view freeze list for dataset {dataset_id}",
)


@router.get("/{dataset_id}/freeze/latest_version_num", response_model=int)
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/components/Explore.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,10 @@ export const Explore = (): JSX.Element => {
created={dataset.created}
description={dataset.description}
thumbnailId={dataset.thumbnail_id}
publicView={false}
frozen={dataset.frozen}
frozenVersionNum={dataset.frozen_version_num}
status={dataset.status}
/>
</Grid>
);
Expand Down
1 change: 1 addition & 0 deletions frontend/src/components/Public.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ export const Public = (): JSX.Element => {
publicView={true}
frozen={dataset.frozen}
frozenVersionNum={dataset.frozen_version_num}
status={dataset.status}
/>
</Grid>
);
Expand Down
41 changes: 30 additions & 11 deletions frontend/src/components/datasets/DatasetCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
import { Download } from "@mui/icons-material";
import { generateThumbnailUrl } from "../../utils/visualization";
import config from "../../app.config";
import Chip from "@mui/material/Chip";

type DatasetCardProps = {
id?: string;
Expand All @@ -24,8 +25,9 @@ type DatasetCardProps = {
description?: string;
thumbnailId?: string;
publicView?: boolean | false;
frozen?: string;
frozen?: boolean;
frozenVersionNum?: number;
status?: string;
};

export default function DatasetCard(props: DatasetCardProps) {
Expand All @@ -39,6 +41,7 @@ export default function DatasetCard(props: DatasetCardProps) {
publicView,
frozen,
frozenVersionNum,
status,
} = props;

const [thumbnailUrl, setThumbnailUrl] = useState("");
Expand Down Expand Up @@ -130,16 +133,32 @@ export default function DatasetCard(props: DatasetCardProps) {
<Download />
</IconButton>
</Tooltip>
{/*<Tooltip title="Favorite">*/}
{/* <IconButton color="primary" aria-label="favorite" sx={{mr: 3}} disabled>*/}
{/* <Favorite/>*/}
{/* </IconButton>*/}
{/*</Tooltip>*/}
{/*<Tooltip title="Share">*/}
{/* <IconButton color="primary" aria-label="share" sx={{mr: 3}} disabled>*/}
{/* <Share/>*/}
{/* </IconButton>*/}
{/*</Tooltip>*/}
{(() => {
switch (status) {
case "PUBLIC":
return (
<Tooltip title="Anyone on the internet can access this dataset">
<Chip
label={status?.toLowerCase()}
color="primary"
size="small"
/>
</Tooltip>
);
case "PRIVATE":
return (
<Tooltip title="Only users given specific permissions can access this dataset">
<Chip
label={status?.toLowerCase()}
color="primary"
size="small"
/>
</Tooltip>
);
default:
return null;
}
})()}
</CardActions>
</Card>
);
Expand Down
28 changes: 14 additions & 14 deletions frontend/src/components/datasets/PublicDatasetCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import { Download } from "@mui/icons-material";
import { generateThumbnailUrl } from "../../utils/visualization";
import config from "../../app.config";
// import {Favorite, Share} from "@material-ui/icons";
import PublicIcon from "@mui/icons-material/Public";
import Chip from "@mui/material/Chip";

type PublicDatasetCardProps = {
id?: string;
Expand All @@ -27,11 +29,20 @@ type PublicDatasetCardProps = {
publicView?: boolean | false;
frozen?: boolean | false;
frozenVersionNum?: number;
status?: string;
};

export default function PublicDatasetCard(props: PublicDatasetCardProps) {
const { id, name, author, created, description, thumbnailId, publicView } =
props;
const {
id,
name,
author,
created,
description,
thumbnailId,
publicView,
status,
} = props;

const [thumbnailUrl, setThumbnailUrl] = useState("");

Expand Down Expand Up @@ -111,27 +122,16 @@ export default function PublicDatasetCard(props: PublicDatasetCardProps) {
</CardContent>
</CardActionArea>
)}
<CardActions sx={{ pb: 0, justifyContent: "space-between" }}>
<CardActions sx={{ pb: 0, pr: 0 }}>
<Tooltip title="Download">
<IconButton
href={`${config.hostname}/api/v2/public_datasets/${id}/download`}
color="primary"
aria-label="download"
sx={{ mr: 3 }}
>
<Download />
</IconButton>
</Tooltip>
{/*<Tooltip title="Favorite">*/}
{/* <IconButton color="primary" aria-label="favorite" sx={{mr: 3}} disabled>*/}
{/* <Favorite/>*/}
{/* </IconButton>*/}
{/*</Tooltip>*/}
{/*<Tooltip title="Share">*/}
{/* <IconButton color="primary" aria-label="share" sx={{mr: 3}} disabled>*/}
{/* <Share/>*/}
{/* </IconButton>*/}
{/*</Tooltip>*/}
</CardActions>
</Card>
);
Expand Down

0 comments on commit 76f5353

Please sign in to comment.