Commit e4ff295f authored by Thodoris Nestoridis's avatar Thodoris Nestoridis

New inference proccess 1.4.2

parent a80c458d
...@@ -10,11 +10,20 @@ ...@@ -10,11 +10,20 @@
</nav> </nav>
<mat-grid-list cols="2"> <mat-grid-list cols="2">
<div class="first"> <div class="first">
<div *ngIf="get_metrics(currentboilerplate.title)" style="margin-right: 50px;width: 90%;" <div *ngIf="get_metrics(currentboilerplate.title)"
class="alert alert-warning" role="alert"> style="display:flex; flex-direction: row; align-items: center;margin-bottom: 50px;">
<p [innerHTML]="getinferdata()"></p> <mat-accordion>
<mat-expansion-panel *ngFor="let msection of mes_list" class="alert alert-warning" role="alert">
<mat-expansion-panel-header>
<mat-panel-title [innerHTML]='msection.Description'>
</mat-panel-title>
</mat-expansion-panel-header>
<p [innerHTML]=msection.Title></p>
<p [innerHTML]='msection.Info'></p>
</mat-expansion-panel>
</mat-accordion>
</div> </div>
<div *ngIf="currentboilerplate.id" class="edit-form"> <div *ngIf=" currentboilerplate.id" class="edit-form">
<form ngNativeValidate> <form ngNativeValidate>
<div class="form-group" style="display:flex; flex-direction: row; align-items: center"> <div class="form-group" style="display:flex; flex-direction: row; align-items: center">
<label for="title" style="margin-right: 50px;">Requirement title</label> <label for="title" style="margin-right: 50px;">Requirement title</label>
...@@ -138,7 +147,12 @@ ...@@ -138,7 +147,12 @@
{{instan.Instance}} {{instan.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p>{{instan.Comment}}</p> <div fxLayout="column">
<p fxFlex fxHide.xs>{{instan.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button"
value="Delete Instance"
(click)="deleteInstance(section.Name , item.Class, '', '', '', '', instan.Instance, instan.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
</div> </div>
...@@ -205,8 +219,14 @@ ...@@ -205,8 +219,14 @@
<mat-panel-title> <mat-panel-title>
{{ subsubsubsubinstansub.Instance}} {{ subsubsubsubinstansub.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p>{{subsubsubsubinstansub.Comment}}</p> <div fxLayout="column">
<p fxFlex fxHide.xs>{{subsubsubsubinstansub.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button"
value="Delete Instance"
(click)="deleteInstance(section.Name , item.Class, sub.SubClass_name, subsub.SubSubClass_name , subsubsub.SubSubClass_name, subsubsubsub.SubSubClass_name, subsubsubsubinstansub.Instance, subsubsubsubinstansub.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
</div> </div>
...@@ -227,7 +247,12 @@ ...@@ -227,7 +247,12 @@
{{ subsubsubinstansub.Instance}} {{ subsubsubinstansub.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p>{{subsubsubinstansub.Comment}}</p> <div fxLayout="column">
<p fxFlex fxHide.xs>{{subsubsubinstansub.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button"
value="Delete Instance"
(click)="deleteInstance(section.Name , item.Class, sub.SubClass_name, subsub.SubSubClass_name , subsubsub.SubSubClass_name, '', subsubsubinstansub.Instance, subsubsubinstansub.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
</div> </div>
...@@ -248,7 +273,12 @@ ...@@ -248,7 +273,12 @@
{{ subsubinstansub.Instance}} {{ subsubinstansub.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p>{{subsubinstansub.Comment}}</p> <div fxLayout="column">
<p fxFlex fxHide.xs>{{subsubinstansub.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button"
value="Delete Instance"
(click)="deleteInstance(section.Name , item.Class, sub.SubClass_name, subsub.SubSubClass_name , '', '', subsubinstansub.Instance, subsubinstansub.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
</div> </div>
...@@ -270,7 +300,12 @@ ...@@ -270,7 +300,12 @@
{{ instansub.Instance}} {{ instansub.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
<p>{{instansub.Comment}}</p> <div fxLayout="column">
<p fxFlex fxHide.xs>{{instansub.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button"
value="Delete Instance"
(click)="deleteInstance(section.Name , item.Class, sub.SubClass_name, '', '', '', instansub.Instance, instansub.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
...@@ -297,7 +332,11 @@ ...@@ -297,7 +332,11 @@
{{genin.Instance}} {{genin.Instance}}
</mat-panel-title> </mat-panel-title>
</mat-expansion-panel-header> </mat-expansion-panel-header>
{{genin.Comment}} <div fxLayout="column">
<p fxFlex fxHide.xs> {{genin.Comment}}</p>
<input fxFlex fxHide.xs fxLayoutAlign="start" class="btn btn-warning" type="button" value="Delete Instance"
(click)="deleteInstance(section.Name , '', '', '' , '', '', genin.Instance, genin.Comment)" />
</div>
</mat-expansion-panel> </mat-expansion-panel>
</li> </li>
</div> </div>
......
...@@ -135,9 +135,9 @@ export class MainDetailsComponent implements OnInit { ...@@ -135,9 +135,9 @@ export class MainDetailsComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.getAllMain(this.route.snapshot.params.id);
this.getchoices(); this.getchoices();
this.getmainchoices(this.route.snapshot.params.gb); this.getmainchoices(this.route.snapshot.params.gb);
this.getAllMain(this.route.snapshot.params.id);
} }
ngDoCheck() { ngDoCheck() {
......
...@@ -169,4 +169,8 @@ export class MainService { ...@@ -169,4 +169,8 @@ export class MainService {
setinstances(gb : any, instance: any, comment:any): Observable<any> { setinstances(gb : any, instance: any, comment:any): Observable<any> {
return this.http.get(`${baseUrl2}${gb}`+`/main/choices/add`+`/${instance}`+`/${comment}/`); return this.http.get(`${baseUrl2}${gb}`+`/main/choices/add`+`/${instance}`+`/${comment}/`);
} }
deleteinstances(gb : any, instance: any, comment:any): Observable<any> {
return this.http.get(`${baseUrl2}${gb}`+`/main/choices/delete`+`/${instance}`+`/${comment}/`);
}
} }
...@@ -121,21 +121,21 @@ class Main(models.Model): ...@@ -121,21 +121,21 @@ class Main(models.Model):
boilerplate_of_main = models.ForeignKey('reqtool.Boilerplate', related_name='main_boilerplate', on_delete=models.CASCADE) boilerplate_of_main = models.ForeignKey('reqtool.Boilerplate', related_name='main_boilerplate', on_delete=models.CASCADE)
main_owner = models.ForeignKey(User, related_name='main_owner', on_delete=models.CASCADE) main_owner = models.ForeignKey(User, related_name='main_owner', on_delete=models.CASCADE)
#Subject #Subject
sys_fun_inter = models.CharField(max_length=100) sys_fun_inter = models.CharField(max_length=1000)
#Between Subject - Verb #Between Subject - Verb
state_item_before_verb = models.CharField(max_length=100, blank=True) state_item_before_verb = models.CharField(max_length=1000, blank=True)
statevalue_before_verb = models.CharField(max_length=100, blank=True) statevalue_before_verb = models.CharField(max_length=1000, blank=True)
#Verb #Verb
shall = models.CharField(max_length=100) shall = models.CharField(max_length=1000)
verb = models.CharField(max_length=100) verb = models.CharField(max_length=1000)
#Between Verb - Object #Between Verb - Object
quantifier = models.CharField(max_length=100, blank=True) quantifier = models.CharField(max_length=1000, blank=True)
numerical = models.CharField(blank=True, null=True, max_length=10) numerical = models.CharField(blank=True, null=True, max_length=1000)
mumerical_units = models.CharField(max_length=100, blank=True) mumerical_units = models.CharField(max_length=1000, blank=True)
#Οbject #Οbject
flow_function_interface_item_system_state_stateset = models.CharField( max_length=100) flow_function_interface_item_system_state_stateset = models.CharField( max_length=1000)
#last definitions #last definitions
statevalue_system_connection_stateset = models.CharField(max_length=100, blank=True) statevalue_system_connection_stateset = models.CharField(max_length=1000, blank=True)
#ID [M1-M16] #ID [M1-M16]
main_choices = models.CharField(max_length=100, blank=True) main_choices = models.CharField(max_length=100, blank=True)
......
...@@ -158,7 +158,7 @@ class Boilerplate(models.Model): ...@@ -158,7 +158,7 @@ class Boilerplate(models.Model):
owner = models.ForeignKey(User, related_name='boilerplate', on_delete=models.CASCADE) owner = models.ForeignKey(User, related_name='boilerplate', on_delete=models.CASCADE)
group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='owner_of_boilerplate', on_delete=models.CASCADE) group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='owner_of_boilerplate', on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=30, unique=True) title = models.CharField(max_length=300, unique=True)
has_prefix = models.BooleanField(default=False) has_prefix = models.BooleanField(default=False)
has_main = models.BooleanField(default=False) has_main = models.BooleanField(default=False)
has_suffix = models.BooleanField(default=False) has_suffix = models.BooleanField(default=False)
...@@ -212,18 +212,18 @@ class PrefixGroup(models.Model): ...@@ -212,18 +212,18 @@ class PrefixGroup(models.Model):
class Prefix(models.Model): class Prefix(models.Model):
prefixgroup = models.ForeignKey(PrefixGroup, related_name='prefix', on_delete=models.CASCADE) prefixgroup = models.ForeignKey(PrefixGroup, related_name='prefix', on_delete=models.CASCADE)
prefix_boilerplate = models.ForeignKey(Boilerplate, related_name='prefix_boilerplate', on_delete=models.CASCADE) prefix_boilerplate = models.ForeignKey(Boilerplate, related_name='prefix_boilerplate', on_delete=models.CASCADE)
prefix = models.CharField(max_length=100) prefix = models.CharField(max_length=1000)
#state value constraint #state value constraint
system_fun_item = models.CharField(max_length=100) system_fun_item = models.CharField(max_length=1000)
state_or_verb = models.CharField(max_length=100) state_or_verb = models.CharField(max_length=1000)
#occuring functionality #occuring functionality
item_function_flow_statevalue = models.CharField(max_length=100) item_function_flow_statevalue = models.CharField(max_length=1000)
#state value constraint OR occuring functionality #state value constraint OR occuring functionality
logical_expression = models.CharField(max_length=100, blank=True) logical_expression = models.CharField(max_length=1000, blank=True)
#Logic connectivity Prefix1 (and/or/xor) Prefix2 #Logic connectivity Prefix1 (and/or/xor) Prefix2
logic_connective = models.CharField(max_length=100, blank=True) logic_connective = models.CharField(max_length=1000, blank=True)
#Prefix value P1/P2/P3 #Prefix value P1/P2/P3
simple_prefix = models.CharField(max_length=100, blank=True) simple_prefix = models.CharField(max_length=1000, blank=True)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
...@@ -265,7 +265,7 @@ class BoilerplateData(models.Model): ...@@ -265,7 +265,7 @@ class BoilerplateData(models.Model):
class InferenceResults(models.Model): class InferenceResults(models.Model):
owner_infer = models.ForeignKey(User, related_name='owner_infer', on_delete=models.CASCADE) owner_infer = models.ForeignKey(User, related_name='owner_infer', on_delete=models.CASCADE)
infer_group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='infer_owner_of_boilerplate', on_delete=models.CASCADE) infer_group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='infer_owner_of_boilerplate', on_delete=models.CASCADE)
ontology_file = models.CharField(max_length=100, blank=True) ontology_file = models.CharField(max_length=1000, blank=True)
inference_data = models.CharField(default="", max_length=1000000, blank=True) inference_data = models.CharField(default="", max_length=1000000, blank=True)
def save(self, **kwargs): def save(self, **kwargs):
...@@ -280,7 +280,7 @@ class InferenceResults(models.Model): ...@@ -280,7 +280,7 @@ class InferenceResults(models.Model):
class BoilerplateGroupClassesInstances(models.Model): class BoilerplateGroupClassesInstances(models.Model):
classes_instances_group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='classes_instances_owner_of_boilerplate', on_delete=models.CASCADE) classes_instances_group_of_boilerplate = models.ForeignKey(BoilerplateGroup, related_name='classes_instances_owner_of_boilerplate', on_delete=models.CASCADE)
classes_instances_owner = models.ForeignKey(User, related_name='classes_instances_owner', on_delete=models.CASCADE) classes_instances_owner = models.ForeignKey(User, related_name='classes_instances_owner', on_delete=models.CASCADE)
ontology_file = models.CharField(default="", max_length=100, blank=True) ontology_file = models.CharField(default="", max_length=1000, blank=True)
prefix_choices = JSONField() prefix_choices = JSONField()
prefix_logcon_choices = JSONField() prefix_logcon_choices = JSONField()
prefix_verb_choices = JSONField() prefix_verb_choices = JSONField()
...@@ -306,5 +306,5 @@ class BoilerplateGroupClassesInstances(models.Model): ...@@ -306,5 +306,5 @@ class BoilerplateGroupClassesInstances(models.Model):
class BoilerplateGroupDictionary(models.Model): class BoilerplateGroupDictionary(models.Model):
classes_instances_group_of_boilerplate_dic = models.ForeignKey(BoilerplateGroup, related_name='classes_instances_owner_of_boilerplate_dic', on_delete=models.CASCADE) classes_instances_group_of_boilerplate_dic = models.ForeignKey(BoilerplateGroup, related_name='classes_instances_owner_of_boilerplate_dic', on_delete=models.CASCADE)
classes_instances_owner_dic = models.ForeignKey(User, related_name='classes_instances_owner_dic', on_delete=models.CASCADE) classes_instances_owner_dic = models.ForeignKey(User, related_name='classes_instances_owner_dic', on_delete=models.CASCADE)
ontology_file_dic = models.CharField(default="", max_length=100, blank=True) ontology_file_dic = models.CharField(default="", max_length=1000, blank=True)
Dictionary_Data = JSONField() Dictionary_Data = JSONField()
...@@ -82,10 +82,10 @@ def exportboiltottl(ontfile,project, prefix, boilerplate, main, suffix): ...@@ -82,10 +82,10 @@ def exportboiltottl(ontfile,project, prefix, boilerplate, main, suffix):
g.load('../../Ontologies/'+ontfile, format="turtle") g.load('../../Ontologies/'+ontfile, format="turtle")
else : else :
g.load(ontfile, format="turtle") g.load(ontfile, format="turtle")
print(ontfile) #print(ontfile)
#remove the requirements from the RDO-instances #remove the requirements from the RDO-instances
previous_req = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO-instances#") #previous_req = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO-instances#")
g.remove((previous_req, None, None)) #g.remove((previous_req, None, None))
for i in range(len(boilerplate)): for i in range(len(boilerplate)):
title = boilerplate[i][0]['title'] title = boilerplate[i][0]['title']
g.add((per_instances + title, RDF.type, rdo + 'Requirement')) g.add((per_instances + title, RDF.type, rdo + 'Requirement'))
...@@ -135,7 +135,6 @@ def exportboiltottl(ontfile,project, prefix, boilerplate, main, suffix): ...@@ -135,7 +135,6 @@ def exportboiltottl(ontfile,project, prefix, boilerplate, main, suffix):
if(main[i][0][j] != ""): if(main[i][0][j] != ""):
instance_file, splitter_1 = getinstancefile(main[i][0][j], g) instance_file, splitter_1 = getinstancefile(main[i][0][j], g)
if ( splitter_1[0] =='Item' or splitter_1[0] =='Flow' ): if ( splitter_1[0] =='Item' or splitter_1[0] =='Flow' ):
print(main[i][0][j])
g.add((per_instances+(title+"_"+ main[i][0]['main_choices']), rbo+"isRelatedToTraversingConcept", URIRef(str(instance_file))+"#"+ str(splitter_1[len(splitter_1) -1]))) g.add((per_instances+(title+"_"+ main[i][0]['main_choices']), rbo+"isRelatedToTraversingConcept", URIRef(str(instance_file))+"#"+ str(splitter_1[len(splitter_1) -1])))
else : else :
g.add((per_instances+(title+"_"+ main[i][0]['main_choices']), rbo+"isRelatedTo"+splitter_1[0], URIRef(str(instance_file))+"#"+ str(splitter_1[len(splitter_1) -1]))) g.add((per_instances+(title+"_"+ main[i][0]['main_choices']), rbo+"isRelatedTo"+splitter_1[0], URIRef(str(instance_file))+"#"+ str(splitter_1[len(splitter_1) -1])))
...@@ -254,7 +253,11 @@ def shacl(ontotlogy_file): ...@@ -254,7 +253,11 @@ def shacl(ontotlogy_file):
shutil.copyfile(file1, target) shutil.copyfile(file1, target)
for i in range(3): for i in range(3):
print(i+1, 'Cycle of inferencing') print(i+1, 'Cycle of inferencing')
result = subprocess.check_output(["./reqman/apps/reqtool/rest_api/services/shacl-1.3.2/bin/shaclinfer.sh", "-datafile", target]) #result = subprocess.check_output(["./reqman/apps/reqtool/rest_api/services/shacl-1.3.2/bin/shaclinfer.sh", "-datafile", target])
try:
result = subprocess.check_output("./reqman/apps/reqtool/rest_api/services/shacl-1.4.2/bin/shaclinfer.sh -datafile "+target+" | grep -v -e 'WARN OntDocumentManager' -e 'at org.' -e 'org.apache.' -e '@'",shell=True)
except:
raise APIException("Problem during the Inferencing")
file_object = open(target, 'a') file_object = open(target, 'a')
res = str(result,'utf-8') res = str(result,'utf-8')
file_object.write(res.strip()) file_object.write(res.strip())
...@@ -262,27 +265,49 @@ def shacl(ontotlogy_file): ...@@ -262,27 +265,49 @@ def shacl(ontotlogy_file):
#need to fiil with all the metrics #need to fiil with all the metrics
g = Graph() g = Graph()
gon = Graph()
g.load(target, format="turtle") g.load(target, format="turtle")
gon.load(ontotlogy_file, format="turtle")
req_list=[]
for inf_metr in list_of_inference_metrics: for inf_metr in list_of_inference_metrics:
metrics_dict[inf_metr] = [] metrics_dict[inf_metr] = []
p = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO#"+inf_metr) p = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO#"+inf_metr)
for s, p, o in g.triples((None, RDF.type, p)): for s, p, o in g.triples((None, RDF.type, p)):
#metrics_dict["IncompleteRequirement"] = [s] # e.g IncompleteRequirement': ['Req1', 'Req2']
get_title = str(s).split("#") get_title = str(s).split("#")
if get_title[1] not in req_list:
req_list.append(get_title[1])
metrics_dict[inf_metr].append(get_title[1]) metrics_dict[inf_metr].append(get_title[1])
for inf_metr2 in info_metric: for inf_metr2 in info_metric:
#e.g isMissingOfInstance : ['Comment' : '...', {'Req1':['Instance1']}, {'Req2':['Instance2']}]
metrics_dict[inf_metr2] = [] metrics_dict[inf_metr2] = []
p = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO#"+inf_metr2) p = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO#"+inf_metr2)
req_dict={} req_dict={}
req_dict['Comment'] = "" req_dict['Comment'] = ""
for scom, pcom, ocom in g.triples((p, RDFS.comment, None)): for scom, pcom, ocom in g.triples((p, RDFS.comment, None)):
req_dict['Comment'] = str(ocom) req_dict['Comment'] = str(ocom)
req_dict[get_title[1]]=[] for get_title in req_list:
req_dict[get_title]=[]
s = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO-instances#"+get_title)
p = URIRef("http://delab.csd.auth.gr/ontologies/2018/RDO#"+inf_metr2)
for s1, p1, o1 in g.triples((s, p, None)): for s1, p1, o1 in g.triples((s, p, None)):
get_title2 = str(o1).split("#") get_title2 = str(o1).split("#")
req_dict[get_title[1]].append(get_title2[1]) req_dict[get_title].append(get_title2[1])
req_dict[get_title2[1]]=[]
for s3, p3, o3 in gon.triples((None, None, o1)):
sub=str(s3).split("#")
ver=str(p3).split("#")
obj=str(o3).split("#")
req_dict[get_title2[1]].append(sub[1]+' '+ ver[1]+' '+ obj[1])
for s3, p3, o3 in gon.triples((o1, None, None)):
sub=str(s3).split("#")
ver=str(p3).split("#")
obj=str(o3).split("#")
req_dict[get_title2[1]].append('<i>'+sub[1]+'</i> <u>'+ ver[1]+'</u> <i>'+obj[1]+'</i>')
metrics_dict[inf_metr2].append(req_dict) metrics_dict[inf_metr2].append(req_dict)
print(metrics_dict) #print(metrics_dict)
return(metrics_dict) return(metrics_dict)
......
## Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0
status = error
name = PropertiesConfig
filters = threshold
filter.threshold.type = ThresholdFilter
filter.threshold.level = ALL
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{HH:mm:ss} %-5p %-10c{1} :: %m%n
#appender.console.layout.pattern = [%d{yyyy-MM-dd HH:mm:ss}] %-5p %-10c{1} :: %m%n
rootLogger.level = INFO
rootLogger.appenderRef.stdout.ref = STDOUT
logger.jena.name = org.apache.jena
logger.jena.level = WARN
logger.arq-info.name = org.apache.jena.arq.info
logger.arq-info.level = INFO
logger.riot.name = org.apache.jena.riot
logger.riot.level = INFO
...@@ -35,6 +35,7 @@ urlpatterns = [ ...@@ -35,6 +35,7 @@ urlpatterns = [
#MAIN CHOICES DATA #MAIN CHOICES DATA
path('groupboilerplates/<int:groupboil>/main/choices/', main_req_views.MainChoicesViewSet.as_view(), name='mainchoices'), path('groupboilerplates/<int:groupboil>/main/choices/', main_req_views.MainChoicesViewSet.as_view(), name='mainchoices'),
path('groupboilerplates/<int:groupboil>/main/choices/add/<str:instance>/<str:comment>/', main_req_views.MainChoicesAPIView.as_view(), name='setmainchoices'), path('groupboilerplates/<int:groupboil>/main/choices/add/<str:instance>/<str:comment>/', main_req_views.MainChoicesAPIView.as_view(), name='setmainchoices'),
path('groupboilerplates/<int:groupboil>/main/choices/delete/<str:instance>/<str:comment>/', main_req_views.DeleteMainChoicesAPIView.as_view(), name='deletemainchoices'),
path('main/choices/shall/', main_req_views.ShallChoicesViewSet.as_view(), name='mainshall'), path('main/choices/shall/', main_req_views.ShallChoicesViewSet.as_view(), name='mainshall'),
#SUFFIX CHOICES DATA #SUFFIX CHOICES DATA
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment