From 785c2c7916533ecb5eedee165ab01047096e3f87 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:36:04 -0400 Subject: [PATCH 001/104] leagues initial commit --- leagues/__init__.py | 0 leagues/admin.py | 3 + leagues/apps.py | 5 ++ leagues/migrations/__init__.py | 0 leagues/models.py | 89 ++++++++++++++++++++ leagues/tests.py | 3 + leagues/views.py | 3 + project-templates/leagues/league_detail.html | 0 project-templates/leagues/league_rules.html | 0 project-templates/leagues/league_teams.html | 0 project-templates/leagues/leagues_list.html | 0 11 files changed, 103 insertions(+) create mode 100644 leagues/__init__.py create mode 100644 leagues/admin.py create mode 100644 leagues/apps.py create mode 100644 leagues/migrations/__init__.py create mode 100644 leagues/models.py create mode 100644 leagues/tests.py create mode 100644 leagues/views.py create mode 100644 project-templates/leagues/league_detail.html create mode 100644 project-templates/leagues/league_rules.html create mode 100644 project-templates/leagues/league_teams.html create mode 100644 project-templates/leagues/leagues_list.html diff --git a/leagues/__init__.py b/leagues/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/leagues/admin.py b/leagues/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/leagues/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/leagues/apps.py b/leagues/apps.py new file mode 100644 index 000000000..4abf4fa9d --- /dev/null +++ b/leagues/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class LeaguesConfig(AppConfig): + name = 'leagues' diff --git a/leagues/migrations/__init__.py b/leagues/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/leagues/models.py b/leagues/models.py new file mode 100644 index 000000000..d9c6cdcfd --- /dev/null +++ b/leagues/models.py @@ -0,0 +1,89 @@ +from django.db import models +from teams.models import Team +from matches.models import Match, GameChoice, PlatformChoice, MapPoolChoice, MapChoice, SportChoice +from matches.settings import TEAMFORMAT_CHOICES, MAPFORMAT_CHOICES + + +class LeagueSettings(models.Model): + name = models.CharField(default='League Ruleset', max_length=50) + # whether or not to keep track of Overtime Losses in a separate column + ot_losses = models.BooleanField(default=True) + # amount of points to award a team for an overtime loss + pts_ot_loss = models.PositiveSmallIntegerField(default=1) + # whether or not to keep track of Overtime wins in a separate column + ot_wins = models.BooleanField(default=False) + pts_ot_win = models.PositiveSmallIntegerField(default=3) + # amount of points to award teams for a win + pts_win = models.PositiveSmallIntegerField(default=3) + pts_loss = models.PositiveSmallIntegerField(default=0) + + # whether or not to allow tie + allow_tie = models.BooleanField(default=False) + # number of games each team plays during the regular season + num_games = models.PositiveIntegerField(default=10) + # automatically schedule games. TODO - implement auto schedule + auto_schedule = models.BooleanField(default=False) + # W=Win, L=Loss, OTL=Overtime Loss, T=Tie, OTW=Overtime Win, OTT=Overtime Tie + RECORD_FORMAT_CHOICES = ( + (1, "W-L-OTL"), + (2, "W-L-T"), + (3, "W-L-OTW-OTL"), + (4, "W-L-OTW-OTL-OTT"), + ) + # record format to show on front end + record_format = models.CharField(choices=RECORD_FORMAT_CHOICES, default="W-L-OTL", max_length=20) + # number of divisions to break teams into + num_divisons = models.PositiveSmallIntegerField(default=2) + # max amount of teams to allow into a division + max_division_size = models.PositiveSmallIntegerField(default=5) + + +class LeagueTeam(models.Model): + team = models.ForeignKey(Team, related_name='league_team', on_delete=models.PROTECT) + wins = models.PositiveSmallIntegerField(default=0) + losses = models.PositiveSmallIntegerField(default=0) + ot_losses = models.PositiveSmallIntegerField(default=0) + ot_wins = models.PositiveSmallIntegerField(default=0) + ties = models.PositiveSmallIntegerField(default=0) + + +class LeagueDivision(models.Model): + # name for the league division - set to null in case admins wish to manually change it + name = models.CharField(null=True, max_length=50) + # teams that are in that division, allow it to be empty + teams = models.ManyToManyField(LeagueTeam, blank=True) + # games that are to be played and have been played in that division, blank until all matches are generated + games = models.ManyToManyField(Match, blank=True) + + +class League(models.Model): + name = models.CharField(default="League Name", max_length=50) + rules = models.ForeignKey(LeagueSettings, related_name="league_rules", on_delete=models.PROTECT) + # if set to true the league will display on the front page, false and it will not + active = models.BooleanField(default=False) + info = models.TextField(default="No information provided") + # TODO - remove this, going to be redundant + all_teams = models.ManyToManyField(LeagueTeam, blank=True) + created = models.DateTimeField(auto_now_add=True) + updated = models.DateTimeField(auto_now=True) + divisions = models.ManyToManyField(LeagueDivision, blank=True) + platform = models.ForeignKey(PlatformChoice, related_name='league_platform', on_delete=models.PROTECT, null=True) + game = models.ForeignKey(GameChoice, related_name='league_game', on_delete=models.PROTECT, null=True) + sport = models.ForeignKey(SportChoice, related_name='league_sport', on_delete=models.PROTECT, null=True) + image = models.ImageField(upload_to='league_images', blank=True) + # team format, ex 1v1, 2v2, 3v3, 4v4, 5v5, 6v6 + teamformat = models.SmallIntegerField(choices=TEAMFORMAT_CHOICES, default=1) + # by default its a best of 1. Not sure if we need this here. Finals might be best of 3, etc in + # the future possibly. TBD. For now this will work though. + bestof = models.SmallIntegerField(choices=MAPFORMAT_CHOICES, default=0) + # manually open registration even if outside registration window + allow_register = models.BooleanField(default=False) + # when does registration open, and when does it close? specified when created in staff panel + open_register = models.DateTimeField() + # dont allow people to join once registration is closed + close_register = models.DateTimeField() + # when is the league going to start? + start = models.DateTimeField() + + + diff --git a/leagues/tests.py b/leagues/tests.py new file mode 100644 index 000000000..7ce503c2d --- /dev/null +++ b/leagues/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/leagues/views.py b/leagues/views.py new file mode 100644 index 000000000..91ea44a21 --- /dev/null +++ b/leagues/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/project-templates/leagues/league_detail.html b/project-templates/leagues/league_detail.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/leagues/league_rules.html b/project-templates/leagues/league_rules.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/leagues/league_teams.html b/project-templates/leagues/league_teams.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/leagues/leagues_list.html b/project-templates/leagues/leagues_list.html new file mode 100644 index 000000000..e69de29bb From 4966bb4773912b5cbe777f8bc94f7f900d33319d Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:47:38 -0400 Subject: [PATCH 002/104] minor changes in league models --- leagues/models.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/leagues/models.py b/leagues/models.py index d9c6cdcfd..d370b3878 100644 --- a/leagues/models.py +++ b/leagues/models.py @@ -2,8 +2,10 @@ from teams.models import Team from matches.models import Match, GameChoice, PlatformChoice, MapPoolChoice, MapChoice, SportChoice from matches.settings import TEAMFORMAT_CHOICES, MAPFORMAT_CHOICES +from singletournaments.models import SingleTournamentRuleset +# a way to create default values for a field over multiple seasons class LeagueSettings(models.Model): name = models.CharField(default='League Ruleset', max_length=50) # whether or not to keep track of Overtime Losses in a separate column @@ -16,7 +18,6 @@ class LeagueSettings(models.Model): # amount of points to award teams for a win pts_win = models.PositiveSmallIntegerField(default=3) pts_loss = models.PositiveSmallIntegerField(default=0) - # whether or not to allow tie allow_tie = models.BooleanField(default=False) # number of games each team plays during the regular season @@ -29,6 +30,7 @@ class LeagueSettings(models.Model): (2, "W-L-T"), (3, "W-L-OTW-OTL"), (4, "W-L-OTW-OTL-OTT"), + (5, "W-L"), ) # record format to show on front end record_format = models.CharField(choices=RECORD_FORMAT_CHOICES, default="W-L-OTL", max_length=20) @@ -58,12 +60,11 @@ class LeagueDivision(models.Model): class League(models.Model): name = models.CharField(default="League Name", max_length=50) - rules = models.ForeignKey(LeagueSettings, related_name="league_rules", on_delete=models.PROTECT) + settings = models.ForeignKey(LeagueSettings, related_name="league_settings", on_delete=models.PROTECT) + ruleset = models.ForeignKey(SingleTournamentRuleset, related_name="league_ruleset", on_delete=models.PROTECT) # if set to true the league will display on the front page, false and it will not active = models.BooleanField(default=False) info = models.TextField(default="No information provided") - # TODO - remove this, going to be redundant - all_teams = models.ManyToManyField(LeagueTeam, blank=True) created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) divisions = models.ManyToManyField(LeagueDivision, blank=True) From 1c9530d072ac0da9a3e25be83b5faf7d27eccc31 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:48:48 -0400 Subject: [PATCH 003/104] add leagues to installed apps --- olly/base_settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/olly/base_settings.py b/olly/base_settings.py index 33cf456f6..4330120df 100644 --- a/olly/base_settings.py +++ b/olly/base_settings.py @@ -63,6 +63,8 @@ # wagers 'wagers', + 'leagues', + # ip package 'ipware', From 1b4fb54b7c6ec972871ee03a4eef8fb895bc8dff Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:48:54 -0400 Subject: [PATCH 004/104] leagues initial migration --- leagues/migrations/0001_initial.py | 82 ++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 leagues/migrations/0001_initial.py diff --git a/leagues/migrations/0001_initial.py b/leagues/migrations/0001_initial.py new file mode 100644 index 000000000..3fe93b481 --- /dev/null +++ b/leagues/migrations/0001_initial.py @@ -0,0 +1,82 @@ +# Generated by Django 2.2.12 on 2020-05-16 00:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('matches', '0022_auto_20200410_1506'), + ('teams', '0008_team_image'), + ('singletournaments', '0021_auto_20200420_0007'), + ] + + operations = [ + migrations.CreateModel( + name='LeagueSettings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='League Ruleset', max_length=50)), + ('ot_losses', models.BooleanField(default=True)), + ('pts_ot_loss', models.PositiveSmallIntegerField(default=1)), + ('ot_wins', models.BooleanField(default=False)), + ('pts_ot_win', models.PositiveSmallIntegerField(default=3)), + ('pts_win', models.PositiveSmallIntegerField(default=3)), + ('pts_loss', models.PositiveSmallIntegerField(default=0)), + ('allow_tie', models.BooleanField(default=False)), + ('num_games', models.PositiveIntegerField(default=10)), + ('auto_schedule', models.BooleanField(default=False)), + ('record_format', models.CharField(choices=[(1, 'W-L-OTL'), (2, 'W-L-T'), (3, 'W-L-OTW-OTL'), (4, 'W-L-OTW-OTL-OTT'), (5, 'W-L')], default='W-L-OTL', max_length=20)), + ('num_divisons', models.PositiveSmallIntegerField(default=2)), + ('max_division_size', models.PositiveSmallIntegerField(default=5)), + ], + ), + migrations.CreateModel( + name='LeagueTeam', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('wins', models.PositiveSmallIntegerField(default=0)), + ('losses', models.PositiveSmallIntegerField(default=0)), + ('ot_losses', models.PositiveSmallIntegerField(default=0)), + ('ot_wins', models.PositiveSmallIntegerField(default=0)), + ('ties', models.PositiveSmallIntegerField(default=0)), + ('team', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='league_team', to='teams.Team')), + ], + ), + migrations.CreateModel( + name='LeagueDivision', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, null=True)), + ('games', models.ManyToManyField(blank=True, to='matches.Match')), + ('teams', models.ManyToManyField(blank=True, to='leagues.LeagueTeam')), + ], + ), + migrations.CreateModel( + name='League', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(default='League Name', max_length=50)), + ('active', models.BooleanField(default=False)), + ('info', models.TextField(default='No information provided')), + ('created', models.DateTimeField(auto_now_add=True)), + ('updated', models.DateTimeField(auto_now=True)), + ('image', models.ImageField(blank=True, upload_to='league_images')), + ('teamformat', models.SmallIntegerField(choices=[(0, '1v1'), (1, '2v2'), (2, '3v3'), (3, '4v4'), (4, '5v5'), (5, '6v6')], default=1)), + ('bestof', models.SmallIntegerField(choices=[(0, 'Best of 1'), (1, 'Best of 3'), (2, 'Best of 5'), (3, 'Best of 7'), (4, 'Best of 9')], default=0)), + ('allow_register', models.BooleanField(default=False)), + ('open_register', models.DateTimeField()), + ('close_register', models.DateTimeField()), + ('start', models.DateTimeField()), + ('divisions', models.ManyToManyField(blank=True, to='leagues.LeagueDivision')), + ('game', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='league_game', to='matches.GameChoice')), + ('platform', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='league_platform', to='matches.PlatformChoice')), + ('ruleset', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='league_ruleset', to='singletournaments.SingleTournamentRuleset')), + ('settings', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='league_settings', to='leagues.LeagueSettings')), + ('sport', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='league_sport', to='matches.SportChoice')), + ], + ), + ] From 9b52291ba2088cb3ba7a4dacd3619c1f510e0ef4 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:51:59 -0400 Subject: [PATCH 005/104] league staff templates --- project-templates/staff/leagues/league_create.html | 0 project-templates/staff/leagues/league_detail.html | 0 project-templates/staff/leagues/league_edit.html | 0 project-templates/staff/leagues/league_list.html | 0 project-templates/staff/leagues/league_settings_create.html | 0 project-templates/staff/leagues/league_settings_detail.html | 0 project-templates/staff/leagues/league_settings_edit.html | 0 project-templates/staff/leagues/league_settings_list.html | 0 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 project-templates/staff/leagues/league_create.html create mode 100644 project-templates/staff/leagues/league_detail.html create mode 100644 project-templates/staff/leagues/league_edit.html create mode 100644 project-templates/staff/leagues/league_list.html create mode 100644 project-templates/staff/leagues/league_settings_create.html create mode 100644 project-templates/staff/leagues/league_settings_detail.html create mode 100644 project-templates/staff/leagues/league_settings_edit.html create mode 100644 project-templates/staff/leagues/league_settings_list.html diff --git a/project-templates/staff/leagues/league_create.html b/project-templates/staff/leagues/league_create.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_detail.html b/project-templates/staff/leagues/league_detail.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_edit.html b/project-templates/staff/leagues/league_edit.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_list.html b/project-templates/staff/leagues/league_list.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_settings_create.html b/project-templates/staff/leagues/league_settings_create.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_settings_detail.html b/project-templates/staff/leagues/league_settings_detail.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_settings_edit.html b/project-templates/staff/leagues/league_settings_edit.html new file mode 100644 index 000000000..e69de29bb diff --git a/project-templates/staff/leagues/league_settings_list.html b/project-templates/staff/leagues/league_settings_list.html new file mode 100644 index 000000000..e69de29bb From f2509e660978f79800ea6071cd557d89a50002f4 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:52:11 -0400 Subject: [PATCH 006/104] add create league form and create league settings form --- staff/forms.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/staff/forms.py b/staff/forms.py index 2406d82ab..0ac933d0f 100644 --- a/staff/forms.py +++ b/staff/forms.py @@ -10,6 +10,7 @@ from store.models import Product from support.models import TicketComment, Ticket, TicketCategory, QuestionAnswerCategory, QuestionAnswer from teams.models import Team, TeamInvite +from leagues.models import League, LeagueDivision, LeagueSettings, LeagueTeam class StaticInfoForm(forms.ModelForm): @@ -299,3 +300,16 @@ class CreateSlide(forms.ModelForm): class Meta: model = FrontPageSlide fields = '__all__' + + +class CreateLeagueForm(forms.ModelForm): + class Meta: + model = League + fields = '__all__' + + +class CreateLeagueSettingsForm(forms.ModelForm): + class Meta: + model = LeagueSettings + fields = '__all__' + From 340b4c26e48df0d1e71d7c14ff1bb6e28608a3e5 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 20:55:47 -0400 Subject: [PATCH 007/104] add maps field to league --- leagues/migrations/0002_league_maps.py | 20 ++++++++++++++++++++ leagues/models.py | 1 + 2 files changed, 21 insertions(+) create mode 100644 leagues/migrations/0002_league_maps.py diff --git a/leagues/migrations/0002_league_maps.py b/leagues/migrations/0002_league_maps.py new file mode 100644 index 000000000..5d0a053f5 --- /dev/null +++ b/leagues/migrations/0002_league_maps.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.12 on 2020-05-16 00:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('matches', '0022_auto_20200410_1506'), + ('leagues', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='league', + name='maps', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='league_maps', to='matches.MapPoolChoice'), + ), + ] diff --git a/leagues/models.py b/leagues/models.py index d370b3878..d633a43ad 100644 --- a/leagues/models.py +++ b/leagues/models.py @@ -85,6 +85,7 @@ class League(models.Model): close_register = models.DateTimeField() # when is the league going to start? start = models.DateTimeField() + maps = models.ForeignKey(MapPoolChoice, related_name='league_maps', on_delete=models.PROTECT, null=True) From 57bd5247e34df29a9a875097d5aaea3685d35ade Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:00:56 -0400 Subject: [PATCH 008/104] league staff views initial commit --- staff/views/leagues.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 staff/views/leagues.py diff --git a/staff/views/leagues.py b/staff/views/leagues.py new file mode 100644 index 000000000..9610f04c0 --- /dev/null +++ b/staff/views/leagues.py @@ -0,0 +1,26 @@ +from django.contrib import messages +from django.shortcuts import render, redirect +#from django.views.generic import View + +#from matches.models import MatchReport, MatchDispute, Match, MapChoice, MapPoolChoice +from staff.forms import * + + +def create_league(request): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + if request.method == 'GET': + form = CreateLeagueForm + return render(request, 'staff/leagues/league_create.html', {'form': form}) + else: + # the form is posting, lets start validating + form = CreateLeagueForm(request.POSt, request.FILES) + if form.is_valid(): + league = form.instance + league.save() + messages.success(request, 'Created League') + #return redirect() + From f331109874665e4357849514aa1a5b400b73f2bb Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:14:38 -0400 Subject: [PATCH 009/104] import league views for urls --- staff/views/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/staff/views/__init__.py b/staff/views/__init__.py index 533ac2084..bfea9e001 100644 --- a/staff/views/__init__.py +++ b/staff/views/__init__.py @@ -7,3 +7,4 @@ from .teams import * from .wagers import * from .staff import * +from .leagues import * From c2aedecd08adc5b63a725a2d5685d46097721b1d Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:20:00 -0400 Subject: [PATCH 010/104] add list_league, detail_league, edit_league, list_league_settings, +more --- staff/views/leagues.py | 67 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/staff/views/leagues.py b/staff/views/leagues.py index 9610f04c0..75de9e0e3 100644 --- a/staff/views/leagues.py +++ b/staff/views/leagues.py @@ -22,5 +22,70 @@ def create_league(request): league = form.instance league.save() messages.success(request, 'Created League') - #return redirect() + return redirect() + else: + form = CreateLeagueForm(request.POST) + return render(request, 'staff/leagues/league_create.html', {'form': form}) + +def list_league(request): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + leagues = League.objects.all() + return render(request, 'staff/leagues/league_list.html', {'leagues': leagues}) + + +def detail_league(request, pk): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + league = League.objects.get(pk=pk) + return render(request, 'staff/leagues/league_detail.html', {'league': league}) + + +def edit_league(request, pk): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + if request.method == 'POST': + league = League.objects.get(pk=pk) + form = CreateLeagueForm(request.POST, request.FILES, instance=league) + if form.is_valid(): + form.save() + messages.success(request, 'League has been updated') + return redirect('staff:list_league') + else: + messages.error(request, 'Form validation error') + return redirect('staff:list_league') + else: + league = League.objects.get(pk=pk) + form = CreateLeagueForm(instance=league) + return render(request, 'staff/leagues/league_edit.html', {'form': form, 'pk':pk, 'league':league}) + + +def list_league_settings(request): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + settings = LeagueSettings.objects.all() + return render(request, 'staff/leagues/league_settings_list.html', {'settings': settings}) + + +def create_league_settings(request): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + if request.method == 'GET': + form = CreateLeagueSettingsForm + return render(request, 'staff/leagues/league_settings_create.html', {'form': form}) \ No newline at end of file From 3e42361059d50224530f275a7577cd539b2c56bf Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:20:45 -0400 Subject: [PATCH 011/104] staff league urls --- staff/urls.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/staff/urls.py b/staff/urls.py index 7618d3c45..67b685c08 100644 --- a/staff/urls.py +++ b/staff/urls.py @@ -54,6 +54,13 @@ path('tournaments//addteams/', login_required(views.add_teams), name='add_team'), path('tournaments//addteams//', login_required(views.add_teams), name='add_team'), + path('leagues/', login_required(views.list_league), name='list_league'), + path('leagues//', login_required(views.detail_league), name='detail_league'), + path('leagues//edit/', login_required(views.edit_league), name='edit_league'), + path('leagues/create/', login_required(views.create_league), name='create_league'), + path('leagues/settings', login_required(views.list_league_settings), name='list_league_settings'), + path('leagues/settings/create', login_required(views.create_league_settings), name='create_league_settings'), + path('matches/', login_required(views.matches_index), name='matches_index'), path('matches/disputed/', login_required(views.disputed_matches), name='disputed_matches'), path('match/', login_required(views.match_detail), name='match_detail'), From 24e913b390a9375fd4079e17d43f611291ac2eb4 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:40:05 -0400 Subject: [PATCH 012/104] add credits and max size to leagues models --- leagues/migrations/0003_auto_20200515_2139.py | 23 +++++++++++++++++++ leagues/models.py | 5 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 leagues/migrations/0003_auto_20200515_2139.py diff --git a/leagues/migrations/0003_auto_20200515_2139.py b/leagues/migrations/0003_auto_20200515_2139.py new file mode 100644 index 000000000..84e7b6b03 --- /dev/null +++ b/leagues/migrations/0003_auto_20200515_2139.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.12 on 2020-05-16 01:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('leagues', '0002_league_maps'), + ] + + operations = [ + migrations.AddField( + model_name='league', + name='credits', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.AddField( + model_name='league', + name='size', + field=models.PositiveSmallIntegerField(default=8), + ), + ] diff --git a/leagues/models.py b/leagues/models.py index d633a43ad..f25602313 100644 --- a/leagues/models.py +++ b/leagues/models.py @@ -86,6 +86,7 @@ class League(models.Model): # when is the league going to start? start = models.DateTimeField() maps = models.ForeignKey(MapPoolChoice, related_name='league_maps', on_delete=models.PROTECT, null=True) - - + # the amount of credits that should be charged when joining + credits = models.PositiveSmallIntegerField(default=0) + size = models.PositiveSmallIntegerField(default=8) From bbad00ca4f850409f799c096e299512327a74346 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:40:16 -0400 Subject: [PATCH 013/104] add detail_league_settings staff view --- staff/views/leagues.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/staff/views/leagues.py b/staff/views/leagues.py index 75de9e0e3..9d77e211e 100644 --- a/staff/views/leagues.py +++ b/staff/views/leagues.py @@ -88,4 +88,14 @@ def create_league_settings(request): else: if request.method == 'GET': form = CreateLeagueSettingsForm - return render(request, 'staff/leagues/league_settings_create.html', {'form': form}) \ No newline at end of file + return render(request, 'staff/leagues/league_settings_create.html', {'form': form}) + + +def detail_league_settings(request, pk): + user = UserProfile.objects.get(user__username=request.user.username) + allowed = ['superadmin', 'admin'] + if user.user_type not in allowed: + return render(request, 'staff/permissiondenied.html') + else: + settings = LeagueSettings.objects.get(pk=pk) + return render(request, 'staff/leagues/league_settings_detail.html', {'settings': settings}) \ No newline at end of file From 62fdd921e5552f128391a93b642bb7433d8977c5 Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:40:34 -0400 Subject: [PATCH 014/104] add detail_league_settings url --- staff/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/staff/urls.py b/staff/urls.py index 67b685c08..40c6f3b53 100644 --- a/staff/urls.py +++ b/staff/urls.py @@ -60,6 +60,7 @@ path('leagues/create/', login_required(views.create_league), name='create_league'), path('leagues/settings', login_required(views.list_league_settings), name='list_league_settings'), path('leagues/settings/create', login_required(views.create_league_settings), name='create_league_settings'), + path('leagues/settings//', login_required(views.detail_league_settings), name='detail_league_settings'), path('matches/', login_required(views.matches_index), name='matches_index'), path('matches/disputed/', login_required(views.disputed_matches), name='disputed_matches'), From 63624b04da4f256acb3fc9d60d1f4accafd4a50f Mon Sep 17 00:00:00 2001 From: Mike M Date: Fri, 15 May 2020 21:47:55 -0400 Subject: [PATCH 015/104] add leagues to staff base --- project-templates/staff/staffbase.html | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/project-templates/staff/staffbase.html b/project-templates/staff/staffbase.html index 369f4605b..aa9e16793 100644 --- a/project-templates/staff/staffbase.html +++ b/project-templates/staff/staffbase.html @@ -176,6 +176,25 @@ {% endif %} + +
  • -
  • DIVISIONS
  • RULES
  • From 028cf81fc6b745cf9d5adef3b2d6248ba25525f4 Mon Sep 17 00:00:00 2001 From: Mike M Date: Sun, 2 Aug 2020 13:15:05 -0400 Subject: [PATCH 103/104] bump version --- olly/base_settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/olly/base_settings.py b/olly/base_settings.py index 4330120df..925c59121 100644 --- a/olly/base_settings.py +++ b/olly/base_settings.py @@ -158,4 +158,4 @@ LOGIN_REDIRECT_URL = '/' LOGIN_URL = '/login/' -SITE_VERSION = "0.8.1" +SITE_VERSION = "0.9.0" From 2ef9e014ceb8afc1b1a5aa94f20b873f8c3b8902 Mon Sep 17 00:00:00 2001 From: Michael Madden Date: Sun, 2 Aug 2020 17:21:37 -0400 Subject: [PATCH 104/104] filter by active tournament - closes #89 --- singletournaments/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/singletournaments/views.py b/singletournaments/views.py index ae26f61cc..2af84b2dc 100644 --- a/singletournaments/views.py +++ b/singletournaments/views.py @@ -20,7 +20,7 @@ class List(View): def get(self, request): form = self.form_class(None) - tournament_list = SingleEliminationTournament.objects.all() + tournament_list = SingleEliminationTournament.objects.all().filter(active=True) return render(request, 'singletournaments/singletournament_list.html', {'tournament_list': tournament_list, 'form': form})