Skip to content

Commit 0538013

Browse files
committed
More endpoint moving
Getting close to narrowing down to just the endpoints that require access from both the instrument server and frontend
1 parent 4c2971e commit 0538013

File tree

6 files changed

+177
-209
lines changed

6 files changed

+177
-209
lines changed

src/murfey/server/api/__init__.py

Lines changed: 1 addition & 196 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
from __future__ import annotations
22

3-
import asyncio
4-
import datetime
53
import logging
64
import os
75
from functools import lru_cache
@@ -10,20 +8,10 @@
108

119
from fastapi import APIRouter, Depends, Request
1210
from fastapi.responses import FileResponse, HTMLResponse
13-
from ispyb.sqlalchemy import AutoProcProgram as ISPyBAutoProcProgram
14-
from ispyb.sqlalchemy import (
15-
BLSample,
16-
BLSampleGroup,
17-
BLSampleImage,
18-
BLSession,
19-
BLSubSample,
20-
Proposal,
21-
)
11+
from ispyb.sqlalchemy import BLSample, BLSampleGroup, BLSampleImage, BLSubSample
2212
from PIL import Image
2313
from prometheus_client import Counter, Gauge
2414
from pydantic import BaseModel
25-
from sqlalchemy import func
26-
from sqlalchemy.exc import OperationalError
2715
from sqlmodel import select
2816
from werkzeug.utils import secure_filename
2917

