Skip to content
Merged
Show file tree
Hide file tree
Changes from 10 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
13 changes: 13 additions & 0 deletions app/internal/event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import re

from fastapi import HTTPException

from starlette.status import HTTP_400_BAD_REQUEST

ZOOM_REGEX = re.compile(r'https://.*?\.zoom.us/[a-z]/.[^.,\b\s]+')


def validate_zoom_link(location):
if ZOOM_REGEX.search(location) is None:
raise HTTPException(status_code=HTTP_400_BAD_REQUEST,
detail="VC type with no valid zoom link")
33 changes: 33 additions & 0 deletions app/routers/event.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
from datetime import datetime as dt
from operator import attrgetter
from typing import List

from fastapi import APIRouter, Request
from fastapi import Depends
from fastapi.responses import RedirectResponse
from starlette.status import HTTP_303_SEE_OTHER

from app.database.database import get_db
from app.database.models import Event
from app.database.models import User
from app.database.models import UserEvent
from app.dependencies import templates
from app.internal.event import validate_zoom_link
from app.internal.utils import create_model
from app.routers.user import create_user

router = APIRouter(
prefix="/event",
Expand All @@ -21,6 +29,31 @@ async def eventedit(request: Request):
{"request": request})


@router.post("/edit")
async def create_new_event(request: Request, session=Depends(get_db)):
data = await request.form()
title = data['title']
content = data['description']
start = dt.strptime(data['start_date'] + ' ' + data['start_time'],
'%Y-%m-%d %H:%M')
end = dt.strptime(data['end_date'] + ' ' + data['end_time'],
'%Y-%m-%d %H:%M')
user = session.query(User).filter_by(id=1).first()
user = user if user else create_user("u", "p", "e@mail.com", session)
owner_id = user.id
location_type = data['location_type']
is_zoom = location_type == 'vc_url'
location = data['location']

if is_zoom:
validate_zoom_link(location)

event = create_event(session, title, start, end, owner_id, content,
location)
return RedirectResponse(f'/event/view/{event.id}',
status_code=HTTP_303_SEE_OTHER)


@router.get("/view/{id}")
async def eventview(request: Request, id: int):
return templates.TemplateResponse("event/eventview.html",
Expand Down
42 changes: 40 additions & 2 deletions tests/test_event.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
from starlette.status import HTTP_404_NOT_FOUND
from starlette.status import HTTP_303_SEE_OTHER, HTTP_404_NOT_FOUND

CORRECT_EVENT_FORM_DATA = {
'title': 'test title',
'start_date': '2021-01-28',
'start_time': '15:59',
'end_date': '2021-01-27',
'end_time': '15:01',
'location_type': 'vc_url',
'location': 'https://us02web.zoom.us/j/875384596',
'description': 'content',
'color': 'red',
'availability': 'busy',
'privacy': 'public'
}

WRONG_EVENT_FORM_DATA = {
'title': 'test title',
'start_date': '2021-01-28',
'start_time': '15:59',
'end_date': '2021-01-27',
'end_time': '15:01',
'location_type': 'vc_url',
'location': 'not a zoom link',
'description': 'content',
'color': 'red',
'availability': 'busy',
'privacy': 'public'
}

class TestEvent:

class TestEvent:
def test_eventedit(self, client):
response = client.get("/event/edit")
assert response.ok
Expand All @@ -17,5 +44,16 @@ def test_eventview_without_id(self, client):
response = client.get("/event/view")
assert response.status_code == HTTP_404_NOT_FOUND

def test_eventedit_post_correct(self, client, user):
response = client.post("/event/edit",
data=CORRECT_EVENT_FORM_DATA)
assert response.status_code == HTTP_303_SEE_OTHER
assert '/event/view/' in response.headers['location']

def test_eventedit_post_wrong(self, client, user):
response = client.post("/event/edit",
data=WRONG_EVENT_FORM_DATA)
assert response.json()['detail'] == 'VC type with no valid zoom link'

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