automated push from the terminal

This commit is contained in:
Software Shinobi
2026-02-09 11:06:47 -05:00
parent 2f5926a171
commit fe556105b9
86 changed files with 17183 additions and 2 deletions

15
.dockerignore Normal file
View File

@@ -0,0 +1,15 @@
.git
.volume
.volumes
.import
.trash
.backup
.recycle
__pycache__

1
.gitignore vendored Executable file
View File

@@ -0,0 +1 @@
__pycache__

47
Dockerfile Normal file
View File

@@ -0,0 +1,47 @@
# base image
FROM python:3.8
# setup environment variable
ENV DockerHOME=/home/app/webapp
# set work directory
RUN mkdir -p $DockerHOME
# where your code lives
WORKDIR $DockerHOME
# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# install dependencies
RUN pip install --upgrade pip
# copy whole project to your docker home directory.
COPY . .
# run this command to install all dependencies
RUN pip install -r requirements.txt
RUN python3 manage.py makemigrations
RUN python3 manage.py migrate
# port where the Django app runs
EXPOSE 8000
# start server
CMD python manage.py runserver 0.0.0.0:8000

View File

@@ -1,2 +0,0 @@
# card-players-unite-server

6
application/__init__.py Normal file
View File

@@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
__VERSION__ = "1.6.28"
__RELEASE_DATE__ = "20-Jul-2023"
__AUTHOR__ = "Agus Makmun (Summon Agus)"
__AUTHOR_EMAIL__ = "summon.agus@gmail.com"

16
application/asgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
ASGI config for application project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
application = get_asgi_application()

173
application/settings.py Normal file
View File

@@ -0,0 +1,173 @@
"""
Django settings for card players unite project.
Generated by 'django-admin startproject' using Django 3.1.5.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '7!%*_%*0x9*#-k*1$b$^dax14hu2tazzrvk5tvj@#7vlg*h0ni'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['localhost']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'player',
'tournament',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
"corsheaders.middleware.CorsMiddleware",
]
CORS_ALLOWED_ORIGINS = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8000",
"http://127.0.0.1:9000",
]
CORS_ORIGIN_ALLOW_ALL = True
ROOT_URLCONF = 'application.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'application.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'maverickdb',
'USER':'maverickdb',
'PASSWORD':'maverickdb',
'HOST':'localhost',
'PORT':'5432'
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
##########################################
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
##LANGUAGE_CODE = 'en-us'
##TIME_ZONE = 'UTC'
##USE_I18N = True
##USE_L10N = True
##USE_TZ = True
##########################################
LOGIN_REDIRECT_URL = "home"
LOGOUT_REDIRECT_URL = 'logout1'
#SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_COOKIE_AGE = 180 # 3 minutes. "1209600(2 weeks)" by default
#SESSION_SAVE_EVERY_REQUEST = True # "False" by default
##########################################
## https://www.w3schools.com/django/django_add_css_file_global.php
STATIC_URL = 'static/'
STATICFILES_DIRS = [
BASE_DIR / "static"
]
##########################################

21
application/urls.py Normal file
View File

@@ -0,0 +1,21 @@
from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView
from . import views
urlpatterns = [
path("", TemplateView.as_view(template_name="listing.html"), name="listing"),
path("home", TemplateView.as_view(template_name="home.html"), name="home"),
path('tournament/', include('tournament.urls')),
path("player/", include("player.urls")),
path("player/", include("django.contrib.auth.urls")),
]

22
application/views.py Normal file
View File

@@ -0,0 +1,22 @@
from django.shortcuts import render
from rest_framework import generics
from django.http import HttpResponse
from django.template import loader
## https://docs.djangoproject.com/en/4.2/intro/tutorial03/
def home(request):
print("home home")
template = loader.get_template("home.html")
context = {
"key": "value",
}
return HttpResponse(template.render(context, request))

16
application/wsgi.py Normal file
View File

@@ -0,0 +1,16 @@
"""
WSGI config for application project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
application = get_wsgi_application()

56
cardplayersunite.bash Executable file
View File

@@ -0,0 +1,56 @@
#!/bin/bash
##
set -e
set -x
##
reset
clear
##
docker-compose down --remove-orphans
docker-compose rm
docker-compose pull
docker-compose up -d
sleep 8
########
###docker-compose -f postgres.yaml pull
#python3 manage.py dumpdata
## This will IRREVERSIBLY DESTROY all data currently in the "maverickdb" database, and return each table to an empty state.
### python3 manage.py flush
### python3 manage.py sqlflush
#python3 manage.py sqlmigrate
##python3 manage.py sqlsequencereset
#python3 manage.py generateschema
python3 manage.py makemigrations
python3 manage.py migrate
#python3 manage.py squashmigrations bikes
#python3 manage.py optimizemigration
python3 manage.py runserver 0.0.0.0:8888

51
compose.yaml Normal file
View File

@@ -0,0 +1,51 @@
version: "3"
services:
card-players-unite-postgres:
container_name: card-players-unite-postgres
image: postgres:14.1-alpine
restart: unless-stopped
ports:
- 5432:5432
environment:
- POSTGRES_DB=maverickdb
- POSTGRES_USER=maverickdb
- POSTGRES_PASSWORD=maverickdb
## volumes:
##
## - /tmp/volume-data-postgres:/var/lib/postgresql/data
card-players-unite-pgadmin:
container_name: card-players-unite-pgadmin
image: dpage/pgadmin4
depends_on:
- card-players-unite-postgres
ports:
- "5480:80"
environment:
PGADMIN_DEFAULT_EMAIL: lorem@loremipsum.com
PGADMIN_DEFAULT_PASSWORD: maverickdb
## volumes:
##
## - /tmp/volume-data-pgadmin4:/var/lib/pgadmin

1
createuser.bash Executable file
View File

@@ -0,0 +1 @@
python3 manage.py createsuperuser --username rlmessick --email fake@cardplayersunite.online

BIN
docs/imagery/cover.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 851 KiB

1
docs/index.md Normal file
View File

@@ -0,0 +1 @@
# index! docs!

3
docs/quick-start.md Normal file
View File

@@ -0,0 +1,3 @@
# quick start!
![Card Players Unite](/docs/imagery/cover.png)

43
docs/readme.md Normal file
View File

