Skip to content

Commit

Permalink
Merge branch 'develop' into arbitrary-team-count
Browse files Browse the repository at this point in the history
# Conflicts:
#	tabbycat/results/views.py
  • Loading branch information
tienne-B committed Jun 1, 2024
2 parents 817de07 + 6d4c101 commit c8d8765
Show file tree
Hide file tree
Showing 83 changed files with 5,284 additions and 1,111 deletions.
2 changes: 1 addition & 1 deletion .python-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
3.9.12
3.11.9
2 changes: 1 addition & 1 deletion .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ version: 2
build:
os: ubuntu-20.04
tools:
python: "3.9"
python: "3.12"

# Build documentation in the docs/ directory with Sphinx
sphinx:
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# run the application specified. docker-compose does not use this.

# Grab a python image
FROM python:3.9
FROM python:3.11
SHELL ["/bin/bash", "--login", "-c"]

# Just needed for all things python (note this is setting an env variable)
Expand Down
2 changes: 1 addition & 1 deletion Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,4 @@ sphinx-rtd-theme = "*"
sphinx-intl = "*"

[requires]
python_version = "3.9"
python_version = "3.11"
2,035 changes: 1,164 additions & 871 deletions Pipfile.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion render.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ services:
- key: DJANGO_SECRET_KEY
generateValue: true
- key: PYTHON_VERSION
value: "3.9.9"
value: "3.12.3"
- key: WEB_CONCURRENCY
value: 4
- key: TAB_DIRECTOR_EMAIL
Expand Down
2 changes: 1 addition & 1 deletion runtime.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
python-3.9.12
python-3.11.9
10 changes: 6 additions & 4 deletions tabbycat/actionlog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ def clean(self):
if self.user is None and self.ip_address is None:
raise ValidationError(_("All log entries require at least one of a user and an IP address."))

def get_content_object_display(self, omit_tournament=False):
def get_content_object_display(self, omit_tournament=False, user=None):
obj = self.content_object

if obj is None:
Expand All @@ -162,12 +162,12 @@ def get_content_object_display(self, omit_tournament=False):
model_name = self.content_type.model
try:
if model_name == 'ballotsubmission':
if use_team_code_names(self.tournament, True):
if use_team_code_names(self.tournament, True, user):
return obj.debate.matchup_codes
else:
return obj.debate.matchup
elif model_name == 'debate':
if use_team_code_names(self.tournament, True):
if use_team_code_names(self.tournament, True, user):
return obj.debate.matchup_codes
else:
return obj.debate.matchup
Expand All @@ -192,6 +192,8 @@ def serialize(self):
'id': self.id,
'user': self.user.username if self.user else self.ip_address or _("anonymous"),
'type': self.get_type_display(),
'param': self.get_content_object_display(omit_tournament=True),
# As the team names are passed in the content of the message for all users,
# must assume they don't have permission for real names
'param': self.get_content_object_display(omit_tournament=True, user=None),
'timestamp': badge_datetime_format(self.timestamp),
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Generated by Django 5.0.4 on 2024-05-04 13:21

import utils.models
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('adjallocation', '0009_auto_20200902_1208'),
('draw', '0008_alter_debateteam_side_alter_teamsideallocation_side'),
('participants', '0021_team_seed'),
]

operations = [
migrations.AlterUniqueTogether(
name='adjudicatoradjudicatorconflict',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorinstitutionconflict',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorteamconflict',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='debateadjudicator',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='teaminstitutionconflict',
unique_together=set(),
),
migrations.AddConstraint(
model_name='adjudicatoradjudicatorconflict',
constraint=utils.models.UniqueConstraint(fields=('adjudicator1', 'adjudicator2'), name='adjallo_adjudicatoradjudicatorconflict_adjudicator1__adjudicator2_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorinstitutionconflict',
constraint=utils.models.UniqueConstraint(fields=('adjudicator', 'institution'), name='adjallo_adjudicatorinstitutionconflict_adjudicator__institution_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorteamconflict',
constraint=utils.models.UniqueConstraint(fields=('adjudicator', 'team'), name='adjallo_adjudicatorteamconflict_adjudicator__team_uniq'),
),
migrations.AddConstraint(
model_name='debateadjudicator',
constraint=utils.models.UniqueConstraint(fields=('debate', 'adjudicator'), name='adjallo_debateadjudicator_debate__adjudicator_uniq'),
),
migrations.AddConstraint(
model_name='teaminstitutionconflict',
constraint=utils.models.UniqueConstraint(fields=('team', 'institution'), name='adjallo_teaminstitutionconflict_team__institution_uniq'),
),
]
12 changes: 7 additions & 5 deletions tabbycat/adjallocation/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.db import models
from django.utils.translation import gettext_lazy as _

from utils.models import UniqueConstraint


class DebateAdjudicatorManager(models.Manager):
use_for_related_fields = True
Expand Down Expand Up @@ -31,9 +33,9 @@ class DebateAdjudicator(models.Model):
timing_confirmed = models.BooleanField(null=True, verbose_name=_("available?"))

class Meta:
constraints = [UniqueConstraint(fields=['debate', 'adjudicator'])]
verbose_name = _("debate adjudicator")
verbose_name_plural = _("debate adjudicators")
unique_together = ('debate', 'adjudicator')

def __str__(self):
return '{} in {} ({})'.format(self.adjudicator, self.debate, self.get_type_display())
Expand All @@ -50,9 +52,9 @@ class AdjudicatorTeamConflict(models.Model):
verbose_name=_("team"))

class Meta:
constraints = [UniqueConstraint(fields=['adjudicator', 'team'])]
verbose_name = _("adjudicator-team conflict")
verbose_name_plural = _("adjudicator-team conflicts")
unique_together = ('adjudicator', 'team')

def __str__(self):
return '{} with {}'.format(self.adjudicator, self.team)
Expand All @@ -67,9 +69,9 @@ class AdjudicatorAdjudicatorConflict(models.Model):
verbose_name=_("adjudicator 2"))

