Skip to content
Draft
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
2 changes: 2 additions & 0 deletions config/.env
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ TOKEN_EXP_TIME=300
CORS=true

AUTH_CONFIG=auth.yml

PATH_MAP=${ISPYB_DATA_PATH}
2 changes: 2 additions & 0 deletions config/ci.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ SECRET_KEY=ci_secret
SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://test:test@127.0.0.1/test

AUTH_CONFIG=tests/config/auth.yml

PATH_MAP=${ISPYB_DATA_PATH}
2 changes: 2 additions & 0 deletions config/dev.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ SECRET_KEY=dev_secret
SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://test:test@127.0.0.1/test

AUTH_CONFIG=auth.yml

PATH_MAP=${ISPYB_DATA_PATH}
2 changes: 2 additions & 0 deletions config/docker.env
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,5 @@ TOKEN_EXP_TIME=300
CORS=true

AUTH_CONFIG=/config/auth.yml

PATH_MAP=${ISPYB_DATA_PATH}
2 changes: 2 additions & 0 deletions config/test.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ SECRET_KEY=test_secret
SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://test:test@127.0.0.1/test

AUTH_CONFIG=tests/config/auth.yml

PATH_MAP=${ISPYB_DATA_PATH}
4 changes: 4 additions & 0 deletions docs/conf.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,7 @@ SQLALCHEMY_DATABASE_URI=mysql+mysqlconnector://test:test@127.0.0.1/test
AUTH_CONFIG=auth.yml

```

## ISPYB_DATA_PATH

The env variable `ISPYB_DATA_PATH` allows you to define a path prefix that ISPyB should add to all data files path in the database.
5 changes: 4 additions & 1 deletion pyispyb/app/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,12 @@ def custom_generate_unique_id(route: APIRoute):

class AuthenticatedAPIRouter(BaseRouter):
def __init__(self, *args, **kwargs):

deps = kwargs.pop("dependencies", [])

super().__init__(
*args,
dependencies=[Depends(JWTBearer)],
dependencies=[Depends(JWTBearer), *deps],
**kwargs,
generate_unique_id_function=custom_generate_unique_id,
)
10 changes: 10 additions & 0 deletions pyispyb/app/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
from sqlalchemy import text
from functools import wraps
from pyispyb.config import settings
from sqlalchemy.orm import class_mapper
from sqlalchemy import inspect

logger = logging.getLogger("ispyb")

Expand Down Expand Up @@ -87,3 +89,11 @@ def wrapper(self, *args, **kwargs):
return result

return wrapper


def model_from_json(model, data):
mapper = class_mapper(model)
keys = mapper.attrs.keys()
relationships = inspect(mapper).relationships
args = {k: v for k, v in data.items() if k in keys and k not in relationships}
return model(**args)
43 changes: 43 additions & 0 deletions pyispyb/core/modules/eventchains.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from sqlalchemy.orm import joinedload

from ispyb import models

from pyispyb.app.extensions.database.middleware import db
from pyispyb.app.extensions.database.definitions import with_authorization
from pyispyb.app.extensions.database.utils import Paged, page


def get_datacollection_eventchains(
dataCollectionId: int,
skip: int,
limit: int,
) -> list[models.EventChain]:
query = (
db.session.query(models.EventChain)
.filter(models.EventChain.dataCollectionId == dataCollectionId)
.options(joinedload(models.EventChain.events))
.join(
models.DataCollection,
models.EventChain.dataCollectionId
== models.DataCollection.dataCollectionId,
)
.join(
models.DataCollectionGroup,
models.DataCollection.dataCollectionGroupId
== models.DataCollectionGroup.dataCollectionGroupId,
)
.join(
models.BLSession,
models.DataCollectionGroup.sessionId == models.BLSession.sessionId,
)
.join(
models.Proposal, models.BLSession.proposalId == models.Proposal.proposalId
)
)

query = with_authorization(query, joinBLSession=False)

total = query.count()
query = page(query, skip=skip, limit=limit)

return Paged(total=total, results=query.all(), skip=skip, limit=limit)
Loading