Skip to content
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

Add Qr code scanner code #26

Merged
merged 7 commits into from
Oct 25, 2024
Merged
Show file tree
Hide file tree
Changes from 4 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
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
Loading