Skip to content

Commit 4cc186e

Browse files
authored
feat: set license usage_policy from license profile default_usage_policy
2 parents 87cafc0 + 2e4ef1f commit 4cc186e

File tree

5 files changed

+73
-7
lines changed

5 files changed

+73
-7
lines changed

dje/tests/testfiles/test_dataset_ll_only.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
],
3737
"uuid": "5a4ec739-50be-4744-a7d6-4ba36f9ba4cd",
3838
"name": "1: LicenseProfile1",
39+
"default_usage_policy": null,
3940
"examples": "",
4041
"notes": ""
4142
}

license_library/admin.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -357,11 +357,15 @@ def set_assigned_tags_from_license_profile(self, request, obj):
357357
self.message_user(request, msg)
358358

359359
def save_model(self, request, obj, form, change):
360+
# Needs to be set before the `save_model` method call.
361+
if obj.license_profile:
362+
obj.set_usage_policy_from_license_profile()
363+
360364
if change:
361365
obj_before_save = License.objects.get(id=obj.id)
362366
super().save_model(request, obj, form, change)
363367
# If a LicenseProfile is set or changed, apply the values of the
364-
# this Profile to the license assigned tags.
368+
# Profile to the license assigned tags.
365369
if obj.license_profile and obj.license_profile != obj_before_save.license_profile:
366370
self.set_assigned_tags_from_license_profile(request, obj)
367371
else:
@@ -452,7 +456,7 @@ class LicenseTagHolderBaseAdmin(DataspacedAdmin):
452456
The purpose of this class is to be extended by LicenseProfileAdmin and
453457
LicenseTagGroupAdmin. It's used to add a LicenseTag queryset in the context
454458
of the add and changes views, to display special data (added through
455-
javascript) about tags in the page like text and guidance information.
459+
avascript) about tags in the page like text and guidance information.
456460
"""
457461

458462
change_form_template = "admin/license_library/tag_holder/change_form.html"
@@ -519,11 +523,12 @@ class LicenseProfileAdmin(LicenseTagHolderBaseAdmin):
519523
"name",
520524
"get_assigned_tags_html",
521525
"examples",
526+
"default_usage_policy",
522527
"get_dataspace",
523528
)
524529
fieldsets = (
525530
("", {"fields": ("name",)}),
526-
("", {"fields": ("examples", "notes", "dataspace", "uuid")}),
531+
("", {"fields": ("examples", "notes", "default_usage_policy", "dataspace", "uuid")}),
527532
)
528533
search_fields = ("name",)
529534
list_filter = DataspacedAdmin.list_filter + (ReportingQueryListFilter,)
@@ -553,10 +558,6 @@ class LicenseProfileAdmin(LicenseTagHolderBaseAdmin):
553558
will be Unknown.",
554559
)
555560

556-
def get_queryset(self, request):
557-
qs = super().get_queryset(request)
558-
return qs.prefetch_related("licenseprofileassignedtag_set__license_tag")
559-
560561

561562
@admin.register(LicenseCategory, site=dejacode_site)
562563
class LicenseCategoryAdmin(DataspacedAdmin):
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 5.2.9 on 2026-02-09 02:10
2+
3+
import django.db.models.deletion
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('license_library', '0002_initial'),
11+
('policy', '0002_initial'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='licenseprofile',
17+
name='default_usage_policy',
18+
field=models.ForeignKey(blank=True, help_text='Default usage policy to be assigned to a license when using this license profile.', limit_choices_to={'content_type__app_label': 'license_library', 'content_type__model': 'license'}, null=True, on_delete=django.db.models.deletion.SET_NULL, to='policy.usagepolicy'),
19+
),
20+
]

license_library/models.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,20 @@ class LicenseProfile(DataspacedModel):
209209
),
210210
)
211211

212+
default_usage_policy = models.ForeignKey(
213+
to="policy.UsagePolicy",
214+
limit_choices_to={
215+
"content_type__app_label": "license_library",
216+
"content_type__model": "license",
217+
},
218+
null=True,
219+
blank=True,
220+
on_delete=models.SET_NULL,
221+
help_text=_(
222+
"Default usage policy to be assigned to a license when using this license profile."
223+
),
224+
)
225+
212226
class Meta:
213227
unique_together = (("dataspace", "name"), ("dataspace", "uuid"))
214228
ordering = ["name"]
@@ -986,6 +1000,20 @@ def set_assigned_tags_from_license_profile(self):
9861000
defaults={"value": profile_assigned_tag.value},
9871001
)
9881002

1003+
def set_usage_policy_from_license_profile(self):
1004+
"""
1005+
Set default usage_policy value from the license_profile
1006+
when usage_policy is not already defined.
1007+
"""
1008+
apply_default_usage_policy = (
1009+
not self.usage_policy
1010+
and self.license_profile
1011+
and self.license_profile.default_usage_policy
1012+
)
1013+
1014+
if apply_default_usage_policy:
1015+
self.usage_policy = self.license_profile.default_usage_policy
1016+
9891017
@staticmethod
9901018
def get_extra_relational_fields():
9911019
return ["annotations", "external_references"]

license_library/tests/test_models.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from license_library.models import LicenseTagGroup
2929
from license_library.models import LicenseTagGroupAssignedTag
3030
from organization.models import Owner
31+
from policy.tests import make_usage_policy
3132
from product_portfolio.models import Product
3233

3334

@@ -304,6 +305,20 @@ def test_license_model_data_for_expression_builder(self):
304305
data_for_expression_builder = License.objects.all().data_for_expression_builder()
305306
self.assertEqual(expected, data_for_expression_builder)
306307

308+
def test_license_model_set_usage_policy_from_license_profile(self):
309+
self.license1.set_usage_policy_from_license_profile()
310+
self.assertIsNone(self.license1.usage_policy)
311+
312+
self.license1.update(license_profile=self.license_profile)
313+
self.license1.set_usage_policy_from_license_profile()
314+
self.assertIsNone(self.license1.usage_policy)
315+
316+
license_policy = make_usage_policy(self.dataspace, model=License)
317+
self.license_profile.update(default_usage_policy=license_policy)
318+
319+
self.license1.set_usage_policy_from_license_profile()
320+
self.assertEqual(license_policy, self.license1.usage_policy)
321+
307322
def test_license_library_models_get_exclude_candidates_fields(self):
308323
input_data = (
309324
(
@@ -355,6 +370,7 @@ def test_license_library_models_get_exclude_candidates_fields(self):
355370
(
356371
LicenseProfile,
357372
[
373+
"default_usage_policy",
358374
"examples",
359375
"notes",
360376
],

0 commit comments

Comments
 (0)