Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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
Esempio n. 5
0
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)