132 lines
3.3 KiB
Python
132 lines
3.3 KiB
Python
from aiohttp.web import json_response, View
|
|
from aiohttp.web import (
|
|
HTTPNotFound,
|
|
HTTPUnprocessableEntity,
|
|
HTTPServerError,
|
|
HTTPNoContent,
|
|
HTTPBadRequest,
|
|
HTTPCreated,
|
|
)
|
|
|
|
from phi.logging import get_logger
|
|
# from phi.api.utils import serialize
|
|
from phi.async_ldap.model import User
|
|
from phi.exceptions import (
|
|
PhiEntryDoesNotExist,
|
|
PhiUnexpectedRuntimeValue,
|
|
PhiCannotExecute,
|
|
)
|
|
|
|
log = get_logger(__name__)
|
|
|
|
|
|
class UserView(View):
|
|
def get_log(self):
|
|
return self.request.app["log"]
|
|
|
|
def get_uid(self):
|
|
try:
|
|
return self.request.match_info["uid"]
|
|
except KeyError:
|
|
raise HTTPUnprocessableEntity
|
|
|
|
async def find_user(self, uid):
|
|
log = self.get_log()
|
|
|
|
try:
|
|
user = await self.request.app["users"].search(uid)
|
|
log.info("Found user %s", user)
|
|
except PhiEntryDoesNotExist as e:
|
|
log.info(e)
|
|
raise HTTPNotFound
|
|
|
|
return user
|
|
|
|
async def get(self):
|
|
log = self.get_log()
|
|
log.debug(f"{self.__class__.__name__}.get")
|
|
uid = self.get_uid()
|
|
|
|
user = await self.find_user(uid)
|
|
|
|
result = await user.describe()
|
|
log.debug("Returning result %s", result)
|
|
|
|
return json_response(result)
|
|
|
|
async def post(self):
|
|
log = self.get_log()
|
|
log.debug(f"{self.__class__.__name__}.post")
|
|
uid = self.get_uid()
|
|
|
|
user = await self.find_user(uid)
|
|
|
|
try:
|
|
user = await self.request.app["users"].search(uid)
|
|
log.info("Found user %s", user)
|
|
except PhiEntryDoesNotExist as e:
|
|
log.debug(e)
|
|
raise HTTPNotFound(text=str(e))
|
|
except PhiUnexpectedRuntimeValue as e:
|
|
log.error("Exception: %s", e)
|
|
raise HTTPServerError
|
|
|
|
body = await self.request.json()
|
|
|
|
for k, v in body.items():
|
|
try:
|
|
user[k] = v
|
|
except PhiCannotExecute as e:
|
|
err = str(e)
|
|
log.error(err)
|
|
raise HTTPBadRequest(text=err)
|
|
|
|
try:
|
|
await user.modify()
|
|
except Exception as e:
|
|
log.error("Exception: %s", e)
|
|
|
|
raise HTTPNoContent
|
|
|
|
async def put(self):
|
|
log = self.get_log()
|
|
log.debug(f"{self.__class__.__name__}.put")
|
|
uid = self.get_uid()
|
|
|
|
user = User(self.request.app["ldap_client"], uid)
|
|
|
|
body = await self.request.json()
|
|
|
|
try:
|
|
for k, v in body.items():
|
|
user[k] = v
|
|
|
|
log.debug(f"Saving: {user}")
|
|
await user.save()
|
|
except PhiCannotExecute as e:
|
|
err = str(e)
|
|
log.error(err)
|
|
raise HTTPBadRequest(text=err)
|
|
|
|
log.info(f"New user saved: {user}")
|
|
|
|
raise HTTPCreated
|
|
|
|
async def delete(self):
|
|
log = self.get_log()
|
|
log.debug(f"{self.__class__.__name__}.delete")
|
|
uid = self.get_uid()
|
|
|
|
try:
|
|
user = await self.request.app["users"].search(uid)
|
|
log.info("Found user %s", user)
|
|
await user.delete()
|
|
except PhiEntryDoesNotExist as e:
|
|
log.debug(e)
|
|
raise HTTPNotFound(text=str(e))
|
|
except PhiUnexpectedRuntimeValue as e:
|
|
log.error("Exception: %s", e)
|
|
raise HTTPServerError
|
|
|
|
raise HTTPNoContent
|