From 302fe4289ad95b0a12521b6c15e28039a62a4c97 Mon Sep 17 00:00:00 2001 From: Cara Salter Date: Wed, 28 Aug 2024 16:16:45 -0400 Subject: [PATCH] Init event checkin structure --- acmsite/dashboard/__init__.py | 42 ++++++++++++++++++- acmsite/models.py | 6 +++ acmsite/templates/dashboard.html | 12 ++++++ .../53a76e988b5a_add_event_checkins.py | 35 ++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/53a76e988b5a_add_event_checkins.py diff --git a/acmsite/dashboard/__init__.py b/acmsite/dashboard/__init__.py index cda7b5e..642c89a 100644 --- a/acmsite/dashboard/__init__.py +++ b/acmsite/dashboard/__init__.py @@ -1,9 +1,47 @@ -from flask import Blueprint, render_template +from datetime import datetime +from flask import Blueprint, current_app, flash, redirect, render_template, url_for +from flask_login import login_required, current_user +from ulid import ulid + +from acmsite.models import Event, EventCheckin +from acmsite import db bp = Blueprint('dashboard', __name__, url_prefix='/dashboard') @bp.route("/") +@login_required def home(): - return render_template('dashboard.html') + now = datetime.now() + events = db.session.execute(db.select(Event).where(Event.start_time < now, + Event.end_time > + now)).scalars() + return render_template('dashboard.html', events=events) + +@bp.route("/checkin/") +@login_required +def checkin(event_id): + # actually first check if the event even exists + event = db.get_or_404(Event, event_id) + # first check if this user has already checked in + checkins = db.session.execute(db.select(EventCheckin).where(EventCheckin.user == + current_user.id, + EventCheckin.event + ==event_id)).scalar_one_or_none() + + current_app.logger.debug(checkins) + if checkins is None: + # There's not a checkin already, let's create one! + check = EventCheckin( + id = ulid(), + user = current_user.id, + event = event_id) + db.session.add(check) + db.session.commit() + + flash(f"Checked in to {event.name} successfully") + return redirect(url_for("dashboard.home")) + else: + flash(f"You've already checked in to {event.name}") + return redirect(url_for("dashboard.home")) diff --git a/acmsite/models.py b/acmsite/models.py index 2539229..3527652 100644 --- a/acmsite/models.py +++ b/acmsite/models.py @@ -80,6 +80,12 @@ class Event(db.Model): "end_time": self.end_time.isoformat(), } +class EventCheckin(db.Model): + __tablename__ = "acm_checkins" + id = Column(String, primary_key=True) + user = Column(String, ForeignKey("acm_users.id"), nullable=False) + event = Column(String, ForeignKey("acm_events.id"), nullable=False) + class Link(db.Model): __tablename__ = "acm_links" id = Column(String, primary_key=True) diff --git a/acmsite/templates/dashboard.html b/acmsite/templates/dashboard.html index c88eaf5..d48d043 100644 --- a/acmsite/templates/dashboard.html +++ b/acmsite/templates/dashboard.html @@ -4,6 +4,18 @@

Welcome back, {{ current_user.first_name }}!

+{% if events %} + +

The following events are available for check-in:

+{% for e in events %} +{{ e.name }} +{% endfor %} +{% else %} +

There are no events available for check-in.

+{% endif %} + +
+

For a list of upcoming events, take a look at our events diff --git a/migrations/versions/53a76e988b5a_add_event_checkins.py b/migrations/versions/53a76e988b5a_add_event_checkins.py new file mode 100644 index 0000000..5819ffe --- /dev/null +++ b/migrations/versions/53a76e988b5a_add_event_checkins.py @@ -0,0 +1,35 @@ +"""add event checkins + +Revision ID: 53a76e988b5a +Revises: 300f24071c14 +Create Date: 2024-08-25 15:18:22.451548 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '53a76e988b5a' +down_revision = '300f24071c14' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('acm_checkins', + sa.Column('id', sa.String(), nullable=False), + sa.Column('user', sa.String(), nullable=False), + sa.Column('event', sa.String(), nullable=False), + sa.ForeignKeyConstraint(['event'], ['acm_events.id'], ), + sa.ForeignKeyConstraint(['user'], ['acm_users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('acm_checkins') + # ### end Alembic commands ###