Initial commit of DEMOS2 with the upgraded 'Create Event' UI. However, there is no input validation currently
This commit is contained in:
commit
7084bd1b16
155 changed files with 8102 additions and 0 deletions
12
allauthdemo/templates/bases/bootstrap-auth.html
Executable file
12
allauthdemo/templates/bases/bootstrap-auth.html
Executable file
|
@ -0,0 +1,12 @@
|
|||
{% extends "bases/bootstrap-minimal.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2 big-box">
|
||||
{% block inner-content %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- container -->
|
||||
{% endblock %}
|
267
allauthdemo/templates/bases/bootstrap-jquery.html
Executable file
267
allauthdemo/templates/bases/bootstrap-jquery.html
Executable file
|
@ -0,0 +1,267 @@
|
|||
{% extends "bases/bootstrap.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block tail_js %}
|
||||
<script>
|
||||
Module = {};
|
||||
Module.memoryInitializerPrefixURL = "{% static 'js/' %}";
|
||||
</script>
|
||||
<script src="//code.jquery.com/jquery-2.2.4.min.js"></script>
|
||||
<!-- <script>window.jQuery || document.write('<script src="js/jquery-1.10.1.min.js"><\/script>')</script> -->
|
||||
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/js/bootstrap-datetimepicker.min.js"></script>
|
||||
<script src='https://www.google.com/recaptcha/api.js'></script>
|
||||
<script
|
||||
src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"
|
||||
integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU="
|
||||
crossorigin="anonymous"></script>
|
||||
<script src="{% static 'js/papaparse.min.js' %}" type="text/javascript"></script>
|
||||
<script src="{% static 'js/create-event-poll.js' %}" type="text/javascript"></script>
|
||||
<script src="{% static 'js/encrypt.js' %}" type="text/javascript"></script>
|
||||
|
||||
<script type="text/javascript" src="{% static 'js/core/rand.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/rom_curve.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/rom_field.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/uint64.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/aes.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/big.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/gcm.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/hash256.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/hash384.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/hash512.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/sha3.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/newhope.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/nhs.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/fp.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/fp2.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/fp4.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/fp12.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/ff.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/rsa.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/ecp.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/ecp2.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/ecdh.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/pair.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/mpin.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'js/core/ctx.js' %}"></script>
|
||||
|
||||
<script type="text/javascript" src="{% static 'js/demos2-booth.js' %}"></script>
|
||||
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.0/jquery-ui.js" type="text/javascript"></script>
|
||||
|
||||
{% block app_js %}
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
|
||||
{% block app_js_vars %}
|
||||
{% endblock %}
|
||||
|
||||
Module.memoryInitializerPrefixURL = "LOL";
|
||||
var demosEncrypt = {
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Code written with "New function" comments have
|
||||
been totally or mostly re-implemented by Thomas Smith
|
||||
|
||||
|
||||
*/
|
||||
|
||||
//new function
|
||||
demosEncrypt.encryptAndSubmit = function() {
|
||||
var ctx = new CTX("BN254CX"); //new context we can use
|
||||
var n = new ctx.BIG();
|
||||
var g1 = new ctx.ECP();
|
||||
var g2 = new ctx.ECP2();
|
||||
|
||||
var param = $('#event-param').val();
|
||||
//console.log(param);
|
||||
|
||||
var tempParams = JSON.parse(param);
|
||||
//copying the values
|
||||
n.copy(tempParams.n);
|
||||
g1.copy(tempParams.g1);
|
||||
g2.copy(tempParams.g2);
|
||||
|
||||
var params = {
|
||||
n:n,
|
||||
g1:g1,
|
||||
g2:g2
|
||||
}
|
||||
|
||||
var tempPK = JSON.parse($('#comb_pk').val());
|
||||
|
||||
var pk = new ctx.ECP(0);
|
||||
pk.copy(tempPK.PK);
|
||||
var answer = $('#poll-options').val();
|
||||
console.log(answer);
|
||||
var cipher = encrypt(params, pk, answer);
|
||||
|
||||
var c1Bytes = [];
|
||||
cipher.C1.toBytes(c1Bytes);
|
||||
var c2Bytes = [];
|
||||
cipher.C2.toBytes(c2Bytes);
|
||||
|
||||
$('#id_cipher_text_c1').val(c1Bytes.toString());
|
||||
$('#id_cipher_text_c2').val(c2Bytes.toString());
|
||||
|
||||
$('#cipher-form').submit();
|
||||
}
|
||||
|
||||
|
||||
//new function
|
||||
demosEncrypt.decryptCipher = function() {
|
||||
var skString = $('#secret-key').val();
|
||||
if (!skString) {
|
||||
alert("Please enter your secret key");
|
||||
}
|
||||
else {
|
||||
//rebuild our secret key
|
||||
var ctx = new CTX("BN254CX");
|
||||
var skBytes = skString.split(",");
|
||||
var sk =new ctx.BIG.fromBytes(skBytes);
|
||||
|
||||
var inputs = $("form input[type=text]");
|
||||
inputs.each(function() { //for each ciphertext to decrypt
|
||||
var ciphertext = {
|
||||
C1: new ctx.ECP(),
|
||||
C2: new ctx.ECP()
|
||||
}
|
||||
var temp = JSON.parse($(this).val());
|
||||
ciphertext.C1.copy(temp.C1);
|
||||
ciphertext.C2.copy(temp.C2);
|
||||
|
||||
var partial = partDec(sk, ciphertext);//returns an object containing an ECP()
|
||||
|
||||
var bytes = [];
|
||||
partial.D.toBytes(bytes);
|
||||
$(this).val(bytes.toString());//submit in byte array form
|
||||
})
|
||||
|
||||
$('input[type=submit]').prop("disabled", false);
|
||||
}
|
||||
}
|
||||
|
||||
//new function
|
||||
demosEncrypt.generateKeys = function() {
|
||||
parameter = $("#event-param").val();
|
||||
var tempParams = JSON.parse(parameter);
|
||||
//the full objects need to be initalised as per the library, then copy the values we need into it
|
||||
//I follow Bingsheng's code as to what objects are used in the parameter object
|
||||
var ctx = new CTX("BN254CX"); //new context we can use
|
||||
var n = new ctx.BIG();
|
||||
var g1 = new ctx.ECP();
|
||||
var g2 = new ctx.ECP2();
|
||||
|
||||
//copying the values
|
||||
n.copy(tempParams.n);
|
||||
g1.copy(tempParams.g1);
|
||||
g2.copy(tempParams.g2);
|
||||
|
||||
var params = {
|
||||
n:n,
|
||||
g1:g1,
|
||||
g2:g2
|
||||
}
|
||||
|
||||
var PKbytes = [];
|
||||
var SKbytes = [];
|
||||
|
||||
var keypair = keyGen(params);
|
||||
keypair.PK.toBytes(PKbytes);
|
||||
keypair.SK.toBytes(SKbytes);
|
||||
|
||||
$('input#public-key').val(PKbytes.toString());
|
||||
$('input#secret-key').val(SKbytes.toString());
|
||||
|
||||
//mostly code from before here
|
||||
var blob = new Blob([SKbytes.toString()], {type : 'text/plain'});
|
||||
|
||||
var dlBtn = $('a#download-btn');
|
||||
var url = URL.createObjectURL(blob);
|
||||
var fileName = $(dlBtn).attr("href", url);
|
||||
|
||||
$(dlBtn).attr("download", "sk-{% block sk-file-name %}{% endblock %}".replace(/[\W]/g, "-"));
|
||||
$(dlBtn).attr("disabled", false);
|
||||
$("#public-submit").attr("disabled", false);
|
||||
}
|
||||
|
||||
//these other functions might not be used
|
||||
//I don't think this is used
|
||||
demosEncrypt.downloadSecretKey = function() {
|
||||
var blob = new Blob([sk], {type : 'text/plain'});
|
||||
var dlBtn = $('a#download-btn');
|
||||
$(dlBtn).attr("disabled", true);
|
||||
}
|
||||
|
||||
function getFormsetPrefix(id) {
|
||||
id = id.replace(/(?:id_)?formset_/, ""); // strip generic part
|
||||
return id.replace(/([A-Za-z0-9]+)[\w-]*/, "$1"); // return prefix
|
||||
}
|
||||
|
||||
function setFormsetIndex(ele, prefix, index) {
|
||||
ele = $(ele).find("div[id^='id_formset'], input[id^='id_formset']").each(function (i, el) {
|
||||
var id = $(el).attr("id");
|
||||
id = "id_formset_" + prefix + '-' + index + id.match(/-\w+$/);
|
||||
$(el).attr("id", id);
|
||||
if ($(el).is("input")) {
|
||||
$(el).attr("name", id.replace(/^id_/, ""));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('.formset').sortable({handle:".input-group-addon", items:".formset_object",
|
||||
start: function(event, ui) {
|
||||
ui.item.prevPos = ui.item.index();
|
||||
console.log(ui.item.prevPos);
|
||||
},
|
||||
update: function(event, ui) {
|
||||
ui.item.prevPos = null;
|
||||
},
|
||||
beforeStop: function(event, ui) {
|
||||
$(ui.item).css("animation", "none"); // prevents firing of entry keyframe
|
||||
}
|
||||
});
|
||||
//$('.glyphicon.glyphicon-trash').parent().hide();
|
||||
$('.formset').find
|
||||
$('.formset').on('click', '.input-group-addon', function() { // this makes the label a delete btn too :(
|
||||
var ele = $(this).closest(".formset_object");
|
||||
var prefix = $(this).closest(".formset_object").data("prefix") || getFormsetPrefix($(this).closest(".formset_object").find('input:first').attr("id"));
|
||||
var current_total = parseInt($("#id_formset_" + prefix + "-TOTAL_FORMS").val());
|
||||
if (current_total <= $("#id_formset_" + prefix + "-MIN_NUM_FORMS").val()) {
|
||||
return; // don't allow removal of last element
|
||||
}
|
||||
ele.remove();
|
||||
$("#id_formset_" + prefix + "-TOTAL_FORMS").val(current_total - 1);
|
||||
$(".formset").sortable( "refresh" );
|
||||
$(".formset").sortable( "refreshPositions" );
|
||||
});
|
||||
$('.add-another-btn').on('click',function() {
|
||||
var new_formset_item = $(this).prevAll(".formset_object:first").clone();
|
||||
var prefix = getFormsetPrefix(new_formset_item.find("input:first").attr("id"));
|
||||
var current_total = parseInt($("#id_formset_" + prefix + "-TOTAL_FORMS").val());
|
||||
if (current_total >= $("#id_formset_" + prefix + "-MAX_NUM_FORMS").val()) {
|
||||
return; // don't allow more than max forms
|
||||
}
|
||||
new_formset_item.data("prefix", prefix);
|
||||
$(this).before(new_formset_item);
|
||||
new_formset_item.find("input").val("");
|
||||
setFormsetIndex(new_formset_item, prefix, parseInt($("#id_formset_" + prefix + "-TOTAL_FORMS").val()));
|
||||
$("#id_formset_" + prefix + "-TOTAL_FORMS").val(parseInt($("#id_formset_" + prefix + "-TOTAL_FORMS").val()) +1);
|
||||
$(".formset").sortable( "refresh" );
|
||||
$(".formset").sortable( "refreshPositions" );
|
||||
});
|
||||
|
||||
// rudimentary accordion error handling
|
||||
$('.has-error').closest('.panel').find('.panel-heading').addClass("error");
|
||||
$('.alert.alert-block.alert-danger').closest('.panel').find('.panel-heading').addClass("error");
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% endblock %}
|
42
allauthdemo/templates/bases/bootstrap-member.html
Executable file
42
allauthdemo/templates/bases/bootstrap-member.html
Executable file
|
@ -0,0 +1,42 @@
|
|||
{% extends "bases/bootstrap-jquery.html" %}
|
||||
{% load staticfiles %}
|
||||
{% block nav %}
|
||||
<!-- Fixed navbar -->
|
||||
<div class="navbar navbar-default navbar-static-top navbar-shadow" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="{% url 'user_home' %}">Demo Members Area</a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="{% url 'user_home' %}">Home</a></li>
|
||||
<li><a href="{% url 'user_action' %}">Action</a></li>
|
||||
<li><a href="{% url 'polls:index' %}">Events</a></li>
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||||
<strong> {{ user.display_name }}</strong> <b class="caret"></b>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li class="dropdown-header">Account</li>
|
||||
<li><a href="{% url 'account_profile' %}"><i class="fa fa-cog"></i> Settings</a></li>
|
||||
<li><a href="{% url 'account_events' %}"><i class="fa fa-bell"></i> My Events</a></li>
|
||||
<li><a href="{% url 'account_email' %}"><i class="fa fa-envelope"></i> Email Addresses</a></li>
|
||||
<li><a href="{% url 'socialaccount_connections' %}"><i class="fa fa-facebook"></i> Social Networks</a></li>
|
||||
<li><a href="{% url 'account_change_password' %}"><i class="fa fa-lock"></i> Change Password</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="{% url 'account_logout' %}"><i class="fa fa-sign-out"></i> Sign Out</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>{% if user.profile.avatar_url %}<img alt="" style="width:50px; height:50px" src="{{user.profile.avatar_url}}">{% endif %}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
25
allauthdemo/templates/bases/bootstrap-minimal.html
Executable file
25
allauthdemo/templates/bases/bootstrap-minimal.html
Executable file
|
@ -0,0 +1,25 @@
|
|||
{% extends "bases/bootstrap-jquery.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block nav %}
|
||||
<div class="navbar navbar-default navbar-static-top navbar-shadow" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/"><img src='{% static "img/demos-banner.png" %}' style="height:100%" title="demos2"></a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="{% url 'landing_index' %}"><strong>Home</strong></a></li>
|
||||
<li><a href="{% url 'account_signup' %}"><strong>Join</strong></a></li>
|
||||
<li><a href="{% url 'account_login' %}"><strong>Log In</strong></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
29
allauthdemo/templates/bases/bootstrap-visitor.html
Executable file
29
allauthdemo/templates/bases/bootstrap-visitor.html
Executable file
|
@ -0,0 +1,29 @@
|
|||
{% extends "bases/bootstrap-jquery.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block nav %}
|
||||
<!-- Fixed navbar -->
|
||||
<div class="navbar navbar-default navbar-static-top navbar-shadow" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/"><img src='{% static "img/demos2-banner.png" %}' style="height:100%" title="demos2"></a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="{% url 'landing_index' %}">Welcome</a></li>
|
||||
<li><a href="{% url 'landing_about' %}">About</a></li>
|
||||
<li><a href="{% url 'polls:index' %}">Events</a></li>
|
||||
<li><a href="{% url 'account_signup' %}"><strong>Join</strong></a></li>
|
||||
<li><a href="{% url 'account_login' %}"><strong>Log In</strong></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
48
allauthdemo/templates/bases/bootstrap-with-nav.html
Executable file
48
allauthdemo/templates/bases/bootstrap-with-nav.html
Executable file
|
@ -0,0 +1,48 @@
|
|||
{% extends "bases/bootstrap-jquery.html" %}
|
||||
{% load staticfiles %}
|
||||
|
||||
{% block nav %}
|
||||
<!-- Fixed navbar -->
|
||||
<div class="navbar navbar-default navbar-static-top navbar-shadow" role="navigation">
|
||||
<div class="container">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<a class="navbar-brand" href="/"><img src='{% static "img/demos2-banner.png" %}' style="height:30px" title="demos2"></a>
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a href="{% url 'landing_index' %}">Welcome</a></li>
|
||||
<li><a href="{% url 'landing_about' %}">About</a></li>
|
||||
<li><a href="{% url 'polls:index' %}">Events</a></li>
|
||||
{% if user.is_authenticated %}
|
||||
<li class="dropdown">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
|
||||
<strong> {{ user.display_name }}</strong> <b class="caret"></b>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li class="dropdown-header">Account</li>
|
||||
<li><a href="{% url 'account_profile' %}"><i class="fa fa-cog"></i> Settings</a></li>
|
||||
<li><a href="{% url 'account_events' %}"><i class="fa fa-bell"></i> My Events</a></li>
|
||||
<li><a href="{% url 'account_email' %}"><i class="fa fa-envelope"></i> Email Addresses</a></li>
|
||||
<li><a href="{% url 'socialaccount_connections' %}"><i class="fa fa-facebook"></i> Social Networks</a></li>
|
||||
<li><a href="{% url 'account_change_password' %}"><i class="fa fa-lock"></i> Change Password</a></li>
|
||||
<li class="divider"></li>
|
||||
<li><a href="{% url 'account_logout' %}"><i class="fa fa-sign-out"></i> Sign Out</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>{% if user.profile.avatar_url %}<img alt="" style="width:50px; height:50px" src="{{user.profile.avatar_url}}">{% endif %}</li>
|
||||
{% else %}
|
||||
<li><a href="{% url 'account_signup' %}"><strong>Join</strong></a></li>
|
||||
<li><a href="{% url 'account_login' %}"><strong>Log In</strong></a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
52
allauthdemo/templates/bases/bootstrap.html
Executable file
52
allauthdemo/templates/bases/bootstrap.html
Executable file
|
@ -0,0 +1,52 @@
|
|||
{% load staticfiles %}
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html lang="en" {% block htmlattr %}{% endblock %}>
|
||||
<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>{% block title %}dẽmos 2{% endblock %}</title>
|
||||
|
||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
|
||||
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.37/css/bootstrap-datetimepicker.min.css">
|
||||
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.css">
|
||||
|
||||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
|
||||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||
<!--[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]-->
|
||||
|
||||
{% block head_css %}
|
||||
<link rel="stylesheet" media="screen" href='{% static "css/main.css" %}'>
|
||||
{% endblock %}
|
||||
|
||||
</head>
|
||||
<body class='{% block pageclass %}{% endblock %}' {% block bodyattr %}{% endblock %}>
|
||||
|
||||
{% block nav %}{% endblock %}
|
||||
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
{% block footer %}
|
||||
<div class=container>
|
||||
<hr>
|
||||
<footer>
|
||||
<ul class="list-inline pull-right">
|
||||
<li><a href="{% url 'website_terms' %}">Terms</a></li>
|
||||
<li><a href="{% url 'website_contact' %}">Contact</a></li>
|
||||
</ul>
|
||||
<p class=muted>{% include "copyright.html" %}</p>
|
||||
</footer>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block tail_js %}
|
||||
{% endblock %}
|
||||
|
||||
</body>
|
||||
</html>
|
Reference in a new issue