From 0f5c7d27e641479518b38b3968ec62efc9605d7e Mon Sep 17 00:00:00 2001 From: Tony Date: Sun, 7 Nov 2021 14:05:07 -0600 Subject: [PATCH] initial commit. displays simple hierarchy and lists of models. includes fixtures for initial data. --- .gitignore | 92 +++++++ benchcoach/__init__.py | 0 benchcoach/asgi.py | 16 ++ benchcoach/settings.py | 135 ++++++++++ benchcoach/urls.py | 29 +++ benchcoach/views.py | 6 + benchcoach/wsgi.py | 16 ++ events/__init__.py | 0 events/admin.py | 7 + events/apps.py | 6 + events/fixtures/sample_events.yaml | 245 ++++++++++++++++++ events/migrations/0001_initial.py | 60 +++++ .../0002_alter_availability_options.py | 17 ++ events/migrations/__init__.py | 0 events/models.py | 56 ++++ events/templates/events/schedule.html | 15 ++ events/urls.py | 10 + events/views.py | 9 + identifier.sqlite | Bin 0 -> 20480 bytes manage.py | 22 ++ players/__init__.py | 0 players/admin.py | 6 + players/apps.py | 6 + players/fixtures/sample_players.yaml | 84 ++++++ players/migrations/0001_initial.py | 37 +++ .../migrations/0002_rename_stat_statline.py | 17 ++ players/migrations/__init__.py | 0 players/models.py | 30 +++ players/urls.py | 8 + players/views.py | 3 + teams/__init__.py | 0 teams/admin.py | 5 + teams/apps.py | 6 + teams/fixtures/sample_teams.yaml | 96 +++++++ teams/migrations/0001_initial.py | 23 ++ teams/migrations/__init__.py | 0 teams/models.py | 9 + teams/templates/teams/list.html | 13 + teams/urls.py | 10 + teams/views.py | 9 + templates/base.html | 22 ++ templates/home.html | 17 ++ templates/list.html | 14 + templates/navbar.html | 73 ++++++ venues/__init__.py | 0 venues/admin.py | 5 + venues/apps.py | 6 + venues/fixtures/sample_venues.yaml | 100 +++++++ venues/migrations/0001_initial.py | 21 ++ venues/migrations/__init__.py | 0 venues/models.py | 7 + venues/templates/venues/list.html | 13 + venues/urls.py | 8 + venues/views.py | 9 + 54 files changed, 1398 insertions(+) create mode 100644 .gitignore create mode 100644 benchcoach/__init__.py create mode 100644 benchcoach/asgi.py create mode 100644 benchcoach/settings.py create mode 100644 benchcoach/urls.py create mode 100644 benchcoach/views.py create mode 100644 benchcoach/wsgi.py create mode 100644 events/__init__.py create mode 100644 events/admin.py create mode 100644 events/apps.py create mode 100644 events/fixtures/sample_events.yaml create mode 100644 events/migrations/0001_initial.py create mode 100644 events/migrations/0002_alter_availability_options.py create mode 100644 events/migrations/__init__.py create mode 100644 events/models.py create mode 100644 events/templates/events/schedule.html create mode 100644 events/urls.py create mode 100644 events/views.py create mode 100644 identifier.sqlite create mode 100755 manage.py create mode 100644 players/__init__.py create mode 100644 players/admin.py create mode 100644 players/apps.py create mode 100644 players/fixtures/sample_players.yaml create mode 100644 players/migrations/0001_initial.py create mode 100644 players/migrations/0002_rename_stat_statline.py create mode 100644 players/migrations/__init__.py create mode 100644 players/models.py create mode 100644 players/urls.py create mode 100644 players/views.py create mode 100644 teams/__init__.py create mode 100644 teams/admin.py create mode 100644 teams/apps.py create mode 100644 teams/fixtures/sample_teams.yaml create mode 100644 teams/migrations/0001_initial.py create mode 100644 teams/migrations/__init__.py create mode 100644 teams/models.py create mode 100644 teams/templates/teams/list.html create mode 100644 teams/urls.py create mode 100644 teams/views.py create mode 100644 templates/base.html create mode 100644 templates/home.html create mode 100644 templates/list.html create mode 100644 templates/navbar.html create mode 100644 venues/__init__.py create mode 100644 venues/admin.py create mode 100644 venues/apps.py create mode 100644 venues/fixtures/sample_venues.yaml create mode 100644 venues/migrations/0001_initial.py create mode 100644 venues/migrations/__init__.py create mode 100644 venues/models.py create mode 100644 venues/templates/venues/list.html create mode 100644 venues/urls.py create mode 100644 venues/views.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3b614d0 --- /dev/null +++ b/.gitignore @@ -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 diff --git a/benchcoach/__init__.py b/benchcoach/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/benchcoach/asgi.py b/benchcoach/asgi.py new file mode 100644 index 0000000..9950c37 --- /dev/null +++ b/benchcoach/asgi.py @@ -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() diff --git a/benchcoach/settings.py b/benchcoach/settings.py new file mode 100644 index 0000000..53fadec --- /dev/null +++ b/benchcoach/settings.py @@ -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') \ No newline at end of file diff --git a/benchcoach/urls.py b/benchcoach/urls.py new file mode 100644 index 0000000..58913e5 --- /dev/null +++ b/benchcoach/urls.py @@ -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) diff --git a/benchcoach/views.py b/benchcoach/views.py new file mode 100644 index 0000000..b818835 --- /dev/null +++ b/benchcoach/views.py @@ -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}) \ No newline at end of file diff --git a/benchcoach/wsgi.py b/benchcoach/wsgi.py new file mode 100644 index 0000000..125e95f --- /dev/null +++ b/benchcoach/wsgi.py @@ -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() diff --git a/events/__init__.py b/events/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/events/admin.py b/events/admin.py new file mode 100644 index 0000000..9a254b5 --- /dev/null +++ b/events/admin.py @@ -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) diff --git a/events/apps.py b/events/apps.py new file mode 100644 index 0000000..20f48f2 --- /dev/null +++ b/events/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class EventsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'events' diff --git a/events/fixtures/sample_events.yaml b/events/fixtures/sample_events.yaml new file mode 100644 index 0000000..b13be0a --- /dev/null +++ b/events/fixtures/sample_events.yaml @@ -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' \ No newline at end of file diff --git a/events/migrations/0001_initial.py b/events/migrations/0001_initial.py new file mode 100644 index 0000000..80327a5 --- /dev/null +++ b/events/migrations/0001_initial.py @@ -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')}, + }, + ), + ] diff --git a/events/migrations/0002_alter_availability_options.py b/events/migrations/0002_alter_availability_options.py new file mode 100644 index 0000000..8c420d4 --- /dev/null +++ b/events/migrations/0002_alter_availability_options.py @@ -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'}, + ), + ] diff --git a/events/migrations/__init__.py b/events/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/events/models.py b/events/models.py new file mode 100644 index 0000000..858d5e0 --- /dev/null +++ b/events/models.py @@ -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) \ No newline at end of file diff --git a/events/templates/events/schedule.html b/events/templates/events/schedule.html new file mode 100644 index 0000000..b4cbd40 --- /dev/null +++ b/events/templates/events/schedule.html @@ -0,0 +1,15 @@ +{% load bootstrap5 %} +{% bootstrap_css %} +{% bootstrap_javascript %} + +Schedule +