@@ -43,21 +31,17 @@
4331
from murfey.util import safe_run
4432
from murfey.util.config import MachineConfig, from_file, settings
4533
from murfey.util.db import (
46-
AutoProcProgram,
4734
ClientEnvironment,
4835
DataCollection,
4936
DataCollectionGroup,
5037
FoilHole,
5138
GridSquare,
5239
MagnificationLookup,
53-
Movie,
5440
ProcessingJob,
5541
RsyncInstance,
5642
Session,
5743
SPAFeedbackParameters,
5844
SPARelionParameters,
59-
Tilt,
60-
TiltSeries,
6145
)
6246
from murfey.util.models import (
6347
BLSampleImageParameters,
@@ -73,8 +57,6 @@
7357
RsyncerInfo,
7458
RsyncerSource,
7559
Sample,
76-
SessionInfo,
77-
TiltInfo,
7860
)
7961
from murfey.workflows.spa.flush_spa_preprocess import (
8062
register_foil_hole,
@@ -156,47 +138,6 @@ def remove_mag_table_row(mag: int, db=murfey_db):
156138
db.commit()
157139

158140

159-
@router.get("/instruments/{instrument_name}/instrument_name")
160-
def get_instrument_display_name(instrument_name: str) -> str:
161-
machine_config = get_machine_config(instrument_name=instrument_name)[
162-
instrument_name
163-
]
164-
if machine_config:
165-
return machine_config.display_name
166-
return ""
167-
168-
169-
@router.get("/instruments/{instrument_name}/visits/")
170-
def all_visit_info(instrument_name: str, request: Request, db=murfey.server.ispyb.DB):
171-
visits = murfey.server.ispyb.get_all_ongoing_visits(instrument_name, db)
172-
173-
if visits:
174-
return_query = [
175-
{
176-
"Start date": visit.start,
177-
"End date": visit.end,
178-
"Visit name": visit.name,
179-
"Time remaining": str(visit.end - datetime.datetime.now()),
180-
}
181-
for visit in visits
182-
] # "Proposal title": visit.proposal_title
183-
log.debug(
184-
f"{len(visits)} visits active for {sanitise(instrument_name)=}: {', '.join(v.name for v in visits)}"
185-
)
186-
return templates.TemplateResponse(
187-
request=request,
188-
name="activevisits.html",
189-
context={"info": return_query, "microscope": instrument_name},
190-
)
191-
else:
192-
log.debug(f"No visits identified for {sanitise(instrument_name)=}")
193-
return templates.TemplateResponse(
194-
request=request,
195-
name="activevisits.html",
196-
context={"info": [], "microscope": instrument_name},
197-
)
198-
199-
200141
@router.post("/visits/{visit_name}")
201142
def register_client_to_visit(visit_name: str, client_info: ClientInfo, db=murfey_db):
202143
client_env = db.exec(
@@ -215,14 +156,6 @@ def register_client_to_visit(visit_name: str, client_info: ClientInfo, db=murfey
215156
return client_info
216157

217158

218-
@router.get("/num_movies")
219-
def count_number_of_movies(db=murfey_db) -> Dict[str, int]:
220-
res = db.exec(
221-
select(Movie.tag, func.count(Movie.murfey_id)).group_by(Movie.tag)
222-
).all()
223-
return {r[0]: r[1] for r in res}
224-
225-
226159
@router.post("/sessions/{session_id}/rsyncer")
227160
def register_rsyncer(session_id: int, rsyncer_info: RsyncerInfo, db=murfey_db):
228161
visit_name = db.exec(select(Session).where(Session.id == session_id)).one().visit
@@ -457,38 +390,6 @@ def post_foil_hole(
457390
return register_foil_hole(session_id, gs_name, foil_hole_params, db)
458391

459392

460-
@router.post("/visits/{visit_name}/{session_id}/tilt")
461-
async def register_tilt(
462-
visit_name: str, session_id: MurfeySessionID, tilt_info: TiltInfo, db=murfey_db
463-
):
464-
def _add_tilt():
465-
tilt_series_id = (
466-
db.exec(
467-
select(TiltSeries)
468-
.where(TiltSeries.tag == tilt_info.tilt_series_tag)
469-
.where(TiltSeries.session_id == session_id)
470-
.where(TiltSeries.rsync_source == tilt_info.source)
471-
)
472-
.one()
473-
.id
474-
)
475-
if db.exec(
476-
select(Tilt)
477-
.where(Tilt.movie_path == tilt_info.movie_path)
478-
.where(Tilt.tilt_series_id == tilt_series_id)
479-
).all():
480-
return
481-
tilt = Tilt(movie_path=tilt_info.movie_path, tilt_series_id=tilt_series_id)
482-
db.add(tilt)
483-
db.commit()
484-
485-
try:
486-
_add_tilt()
487-
except OperationalError:
488-
await asyncio.sleep(30)
489-
_add_tilt()
490-
491-
492393
@router.get("/visit/{visit_name}/samples")
493394
def get_samples(visit_name: str, db=murfey.server.ispyb.DB) -> List[Sample]:
494395
return murfey.server.ispyb.get_sub_samples_from_visit(visit_name, db=db)
@@ -538,52 +439,6 @@ def register_sample_image(
538439
return {"success": False}
539440

540441

541-
@router.get("/instruments/{instrument_name}/visits/{visit_name}")
542-
def visit_info(
543-
request: Request, instrument_name: str, visit_name: str, db=murfey.server.ispyb.DB
544-
):
545-
query = (
546-
db.query(BLSession)
547-
.join(Proposal)
548-
.filter(
549-
BLSession.proposalId == Proposal.proposalId,
550-
BLSession.beamLineName == instrument_name,
551-
BLSession.endDate > datetime.datetime.now(),
552-
BLSession.startDate < datetime.datetime.now(),
553-
)
554-
.add_columns(
555-
BLSession.startDate,
556-
BLSession.endDate,
557-
BLSession.beamLineName,
558-
Proposal.proposalCode,
559-
Proposal.proposalNumber,
560-
BLSession.visit_number,
561-
Proposal.title,
562-
)
563-
.all()
564-
)
565-
if query:
566-
return_query = [
567-
{
568-
"Start date": id.startDate,
569-
"End date": id.endDate,
570-
"Beamline name": id.beamLineName,
571-
"Visit name": visit_name,
572-
"Time remaining": str(id.endDate - datetime.datetime.now()),
573-
}
574-
for id in query
575-
if id.proposalCode + str(id.proposalNumber) + "-" + str(id.visit_number)
576-
== visit_name
577-
] # "Proposal title": id.title
578-
return templates.TemplateResponse(
579-
request=request,
580-
name="visit.html",
581-
context={"visit": return_query},
582-
)
583-
else:
584-
return None
585-
586-
587442
@router.post("/instruments/{instrument_name}/feedback")
588443
async def send_murfey_message(instrument_name: str, msg: RegistrationMessage):
589444
if _transport_object:
@@ -697,56 +552,6 @@ async def make_gif(
697552
return {"output_gif": str(output_path)}
698553

699554

700-
@router.get("/new_client_id/")
701-
async def new_client_id(db=murfey_db):
702-
clients = db.exec(select(ClientEnvironment)).all()
703-
if not clients:
704-
return {"new_id": 0}
705-
sorted_ids = sorted([c.client_id for c in clients])
706-
return {"new_id": sorted_ids[-1] + 1}
707-
708-
709-
@router.post("/instruments/{instrument_name}/clients/{client_id}/session")
710-
def link_client_to_session(
711-
instrument_name: str, client_id: int, sess: SessionInfo, db=murfey_db
712-
):
713-
sid = sess.session_id
714-
if sid is None:
715-
s = Session(name=sess.session_name, instrument_name=instrument_name)
716-
db.add(s)
717-
db.commit()
718-
sid = s.id
719-
client = db.exec(
720-
select(ClientEnvironment).where(ClientEnvironment.client_id == client_id)
721-
).one()
722-
client.session_id = sid
723-
db.add(client)
724-
db.commit()
725-
db.close()
726-
return sid
727-
728-
729-
@router.post("/sessions/{session_id}/successful_processing")
730-
def register_processing_success_in_ispyb(
731-
session_id: MurfeySessionID, db=murfey.server.ispyb.DB, murfey_db=murfey_db
732-
):
733-
collected_ids = murfey_db.exec(
734-
select(DataCollectionGroup, DataCollection, ProcessingJob, AutoProcProgram)
735-
.where(DataCollectionGroup.session_id == session_id)
736-
.where(DataCollection.dcg_id == DataCollectionGroup.id)
737-
.where(ProcessingJob.dc_id == DataCollection.id)
738-
.where(AutoProcProgram.pj_id == ProcessingJob.id)
739-
).all()
740-
appids = [c[3].id for c in collected_ids]
741-
if _transport_object:
742-
apps = db.query(ISPyBAutoProcProgram).filter(
743-
ISPyBAutoProcProgram.autoProcProgramId.in_(appids)
744-
)
745-
for updated in apps:
746-
updated.processingStatus = True
747-
_transport_object.do_update_processing_status(updated)
748-
749-
750555
@router.post("/visits/{visit_name}/monitoring/{on}")
751556
def change_monitoring_status(visit_name: str, on: int):
752557
prom.monitoring_switch.labels(visit=visit_name)

src/murfey/server/api/display.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@
1313
machine_config = get_machine_config()
1414

1515

16+
@router.get("/instruments/{instrument_name}/instrument_name")
17+
def get_instrument_display_name(instrument_name: str) -> str:
18+
machine_config = get_machine_config(instrument_name=instrument_name)[
19+
instrument_name
20+
]
21+
if machine_config:
22+
return machine_config.display_name
23+
return ""
24+
25+
1626
@router.get("/instruments/{instrument_name}/image/")
1727
def get_mic_image(instrument_name: str):
1828
if machine_config[instrument_name].image_path:
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from typing import Optional
2+
3+
from fastapi import APIRouter, Depends
4+
from ispyb.sqlalchemy import AutoProcProgram as ISPyBAutoProcProgram
5+
from pydantic import BaseModel
6+
from sqlmodel import select
7+
8+
import murfey.server.ispyb
9+
from murfey.server import _transport_object
10+
from murfey.server.api.auth import MurfeySessionID, validate_token
11+
from murfey.server.murfey_db import murfey_db
12+
from murfey.util.db import (
13+
AutoProcProgram,
14+
ClientEnvironment,
15+
DataCollection,
16+
DataCollectionGroup,
17+
ProcessingJob,
18+
Session,
19+
)
20+
21+
router = APIRouter(
22+
prefix="/session_control",
23+
dependencies=[Depends(validate_token)],
24+
tags=["session control"],
25+
)
26+
27+
28+
@router.get("/new_client_id/")
29+
async def new_client_id(db=murfey_db):
30+
clients = db.exec(select(ClientEnvironment)).all()
31+
if not clients:
32+
return {"new_id": 0}
33+
sorted_ids = sorted([c.client_id for c in clients])
34+
return {"new_id": sorted_ids[-1] + 1}
35+
36+
37+
class SessionInfo(BaseModel):
38+
session_id: Optional[int]
39+
session_name: str = ""
40+
rescale: bool = True
41+
42+
43+
@router.post("/instruments/{instrument_name}/clients/{client_id}/session")
44+
def link_client_to_session(
45+
instrument_name: str, client_id: int, sess: SessionInfo, db=murfey_db
46+
):
47+
sid = sess.session_id
48+
if sid is None:
49+
s = Session(name=sess.session_name, instrument_name=instrument_name)
50+
db.add(s)
51+
db.commit()
52+
sid = s.id
53+
client = db.exec(
54+
select(ClientEnvironment).where(ClientEnvironment.client_id == client_id)
55+
).one()
56+
client.session_id = sid
57+
db.add(client)
58+
db.commit()
59+
db.close()
60+
return sid
61+
62+
63+
@router.post("/sessions/{session_id}/successful_processing")
64+
def register_processing_success_in_ispyb(
65+
session_id: MurfeySessionID, db=murfey.server.ispyb.DB, murfey_db=murfey_db
66+
):
67+
collected_ids = murfey_db.exec(
68+
select(DataCollectionGroup, DataCollection, ProcessingJob, AutoProcProgram)
69+
.where(DataCollectionGroup.session_id == session_id)
70+
.where(DataCollection.dcg_id == DataCollectionGroup.id)
71+
.where(ProcessingJob.dc_id == DataCollection.id)
72+
.where(AutoProcProgram.pj_id == ProcessingJob.id)
73+
).all()
74+
appids = [c[3].id for c in collected_ids]
75+
if _transport_object:
76+
apps = db.query(ISPyBAutoProcProgram).filter(
77+
ISPyBAutoProcProgram.autoProcProgramId.in_(appids)
78+
)
79+
for updated in apps:
80+
updated.processingStatus = True
81+
_transport_object.do_update_processing_status(updated)

0 commit comments

Comments
 (0)