From 85ae540f9fbc97f65b58372a134265adad7835ea Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Tue, 12 Jun 2018 10:57:36 -0700 Subject: [PATCH 01/10] testing pull down, added button css --- src/aichat/chatapp/static/chatapp/force.css | 22 +++++++ .../chatapp/templates/chatapp/create.html | 66 ++++++++++++------- .../chatapp/templates/chatapp/index.html | 6 +- 3 files changed, 67 insertions(+), 27 deletions(-) diff --git a/src/aichat/chatapp/static/chatapp/force.css b/src/aichat/chatapp/static/chatapp/force.css index 80d59f8..03ea9a6 100644 --- a/src/aichat/chatapp/static/chatapp/force.css +++ b/src/aichat/chatapp/static/chatapp/force.css @@ -51,4 +51,26 @@ line.link { stroke: #9ecae1; stroke-width: 1.5px; } +.button{ + background-color: #e2e2e2; + border: none; + border-radius: 5px; + color: black; + padding: 7px 15px; + text-align: center; + text-decoration: none; + display: inline-block; + font-size: 12px; +} +.button:hover{ + background-color: #dbdbdb; +} + + +input[type=text] { + border: solid #ebebeb 1px; + border-radius: 4px; + height: 18px; + width: 250px; +} diff --git a/src/aichat/chatapp/templates/chatapp/create.html b/src/aichat/chatapp/templates/chatapp/create.html index dd25cb4..55f177d 100644 --- a/src/aichat/chatapp/templates/chatapp/create.html +++ b/src/aichat/chatapp/templates/chatapp/create.html @@ -1,28 +1,46 @@ {% load static %} - - - - Create new sequences - - - - - - - -

Create new sequence

- {% if error_message %}

{{ error_message }}

{% endif %} - -
- {% csrf_token %} - Source :
- Destination:
- Trigger :
- Response :
- -
- - + + + + Create Response + + + + + + +

Create Response

+ {% if error_message %}

{{ error_message }}

{% endif %} + +
+ {% csrf_token %} + Source :
+ Destination:
+ Trigger :
+ Response :
+ +
+ +
+ + + + + +
+ +

Back

+ \ No newline at end of file diff --git a/src/aichat/chatapp/templates/chatapp/index.html b/src/aichat/chatapp/templates/chatapp/index.html index 7f6827b..6e74e52 100644 --- a/src/aichat/chatapp/templates/chatapp/index.html +++ b/src/aichat/chatapp/templates/chatapp/index.html @@ -25,8 +25,8 @@ stroke-width: 1.5px; } - - + + @@ -38,7 +38,7 @@

Force-Directed Dialog Engine Graph

This visualization uses d3.js by Mike Bostock. -

Create new Sequence

+

Create Response