@@ -0,0 +1,43 @@
# intro
![Card Players Unite](/docs/imagery/cover.png)
## Developer Documentation
You can run the app at home.
Follow the instructions below on an Ubuntu Linux server.
[Developer Docs](/docs/index.md)
## Tools & Tech
the tools and tech
| website | how the site helped |
|---------|---------------------|
|[Bootswatch](https://bootswatch.com/)|bootstrap compatible prebuild color theming and css|
|[Digital Ocean](https://www.digitalocean.com/community/tutorials)|cloud server hosting and tutorials|
|[Internet Tutorials](/docs/tutorials.md)|various tutorials from the internet with how-to help and information|
|[Stock Imagery](/docs/attribution.md)|free stock imagery from the internet, with attribution.|
|[TOC Generator](https://ecotrust-canada.github.io/markdown-toc/)|github wiki toc generator.|
|[Jigsaw validator](https://jigsaw.w3.org/css-validator/)|Validator CSS and HTML|
|[Browserstack](https://www.browserstack.com/responsive)|Responsiveness|
## Quick Start Guide
You can run the app at home.
Follow the instructions below on an Ubuntu Linux server.
[Quick Start Guide](/docs/quick-start.md)
### Preview Card Players Unite
![Card Players Unite](/docs/imagery/cover.png)
the app is deployed and available for usage.
Click the link below to access Card Players Unite.
[Access Card Players Unite](https://cardplayersunite.online/)

7
docs/updates.md Normal file
View File

@@ -0,0 +1,7 @@
correct the favicon
use an open source landing page for the home page when you access site
use the red admin template as the login when you login as a root user
use the open source listing page for the home page when you log in

31
manage.py Executable file
View File

@@ -0,0 +1,31 @@
#!/usr/bin/env python
import os
import sys
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

13
player/urls.py Normal file
View File

@@ -0,0 +1,13 @@
from django.urls import path
from .views import RegisterView
from django.views.generic.base import TemplateView
urlpatterns = [
path("register", RegisterView.as_view(), name="register"),
path("home", TemplateView.as_view(template_name="home.html"), name="home"),
]

13
player/views.py Normal file
View File

@@ -0,0 +1,13 @@
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic
class RegisterView(generic.CreateView):
form_class = UserCreationForm
success_url = reverse_lazy("login")
template_name = "registration/register.html"

37
readme.md Normal file
View File

@@ -0,0 +1,37 @@
# adsfads
## view all tourney
## add new tourney
## admin home
## login
## how to create new user
## tournament operations
### create tournament
http://localhost:8888/tournament/create/
### view existing tournament
browser:
```
http://localhost:8888/tournament/1/
```
terminal:
```
curl http://localhost:8888/tournament/1/
```
response:
```
{"id":1,"name":"323","description":"222","rental_price":222.0,"rented_user_id":222}
```

5
requirements.txt Normal file
View File

@@ -0,0 +1,5 @@
djangorestframework
django-cors-headers
psycopg2-binary
django-rest-auth-forked

View File

@@ -0,0 +1,52 @@
.footer {
width: 50%;
text-align: center !important;
margin: auto;
font-size: 10px;
}
input {
width: 50%;
text-align: center !important;
margin: auto;
}
p {
width: 50%;
}
table {
width: 80%;
}
.thumbnail {
height: 200px;
width: 200px;
}
div, h1, table, p, input, footer {
margin: auto;
padding: 10px;
text-align: center;
}

File diff suppressed because one or more lines are too long

12549
static/.recycle/vapor.css Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1 @@
alert("features");

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 338 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

279
static/listing/listing.css Normal file
View File

@@ -0,0 +1,279 @@
* {
margin: 0;
}
body {
font-family: "Roboto", sans-serif;
}
.navbar {
width: 100%;
height: 50px;
background-color: black;
position: sticky;
top: 0;
transition: 1s ease all;
}
.navbar-container {
display: flex;
align-items: center;
padding: 0 50px;
height: 100%;
color: white;
font-family: "Sen", sans-serif;
}
.logo-container {
flex: 4;
}
.logo {
font-size: 30px;
color: #4dbf00;
}
.menu-container {
flex: 6;
}
.menu-list {
display: flex;
list-style: none;
}
.menu-list-item {
margin-right: 30px;
}
.menu-list-item.active {
font-weight: bold;
}
.profile-container {
flex: 2;
display: flex;
align-items: center;
justify-content: flex-end;
}
.profile-text-container {
margin: 0 20px;
}
.profile-picture {
width: 32px;
height: 32px;
border-radius: 50%;
object-fit: cover;
}
.toggle {
width: 40px;
height: 20px;
background-color: white;
border-radius: 30px;
display: flex;
align-items: center;
justify-content: space-around;
position: relative;
}
.toggle-icon {
color: goldenrod;
}
.toggle-ball {
width: 18px;
height: 18px;
background-color: black;
position: absolute;
right: 1px;
border-radius: 50%;
cursor: pointer;
transition: 1s ease all;
}
.sidebar {
width: 50px;
height: 100%;
background-color: black;
position: fixed;
top: 0;
display: flex;
flex-direction: column;
align-items: center;
padding-top: 60px;
transition: 1s ease all;
}
.left-menu-icon {
color: white;
font-size: 20px;
margin-bottom: 40px;
}
.container {
background-color: #151515;
min-height: calc(100vh - 50px);
color: white;
transition: 1s ease all;
}
.content-container {
margin-left: 50px;
}
.featured-content {
height: 50vh;
padding: 50px;
}
.featured-title {
width: 200px;
}
.featured-desc {
width: 500px;
color: lightgray;
margin: 30px 0;
}
.featured-button {
background-color: #4dbf00;
color: white;
padding: 10px 20px;
border-radius: 10px;
border: none;
outline: none;
font-weight: bold;
}
.movie-list-container {
padding: 0 20px;
}
.movie-list-wrapper {
position: relative;
overflow: hidden;
}
.movie-list {
display: flex;
align-items: center;
height: 300px;
transform: translateX(0);
transition: all 1s ease-in-out;
}
.movie-list-item {
margin-right: 30px;
position: relative;
}
.movie-list-item:hover .movie-list-item-img {
transform: scale(1.2);
margin: 0 30px;
opacity: 0.5;
}
.movie-list-item:hover .movie-list-item-title,
.movie-list-item:hover .movie-list-item-desc,
.movie-list-item:hover .movie-list-item-button {
opacity: 1;
}
.movie-list-item-img {
transition: all 1s ease-in-out;
width: 270px;
height: 200px;
object-fit: cover;
border-radius: 20px;
}
.movie-list-item-title {
background-color: #333;
padding: 0 10px;
font-size: 32px;
font-weight: bold;
position: absolute;
top: 10%;
left: 50px;
opacity: 0;
transition: 1s all ease-in-out;
}
.movie-list-item-desc {
background-color: #333;
padding: 10px;
font-size: 14px;
position: absolute;
top: 30%;
left: 50px;
width: 230px;
opacity: 0;
transition: 1s all ease-in-out;
}
.movie-list-item-button {
padding: 10px;
background-color: #4dbf00;
color: white;
border-radius: 10px;
outline: none;
border: none;
cursor: pointer;
position: absolute;
bottom: 20px;
left: 50px;
opacity: 0;
transition: 1s all ease-in-out;
}
.arrow {
font-size: 120px;
position: absolute;
top: 90px;
right: 0;
color: lightgray;
opacity: 0.5;
cursor: pointer;
}
.container.active {
background-color: white;
}
.movie-list-title.active {
color: black;
}
.navbar-container.active {
background-color: white;
color: black;
}
.sidebar.active{
background-color: white;
}
.left-menu-icon.active{
color: black;
}
.toggle.active{
background-color: black;
}
.toggle-ball.active{
background-color: white;
transform: translateX(-20px);
}
@media only screen and (max-width: 940px){
.menu-container{
display: none;
}
}

35
static/listing/listing.js Normal file
View File

@@ -0,0 +1,35 @@
const arrows = document.querySelectorAll(".arrow");
const movieLists = document.querySelectorAll(".movie-list");
arrows.forEach((arrow, i) => {
const itemNumber = movieLists[i].querySelectorAll("img").length;
let clickCounter = 0;
arrow.addEventListener("click", () => {
const ratio = Math.floor(window.innerWidth / 270);
clickCounter++;
if (itemNumber - (4 + clickCounter) + (4 - ratio) >= 0) {
movieLists[i].style.transform = `translateX(${
movieLists[i].computedStyleMap().get("transform")[0].x.value - 300
}px)`;
} else {
movieLists[i].style.transform = "translateX(0)";
clickCounter = 0;
}
});
console.log(Math.floor(window.innerWidth / 270));
});
//TOGGLE
const ball = document.querySelector(".toggle-ball");
const items = document.querySelectorAll(
".container,.movie-list-title,.navbar-container,.sidebar,.left-menu-icon,.toggle"
);
ball.addEventListener("click", () => {
items.forEach((item) => {
item.classList.toggle("active");
});
ball.classList.toggle("active");
});

View File

@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org>

View File

@@ -0,0 +1,19 @@
# Movies-Website-Redesign
Movies website Redesign with,
1. Responsive View,
2. Sticky Menu,
3. Awesome Menu,
4. Sticky Side Bar,
5. Hover Transition,
6. Pop-Over Animation,
7. Slider,
8. Day & Night View.
Live Preview: https://mhmiyazi.github.io/Movies-Website/
# Preview:
# Dark Theme:
<img src="img/fullView.png" alt="MH Miyazi's Design Full Preview">
<h1>Light Theme:</h1>
<img src="img/FullPreviewLightTheme.png" alt="MH Miyazi's Design Full Preview">

View File

@@ -0,0 +1 @@
theme: jekyll-theme-cayman

View File

@@ -0,0 +1,136 @@
import re
import sys
fileToUpdate = sys.argv[1]
print(fileToUpdate)
nodeOpenName="22222"
nodeCloseName="44444"
def replaceCSSIncludes():
templateSectionBegin="<styling>"
templateSectionEnd="</styling>"
with open('templates/html-includes-styling.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName, substitutionContent, ddd, flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def replaceJavascriptIncludes():
templateSectionBegin="<!-- body / javascript / begin -->"
templateSectionEnd="<!-- body / javascript / end -->"
with open('templates/body-javascript-includes.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def updateSideBarDesktop():
templateSectionBegin="<sidebar.desktop>"
templateSectionEnd="</sidebar.desktop>"
with open('templates/navigation-sidebar-desktop.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def updateSideBarMobile():
templateSectionBegin="<sidebar.mobile>"
templateSectionEnd="</sidebar.mobile>"
with open('templates/navigation-sidebar-mobile.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
###################################################################
##
## driver
##
###################################################################
##replaceCSSIncludes()
replaceJavascriptIncludes()
##updateSideBarDesktop()
##updateSideBarMobile()

View File

@@ -0,0 +1,13 @@
#!/bin/bash
sourceDirectory="../"
appName="cascadr.py"
##
echo "##"
echo "## start cascadr template work"
echo "##"
find $sourceDirectory -iname "*.html" -exec python3 $appName {} \;

View File

@@ -0,0 +1,194 @@
import re
import sys
fileToUpdate = sys.argv[1]
print(fileToUpdate)
nodeOpenName="22222"
nodeCloseName="44444"
def cascadeStylingIncludes():
templateSectionBegin="<!-- head / css / begin -->"
templateSectionEnd="<!-- head / css / end -->"
with open('templates/head.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeJavascriptIncludes():
templateSectionBegin="<!-- body / javascript / begin -->"
templateSectionEnd="<!-- body / javascript / end -->"
with open('templates/body-javascript-includes.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeFooterContent():
templateSectionBegin="<!-- body / footer / begin -->"
templateSectionEnd="<!-- body / footer / end -->"
with open('templates/body-footer-content.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeTopNavigation():
templateSectionBegin="<!-- Navbar -->"
templateSectionEnd=" <!-- /.navbar -->"
with open('templates/navigation-top-menu.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeSideNavigation():
templateSectionBegin="<!-- navigation / side / begin -->"
templateSectionEnd="<!-- navigation / side / end -->"
with open('templates/navigation-side-menu.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
def cascadeFlyoutContent():
templateSectionBegin="<!-- body / flyout / begin -->"
templateSectionEnd="<!-- body / flyout / end -->"
with open('templates/body-flyout-content.template') as templateFile:
substitutionContent = templateFile.read()
with open(fileToUpdate) as targetSubstitutionFile:
s = targetSubstitutionFile.read()
ddd=s
ddd=re.sub(templateSectionBegin, templateSectionBegin+nodeOpenName, ddd, flags=re.DOTALL)
ddd=re.sub(templateSectionEnd, nodeCloseName+templateSectionEnd, ddd, flags=re.DOTALL)
ddd=re.sub(nodeOpenName+".*"+nodeCloseName,substitutionContent,ddd,flags=re.DOTALL)
f = open(fileToUpdate, "w")
f.write(ddd)
f.close()
###################################################################
##
## driver
##
###################################################################
cascadeStylingIncludes()
##cascadeJavascriptIncludes()
##cascadeFooterContent()
##cascadeTopNavigation()
##cascadeSideNavigation()
##cascadeFlyoutContent()
##updateSideBarDesktop()
##updateSideBarMobile()

View File

@@ -0,0 +1,278 @@
<!-- Desktop sidebar -->
<aside
class="z-20 hidden w-64 overflow-y-auto bg-white dark:bg-gray-800 md:block flex-shrink-0"
>
<div class="py-4 text-gray-500 dark:text-gray-400">
<a
class="ml-6 text-lg font-bold text-gray-800 dark:text-gray-200"
href="#"
>
Windmill
</a>
<ul class="mt-6">
<li class="relative px-6 py-3">
<span
class="absolute inset-y-0 left-0 w-1 bg-purple-600 rounded-tr-lg rounded-br-lg"
aria-hidden="true"
></span>
<a
class="inline-flex items-center w-full text-sm font-semibold text-gray-800 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 dark:text-gray-100"
href="index.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
></path>
</svg>
<span class="ml-4">Dashboard</span>
</a>
</li>
</ul>
<ul>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="forms.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
></path>
</svg>
<span class="ml-4">Forms</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="cards.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"
></path>
</svg>
<span class="ml-4">Cards</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="charts.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 3.055A9.001 9.001 0 1020.945 13H11V3.055z"
></path>
<path d="M20.488 9H15V3.512A9.025 9.025 0 0120.488 9z"></path>
</svg>
<span class="ml-4">Charts</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="buttons.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
></path>
</svg>
<span class="ml-4">Buttons</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="modals.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
></path>
</svg>
<span class="ml-4">Modals</span>
</a>
</li>
<nav.pages>
<li class="relative px-6 py-3">
<button
class="inline-flex items-center justify-between w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
@click="togglePagesMenu"
aria-haspopup="true"
>
<span class="inline-flex items-center">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
></path>
</svg>
<span class="ml-4">Tournaments</span>
</span>
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
<template x-if="isPagesMenuOpen">
<ul
x-transition:enter="transition-all ease-in-out duration-300"
x-transition:enter-start="opacity-25 max-h-0"
x-transition:enter-end="opacity-100 max-h-xl"
x-transition:leave="transition-all ease-in-out duration-300"
x-transition:leave-start="opacity-100 max-h-xl"
x-transition:leave-end="opacity-0 max-h-0"
class="p-2 mt-2 space-y-2 overflow-hidden text-sm font-medium text-gray-500 rounded-md shadow-inner bg-gray-50 dark:text-gray-400 dark:bg-gray-900"
aria-label="submenu"
>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/login.html">Tournament Dashboard</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/create-account.html">
Tournament Manager
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/forgot-password.html">
Add New Tournament
</a>
</li>
</ul>
</template>
</li>
</nav.pages>
<nav.tables>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="tables.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
<span class="ml-4">Tables</span>
</a>
</li>
</nav.tables>
</ul>
<div class="px-6 my-6">
<button
class="flex items-center justify-between w-full px-4 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
>
Create account
<span class="ml-2" aria-hidden="true">+</span>
</button>
</div>
</div>
</aside>

View File

@@ -0,0 +1,538 @@
<!-- Mobile sidebar -->
<!-- Backdrop -->
<div
x-show="isSideMenuOpen"
x-transition:enter="transition ease-in-out duration-150"
x-transition:enter-start="opacity-0"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in-out duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
class="fixed inset-0 z-10 flex items-end bg-black bg-opacity-50 sm:items-center sm:justify-center"
></div>
<aside
class="fixed inset-y-0 z-20 flex-shrink-0 w-64 mt-16 overflow-y-auto bg-white dark:bg-gray-800 md:hidden"
x-show="isSideMenuOpen"
x-transition:enter="transition ease-in-out duration-150"
x-transition:enter-start="opacity-0 transform -translate-x-20"
x-transition:enter-end="opacity-100"
x-transition:leave="transition ease-in-out duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0 transform -translate-x-20"
@click.away="closeSideMenu"
@keydown.escape="closeSideMenu"
>
<div class="py-4 text-gray-500 dark:text-gray-400">
<a
class="ml-6 text-lg font-bold text-gray-800 dark:text-gray-200"
href="#"
>
Windmill
</a>
<ul class="mt-6">
<li class="relative px-6 py-3">
<span
class="absolute inset-y-0 left-0 w-1 bg-purple-600 rounded-tr-lg rounded-br-lg"
aria-hidden="true"
></span>
<a
class="inline-flex items-center w-full text-sm font-semibold text-gray-800 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 dark:text-gray-100"
href="index.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6"
></path>
</svg>
<span class="ml-4">Dashboard</span>
</a>
</li>
</ul>
<ul>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="forms.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01"
></path>
</svg>
<span class="ml-4">Forms</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="cards.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10"
></path>
</svg>
<span class="ml-4">Cards</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="charts.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 3.055A9.001 9.001 0 1020.945 13H11V3.055z"
></path>
<path d="M20.488 9H15V3.512A9.025 9.025 0 0120.488 9z"></path>
</svg>
<span class="ml-4">Charts</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="buttons.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M15 15l-2 5L9 9l11 4-5 2zm0 0l5 5M7.188 2.239l.777 2.897M5.136 7.965l-2.898-.777M13.95 4.05l-2.122 2.122m-5.657 5.656l-2.12 2.122"
></path>
</svg>
<span class="ml-4">Buttons</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="modals.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
></path>
</svg>
<span class="ml-4">Modals</span>
</a>
</li>
<li class="relative px-6 py-3">
<a
class="inline-flex items-center w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
href="tables.html"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path d="M4 6h16M4 10h16M4 14h16M4 18h16"></path>
</svg>
<span class="ml-4">Tables</span>
</a>
</li>
<li class="relative px-6 py-3">
<button
class="inline-flex items-center justify-between w-full text-sm font-semibold transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
@click="togglePagesMenu"
aria-haspopup="true"
>
<span class="inline-flex items-center">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"
></path>
</svg>
<span class="ml-4">Pages</span>
</span>
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
clip-rule="evenodd"
></path>
</svg>
</button>
<template x-if="isPagesMenuOpen">
<ul
x-transition:enter="transition-all ease-in-out duration-300"
x-transition:enter-start="opacity-25 max-h-0"
x-transition:enter-end="opacity-100 max-h-xl"
x-transition:leave="transition-all ease-in-out duration-300"
x-transition:leave-start="opacity-100 max-h-xl"
x-transition:leave-end="opacity-0 max-h-0"
class="p-2 mt-2 space-y-2 overflow-hidden text-sm font-medium text-gray-500 rounded-md shadow-inner bg-gray-50 dark:text-gray-400 dark:bg-gray-900"
aria-label="submenu"
>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/login.html">Login</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/create-account.html">
Create account
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/forgot-password.html">
Forgot password
</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/404.html">404</a>
</li>
<li
class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200"
>
<a class="w-full" href="pages/blank.html">Blank</a>
</li>
</ul>
</template>
</li>
</ul>
<div class="px-6 my-6">
<button
class="flex items-center justify-between px-4 py-2 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-lg active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"
>
Create account
<span class="ml-2" aria-hidden="true">+</span>
</button>
</div>
</div>
</aside>
<div class="flex flex-col flex-1 w-full">
<header class="z-10 py-4 bg-white shadow-md dark:bg-gray-800">
<div
class="container flex items-center justify-between h-full px-6 mx-auto text-purple-600 dark:text-purple-300"
>
<!-- Mobile hamburger -->
<button
class="p-1 mr-5 -ml-1 rounded-md md:hidden focus:outline-none focus:shadow-outline-purple"
@click="toggleSideMenu"
aria-label="Menu"
>
<svg
class="w-6 h-6"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
clip-rule="evenodd"
></path>
</svg>
</button>
<!-- Search input -->
<div class="flex justify-center flex-1 lg:mr-32">
<div
class="relative w-full max-w-xl mr-6 focus-within:text-purple-500"
>
<div class="absolute inset-y-0 flex items-center pl-2">
<svg
class="w-4 h-4"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z"
clip-rule="evenodd"
></path>
</svg>
</div>
<input
class="w-full pl-8 pr-2 text-sm text-gray-700 placeholder-gray-600 bg-gray-100 border-0 rounded-md dark:placeholder-gray-500 dark:focus:shadow-outline-gray dark:focus:placeholder-gray-600 dark:bg-gray-700 dark:text-gray-200 focus:placeholder-gray-500 focus:bg-white focus:border-purple-300 focus:outline-none focus:shadow-outline-purple form-input"
type="text"
placeholder="Search for projects"
aria-label="Search"
/>
</div>
</div>
<ul class="flex items-center flex-shrink-0 space-x-6">
<!-- Theme toggler -->
<li class="flex">
<button
class="rounded-md focus:outline-none focus:shadow-outline-purple"
@click="toggleTheme"
aria-label="Toggle color mode"
>
<template x-if="!dark">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"
></path>
</svg>
</template>
<template x-if="dark">
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
fill-rule="evenodd"
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
clip-rule="evenodd"
></path>
</svg>
</template>
</button>
</li>
<!-- Notifications menu -->
<li class="relative">
<button
class="relative align-middle rounded-md focus:outline-none focus:shadow-outline-purple"
@click="toggleNotificationsMenu"
@keydown.escape="closeNotificationsMenu"
aria-label="Notifications"
aria-haspopup="true"
>
<svg
class="w-5 h-5"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 20 20"
>
<path
d="M10 2a6 6 0 00-6 6v3.586l-.707.707A1 1 0 004 14h12a1 1 0 00.707-1.707L16 11.586V8a6 6 0 00-6-6zM10 18a3 3 0 01-3-3h6a3 3 0 01-3 3z"
></path>
</svg>
<!-- Notification badge -->
<span
aria-hidden="true"
class="absolute top-0 right-0 inline-block w-3 h-3 transform translate-x-1 -translate-y-1 bg-red-600 border-2 border-white rounded-full dark:border-gray-800"
></span>
</button>
<template x-if="isNotificationsMenuOpen">
<ul
x-transition:leave="transition ease-in duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.away="closeNotificationsMenu"
@keydown.escape="closeNotificationsMenu"
class="absolute right-0 w-56 p-2 mt-2 space-y-2 text-gray-600 bg-white border border-gray-100 rounded-md shadow-md dark:text-gray-300 dark:border-gray-700 dark:bg-gray-700"
>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Messages</span>
<span
class="inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-red-600 bg-red-100 rounded-full dark:text-red-100 dark:bg-red-600"
>
13
</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Sales</span>
<span
class="inline-flex items-center justify-center px-2 py-1 text-xs font-bold leading-none text-red-600 bg-red-100 rounded-full dark:text-red-100 dark:bg-red-600"
>
2
</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center justify-between w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<span>Alerts</span>
</a>
</li>
</ul>
</template>
</li>
<!-- Profile menu -->
<li class="relative">
<button
class="align-middle rounded-full focus:shadow-outline-purple focus:outline-none"
@click="toggleProfileMenu"
@keydown.escape="closeProfileMenu"
aria-label="Account"
aria-haspopup="true"
>
<img
class="object-cover w-8 h-8 rounded-full"
src="https://images.unsplash.com/photo-1502378735452-bc7d86632805?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&s=aa3a807e1bbdfd4364d1f449eaa96d82"
alt=""
aria-hidden="true"
/>
</button>
<template x-if="isProfileMenuOpen">
<ul
x-transition:leave="transition ease-in duration-150"
x-transition:leave-start="opacity-100"
x-transition:leave-end="opacity-0"
@click.away="closeProfileMenu"
@keydown.escape="closeProfileMenu"
class="absolute right-0 w-56 p-2 mt-2 space-y-2 text-gray-600 bg-white border border-gray-100 rounded-md shadow-md dark:border-gray-700 dark:text-gray-300 dark:bg-gray-700"
aria-label="submenu"
>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z"
></path>
</svg>
<span>Profile</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"
></path>
<path d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
<span>Settings</span>
</a>
</li>
<li class="flex">
<a
class="inline-flex items-center w-full px-2 py-1 text-sm font-semibold transition-colors duration-150 rounded-md hover:bg-gray-100 hover:text-gray-800 dark:hover:bg-gray-800 dark:hover:text-gray-200"
href="#"
>
<svg
class="w-4 h-4 mr-3"
aria-hidden="true"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
viewBox="0 0 24 24"
stroke="currentColor"
>
<path
d="M11 16l-4-4m0 0l4-4m-4 4h14m-5 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h7a3 3 0 013 3v1"
></path>
</svg>
<span>Log out</span>
</a>
</li>
</ul>
</template>
</li>
</ul>
</div>
</header>

View File

@@ -0,0 +1,16 @@
<aside class="control-sidebar control-sidebar-dark">
<h4>Current Project</h4>
<div id="projectBannerArea" class="btn-group-vertical col-12">
<button id="projectBanner" disabled type="button" class="btn btn-lg btn-success">--</button>
</div>
<h4>Select Project</h4>
<div id="projectSwitcherArea" class="btn-group-vertical col-12"></div>
</aside>

View File

@@ -0,0 +1,15 @@
<footer class="main-footer">
<div class="float-right d-none d-sm-block">
</div>
<strong>
Made with ❤ by the
<a href="https://softwareshinobi.digital" target="softwareshinobi">Software Shinobi</a>.
</strong>
</footer>

View File

@@ -0,0 +1,17 @@
<!-- custom stuff -->
<script src="/scripting/config.js"></script>
<script src="/plugins/jquery/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.5/dist/js.cookie.min.js "></script>
<script src="/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<script src="/dist/js/adminlte.js"></script>
<script src="https://cdn.jsdelivr.net/npm/toastr@2.1.4/toastr.min.js "></script>
<script src="/project/scripting/flyout.js"></script>

View File

@@ -0,0 +1,6 @@
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./assets/css/tailwind.output.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.min.css" />

View File

@@ -0,0 +1,188 @@
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-darkrrr-primary elevation-4">
<!-- Brand Logo -->
<a href="/index.html" class="brand-link">
<img src="https://github.com/softwareshinobi/assets.softwareshinobi.digital/blob/production/imagery/valorantdigital/valorant.png?raw=true" alt="" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">
Workspace
</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar user (optional) -->
<div class="user-panel mt-3 pb-3 mb-3 d-flex">
<div class="image">
<img src="https://avatars.githubusercontent.com/u/45909594?v=4" class="img-circle elevation-2" alt="Software Shinobi">
</div>
<div class="info">
<a href="#" class="d-block">
software shinobi
</a>
</div>
</div>
<!-- SidebarSearch Form -->
<div styles="visibility:hidden" class="form-inline">
<div class="input-group" data-widget="sidebar-search">
<input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-append">
<button class="btn btn-sidebar">
<i class="fas fa-search fa-fw"></i>
</button>
</div>
</div>
</div>
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<!-- Add icons to the links using the .nav-icon class
with font-awesome or any other icon font library -->
<li class="nav-header">Productivity</li>
<!--home links -->
<li class="nav-item">
<a class="nav-link">
<i class="nav-icon fas fa-table"></i>
<p>
home
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/home/links.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>link portal</p>
</a>
</li>
</ul>
</li>
<!--productivity links -->
<li class="nav-item menu-open">
<a class="nav-link">
<i class="nav-icon fas fa-columns"></i>
<p>
projects
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/project/list.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>project list</p>
</a>
</li>
<li class="nav-item">
<a href="/project/kanban.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>kanban board</p>
</a>
</li>
<li class="nav-item">
<a href="/project/calendar.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>calendar</p>
</a>
</li>
<li class="nav-item">
<a href="/project/create.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>create project</p>
</a>
</li>
<li class="nav-item">
<a href="/story/create.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>create story</p>
</a>
</li>
</ul>
</li>
<!--dev links -->
<li class="nav-item">
<a class="nav-link">
<i class="nav-icon fas fa-table"></i>
<p>
.development
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/story/list.html" class="nav-link">
<i class="far fa-circle nav-icon"></i>
<p>all stories</p>
</a>
</li>
</ul>
</li>
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>

View File

@@ -0,0 +1,68 @@
<nav class="main-header navbar navbar-expand navbar-fpink navbar-daddrk">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/home/links.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/list.html" class="nav-link">Projects</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/kanban.html" class="nav-link">Kanban</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/calendar.html" class="nav-link">Calendar</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/project/create.html" class="nav-link">Create Project</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/story/create.html" class="nav-link">Create Story</a>
</li>
</ul>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" data-widget="fullscreen" href="#" role="button">
<i class="fas fa-expand-arrows-alt"></i>
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="control-sidebar" data-slide="true" href="#" role="button">
<i class="fas fa-th-large"></i>
</a>
</li>
</ul>
</nav>

View File

@@ -0,0 +1,4 @@
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">

View File

@@ -0,0 +1,40 @@
<nav class="navbar navbar-expand-lg bg-primary" data-bs-theme="dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">Navbar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarColor01" aria-controls="navbarColor01" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarColor01">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link active" href="#">Home
<span class="visually-hidden">(current)</span>
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Dropdown</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
</li>
</ul>
<form class="d-flex">
<input class="form-control me-sm-2" type="search" placeholder="Search">
<button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</div>
</nav>

View File

@@ -0,0 +1,85 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Home / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Home </h1>
<div>
<img src="{% static 'img/bike-shop-concept-with-bicycles.jpg' %}" height=480 width=640>
</div>
<p>
Welcome to Robert's Bike Rental. We have bikes of all sizes and accessories for you and your loved ones. Explore the local neighborhood in style & comfort on our bikes.
</p>
<div>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,90 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
About / Robert's Bike Rentals
</title>
<link rel="stylesheet" href="{% static 'css/custom.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1> Robert's Bike Rentals > About </h1>
<div>
<img src="{% static 'img/close-up-bicycle-bell.jpg' %}" height=480 width=640>
</div>
<p>
Rental bikes and fun for the entire family. Our bike rental store features multiple bikes that can be rented and reserved for your next cycle adventure.
</p>
<p>
Click the link below to reserve your bike with us.
</p>
<div>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>

View File

@@ -0,0 +1,198 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Bike Accessories / Robert's Bike Rentals
</title>
<link rel="stylesheet" href="{% static 'css/custom.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1> Robert's Bike Rentals > Bike Accessories </h1>
<div>
<img src="{% static 'img/cover.jpg' %}" alt="My image">
</div>
<p>
Keep your rental in good condition with our custom line of products to bring with you on your bike adventure. Browse our collection of bike accessories to maintain and repair your bike.
</p>
<div>
<table id="table" class="center products">
<thead>
<th></th> <th>Name</th>
<th>Description</th>
<th>Price</th>
</thead>
<tbody>
<tr>
<td>
<img class="thumbnail" src="https://www.bike-discount.de/media/image/2c/5b/25/Feedback-Sports-Pro-Mechanic-Reparaturstander-FA003475003-1_800x800.jpg">
</td>
<td>
Aluminum Bike Stand
</td>
<td>
Our sturdy and reliable bike stand securely holds your bike in place, allowing you to make critical repairs with ease. Its aluminum construction ensures durability while remaining lightweight, making it a perfect choice for both professionals and hobbyists.
</td>
<td>
€339.99
</td>
</tr>
<tr>
<td><img class="thumbnail" src="https://www.bike-discount.de/media/image/71/1f/64/Topeak-JoeBlow-Booster-TJB-BST3-1_300x300.jpg"></td>
<td>
Hydraulic Pump
</td>
<td>
Level up your biking experience with our revolutionary Hydraulic Bike Pump. Say goodbye to sore arms and endless pumping! Our innovative pump utilizes hydraulic technology to effortlessly fill your bike tires with air.
</td>
<td>€39.99 </td>
</tr>
<tr>
<td><img class="thumbnail" src="https://www.bike-discount.de/media/image/95/da/80/Stans-NoTubes_Tire-Sealant-Reifendichtmittel_800x800.jpg"></td>
<td>
Bike Gear Lubricant
</td>
<td>
on't let rusty gears slow you down or ruin your biking experience. Our specially formulated lubricant is designed to keep your bike gears in top-notch shape, ensuring smooth and effortless gear changes every time you hit the road.
</td>
<td>€19.99</td>
</tr>
<tr>
<td><img class="thumbnail" src="https://www.bike-discount.de/media/image/a0/f6/d8/Schwalbe_Tubeless-Felgenband_887019_300x300.jpg"></td>
<td>
Bike Repair Tape
</td>
<td>
the ultimate solution for quick and hassle-free bike repairs. Whether you're on a leisurely ride or in the middle of an epic adventure, this special emergency tape will have you back on track in no time.
</td>
<td>€19.99</td>
</tr>
</tbody>
</table>
</div>
<div>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,173 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Manage Rental Bikes / Robert's Bike Rentals
</title>
<link rel="stylesheet" href="{% static 'css/custom.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1>
Robert's Bike Rentals > Manage Rental Bikes <i>[admin]</i>
</h1>
<div>
<img src="{% static 'img/close-up-bicycle-gears.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our fleet of rental bikes. You can use this page to return bikes that have been rented by customers.
</p>
<div>
<table class="center">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<th>Rental User ID</th>
<th>Actions</th>
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
<td class=""> {{ question.rented_user_id }} </td>
{% if question.rented_user_id != 0 %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Return bike: {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="btn btn-dark">
Not currently rented by a customer.
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h2>No bikes are available.</h2>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,183 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Reserve Bike / Robert's Bike Rentals
</title>
<link rel="stylesheet" href="{% static 'css/custom.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1> Robert's Bike Rentals > Reserve Bike </h1>
<div>
<img src="{% static 'img/bicycles-workshop.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our rental bikes. You can see which bikes are already reserved and which bikes are available for rent.
</p>
<div>
<table id="rent-payment-table" class="center products">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<!-- <th>Rental User ID</th>
-->
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
{% if question.rented_user_id == user.pk %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-secondary">
Return {{ question.name }}
</button>
</a>
</td>
{% elif question.rented_user_id == 0 %}
<td class="">
<a href="/bike/reserve/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Reserve {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="disabled">
Not Available
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h6 class="notification">No bikes are available for rent.</h6>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,53 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Home / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Home </h1>
this is the admin page.
</body>
</html>

21
templates/.restore/cascadr.bash Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
##
##
reset
clear
##
set -e
set -x
##
cd .cascadr
bash cascadr.bash

View File

@@ -0,0 +1,53 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
home / card players unite
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Home </h1>
this is home.html
</body>
</html>

View File

@@ -0,0 +1,53 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
landing / card players unite
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Home </h1>
this is landing.html
</body>
</html>

View File

@@ -0,0 +1,187 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Manage Players / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1> Robert's Bike Rentals > Reserve Bike </h1>
<div>
<img src="{% static 'img/bicycles-workshop.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our rental bikes. You can see which bikes are already reserved and which bikes are available for rent.
</p>
<div>
<table id="rent-payment-table" class="center products">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<!-- <th>Rental User ID</th>
-->
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
{% if question.rented_user_id == user.pk %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-secondary">
Return {{ question.name }}
</button>
</a>
</td>
{% elif question.rented_user_id == 0 %}
<td class="">
<a href="/bike/reserve/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Reserve {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="disabled">
Not Available
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h6 class="notification">No bikes are available for rent.</h6>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,187 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Manage Teams / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1> Robert's Bike Rentals > Reserve Bike </h1>
<div>
<img src="{% static 'img/bicycles-workshop.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our rental bikes. You can see which bikes are already reserved and which bikes are available for rent.
</p>
<div>
<table id="rent-payment-table" class="center products">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<!-- <th>Rental User ID</th>
-->
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
{% if question.rented_user_id == user.pk %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-secondary">
Return {{ question.name }}
</button>
</a>
</td>
{% elif question.rented_user_id == 0 %}
<td class="">
<a href="/bike/reserve/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Reserve {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="disabled">
Not Available
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h6 class="notification">No bikes are available for rent.</h6>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,177 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Manage Tournaments / Card Players Unite Admin
</title>
<!-- head / css / begin -->
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
<!-- head / css / end -->
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/about-roberts-rentals">
<button type="button" class="btn btn-primary">
About
</button>
</a>
<a href="/bike-accessories">
<button type="button" class="btn btn-primary">
Bike Accessories
</button>
</a>
<a href="/bike/">
<button type="button" class="btn btn-primary">
Reserve Bike
</button>
</a>
<a href="/accounts/login/">
<button type="button" class="btn btn-secondary">
Log In
</button>
</a>
</div>
<h1>
Robert's Bike Rentals > Manage Rental Bikes <i>[admin]</i>
</h1>
<div>
<img src="{% static 'img/close-up-bicycle-gears.jpg' %}" height=480 width=640>
</div>
<p>
Use this page to view our fleet of rental bikes. You can use this page to return bikes that have been rented by customers.
</p>
<div>
<table class="center">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Rental Price</th>
<th>Rental User ID</th>
<th>Actions</th>
</tr>
</thead>
<tbody >
{% if status_message %}
<h4>
{{ status_message }}
</h4>
{% endif %}
{% if latest_question_list %}
{% for question in latest_question_list %}
<tr>
<td class=""> {{ question.name }} </td>
<td class=""> {{ question.description }} </td>
<td class=""> &euro; {{ question.rental_price }} </td>
<td class=""> {{ question.rented_user_id }} </td>
{% if question.rented_user_id != 0 %}
<td class="">
<a href="/bike/return/{{question.id}}/{{user.pk}}">
<button type="button" class="btn btn-primary">
Return bike: {{ question.name }}
</button>
</a>
</td>
{% else %}
<td class="">
<button type="button" class="btn btn-dark">
Not currently rented by a customer.
</button>
</td>
{% endif %}
</tr>
{% endfor %}
</ul>
{% else %}
<h2>No bikes are available.</h2>
{% endif %}
</tbody>
</table>
</div>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

213
templates/listing.html Normal file
View File

@@ -0,0 +1,213 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Card Players Unite / card tournaments and events near you
</title>
<link rel="stylesheet" href="{% static '/listing/listing.css' %}">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/listing/listing.css">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400;500;700;900&family=Sen:wght@400;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css">
</head>
<body>
<div class="navbar">
<div class="navbar-container">
<div class="logo-container">
<h1 class="logo">
Card Players Unite
</h1>
</div>
<div class="menu-container">
<ul class="menu-list">
<li class="menu-list-item active">Home</li>
<li class="menu-list-item">Tournaments</li>
<li class="menu-list-item">Teams</li>
<li class="menu-list-item">Login</li>
</ul>
</div>
<div class="profile-container">
<div class="toggle">
<i class="fas fa-moon toggle-icon"></i>
<i class="fas fa-sun toggle-icon"></i>
<div class="toggle-ball"></div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<i class="left-menu-icon fas fa-home"></i>
<i class="left-menu-icon fas fa-users"></i>
<i class="left-menu-icon fas fa-bookmark"></i>
<i class="left-menu-icon fas fa-tv"></i>
</div>
<div class="container">
<div class="content-container">
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/18.jpg' %}');">
<p class="featured-desc">
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis minima voluptatibus incidunt. Accusamus, provident.
</p>
<button class="featured-button">
LEARN MORE
</button>
</div>
<div class="movie-list-container">
<h1 class="movie-list-title">Alll Tournaments</h1>
<div class="movie-list-wrapper">
<div class="movie-list">
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/8.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/9.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/10.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/11.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/12.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
<div class="movie-list-item">
<img class="movie-list-item-img" src="{% static '/listing/imagery/1.jpg' %}" alt="">
<span class="movie-list-item-title">Her</span>
<p class="movie-list-item-desc">Lorem ipsum dolor sit amet consectetur adipisicing elit. At
hic fugit similique accusantium.</p>
<button class="movie-list-item-button">Watch</button>
</div>
</div>
<i class="fas fa-chevron-right arrow"></i>
</div>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/7.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">111WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/6.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/8.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
<div class="featured-content" style="background: linear-gradient(to bottom, rgba(0,0,0,0), #151515), url('{% static 'listing/imagery/9.jpg' %}');">
<img class="featured-title" src="{% static '/listing/imagery/f-t-2.png" alt="">
<p class="featured-desc">Lorem ipsum, dolor sit amet consectetur adipisicing elit. Iusto illo dolor
deserunt nam assumenda ipsa eligendi dolore, ipsum id fugiat quo enim impedit, laboriosam omnis
minima voluptatibus incidunt. Accusamus, provident.</p>
<button class="featured-button">WATCH</button>
</div>
</div>
</div>
<!--
<script src="{% static 'listing/listing.js' %}"></script>
<script src="{% static 'listing/features.js' %}"></script>
-->
</body>
</html>

View File

@@ -0,0 +1,95 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Sign In / Card Player's Unite Admin
</title>
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Log In </h1>
<div>
<img src="{% static 'img/cyclist-sunny-day-bike-adventure-travel-photo.jpg' %}" height=480 width=640>
</div>
<form method="POST" action="">
{{ form.non_field_errors }}
{% csrf_token %}
<div>
<h3> user name </h3>
<input type="text" name="username">
</div>
<div>
<h3> password </h3>
<input type="password" name="password">
</div>
<div>
<br>
<button type="submit" class="btn btn-secondary"> Log In </button>
<p class="message">Don't have an account? <a href="/player/register">Create Account</a>.</p>
</div>
</form>
<div class="footer">
Robert's Bike Rental created by <a href="https://github.com/gomsur">Robert</a>. <a href="https://www.freepik.com/free-photo/cyclist-sunny-day-bike-adventure-travel-photo_3972810.htm#query=bike&position=0&from_view=search&track=sph">Image by jcomp</a> on Freepik.
</div>
</body>
</html>

View File

@@ -0,0 +1,114 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Sign In / Card Player's Unite Admin
</title>
<link rel="stylesheet" href="{% static 'styling/custom.css' %}">
<link rel="stylesheet" href="{% static 'styling/sketchy.css' %}">
</head>
<body>
<div>
<a href="/home">
<button type="button" class="btn btn-primary">
Home
</button>
</a>
<a href="/tournament/">
<button type="button" class="btn btn-primary">
Manage Tournaments
</button>
</a>
<a href="/player/login/">
<button type="button" class="btn btn-secondary">
Sign In
</button>
</a>
</div>
<h1> Card Players Unite Admin > Register </h1>
<div>
<img src="{% static 'img/woman-going-work-bicycle.jpg' %}" width=480 height=640>
</div>
<div class="register-page">
<div class="form">
<form class="register-form" method="POST" action="">
{% csrf_token %}
{{ form.errors }}
<h4>{{form.username.label}}</h4>
<p>
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
</p>
{{form.username}}
<br/>
<br/>
<h4>{{form.password1.label}}</h4>
<p>
Your password cant be too similar to your other personal information.
<br>
<br> Your password must contain at least 8 characters.
<br> Your password cant be a commonly used password.
<br> Your password cant be entirely numeric. </p>
{{form.password1}}
<br/>
<br/>
<h4>{{form.password2.label}}</h4>
<p> Password confirmation: Enter the same password as before, for verification. <p>
{{form.password2}}
<br/><br/>
<button type="submit" class="btn btn-secondary"> Create Account</button>
<p class="message">Already registered? <a href="/player/login/">Log In</a>.</p>
</form>
</div>
</div>
</body>
</html>

3
tournament/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
tournament/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class TournamentConfig(AppConfig):
name = 'tournament'

View File

@@ -0,0 +1,24 @@
# Generated by Django 5.0.1 on 2024-03-05 17:26
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Tournament',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=240, verbose_name='name')),
('description', models.CharField(max_length=240, verbose_name='description')),
('rental_price', models.FloatField(default=999.99, verbose_name='rental_price')),
('rented_user_id', models.IntegerField(verbose_name='rented_user_id')),
],
),
]

View File

15
tournament/models.py Normal file
View File

@@ -0,0 +1,15 @@
from django.db import models
class Tournament(models.Model):
name = models.CharField("name", max_length=240)
description = models.CharField("description", max_length=240)
rental_price = models.FloatField("rental_price", default=999.99)
rented_user_id = models.IntegerField("rented_user_id")
def __str__(self):
return self.name

10
tournament/serializers.py Normal file
View File

@@ -0,0 +1,10 @@
from rest_framework import serializers
from .models import Tournament
class TournamentSerializer(serializers.ModelSerializer):
class Meta:
model = Tournament
fields = ['id', 'name', 'description', 'rental_price', 'rented_user_id']

3
tournament/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

50
tournament/urls.py Normal file
View File

@@ -0,0 +1,50 @@
from django.urls import include, path
from .views import TournamentCreate, TournamentList, TournamentDetail
from .views import TournamentUpdate, TournamentDelete
from . import views
urlpatterns = [
path('', views.custom, name="custom"),
path('<int:pk>/', TournamentDetail.as_view(), name='retrieve-bike'),
path("reserve/<int:pk>/<int:user_pk>", views.reserveTournament, name="reserve-bike"),
path("return/<int:pk>/<int:user_pk>", views.returnTournament, name="return-bike"),
path('create/', TournamentCreate.as_view(), name='create-bike'),
path('update/<int:pk>/', TournamentUpdate.as_view(), name='update-bike'),
path('delete/<int:pk>/', TournamentDelete.as_view(), name='delete-bike'),
]
## path("<int:question_id>/vote/", views.vote, name="vote"),
## path("about", views.about, name="about"),
## ex: /polls/5/
## path("<int:question_id>/", views.detail, name="detail"),
## ex: /polls/5/results/
## path("<int:question_id>/results/", views.results, name="results"),
## ex: /polls/5/vote/
## path("<int:question_id>/vote/", views.vote, name="vote"),
## path('', TournamentList.as_view()),
## path('', login_required(direct_to_template), {'template': 'registration/login.html'}),
## path("custom", views.custom, name="custom"),
## (r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
## path('reserve/<int:pk>/<str:userid>/', TournamentUpdate.as_view(), name='reserve-bike')
## path('return/<int:pk>/', TournamentUpdate.as_view(), name='return-bike'),

128
tournament/views.py Normal file
View File

@@ -0,0 +1,128 @@
from django.shortcuts import render
from .models import Tournament
from rest_framework import generics
from .serializers import TournamentSerializer
from django.http import HttpResponse
from django.template import loader
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.shortcuts import reverse
## https://docs.djangoproject.com/en/4.2/intro/tutorial03/
class TournamentCreate(generics.CreateAPIView):
queryset = Tournament.objects.all(),
serializer_class = TournamentSerializer
class TournamentList(generics.ListAPIView):
queryset = Tournament.objects.all()
serializer_class = TournamentSerializer
class TournamentDetail(generics.RetrieveAPIView):
queryset = Tournament.objects.all()
serializer_class = TournamentSerializer
class TournamentUpdate(generics.RetrieveUpdateAPIView):
queryset = Tournament.objects.all()
serializer_class = TournamentSerializer
class TournamentDelete(generics.RetrieveDestroyAPIView):
queryset = Tournament.objects.all()
serializer_class = TournamentSerializer
def reserveTournament(request, pk, user_pk):
t = Tournament.objects.get(id=pk)
t.rented_user_id = user_pk # change field
t.save() # this will update only
##
latest_question_list = Tournament.objects.all()
context = {
"latest_question_list": latest_question_list,
"status_message": ("You have successfull reserved the %s." % t.name),
}
if request.user.is_superuser:
template = loader.get_template("manage.html")
else:
template = loader.get_template("reserve.html")
return HttpResponse(template.render(context, request))
latest_question_list = Tournament.objects.all()
template = loader.get_template("reserve.html")
context = {
"latest_question_list": latest_question_list,
"status_message": ("You have successfull reserved the %s." % t.name),
}
return HttpResponse(template.render(context, request))
def returnTournament(request, pk, user_pk):
t = Tournament.objects.get(id=pk)
t.rented_user_id = 0 # change field
t.save() # this will update only
##
latest_question_list = Tournament.objects.all()
context = {
"latest_question_list": latest_question_list,
"status_message": ("You have successfull returned the %s." % t.name),
}
if request.user.is_superuser:
template = loader.get_template("manage.html")
else:
template = loader.get_template("reserve.html")
return HttpResponse(template.render(context, request))
#@login_required
def custom(request):
print("custom custom custom")
latest_question_list = Tournament.objects.all()
context = {
"latest_question_list": latest_question_list,
}
if request.user.is_superuser:
template = loader.get_template("admin.html")
else:
template = loader.get_template("tournament.html")
return HttpResponse(template.render(context, request))