add custom contact management and special rank ruling

sync_v2
Raz 8 months ago
parent 3c8adb5673
commit f55d123cbf
  1. 21
      shop/migrations/0022_alter_cartitem_options_alter_orderitem_options.py
  2. 43
      tournaments/migrations/0112_tournament_disable_ranking_federal_ruling_and_more.py
  3. 24
      tournaments/models/tournament.py
  4. 38
      tournaments/services/email_service.py
  5. 12
      tournaments/templates/tournaments/tournament_info.html
  6. 1
      tournaments/utils/extensions.py

@ -0,0 +1,21 @@
# Generated by Django 5.1 on 2025-03-26 08:47
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('shop', '0021_alter_color_name_alter_product_sku'),
]
operations = [
migrations.AlterModelOptions(
name='cartitem',
options={'ordering': ['product__ordering_value', 'product__cut']},
),
migrations.AlterModelOptions(
name='orderitem',
options={'ordering': ['product__ordering_value', 'product__cut']},
),
]

@ -0,0 +1,43 @@
# Generated by Django 5.1 on 2025-03-26 10:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tournaments', '0111_customuser_should_synchronize'),
]
operations = [
migrations.AddField(
model_name='tournament',
name='disable_ranking_federal_ruling',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='tournament',
name='hide_umpire_mail',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='tournament',
name='hide_umpire_phone',
field=models.BooleanField(default=True),
),
migrations.AddField(
model_name='tournament',
name='umpire_custom_contact',
field=models.CharField(blank=True, max_length=200, null=True),
),
migrations.AddField(
model_name='tournament',
name='umpire_custom_mail',
field=models.EmailField(blank=True, max_length=254, null=True),
),
migrations.AddField(
model_name='tournament',
name='umpire_custom_phone',
field=models.CharField(blank=True, max_length=15, null=True),
),
]

@ -75,6 +75,12 @@ class Tournament(BaseModel):
minimum_player_per_team = models.IntegerField(default=2)
maximum_player_per_team = models.IntegerField(default=2)
information = models.CharField(max_length=4000, null=True, blank=True)
umpire_custom_mail = models.EmailField(null=True, blank=True)
umpire_custom_contact = models.CharField(max_length=200, null=True, blank=True)
umpire_custom_phone = models.CharField(max_length=15, null=True, blank=True)
hide_umpire_mail = models.BooleanField(default=False)
hide_umpire_phone = models.BooleanField(default=True)
disable_ranking_federal_ruling = models.BooleanField(default=False)
def delete_dependencies(self):
for team_registration in self.team_registrations.all():
@ -1410,6 +1416,24 @@ class Tournament(BaseModel):
else:
return True
def umpire_contact(self):
if self.umpire_custom_contact is not None:
print(self.umpire_custom_contact)
return self.umpire_custom_contact
return self.event.creator.full_name()
def umpire_mail(self):
if self.umpire_custom_mail is not None:
print(self.umpire_custom_mail)
return self.umpire_custom_mail
return self.event.creator.email
def umpire_phone(self):
if self.umpire_custom_phone is not None:
print(self.umpire_custom_phone)
return self.umpire_custom_phone
return self.event.creator.phone
class MatchGroup:
def __init__(self, name, matches, formatted_schedule, round_id=None):

@ -85,7 +85,7 @@ class TournamentEmailService:
f"\nLe tournoi commencera le {tournament.formatted_start_date()} au club {tournament.event.club.name}",
f"\nVoir les {absolute_url}",
"\nPour toute question, veuillez contacter votre juge-arbitre. Si vous n'êtes pas à l'origine de cette inscription, merci de le contacter rapidement.",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\nCeci est un e-mail automatique, veuillez ne pas y répondre.",
"\nCordialement,\n\nPadel Club"
])
@ -115,7 +115,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre. "
"Si vous n'êtes pas à l'origine de cette désinscription, merci de le contacter rapidement.",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -144,7 +144,7 @@ class TournamentEmailService:
)
body_parts.extend([
f"\n\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -164,7 +164,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre:",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -193,7 +193,7 @@ class TournamentEmailService:
)
body_parts.extend([
f"\n\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -219,7 +219,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre : ",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -246,7 +246,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre : ",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -272,7 +272,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre : ",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -298,7 +298,7 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre : ",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
@ -324,12 +324,30 @@ class TournamentEmailService:
body_parts.extend([
"\n\nPour toute question, veuillez contacter votre juge-arbitre : ",
f"\n{tournament.event.creator.full_name()}\n{tournament.event.creator.email}",
f"\n{TournamentEmailService._format_umpire_contact(tournament)}",
"\n\nCeci est un e-mail automatique, veuillez ne pas y répondre."
])
return "".join(body_parts)
@staticmethod
def _format_umpire_contact(tournament):
contact_parts = []
creator_full_name = tournament.umpire_contact()
contact_parts.append(creator_full_name)
if not tournament.hide_umpire_mail:
creator_email = tournament.umpire_mail()
if creator_email:
contact_parts.append(creator_email)
if not tournament.hide_umpire_phone:
creator_phone = tournament.umpire_phone()
if creator_phone:
contact_parts.append(creator_phone)
return "\n".join(contact_parts)
@staticmethod
def notify(captain, other_player, tournament, message_type: TeamEmailType):
print("TournamentEmailService.notify", captain.email, captain.registered_online, tournament, message_type)

@ -90,12 +90,18 @@
{% endif %}
</p>
{% if tournament.event.creator %}
<p>
{% if tournament.umpire_contact %}
<div class="semibold">Organisateur</div>
<div>{{ tournament.event.creator.full_name }}</div>
<div>{{ tournament.umpire_contact }}</div>
{% endif %}
{% if tournament.umpire_mail and tournament.hide_umpire_mail is False %}
<div><a href="mailto:{{ tournament.umpire_mail }}" class="styled-link">{{ tournament.umpire_mail }}</a></div>
{% endif %}
{% if tournament.umpire_phone and tournament.hide_umpire_phone is False %}
<div><a href="tel:{{ tournament.umpire_phone }}" class="styled-link">{{ tournament.umpire_phone }}</a></div>
{% endif %}
</p>
{% endif %}
{% if tournament.information %}
<p>

@ -17,5 +17,6 @@ def create_random_filename(base_name, extension):
return f"{base_name}_{random_string}.{extension}"
def is_not_sqlite_backend():
return True
default_db_engine = settings.DATABASES['default']['ENGINE']
return default_db_engine != 'django.db.backends.sqlite3'

Loading…
Cancel
Save