diff --git a/src/aichat/chatapp/urls.py b/src/aichat/chatapp/urls.py index 6605144..2f96fb7 100644 --- a/src/aichat/chatapp/urls.py +++ b/src/aichat/chatapp/urls.py @@ -1,5 +1,5 @@ from django.urls import path - +from .models import node_autocomplete from . import views app_name = 'chatapp' @@ -7,5 +7,6 @@ path('', views.index, name='index'), path('create/', views.create, name='create'), path('create/save/', views.save_new_sequence, name='save'), - path('network.json', views.network_rest, name='network') + path('network.json', views.network_rest, name='network'), + path(r'^node-autocomplete/$', node_autocomplete.as_view(), name='node_autocomplete') ] diff --git a/src/aichat/chatapp/views.py b/src/aichat/chatapp/views.py index 0bfff8f..d0ea9d6 100644 --- a/src/aichat/chatapp/views.py +++ b/src/aichat/chatapp/views.py @@ -1,5 +1,5 @@ from django.shortcuts import render -from django.http import HttpResponseRedirect, JsonResponse, HttpResponse # noqa +from django.http import HttpResponseRedirect, JsonResponse, HttpResponse # noqa from django.urls import reverse # from django.views import generic from .models import TriggerResponse, get_network From 6b9e384802bfa111b091dbe02e4b7fa1daf08542 Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Wed, 13 Jun 2018 16:47:42 -0700 Subject: [PATCH 04/10] fixed get_network generation of links --- src/aichat/chatapp/models.py | 48 ++++-------------------------------- 1 file changed, 5 insertions(+), 43 deletions(-) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index 6945fb9..37befaa 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -80,46 +80,6 @@ def get_queryset(self): def get_network(qs=None, value=1): - # if qs is None: - # js = { - # "directed": True, - # "multigraph": False, - # "name": "Dialog", - # "nodes": [], - # "links": [] - # } - # nodes = [] - # links = [] - # for obj in TriggerResponse.objects.all(): - # nodes.append(obj.dest_state) - # nodes = list(set(nodes)) - - # node_index = 0 - # for node in nodes: - # js["nodes"].append({'name': node, 'id': 'node' + str(node_index)}) - # node_index = node_index + 1 - - # for i, obj in enumerate(TriggerResponse.objects.all()): - # source_pattern = obj.source_state - # patt = pattern.expand_globstar(source_pattern) - # for j, name in enumerate(nodes): - # if ('{' in patt or '[' in patt) and regex.match(patt, name): - # print(str(j) + source_pattern + ',' + name) - # links.append({'source': nodes.index(name), - # 'target': nodes.index(obj.dest_state), - # 'command': obj.trigger, - # 'response': obj.response, - # 'value': value}) - # elif source_pattern == name: - # print("nonpattern:" + str(j) + source_pattern + ',' + name) - # links.append({'source': nodes.index(name), - # 'target': nodes.index(obj.dest_state), - # 'command': obj.trigger, - # 'response': obj.response, - # 'value': value}) - - # js["links"] = links - if qs is None: # query database for nodes and edges js = { @@ -157,18 +117,20 @@ def get_network(qs=None, value=1): links.append({'source': node_names.index(source_obj.source_state), 'target': node_names.index(current_dest_name), 'command': source_obj.trigger, - 'response': dest_node.response, + 'response': source_obj.response, 'value': value}) else: if not is_globstar(source_obj.dest_state): current_dest_name = source_obj.dest_state + current_trig = source_obj.trigger + current_resp = source_obj.response source_pattern = pattern.expand_globstar(source_obj.source_state) for source_obj_index, source_obj in enumerate(TriggerResponse.objects.all()): if regex.match(source_pattern, source_obj.source_state) and not is_globstar(source_obj.source_state): links.append({'source': node_names.index(source_obj.source_state), 'target': node_names.index(current_dest_name), - 'command': source_obj.trigger, - 'response': source_obj.response, + 'command': current_trig, + 'response': current_resp, 'value': value}) else: source_pattern = pattern.expand_globstar(source_obj.source_state) From 8ae59a9dae0a630d908b1cf2e3f04e4f87f2050b Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Thu, 14 Jun 2018 19:13:05 +0000 Subject: [PATCH 05/10] fixed node_autocomplete to work in web --- src/aichat/chatapp/models.py | 6 +++--- src/aichat/chatapp/urls.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index 37befaa..d4a51ee 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -73,10 +73,10 @@ def __str__(self): class node_autocomplete(autocomplete.Select2QuerySetView): def get_queryset(self): - nodes = TriggerResponse.objects.all() + objects = TriggerResponse.objects.all() if self.q: - nodes = nodes.filter(name__istartswith=self.q) - return nodes + objects = objects.filter(trigger__startswith=self.q) + return objects def get_network(qs=None, value=1): diff --git a/src/aichat/chatapp/urls.py b/src/aichat/chatapp/urls.py index 2f96fb7..eba707c 100644 --- a/src/aichat/chatapp/urls.py +++ b/src/aichat/chatapp/urls.py @@ -8,5 +8,5 @@ path('create/', views.create, name='create'), path('create/save/', views.save_new_sequence, name='save'), path('network.json', views.network_rest, name='network'), - path(r'^node-autocomplete/$', node_autocomplete.as_view(), name='node_autocomplete') + path('node_autocomplete', node_autocomplete.as_view(), name='node_autocomplete') ] From d9807e16cf558aa94a5a7371fb5a4f331ddc0435 Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Thu, 14 Jun 2018 19:29:57 +0000 Subject: [PATCH 06/10] adjusted node_autocomplete to work with list of nodes --- src/aichat/chatapp/models.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index d4a51ee..3886ddb 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -71,12 +71,17 @@ def __str__(self): return self.trigger + ' to ' + self.response -class node_autocomplete(autocomplete.Select2QuerySetView): - def get_queryset(self): - objects = TriggerResponse.objects.all() - if self.q: - objects = objects.filter(trigger__startswith=self.q) - return objects +# class node_autocomplete(autocomplete.Select2QuerySetView): +# def get_queryset(self): +# objects = TriggerResponse.objects.all() +# if self.q: +# objects = objects.filter(source_state__istartswith=self.q) +# return objects +class node_autocomplete(autocomplete.Select2ListView): + def get_list(self): + nodes = get_nodes() + nodes = [node for node in nodes if node.startswith(self.q)] + return nodes def get_network(qs=None, value=1): From 40cb44d8c092658901d04a452fc85200de26511d Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Thu, 14 Jun 2018 19:34:08 +0000 Subject: [PATCH 07/10] fixed node_autocomplete case sensitivity --- src/aichat/chatapp/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index 3886ddb..79d4388 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -80,7 +80,8 @@ def __str__(self): class node_autocomplete(autocomplete.Select2ListView): def get_list(self): nodes = get_nodes() - nodes = [node for node in nodes if node.startswith(self.q)] + nodes = [node for node in nodes if bool(regex.match(self.q, node, regex.I))] + # nodes = [node for node in nodes if node.startswith(self.q)] return nodes From 817165cd25f805fb841d6d2d81c1a15e3f540dee Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Thu, 14 Jun 2018 22:25:21 +0000 Subject: [PATCH 08/10] implemented autocomplete in forms - need to fix create_new when form item is not found --- src/aichat/chatapp/models.py | 20 +++++++++++--- src/aichat/chatapp/static/chatapp/force.css | 4 +-- .../chatapp/templates/chatapp/create.html | 27 +++++-------------- src/aichat/chatapp/views.py | 5 ++-- 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index 79d4388..d5d5ec6 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -1,5 +1,6 @@ from django.db import models from django.db.models import CharField, TextField, NullBooleanField, DateTimeField, IntegerField +from django import forms from aichat import pattern import regex from dal import autocomplete @@ -41,16 +42,30 @@ class Meta: class TriggerResponse(AuthoredModel): - trigger = CharField(max_length=200) - response = TextField() source_state = CharField(max_length=200) dest_state = CharField(max_length=200) + trigger = CharField(max_length=200) + response = TextField() + is_globstar = NullBooleanField(choices=CHOICES_IS_GLOBSTAR, max_length=3, null=True, blank=True, default=None) def __str__(self): return self.source_state + ' to ' + self.dest_state +class TriggerResponseForm(forms.ModelForm): + source_state = autocomplete.Select2ListCreateChoiceField( + label='Source', choice_list=get_nodes, widget=autocomplete.ListSelect2(url='chatapp:node_autocomplete')) + dest_state = autocomplete.Select2ListCreateChoiceField( + label='Destination', choice_list=get_nodes, widget=autocomplete.ListSelect2(url='chatapp:node_autocomplete')) + trigger = forms.CharField(label='Trigger', max_length=100) + response = forms.CharField(label='Response', max_length=100) + + class Meta: + model = TriggerResponse + fields = ('__all__') + + class node(models.Model): name = CharField(max_length=200, default='') x_loc = IntegerField(default=0) @@ -81,7 +96,6 @@ class node_autocomplete(autocomplete.Select2ListView): def get_list(self): nodes = get_nodes() nodes = [node for node in nodes if bool(regex.match(self.q, node, regex.I))] - # nodes = [node for node in nodes if node.startswith(self.q)] return nodes diff --git a/src/aichat/chatapp/static/chatapp/force.css b/src/aichat/chatapp/static/chatapp/force.css index e29d50d..ef03a33 100644 --- a/src/aichat/chatapp/static/chatapp/force.css +++ b/src/aichat/chatapp/static/chatapp/force.css @@ -68,9 +68,9 @@ line.link { input[type=text] { - border: solid #ebebeb 1px; + border: solid #919191 1px; border-radius: 4px; - height: 18px; + height: 23px; width: 250px; } input[type=textarea] { diff --git a/src/aichat/chatapp/templates/chatapp/create.html b/src/aichat/chatapp/templates/chatapp/create.html index 55f177d..64ef5b4 100644 --- a/src/aichat/chatapp/templates/chatapp/create.html +++ b/src/aichat/chatapp/templates/chatapp/create.html @@ -16,30 +16,17 @@

