UI rewrite #25
10 changed files with 345 additions and 310 deletions
|
@ -65,6 +65,16 @@ def mail():
|
|||
|
||||
return render_template("mail.html", NUM_HACKERS=total_count)
|
||||
|
||||
@bp.route("/users")
|
||||
@login_required
|
||||
def users():
|
||||
if not current_user.is_admin:
|
||||
return redirect(url_for("dashboard.home"))
|
||||
|
||||
users = User.query.all()
|
||||
|
||||
return render_template("users.html", users=users)
|
||||
|
||||
@bp.route("/send", methods=["POST"])
|
||||
@login_required
|
||||
def send():
|
||||
|
|
|
@ -1,280 +1 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Hack @ WPI</title>
|
||||
<link rel="icon" href="../static/favicon.png" type="image/png">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css" integrity="sha384-dNpIIXE8U05kAbPhy3G1cz+yZmTzA6CY8Vg/u2L9xRnHjJiAK76m2BIEaSEV+/aU" crossorigin="anonymous">
|
||||
<!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
|
||||
<script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
|
||||
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.4.3.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.css">
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
|
||||
<script src="{{url_for('static', filename='js/admin.js')}}"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
|
||||
</head>
|
||||
|
||||
|
||||
<style>
|
||||
.table-striped > tbody > tr:nth-of-type(odd) {
|
||||
background-color: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
.table-hover > tbody > tr:hover {
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sorttable_nosort):after {
|
||||
content: " \25B4\25BE"
|
||||
}
|
||||
|
||||
canvas {
|
||||
max-width: 500px;
|
||||
max-height: 500px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="contact-section" style="height: auto; background-repeat: repeat; background-size: contain;">
|
||||
<div class="container-fluid" style="margin-left: 3%; margin-right: 3%;">
|
||||
<div class="row" style="margin-top: 10%;">
|
||||
<h5>JSON object of users from MLH (Including dropped applications):</h5>
|
||||
<p><a href="{{ mlh_url }}"><b>Do NOT share this URL.</b></a></p>
|
||||
<h5>Get registered hackers only:</h5>
|
||||
<p><a href="{{url_for('admin.hackers')}}">JSON</a> <a
|
||||
href="{{url_for('admin.hackers_csv')}}">CSV</a></p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Gender:</h2>
|
||||
<canvas id="genderCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let genderCtx = document.getElementById('genderCanvas')
|
||||
let genderChart = new Chart(genderCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: ['Female', 'Male', 'Non-Binary/Other'],
|
||||
datasets: [
|
||||
{
|
||||
data: [{{ female_count }}, {{ male_count }}, {{ nb_count }}]
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Schools:</h2>
|
||||
<canvas id="schoolCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let schoolNames = []
|
||||
let schoolNums = []
|
||||
|
||||
{% for school in schools %}
|
||||
schoolNames.push('{{ school }}')
|
||||
schoolNums.push({{ schools[school] }})
|
||||
{% endfor %}
|
||||
|
||||
let schoolCtx = document.getElementById('schoolCanvas')
|
||||
let schoolChart = new Chart(schoolCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: schoolNames,
|
||||
datasets: [
|
||||
{
|
||||
data: schoolNums
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Majors:</h2>
|
||||
<canvas id="majorCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let majorNames = []
|
||||
let majorNums = []
|
||||
|
||||
{% for major in majors %}
|
||||
majorNames.push('{{ major }}')
|
||||
majorNums.push({{ majors[major] }})
|
||||
{% endfor %}
|
||||
|
||||
let majorCtx = document.getElementById('majorCanvas')
|
||||
let majorChart = new Chart(majorCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: majorNames,
|
||||
datasets: [
|
||||
{
|
||||
data: majorNums
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" style="">
|
||||
<h2 style="">Counts:</h2>
|
||||
<table id="counts" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Total</th>
|
||||
<th>Attendees</th>
|
||||
<th>Waitlist</th>
|
||||
<th>Checked In</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ total_count }}</td>
|
||||
<td>{{ (total_count - waitlist_count) }}</td>
|
||||
<td>{{ waitlist_count }}</td>
|
||||
<td>{{ check_in_count }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 style="margin-top: 2%;">Shirts:</h2>
|
||||
<table id="shirts" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>XXS</th>
|
||||
<th>XS</th>
|
||||
<th>S</th>
|
||||
<th>M</th>
|
||||
<th>L</th>
|
||||
<th>XL</th>
|
||||
<th>XXL</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ shirt_count['XXS'] }}</td>
|
||||
<td>{{ shirt_count['XS'] }}</td>
|
||||
<td>{{ shirt_count['S'] }}</td>
|
||||
<td>{{ shirt_count['M'] }}</td>
|
||||
<td>{{ shirt_count['L'] }}</td>
|
||||
<td>{{ shirt_count['XL'] }}</td>
|
||||
<td>{{ shirt_count['XXL'] }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 style="margin-top: 2%;">Hackers:</h2>
|
||||
<table id="hackers" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Options</th>
|
||||
<th>Checked In?</th>
|
||||
<th>Waitlisted?</th>
|
||||
<th>Admin</th>
|
||||
<th>MLH ID</th>
|
||||
<th>Time Registered</th>
|
||||
<th>Email</th>
|
||||
<th>Name</th>
|
||||
<th>Phone</th>
|
||||
<th>Shirt</th>
|
||||
<th>Special</th>
|
||||
<th>School</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for hacker in hackers %}
|
||||
<tr id="{{ hacker.id }}-row">
|
||||
<td>
|
||||
<div class="btn-group">
|
||||
<a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span
|
||||
class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
{% if not hacker.checked_in %}
|
||||
<li><a class="check_in" id="{{ hacker.id }}-check_in" href="#">Check In</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if hacker.waitlisted and not hacker.checked_in %}
|
||||
<li><a class="promote_from_waitlist"
|
||||
id="{{ hacker['id'] }}-promote_from_waitlist"
|
||||
href="#">Promote From Waitlist</a></li>
|
||||
{% endif %}
|
||||
<li class="divider"></li>
|
||||
{% if not hacker.checked_in %}
|
||||
<li><a class="drop" id="{{ hacker['id'] }}-drop" href="#">Drop Application</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if hacker.is_admin %}
|
||||
<li><a class="demote_admin" id="{{ hacker['id'] }}-demote_admin" href="#">Demote
|
||||
Admin</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li><a class="promote_admin" id="{{ hacker['id'] }}-promote_admin" href="#">Promote
|
||||
Admin</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
<td id="{{ hacker['id'] }}-checked_in">{{ hacker['checked_in'] }}</td>
|
||||
<td id="{{ hacker['id'] }}-waitlisted">{{ hacker['waitlisted'] }}</td>
|
||||
<td>{{ hacker.is_admin }}</td>
|
||||
<td>{{ hacker['id'] }}</td>
|
||||
<td>{{ hacker['last_login'] }}</td>
|
||||
<td>{{ hacker['email'] }}</td>
|
||||
<td>{{ hacker['first_name'] + ' ' + hacker['last_name'] }}</td>
|
||||
<td>{{ hacker['phone'] }}</td>
|
||||
<td>{{ hacker['shirt_size'] }}</td>
|
||||
<td>{{ hacker['accomodations'] }}</td>
|
||||
<td>{{ hacker['school'] }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(() => {
|
||||
setTimeout('let myTh = document.getElementsByTagName("th")[14]; sorttable.innerSortFunction.apply(myTh, []); sorttable.innerSortFunction.apply(myTh, []);', 50)
|
||||
})
|
||||
</script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
<script src="../static/js/jquery.easing.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
{% extends 'admin_base.html' %}
|
||||
|
|
24
goathacks/templates/admin_base.html
Normal file
24
goathacks/templates/admin_base.html
Normal file
|
@ -0,0 +1,24 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% block content %}
|
||||
<div class="d-flex flex-column">
|
||||
<div class="column mt-5">
|
||||
<ul class="nav nav-pills flex-column">
|
||||
<li class="nav-item"><a class="nav-link" href="{{ url_for('admin.home')
|
||||
}}">Dashboard</a></li>
|
||||
<li class="nav-item"><a class="nav-link"
|
||||
href="{{url_for('admin.users')}}">Users</a></li>
|
||||
<li class="nav-item"><a class="nav-link"
|
||||
href="{{url_for('admin.mail')}}">Bulk Mailer</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="{{
|
||||
url_for('admin.list_events')
|
||||
}}">Events</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
{% block admin_content %}
|
||||
<div class="column text-dark section">
|
||||
I'm still being worked on!
|
||||
</div>
|
||||
{% endblock admin_content %}
|
||||
</div>
|
||||
{% endblock %}
|
280
goathacks/templates/admin_old.html
Normal file
280
goathacks/templates/admin_old.html
Normal file
|
@ -0,0 +1,280 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Hack @ WPI</title>
|
||||
<link rel="icon" href="../static/favicon.png" type="image/png">
|
||||
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css" integrity="sha384-dNpIIXE8U05kAbPhy3G1cz+yZmTzA6CY8Vg/u2L9xRnHjJiAK76m2BIEaSEV+/aU" crossorigin="anonymous">
|
||||
<!--[if lt IE 9]> <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> <script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script><![endif]--><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
|
||||
|
||||
<script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
|
||||
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.4.3.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.css">
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
|
||||
<script src="{{url_for('static', filename='js/admin.js')}}"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.min.js"></script>
|
||||
</head>
|
||||
|
||||
|
||||
<style>
|
||||
.table-striped > tbody > tr:nth-of-type(odd) {
|
||||
background-color: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
.table-hover > tbody > tr:hover {
|
||||
background-color: rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sorttable_nosort):after {
|
||||
content: " \25B4\25BE"
|
||||
}
|
||||
|
||||
canvas {
|
||||
max-width: 500px;
|
||||
max-height: 500px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="contact-section" style="height: auto; background-repeat: repeat; background-size: contain;">
|
||||
<div class="container-fluid" style="margin-left: 3%; margin-right: 3%;">
|
||||
<div class="row" style="margin-top: 10%;">
|
||||
<h5>JSON object of users from MLH (Including dropped applications):</h5>
|
||||
<p><a href="{{ mlh_url }}"><b>Do NOT share this URL.</b></a></p>
|
||||
<h5>Get registered hackers only:</h5>
|
||||
<p><a href="{{url_for('admin.hackers')}}">JSON</a> <a
|
||||
href="{{url_for('admin.hackers_csv')}}">CSV</a></p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Gender:</h2>
|
||||
<canvas id="genderCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let genderCtx = document.getElementById('genderCanvas')
|
||||
let genderChart = new Chart(genderCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: ['Female', 'Male', 'Non-Binary/Other'],
|
||||
datasets: [
|
||||
{
|
||||
data: [{{ female_count }}, {{ male_count }}, {{ nb_count }}]
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Schools:</h2>
|
||||
<canvas id="schoolCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let schoolNames = []
|
||||
let schoolNums = []
|
||||
|
||||
{% for school in schools %}
|
||||
schoolNames.push('{{ school }}')
|
||||
schoolNums.push({{ schools[school] }})
|
||||
{% endfor %}
|
||||
|
||||
let schoolCtx = document.getElementById('schoolCanvas')
|
||||
let schoolChart = new Chart(schoolCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: schoolNames,
|
||||
datasets: [
|
||||
{
|
||||
data: schoolNums
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
<div class="col-md-4">
|
||||
<h2 style="">Majors:</h2>
|
||||
<canvas id="majorCanvas" width="400" height="400"></canvas>
|
||||
<script>
|
||||
let majorNames = []
|
||||
let majorNums = []
|
||||
|
||||
{% for major in majors %}
|
||||
majorNames.push('{{ major }}')
|
||||
majorNums.push({{ majors[major] }})
|
||||
{% endfor %}
|
||||
|
||||
let majorCtx = document.getElementById('majorCanvas')
|
||||
let majorChart = new Chart(majorCtx, {
|
||||
type: 'doughnut',
|
||||
data: {
|
||||
labels: majorNames,
|
||||
datasets: [
|
||||
{
|
||||
data: majorNums
|
||||
}
|
||||
]
|
||||
},
|
||||
options: {
|
||||
title: {
|
||||
display: false
|
||||
},
|
||||
legend: {
|
||||
display: false
|
||||
},
|
||||
labels: {
|
||||
display: false
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" style="">
|
||||
<h2 style="">Counts:</h2>
|
||||
<table id="counts" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Total</th>
|
||||
<th>Attendees</th>
|
||||
<th>Waitlist</th>
|
||||
<th>Checked In</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ total_count }}</td>
|
||||
<td>{{ (total_count - waitlist_count) }}</td>
|
||||
<td>{{ waitlist_count }}</td>
|
||||
<td>{{ check_in_count }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 style="margin-top: 2%;">Shirts:</h2>
|
||||
<table id="shirts" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>XXS</th>
|
||||
<th>XS</th>
|
||||
<th>S</th>
|
||||
<th>M</th>
|
||||
<th>L</th>
|
||||
<th>XL</th>
|
||||
<th>XXL</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ shirt_count['XXS'] }}</td>
|
||||
<td>{{ shirt_count['XS'] }}</td>
|
||||
<td>{{ shirt_count['S'] }}</td>
|
||||
<td>{{ shirt_count['M'] }}</td>
|
||||
<td>{{ shirt_count['L'] }}</td>
|
||||
<td>{{ shirt_count['XL'] }}</td>
|
||||
<td>{{ shirt_count['XXL'] }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2 style="margin-top: 2%;">Hackers:</h2>
|
||||
<table id="hackers" class="table table-striped table-hover table-condensed sortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Options</th>
|
||||
<th>Checked In?</th>
|
||||
<th>Waitlisted?</th>
|
||||
<th>Admin</th>
|
||||
<th>MLH ID</th>
|
||||
<th>Time Registered</th>
|
||||
<th>Email</th>
|
||||
<th>Name</th>
|
||||
<th>Phone</th>
|
||||
<th>Shirt</th>
|
||||
<th>Special</th>
|
||||
<th>School</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for hacker in hackers %}
|
||||
<tr id="{{ hacker.id }}-row">
|
||||
<td>
|
||||
<div class="btn-group">
|
||||
<a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"><span
|
||||
class="caret"></span></a>
|
||||
<ul class="dropdown-menu">
|
||||
{% if not hacker.checked_in %}
|
||||
<li><a class="check_in" id="{{ hacker.id }}-check_in" href="#">Check In</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if hacker.waitlisted and not hacker.checked_in %}
|
||||
<li><a class="promote_from_waitlist"
|
||||
id="{{ hacker['id'] }}-promote_from_waitlist"
|
||||
href="#">Promote From Waitlist</a></li>
|
||||
{% endif %}
|
||||
<li class="divider"></li>
|
||||
{% if not hacker.checked_in %}
|
||||
<li><a class="drop" id="{{ hacker['id'] }}-drop" href="#">Drop Application</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if hacker.is_admin %}
|
||||
<li><a class="demote_admin" id="{{ hacker['id'] }}-demote_admin" href="#">Demote
|
||||
Admin</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li><a class="promote_admin" id="{{ hacker['id'] }}-promote_admin" href="#">Promote
|
||||
Admin</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
<td id="{{ hacker['id'] }}-checked_in">{{ hacker['checked_in'] }}</td>
|
||||
<td id="{{ hacker['id'] }}-waitlisted">{{ hacker['waitlisted'] }}</td>
|
||||
<td>{{ hacker.is_admin }}</td>
|
||||
<td>{{ hacker['id'] }}</td>
|
||||
<td>{{ hacker['last_login'] }}</td>
|
||||
<td>{{ hacker['email'] }}</td>
|
||||
<td>{{ hacker['first_name'] + ' ' + hacker['last_name'] }}</td>
|
||||
<td>{{ hacker['phone'] }}</td>
|
||||
<td>{{ hacker['shirt_size'] }}</td>
|
||||
<td>{{ hacker['accomodations'] }}</td>
|
||||
<td>{{ hacker['school'] }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(() => {
|
||||
setTimeout('let myTh = document.getElementsByTagName("th")[14]; sorttable.innerSortFunction.apply(myTh, []); sorttable.innerSortFunction.apply(myTh, []);', 50)
|
||||
})
|
||||
</script>
|
||||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
||||
<script src="../static/js/jquery.easing.min.js"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,7 +1,8 @@
|
|||
{% include 'header.html' %}
|
||||
{% from 'bootstrap5/utils.html' import render_messages %}
|
||||
|
||||
<div class="container">
|
||||
<div class="container card d-flex mt-10 pt-10" style="height:
|
||||
100%;">
|
||||
{{ render_messages() }}
|
||||
|
||||
{% block content %}
|
||||
|
|
|
@ -22,21 +22,27 @@
|
|||
|
||||
<h1>Hi {{ current_user.first_name }}!</h1><br/>
|
||||
|
||||
</div> <div class="row p-2">
|
||||
</div>
|
||||
<div class="row">
|
||||
{% if current_user.waitlisted %}
|
||||
<h2>You're currently waitlisted, keep checking your email to see if space
|
||||
opens up!</h2>
|
||||
{% else %}
|
||||
</div>
|
||||
<div class="row">
|
||||
<h2>Your registration is confirmed! We're looking forward to seeing you at
|
||||
GoatHacks!</h2>
|
||||
<span>Let us know if you have any questions by sending them to <a
|
||||
href="mailto:hack@wpi.edu">hack@wpi.edu</a></span>
|
||||
</div>
|
||||
<div class="row">
|
||||
<p class="justify-content-center">Let us know if you have any questions
|
||||
by sending them to <a href="mailto:hack@wpi.edu">hack@wpi.edu</a></p>
|
||||
</div>
|
||||
<br/>
|
||||
<div class="row">
|
||||
<p>Make sure you join the Discord and add your shirt size as well as any
|
||||
needed accomodations below</p>
|
||||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<button type="button" class="btn btn-secondary"><a
|
||||
href="https://discord.gg/gqYxndzY"
|
||||
|
@ -44,8 +50,8 @@
|
|||
</div>
|
||||
|
||||
<div class="row mb-3">
|
||||
<div class="card" style="width: 50rem; background-color: #974355;">
|
||||
<div class="card-body">
|
||||
<div class="card w-auto">
|
||||
<div class="card-body w-100 p-5">
|
||||
<div class="card-text">
|
||||
{{ render_form(form) }}
|
||||
</div>
|
||||
|
@ -58,19 +64,12 @@
|
|||
<p><b>If you'd like, add your resume to send to sponsors... </b></p>
|
||||
<div class="file-field input-field">
|
||||
<div class="btn">
|
||||
<label for="resume">File</span>
|
||||
<input class="form-control" id="resume" name="resume" type="file" oninput="resumeChange()"/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<input name="submit" class="btn btn-lg btn-primary btn-invert" type="submit" value="Submit"/>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if current_user.is_admin %}
|
||||
<div class="row">
|
||||
<button type="button" class="btn btn-primary"><a href="{{
|
||||
url_for('admin.home') }}" class="link-light">Admin Dashboard</a></button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<!-- A hack to make sure the footer bar shows-->
|
||||
<div style="height: 100px"></div>
|
||||
<nav class="navbar navbar-inverse footer-nav" style= "margin-top: 30px">
|
||||
<nav class="navbar navbar-inverse footer-nav position-absolute bottom-0" style=
|
||||
"margin-top: 30px; width: 100%;">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
</div>
|
||||
|
|
|
@ -4,24 +4,17 @@
|
|||
|
||||
<head>
|
||||
{{ bootstrap.load_css() }}
|
||||
|
||||
<!--
|
||||
{% assets 'scss' %}
|
||||
<link rel="stylesheet" type="text/css" href="{{ ASSET_URL }}">
|
||||
{% endassets %}
|
||||
-->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
</head>
|
||||
|
||||
<style>
|
||||
nav {
|
||||
background-color: #F5665B;
|
||||
border-color: #E7E4C6;
|
||||
color: white;
|
||||
}
|
||||
</style>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-inverse sticky-top navbar-expand">
|
||||
<nav class="navbar navbar-inverse sticky-top navbar-expand mb-5">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<a class="navbar-brand" href="/">Goathacks</a>
|
||||
|
@ -37,6 +30,12 @@
|
|||
<li class="nav-item">
|
||||
<a class="nav-link" href="../static/assets/Hack@WPI-SponsorshipInformation-2020.pdf">Sponsorship Packet</a>
|
||||
</li> -->
|
||||
{% if current_user.is_admin %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('admin.home')
|
||||
}}">Admin Dashboard</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="https://hack.wpi.edu/conduct/conduct.pdf">Code of Conduct</a>
|
||||
</li>
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
{% block content %}
|
||||
<div style="height: 100%;">
|
||||
<div id="registration-banner" class="parallax-container valign-wrapper">
|
||||
<div class="section">
|
||||
<div class="section mt-3">
|
||||
<h3 class="header-center text-darken-2">Login</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="section" style="background-color: #974355; padding: 20px;">
|
||||
<div class="section">
|
||||
{{ render_form(form) }}
|
||||
<span><p><em>Don't have an account? <a
|
||||
href="{{url_for('registration.register')}}">Register
|
||||
|
|
|
@ -4,13 +4,13 @@
|
|||
{% block content %}
|
||||
<div style="height: 100%;">
|
||||
<div id="registration-banner" class="parallax-container valign-wrapper">
|
||||
<div class="section">
|
||||
<div class="section mt-3">
|
||||
<h3 class="header-center text-darken-2">Registration</h3>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="section" style="background-color: #974355; padding: 20px;">
|
||||
<div class="section">
|
||||
<!--
|
||||
<form method="post">
|
||||
{{ form.csrf_token }}
|
||||
|
@ -53,7 +53,7 @@
|
|||
-->
|
||||
{{ render_form(form) }}
|
||||
|
||||
<span><p><em>You may also want to <a
|
||||
<span><p class="mt-3"><em>You may also want to <a
|
||||
href="{{url_for('registration.login')}}">
|
||||
log in</a>.</em></p></span>
|
||||
</div>
|
||||
|
|
Loading…
Add table
Reference in a new issue