diff --git a/app/__init__.py b/app/__init__.py index 65fef6ef12738a78c8dd180605b99ebfe1e569d9..0639bb76fc5164757f413c43c886d3b647ce5768 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,10 +1,12 @@ # Flask init for the web app. from flask import Flask -from database import db +from data import db from dotenv import load_dotenv import os # Jago Gardiner (21009267) + + class Config(object): TEMPLATES_AUTO_RELOAD = True DEBUG = True diff --git a/app/api.py b/app/api.py new file mode 100644 index 0000000000000000000000000000000000000000..e009624a18d2790fb3b3e180e28314bc37d46a6f --- /dev/null +++ b/app/api.py @@ -0,0 +1,12 @@ +# Routes for API endpoints +# Fetching data from CSV +from data.csv import get_data +from flask import jsonify, request +from .main import app + + +@app.route("/api/fetch_player", methods=["POST"]) +def fetch_player(): + data = request.get_json() + player = data["player"] + return jsonify(get_data(player)) diff --git a/app/routes.py b/app/routes.py index 91dcef4dff6a2a90dd42abff5f9bd6c06d51746c..b3c48dfcceddd8577eb876686ba312deb6f03048 100644 --- a/app/routes.py +++ b/app/routes.py @@ -9,11 +9,16 @@ def home(): return render_template("home.html") -@app.route("/index") -def index(): - return render_template("index.html") +@app.route("/test") +def test(): + return render_template("template.html") -@app.route("/about") -def about(): - return render_template("about.html") +@app.route("/header") +def header(): + return render_template("header.html") + + +@app.route("/footer") +def footer(): + return render_template("footer.html") diff --git a/app/static/css/style.css b/app/static/css/style.css index 78fd506a3e918a636457b0032045082d63ea30c3..ad7b97484fc82e085e32f68da1d6327db83d09ea 100644 --- a/app/static/css/style.css +++ b/app/static/css/style.css @@ -20,13 +20,28 @@ } -.main { - border: solid blueviolet; - border-radius: 12px; - padding: 12px; - margin: auto; +main>.container { + padding: 60px 20px 0; +} + +.navbar { + background-color: #ffffff; + opacity: 0.95; + filter: alpha(opacity=50); +} + +/* Styling for the "logo" used across the site, this is just Inter bold */ +.logo { + font-size: 25px; + font-weight: bold; +} + +.logo-footer { + font-size: large; + font-weight: bold; } + .main table { margin: auto; border: solid black 1px; @@ -46,52 +61,50 @@ /*border: solid black 1px;*/ } -.title -{ +.title { text-align: center; } -.main1 -{ + +.main1 { margin: auto; width: 90%; border: solid 1px; border-radius: 6px; padding: 12px; } -.display -{ + +.display { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; } -h3 -{ + +h3 { border-top: solid 0.5px; border-bottom: solid 0.5px; } -.playerName -{ +.playerName { text-align: center; margin-right: 12px; margin-left: 12px; border-bottom: solid 0.5px; } -.marketValue -{ + +.marketValue { text-align: center; margin-right: 12px; margin-left: 12px; border-bottom: solid 0.5px; } -.starValue -{ + +.starValue { text-align: center; margin-right: 12px; margin-left: 12px; border-bottom: solid 0.5px; } -.salary -{ + +.salary { text-align: center; margin-right: 12px; margin-left: 12px; @@ -104,4 +117,3 @@ h3 body { font-family: 'Inter', sans-serif; } - diff --git a/app/static/js/tools.js b/app/static/js/tools.js new file mode 100644 index 0000000000000000000000000000000000000000..561996054e197cd185b85d211fd7b54cdcd97896 --- /dev/null +++ b/app/static/js/tools.js @@ -0,0 +1,17 @@ +/* Jago Gardiner 21009267 */ +/** + * Function to load header and footer using jQuery. + * Uses a callback so elements inside these HTML files can be + * modified on the fly. + * @param {Function} callback Callback used to make header elements active. + */ +function loadTemplate(callback) { + // Load header + $('#header').load('/header', () => { + if (typeof callback === 'function') { + callback() + } + }) + // Load footer + $('#footer').load('/footer') +} diff --git a/app/templates/about.html b/app/templates/about.html deleted file mode 100644 index 4edcbfd07f09aa8b56e6b6b0ed511a80dfea1a1a..0000000000000000000000000000000000000000 --- a/app/templates/about.html +++ /dev/null @@ -1,9 +0,0 @@ -<!-- quick landing page --> -<div class="container"> - <div class="row"> - <div class="col-md-12"> - <h1>Example</h1> - <p class="lead">hello</p> - </div> - </div> -</div> diff --git a/app/templates/footer.html b/app/templates/footer.html new file mode 100644 index 0000000000000000000000000000000000000000..30deb095d8b6a63105a30114571ecf244ea26c17 --- /dev/null +++ b/app/templates/footer.html @@ -0,0 +1,18 @@ +<!DOCTYPE html> +<!-- Jago Gardiner 21009267 --> + +<div class="py-5"></div> +<footer class="footer mt-auto py-3 bg-light fixed-bottom border text-center"> + <div class="container"> + <a href="/" class="mb-3 me-2 mb-md-0 text-muted text-decoration-none lh-1 logo-footer"> + Site Name + </a> + <span class="text-muted">2023 | <span id="heart">♥</span></span> + </div> + <script> + var heart = document.getElementById('heart'); + heart.addEventListener('click', function () { + heart.classList.toggle('heart-red'); + }); + </script> +</footer> diff --git a/app/templates/header.html b/app/templates/header.html new file mode 100644 index 0000000000000000000000000000000000000000..29441494401ed5d5f9d1d77bdf51fafa0816d767 --- /dev/null +++ b/app/templates/header.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- Jago Gardiner 21009267 --> + +<header id="header"> + <nav class="navbar fixed-top navbar-expand-md navbar-light bg-light shadow-sm border"> + <div class="container"> + <a class="navbar-brand logo" href="/">Site Name</a> + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" + aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarCollapse"> + <ul class="navbar-nav me-auto mb-2 mb-md-0"> + <li class="nav-item"> + <a class="nav-link" id="home" aria-current="page" href="/">Players</a> + </li> + <li class="nav-item"> + <a class="nav-link" id="locations" href="/teams">Teams</a> + </li> + <li class="nav-item"> + <a class="nav-link" id="locations" href="/matches">Matches</a> + </li> + </ul> + <div class="text-end"> + <a class="nav-link" id="locations" href="/empty">empty</a> + </div> + </div> + </div> + </nav> +</header> +<div class="mb-5"></div> diff --git a/app/templates/home.html b/app/templates/home.html index 379774ba6ce5b56b4b06e2012cdebc36aaa76602..c38ec0f5acb2b0c36d3f4f11b23003860abfeba7 100644 --- a/app/templates/home.html +++ b/app/templates/home.html @@ -1,53 +1,74 @@ -<!DOCTYPE html> -<html> +<!doctype html> +<html lang="en"> <head> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Template</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" + integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <link href="../static/css/style.css" rel="stylesheet" /> </head> <body> - <div class="title"> - <h1>Title</h1> - <p>At some point lets figure this out plz</p> - </div> - - <div class="main1"> - - <label for="filter">Filter By</label> - <select name="filter"> - <option value="Star Rating">Star Rating</option> - <option value="Market Value">Market Value</option> - <option value="Salary">Salary</option> - </select> - - <div class="display"> - <div class="playerName"> - <h3>Player Name</h3> - <p>{Import Data}</p> - <p>name1</p> - </div> + <div id="header"></div> - <div class="marketValue"> - <h3>Market Value</h3> - <p>{Back-Process}</p> - <p>£</p> - </div> + <main role="main"> + <div class="container"> + <div class="main1"> - <div class="starValue"> - <h3>Star Value</h3> - <p>{Back-Process}</p> - <p>*****</p> - </div> + <label for="filter">Filter By</label> + <select name="filter"> + <option value="Star Rating">Star Rating</option> + <option value="Market Value">Market Value</option> + <option value="Salary">Salary</option> + </select> + + <div class="display"> + <div class="playerName"> + <h3>Player Name</h3> + <p>{Import Data}</p> + <p>name1</p> + </div> - <div class="salary"> - <h3>Salary</h3> - <p>{Import Data}</p> - <p>$</p> + <div class="marketValue"> + <h3>Market Value</h3> + <p>{Back-Process}</p> + <p>£</p> + </div> + + <div class="starValue"> + <h3>Star Value</h3> + <p>{Back-Process}</p> + <p>*****</p> + </div> + + <div class="salary"> + <h3>Salary</h3> + <p>{Import Data}</p> + <p>$</p> + </div> + </div> </div> </div> + </main> + + <div id="footer"></div> + <!-- JQuery CDN --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" + integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" + crossorigin="anonymous" referrerpolicy="no-referrer"></script> + + <!-- Render header footer template --> + <script src="../static/js/tools.js"></script> - </div> + <!-- Bootstrap JS --> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" + integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" + crossorigin="anonymous"></script> + <script> + loadTemplate(() => { }) + </script> </body> </html> diff --git a/app/templates/index.html b/app/templates/index.html deleted file mode 100644 index 4edcbfd07f09aa8b56e6b6b0ed511a80dfea1a1a..0000000000000000000000000000000000000000 --- a/app/templates/index.html +++ /dev/null @@ -1,9 +0,0 @@ -<!-- quick landing page --> -<div class="container"> - <div class="row"> - <div class="col-md-12"> - <h1>Example</h1> - <p class="lead">hello</p> - </div> - </div> -</div> diff --git a/app/templates/template.html b/app/templates/template.html index 9837c0f53373875532058d1b0c32b9b3ddb3a802..b3d203ce4c0bb9bf4900f455b5507538033940a5 100644 --- a/app/templates/template.html +++ b/app/templates/template.html @@ -1,13 +1,40 @@ -<!DOCTYPE html> -<html> +<!doctype html> +<html lang="en"> - <head?> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Template</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet" + integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous"> <link href="../static/css/style.css" rel="stylesheet" /> - </head> + </head> - <body> - <p>Template</p> - </body> + <body> + <div id="header"></div> + + <main role="main"> + <div class="container"> + <p>Custom template</p> + </div> + </main> + + <div id="footer"></div> + <!-- JQuery CDN --> + <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" + integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" + crossorigin="anonymous" referrerpolicy="no-referrer"></script> + + <!-- Render header footer template --> + <script src="../static/js/tools.js"></script> + + <!-- Bootstrap JS --> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js" + integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" + crossorigin="anonymous"></script> + <script> + loadTemplate(() => { }) + </script> + </body> </html> diff --git a/data/csv.py b/data/csv.py index 9172300ebe20999d0e2956f9a0c76a949da731ee..97d81b9f1e281b32aeacd0eb18632ee04e1a15df 100644 --- a/data/csv.py +++ b/data/csv.py @@ -5,7 +5,7 @@ players = [] # List of all the players # Could POTENTIALLY have a list for each of those below if we choose this route -with open("as_given_to_us/playerData.csv", "r") as csv_file: +with open("players_file.csv", "r") as csv_file: r_csv = csv.reader(csv_file) next(r_csv) # skips the headers diff --git a/data/players_file.csv b/data/players_file.csv new file mode 100644 index 0000000000000000000000000000000000000000..3e1b40cbed1d57a8152d59f277ec5cc88ac7c8db --- /dev/null +++ b/data/players_file.csv @@ -0,0 +1,22 @@ +PLAYER NAME,DATE OF BIRTH,GENDER,DATE SIGNED UP,CURRENT TEAM,TEAM LOCATION,TEAM MANAGER,SALARY (�k/Week),START OF CONTRACT,CONTRACT DURATION,GAMES PLAYED THIS YEAR ,GAMES WON,FG1,FG2,FG3,FG4,FG5 +NB009,24/04/2001,M,01/01/2017,REDNORTH,LIVERPOOL,REDMAN,50,01/01/2019,5,22,11,W,W,L,W,D +OB001,31/07/1997,M,01/01/2017,REDNORTH,LIVERPOOL,REDMAN,42,01/12/2018,5,25,17,W,D,D,W,W +OB022,31/08/1995,M,31/03/2014,REDSOUTH,BRIGHTON,SOUTHMAN,33,01/06/2018,4,22,18,W,W,W,W,W +OG005,22/07/1991,F,01/01/2011,LIGHTGREEN,COVENTRY,BROWN,12,01/01/2017,6,18,15,D,D,W,W,L +NG001,17/04/1997,F,17/04/2015,DARK GREEN,LEEDS,GREENBOX,14,01/01/2020,5,14,12,D,L,L,W,D +NG004,05/08/1999,F,01/10/2018,LIGHTRED,OXFORD,PINKMAN,15,01/12/2018,4,17,17,L,L,L,L,D +NB004,01/01/2001,M,15/11/2018,NAVYBLUE,LONDON,POSHMAN,28,01/01/2019,4,16,16,D,W,W,L,L +NB007,12/09/1998,M,15/12/2018,LIGHTBLUE,PRESTON,GREY,42,01/02/2019,4,22,17,L,W,W,W,D +OG110,11/12/1996,F,01/07/2018,PINKTEAM,BRISTOL,WESTMAN,17,01/09/2020,3,24,18,W,W,L,L,L +OB099,11/11/1999,M,01/11/2017,LIGHTBLUE,PRESTON,GREY,38,01/12/2017,5,21,11,W,D,W,W,W +NB212,01/01/2000,M,11/11/2020,DARK KNIGHTS,NEWTOWN,BLACK,55,01/01/2021,3,22,12,W,W,W,W,W +OB124,17/09/1995,M,15/06/2017,DARK KNIGHTS,NEWTOWN,BLACK,52,01/01/2020,4,24,13,D,D,D,L,W +NG032,13/11/1992,F,11/01/2014,PINKTEAM,BRISTOL,WESTMAN,21,01/10/2017,5,25,12,L,L,L,D,D +OB333,04/01/1999,M,01/06/2020,REDSOUTH,BRIGHTON,SOUTHMAN,38,01/12/2020,3,18,17,L,L,W,W,D +OB232,01/09/1998,M,12/12/2016,REDNORTH,LIVERPOOL,REDMAN,44,01/12/2019,4,19,19,D,D,D,W,L +NB311,22/11/1997,M,04/07/2018,LIGHTBLUE,PRESTON,GREY,59,01/12/2019,3,22,22,D,L,L,D,W +NG210,23/02/1999,F,01/05/2019,GOLDWINGS,LONDON,BRIGHTMAN,21,01/06/2019,4,20,14,W,W,W,W,D +NG222,01/01/2002,F,12/12/2019,DARK GREEN,LEEDS,GREENBOX,14,01/01/2020,3,21,12,W,D,W,W,D +NB322,26/07/2000,M,01/10/2018,NAVYBLUE,LONDON,POSHMAN,29,01/01/2020,3,16,11,W,L,L,W,W +NB320,27/10/1999,M,01/06/2016,LIGHTBLUE,PRESTON,GREY,32,01/07/2020,3,17,16,W,L,W,L,W +NB337,12/05/1998,M,01/01/2015,LIGHTGREEN,COVENTRY,BROWN,27,01/12/2020,3,18,16,D,L,L,W,W