Skip to content

Commit

Permalink
Merge pull request #26 from ieeeuoft/qr-code-scanner
Browse files Browse the repository at this point in the history
Add Qr code scanner code
  • Loading branch information
Mustaballer authored Oct 25, 2024
2 parents 89d7ba6 + d4789a9 commit ffb0a36
Show file tree
Hide file tree
Showing 13 changed files with 1,258 additions and 19 deletions.
128 changes: 128 additions & 0 deletions hackathon_site/event/jinja2/event/admin_qr_scanner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
{% extends "event/base.html" %}

{% block nav_links %}
<li><a href="{{ url("event:dashboard") }}" class="active">Dashboard</a></li>
<li><a href="{{ url("event:change_password") }}">Change Password</a></li>
{% endblock %}

{% block body %}
<div class="ombreBackgroundDark3">
<div class="container">
<div class="section">
<div class="borderTopDiv z-depth-3">

{% if get_messages(request) %}
{% for message in get_messages(request) %}
<p id="submitMessage" class="banner banner{{ message.tags }}"> {{ message }} </p>
{% endfor %}
{% endif %}

<h1 class="formH1">QR Scanner for Sign-In</h1>
{% if get_curr_sign_in_time(true) %}
<p class="banner bannerinfo"> Current sign in event: <b>{{ get_curr_sign_in_time(true) }}</b> </p>
{% else %}
<p class="banner bannerwarning"> There is currently no event to sign in </p>
{% endif %}

<video id="scanner" style="width: 100%; max-height: 250px; margin: 10px auto"></video>

<br/>

{% if not sign_in_form %}
<h4 class="errorText" style="text-align: center"> {{ hackathon_name }} is not happening now </h4>
{% else %}
<div id="studentInfo">
<h2 class="formH1">Student Information</h2>
<form method="post">
<table>
<tr>
<td>Name</td>
<td id="studentName"></td>
</tr>
<tr>
<td>Email</td>
<td>
{{ csrf_input }}
<div class="input-field">
{{ sign_in_form.email }}

{% if sign_in_form.email.errors %}
<span class="formFieldError">
{% for error in sign_in_form.email.errors %}
{{ error }}
<br />
{% endfor %}
</span>
{% endif %}
</div>
</td>
</tr>
</table>
{% if get_curr_sign_in_time() %}
<button
class="btn-large waves-effect waves-light colorBtn" style="margin-top: 15px"
type="submit" id="signInButton">
Sign-In
</button>
{% endif %}
</form>
</div>
{% endif %}

<br/>

<table>
<tr>
<th>Event</th>
<th>Time</th>
<th>Sign In Interval</th>
<th>Scanned</th>
</tr>
{% for event in sign_in_times %}
<tr class="{{'bannerinfo' if get_curr_sign_in_time() == event.name }}">
<td> {{ event.description }} </td>
<td> {{ event.time.strftime("%H:%M, %b %d") }} </td>
<td> {{ get_sign_in_interval(event.time) }} </td>
<td> {{ sign_in_counts[event.name] }} </td>
</tr>
{% endfor %}
</table>
</div>
</div>
</div>
</div>
{% endblock %}

{% block scripts %}
<script src="{{ static('event/js/qr-scanner.umd.min.js') }}"></script>
<script type="text/javascript">
const videoElem = document.getElementById("scanner");
let oldData = '';

const qrScanner = new QrScanner(
videoElem,
(result) => {
if (result) {
if (result.data !== oldData) {
data = result.data.split(";");
$("#studentName").text(`${data[0]} ${data[1]}`);
$("#id_email").val(data[2]);
$("#studentInfo").show();
$("#submitMessage").text('')
oldData = result.data;
}
} else {
oldData = '';
$("#studentInfo").hide();
}
},
{
onDecodeError: (error) => {},
highlightScanRegion: true,
highlightCodeOutline: true,
},
);
qrScanner.setInversionMode('both');
qrScanner.start();
</script>
{% endblock %}
66 changes: 66 additions & 0 deletions hackathon_site/event/jinja2/event/dashboard_admin.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{% extends "event/base.html" %}

{% block nav_links %}
<li><a href="{{ url("event:dashboard") }}" class="active">Dashboard</a></li>
<li><a href="{{ url("event:change_password") }}">Change Password</a></li>
{% endblock %}

{% block body %}
<div class="ombreBackgroundDark3">
<div class="container">
<div class="section">
<div class="borderTopDiv z-depth-3">
<h1 class="formH1">Admin Dashboard</h1>

<h2 class="formH2">Administrative Actions</h2>
<div class="btn-group-sm">
<a href="{{ url("event:qr-scanner") }}" class="btn-sm btn-small waves-effect waves-light colorBtn">
Scan QR Code
</a>
<a href="" class="btn-sm btn-small waves-effect waves-light colorBtn">
Review Applications
</a>
<a href="" class="btn-sm btn-small waves-effect waves-light colorBtn">
View Applications
</a>
</div>

<br/>