class Meta:
constraints = [UniqueConstraint(fields=['adjudicator1', 'adjudicator2'])]
verbose_name = _("adjudicator-adjudicator conflict")
verbose_name_plural = _("adjudicator-adjudicator conflicts")
unique_together = ('adjudicator1', 'adjudicator2')

def __str__(self):
return '{} with {}'.format(self.adjudicator1, self.adjudicator2)
Expand All @@ -82,9 +84,9 @@ class AdjudicatorInstitutionConflict(models.Model):
verbose_name=_("institution"))

class Meta:
constraints = [UniqueConstraint(fields=['adjudicator', 'institution'])]
verbose_name = _("adjudicator-institution conflict")
verbose_name_plural = _("adjudicator-institution conflicts")
unique_together = ('adjudicator', 'institution')

def __str__(self):
return '{} with {}'.format(self.adjudicator, self.institution)
Expand All @@ -97,9 +99,9 @@ class TeamInstitutionConflict(models.Model):
verbose_name=_("institution"))

class Meta:
constraints = [UniqueConstraint(fields=['team', 'institution'])]
verbose_name = _("team-institution conflict")
verbose_name_plural = _("team-institution conflicts")
unique_together = ('team', 'institution')

def __str__(self):
return '{} with {}'.format(self.team, self.institution)
Expand Down
6 changes: 5 additions & 1 deletion tabbycat/adjallocation/templates/edit_conflicts.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{% extends "base.html" %}

{% block content %}
{% include "components/formset.html" with triple=True %}
{% if can_edit %}
{% include "components/formset.html" with triple=True %}
{% else %}
{% include "components/formset.html" with double=True %}
{% endif %}
{% endblock content %}
41 changes: 36 additions & 5 deletions tabbycat/adjallocation/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from participants.models import Adjudicator, Region
from participants.prefetch import populate_feedback_scores
from tournaments.mixins import DebateDragAndDropMixin, TournamentMixin
from users.permissions import has_permission, Permission
from utils.misc import ranks_dictionary, redirect_tournament, reverse_tournament
from utils.mixins import AdministratorMixin
from utils.views import ModelFormSetView
Expand Down Expand Up @@ -90,6 +91,8 @@ class EditDebateAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView):
page_title = gettext_lazy("Edit Allocation")
prefetch_adjs = True # Fetched in full as get_serialised

view_permission = Permission.VIEW_DEBATEADJUDICATORS

def get_extra_info(self):
info = super().get_extra_info()
return info
Expand All @@ -104,6 +107,8 @@ class EditPanelAdjudicatorsView(BaseEditDebateOrPanelAdjudicatorsView):
template_name = "edit_panel_adjudicators.html"
page_title = gettext_lazy("Edit Panels")

view_permission = Permission.VIEW_PREFORMEDPANELS

def get_extra_info(self):
info = super().get_extra_info()
info['backUrl'] = reverse_tournament('panel-adjudicators-index',
Expand All @@ -123,9 +128,10 @@ def debates_or_panels_factory(self, panels):
context={'round': self.round})


class PanelAdjudicatorsIndexView(TemplateView, AdministratorMixin):
class PanelAdjudicatorsIndexView(AdministratorMixin, TournamentMixin, TemplateView):
template_name = "preformed_index.html"
page_title = gettext_lazy("Preformed Panels")
view_permission = True


