@@ -333,6 +333,7 @@ def username(self):
333333 return None # not authenticated
334334 return self ._user_info ["username" ]
335335
336+ @_check_token
336337 def workspace_service (self , workspace_id ):
337338 """
338339 This Requests information about a workspace service from /workspace/{id}/service endpoint,
@@ -343,6 +344,7 @@ def workspace_service(self, workspace_id):
343344 resp = self .get (f"/v1/workspace/{ workspace_id } /service" )
344345 return json .load (resp )
345346
347+ @_check_token
346348 def workspace_usage (self , workspace_id ):
347349 """
348350 This Requests information about a workspace usage from /workspace/{id}/usage endpoint,
@@ -395,6 +397,7 @@ def server_version(self):
395397
396398 return self ._server_version
397399
400+ @_check_token
398401 def workspaces_list (self ):
399402 """
400403 Find all available workspaces
@@ -405,6 +408,7 @@ def workspaces_list(self):
405408 workspaces = json .load (resp )
406409 return workspaces
407410
411+ @_check_token
408412 def create_workspace (self , workspace_name ):
409413 """
410414 Create new workspace for currently active user.
@@ -423,6 +427,7 @@ def create_workspace(self, workspace_name):
423427 e .extra = f"Workspace name: { workspace_name } "
424428 raise e
425429
430+ @_check_token
426431 def create_project (self , project_name , is_public = False , namespace = None ):
427432 """
428433 Create new project repository in user namespace on Mergin Maps server.
@@ -472,6 +477,7 @@ def create_project(self, project_name, is_public=False, namespace=None):
472477 e .extra = f"Namespace: { namespace } , project name: { project_name } "
473478 raise e
474479
480+ @_check_token
475481 def create_project_and_push (self , project_name , directory , is_public = False , namespace = None ):
476482 """
477483 Convenience method to create project and push the initial version right after that.
@@ -517,6 +523,7 @@ def create_project_and_push(self, project_name, directory, is_public=False, name
517523 if mp .inspect_files ():
518524 self .push_project (directory )
519525
526+ @_check_token
520527 def paginated_projects_list (
521528 self ,
522529 page = 1 ,
@@ -590,6 +597,7 @@ def paginated_projects_list(
590597 projects = json .load (resp )
591598 return projects
592599
600+ @_check_token
593601 def projects_list (
594602 self ,
595603 tags = None ,
@@ -659,6 +667,7 @@ def projects_list(
659667 break
660668 return projects
661669
670+ @_check_token
662671 def project_info (self , project_path_or_id , since = None , version = None ):
663672 """
664673 Fetch info about project.
@@ -682,6 +691,7 @@ def project_info(self, project_path_or_id, since=None, version=None):
682691 resp = self .get ("/v1/project/{}" .format (project_path_or_id ), params )
683692 return json .load (resp )
684693
694+ @_check_token
685695 def paginated_project_versions (self , project_path , page , per_page = 100 , descending = False ):
686696 """
687697 Get records of project's versions (history) using calculated pagination.
@@ -703,6 +713,7 @@ def paginated_project_versions(self, project_path, page, per_page=100, descendin
703713 resp_json = json .load (resp )
704714 return resp_json ["versions" ], resp_json ["count" ]
705715
716+ @_check_token
706717 def project_versions_count (self , project_path ):
707718 """
708719 return the total count of versions
@@ -718,6 +729,7 @@ def project_versions_count(self, project_path):
718729 resp_json = json .load (resp )
719730 return resp_json ["count" ]
720731
732+ @_check_token
721733 def project_versions (self , project_path , since = 1 , to = None ):
722734 """
723735 Get records of project's versions (history) in ascending order.
@@ -765,6 +777,7 @@ def project_versions(self, project_path, since=1, to=None):
765777 filtered_versions = list (filter (lambda v : (num_since <= int_version (v ["name" ]) <= num_to ), versions ))
766778 return filtered_versions
767779
780+ @_check_token
768781 def download_project (self , project_path , directory , version = None ):
769782 """
770783 Download project into given directory. If version is not specified, latest version is downloaded
@@ -782,6 +795,7 @@ def download_project(self, project_path, directory, version=None):
782795 download_project_wait (job )
783796 download_project_finalize (job )
784797
798+ @_check_token
785799 def user_info (self ):
786800 server_type = self .server_type ()
787801 if server_type == ServerType .OLD :
@@ -790,6 +804,7 @@ def user_info(self):
790804 resp = self .get ("/v1/user/profile" )
791805 return json .load (resp )
792806
807+ @_check_token
793808 def set_project_access (self , project_path , access ):
794809 """
795810 Updates access for given project.
@@ -813,6 +828,7 @@ def set_project_access(self, project_path, access):
813828 e .extra = f"Project path: { project_path } "
814829 raise e
815830
831+ @_check_token
816832 def add_user_permissions_to_project (self , project_path , usernames , permission_level ):
817833 """
818834 Add specified permissions to specified users to project
@@ -846,6 +862,7 @@ def add_user_permissions_to_project(self, project_path, usernames, permission_le
846862 category = DeprecationWarning ,
847863 )
848864
865+ @_check_token
849866 def remove_user_permissions_from_project (self , project_path , usernames ):
850867 """
851868 Removes specified users from project
@@ -870,6 +887,7 @@ def remove_user_permissions_from_project(self, project_path, usernames):
870887 category = DeprecationWarning ,
871888 )
872889
890+ @_check_token
873891 def project_user_permissions (self , project_path ):
874892 """
875893 Returns permissions for project
@@ -890,6 +908,7 @@ def project_user_permissions(self, project_path):
890908 result ["readers" ] = access .get ("readersnames" , [])
891909 return result
892910
911+ @_check_token
893912 def push_project (self , directory ):
894913 """
895914 Upload local changes to the repository.
@@ -903,6 +922,7 @@ def push_project(self, directory):
903922 push_project_wait (job )
904923 push_project_finalize (job )
905924
925+ @_check_token
906926 def pull_project (self , directory ):
907927 """
908928 Fetch and apply changes from repository.
@@ -916,6 +936,7 @@ def pull_project(self, directory):
916936 pull_project_wait (job )
917937 return pull_project_finalize (job )
918938
939+ @_check_token
919940 def clone_project (self , source_project_path , cloned_project_name , cloned_project_namespace = None ):
920941 """
921942 Clone project on server.
@@ -961,6 +982,7 @@ def clone_project(self, source_project_path, cloned_project_name, cloned_project
961982 request = urllib .request .Request (url , data = json .dumps (data ).encode (), headers = json_headers , method = "POST" )
962983 self ._do_request (request )
963984
985+ @_check_token
964986 def delete_project_now (self , project_path ):
965987 """
966988 Delete project repository on server immediately.
@@ -984,6 +1006,7 @@ def delete_project_now(self, project_path):
9841006 request = urllib .request .Request (url , method = "DELETE" )
9851007 self ._do_request (request )
9861008
1009+ @_check_token
9871010 def delete_project (self , project_path ):
9881011 """
9891012 Delete project repository on server. Newer servers since 2023
@@ -1008,6 +1031,7 @@ def delete_project(self, project_path):
10081031 request = urllib .request .Request (url , method = "DELETE" )
10091032 self ._do_request (request )
10101033
1034+ @_check_token
10111035 def project_status (self , directory ):
10121036 """
10131037 Get project status, e.g. server and local changes.
@@ -1027,23 +1051,27 @@ def project_status(self, directory):
10271051
10281052 return pull_changes , push_changes , push_changes_summary
10291053
1054+ @_check_token
10301055 def project_version_info (self , project_id , version ):
10311056 """Returns JSON with detailed information about a single project version"""
10321057 resp = self .get (f"/v1/project/version/{ project_id } /{ version } " )
10331058 return json .load (resp )
10341059
1060+ @_check_token
10351061 def project_file_history_info (self , project_path , file_path ):
10361062 """Returns JSON with full history of a single file within a project"""
10371063 params = {"path" : file_path }
10381064 resp = self .get ("/v1/resource/history/{}" .format (project_path ), params )
10391065 return json .load (resp )
10401066
1067+ @_check_token
10411068 def project_file_changeset_info (self , project_path , file_path , version ):
10421069 """Returns JSON with changeset details of a particular version of a file within a project"""
10431070 params = {"path" : file_path }
10441071 resp = self .get ("/v1/resource/changesets/{}/{}" .format (project_path , version ), params )
10451072 return json .load (resp )
10461073
1074+ @_check_token
10471075 def get_projects_by_names (self , projects ):
10481076 """Returns JSON with projects' info for list of required projects.
10491077 The schema of the returned information is the same as the response from projects_list().
@@ -1058,6 +1086,7 @@ def get_projects_by_names(self, projects):
10581086 resp = self .post ("/v1/project/by_names" , {"projects" : projects }, {"Content-Type" : "application/json" })
10591087 return json .load (resp )
10601088
1089+ @_check_token
10611090 def download_file (self , project_dir , file_path , output_filename , version = None ):
10621091 """
10631092 Download project file at specified version. Get the latest if no version specified.
@@ -1111,6 +1140,7 @@ def get_file_diff(self, project_dir, file_path, output_diff, version_from, versi
11111140 elif len (diffs ) == 1 :
11121141 shutil .copy (diffs [0 ], output_diff )
11131142
1143+ @_check_token
11141144 def download_file_diffs (self , project_dir , file_path , versions ):
11151145 """Download file diffs for specified versions if they are not present
11161146 in the cache.
@@ -1187,6 +1217,7 @@ def has_writing_permissions(self, project_path):
11871217 info = self .project_info (project_path )
11881218 return info ["permissions" ]["upload" ]
11891219
1220+ @_check_token
11901221 def rename_project (self , project_path : str , new_project_name : str ) -> None :
11911222 """
11921223 Rename project on server.
@@ -1258,6 +1289,7 @@ def reset_local_changes(self, directory: str, files_to_reset: typing.List[str] =
12581289 if files_download :
12591290 self .download_files (directory , files_download , version = current_version )
12601291
1292+ @_check_token
12611293 def download_files (
12621294 self , project_dir : str , file_paths : typing .List [str ], output_paths : typing .List [str ] = None , version : str = None
12631295 ):
@@ -1283,6 +1315,7 @@ def has_editor_support(self):
12831315 """
12841316 return is_version_acceptable (self .server_version (), "2024.4.0" )
12851317
1318+ @_check_token
12861319 def create_user (
12871320 self ,
12881321 email : str ,
@@ -1314,20 +1347,23 @@ def create_user(
13141347 user_info = self .post ("v2/users" , params , json_headers )
13151348 return json .load (user_info )
13161349
1350+ @_check_token
13171351 def get_workspace_member (self , workspace_id : int , user_id : int ) -> dict :
13181352 """
13191353 Get a workspace member detail
13201354 """
13211355 resp = self .get (f"v2/workspaces/{ workspace_id } /members/{ user_id } " )
13221356 return json .load (resp )
13231357
1358+ @_check_token
13241359 def list_workspace_members (self , workspace_id : int ) -> List [dict ]:
13251360 """
13261361 Get a list of workspace members
13271362 """
13281363 resp = self .get (f"v2/workspaces/{ workspace_id } /members" )
13291364 return json .load (resp )
13301365
1366+ @_check_token
13311367 def update_workspace_member (
13321368 self , workspace_id : int , user_id : int , workspace_role : WorkspaceRole , reset_projects_roles : bool = False
13331369 ) -> dict :
@@ -1343,19 +1379,22 @@ def update_workspace_member(
13431379 workspace_member = self .patch (f"v2/workspaces/{ workspace_id } /members/{ user_id } " , params , json_headers )
13441380 return json .load (workspace_member )
13451381
1382+ @_check_token
13461383 def remove_workspace_member (self , workspace_id : int , user_id : int ):
13471384 """
13481385 Remove a user from workspace members
13491386 """
13501387 self .delete (f"v2/workspaces/{ workspace_id } /members/{ user_id } " )
13511388
1389+ @_check_token
13521390 def list_project_collaborators (self , project_id : str ) -> List [dict ]:
13531391 """
13541392 Get a list of project collaborators
13551393 """
13561394 project_collaborators = self .get (f"v2/projects/{ project_id } /collaborators" )
13571395 return json .load (project_collaborators )
13581396
1397+ @_check_token
13591398 def add_project_collaborator (self , project_id : str , user : str , project_role : ProjectRole ) -> dict :
13601399 """
13611400 Add a user to project collaborators and grant them a project role.
@@ -1367,6 +1406,7 @@ def add_project_collaborator(self, project_id: str, user: str, project_role: Pro
13671406 project_collaborator = self .post (f"v2/projects/{ project_id } /collaborators" , params , json_headers )
13681407 return json .load (project_collaborator )
13691408
1409+ @_check_token
13701410 def update_project_collaborator (self , project_id : str , user_id : int , project_role : ProjectRole ) -> dict :
13711411 """
13721412 Update project role of the existing project collaborator.
@@ -1376,6 +1416,7 @@ def update_project_collaborator(self, project_id: str, user_id: int, project_rol
13761416 project_collaborator = self .patch (f"v2/projects/{ project_id } /collaborators/{ user_id } " , params , json_headers )
13771417 return json .load (project_collaborator )
13781418
1419+ @_check_token
13791420 def remove_project_collaborator (self , project_id : str , user_id : int ):
13801421 """
13811422 Remove a user from project collaborators
@@ -1387,6 +1428,7 @@ def server_config(self) -> dict:
13871428 response = self .get ("/config" )
13881429 return json .load (response )
13891430
1431+ @_check_token
13901432 def send_logs (
13911433 self ,
13921434 logfile : str ,
0 commit comments