Skip to content

Commit c6f0073

Browse files
committed
feat: set usage policy from license profile
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent a6e1b14 commit c6f0073

3 files changed

Lines changed: 56 additions & 7 deletions

File tree

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 = all([
1009+
not self.usage_policy,
1010+
self.license_profile,
1011+
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"]

0 commit comments

Comments
 (0)