# ==============================================================================
Expand All @@ -143,13 +149,26 @@ class BaseAdjudicatorConflictsView(LogActionMixin, AdministratorMixin, Tournamen
template_name = 'edit_conflicts.html'
page_emoji = "🔶"

formset_factory_kwargs = {
'extra': 10,
'can_delete': True,
}
formset_factory_kwargs = {}

def get_formset_factory_kwargs(self):
can_edit = has_permission(self.request.user, self.get_edit_permission(), self.tournament)
kwargs = super().get_formset_factory_kwargs()
kwargs['extra'] = 10 * int(can_edit)
kwargs['can_delete'] = can_edit
return kwargs

def get_formset(self):
formset = super().get_formset()
if not has_permission(self.request.user, self.get_edit_permission(), self.tournament):
for form in formset:
for field in form.fields.values():
field.disabled = True
return formset

def get_context_data(self, **kwargs):
kwargs['save_text'] = self.save_text
kwargs['can_edit'] = has_permission(self.request.user, self.get_edit_permission(), self.tournament)
return super().get_context_data(**kwargs)

def get_success_url(self, *args, **kwargs):
Expand All @@ -167,6 +186,9 @@ def formset_valid(self, formset):

class AdjudicatorTeamConflictsView(BaseAdjudicatorConflictsView):

view_permission = Permission.VIEW_ADJ_TEAM_CONFLICTS
edit_permission = Permission.EDIT_ADJ_TEAM_CONFLICTS

action_log_type = ActionLogEntry.ActionType.CONFLICTS_ADJ_TEAM_EDIT
formset_model = AdjudicatorTeamConflict
page_title = gettext_lazy("Adjudicator-Team Conflicts")
Expand Down Expand Up @@ -211,6 +233,9 @@ def add_message(self, nsaved, ndeleted):

class AdjudicatorAdjudicatorConflictsView(BaseAdjudicatorConflictsView):

view_permission = Permission.VIEW_ADJ_ADJ_CONFLICTS
edit_permission = Permission.EDIT_ADJ_ADJ_CONFLICTS

action_log_type = ActionLogEntry.ActionType.CONFLICTS_ADJ_ADJ_EDIT
formset_model = AdjudicatorAdjudicatorConflict
page_title = gettext_lazy("Adjudicator-Adjudicator Conflicts")
Expand Down Expand Up @@ -251,6 +276,9 @@ def add_message(self, nsaved, ndeleted):

class AdjudicatorInstitutionConflictsView(BaseAdjudicatorConflictsView):

view_permission = Permission.VIEW_ADJ_INST_CONFLICTS
edit_permission = Permission.EDIT_ADJ_INST_CONFLICTS

action_log_type = ActionLogEntry.ActionType.CONFLICTS_ADJ_INST_EDIT
formset_model = AdjudicatorInstitutionConflict
page_title = gettext_lazy("Adjudicator-Institution Conflicts")
Expand Down Expand Up @@ -290,6 +318,9 @@ def add_message(self, nsaved, ndeleted):

class TeamInstitutionConflictsView(BaseAdjudicatorConflictsView):

view_permission = Permission.VIEW_TEAM_INST_CONFLICTS
edit_permission = Permission.EDIT_TEAM_INST_CONFLICTS

action_log_type = ActionLogEntry.ActionType.CONFLICTS_TEAM_INST_EDIT
formset_model = TeamInstitutionConflict
page_title = gettext_lazy("Team-Institution Conflicts")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Generated by Django 5.0.4 on 2024-05-04 13:21

import utils.models
from django.conf import settings
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('adjallocation', '0010_alter_adjudicatoradjudicatorconflict_unique_together_and_more'),
('adjfeedback', '0014_alter_adjudicatorfeedback_submitter_type'),
('draw', '0008_alter_debateteam_side_alter_teamsideallocation_side'),
('participants', '0021_team_seed'),
('tournaments', '0010_alter_round_draw_type'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AlterUniqueTogether(
name='adjudicatorfeedback',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackbooleananswer',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackfloatanswer',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackintegeranswer',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackmanyanswer',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackquestion',
unique_together=set(),
),
migrations.AlterUniqueTogether(
name='adjudicatorfeedbackstringanswer',
unique_together=set(),
),
migrations.AddConstraint(
model_name='adjudicatorfeedback',
constraint=utils.models.UniqueConstraint(fields=('adjudicator', 'source_adjudicator', 'source_team', 'version'), name='adjfeed_adjudicatorfeedback_adjudicator__source_adjudicator__source_team__version_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackbooleananswer',
constraint=utils.models.UniqueConstraint(fields=('question', 'feedback'), name='adjfeed_adjudicatorfeedbackbooleananswer_question__feedback_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackfloatanswer',
constraint=utils.models.UniqueConstraint(fields=('question', 'feedback'), name='adjfeed_adjudicatorfeedbackfloatanswer_question__feedback_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackintegeranswer',
constraint=utils.models.UniqueConstraint(fields=('question', 'feedback'), name='adjfeed_adjudicatorfeedbackintegeranswer_question__feedback_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackmanyanswer',
constraint=utils.models.UniqueConstraint(fields=('question', 'feedback'), name='adjfeed_adjudicatorfeedbackmanyanswer_question__feedback_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackquestion',
constraint=utils.models.UniqueConstraint(fields=('tournament', 'reference'), name='adjfeed_adjudicatorfeedbackquestion_tournament__reference_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackquestion',
constraint=utils.models.UniqueConstraint(fields=('tournament', 'seq'), name='adjfeed_adjudicatorfeedbackquestion_tournament__seq_uniq'),
),
migrations.AddConstraint(
model_name='adjudicatorfeedbackstringanswer',
constraint=utils.models.UniqueConstraint(fields=('question', 'feedback'), name='adjfeed_adjudicatorfeedbackstringanswer_question__feedback_uniq'),
),
]
Loading

0 comments on commit c8d8765

Please sign in to comment.