initial commit. displays simple hierarchy and lists of models. includes fixtures for initial data.
This commit is contained in:
92
.gitignore
vendored
Normal file
92
.gitignore
vendored
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
# Django #
|
||||||
|
*.log
|
||||||
|
*.pot
|
||||||
|
*.pyc
|
||||||
|
__pycache__
|
||||||
|
db.sqlite3
|
||||||
|
media
|
||||||
|
|
||||||
|
# Backup files #
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
# If you are using PyCharm #
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.xml
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
*.iws /out/
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Python #
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
.pytest_cache/
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery
|
||||||
|
celerybeat-schedule.*
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
|
||||||
|
scripts/
|
||||||
|
/.idea/benchcoach.iml
|
||||||
0
benchcoach/__init__.py
Normal file
0
benchcoach/__init__.py
Normal file
16
benchcoach/asgi.py
Normal file
16
benchcoach/asgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
ASGI config for events 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.2/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'events.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
||||||
135
benchcoach/settings.py
Normal file
135
benchcoach/settings.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
"""
|
||||||
|
Django settings for events project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 3.2.6.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/3.2/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/3.2/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
|
||||||
|
# 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.2/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = 'django-insecure-qib_j&47o$5l3*gi7y#8#3pjh_88sfdqn@dmp&gx+2)&1nzmor'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = ["smithers-ii.local", "127.0.0.1"]
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'events.apps.EventsConfig',
|
||||||
|
'teams.apps.TeamsConfig',
|
||||||
|
'venues.apps.VenuesConfig',
|
||||||
|
'players.apps.PlayersConfig',
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'bootstrap5'
|
||||||
|
]
|
||||||
|
|
||||||
|
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',
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'benchcoach.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 = 'benchcoach.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': BASE_DIR / 'db.sqlite3',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/3.2/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.2/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_L10N = True
|
||||||
|
|
||||||
|
USE_TZ = False
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/3.2/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
# Default primary key field type
|
||||||
|
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field
|
||||||
|
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
|
MEDIA_URL = '/media/'
|
||||||
|
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
|
||||||
29
benchcoach/urls.py
Normal file
29
benchcoach/urls.py
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
"""events URL Configuration
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/3.2/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import path, include
|
||||||
|
from django.conf.urls.static import static
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
from .views import welcome
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', welcome),
|
||||||
|
path('admin/', admin.site.urls),
|
||||||
|
path('events/', include('events.urls')),
|
||||||
|
path('teams/', include('teams.urls')),
|
||||||
|
path('venues/', include('venues.urls'))
|
||||||
|
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||||
6
benchcoach/views.py
Normal file
6
benchcoach/views.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.http import HttpResponse
|
||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
def welcome(request):
|
||||||
|
pages = ['schedule', 'teams_list', 'venues_list']
|
||||||
|
return render(request,'home.html',{'pages':pages})
|
||||||
16
benchcoach/wsgi.py
Normal file
16
benchcoach/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for events 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.2/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'events.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
0
events/__init__.py
Normal file
0
events/__init__.py
Normal file
7
events/admin.py
Normal file
7
events/admin.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import Event, Availability
|
||||||
|
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
admin.site.register(Event)
|
||||||
|
admin.site.register(Availability)
|
||||||
6
events/apps.py
Normal file
6
events/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class EventsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'events'
|
||||||
245
events/fixtures/sample_events.yaml
Normal file
245
events/fixtures/sample_events.yaml
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
- model: events.event
|
||||||
|
pk: 1
|
||||||
|
fields:
|
||||||
|
start: '2020-08-24T16:00:01'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '7'
|
||||||
|
venue_id: '15'
|
||||||
|
- model: events.event
|
||||||
|
pk: 2
|
||||||
|
fields:
|
||||||
|
start: '2020-08-24T19:00:02'
|
||||||
|
away_team_id: '7'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 3
|
||||||
|
fields:
|
||||||
|
start: '2020-08-24T22:00:01'
|
||||||
|
away_team_id: '12'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 4
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T00:00:01'
|
||||||
|
away_team_id: '12'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 5
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T01:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '2'
|
||||||
|
venue_id: '10'
|
||||||
|
- model: events.event
|
||||||
|
pk: 6
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T04:00:00'
|
||||||
|
away_team_id: '6'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 7
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T07:00:03'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '6'
|
||||||
|
venue_id: '8'
|
||||||
|
- model: events.event
|
||||||
|
pk: 8
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T10:00:03'
|
||||||
|
away_team_id: '11'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 9
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T13:00:01'
|
||||||
|
away_team_id: '7'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 10
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T16:00:00'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '7'
|
||||||
|
venue_id: '15'
|
||||||
|
- model: events.event
|
||||||
|
pk: 11
|
||||||
|
fields:
|
||||||
|
start: '2020-08-25T19:00:03'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '16'
|
||||||
|
venue_id: '24'
|
||||||
|
- model: events.event
|
||||||
|
pk: 12
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T00:00:03'
|
||||||
|
away_team_id: '6'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 13
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T01:00:01'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '12'
|
||||||
|
venue_id: '20'
|
||||||
|
- model: events.event
|
||||||
|
pk: 14
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T04:00:01'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '2'
|
||||||
|
venue_id: '10'
|
||||||
|
- model: events.event
|
||||||
|
pk: 15
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T07:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '4'
|
||||||
|
venue_id: '23'
|
||||||
|
- model: events.event
|
||||||
|
pk: 16
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T13:00:02'
|
||||||
|
away_team_id: '11'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 17
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T16:00:00'
|
||||||
|
away_team_id: '15'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 18
|
||||||
|
fields:
|
||||||
|
start: '2020-08-26T19:00:03'
|
||||||
|
away_team_id: '16'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 19
|
||||||
|
fields:
|
||||||
|
start: '2020-08-27T00:00:02'
|
||||||
|
away_team_id: '11'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 20
|
||||||
|
fields:
|
||||||
|
start: '2020-08-27T01:00:00'
|
||||||
|
away_team_id: '15'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 21
|
||||||
|
fields:
|
||||||
|
start: '2020-08-27T14:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '2'
|
||||||
|
venue_id: '10'
|
||||||
|
- model: events.event
|
||||||
|
pk: 22
|
||||||
|
fields:
|
||||||
|
start: '2020-08-27T17:00:01'
|
||||||
|
away_team_id: '7'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 23
|
||||||
|
fields:
|
||||||
|
start: '2020-08-27T23:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '7'
|
||||||
|
venue_id: '15'
|
||||||
|
- model: events.event
|
||||||
|
pk: 24
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T00:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '7'
|
||||||
|
venue_id: '15'
|
||||||
|
- model: events.event
|
||||||
|
pk: 25
|
||||||
|
fields:
|
||||||
|
start: '2021-10-26T17:12:48'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '7'
|
||||||
|
venue_id: '15'
|
||||||
|
- model: events.event
|
||||||
|
pk: 26
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T05:00:05'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '20'
|
||||||
|
venue_id: '21'
|
||||||
|
- model: events.event
|
||||||
|
pk: 27
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T08:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '12'
|
||||||
|
venue_id: '20'
|
||||||
|
- model: events.event
|
||||||
|
pk: 28
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T11:00:06'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '11'
|
||||||
|
venue_id: '16'
|
||||||
|
- model: events.event
|
||||||
|
pk: 29
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T14:00:02'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '4'
|
||||||
|
venue_id: '23'
|
||||||
|
- model: events.event
|
||||||
|
pk: 30
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T17:00:05'
|
||||||
|
away_team_id: '1'
|
||||||
|
home_team_id: '6'
|
||||||
|
venue_id: '8'
|
||||||
|
- model: events.event
|
||||||
|
pk: 31
|
||||||
|
fields:
|
||||||
|
start: '2020-08-28T23:00:09'
|
||||||
|
away_team_id: '19'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 32
|
||||||
|
fields:
|
||||||
|
start: '2020-08-29T00:00:05'
|
||||||
|
away_team_id: '19'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 33
|
||||||
|
fields:
|
||||||
|
start: '2020-08-29T02:00:02'
|
||||||
|
away_team_id: '6'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 34
|
||||||
|
fields:
|
||||||
|
start: '2020-08-29T05:00:06'
|
||||||
|
away_team_id: '15'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
|
- model: events.event
|
||||||
|
pk: 35
|
||||||
|
fields:
|
||||||
|
start: '2020-08-29T13:00:06'
|
||||||
|
away_team_id: '8'
|
||||||
|
home_team_id: '1'
|
||||||
|
venue_id: '4'
|
||||||
60
events/migrations/0001_initial.py
Normal file
60
events/migrations/0001_initial.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 17:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('venues', '0001_initial'),
|
||||||
|
('teams', '0001_initial'),
|
||||||
|
('players', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Event',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('start', models.DateTimeField(null=True)),
|
||||||
|
('away_team', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='away_team', to='teams.team')),
|
||||||
|
('home_team', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='home_team', to='teams.team')),
|
||||||
|
('venue', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='venues.venue')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Season',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Positioning',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('position', models.CharField(choices=[('P', 'P'), ('C', 'C'), ('1B', '1B'), ('2B', '2B'), ('3B', '3B'), ('SS', 'SS'), ('LF', 'LF'), ('CF', 'CF'), ('RF', 'RF'), ('DH', 'DH'), ('EH', 'EH')], default=None, max_length=2, null=True)),
|
||||||
|
('order', models.IntegerField(default=None, null=True)),
|
||||||
|
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.event')),
|
||||||
|
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='players.player')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'unique_together': {('player', 'event')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Availability',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('available', models.CharField(choices=[('Yes', 'YES'), ('No', 'NO'), ('Maybe', 'MAY'), ('Unknown', 'UNK')], default='UNK', max_length=7)),
|
||||||
|
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='events.event')),
|
||||||
|
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='players.player')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'unique_together': {('event', 'player')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
17
events/migrations/0002_alter_availability_options.py
Normal file
17
events/migrations/0002_alter_availability_options.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 18:39
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('events', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='availability',
|
||||||
|
options={'verbose_name_plural': 'availabilities'},
|
||||||
|
),
|
||||||
|
]
|
||||||
0
events/migrations/__init__.py
Normal file
0
events/migrations/__init__.py
Normal file
56
events/models.py
Normal file
56
events/models.py
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
from django.db import models
|
||||||
|
from venues.models import Venue
|
||||||
|
from teams.models import Team
|
||||||
|
from players.models import Player, StatLine
|
||||||
|
|
||||||
|
class Event(models.Model):
|
||||||
|
start = models.DateTimeField(null=True)
|
||||||
|
venue = models.ForeignKey(Venue, null=True, on_delete=models.CASCADE)
|
||||||
|
home_team = models.ForeignKey(Team, null=True,on_delete=models.CASCADE, related_name="home_team")
|
||||||
|
away_team = models.ForeignKey(Team, null=True,on_delete=models.CASCADE, related_name="away_team")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.start:%Y-%m-%d %H:%M}"
|
||||||
|
|
||||||
|
class Availability(models.Model):
|
||||||
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
||||||
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
||||||
|
choices = [
|
||||||
|
('Yes', 'YES'),
|
||||||
|
('No', 'NO'),
|
||||||
|
('Maybe', 'MAY'),
|
||||||
|
('Unknown', 'UNK')
|
||||||
|
]
|
||||||
|
available = models.CharField(choices=choices, default='UNK',max_length = 7)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.event}; {self.player}; {self.available}"
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('event', 'player',)
|
||||||
|
verbose_name_plural = "availabilities"
|
||||||
|
|
||||||
|
class Positioning(models.Model):
|
||||||
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
||||||
|
event = models.ForeignKey(Event, on_delete=models.CASCADE)
|
||||||
|
positions = [
|
||||||
|
('P', 'P'),
|
||||||
|
('C', 'C'),
|
||||||
|
('1B', '1B'),
|
||||||
|
('2B', '2B'),
|
||||||
|
('3B', '3B'),
|
||||||
|
('SS', 'SS'),
|
||||||
|
('LF', 'LF'),
|
||||||
|
('CF', 'CF'),
|
||||||
|
('RF', 'RF'),
|
||||||
|
('DH','DH'),
|
||||||
|
('EH','EH')
|
||||||
|
]
|
||||||
|
position = models.CharField(choices=positions, default=None, max_length=2, null=True)
|
||||||
|
order = models.IntegerField(default=None, null=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('player', 'event',)
|
||||||
|
|
||||||
|
class Season(models.Model):
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
15
events/templates/events/schedule.html
Normal file
15
events/templates/events/schedule.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{% load bootstrap5 %}
|
||||||
|
{% bootstrap_css %}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
|
||||||
|
<Title>Schedule</Title>
|
||||||
|
<h1>Schedule</h1>
|
||||||
|
<ol>
|
||||||
|
{% for event in events %}
|
||||||
|
<li>
|
||||||
|
{{ event.away_team.name }} vs. {{ event.home_team.name }} <br>
|
||||||
|
{{ event.start|date:"l, F j, Y g:i A" }} <br>
|
||||||
|
{{ event.venue.name }}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
10
events/urls.py
Normal file
10
events/urls.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', views.root, name="root"),
|
||||||
|
path('schedule', views.schedule, name="schedule")
|
||||||
|
]
|
||||||
9
events/views.py
Normal file
9
events/views.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from django.shortcuts import render, redirect
|
||||||
|
from .models import Event
|
||||||
|
|
||||||
|
def root(request):
|
||||||
|
return redirect('/events/schedule')
|
||||||
|
|
||||||
|
def schedule(request):
|
||||||
|
events = Event.objects.all()
|
||||||
|
return render(request, 'events/schedule.html', {'events': events})
|
||||||
BIN
identifier.sqlite
Normal file
BIN
identifier.sqlite
Normal file
Binary file not shown.
22
manage.py
Executable file
22
manage.py
Executable file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Django's command-line utility for administrative tasks."""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Run administrative tasks."""
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'benchcoach.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()
|
||||||
0
players/__init__.py
Normal file
0
players/__init__.py
Normal file
6
players/admin.py
Normal file
6
players/admin.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import Player, StatLine
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
admin.site.register(Player)
|
||||||
|
admin.site.register(StatLine)
|
||||||
6
players/apps.py
Normal file
6
players/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class PlayersConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'players'
|
||||||
84
players/fixtures/sample_players.yaml
Normal file
84
players/fixtures/sample_players.yaml
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
- model: players.player
|
||||||
|
pk: 1
|
||||||
|
fields:
|
||||||
|
first_name: Edric
|
||||||
|
last_name: Tosser
|
||||||
|
jersey_number: 1
|
||||||
|
- model: players.player
|
||||||
|
pk: 2
|
||||||
|
fields:
|
||||||
|
first_name: Paula
|
||||||
|
last_name: Mason
|
||||||
|
jersey_number: 2
|
||||||
|
- model: players.player
|
||||||
|
pk: 3
|
||||||
|
fields:
|
||||||
|
first_name: Declan
|
||||||
|
last_name: Suzanne
|
||||||
|
jersey_number: 3
|
||||||
|
- model: players.player
|
||||||
|
pk: 4
|
||||||
|
fields:
|
||||||
|
first_name: Baby
|
||||||
|
last_name: Triumphant
|
||||||
|
jersey_number: 4
|
||||||
|
- model: players.player
|
||||||
|
pk: 5
|
||||||
|
fields:
|
||||||
|
first_name: Joshua
|
||||||
|
last_name: Butt
|
||||||
|
jersey_number: 5
|
||||||
|
- model: players.player
|
||||||
|
pk: 6
|
||||||
|
fields:
|
||||||
|
first_name: Isaac
|
||||||
|
last_name: Johnson
|
||||||
|
jersey_number: 6
|
||||||
|
- model: players.player
|
||||||
|
pk: 7
|
||||||
|
fields:
|
||||||
|
first_name: Rivers
|
||||||
|
last_name: Rosa
|
||||||
|
jersey_number: 7
|
||||||
|
- model: players.player
|
||||||
|
pk: 8
|
||||||
|
fields:
|
||||||
|
first_name: Lou
|
||||||
|
last_name: Roseheart
|
||||||
|
jersey_number: 8
|
||||||
|
- model: players.player
|
||||||
|
pk: 9
|
||||||
|
fields:
|
||||||
|
first_name: Wesley
|
||||||
|
last_name: Poole
|
||||||
|
jersey_number: 9
|
||||||
|
- model: players.player
|
||||||
|
pk: 10
|
||||||
|
fields:
|
||||||
|
first_name: Mullen
|
||||||
|
last_name: Peterson
|
||||||
|
jersey_number: 10
|
||||||
|
- model: players.player
|
||||||
|
pk: 11
|
||||||
|
fields:
|
||||||
|
first_name: Justice
|
||||||
|
last_name: Spoon
|
||||||
|
jersey_number: 11
|
||||||
|
- model: players.player
|
||||||
|
pk: 12
|
||||||
|
fields:
|
||||||
|
first_name: Caleb
|
||||||
|
last_name: Alvarado
|
||||||
|
jersey_number: 12
|
||||||
|
- model: players.player
|
||||||
|
pk: 13
|
||||||
|
fields:
|
||||||
|
first_name: Atlas
|
||||||
|
last_name: Guerra
|
||||||
|
jersey_number: 13
|
||||||
|
- model: players.player
|
||||||
|
pk: 14
|
||||||
|
fields:
|
||||||
|
first_name: Swamuel
|
||||||
|
last_name: Mora
|
||||||
|
jersey_number: 14
|
||||||
37
players/migrations/0001_initial.py
Normal file
37
players/migrations/0001_initial.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 17:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Player',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('first_name', models.CharField(max_length=200)),
|
||||||
|
('last_name', models.CharField(max_length=200)),
|
||||||
|
('jersey_number', models.IntegerField()),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'unique_together': {('first_name', 'last_name')},
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Stat',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('batting_avg', models.DecimalField(decimal_places=3, default=0, max_digits=4)),
|
||||||
|
('onbase_pct', models.DecimalField(decimal_places=3, default=0, max_digits=4)),
|
||||||
|
('slugging_pct', models.DecimalField(decimal_places=3, default=0, max_digits=4)),
|
||||||
|
('player', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='players.player')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
17
players/migrations/0002_rename_stat_statline.py
Normal file
17
players/migrations/0002_rename_stat_statline.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 18:46
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('players', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameModel(
|
||||||
|
old_name='Stat',
|
||||||
|
new_name='StatLine',
|
||||||
|
),
|
||||||
|
]
|
||||||
0
players/migrations/__init__.py
Normal file
0
players/migrations/__init__.py
Normal file
30
players/models.py
Normal file
30
players/models.py
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Player(models.Model):
|
||||||
|
first_name = models.CharField(max_length=200)
|
||||||
|
last_name = models.CharField(max_length=200)
|
||||||
|
jersey_number = models.IntegerField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.last_name}, {self.first_name}"
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = ('first_name', 'last_name',)
|
||||||
|
|
||||||
|
class StatLine(models.Model):
|
||||||
|
player = models.ForeignKey(Player, on_delete=models.CASCADE)
|
||||||
|
batting_avg = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
||||||
|
onbase_pct = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
||||||
|
slugging_pct = models.DecimalField(max_digits=4, decimal_places=3, default=0)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.batting_avg}/{self.onbase_pct}/{self.slugging_pct}"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def slash_line(self):
|
||||||
|
return "/".join([
|
||||||
|
f"{self.batting_avg:.3f}".lstrip("0"),
|
||||||
|
f"{self.onbase_pct:.3f}".lstrip("0"),
|
||||||
|
f"{self.slugging_pct:.3f}".replace("0.",".")
|
||||||
|
]
|
||||||
|
)
|
||||||
8
players/urls.py
Normal file
8
players/urls.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
]
|
||||||
3
players/views.py
Normal file
3
players/views.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
||||||
0
teams/__init__.py
Normal file
0
teams/__init__.py
Normal file
5
teams/admin.py
Normal file
5
teams/admin.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import Team
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
admin.site.register(Team)
|
||||||
6
teams/apps.py
Normal file
6
teams/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class TeamsConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'teams'
|
||||||
96
teams/fixtures/sample_teams.yaml
Normal file
96
teams/fixtures/sample_teams.yaml
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
- model: teams.team
|
||||||
|
pk: 1
|
||||||
|
fields:
|
||||||
|
name: Chicago Firefighters
|
||||||
|
- model: teams.team
|
||||||
|
pk: 2
|
||||||
|
fields:
|
||||||
|
name: Boston Flowers
|
||||||
|
- model: teams.team
|
||||||
|
pk: 3
|
||||||
|
fields:
|
||||||
|
name: Philly Pies
|
||||||
|
- model: teams.team
|
||||||
|
pk: 4
|
||||||
|
fields:
|
||||||
|
name: Yellowstone Magic
|
||||||
|
- model: teams.team
|
||||||
|
pk: 5
|
||||||
|
fields:
|
||||||
|
name: Tokyo Lift
|
||||||
|
- model: teams.team
|
||||||
|
pk: 6
|
||||||
|
fields:
|
||||||
|
name: Unlimited Tacos
|
||||||
|
- model: teams.team
|
||||||
|
pk: 7
|
||||||
|
fields:
|
||||||
|
name: Dallas Steaks
|
||||||
|
- model: teams.team
|
||||||
|
pk: 8
|
||||||
|
fields:
|
||||||
|
name: Charleston Shoe Thieves
|
||||||
|
- model: teams.team
|
||||||
|
pk: 9
|
||||||
|
fields:
|
||||||
|
name: Hades Tigers
|
||||||
|
- model: teams.team
|
||||||
|
pk: 10
|
||||||
|
fields:
|
||||||
|
name: Hellmouth Sunbeams
|
||||||
|
- model: teams.team
|
||||||
|
pk: 11
|
||||||
|
fields:
|
||||||
|
name: San Francisco Lovers
|
||||||
|
- model: teams.team
|
||||||
|
pk: 12
|
||||||
|
fields:
|
||||||
|
name: Hawai'i Fridays
|
||||||
|
- model: teams.team
|
||||||
|
pk: 13
|
||||||
|
fields:
|
||||||
|
name: Breckenridge Jazz Hands
|
||||||
|
- model: teams.team
|
||||||
|
pk: 14
|
||||||
|
fields:
|
||||||
|
name: Houston Spies
|
||||||
|
- model: teams.team
|
||||||
|
pk: 15
|
||||||
|
fields:
|
||||||
|
name: New York Millennials
|
||||||
|
- model: teams.team
|
||||||
|
pk: 16
|
||||||
|
fields:
|
||||||
|
name: Kansas City Breath Mints
|
||||||
|
- model: teams.team
|
||||||
|
pk: 17
|
||||||
|
fields:
|
||||||
|
name: Mexico City Wild Wings
|
||||||
|
- model: teams.team
|
||||||
|
pk: 18
|
||||||
|
fields:
|
||||||
|
name: Miami Dale
|
||||||
|
- model: teams.team
|
||||||
|
pk: 19
|
||||||
|
fields:
|
||||||
|
name: Seattle Garages
|
||||||
|
- model: teams.team
|
||||||
|
pk: 20
|
||||||
|
fields:
|
||||||
|
name: Canada Moist Talkers
|
||||||
|
- model: teams.team
|
||||||
|
pk: 21
|
||||||
|
fields:
|
||||||
|
name: Atlantis Georgias
|
||||||
|
- model: teams.team
|
||||||
|
pk: 22
|
||||||
|
fields:
|
||||||
|
name: Ohio Worms
|
||||||
|
- model: teams.team
|
||||||
|
pk: 23
|
||||||
|
fields:
|
||||||
|
name: Core Mechanics
|
||||||
|
- model: teams.team
|
||||||
|
pk: 24
|
||||||
|
fields:
|
||||||
|
name: Baltimore Crabs
|
||||||
23
teams/migrations/0001_initial.py
Normal file
23
teams/migrations/0001_initial.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 17:43
|
||||||
|
|
||||||
|
import django.core.validators
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Team',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
('image', models.FileField(null=True, upload_to='images/', validators=[django.core.validators.FileExtensionValidator(['jpg', 'png', 'svg'])])),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
0
teams/migrations/__init__.py
Normal file
0
teams/migrations/__init__.py
Normal file
9
teams/models.py
Normal file
9
teams/models.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from django.db import models
|
||||||
|
from django.core.validators import FileExtensionValidator
|
||||||
|
|
||||||
|
class Team(models.Model):
|
||||||
|
name = models.CharField(max_length = 50)
|
||||||
|
image = models.FileField(upload_to='images/', validators=[FileExtensionValidator(['jpg', 'png', 'svg'])], null=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.name}"
|
||||||
13
teams/templates/teams/list.html
Normal file
13
teams/templates/teams/list.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{% load bootstrap5 %}
|
||||||
|
{% bootstrap_css %}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
|
||||||
|
<Title>Teams</Title>
|
||||||
|
<h1>Teams</h1>
|
||||||
|
<ol>
|
||||||
|
{% for team in teams %}
|
||||||
|
<li>
|
||||||
|
{{ team.name }}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
10
teams/urls.py
Normal file
10
teams/urls.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', views.root, name="root"),
|
||||||
|
path('list', views.list, name="teams_list")
|
||||||
|
]
|
||||||
9
teams/views.py
Normal file
9
teams/views.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from django.shortcuts import render, redirect
|
||||||
|
from .models import Team
|
||||||
|
|
||||||
|
def root(request):
|
||||||
|
return redirect('/teams/list')
|
||||||
|
|
||||||
|
def list(request):
|
||||||
|
teams = Team.objects.all()
|
||||||
|
return render(request, 'teams/list.html', {'teams': teams})
|
||||||
22
templates/base.html
Normal file
22
templates/base.html
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
{% load bootstrap5 %}
|
||||||
|
{% bootstrap_css %}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}Title{% endblock %}</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<nav class="navbar navbar-dark bg-dark">
|
||||||
|
<a class="navbar-brand h1" style="text-transform: uppercase" href="{% url 'home' %}">⚾️ Bench Coach</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div id="content" class="container">
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
17
templates/home.html
Normal file
17
templates/home.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
{% load bootstrap5 %}
|
||||||
|
{% bootstrap_css %}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Bench Coach</title>
|
||||||
|
</head>
|
||||||
|
<h1>Bench Coach</h1>
|
||||||
|
{% for page in pages %}
|
||||||
|
<li><a style="text-transform:capitalize;" href="{% url page %}">{{ page }} </a></li>
|
||||||
|
{% endfor %}
|
||||||
|
<body>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
14
templates/list.html
Normal file
14
templates/list.html
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block title %} {{ title }}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{{ title }}</h1>
|
||||||
|
<ol class="list-group">
|
||||||
|
{% for item in items %}
|
||||||
|
<li class="list-group-item">
|
||||||
|
{{ item }}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% endblock %}
|
||||||
73
templates/navbar.html
Normal file
73
templates/navbar.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
ul.dropdown-list {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.navbar-item {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
li a, .dropbtn {
|
||||||
|
display: inline-block;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
padding: 14px 16px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
li a:hover, .dropdown:hover .dropbtn {
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
li.dropdown {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-content {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
min-width: 160px;
|
||||||
|
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-content a {
|
||||||
|
color: black;
|
||||||
|
padding: 12px 16px;
|
||||||
|
text-decoration: none;
|
||||||
|
display: block;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-content a:hover {background-color: #f1f1f1;}
|
||||||
|
|
||||||
|
.dropdown:hover .dropdown-content {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<ul class="dropdown-list">
|
||||||
|
<li class="navbar-item"><a href="#home">Home</a></li>
|
||||||
|
<li class="dropdown">
|
||||||
|
<a href="javascript:void(0)" class="dropbtn">Dropdown</a>
|
||||||
|
<div class="dropdown-content">
|
||||||
|
{% for event in events %}
|
||||||
|
<a href="{% url 'players' year=event.date.year month=event.date.month day=event.date.day %}">{{ event.date }} </a>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li style="float:right">⚾️</li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
0
venues/__init__.py
Normal file
0
venues/__init__.py
Normal file
5
venues/admin.py
Normal file
5
venues/admin.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import Venue
|
||||||
|
|
||||||
|
# Register your models here.
|
||||||
|
admin.site.register(Venue)
|
||||||
6
venues/apps.py
Normal file
6
venues/apps.py
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class VenuesConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'venues'
|
||||||
100
venues/fixtures/sample_venues.yaml
Normal file
100
venues/fixtures/sample_venues.yaml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
- model: venues.venue
|
||||||
|
pk: 1
|
||||||
|
fields:
|
||||||
|
name: Chesapeake Racetrack and Ballpark
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 2
|
||||||
|
fields:
|
||||||
|
name: Tokyo Fitness Center
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 3
|
||||||
|
fields:
|
||||||
|
name: Breckenridge Community Field
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 4
|
||||||
|
fields:
|
||||||
|
name: The Fire Safety Awareness Center
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 5
|
||||||
|
fields:
|
||||||
|
name: Sixth Circle Stadium
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 6
|
||||||
|
fields:
|
||||||
|
name: Basin of Mexico Park
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 7
|
||||||
|
fields:
|
||||||
|
name: The Atlantean Dome
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 8
|
||||||
|
fields:
|
||||||
|
name: Al Pastor Memorial Park
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 9
|
||||||
|
fields:
|
||||||
|
name: Miami International Arena
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 10
|
||||||
|
fields:
|
||||||
|
name: Boston Garden
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 11
|
||||||
|
fields:
|
||||||
|
name: Lower Moab Scenic Overlook Field
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 12
|
||||||
|
fields:
|
||||||
|
name: An Undisclosed Location
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 13
|
||||||
|
fields:
|
||||||
|
name: Wapakoneta Air, Space and Worm Museum and Ballpark
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 14
|
||||||
|
fields:
|
||||||
|
name: New York, New York Arena, Arena
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 15
|
||||||
|
fields:
|
||||||
|
name: George Fourman Stadium
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 16
|
||||||
|
fields:
|
||||||
|
name: San Franstadium
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 17
|
||||||
|
fields:
|
||||||
|
name: Tastycake Stadium
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 18
|
||||||
|
fields:
|
||||||
|
name: The Hotdogfingers Memorial Climate Pledge Garage and Parking Facility
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 19
|
||||||
|
fields:
|
||||||
|
name: Core Pillar Center
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 20
|
||||||
|
fields:
|
||||||
|
name: Hawai'i Viberight Field
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 21
|
||||||
|
fields:
|
||||||
|
name: Gleek Arena
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 22
|
||||||
|
fields:
|
||||||
|
name: Choux Stadium
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 23
|
||||||
|
fields:
|
||||||
|
name: Yellowstone National (Ball)Park
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 24
|
||||||
|
fields:
|
||||||
|
name: Kansas City FreshDome
|
||||||
|
- model: venues.venue
|
||||||
|
pk: 25
|
||||||
|
fields:
|
||||||
|
name: ILB Historical Preservation Site
|
||||||
21
venues/migrations/0001_initial.py
Normal file
21
venues/migrations/0001_initial.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Generated by Django 3.2.6 on 2021-11-07 17:43
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Venue',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
0
venues/migrations/__init__.py
Normal file
0
venues/migrations/__init__.py
Normal file
7
venues/models.py
Normal file
7
venues/models.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from django.db import models
|
||||||
|
|
||||||
|
class Venue(models.Model):
|
||||||
|
name = models.CharField(max_length = 50)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.name}"
|
||||||
13
venues/templates/venues/list.html
Normal file
13
venues/templates/venues/list.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
{% load bootstrap5 %}
|
||||||
|
{% bootstrap_css %}
|
||||||
|
{% bootstrap_javascript %}
|
||||||
|
|
||||||
|
<Title>Venues</Title>
|
||||||
|
<h1>Venues</h1>
|
||||||
|
<ol>
|
||||||
|
{% for venue in venues %}
|
||||||
|
<li>
|
||||||
|
{{ venue.name }}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
8
venues/urls.py
Normal file
8
venues/urls.py
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import path, include
|
||||||
|
from . import views
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', views.root, name="root"),
|
||||||
|
path('list', views.list, name="venues_list")
|
||||||
|
]
|
||||||
9
venues/views.py
Normal file
9
venues/views.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from django.shortcuts import render, redirect
|
||||||
|
from .models import Venue
|
||||||
|
|
||||||
|
def root(request):
|
||||||
|
return redirect('/venues/list')
|
||||||
|
|
||||||
|
def list(request):
|
||||||
|
venues = Venue.objects.all()
|
||||||
|
return render(request, 'venues/list.html', {'venues': venues})
|
||||||
Reference in New Issue
Block a user