diff --git a/app/api/user_favourite_events.py b/app/api/user_favourite_events.py index dbf8c51064..36051bc57a 100644 --- a/app/api/user_favourite_events.py +++ b/app/api/user_favourite_events.py @@ -1,14 +1,16 @@ -from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship from flask import request, current_app as app -from flask_jwt import current_identity as current_user, _jwt_required +from flask_jwt import current_identity as current_user, _jwt_required, jwt_required +from flask_rest_jsonapi import ResourceDetail, ResourceList, ResourceRelationship +from flask_rest_jsonapi.exceptions import ObjectNotFound +from sqlalchemy.orm.exc import NoResultFound -from app.models.user import User from app.api.helpers.db import safe_query -from app.api.helpers.permission_manager import has_access from app.api.helpers.exceptions import ForbiddenException, ConflictException +from app.api.helpers.permission_manager import has_access from app.api.helpers.utilities import require_relationship from app.api.schema.user_favourite_events import UserFavouriteEventSchema from app.models import db +from app.models.user import User from app.models.user_favourite_event import UserFavouriteEvent @@ -79,11 +81,28 @@ class UserFavouriteEventDetail(ResourceDetail): """ User Favourite Events detail by id """ + @jwt_required() + def before_get_object(self, view_kwargs): + + if view_kwargs.get('id') is not None: + try: + user_favourite_event = UserFavouriteEvent.query.filter_by( + user=current_user, event_id=view_kwargs['id']).first() + except NoResultFound: + raise ObjectNotFound({'source': '/data/relationships/event'}, "Object: not found") + else: + if user_favourite_event is not None: + view_kwargs['id'] = user_favourite_event.id + else: + view_kwargs['id'] = None methods = ['GET', 'DELETE'] schema = UserFavouriteEventSchema data_layer = {'session': db.session, - 'model': UserFavouriteEvent} + 'model': UserFavouriteEvent, + 'methods': { + 'before_get_object': before_get_object, + }} class UserFavouriteEventRelationship(ResourceRelationship): diff --git a/app/factories/user_favourite_events.py b/app/factories/user_favourite_events.py index e17820cc2a..33e0013a36 100644 --- a/app/factories/user_favourite_events.py +++ b/app/factories/user_favourite_events.py @@ -3,6 +3,7 @@ from app.factories.user import UserFactory from app.factories.event import EventFactoryBasic from app.models.user_favourite_event import db, UserFavouriteEvent +from app.models.user import User class UserFavouriteEventFactory(factory.alchemy.SQLAlchemyModelFactory): @@ -10,5 +11,5 @@ class Meta: model = UserFavouriteEvent sqlalchemy_session = db.session - user = factory.RelatedFactory(UserFactory) - event = factory.RelatedFactory(EventFactoryBasic) + user = factory.LazyAttribute(lambda a: User.query.first()) + event = factory.SubFactory(EventFactoryBasic) diff --git a/docs/api/api_blueprint.apib b/docs/api/api_blueprint.apib index 5c5d8f9c3c..5b4ae19c5b 100644 --- a/docs/api/api_blueprint.apib +++ b/docs/api/api_blueprint.apib @@ -25616,9 +25616,9 @@ This Group's APIs can be used for adding a particular event to the favourite lis } } -## Favourite Events Detail [/v1/user-favourite-events/{user_favourite_event_id}] +## Favourite Events Detail [/v1/user-favourite-events/{event_id}] + Parameters - + user_favourite_event_id: 1 (integer) - ID of the Favourite Event + + event_id: 1 (integer) - ID of the Event in the form of an integer ### Get Details [GET] diff --git a/tests/hook_main.py b/tests/hook_main.py index 66575afc31..0acbb518d4 100644 --- a/tests/hook_main.py +++ b/tests/hook_main.py @@ -4358,8 +4358,8 @@ def favourite_events_list_post(transaction): :return: """ with stash['app'].app_context(): - user_fav_event = UserFavouriteEventFactory() - db.session.add(user_fav_event) + event = EventFactoryBasic() + db.session.add(event) db.session.commit()