mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Moved Resource defaults to datasette/resources.py
This commit is contained in:
parent
9e5c64c3de
commit
3663b9df2d
4 changed files with 75 additions and 67 deletions
|
|
@ -1359,7 +1359,7 @@ class Datasette:
|
||||||
This is efficient - it does NOT call allowed_resources() and check membership.
|
This is efficient - it does NOT call allowed_resources() and check membership.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
from datasette.default_actions import TableResource
|
from datasette.resources import TableResource
|
||||||
can_view = await datasette.allowed(
|
can_view = await datasette.allowed(
|
||||||
"view-table",
|
"view-table",
|
||||||
TableResource(database="analytics", table="users"),
|
TableResource(database="analytics", table="users"),
|
||||||
|
|
|
||||||
|
|
@ -1,69 +1,11 @@
|
||||||
from datasette import hookimpl
|
from datasette import hookimpl
|
||||||
from datasette.permissions import Action, Resource
|
from datasette.permissions import Action
|
||||||
from typing import Optional
|
from datasette.resources import (
|
||||||
|
InstanceResource,
|
||||||
|
DatabaseResource,
|
||||||
class InstanceResource(Resource):
|
TableResource,
|
||||||
"""The Datasette instance itself."""
|
QueryResource,
|
||||||
|
)
|
||||||
name = "instance"
|
|
||||||
parent_name = None
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__(parent=None, child=None)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def resources_sql(cls) -> str:
|
|
||||||
return "SELECT NULL AS parent, NULL AS child"
|
|
||||||
|
|
||||||
|
|
||||||
class DatabaseResource(Resource):
|
|
||||||
"""A database in Datasette."""
|
|
||||||
|
|
||||||
name = "database"
|
|
||||||
parent_name = "instance"
|
|
||||||
|
|
||||||
def __init__(self, database: str):
|
|
||||||
super().__init__(parent=database, child=None)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def resources_sql(cls) -> str:
|
|
||||||
return """
|
|
||||||
SELECT database_name AS parent, NULL AS child
|
|
||||||
FROM catalog_databases
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class TableResource(Resource):
|
|
||||||
"""A table in a database."""
|
|
||||||
|
|
||||||
name = "table"
|
|
||||||
parent_name = "database"
|
|
||||||
|
|
||||||
def __init__(self, database: str, table: str):
|
|
||||||
super().__init__(parent=database, child=table)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def resources_sql(cls) -> str:
|
|
||||||
return """
|
|
||||||
SELECT database_name AS parent, table_name AS child
|
|
||||||
FROM catalog_tables
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class QueryResource(Resource):
|
|
||||||
"""A canned query in a database."""
|
|
||||||
|
|
||||||
name = "query"
|
|
||||||
parent_name = "database"
|
|
||||||
|
|
||||||
def __init__(self, database: str, query: str):
|
|
||||||
super().__init__(parent=database, child=query)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def resources_sql(cls) -> str:
|
|
||||||
# TODO: Need catalog for queries
|
|
||||||
return "SELECT NULL AS parent, NULL AS child WHERE 0"
|
|
||||||
|
|
||||||
|
|
||||||
@hookimpl
|
@hookimpl
|
||||||
|
|
|
||||||
66
datasette/resources.py
Normal file
66
datasette/resources.py
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
"""Core resource types for Datasette's permission system."""
|
||||||
|
|
||||||
|
from datasette.permissions import Resource
|
||||||
|
|
||||||
|
|
||||||
|
class InstanceResource(Resource):
|
||||||
|
"""The Datasette instance itself."""
|
||||||
|
|
||||||
|
name = "instance"
|
||||||
|
parent_name = None
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__(parent=None, child=None)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resources_sql(cls) -> str:
|
||||||
|
return "SELECT NULL AS parent, NULL AS child"
|
||||||
|
|
||||||
|
|
||||||
|
class DatabaseResource(Resource):
|
||||||
|
"""A database in Datasette."""
|
||||||
|
|
||||||
|
name = "database"
|
||||||
|
parent_name = "instance"
|
||||||
|
|
||||||
|
def __init__(self, database: str):
|
||||||
|
super().__init__(parent=database, child=None)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resources_sql(cls) -> str:
|
||||||
|
return """
|
||||||
|
SELECT database_name AS parent, NULL AS child
|
||||||
|
FROM catalog_databases
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TableResource(Resource):
|
||||||
|
"""A table in a database."""
|
||||||
|
|
||||||
|
name = "table"
|
||||||
|
parent_name = "database"
|
||||||
|
|
||||||
|
def __init__(self, database: str, table: str):
|
||||||
|
super().__init__(parent=database, child=table)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resources_sql(cls) -> str:
|
||||||
|
return """
|
||||||
|
SELECT database_name AS parent, table_name AS child
|
||||||
|
FROM catalog_tables
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class QueryResource(Resource):
|
||||||
|
"""A canned query in a database."""
|
||||||
|
|
||||||
|
name = "query"
|
||||||
|
parent_name = "database"
|
||||||
|
|
||||||
|
def __init__(self, database: str, query: str):
|
||||||
|
super().__init__(parent=database, child=query)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def resources_sql(cls) -> str:
|
||||||
|
# TODO: Need catalog for queries
|
||||||
|
return "SELECT NULL AS parent, NULL AS child WHERE 0"
|
||||||
|
|
@ -13,7 +13,7 @@ import pytest_asyncio
|
||||||
from datasette.app import Datasette
|
from datasette.app import Datasette
|
||||||
from datasette.plugins import pm
|
from datasette.plugins import pm
|
||||||
from datasette.utils.permissions import PluginSQL
|
from datasette.utils.permissions import PluginSQL
|
||||||
from datasette.default_actions import TableResource
|
from datasette.resources import TableResource
|
||||||
from datasette import hookimpl
|
from datasette import hookimpl
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue