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