feat: added check_user_exists() method
Some checks failed
Pylint / Pylint (3.12) (push) Failing after 37s

This commit is contained in:
Seaswimmer 2023-12-20 20:48:45 -05:00
parent 6a250a24fb
commit 5a8fe5451b
Signed by: cswimr
GPG key ID: 1EBC234EEDA901AE
2 changed files with 33 additions and 19 deletions

View file

@ -53,11 +53,7 @@ class RestAdapter:
full_url = self._url + endpoint full_url = self._url + endpoint
headers = {'Authorization': self._token} headers = {'Authorization': self._token}
log_line_pre = f"method={http_method}, url={full_url}, params={params}" try: # Perform an HTTP request, catching and re-raising any exceptions
log_line_post = ', '.join((log_line_pre, "success={}, status_code={}, message={}"))
try: # Log HTTP params and perform an HTTP request, catching and re-raising any exceptions
self._logger.debug(msg=log_line_pre)
# will eventually refactor this to use asyncio/aiohttp instead for async operation # will eventually refactor this to use asyncio/aiohttp instead for async operation
response = requests.request(method=http_method, url=full_url, verify=self._enforced_signing, params=params, headers=headers, json=data) response = requests.request(method=http_method, url=full_url, verify=self._enforced_signing, params=params, headers=headers, json=data)
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
@ -67,14 +63,15 @@ class RestAdapter:
try: # Deserialize JSON output to Python object, or return failed Result on exception try: # Deserialize JSON output to Python object, or return failed Result on exception
data_out = response.json() data_out = response.json()
except (ValueError, JSONDecodeError) as e: except (ValueError, JSONDecodeError) as e:
self._logger.error(msg=log_line_post.format(False, None, e))
raise PyZiplineError("Could not decode response from Zipline server") from e raise PyZiplineError("Could not decode response from Zipline server") from e
# If status_code in 200-299 range, return success Result with data, otherwise return failed Result with message # If status_code in 200-299 range, return success Result with data, otherwise return failed Result with message
is_success = 299 >= response.status_code >= 200 is_success = 299 >= response.status_code >= 200
self._logger.debug(msg=log_line_post.format(is_success, response.status_code, response.reason)) if is_success:
return Result(success=is_success, status_code=response.status_code, message=response.reason, data=data_out) return Result(success=is_success, status_code=response.status_code, message=response.reason, data=data_out)
else:
return Result(success=is_success, status_code=response.status_code, message=data_out['error'], data=data_out)
def get(self, endpoint: str, params: Dict = None) -> Result: def get(self, endpoint: str, params: Dict = None) -> Result:
"""Make a GET request to the Zipline server. You should almost never have to use this directly. """Make a GET request to the Zipline server. You should almost never have to use this directly.

View file

@ -1,6 +1,7 @@
import logging import logging
import json
from pyzipline.rest_adapter import RestAdapter from pyzipline.rest_adapter import RestAdapter
from pyzipline.errors import PyZiplineError, FeatureDisabledError from pyzipline.exceptions import PyZiplineError, FeatureDisabledError
from pyzipline.models import * from pyzipline.models import *
class ZiplineApi: class ZiplineApi:
@ -28,11 +29,15 @@ class ZiplineApi:
def get_user(self, user_id: int) -> User: def get_user(self, user_id: int) -> User:
"""Get a user by ID """Get a user by ID
/// admonition | Requires Administrator
type: danger
///
Args: Args:
user_id (int): Integer ID of the user to retrieve user_id (int): Integer ID of the user to retrieve
Returns: Returns:
:class:`pyzipline.models.User`: The user with the given ID User: The user with the given ID
""" """
result = self._rest_adapter.get(endpoint=f"user/{user_id}") result = self._rest_adapter.get(endpoint=f"user/{user_id}")
return User(**result.data) return User(**result.data)
@ -40,11 +45,18 @@ class ZiplineApi:
def get_self(self) -> User: def get_self(self) -> User:
"""Get the currently authenticated user """Get the currently authenticated user
/// admonition | Requires Authentication
type: warning
///
Returns: Returns:
:class:`pyzipline.models.User`: The currently authenticated user User: The currently authenticated user
""" """
result = self._rest_adapter.get(endpoint=f"user") result = self._rest_adapter.get(endpoint=f"user")
return User(**result.data) if result.status_code == 200:
return User(**result.data)
elif result.status_code == 401:
raise ValueError(result.message)
def check_user_exists(self, username: str, invite: str = None) -> bool: def check_user_exists(self, username: str, invite: str = None) -> bool:
"""Check if a user exists by username """Check if a user exists by username
@ -55,20 +67,25 @@ class ZiplineApi:
Raises: Raises:
FeatureDisabledError: Raised when registration or invites are disabled on the Zipline instance FeatureDisabledError: Raised when registration or invites are disabled on the Zipline instance
PyZiplineError: Raised PyZiplineError: Raised if the API changes, causing a breaking change in this method
ValueError: Raised when the username is not present, or the invite code is invalid/not present and invites are enabled
Returns: Returns:
bool: True if user exists, False if not bool: True if user exists, False if not
""" """
params = {'username': username} if invite is None else {'username': username, 'code': invite} data = {'username': username} if invite is None else {'username': username, 'code': invite}
result: Result = self._rest_adapter.get(endpoint=f"user/check", params=params) result: Result = self._rest_adapter.post(endpoint=f"user/check", data=data)
if result.status_code == 200: if result.status_code == 200:
return bool(result.data['success']) return False
elif result.message == 'user resistration is disabled' or result.message == 'invites are disabled':
raise FeatureDisabledError(result.message)
elif result.message == 'username already exists': elif result.message == 'username already exists':
return True return True
elif result.message == 'user registration is disabled':
raise FeatureDisabledError('user registration or invites are disabled')
elif result.message == 'invalid invite code': elif result.message == 'invalid invite code':
raise ValueError(result.message) raise ValueError(result.message + "(most likely doesn't exist)")
elif result.message == 'no code':
raise ValueError('invite code not provided')
elif result.message == 'no username':
raise ValueError('username not provided')
else: else:
raise PyZiplineError(result.message) raise PyZiplineError(result.message)