Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 54 additions & 4 deletions app/routers/event.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
from datetime import datetime
from operator import attrgetter
from typing import List

from fastapi import APIRouter, Request

from app.database.models import Event
from app.database.models import UserEvent
from app.database.database import get_db
from app.database.models import Event, User, UserEvent
from app.dependencies import templates
from app.internal.utils import create_model
from fastapi import APIRouter, Depends, Request
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from starlette import status
from starlette.responses import RedirectResponse

router = APIRouter(
prefix="/event",
Expand Down Expand Up @@ -52,3 +56,49 @@ def sort_by_date(events: List[Event]) -> List[Event]:

temp = events.copy()
return sorted(temp, key=attrgetter('start'))


def by_id(db: Session, event_id: int) -> Event:
"""Select event by id"""

return db.query(Event).filter(Event.id == event_id).first()


def get_participants_emails_by_event(db: Session, event_id: int) -> List[str]:
"""Returns a list of all the email address of the event invited users,
by event id."""

return [email[0] for email in db.query(User.email).
select_from(Event).
join(UserEvent, UserEvent.event_id == Event.id).
join(User, User.id == UserEvent.user_id).
filter(Event.id == event_id).
all()]


@router.delete("/{event_id}")
def delete_event(request: Request,
event_id: int,
db: Session = Depends(get_db)):

# TODO: Check if the user is the owner of the event.
event = by_id(db, event_id)
participants = get_participants_emails_by_event(db, event_id)
try:
# Delete event
db.delete(event)

# Delete user_event
db.query(UserEvent).filter(UserEvent.event_id == event_id).delete()

db.commit()
if participants and event.start > datetime.now():
pass
# TODO: Send them a cancellation notice
# if the deletion is successful
return RedirectResponse(
url="/calendar", status_code=status.HTTP_200_OK)
except (SQLAlchemyError, TypeError):
return templates.TemplateResponse(
"event/eventview.html", {"request": request, "event_id": event_id},
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
14 changes: 13 additions & 1 deletion tests/client_fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from app.database.models import User
from app.main import app
from app.database.database import Base
from app.routers import profile, agenda, invitation
from app.routers import profile, agenda, invitation, event
from tests.conftest import test_engine, get_test_db


Expand Down Expand Up @@ -58,3 +58,15 @@ def get_test_placeholder_user():
password='123456fake',
full_name='FakeName'
)


@pytest.fixture(scope="session")
def event_test_client():
Base.metadata.create_all(bind=test_engine)
app.dependency_overrides[event.get_db] = get_test_db

with TestClient(app) as client:
yield client

app.dependency_overrides = {}
Base.metadata.drop_all(bind=test_engine)
14 changes: 12 additions & 2 deletions tests/test_event.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from starlette.status import HTTP_404_NOT_FOUND
from app.routers.event import by_id
from starlette import status


class TestEvent:
Expand All @@ -15,7 +16,16 @@ def test_eventview_with_id(self, client):

def test_eventview_without_id(self, client):
response = client.get("/event/view")
assert response.status_code == HTTP_404_NOT_FOUND
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED

def test_repr(self, event):
assert event.__repr__() == f'<Event {event.id}>'

def test_successful_deletion(self, event_test_client, session, event):
respons = event_test_client.delete("/event/1")
assert respons.status_code == status.HTTP_200_OK
assert by_id(db=session, event_id=1) is None

def test_delete_failed(self, event_test_client, event):
respons = event_test_client.delete("/event/2")
assert respons.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR