Skip to content

Commit ada3c1b

Browse files
authored
Merge pull request #560 from Lexpedite/project_slug
Project slug
2 parents 29a4c70 + f0b817e commit ada3c1b

19 files changed

Lines changed: 193 additions & 125 deletions

CHANGELOG.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,20 @@ As of v0.2-alpha, this project is attempting to adhere to [Semantic Versioning](
77
While alpha, however, any version may include breaking changes that may not be specifically noted as such,
88
and breaking changes will not necessarily result in changes to the main version number.
99

10+
11+
## [v1.6.16-alpha](https://github.com/Lexpedite/blawx/releases/tag/v1.6.16-alpha) 2023-06-26
12+
13+
`.blawx` files created in previous versions will work with this version, but **please note that the majority of URLs are now different**.
14+
15+
### Added
16+
* Projects now have a path slug based on their name, which must be unique per user. The slug can be changed in the admin interface.
17+
18+
### Changed
19+
* All URLS that previously began with `/{rule_id}/` now start with `/{owner}/{rule_slug}/`
20+
For example `/1/test/who_won` would now be `/jason/rock-paper-scissors-act/test/who_won`.
21+
This is intended to give some predictability to the location of the API endpoints for a loaded `.blawx` file to simplify development using
22+
Blawx as a legal reasoner.
23+
1024
## [v1.6.15-alpha](https://github.com/Lexpedite/blawx/releases/tag/v1.6.15-alpha) 2023-05-23
1125

1226
### Added
@@ -15,9 +29,6 @@ and breaking changes will not necessarily result in changes to the main version
1529
### Changed
1630
* Disclaimer has been added to the GCWeb styled version of the scenario editor.
1731

18-
### TODO
19-
* Update the documentation for the scenario editor.
20-
2132
## [v1.6.14-alpha](https://github.com/Lexpedite/blawx/releases/tag/v1.6.14-alpha) 2023-05-12
2233

2334
### Added

blawx/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class WorkspaceAdmin(GuardedModelAdmin):
99
fields = ['ruledoc','workspace_name','xml_content','scasp_encoding']
1010

1111
class RuleDocAdmin(GuardedModelAdmin):
12-
fields = ['ruledoc_name','scasp_encoding','tutorial','akoma_ntoso','rule_text','navtree','owner','published']
12+
fields = ['ruledoc_name','rule_slug','scasp_encoding','tutorial','akoma_ntoso','rule_text','navtree','owner','published']
1313

1414
class BlawxTestAdmin(GuardedModelAdmin):
1515
fields = ['ruledoc','test_name','xml_content','scasp_encoding', 'tutorial', 'view', 'fact_scenario']

blawx/models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66
from cobalt.hierarchical import Act
77
from clean.clean import generate_akn
88
from preferences.models import Preferences
9+
from django.utils.text import slugify
910

1011
# Create your models here.
1112
class RuleDoc(models.Model):
1213
ruledoc_name = models.CharField(max_length=200)
1314
rule_text = models.TextField(default="Default Act")
15+
rule_slug = models.TextField()
1416
akoma_ntoso = models.TextField(default="",blank=True)
1517
navtree = models.TextField(default="",blank=True)
1618
scasp_encoding = models.TextField(default="",blank=True)
@@ -22,6 +24,9 @@ def __str__(self):
2224
return self.ruledoc_name
2325

2426
class Meta:
27+
constraints = [
28+
models.UniqueConstraint(fields=['rule_slug','owner'],name='unique_owner_and_rule_slug')
29+
]
2530
permissions = [
2631
('add_blawxtest_to_ruledoc', 'Can add Test to RuleDoc'),
2732
('add_workspace_to_ruledoc', 'Can add Workspace to RuleDoc'),
@@ -31,6 +36,7 @@ class Meta:
3136
def update_an_nav(sender, instance, **kwargs):
3237
instance.akoma_ntoso = generate_akn(instance.rule_text)
3338
instance.navtree = generate_tree(Act(instance.akoma_ntoso).act)
39+
instance.rule_slug = slugify(instance.ruledoc_name)
3440

3541
class Workspace(models.Model):
3642
ruledoc = models.ForeignKey(RuleDoc, related_name='workspaces', on_delete=models.CASCADE)

blawx/reasoner.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.http import Http404, HttpResponseNotFound, HttpResponseForbidden
2+
from django.contrib.auth.models import User
23

34
from rest_framework.decorators import api_view, permission_classes, authentication_classes
45
from rest_framework.response import Response
@@ -85,9 +86,9 @@ def convertVariables(param):
8586
else:
8687
return param
8788

88-
def even_newer_json_2_scasp(payload,ruledoc,testname):
89+
def even_newer_json_2_scasp(payload,user,rule,testname):
8990
output = ""
90-
ontology = get_ontology_internal(ruledoc,testname)
91+
ontology = get_ontology_internal(user,rule,testname)
9192
# Basically, we need to know what the predicate is, what the parameters are, whether the parameters have category types, and if they are variables.
9293
# So get the predicate, look up the typing, modify for negation if required, and generate the fact, testing for categories if required.
9394

@@ -469,17 +470,18 @@ def format_statement_value(value,attribute_type):
469470
@api_view(['POST'])
470471
@authentication_classes([SessionAuthentication])
471472
@permission_classes([AllowAny])
472-
def run_test(request,ruledoc,test_name):
473+
def run_test(request,user,rule,test_name):
473474
# Get the data (test, facts, and workspaces)
474475
# ruledoctest = RuleDoc.objects.filter(pk=ruledoc,owner=request.user)
475-
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(pk=ruledoc),test_name=test_name)
476+
owner = User.objects.get(username=user)
477+
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner),test_name=test_name)
476478
if request.user.has_perm('blawx.run',test):
477479
translated_facts = ""
478480
if request.data:
479-
translated_facts = even_newer_json_2_scasp(request.data,ruledoc,test_name)
481+
translated_facts = even_newer_json_2_scasp(request.data,user,rule,test_name)
480482
# print("Facts Generated for Run Request:\n")
481483
# print(translated_facts)
482-
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(pk=ruledoc))
484+
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner))
483485
ruleset = ""
484486
# for ws in wss:
485487
# ruleset += "\n\n" + ws.scasp_encoding
@@ -633,9 +635,10 @@ def run_test(request,ruledoc,test_name):
633635
else:
634636
return HttpResponseForbidden()
635637

636-
def get_ontology_internal(ruledoc,test_name):
637-
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(pk=ruledoc))
638-
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(pk=ruledoc),test_name=test_name)
638+
def get_ontology_internal(user,rule,test_name):
639+
owner = User.objects.get(username=user)
640+
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner))
641+
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner),test_name=test_name)
639642
ruleset = ""
640643
for ws in wss:
641644
ruleset += "\n\n" + ws.scasp_encoding
@@ -1011,11 +1014,12 @@ def get_ontology_internal(ruledoc,test_name):
10111014
@api_view(['GET'])
10121015
@authentication_classes([SessionAuthentication])
10131016
@permission_classes([IsAuthenticatedOrReadOnly])
1014-
def get_ontology(request,ruledoc,test_name):
1015-
ruledoctest = RuleDoc.objects.get(pk=ruledoc)
1017+
def get_ontology(request,user,rule,test_name):
1018+
owner = User.objects.get(username=user)
1019+
ruledoctest = RuleDoc.objects.get(rule_slug=rule,owner=owner)
10161020
if request.user.has_perm('blawx.view_ruledoc',ruledoctest):
1017-
test = BlawxTest.objects.get(ruledoc=ruledoc,test_name=test_name)
1018-
result = get_ontology_internal(ruledoc,test_name)
1021+
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner),test_name=test_name)
1022+
result = get_ontology_internal(user,rule,test_name)
10191023
if test.view == "":
10201024
result['View'] = test.view
10211025
else:
@@ -1041,9 +1045,10 @@ def simplify_rule(rule):
10411045
@api_view(['POST'])
10421046
@authentication_classes([SessionAuthentication])
10431047
@permission_classes([AllowAny])
1044-
def interview(request,ruledoc,test_name):
1048+
def interview(request,user,rule,test_name):
10451049
#print("Dealing with interview request.\n")
1046-
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(pk=ruledoc),test_name=test_name)
1050+
owner = User.objects.get(username=user)
1051+
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner),test_name=test_name)
10471052
if request.user.has_perm('blawx.run',test):
10481053