Schedule

+
    +{% for event in events %} +
  1. + {{ event.away_team.name }} vs. {{ event.home_team.name }}
    + {{ event.start|date:"l, F j, Y g:i A" }}
    + {{ event.venue.name }} +
  2. +{% endfor %} +
\ No newline at end of file diff --git a/events/urls.py b/events/urls.py new file mode 100644 index 0000000..972687c --- /dev/null +++ b/events/urls.py @@ -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") +] \ No newline at end of file diff --git a/events/views.py b/events/views.py new file mode 100644 index 0000000..82ee6d1 --- /dev/null +++ b/events/views.py @@ -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}) \ No newline at end of file diff --git a/identifier.sqlite b/identifier.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..c29549aaa83f5fc397bcba8988b90ab00494ef2c GIT binary patch literal 20480 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 +

Teams

+
    +{% for team in teams %} +
  1. + {{ team.name }} +
  2. +{% endfor %} +
\ No newline at end of file diff --git a/teams/urls.py b/teams/urls.py new file mode 100644 index 0000000..70b6cd6 --- /dev/null +++ b/teams/urls.py @@ -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") +] \ No newline at end of file diff --git a/teams/views.py b/teams/views.py new file mode 100644 index 0000000..9714407 --- /dev/null +++ b/teams/views.py @@ -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}) \ No newline at end of file diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..6544092 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,22 @@ + + +{% load bootstrap5 %} +{% bootstrap_css %} +{% bootstrap_javascript %} + + + {% block title %}Title{% endblock %} + + + + + + +
+ {% block content %}{% endblock %} +
+ + + \ No newline at end of file diff --git a/templates/home.html b/templates/home.html new file mode 100644 index 0000000..e58fc35 --- /dev/null +++ b/templates/home.html @@ -0,0 +1,17 @@ + + + + {% load bootstrap5 %} +{% bootstrap_css %} +{% bootstrap_javascript %} + + Bench Coach + +

