diff --git a/app/models/adoption_status.py b/app/models/adoption_status.py index db47873..87aaef7 100644 --- a/app/models/adoption_status.py +++ b/app/models/adoption_status.py @@ -2,4 +2,4 @@ from app.extensions import db class AdoptionStatus(db.Model): id = db.Column(db.Integer, primary_key=True) - status = db.Column(db.String(255), nullable=False) \ No newline at end of file + name = db.Column(db.String(255), nullable=False) \ No newline at end of file diff --git a/app/models/adoptions.py b/app/models/adoptions.py index a0e8f92..5201247 100644 --- a/app/models/adoptions.py +++ b/app/models/adoptions.py @@ -1,13 +1,10 @@ from app.extensions import db -import datetime from sqlalchemy.orm import relationship, mapped_column class Adoptions(db.Model) : id = mapped_column(db.Integer, primary_key=True) - publisher_id = mapped_column(db.Integer, db.ForeignKey('user.id'), nullable=False) + adopter_id = mapped_column(db.Integer, db.ForeignKey('user.id'), nullable=False) pet_id = mapped_column(db.Integer, db.ForeignKey('pet.id'), nullable=False) - publish_date = mapped_column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) status_id = mapped_column(db.Integer, db.ForeignKey('adoption_status.id'), nullable=False) - publisher = relationship("User") - pet = relationship("Pet") - status = relationship("AdoptionStatus") \ No newline at end of file + adopter = relationship("User") + status = relationship("AdoptionStatus", uselist=False) \ No newline at end of file diff --git a/app/models/pet.py b/app/models/pet.py index bc781fa..f6d3506 100644 --- a/app/models/pet.py +++ b/app/models/pet.py @@ -14,5 +14,6 @@ class Pet(db.Model): height = mapped_column(db.Float, default=0, nullable=False) registrar_id = mapped_column(db.Integer, db.ForeignKey('user.id'), nullable=False) registration_date = mapped_column(db.DateTime, default=datetime.datetime.utcnow, nullable=False) + adoption = relationship("Adoptions",uselist=False) kind = relationship("PetKind") - registrar = relationship("User") \ No newline at end of file + registrar = relationship("User",uselist=False) \ No newline at end of file diff --git a/app/pets/routes.py b/app/pets/routes.py index 2f8f6cb..77a0bd5 100644 --- a/app/pets/routes.py +++ b/app/pets/routes.py @@ -22,4 +22,11 @@ def register(): return redirect("/users/login") flash(FlashMessage("Pet added!", AlertType.SUCCESS.value )) types = PetService.get_pets_kind() - return render_template("pets/register.html", types=types) \ No newline at end of file + return render_template("pets/register.html", types=types) + +@bp.route('adopt') +@login_required +def adopt(): + if not PetService.adopt_pet(request): + return redirect("/users/login") + return redirect("/pets/") \ No newline at end of file diff --git a/app/services/pet_service.py b/app/services/pet_service.py index bbf1f55..5cbbea8 100644 --- a/app/services/pet_service.py +++ b/app/services/pet_service.py @@ -2,9 +2,13 @@ import cloudinary import cloudinary.uploader import os from flask import flash, Request, session +from sqlalchemy import Row, ScalarResult from app.extensions import db +from app.models.adoptions import Adoptions +from app.models.adoption_status import AdoptionStatus from app.models.pet import Pet from app.models.pet_kind import PetKind +from app.utils.adoption_status import AdoptionStatusEnum from app.utils.alert_type import AlertType from app.utils.errors.pets.pet_register_errors import PetRegisterError from app.utils.flash_message import FlashMessage @@ -12,6 +16,35 @@ from app.utils.helpers import pet_sex_id_to_str from app.utils.validators.pet_validators import PetValidators class PetService: + @staticmethod + def adopt_pet(request: Request): + pet_id = request.args.get('id') + user_id = session.get('id') + if user_id is None: + session.clear() + return False + pet = PetValidators.is_valid_pet_id(pet_id) + if pet is not None: + if pet[0].registrar_id != user_id: + if db.session.execute(db.select(Adoptions).filter_by(pet_id=pet_id)).one_or_none() == None: + adoption_statuses: ScalarResult[AdoptionStatus] = db.session.execute(db.select(AdoptionStatus)).scalars(); + pending_status_id = None + + for adoption_status in adoption_statuses: + if adoption_status.name == AdoptionStatusEnum.PENDING.value: + pending_status_id = adoption_status.id + + if pending_status_id is not None: + adoption = Adoptions( + adopter_id=user_id, + pet_id=pet_id, + status_id=pending_status_id + ) + db.session.add(adoption) + db.session.commit() + db.session.flush() + return True + @staticmethod def register_pet(request: Request): user_id = session.get('id') diff --git a/app/static/css/pets.css b/app/static/css/pets.css index c5667dd..b76112d 100644 --- a/app/static/css/pets.css +++ b/app/static/css/pets.css @@ -38,6 +38,14 @@ background-color: #fd0d99; } +.fliping-card__side--front-adopted { + filter: grayscale(1); +} + +.fliping-card__side--back a { + color: white; +} + .fliping-card:hover .fliping-card__side--back { transform: rotateY(0); } diff --git a/app/templates/pets/index.html b/app/templates/pets/index.html index ac5a7a7..d08fa5a 100644 --- a/app/templates/pets/index.html +++ b/app/templates/pets/index.html @@ -7,6 +7,9 @@ {% endblock %} {% block content %}