10491054

@@ -1167,10 +1172,11 @@ def interview(request,ruledoc,test_name):
11671172
# Effectively, we're going to start over.
11681173
translated_facts = ""
11691174
if request.data:
1170-
translated_facts = even_newer_json_2_scasp(request.data, ruledoc, test_name) #Generate answers INCLUDING assumptions in the submitted data
1175+
translated_facts = even_newer_json_2_scasp(request.data, user, rule, test_name) #Generate answers INCLUDING assumptions in the submitted data
11711176

1172-
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(pk=ruledoc))
1173-
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(pk=ruledoc),test_name=test_name)
1177+
owner = User.objects.get(username=user)
1178+
wss = Workspace.objects.filter(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner))
1179+
test = BlawxTest.objects.get(ruledoc=RuleDoc.objects.get(rule_slug=rule,owner=owner),test_name=test_name)
11741180
ruleset = ""
11751181
unique_rules = []
11761182
for ws in wss:

blawx/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from pathlib import Path
1414

1515
# For adding a version identifier
16-
BLAWX_VERSION = "v1.6.15-alpha"
16+
BLAWX_VERSION = "v1.6.16-alpha"
1717

1818

1919
# Build paths inside the project like this: BASE_DIR / 'subdir'.

blawx/templates/blawx/blawx.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<nav aria-label="breadcrumb">
1212
<ol class="breadcrumb">
1313
<li class="breadcrumb-item"><i class="bi bi-house pe-2"></i><a href="/">Home</a></li>
14-
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' ruledoc.id %}">{{ ruledoc.ruledoc_name }}</a></li>
14+
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' ruledoc.owner ruledoc.rule_slug %}">{{ ruledoc.ruledoc_name }}</a></li>
1515
<li class="breadcrumb-item">
1616
<a class="dropdown-toggle" data-bs-toggle="collapse" href="#ruleNav" role="button"
1717
aria-expanded="false" aria-controls="ruleNav">

blawx/templates/blawx/blawxtest_confirm_delete.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<nav aria-label="breadcrumb">
55
<ol class="breadcrumb">
66
<li class="breadcrumb-item"><i class="bi bi-house pe-2"></i><a href="/">Home</a></li>
7-
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' blawxtest.ruledoc.id %}">{{ blawxtest.ruledoc.ruledoc_name }}</a></li>
8-
<li class="breadcrumb-item"><i class="bi bi-clipboard-check pe-2"></i><a href="{% url 'test' blawxtest.ruledoc.id blawxtest.test_name%}">{{ blawxtest.test_name }}</a></li>
7+
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' blawxtest.ruledoc.owner blawxtest.ruledoc.rule_slug %}">{{ blawxtest.ruledoc.ruledoc_name }}</a></li>
8+
<li class="breadcrumb-item"><i class="bi bi-clipboard-check pe-2"></i><a href="{% url 'test' blawxtest.ruledoc.owner blawxtest.ruledoc.rule_slug blawxtest.test_name%}">{{ blawxtest.test_name }}</a></li>
99
<li class="breadcrumb-item"><i class="bi bi-pencil-square pe-2"></i>Test Confirm Delete</li>
1010
</ul>
1111
</nav>