Bench Coach

+{% for page in pages %} +
  • {{ page }}
  • +{% endfor %} + + + + \ No newline at end of file diff --git a/templates/list.html b/templates/list.html new file mode 100644 index 0000000..d1f7a4f --- /dev/null +++ b/templates/list.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block title %} {{ title }}{% endblock %} + +{% block content %} + +

    {{ title }}

    +
      +{% for item in items %} +
    1. + {{ item }} +
    2. +{% endfor %} +
    +{% endblock %} \ No newline at end of file diff --git a/templates/navbar.html b/templates/navbar.html new file mode 100644 index 0000000..c7f6cbe --- /dev/null +++ b/templates/navbar.html @@ -0,0 +1,73 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/venues/__init__.py b/venues/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venues/admin.py b/venues/admin.py new file mode 100644 index 0000000..eed5091 --- /dev/null +++ b/venues/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Venue + +# Register your models here. +admin.site.register(Venue) \ No newline at end of file diff --git a/venues/apps.py b/venues/apps.py new file mode 100644 index 0000000..2bb5172 --- /dev/null +++ b/venues/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class VenuesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'venues' diff --git a/venues/fixtures/sample_venues.yaml b/venues/fixtures/sample_venues.yaml new file mode 100644 index 0000000..0d38ba2 --- /dev/null +++ b/venues/fixtures/sample_venues.yaml @@ -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 \ No newline at end of file diff --git a/venues/migrations/0001_initial.py b/venues/migrations/0001_initial.py new file mode 100644 index 0000000..a5551d0 --- /dev/null +++ b/venues/migrations/0001_initial.py @@ -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)), + ], + ), + ] diff --git a/venues/migrations/__init__.py b/venues/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venues/models.py b/venues/models.py new file mode 100644 index 0000000..44947f7 --- /dev/null +++ b/venues/models.py @@ -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}" diff --git a/venues/templates/venues/list.html b/venues/templates/venues/list.html new file mode 100644 index 0000000..3a1a3d7 --- /dev/null +++ b/venues/templates/venues/list.html @@ -0,0 +1,13 @@ +{% load bootstrap5 %} +{% bootstrap_css %} +{% bootstrap_javascript %} + +Venues +

    Venues

    +
      +{% for venue in venues %} +
    1. + {{ venue.name }} +
    2. +{% endfor %} +
    \ No newline at end of file diff --git a/venues/urls.py b/venues/urls.py new file mode 100644 index 0000000..9b0517b --- /dev/null +++ b/venues/urls.py @@ -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") +] \ No newline at end of file diff --git a/venues/views.py b/venues/views.py new file mode 100644 index 0000000..34d5f97 --- /dev/null +++ b/venues/views.py @@ -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}) \ No newline at end of file