async def update_user(user_id: UUID, user_data: UserUpdateDto) -> UserDto: """Update a user. Params: ------- - user_data: UserUpdateDto - The new data to update. - user_id: UUID - The user pk. Return: ------- - user: UserDto - The user updated. """ if user_data.photo: user_data.photo = get_or_update_image(user_data.photo) try: user = await User.get(id=user_id) address = user_data.address user_data_dict = user_data.dict() user_data_dict.pop("address") user.update_from_dict(user_data_dict) await user.save() if address: user_address = await Address.filter(users=user.id).first() user_address.update_from_dict(address.dict()) await user_address.save() except IntegrityError: return exceptions.conflict_409("Email already exists") return await UserDto.from_tortoise_orm(user)
async def update_angel(angel_id: UUID, angel_info: AngelUpdateDto) -> AngelDto: """Update angel info. Params: ------- - angel_id: UUID - The angel ID. - angel_data: AngelUpdateDto - The info to update. Return: ------- - angel: AngelDto - The updated angel. """ angel_data: dict = angel_info.dict() address_data = angel_data.get("address") angel_data.pop("address") if angel_data.get("photo"): angel_data["photo"] = get_or_update_image(angel_data["photo"]) try: angel = await Angel.get(id=angel_id) angel.update_from_dict(angel_data) await angel.save() if address_data: address = await Address.get(id=angel.address_id) address.update_from_dict(address_data) await address.save() except DoesNotExist: return exceptions.not_found_404("Angel not found") except IntegrityError as e: return exceptions.conflict_409(e.args[0]) angel_updated = await Angel.get(id=angel_id).prefetch_related("address") return await AngelDto.from_tortoise_orm(angel_updated)
async def create_angel( angel_info: AngelCreateDto, contacts: List[ContactDto], im_my_guardian: bool, use_guardian_address: bool, user: User, ) -> AngelDto: """Create a new angel and all his/her emergency contacts. Params: ------- - angel_info: AngelCreateDto - The angel data. - contacts: List[ContactDto] - An array of emergency contacts. - user: User - The current user (tortoise model instance). - im_my_guardian: bool - Indicates if the user is its own angel. - use_guardian_address: bool - Indicates if the angel address is the same as user. Return: ------- - angel: AngelDto - The new angel. """ angel_data = angel_info.dict() address_data = angel_data.get("address") angel_data.pop("address") try: if use_guardian_address or im_my_guardian: user_dto = await UserDto.from_tortoise_orm(user) if not user.address.id: return exceptions.precondition_failed_412( "Guardian don´t have address") address_data = user_dto.address.dict() address = await Address.create(**address_data) if angel_data.get("photo"): angel_data["photo"] = get_or_update_image(angel_data["photo"]) angel = await Angel.create(**angel_data, guardian=user, address=address) # Create all related contacts for contact in contacts: await Contact.create(**contact.dict(), angel=angel) except IntegrityError as e: return exceptions.conflict_409(e.args[0]) except ValueError as e: return exceptions.bad_request_400(e.args[0]) return await AngelDto.from_tortoise_orm(angel)
async def signup(user_info: SignupInfo) -> User: """Register a new user. Params: ------- - user_info: SingupInfo - The user info Return: ------- - user: User - a User instance. """ user_data = user_info.dict() hashed_password = hash_password(user_info.password) user_data.update({"password": hashed_password}) try: user = await User.create(**user_data) user.address = await Address.create() await user.save() except IntegrityError: return exceptions.conflict_409("Email already exist") return user
async def update_angel_contact(contact_id: UUID, contact_info: ContactDto) -> AngelDto: """Update an angel contact data and return the angel updated. Params: ------- - contact_id: UUID - The contact ID. - contact_info: ContactDto - The contact data to update. Return: ------- - angel: AngelDto - The angel updated. """ try: contact = await Contact.get(id=contact_id) contact.update_from_dict(contact_info.dict()) await contact.save() except DoesNotExist: return exceptions.not_found_404("Contact not found") except IntegrityError as e: return exceptions.conflict_409(e.args[0]) angel = await Angel.get(contacts=contact.id).prefetch_related("address") return await AngelDto.from_tortoise_orm(angel)