blawx/templates/blawx/blawxtest_form.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<nav aria-label="breadcrumb">
55
<ol class="breadcrumb">
66
<li class="breadcrumb-item"><i class="bi bi-house pe-2"></i><a href="/">Home</a></li>
7-
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' ruledoc.id %}">{{ ruledoc.ruledoc_name }}</a></li>
7+
<li class="breadcrumb-item"><i class="bi bi-journal pe-2"></i><a href="{% url 'ruledoc' ruledoc.owner ruledoc.rule_slug %}">{{ ruledoc.ruledoc_name }}</a></li>
88
<li class="breadcrumb-item"><i class="bi bi-clipboard-check pe-2"></i>New Test</li>
99
</ul>
1010
</nav>

blawx/templates/blawx/bot.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113
</svg>
114114
<span class="text">Help</span>
115115
</a>
116-
<a href="{% url 'test' blawxtest.ruledoc.id blawxtest %}" class="btn btn-secondary">
116+
<a href="{% url 'test' blawxtest.ruledoc.owner blawxtest.ruledoc.rule_slug blawxtest %}" class="btn btn-secondary">
117117
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
118118
class="bi bi-x-square" viewBox="0 0 16 16">
119119
<path
@@ -532,7 +532,7 @@ <h5 class="card-title">Test Facts</h5>
532532
return;
533533
}
534534
}
535-
interview_request.open("POST", "{% url 'test_interview' blawxtest.ruledoc.id blawxtest %}");
535+
interview_request.open("POST", "{% url 'test_interview' blawxtest.ruledoc.owner blawxtest.ruledoc.rule_slug blawxtest %}");
536536
interview_request.setRequestHeader("Content-Type", "application/json");
537537
console.log("Sending interview request")
538538
interview_request.setRequestHeader('X-CSRFToken', csrftoken);
@@ -686,7 +686,7 @@ <h5 class="card-title">Test Facts</h5>
686686
test_fact_element.innerHTML = output_html;
687687

688688
}
689-
ontology_request.open("GET", "{% url 'test_onto' blawxtest.ruledoc.id blawxtest %}", false); // This is asynchronous because the interview request doesn't work until we have the ontology.
689+
ontology_request.open("GET", "{% url 'test_onto' blawxtest.ruledoc.owner blawxtest.ruledoc.rule_slug blawxtest %}", false); // This is asynchronous because the interview request doesn't work until we have the ontology.
690690
ontology_request.setRequestHeader('X-CSRFToken', csrftoken);
691691
ontology_request.send();
692692

blawx/templates/blawx/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ <h3>Your Projects</h3>
7272
<ul>
7373
{% for ruledoc in ruledoc_list %}
7474
{% if user == ruledoc.owner %}
75-
<li><a href="{% url 'ruledoc' ruledoc.id %}">{{ ruledoc.ruledoc_name }}</a></li>
75+
<li><a href="{% url 'ruledoc' ruledoc.owner ruledoc.rule_slug %}">{{ ruledoc.ruledoc_name }}</a></li>
7676
{% endif %}
7777
{% endfor %}
7878
</ul>
@@ -83,7 +83,7 @@ <h3>Published Projects</h3>
8383
{% for ruledoc in ruledoc_list %}
8484
{% get_obj_perms request.user for ruledoc as "ruledoc_perms" %}
8585
{% if user != ruledoc.owner and ruledoc.published and 'view_ruledoc' in ruledoc_perms %}
86-
<li><a href="{% url 'ruledoc' ruledoc.id %}">{{ ruledoc.ruledoc_name }}</a></li>
86+
<li><a href="{% url 'ruledoc' ruledoc.owner ruledoc.rule_slug %}">{{ ruledoc.ruledoc_name }}</a></li>
8787
{% endif %}
8888
{% endfor %}
8989
</ul>

0 commit comments

Comments
 (0)