diff --git a/jasmin_services/migrations/0030_alter_behaviour_options_and_more.py b/jasmin_services/migrations/0030_alter_behaviour_options_and_more.py new file mode 100644 index 0000000..541773f --- /dev/null +++ b/jasmin_services/migrations/0030_alter_behaviour_options_and_more.py @@ -0,0 +1,49 @@ +# Generated by Django 5.2.13 on 2026-04-16 11:21 + +import django.db.models.deletion +import django_countries.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("jasmin_services", "0029_request_jasmin_serv_resulti_2f6892_idx_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="category", + name="require_role_to_apply", + field=models.ForeignKey( + default=None, + help_text="Require uses have this role before they are able to apply for roles in this category.", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="jasmin_services.role", + ), + ), + migrations.AlterField( + model_name="grant", + name="internal_comment", + field=models.TextField(blank=True, verbose_name="Internal notes"), + ), + migrations.AlterField( + model_name="role", + name="auto_accept", + field=models.BooleanField( + default=False, + help_text="Auto accepts all requested access giving users with a 1 year expiration date.", + ), + ), + migrations.AlterField( + model_name="service", + name="institution_countries", + field=django_countries.fields.CountryField( + blank=True, + help_text="Coutries a user's institute must be located to begin approval. Hold ctrl or cmd for mac to select multiple countries. Leave blank for any country.", + max_length=746, + multiple=True, + ), + ), + ] diff --git a/jasmin_services/models/category.py b/jasmin_services/models/category.py index 4fad9b6..8cd057c 100644 --- a/jasmin_services/models/category.py +++ b/jasmin_services/models/category.py @@ -29,5 +29,13 @@ class Meta: "then alphabetically by name within that.", ) + require_role_to_apply = models.ForeignKey( + "jasmin_services.Role", + null=True, + default=None, + help_text="Require uses have this role before they are able to apply for roles in this category.", + on_delete=models.SET_NULL, + ) + def __str__(self): return str(self.long_name) diff --git a/jasmin_services/models/role.py b/jasmin_services/models/role.py index 90b963c..3098a42 100644 --- a/jasmin_services/models/role.py +++ b/jasmin_services/models/role.py @@ -177,6 +177,13 @@ async def auser_may_apply(self, user): query = self._user_may_apply_query(user) return not await query.aexists() + def user_has_role(self, user): + return self.accesses.filter( + user=user, + grant__revoked=False, + grant__expires__gte=django.utils.timezone.localdate(), + ).exists() + def enable(self, user): """Enable this role for the given user.""" # During an import, disable all behaviours diff --git a/jasmin_services/templates/jasmin_services/service_details.html b/jasmin_services/templates/jasmin_services/service_details.html index 4acaa48..efd9abb 100644 --- a/jasmin_services/templates/jasmin_services/service_details.html +++ b/jasmin_services/templates/jasmin_services/service_details.html @@ -8,6 +8,9 @@