refactor of license django model #119

This commit is contained in:
Liam Brydon
2025-11-10 14:51:44 +13:00
parent e26d5a21e3
commit 42b1e77fb9
7 changed files with 45 additions and 25 deletions

View File

@ -20,7 +20,7 @@ from .models import (
Setting, Setting,
ExternalDatabase, ExternalDatabase,
ExternalIdentifier, ExternalIdentifier,
JobLog, JobLog, License,
) )
@ -62,6 +62,10 @@ class EnviFormerAdmin(EPAdmin):
pass pass
class LicenseAdmin(admin.ModelAdmin):
list_display = ["cc_string", "link", "image_link"]
class CompoundAdmin(EPAdmin): class CompoundAdmin(EPAdmin):
pass pass
@ -118,6 +122,7 @@ admin.site.register(JobLog, JobLogAdmin)
admin.site.register(Package, PackageAdmin) admin.site.register(Package, PackageAdmin)
admin.site.register(MLRelativeReasoning, MLRelativeReasoningAdmin) admin.site.register(MLRelativeReasoning, MLRelativeReasoningAdmin)
admin.site.register(EnviFormer, EnviFormerAdmin) admin.site.register(EnviFormer, EnviFormerAdmin)
admin.site.register(License, LicenseAdmin)
admin.site.register(Compound, CompoundAdmin) admin.site.register(Compound, CompoundAdmin)
admin.site.register(CompoundStructure, CompoundStructureAdmin) admin.site.register(CompoundStructure, CompoundStructureAdmin)
admin.site.register(SimpleAmbitRule, SimpleAmbitRuleAdmin) admin.site.register(SimpleAmbitRule, SimpleAmbitRuleAdmin)

View File

@ -11,11 +11,14 @@ from epdb.models import (
EnviFormer, EnviFormer,
Permission, Permission,
User, User,
ExternalDatabase, ExternalDatabase, License,
) )
class Command(BaseCommand): class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("-ol", "--only-licenses", action="store_true", help="Only create licenses.")
def create_users(self): def create_users(self):
# Anonymous User # Anonymous User
if not User.objects.filter(email="anon@envipath.com").exists(): if not User.objects.filter(email="anon@envipath.com").exists():
@ -83,6 +86,16 @@ class Command(BaseCommand):
return anon, admin, g, user0 return anon, admin, g, user0
def create_licenses(self):
"""Create the six default licenses supported by enviPath"""
cc_strings = ["by", "by-nc", "by-nc-nd", "by-nc-sa", "by-nd", "by-sa"]
for cc_string in cc_strings:
new_license = License()
new_license.cc_string = cc_string
new_license.link = f"https://creativecommons.org/licenses/{cc_string}/4.0/"
new_license.image_link = f"https://licensebuttons.net/l/{cc_string}/4.0/88x31.png"
new_license.save()
def import_package(self, data, owner): def import_package(self, data, owner):
return PackageManager.import_legacy_package( return PackageManager.import_legacy_package(
data, owner, keep_ids=True, add_import_timestamp=False, trust_reviewed=True data, owner, keep_ids=True, add_import_timestamp=False, trust_reviewed=True
@ -158,6 +171,9 @@ class Command(BaseCommand):
@transaction.atomic @transaction.atomic
def handle(self, *args, **options): def handle(self, *args, **options):
# Create users # Create users
self.create_licenses()
if options.get("only_licenses", False):
return
anon, admin, g, user0 = self.create_users() anon, admin, g, user0 = self.create_users()
self.populate_common_external_databases() self.populate_common_external_databases()

View File

@ -648,6 +648,7 @@ class ScenarioMixin(models.Model):
class License(models.Model): class License(models.Model):
cc_string = models.TextField(blank=False, null=False, verbose_name="CC string")
link = models.URLField(blank=False, null=False, verbose_name="link") link = models.URLField(blank=False, null=False, verbose_name="link")
image_link = models.URLField(blank=False, null=False, verbose_name="Image link") image_link = models.URLField(blank=False, null=False, verbose_name="Image link")

View File

@ -1047,9 +1047,7 @@ def package(request, package_uuid):
write = request.POST.get("write") == "on" write = request.POST.get("write") == "on"
owner = request.POST.get("owner") == "on" owner = request.POST.get("owner") == "on"
license = request.POST.get("license") cc_string = request.POST.get("license")
license_link = request.POST.get("license-link")
license_image_link = request.POST.get("license-image-link")
if new_package_name: if new_package_name:
current_package.name = new_package_name current_package.name = new_package_name
@ -1077,24 +1075,13 @@ def package(request, package_uuid):
PackageManager.update_permissions(current_user, current_package, grantee, max_perm) PackageManager.update_permissions(current_user, current_package, grantee, max_perm)
return redirect(current_package.url) return redirect(current_package.url)
elif license is not None: elif cc_string is not None:
if license == "no-license": if cc_string == "no-license":
if current_package.license is not None:
current_package.license.delete()
current_package.license = None current_package.license = None
current_package.save() current_package.save()
return redirect(current_package.url) return redirect(current_package.url)
else: else:
if current_package.license is not None: current_package.license = License.objects.get(cc_string=cc_string)
current_package.license.delete()
license = License()
license.link = license_link
license.image_link = license_image_link
license.save()
current_package.license = license
current_package.save() current_package.save()
return redirect(current_package.url) return redirect(current_package.url)

View File

@ -52,8 +52,6 @@
</div> </div>
</div> </div>
<input type="hidden" id="license" name="license"> <input type="hidden" id="license" name="license">
<input type="hidden" id="license-link" name="license-link">
<input type="hidden" id="license-image-link" name="license-image-link">
</form> </form>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
@ -128,8 +126,6 @@ function cc() {
$('#ccfig').append(img_tpl); $('#ccfig').append(img_tpl);
$('#license').val(ccstr); $('#license').val(ccstr);
$('#license-link').val(link);
$('#license-image-link').val(imageLink);
} else { } else {
$('#ccfig').empty(); $('#ccfig').empty();
$('#set_license_form_submit').prop('disabled', true); $('#set_license_form_submit').prop('disabled', true);

View File

@ -4,7 +4,7 @@ from django.test import TestCase, tag
from django.urls import reverse from django.urls import reverse
from epdb.logic import UserManager from epdb.logic import UserManager
from epdb.models import Package, UserPackagePermission, Permission, GroupPackagePermission, Group from epdb.models import Package, UserPackagePermission, Permission, GroupPackagePermission, Group, License
class PackageViewTest(TestCase): class PackageViewTest(TestCase):
@ -30,6 +30,14 @@ class PackageViewTest(TestCase):
is_active=True, is_active=True,
) )
cc_strings = ["by", "by-nc", "by-nc-nd", "by-nc-sa", "by-nd", "by-sa"]
for cc_string in cc_strings:
new_license = License()
new_license.cc_string = cc_string
new_license.link = f"https://creativecommons.org/licenses/{cc_string}/4.0/"
new_license.image_link = f"https://licensebuttons.net/l/{cc_string}/4.0/88x31.png"
new_license.save()
def setUp(self): def setUp(self):
self.client.force_login(self.user1) self.client.force_login(self.user1)
@ -188,7 +196,13 @@ class PackageViewTest(TestCase):
self.client.post(package_url, {"license": "no-license"}) self.client.post(package_url, {"license": "no-license"})
self.assertIsNone(p.license) self.assertIsNone(p.license)
# TODO test others
cc_strings = ["by", "by-nc", "by-nc-nd", "by-nc-sa", "by-nd", "by-sa"]
for cc_string in cc_strings:
self.client.post(package_url, {"license": cc_string})
# Without this, the instance of p doesn't have the license. However, the one retrieved with get does
p = Package.objects.get(url=package_url)
self.assertEqual(p.license.link, f"https://creativecommons.org/licenses/{cc_string}/4.0/")
def test_delete_package(self): def test_delete_package(self):
response = self.client.post( response = self.client.post(

View File

@ -714,6 +714,7 @@ class PackageImporter:
license_obj, _ = License.objects.get_or_create( license_obj, _ = License.objects.get_or_create(
name=license_data["name"], name=license_data["name"],
defaults={ defaults={
"cc_string": license_data.get("cc_string", ""),
"link": license_data.get("link", ""), "link": license_data.get("link", ""),
"image_link": license_data.get("image_link", ""), "image_link": license_data.get("image_link", ""),
}, },