Skip to content

Commit 238d859

Browse files
authored
Added checking for zoom link and saving the event (#122)
* Added checking for zoom link and saving the event
1 parent 8ee3f61 commit 238d859

File tree

3 files changed

+93
-10
lines changed

3 files changed

+93
-10
lines changed

app/internal/event.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import re
2+
3+
from fastapi import HTTPException
4+
5+
from starlette.status import HTTP_400_BAD_REQUEST
6+
7+
ZOOM_REGEX = re.compile(r'https://.*?\.zoom.us/[a-z]/.[^.,\b\s]+')
8+
9+
10+
def validate_zoom_link(location):
11+
if ZOOM_REGEX.search(location) is None:
12+
raise HTTPException(status_code=HTTP_400_BAD_REQUEST,
13+
detail="VC type with no valid zoom link")

app/routers/event.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
from datetime import datetime
1+
from datetime import datetime as dt
22
from operator import attrgetter
33
from typing import Any, Dict, List, Optional
44

5-
from app.database.database import get_db
6-
from app.database.models import Event, User, UserEvent
7-
from app.dependencies import templates
8-
from app.internal.utils import create_model
95
from fastapi import APIRouter, Depends, Request
106
from sqlalchemy.exc import SQLAlchemyError
117
from sqlalchemy.orm import Session
128
from starlette import status
139
from starlette.responses import RedirectResponse
10+
from starlette.status import HTTP_302_FOUND
11+
12+
from app.database.database import get_db
13+
from app.database.models import Event, User, UserEvent
14+
from app.dependencies import templates
15+
from app.internal.event import validate_zoom_link
16+
from app.internal.utils import create_model
17+
from app.routers.user import create_user
1418

1519
router = APIRouter(
1620
prefix="/event",
@@ -25,6 +29,31 @@ async def eventedit(request: Request):
2529
{"request": request})
2630

2731

32+
@router.post("/edit")
33+
async def create_new_event(request: Request, session=Depends(get_db)):
34+
data = await request.form()
35+
title = data['title']
36+
content = data['description']
37+
start = dt.strptime(data['start_date'] + ' ' + data['start_time'],
38+
'%Y-%m-%d %H:%M')
39+
end = dt.strptime(data['end_date'] + ' ' + data['end_time'],
40+
'%Y-%m-%d %H:%M')
41+
user = session.query(User).filter_by(id=1).first()
42+
user = user if user else create_user("u", "p", "[email protected]", session)
43+
owner_id = user.id
44+
location_type = data['location_type']
45+
is_zoom = location_type == 'vc_url'
46+
location = data['location']
47+
48+
if is_zoom:
49+
validate_zoom_link(location)
50+
51+
event = create_event(session, title, start, end, owner_id, content,
52+
location)
53+
return RedirectResponse(router.url_path_for('eventview', id=event.id),
54+
status_code=HTTP_302_FOUND)
55+
56+
2857
@router.get("/view/{id}")
2958
async def eventview(request: Request, id: int):
3059
return templates.TemplateResponse("event/eventview.html",
@@ -37,7 +66,7 @@ def by_id(db: Session, event_id: int) -> Event:
3766
return db.query(Event).filter(Event.id == event_id).first()
3867

3968

40-
def is_date_before(start_date: datetime, end_date: datetime) -> bool:
69+
def is_date_before(start_date: dt, end_date: dt) -> bool:
4170
"""Check if the start date is earlier than the end date"""
4271

4372
return start_date < end_date
@@ -59,7 +88,6 @@ def get_items_that_can_be_updated(event: Dict[str, Any]) -> Dict[str, Any]:
5988

6089
def update_event(event_id: int, event: Dict, db: Session
6190
) -> Optional[Event]:
62-
6391
# TODO Check if the user is the owner of the event.
6492

6593
event_to_update = get_items_that_can_be_updated(event)
@@ -142,7 +170,7 @@ def delete_event(request: Request,
142170
return templates.TemplateResponse(
143171
"event/eventview.html", {"request": request, "event_id": event_id},
144172
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR)
145-
if participants and event.start > datetime.now():
173+
if participants and event.start > dt.now():
146174
pass
147175
# TODO: Send them a cancellation notice
148176
# if the deletion is successful

tests/test_event.py

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,39 @@
11
from datetime import datetime
22

33
import pytest
4+
from starlette import status
5+
from starlette.status import HTTP_302_FOUND
6+
47
from app.database.models import Event
58
from app.routers.event import by_id, update_event
6-
from starlette import status
9+
10+
CORRECT_EVENT_FORM_DATA = {
11+
'title': 'test title',
12+
'start_date': '2021-01-28',
13+
'start_time': '15:59',
14+
'end_date': '2021-01-27',
15+
'end_time': '15:01',
16+
'location_type': 'vc_url',
17+
'location': 'https://us02web.zoom.us/j/875384596',
18+
'description': 'content',
19+
'color': 'red',
20+
'availability': 'busy',
21+
'privacy': 'public'
22+
}
23+
24+
WRONG_EVENT_FORM_DATA = {
25+
'title': 'test title',
26+
'start_date': '2021-01-28',
27+
'start_time': '15:59',
28+
'end_date': '2021-01-27',
29+
'end_time': '15:01',
30+
'location_type': 'vc_url',
31+
'location': 'not a zoom link',
32+
'description': 'content',
33+
'color': 'red',
34+
'availability': 'busy',
35+
'privacy': 'public'
36+
}
737

838
INVALID_UPDATE_OPTIONS = [
939
{}, {"test": "test"}, {"start": "20.01.2020"},
@@ -13,7 +43,6 @@
1343

1444

1545
class TestEvent:
16-
1746
def test_eventedit(self, client):
1847
response = client.get("/event/edit")
1948
assert response.ok
@@ -28,6 +57,19 @@ def test_eventview_without_id(self, client):
2857
response = client.get("/event/view")
2958
assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED
3059

60+
def test_eventedit_post_correct(self, client, user):
61+
response = client.post(client.app.url_path_for('create_new_event'),
62+
data=CORRECT_EVENT_FORM_DATA)
63+
assert response.ok
64+
assert response.status_code == HTTP_302_FOUND
65+
assert (client.app.url_path_for('eventview', id=1).strip('1')
66+
in response.headers['location'])
67+
68+
def test_eventedit_post_wrong(self, client, user):
69+
response = client.post(client.app.url_path_for('create_new_event'),
70+
data=WRONG_EVENT_FORM_DATA)
71+
assert response.json()['detail'] == 'VC type with no valid zoom link'
72+
3173
@staticmethod
3274
@pytest.mark.parametrize("data", INVALID_UPDATE_OPTIONS)
3375
def test_invalid_update(event, data, session):

0 commit comments

Comments
 (0)