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 0000000..c29549a Binary files /dev/null and b/identifier.sqlite differ diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..c98e76c --- /dev/null +++ b/manage.py @@ -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() diff --git a/players/__init__.py b/players/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/players/admin.py b/players/admin.py new file mode 100644 index 0000000..6121caa --- /dev/null +++ b/players/admin.py @@ -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) \ No newline at end of file diff --git a/players/apps.py b/players/apps.py new file mode 100644 index 0000000..86c66f5 --- /dev/null +++ b/players/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PlayersConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'players' diff --git a/players/fixtures/sample_players.yaml b/players/fixtures/sample_players.yaml new file mode 100644 index 0000000..02e2138 --- /dev/null +++ b/players/fixtures/sample_players.yaml @@ -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 \ No newline at end of file diff --git a/players/migrations/0001_initial.py b/players/migrations/0001_initial.py new file mode 100644 index 0000000..ed5db21 --- /dev/null +++ b/players/migrations/0001_initial.py @@ -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')), + ], + ), + ] diff --git a/players/migrations/0002_rename_stat_statline.py b/players/migrations/0002_rename_stat_statline.py new file mode 100644 index 0000000..9acfdd5 --- /dev/null +++ b/players/migrations/0002_rename_stat_statline.py @@ -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', + ), + ] diff --git a/players/migrations/__init__.py b/players/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/players/models.py b/players/models.py new file mode 100644 index 0000000..7f9da7d --- /dev/null +++ b/players/models.py @@ -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.",".") + ] + ) \ No newline at end of file diff --git a/players/urls.py b/players/urls.py new file mode 100644 index 0000000..dc2ca1f --- /dev/null +++ b/players/urls.py @@ -0,0 +1,8 @@ +from django.contrib import admin + +from django.urls import path, include + +from . import views + +urlpatterns = [ +] \ No newline at end of file diff --git a/players/views.py b/players/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/players/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/teams/__init__.py b/teams/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/teams/admin.py b/teams/admin.py new file mode 100644 index 0000000..88b36a4 --- /dev/null +++ b/teams/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Team + +# Register your models here. +admin.site.register(Team) \ No newline at end of file diff --git a/teams/apps.py b/teams/apps.py new file mode 100644 index 0000000..274d77f --- /dev/null +++ b/teams/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TeamsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'teams' diff --git a/teams/fixtures/sample_teams.yaml b/teams/fixtures/sample_teams.yaml new file mode 100644 index 0000000..1e51381 --- /dev/null +++ b/teams/fixtures/sample_teams.yaml @@ -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 \ No newline at end of file diff --git a/teams/migrations/0001_initial.py b/teams/migrations/0001_initial.py new file mode 100644 index 0000000..5159e43 --- /dev/null +++ b/teams/migrations/0001_initial.py @@ -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'])])), + ], + ), + ] diff --git a/teams/migrations/__init__.py b/teams/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/teams/models.py b/teams/models.py new file mode 100644 index 0000000..781c55c --- /dev/null +++ b/teams/models.py @@ -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}" \ No newline at end of file diff --git a/teams/templates/teams/list.html b/teams/templates/teams/list.html new file mode 100644 index 0000000..554d9df --- /dev/null +++ b/teams/templates/teams/list.html @@ -0,0 +1,13 @@ +{% load bootstrap5 %} +{% bootstrap_css %} +{% bootstrap_javascript %} + +Teams +

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