Skip to content

Feature/event categories #212

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -148,3 +148,5 @@ app/.vscode/

# PyCharm
.idea

junit/
10 changes: 5 additions & 5 deletions app/routers/agenda.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def calc_dates_range_for_agenda(
start: Optional[date],
end: Optional[date],
days: Optional[int],
) -> Tuple[date, date]:
) -> Tuple[date, date]:
"""Create start and end dates according to the parameters in the page."""
if days is not None:
start = date.today()
Expand All @@ -35,17 +35,17 @@ def agenda(
start_date: Optional[date] = None,
end_date: Optional[date] = None,
days: Optional[int] = None,
) -> _TemplateResponse:
) -> _TemplateResponse:
"""Route for the agenda page, using dates range or exact amount of days."""

user_id = 1 # there is no user session yet, so I use user id- 1.
user_id = 1 # there is no user session yet, so I use user id- 1.
start_date, end_date = calc_dates_range_for_agenda(
start_date, end_date, days
)
)

events_objects = agenda_events.get_events_per_dates(
db, user_id, start_date, end_date
)
)
events = defaultdict(list)
for event_obj in events_objects:
event_duration = agenda_events.get_time_delta_string(
Expand Down
12 changes: 6 additions & 6 deletions app/routers/calendar_grid.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def __init__(self, date: datetime):
self.date: datetime = date
self.sday: str = self.date.strftime("%A")
self.dailyevents: List[Tuple] = []
self.events: List[Tuple] = []
self.events: List[Tuple] = []
self.css: Dict[str, str] = {
'day_container': 'day',
'date': 'day-number',
Expand Down Expand Up @@ -79,7 +79,7 @@ def __init__(self, date: datetime):
super().__init__(date)
self.css = {
'day_container': 'day ',
'date': ' '.join(['day-number', 'text-gray']),
'date': ' '.join(['day-number', 'text-gray']),
'daily_event': 'month-event',
'daily_event_front': ' '.join([
'daily',
Expand All @@ -100,7 +100,7 @@ class Today(Day):
def __init__(self, date: datetime):
super().__init__(date)
self.css = {
'day_container': ' '.join([
'day_container': ' '.join([
'day',
'text-darkblue',
'background-yellow'
Expand Down Expand Up @@ -134,7 +134,7 @@ def __init__(self, date: datetime):
]),
'date': 'day-number',
'daily_event': 'month-event',
'daily_event_front': ' '.join([
'daily_event_front': ' '.join([
'daily front',
'text-lightgray',
'background-red'
Expand Down Expand Up @@ -196,8 +196,8 @@ def get_n_days(date: datetime, n: int) -> Iterator[Day]:


def create_weeks(
days: Iterator[Day],
length: int = Week.WEEK_DAYS
days: Iterator[Day],
length: int = Week.WEEK_DAYS
) -> List[Week]:
"""Return lists of Weeks objects."""
ndays: List[Day] = list(days)
Expand Down
9 changes: 9 additions & 0 deletions app/routers/categories.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,15 @@ class CategoryModel(BaseModel):
color: str
user_id: int

class Config:
schema_extra = {
"example": {
"name": "Guitar lessons",
"color": "#aabbcc",
"user_id": 1,
}
}


# TODO(issue#29): get current user_id from session
@router.get("/")
Expand Down
30 changes: 18 additions & 12 deletions app/routers/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,20 @@ async def create_new_event(request: Request, session=Depends(get_db)):
end = datetime.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", "[email protected]", session)
user = user if user else create_user(username="u", password="p",
email="[email protected]", language="",
session=session)
owner_id = user.id
location_type = data['location_type']
is_zoom = location_type == 'vc_url'
location = data['location']
category_id = data.get('category_id')

if is_zoom:
validate_zoom_link(location)

event = create_event(session, title, start, end, owner_id, content,
location)
location, category_id=category_id)
return RedirectResponse(router.url_path_for('eventview',
event_id=event.id),
status_code=status.HTTP_302_FOUND)
Expand All @@ -74,7 +77,8 @@ async def eventview(request: Request, event_id: int,
'start': datetime,
'end': datetime,
'content': (str, type(None)),
'location': (str, type(None))
'location': (str, type(None)),
'category_id': (int, type(None))
}


Expand Down Expand Up @@ -109,14 +113,13 @@ def by_id(db: Session, event_id: int) -> Event:


def is_end_date_before_start_date(
start_date: datetime, end_date: datetime) -> bool:
start_date: datetime, end_date: datetime) -> bool:
"""Check if the start date is earlier than the end date"""

return start_date > end_date


def check_change_dates_allowed(
old_event: Event, event: Dict[str, Any]):
def check_change_dates_allowed(old_event: Event, event: Dict[str, Any]):
allowed = 1
try:
start_date = event.get('start', old_event.start)
Expand All @@ -127,8 +130,8 @@ def check_change_dates_allowed(
allowed = 0
if allowed == 0:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Invalid times")
status_code=status.HTTP_400_BAD_REQUEST,
detail="Invalid times")


def is_fields_types_valid(to_check: Dict[str, Any], types: Dict[str, Any]):
Expand Down Expand Up @@ -163,8 +166,8 @@ def _update_event(db: Session, event_id: int, event_to_update: Dict) -> Event:
except (AttributeError, SQLAlchemyError) as e:
logger.exception(str(e))
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Internal server error")
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Internal server error")


def update_event(event_id: int, event: Dict, db: Session
Expand All @@ -181,7 +184,10 @@ def update_event(event_id: int, event: Dict, db: Session
return event_updated


def create_event(db, title, start, end, owner_id, content=None, location=None):
def create_event(db: Session, title: str, start, end, owner_id: int,
content: str = None,
location: str = None,
category_id: int = None):
"""Creates an event and an association."""

event = create_model(
Expand All @@ -192,6 +198,7 @@ def create_event(db, title, start, end, owner_id, content=None, location=None):
content=content,
owner_id=owner_id,
location=location,
category_id=category_id,
)
create_model(
db, UserEvent,
Expand Down Expand Up @@ -240,7 +247,6 @@ def _delete_event(db: Session, event: Event):
@router.delete("/{event_id}")
def delete_event(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)
Expand Down
6 changes: 3 additions & 3 deletions app/templates/agenda.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

{% block content %}
<form method="GET" action="/agenda">
<div class="mb-3 agenda_filters">
<div class="mb-3 agenda_filters">
<label for="start_date">From</label><br>
<input class="filter" type="date" id="start_date" name="start_date" value={{ start_date }}><br>
<input class="filter" type="date" id="start_date" name="start_date" value='{{ start_date }}'><br>
<label for="end_date">To</label><br>
<input class="filter" type="date" id="end_date" name="end_date" value={{ end_date }}><br>
<input class="filter" type="date" id="end_date" name="end_date" value='{{ end_date }}'><br>
<input class="filter" type="submit" value="Get Agenda">
</div>
</form>
Expand Down
1 change: 1 addition & 0 deletions app/templates/search.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ <h1>Hello, {{ username }}</h1>
<div class="col my-1">
<input type="submit" class="btn btn-primary" value="Search">
</div>
</div>
</form>
</div>

Expand Down
1 change: 0 additions & 1 deletion schema.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
│ ├── agenda_style.css
│ ├── popover.js
│ ├── style.css
│ ├── popover.js
│ ├── templates
│ ├── base.html
│ ├── home.html
Expand Down
4 changes: 2 additions & 2 deletions tests/category_fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@


@pytest.fixture
def category(session: Session, user: User) -> Category:
def category(session: Session, sender: User) -> Category:
category = Category.create(session, name="Guitar Lesson", color="121212",
user_id=user.id)
user_id=sender.id)
yield category
session.delete(category)
session.commit()
5 changes: 3 additions & 2 deletions tests/event_fixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
import pytest
from sqlalchemy.orm import Session

from app.database.models import Event, User
from app.database.models import Event, User, Category
from app.routers.event import create_event

today_date = datetime.today().replace(hour=0, minute=0, second=0)


@pytest.fixture
def event(sender: User, session: Session) -> Event:
def event(sender: User, category: Category, session: Session) -> Event:
return create_event(
db=session,
title='event',
Expand All @@ -19,6 +19,7 @@ def event(sender: User, session: Session) -> Event:
content='test event',
owner_id=sender.id,
location="Some random location",
category_id=category.id,
)


Expand Down
2 changes: 1 addition & 1 deletion tests/test_agenda_route.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def test_agenda_page_no_arguments_when_today_events_exist(
next_month_event, old_event
):
resp = agenda_test_client.get(TestAgenda.AGENDA)
assert resp.status_code == status.HTTP_200_OK
assert resp.ok
assert b"event 1" in resp.content
assert b"event 2" in resp.content
assert b"event 3" not in resp.content
Expand Down
15 changes: 11 additions & 4 deletions tests/test_categories.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ def test_creating_new_category(client, user):
set(response.json()['category'].items()))

@staticmethod
def test_creating_not_unique_category_failed(client, user, category):
response = client.post("/categories/", json={"user_id": user.id,
def test_creating_not_unique_category_failed(client, sender, category):
response = client.post("/categories/", json={"user_id": sender.id,
"name": "Guitar Lesson",
"color": "121212"})
assert response.status_code == status.HTTP_400_BAD_REQUEST
Expand All @@ -42,6 +42,13 @@ def test_create_event_with_category(category):
assert event.category_id is not None
assert event.category_id == category.id

@staticmethod
def test_update_event_with_category(today_event, category):
assert today_event.category_id is None
today_event.category_id = category.id
assert today_event.category_id is not None
assert today_event.category_id == category.id

@staticmethod
def test_get_user_categories(client, category):
response = client.get(f"/categories/?user_id={category.user_id}"
Expand All @@ -52,7 +59,7 @@ def test_get_user_categories(client, category):
("name", "Guitar Lesson"), ("id", category.id)}

@staticmethod
def test_get_category_by_name(client, user, category):
def test_get_category_by_name(client, sender, category):
response = client.get(f"/categories/?user_id={category.user_id}"
f"&name={category.name}")
assert response.ok
Expand All @@ -61,7 +68,7 @@ def test_get_category_by_name(client, user, category):
("name", "Guitar Lesson"), ("id", category.id)}

@staticmethod
def test_get_category_by_color(client, user, category):
def test_get_category_by_color(client, sender, category):
response = client.get(f"/categories/?user_id={category.user_id}&"
f"color={category.color}")
assert response.ok
Expand Down
Loading