Create Response

{% csrf_token %} - Source :
+ + {{trig_form.as_p}}
- -
- - - - - -
+ + + {{ trig_form.media }} +

Back

diff --git a/src/aichat/chatapp/views.py b/src/aichat/chatapp/views.py index d0ea9d6..2ce7353 100644 --- a/src/aichat/chatapp/views.py +++ b/src/aichat/chatapp/views.py @@ -2,7 +2,7 @@ from django.http import HttpResponseRedirect, JsonResponse, HttpResponse # noqa from django.urls import reverse # from django.views import generic -from .models import TriggerResponse, get_network +from .models import TriggerResponse, get_network, TriggerResponseForm # from . import load @@ -11,7 +11,8 @@ def index(request): def create(request): - return render(request, 'chatapp/create.html') + TrigForm = TriggerResponseForm() + return render(request, 'chatapp/create.html', {'trig_form': TrigForm}) def save_new_sequence(request): From be22308713b78177128325a72dac9723aedbfb66 Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Fri, 15 Jun 2018 16:27:42 +0000 Subject: [PATCH 09/10] created forms.py, fixed creating new obj when not found for lists --- src/aichat/chatapp/admin.py | 7 +- src/aichat/chatapp/models.py | 75 ++++++++++++------- .../chatapp/templates/chatapp/index.html | 11 ++- src/aichat/chatapp/urls.py | 6 +- src/aichat/chatapp/views.py | 50 ++++++++----- 5 files changed, 91 insertions(+), 58 deletions(-) diff --git a/src/aichat/chatapp/admin.py b/src/aichat/chatapp/admin.py index 724b82a..e352953 100644 --- a/src/aichat/chatapp/admin.py +++ b/src/aichat/chatapp/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import TriggerResponse, node, edge +from .models import TriggerResponse, Node, Edge, TriggerResponseFK class TriggerResponseAdmin(admin.ModelAdmin): @@ -12,5 +12,6 @@ class edgeAdmin(admin.ModelAdmin): admin.site.register(TriggerResponse, TriggerResponseAdmin) -admin.site.register(edge, edgeAdmin) -admin.site.register(node) +admin.site.register(Edge, edgeAdmin) +admin.site.register(Node) +admin.site.register(TriggerResponseFK) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index d5d5ec6..c38acba 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -1,6 +1,5 @@ from django.db import models from django.db.models import CharField, TextField, NullBooleanField, DateTimeField, IntegerField -from django import forms from aichat import pattern import regex from dal import autocomplete @@ -41,9 +40,24 @@ class Meta: abstract = True -class TriggerResponse(AuthoredModel): +class Node(models.Model): + name = CharField(max_length=200, default='') + x_loc = IntegerField(default=0) + y_loc = IntegerField(default=0) + + def __str__(self): + return self.name + + +class TriggerResponseFK(AuthoredModel): source_state = CharField(max_length=200) - dest_state = CharField(max_length=200) + destin = models.ForeignKey( + Node, + on_delete=models.CASCADE, + null=True, + blank=True, + related_name='related_test_models' + ) trigger = CharField(max_length=200) response = TextField() @@ -53,46 +67,49 @@ def __str__(self): return self.source_state + ' to ' + self.dest_state -class TriggerResponseForm(forms.ModelForm): - source_state = autocomplete.Select2ListCreateChoiceField( - label='Source', choice_list=get_nodes, widget=autocomplete.ListSelect2(url='chatapp:node_autocomplete')) - dest_state = autocomplete.Select2ListCreateChoiceField( - label='Destination', choice_list=get_nodes, widget=autocomplete.ListSelect2(url='chatapp:node_autocomplete')) - trigger = forms.CharField(label='Trigger', max_length=100) - response = forms.CharField(label='Response', max_length=100) - - class Meta: - model = TriggerResponse - fields = ('__all__') - +class TriggerResponse(AuthoredModel): + source_state = CharField(max_length=200) + dest_state = CharField(max_length=200) + trigger = CharField(max_length=200) + response = TextField() -class node(models.Model): - name = CharField(max_length=200, default='') - x_loc = IntegerField(default=0) - y_loc = IntegerField(default=0) + is_globstar = NullBooleanField(choices=CHOICES_IS_GLOBSTAR, max_length=3, null=True, blank=True, default=None) def __str__(self): - return self.name + return self.source_state + ' to ' + self.dest_state -class edge(models.Model): +class Edge(models.Model): trigger = CharField(max_length=200, default='') response = CharField(max_length=200, default='') - source = models.ForeignKey(node, on_delete=models.CASCADE, related_name='source', null=True) - dest = models.ForeignKey(node, on_delete=models.CASCADE, related_name='dest', null=True) + source = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='source', null=True) + dest = models.ForeignKey(Node, on_delete=models.CASCADE, related_name='dest', null=True) is_globstar = NullBooleanField(choices=CHOICES_IS_GLOBSTAR, max_length=3, null=True, blank=True, default=None) def __str__(self): return self.trigger + ' to ' + self.response -# class node_autocomplete(autocomplete.Select2QuerySetView): -# def get_queryset(self): -# objects = TriggerResponse.objects.all() -# if self.q: -# objects = objects.filter(source_state__istartswith=self.q) -# return objects +class node_obj_autocomplete(autocomplete.Select2QuerySetView): + def create(self): + node = Node.objects.create(name='self.q') + return node.pk + + def get_queryset(self): + # Don't forget to filter out results depending on the visitor ! + # if not self.request.user.is_authenticated(): + # return Country.objects.none() + + objects = Node.objects.all() + if self.q: + objects = objects.filter(name__istartswith=self.q) + return objects + + class node_autocomplete(autocomplete.Select2ListView): + def create(self, text): + return text + def get_list(self): nodes = get_nodes() nodes = [node for node in nodes if bool(regex.match(self.q, node, regex.I))] diff --git a/src/aichat/chatapp/templates/chatapp/index.html b/src/aichat/chatapp/templates/chatapp/index.html index 867f762..201805b 100644 --- a/src/aichat/chatapp/templates/chatapp/index.html +++ b/src/aichat/chatapp/templates/chatapp/index.html @@ -26,18 +26,21 @@

