Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
17 changes: 16 additions & 1 deletion app/dao/events_dao.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from datetime import datetime, timedelta

from app import db
from app.dao.decorators import transactional
from app.models import Event
from app.models import Event, EventDate


@transactional
Expand All @@ -17,3 +19,16 @@ def dao_update_event(event_id, **kwargs):

def dao_get_events():
return Event.query.order_by(Event.id).all()


def dao_get_future_events():
return Event.query.join(EventDate).filter(
EventDate.event_datetime >= datetime.today()
).order_by(Event.id).all()


def dao_get_past_year_events():
return Event.query.join(EventDate).filter(
EventDate.event_datetime < datetime.today(),
EventDate.event_datetime > datetime.today() - timedelta(days=365)
).order_by(Event.id).all()
7 changes: 6 additions & 1 deletion app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ class Event(db.Model):
venue = db.relationship("Venue", backref=db.backref("event", uselist=False))

def serialize(self):
def sorted_event_dates():
dates = [e.serialize() for e in self.event_dates]
dates.sort(key=lambda k: k['event_datetime'])
return dates

return {
'id': self.id,
'old_id': self.old_id,
Expand All @@ -128,7 +133,7 @@ def serialize(self):
'multi_day_fee': self.multi_day_fee,
'multi_day_conc_fee': self.multi_day_conc_fee,
'venue': self.venue.serialize() if self.venue else None,
'event_dates': [e.serialize() for e in self.event_dates]
'event_dates': sorted_event_dates()
}

def __repr__(self):
Expand Down
34 changes: 28 additions & 6 deletions app/routes/events/rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@

from flask_jwt_extended import jwt_required

from app.dao.events_dao import dao_create_event, dao_get_events, dao_update_event
from app.dao.events_dao import (
dao_create_event, dao_get_events, dao_get_future_events, dao_get_past_year_events, dao_update_event
)
from app.dao.event_dates_dao import dao_create_event_date
from app.dao.event_types_dao import dao_get_event_type_by_old_id
from app.dao.speakers_dao import dao_get_speaker_by_name
Expand All @@ -26,15 +28,35 @@
register_errors(events_blueprint)


def extract_startdate(json):
if json['event_dates']:
return json['event_dates'][0]['event_datetime']
else:
return 0


@events_blueprint.route('/events')
@jwt_required
def get_events():
events = [e.serialize() if e else None for e in dao_get_events()]

def extract_startdate(json):
if json['event_dates']:
return json['event_dates'][0]['event_datetime']
else:
return 0
events.sort(key=extract_startdate)
return jsonify(events)


@events_blueprint.route('/events/future')
@jwt_required
def get_future_events():
events = [e.serialize() if e else None for e in dao_get_future_events()]

events.sort(key=extract_startdate)
return jsonify(events)


@events_blueprint.route('/events/past_year')
@jwt_required
def get_past_year_events():
events = [e.serialize() if e else None for e in dao_get_past_year_events()]

events.sort(key=extract_startdate)
return jsonify(events)
Expand Down
60 changes: 36 additions & 24 deletions integration_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,22 @@ function GetFees {
-H "Authorization: Bearer $TKN" | jq .
}

function GetEvents {
echo "*** Get events ***"

curl -X GET $api_server'/events' \
-H "Accept: application/json" \
-H "Authorization: Bearer $TKN"
}

function GetFutureEvents {
echo "*** Get future events ***"

curl -X GET $api_server'/events/future' \
-H "Accept: application/json" \
-H "Authorization: Bearer $TKN"
}

function GetEventTypes {
echo "*** Get event_types ***"

Expand Down Expand Up @@ -229,18 +245,6 @@ function Logout {
-H "Authorization: Bearer $TKN" | jq .
}

# API calls
# GetFees
# GetEventTypes
# PostSpeakers
# GetSpeakers
# ImportVenues
# GetVenues
# ExtractSpeakers
# ImportEvents
# Logout
# GetFees

# setup
setupURLS "$2"
setupAccessToken
Expand All @@ -254,40 +258,48 @@ fi
case "$arg" in

-a) echo "Run all"
GetFees
GetEventTypes
ExtractSpeakers
ImportEventTypes
ImportSpeakers
GetSpeakers
ImportVenues
GetFees
GetEventTypes
GetSpeakers
GetVenues
ExtractSpeakers
Logout
GetFees
;;

-es)
ExtractSpeakers
;;

-et)
GetEventTypes
;;

-iet)
ImportEventTypes
-e)
GetEvents
;;

-iv)
ImportVenues
-fe)
GetFutureEvents
;;

-s)
GetSpeakers
;;

-is)
ImportSpeakers
-iet)
ImportEventTypes
;;

-es)
ExtractSpeakers
-iv)
ImportVenues
;;

-is)
ImportSpeakers
;;

-ie)
Expand Down
37 changes: 36 additions & 1 deletion tests/app/dao/test_events_dao.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
from app.dao.events_dao import dao_create_event, dao_update_event, dao_get_events
from freezegun import freeze_time

