diff --git a/contracts/migrations/0041_alter_contract_agreement_url_and_more.py b/contracts/migrations/0041_alter_contract_agreement_url_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..182e80d2e92e5efb6c0d155be57ce6518c922ded --- /dev/null +++ b/contracts/migrations/0041_alter_contract_agreement_url_and_more.py @@ -0,0 +1,45 @@ +# Generated by Django 4.1.4 on 2023-04-12 09:21 + +from django.db import migrations + +import contracts.models + + +class Migration(migrations.Migration): + dependencies = [ + ("contracts", "0040_alter_contract_agreement_url_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="contract", + name="agreement_url", + field=contracts.models.SubdomainValidatedURLField( + blank=True, + help_text="Běžně odkaz na fórum. Využívá se např. u koaličních smluv. Musí začínat <code>https</code>.", + max_length=256, + null=True, + verbose_name="Odkaz na schválení", + ), + ), + migrations.AlterField( + model_name="contract", + name="tender_url", + field=contracts.models.SubdomainValidatedURLField( + blank=True, + help_text='Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. Musí začínat <code>https</code>. a být pod doménou <code>pirati.cz</code>.', + max_length=256, + null=True, + verbose_name="Odkaz na výběrové řízení", + ), + ), + migrations.AlterField( + model_name="contractintent", + name="url", + field=contracts.models.SubdomainValidatedURLField( + help_text="Musí začínat <code>https</code>.", + max_length=256, + verbose_name="Odkaz", + ), + ), + ] diff --git a/contracts/migrations/0042_alter_contract_agreement_url_and_more.py b/contracts/migrations/0042_alter_contract_agreement_url_and_more.py new file mode 100644 index 0000000000000000000000000000000000000000..f874792f6a7031d8ab80c13aa6a0238ac97618db --- /dev/null +++ b/contracts/migrations/0042_alter_contract_agreement_url_and_more.py @@ -0,0 +1,45 @@ +# Generated by Django 4.1.4 on 2023-04-12 09:22 + +from django.db import migrations + +import contracts.models + + +class Migration(migrations.Migration): + dependencies = [ + ("contracts", "0041_alter_contract_agreement_url_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="contract", + name="agreement_url", + field=contracts.models.SubdomainValidatedURLField( + blank=True, + help_text="Běžně odkaz na fórum. Využívá se např. u koaličních smluv. Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.", + max_length=256, + null=True, + verbose_name="Odkaz na schválení", + ), + ), + migrations.AlterField( + model_name="contract", + name="tender_url", + field=contracts.models.SubdomainValidatedURLField( + blank=True, + help_text='Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.', + max_length=256, + null=True, + verbose_name="Odkaz na výběrové řízení", + ), + ), + migrations.AlterField( + model_name="contractintent", + name="url", + field=contracts.models.SubdomainValidatedURLField( + help_text="Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>.", + max_length=256, + verbose_name="Odkaz", + ), + ), + ] diff --git a/contracts/models.py b/contracts/models.py index b68ea27ee06a9e888dfd5a98bd7659427114230b..de1060e3085556a3d31a89546f3e47593d77f9f4 100644 --- a/contracts/models.py +++ b/contracts/models.py @@ -5,7 +5,7 @@ import typing from django.conf import settings from django.core.exceptions import ValidationError -from django.core.validators import URLValidator +from django.core.validators import RegexValidator, URLValidator from django.db import models from django.db.models.signals import post_save from django.dispatch import receiver @@ -17,6 +17,13 @@ from shared.models import NameStrMixin from users.models import User +class SubdomainValidatedURLField(models.URLField): + validators = [ + URLValidator(schemes=("https",)), + RegexValidator(regex=r"https:\/\/.*\.pirati.cz(\/|$).*"), + ] + + class OwnPermissionsMixin(models.Model): class Meta: abstract = True @@ -566,27 +573,25 @@ class Contract(NameStrMixin, models.Model): verbose_name="Stav fyzického dokumentu", ) - tender_url = models.URLField( + tender_url = SubdomainValidatedURLField( max_length=256, blank=True, null=True, - validators=(URLValidator(schemes=("https",)),), verbose_name="Odkaz na výběrové řízení", help_text=mark_safe( 'Běžně odkaz na <a href="https://forum.pirati.cz/viewforum.php?f=572">fórum</a>. ' - "Musí začínat <code>https</code>." + "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>." ), ) - agreement_url = models.URLField( + agreement_url = SubdomainValidatedURLField( max_length=256, blank=True, null=True, - validators=(URLValidator(schemes=("https",)),), verbose_name="Odkaz na schválení", help_text=mark_safe( "Běžně odkaz na fórum. Využívá se např. u koaličních smluv. " - "Musí začínat <code>https</code>." + "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>." ), ) # WARNING: Dependent on the type! @@ -996,11 +1001,12 @@ class ContractIntent(NameStrMixin, models.Model): verbose_name="Jméno", ) - url = models.URLField( + url = SubdomainValidatedURLField( max_length=256, verbose_name="Odkaz", - validators=(URLValidator(schemes=("https",)),), - help_text=mark_safe("Musí začínat <code>https</code>."), + help_text=mark_safe( + "Musí začínat <code>https</code> a být pod doménou <code>pirati.cz</code>." + ), ) contract = models.ForeignKey(