Create New Skill

{% csrf_token %} - Source :
+ + {{obj_form.as_p}} + + {{ obj_form.media }}

Chloe's "Brain"

- --> diff --git a/src/aichat/chatapp/urls.py b/src/aichat/chatapp/urls.py index eba707c..67386b7 100644 --- a/src/aichat/chatapp/urls.py +++ b/src/aichat/chatapp/urls.py @@ -1,6 +1,7 @@ from django.urls import path -from .models import node_autocomplete +from .models import node_obj_autocomplete, node_autocomplete, Node # noqa from . import views +from dal import autocomplete app_name = 'chatapp' urlpatterns = [ @@ -8,5 +9,6 @@ path('create/', views.create, name='create'), path('create/save/', views.save_new_sequence, name='save'), path('network.json', views.network_rest, name='network'), - path('node_autocomplete', node_autocomplete.as_view(), name='node_autocomplete') + path('node_autocomplete', node_autocomplete.as_view(), name='node_autocomplete'), + path('node_obj_autocomplete', autocomplete.Select2QuerySetView.as_view(model=Node), name='node_obj_autocomplete') ] diff --git a/src/aichat/chatapp/views.py b/src/aichat/chatapp/views.py index 2ce7353..419bcf9 100644 --- a/src/aichat/chatapp/views.py +++ b/src/aichat/chatapp/views.py @@ -2,33 +2,43 @@ from django.http import HttpResponseRedirect, JsonResponse, HttpResponse # noqa from django.urls import reverse # from django.views import generic -from .models import TriggerResponse, get_network, TriggerResponseForm +from .models import TriggerResponse, get_network +from .forms import TriggerResponseForm, TriggerResponseFormFK # from . import load def index(request): - return render(request, 'chatapp/index.html', ) + objForm = TriggerResponseFormFK() + return render(request, 'chatapp/index.html', {'obj_form': objForm}) def create(request): - TrigForm = TriggerResponseForm() - return render(request, 'chatapp/create.html', {'trig_form': TrigForm}) - - -def save_new_sequence(request): - selected_source = request.POST.get("Source") - selected_dest = request.POST.get("Dest") - selected_trig = request.POST.get("Trigger") - selected_resp = request.POST.get("Response") - if selected_resp == "" or selected_trig == "" or selected_source == "" or selected_dest == "": - return render(request, 'chatapp/create.html', { - 'error_message': "Please fill all text boxes", - }) - else: - new_trig = TriggerResponse(dest_state=selected_dest, source_state=selected_source, - trigger=selected_trig, response=selected_resp) - new_trig.save() - return HttpResponseRedirect(reverse('chatapp:index')) + trigForm = TriggerResponseForm() + return render(request, 'chatapp/create.html', {'trig_form': trigForm}) + + +def save_new_sequence(request, form=TriggerResponseForm, model=TriggerResponse): + # selected_source = request.POST.get("Source") + # selected_dest = request.POST.get("Dest") + # selected_trig = request.POST.get("Trigger") + # selected_resp = request.POST.get("Response") + + # if selected_resp == "" or selected_trig == "" or selected_source == "" or selected_dest == "": + # return render(request, 'chatapp/create.html', { + # 'error_message': "Please fill all text boxes", + # }) + # else: + # new_trig = TriggerResponse(dest_state=selected_dest, source_state=selected_source, + # trigger=selected_trig, response=selected_resp) + # new_trig.save() + # return HttpResponseRedirect(reverse('chatapp:index')) + + form = form(request.POST) + if form.is_valid(): + obj = model(**form.cleaned_data) + obj.save() + + return HttpResponseRedirect(reverse('chatapp:index')) def network_rest(request): From a47cc41d46c7e3a4c6f518c79035c874bee2bf79 Mon Sep 17 00:00:00 2001 From: RigobertoM29 Date: Wed, 20 Jun 2018 10:00:06 -0700 Subject: [PATCH 10/10] autocomplete working, moved form page to index --- src/aichat/chatapp/admin.py | 17 +++++++---- src/aichat/chatapp/models.py | 23 ++------------ .../chatapp/templates/chatapp/create.html | 4 --- .../chatapp/templates/chatapp/index.html | 30 +++++++++---------- src/aichat/chatapp/urls.py | 2 +- src/aichat/chatapp/views.py | 23 ++------------ 6 files changed, 32 insertions(+), 67 deletions(-) diff --git a/src/aichat/chatapp/admin.py b/src/aichat/chatapp/admin.py index e352953..e24cd76 100644 --- a/src/aichat/chatapp/admin.py +++ b/src/aichat/chatapp/admin.py @@ -1,17 +1,24 @@ from django.contrib import admin -from .models import TriggerResponse, Node, Edge, TriggerResponseFK +from .models import TriggerResponse, Node, Edge class TriggerResponseAdmin(admin.ModelAdmin): list_display = ('source_state', 'dest_state', 'trigger', 'response') -class edgeAdmin(admin.ModelAdmin): +class NodeAdmin(admin.ModelAdmin): + list_display = ('name', 'x_loc', 'y_loc') + + +class EdgeAdmin(admin.ModelAdmin): list_display = ('trigger', 'response') +class TriggerResponseAdminFK(admin.ModelAdmin): + list_display = ('source_state', 'dest_state', 'trigger', 'response') + + admin.site.register(TriggerResponse, TriggerResponseAdmin) -admin.site.register(Edge, edgeAdmin) -admin.site.register(Node) -admin.site.register(TriggerResponseFK) +admin.site.register(Edge, EdgeAdmin) +admin.site.register(Node, NodeAdmin) diff --git a/src/aichat/chatapp/models.py b/src/aichat/chatapp/models.py index c38acba..84b202e 100644 --- a/src/aichat/chatapp/models.py +++ b/src/aichat/chatapp/models.py @@ -49,24 +49,6 @@ def __str__(self): return self.name -class TriggerResponseFK(AuthoredModel): - source_state = CharField(max_length=200) - destin = models.ForeignKey( - Node, - on_delete=models.CASCADE, - null=True, - blank=True, - related_name='related_test_models' - ) - trigger = CharField(max_length=200) - response = TextField() - - is_globstar = NullBooleanField(choices=CHOICES_IS_GLOBSTAR, max_length=3, null=True, blank=True, default=None) - - def __str__(self): - return self.source_state + ' to ' + self.dest_state - - class TriggerResponse(AuthoredModel): source_state = CharField(max_length=200) dest_state = CharField(max_length=200) @@ -91,9 +73,8 @@ def __str__(self): class node_obj_autocomplete(autocomplete.Select2QuerySetView): - def create(self): - node = Node.objects.create(name='self.q') - return node.pk + def create(self, text): + return Node.objects.create(name=text).pk def get_queryset(self): # Don't forget to filter out results depending on the visitor ! diff --git a/src/aichat/chatapp/templates/chatapp/create.html b/src/aichat/chatapp/templates/chatapp/create.html index 64ef5b4..bd1667e 100644 --- a/src/aichat/chatapp/templates/chatapp/create.html +++ b/src/aichat/chatapp/templates/chatapp/create.html @@ -16,10 +16,6 @@

