From eff1c8b1b69a7f936dac88923c7aa4743fccfdb5 Mon Sep 17 00:00:00 2001 From: Gabriel De Los Rios Date: Mon, 9 Dec 2024 23:23:36 -0300 Subject: [PATCH] feat(pets): implements adoption --- app/models/adoption_status.py | 2 +- app/models/adoptions.py | 9 +++------ app/models/pet.py | 3 ++- app/pets/routes.py | 9 ++++++++- app/services/pet_service.py | 33 +++++++++++++++++++++++++++++++++ app/static/css/pets.css | 8 ++++++++ app/templates/pets/index.html | 15 +++++++++++++-- app/utils/adoption_status.py | 6 ++++++ app/utils/db_utils.py | 8 ++++++++ 9 files changed, 82 insertions(+), 11 deletions(-) create mode 100644 app/utils/adoption_status.py 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 %}
+
+ {% include 'message.html' %} +
@@ -74,7 +77,11 @@ {% for pet in pagination_result.items %}
-
+
pet
Ask for adoption! + {% endif %}
diff --git a/app/utils/adoption_status.py b/app/utils/adoption_status.py new file mode 100644 index 0000000..a35fe6a --- /dev/null +++ b/app/utils/adoption_status.py @@ -0,0 +1,6 @@ +from enum import Enum + +class AdoptionStatusEnum(Enum): + APPROVED = "approved" + PENDING = "pending" + REJECTED = "rejected" \ No newline at end of file diff --git a/app/utils/db_utils.py b/app/utils/db_utils.py index f247a6f..da680a0 100644 --- a/app/utils/db_utils.py +++ b/app/utils/db_utils.py @@ -4,6 +4,7 @@ from app.models.pet import Pet from app.models.pet_kind import PetKind from app.models.adoptions import Adoptions from app.models.adoption_status import AdoptionStatus +from app.utils.adoption_status import AdoptionStatusEnum from datetime import date from random import randrange from werkzeug.security import generate_password_hash @@ -34,6 +35,13 @@ class DBUtils(): db.session.add_all([dog,cat]) db.session.commit() + """Adoption statuses""" + adoption_pending = AdoptionStatus(name=AdoptionStatusEnum.PENDING.value) + adoption_approved = AdoptionStatus(name=AdoptionStatusEnum.APPROVED.value) + adoption_rejected = AdoptionStatus(name=AdoptionStatusEnum.REJECTED.value) + db.session.add_all([adoption_pending,adoption_approved,adoption_rejected]) + db.session.commit() + """Pets""" pets = [] for i in range(40):