from app.dao.events_dao import (
dao_create_event, dao_update_event, dao_get_events, dao_get_future_events, dao_get_past_year_events
)
from app.models import Event

from tests.db import create_event, create_event_date
Expand Down Expand Up @@ -35,3 +39,34 @@ def it_gets_all_events(self, db, db_session, sample_event, sample_event_type):

assert Event.query.count() == 2
assert set(events) == set(events_from_db)

@freeze_time("2018-01-10T19:00:00")
def it_gets_all_future_events(self, db, db_session, sample_event_with_dates, sample_event_type):
event = create_event(
title='future event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2018-01-20T19:00:00')]
)
events_from_db = dao_get_future_events()

assert Event.query.count() == 2
assert len(events_from_db) == 1
assert events_from_db[0] == event

@freeze_time("2018-01-10T19:00:00")
def it_gets_past_year_events(self, db, db_session, sample_event_with_dates, sample_event_type):
create_event(
title='way past last year event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2016-01-01T19:00:00')]
)
create_event(
title='future event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2018-01-20T19:00:00')]
)
events_from_db = dao_get_past_year_events()

assert Event.query.count() == 3
assert len(events_from_db) == 1
assert events_from_db[0] == sample_event_with_dates
57 changes: 54 additions & 3 deletions tests/app/routes/events/test_rest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
import pytest
from flask import json, url_for

from freezegun import freeze_time

from app.dao.events_dao import dao_update_event
from app.dao.event_dates_dao import dao_update_event_date
from app.models import EventDate
from app.models import EventDate, Event

from tests.conftest import create_authorization_header
from tests.db import create_event, create_event_date, create_event_type, create_speaker
Expand Down Expand Up @@ -84,11 +86,59 @@ class WhenGettingEvents(object):

def it_returns_all_events(self, client, sample_event, db_session):
response = client.get(
url_for('events.get_events')
url_for('events.get_events'),
headers=[('Content-Type', 'application/json'), create_authorization_header()]
)

data = json.loads(response.get_data(as_text=True))
assert len(data) == 1

@freeze_time("2018-01-10T19:00:00")
def it_returns_all_future_events(self, client, sample_event_with_dates, sample_event_type, db_session):
event_1 = create_event(
title='future event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2018-01-20T19:00:00')]
)
event_2 = create_event(
title='future event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2018-01-25T19:00:00')]
)

response = client.get(
url_for('events.get_future_events'),
headers=[('Content-Type', 'application/json'), create_authorization_header()]
)

data = json.loads(response.get_data(as_text=True))
assert Event.query.count() == 3
assert len(data) == 2
assert data[0]['id'] == str(event_1.id)
assert data[1]['id'] == str(event_2.id)

@freeze_time("2018-01-10T19:00:00")
def it_returns_past_year_events(self, client, sample_event_with_dates, sample_event_type, db_session):
create_event(
title='future event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2018-01-20T19:00:00')]
)
create_event(
title='way past year event',
event_type_id=sample_event_type.id,
event_dates=[create_event_date(event_datetime='2016-01-25T19:00:00')]
)

response = client.get(
url_for('events.get_past_year_events'),
headers=[('Content-Type', 'application/json'), create_authorization_header()]
)

data = json.loads(response.get_data(as_text=True))
assert Event.query.count() == 3
assert len(data) == 1
assert data[0]['id'] == str(sample_event_with_dates.id)

def it_returns_all_events_with_event_dates(self, client, sample_speaker, sample_event_type, db_session):
event_date_1 = create_event_date(event_datetime="2018-01-03")
Expand All @@ -100,7 +150,8 @@ def it_returns_all_events_with_event_dates(self, client, sample_speaker, sample_
create_event(event_type_id=sample_event_type.id, event_dates=[event_date_earliest])

response = client.get(
url_for('events.get_events')
url_for('events.get_events'),
headers=[('Content-Type', 'application/json'), create_authorization_header()]
)

data = json.loads(response.get_data(as_text=True))
Expand Down
12 changes: 12 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,13 @@ def sample_event(db):
return create_event(title='test_title', description='test description')


@pytest.fixture(scope='function')
def sample_event_with_dates(db, sample_event_date_without_event):
return create_event(
title='test_title', description='test description', event_dates=[sample_event_date_without_event]
)


@pytest.fixture(scope='function')
def sample_event_type(db):
return create_event_type(event_type='short course')
Expand All @@ -87,6 +94,11 @@ def sample_event_date(db, sample_event):
return create_event_date(event_id=sample_event.id)


@pytest.fixture(scope='function')
def sample_event_date_without_event(db):
return create_event_date()


@pytest.fixture(scope='function')
def sample_fee(db, sample_event_type):
return create_fee(fee=5, conc_fee=3, event_type_id=sample_event_type.id)
Expand Down
5 changes: 2 additions & 3 deletions tests/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,10 @@ def create_event(
}
event = Event(**data)

dao_create_event(event)

if event_dates:
event.event_dates.extend(event_dates)
db.session.commit()

dao_create_event(event)

return event

Expand Down