Create Response

{% csrf_token %} - {{trig_form.as_p}}
diff --git a/src/aichat/chatapp/templates/chatapp/index.html b/src/aichat/chatapp/templates/chatapp/index.html index 201805b..787c4a9 100644 --- a/src/aichat/chatapp/templates/chatapp/index.html +++ b/src/aichat/chatapp/templates/chatapp/index.html @@ -21,26 +21,24 @@

Chloe Skills

-

Create New Skill

- {% if error_message %}

{{ error_message }}

{% endif %} - -
- {% csrf_token %} - - {{obj_form.as_p}} - -
- - {{ obj_form.media }} +

Create Response

+ {% if error_message %}

{{ error_message }}

{% endif %} + +
+ {% csrf_token %} + {{trig_form.as_p}} + +
+ + + {{ trig_form.media }} +

Chloe's "Brain"

- + diff --git a/src/aichat/chatapp/urls.py b/src/aichat/chatapp/urls.py index 67386b7..65dfd94 100644 --- a/src/aichat/chatapp/urls.py +++ b/src/aichat/chatapp/urls.py @@ -10,5 +10,5 @@ path('create/save/', views.save_new_sequence, name='save'), path('network.json', views.network_rest, name='network'), path('node_autocomplete', node_autocomplete.as_view(), name='node_autocomplete'), - path('node_obj_autocomplete', autocomplete.Select2QuerySetView.as_view(model=Node), name='node_obj_autocomplete') + path('node_obj_autocomplete', autocomplete.Select2QuerySetView.as_view(create_field='title'), name='node_obj_autocomplete') ] diff --git a/src/aichat/chatapp/views.py b/src/aichat/chatapp/views.py index 419bcf9..7e8bff5 100644 --- a/src/aichat/chatapp/views.py +++ b/src/aichat/chatapp/views.py @@ -1,15 +1,14 @@ from django.shortcuts import render from django.http import HttpResponseRedirect, JsonResponse, HttpResponse # noqa from django.urls import reverse -# from django.views import generic from .models import TriggerResponse, get_network -from .forms import TriggerResponseForm, TriggerResponseFormFK +from .forms import TriggerResponseForm # from . import load def index(request): - objForm = TriggerResponseFormFK() - return render(request, 'chatapp/index.html', {'obj_form': objForm}) + trigForm = TriggerResponseForm() + return render(request, 'chatapp/index.html', {'trig_form': trigForm}) def create(request): @@ -18,26 +17,10 @@ def create(request): def save_new_sequence(request, form=TriggerResponseForm, model=TriggerResponse): - # selected_source = request.POST.get("Source") - # selected_dest = request.POST.get("Dest") - # selected_trig = request.POST.get("Trigger") - # selected_resp = request.POST.get("Response") - - # if selected_resp == "" or selected_trig == "" or selected_source == "" or selected_dest == "": - # return render(request, 'chatapp/create.html', { - # 'error_message': "Please fill all text boxes", - # }) - # else: - # new_trig = TriggerResponse(dest_state=selected_dest, source_state=selected_source, - # trigger=selected_trig, response=selected_resp) - # new_trig.save() - # return HttpResponseRedirect(reverse('chatapp:index')) - form = form(request.POST) if form.is_valid(): obj = model(**form.cleaned_data) obj.save() - return HttpResponseRedirect(reverse('chatapp:index'))