Source code for pyicat_plus.client.icatplus_restricted

import datetime
from typing import Optional, List
from urllib.parse import urljoin

import requests

from ..utils.url import normalize_url


[docs] class IcatPlusRestrictedClient: """Client for the restricted part of the ICAT+ REST API. REST API docs: https://icatplus.esrf.fr/api-docs/ The ICAT+ server project: https://gitlab.esrf.fr/icat/icat-plus/-/blob/master/README.md """ DEFAULT_SCHEME = "https" def __init__(self, url: str, password: Optional[str] = None): url = normalize_url(url, default_scheme=self.DEFAULT_SCHEME) path = "catalogue/{icat_session_id}/investigation" self.__investigation_url = urljoin(url, path) path = "tracking/{icat_session_id}/parcel" self.__parcel_url = urljoin(url, path) path = "session" self._authentication_url = urljoin(url, path) self._authentication_result = None if password: self.login(password)
[docs] def login(self, password: str) -> dict: credentials = {"plugin": "esrf", "password": password} response = requests.post(self._authentication_url, json=credentials) response.raise_for_status() self._authentication_result = response.json() return self._authentication_result
@property def authentication_result(self) -> dict: if not self._authentication_result: raise RuntimeError("Login is required.") return self._authentication_result @property def icat_session_id(self) -> str: return self.authentication_result["sessionId"] @property def _investigation_url(self) -> str: return self.__investigation_url.format(icat_session_id=self.icat_session_id) @property def _parcel_url(self) -> str: return self.__parcel_url.format(icat_session_id=self.icat_session_id)
[docs] def get_investigations_by( self, filter: Optional[str] = None, instrument_name: Optional[str] = None, start_date: Optional[datetime.datetime] = None, end_date: Optional[datetime.datetime] = None, ) -> List[dict]: """Returns a list of investigations matching the provided criteria.""" params = dict() if filter: params["filter"] = filter if instrument_name: params["instrumentName"] = instrument_name if start_date: params["startDate"] = start_date.strftime("%Y-%m-%d") if end_date: params["endDate"] = end_date.strftime("%Y-%m-%d") url = self._investigation_url if params: query = "&".join([f"{k}={v}" for k, v in params.items()]) url = f"{url}?{query}" response = requests.get(url) response.raise_for_status() return response.json()
[docs] def get_parcels_by(self, investigation_id: str) -> List[dict]: """Returns the list of parcels associated to an investigation.""" url = f"{self._parcel_url}?investigation_id={investigation_id}" response = requests.get(url) response.raise_for_status() return response.json()