<h2 class="formH2">Export Data to Google Sheets</h2>
<p>Clicking any of the below buttons will export the respective data to google sheets in this folder. Files will not be replaced, a new file will be created any time new data is exported.</p>
<p>(Work In Progress)</p>
<br/>
<div class="btn-group-sm">
<button disabled class="btn-sm btn-small waves-effect waves-light colorBtn"
type="submit">User Data</button>
<button disabled class="btn-sm btn-small waves-effect waves-light colorBtn"
type="submit">Application Data</button>
<button disabled class="btn-sm btn-small waves-effect waves-light colorBtn"
type="submit">Review Data</button>
<button disabled class="btn-sm btn-small waves-effect waves-light colorBtn"
type="submit">Sign-In Data</button>
</div>
</div>

<div class="borderTopDiv z-depth-3">
<h1 class="formH1">Analytics</h1>
<table>
<tr>
<td>Total number of sign-ups:</td>
<td>345</td>
</tr>
<tr>
<td>Total number of completed applications:</td>
<td>215</td>
</tr>
<tr>
<td>Total number of completed reviews:</td>
<td>0</td>
</tr>
</table>
</div>
</div>
</div>
</div>
{% endblock %}
19 changes: 15 additions & 4 deletions hackathon_site/event/jinja2/event/dashboard_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,10 @@ <h4 class="formH2"><b>Congratulations!</b> You've been accepted into {{ hackatho
{% if (application.rsvp and using_rsvp) or not using_rsvp %}
<p>Make sure you read the <a class="primaryText hoverLink" href="{{ participant_package_link }}" rel="noopener" target="_blank">participant package</a> for all the info regarding
the event, and join our <a class="primaryText hoverLink" href="{{ chat_room_link }}" rel="noopener" target="_blank">{{ chat_room_name }}</a>. Stay tuned for more updates regarding detailed event logistics, and we hope to see you soon!</p> <br />
<!-- TODO QR SCANNER CODE: <div style="margin-bottom: 15px; display: flex; flex-direction: column; align-items: center">
<div style="margin-bottom: 15px; display: flex; flex-direction: column; align-items: center">
<p>Please show the QR code below to the front desk to sign-in. .</p>
<canvas id="qrcode" style="width: 150px; height: 150px; margin: 10px auto"></canvas>
</div> -->
</div>
{% endif %}
<p>If you have questions, read the <a class="primaryText hoverLink" href="#faq">FAQ</a>, or feel free to contact us.</p> <br />

Expand Down Expand Up @@ -116,8 +116,8 @@ <h4 class="formH2">You've been waitlisted for {{ hackathon_name }}</h4>
<p>The {{ hackathon_name }} team has reviewed your application, and have decided not to grant you a guaranteed spot
at {{ hackathon_name }} and to place you in our waitlist. On {{ waitlisted_acceptance_start_time.strftime("%B %-d, %Y, at %-I:%M %p") }}, we will begin allowing
people from the waitlist into the event on a first-come, first-serve basis if there is still room. We offer no
guarantee that you will be allowed into the event, regardless of how early you arrive. Please read our
<a class="primaryText hoverLink" href="{{ participant_package_link }}" rel="noopener" target="_blank">participant package</a> for all the info regarding the event if you plan on
guarantee that you will be allowed into the event, regardless of how early you arrive. Please read our
<a class="primaryText hoverLink" href="{{ participant_package_link }}" rel="noopener" target="_blank">participant package</a> for all the info regarding the event if you plan on
waiting to see if any spots become available.
</p> <br />
<p>If you have questions, read the <a class="primaryText hoverLink" href="#faq">FAQ</a>, or feel free to contact us.</p> <br />
Expand Down Expand Up @@ -164,3 +164,14 @@ <h2 class="formH2" id="faq">Application FAQs</h2>
</div>
</div>
{% endblock %}

{% block scripts %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<script type="text/javascript">
var qrcode = new QRious({
element: document.getElementById("qrcode"),
value: "{{ user.first_name }};{{ user.last_name }};{{ user.email }}",
size: 150,
});
</script>
{% endblock %}
42 changes: 42 additions & 0 deletions hackathon_site/event/migrations/0009_useractivity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 3.2.15 on 2024-10-24 02:16

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("event", "0008_team_project_description"),
]

operations = [
migrations.CreateModel(
name="UserActivity",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("sign_in", models.DateTimeField(blank=True, null=True)),
("lunch1", models.DateTimeField(blank=True, null=True)),
("dinner1", models.DateTimeField(blank=True, null=True)),
("breakfast2", models.DateTimeField(blank=True, null=True)),
("lunch2", models.DateTimeField(blank=True, null=True)),
(
"user",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]
9 changes: 9 additions & 0 deletions hackathon_site/event/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,12 @@ def save(self, *args, **kwargs):

def __str__(self):
return f"{self.id} | {self.user.first_name} {self.user.last_name}"


class UserActivity(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
sign_in = models.DateTimeField(null=True, blank=True)
lunch1 = models.DateTimeField(null=True, blank=True)
dinner1 = models.DateTimeField(null=True, blank=True)
breakfast2 = models.DateTimeField(null=True, blank=True)
lunch2 = models.DateTimeField(null=True, blank=True)
Loading

0 comments on commit ffb0a36

Please sign in to comment.