diff --git a/scilog/httpclient.py b/scilog/httpclient.py index 9d79ff3..01b226a 100644 --- a/scilog/httpclient.py +++ b/scilog/httpclient.py @@ -46,10 +46,7 @@ class HttpClient(AuthMixin): else: if response.reason == "Unauthorized": self.config.delete() - self._retrieve_token() - raise response.raise_for_status() - else: - raise response.raise_for_status() + raise response.raise_for_status() @authenticated diff --git a/scilog/scilog.py b/scilog/scilog.py index fa0f2db..9ed13a5 100644 --- a/scilog/scilog.py +++ b/scilog/scilog.py @@ -3,11 +3,26 @@ from __future__ import annotations from .authclient import AuthMixin, AuthError, HEADER_JSON from .mkfilt import make_filter from .httpclient import HttpClient -from .snippet import Snippet, Basesnippet +from .snippet import Snippet, Basesnippet, Paragraph from typing import TypeVar, Union, List, Type, get_type_hints import functools - +def pinned_to_logbook(logbook_keys): + def pinned_to_logbook_inner(func): + @functools.wraps(func) + def pinned_to_logbook_call(*args, **kwargs): + if isinstance(args[0].logbook, Basesnippet): + for key in logbook_keys: + if key not in kwargs.keys(): + if key == "parentId": + kwargs[key] = args[0].logbook.id + else: + kwargs[key] = getattr(args[0].logbook, key) + else: + raise Warning("No logbook selected.") + return func(*args, **kwargs) + return pinned_to_logbook_call + return pinned_to_logbook_inner class SciLogRestAPI(HttpClient): def __init__(self, url): @@ -19,31 +34,34 @@ class SciLog(): def __init__(self, url="https://lnode2.psi.ch/api/v1"): self.http_client = SciLogRestAPI(url) - self.logbook_id = None - self.owner_group = None + self.logbook = None def select_logbook(self, logbook:type(Basesnippet)): - self.logbook_id = logbook.id - self.owner_group = logbook.ownerGroup + self.logbook = logbook + @pinned_to_logbook(["parentId", "ownerGroup", "accessGroups"]) def get_snippets(self, **kwargs): url = self.http_client.address + "/basesnippets" params = self.http_client.make_filter(where=kwargs) headers = HEADER_JSON.copy() - return self.http_client.get_request(url, params=params, headers=headers) + return Basesnippet.from_http_response(self.http_client.get_request(url, params=params, headers=headers)) + @pinned_to_logbook(["parentId", "ownerGroup", "accessGroups"]) def send_message(self, msg, **kwargs): url = self.http_client.address + "/basesnippets" payload = kwargs - kwargs["textcontent"] = msg + snippet = Paragraph() + snippet.import_dict(kwargs) + snippet.textcontent = msg headers = HEADER_JSON.copy() - return self.http_client.post_request(url, payload=payload, headers=headers) + return Basesnippet.from_http_response(self.http_client.post_request(url, payload=payload, headers=headers)) + @pinned_to_logbook(["parentId", "ownerGroup", "accessGroups"]) def post_snippet(self, **kwargs): url = self.http_client.address + "/basesnippets" payload = kwargs headers = HEADER_JSON.copy() - return self.http_client.post_request(url, payload=payload, headers=headers) + return Basesnippet.from_http_response(self.http_client.post_request(url, payload=payload, headers=headers)) def get_logbooks(self, **kwargs): url = self.http_client.address + "/basesnippets" diff --git a/scilog/snippet.py b/scilog/snippet.py index 31939ad..cb460a2 100644 --- a/scilog/snippet.py +++ b/scilog/snippet.py @@ -81,12 +81,13 @@ class Basesnippet(Snippet): subsnippets=list, tags=list, dashboardName=str, - files=str, + files=list, location=str, defaultOrder=int, linkType=str, versionable=bool, deleted=bool) + self.snippetType = "basesnippet" @@ -94,6 +95,7 @@ class Paragraph(Basesnippet): def __init__(self): super().__init__() self.set_properties(textcontent=str, isMessage=str) + self.snippetType = "paragraph" if __name__ == "__main__":