Skip to content

Commit eb2f696

Browse files
committed
fix: response formatting
1 parent 695216b commit eb2f696

File tree

2 files changed

+121
-80
lines changed

2 files changed

+121
-80
lines changed

polls/templates/polls/chat.html

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ <h1 class="text-center mb-5">Ask Open AI</h1>
1010
<form id="chatForm" class="form-group">
1111
<label for="userInput">Your Question:</label>
1212
<textarea id="userInput" class="form-control mb-3" rows="4" placeholder="What poll i can create on health care topic ?"></textarea>
13-
<button type="button" class="btn btn-primary" onclick="sendMessage()">Send</button>
13+
<button type="button" id="sendButton" class="btn btn-primary" onclick="sendMessage()">Send</button>
1414
</form>
15-
<label id="responseLabel" class="mt-3"></label>
15+
<label id="responseLabel" class="mt-3" style="white-space:pre-line"></label>
1616
</div>
1717
</div>
1818
</div>
@@ -21,15 +21,25 @@ <h1 class="text-center mb-5">Ask Open AI</h1>
2121
<script>
2222
function sendMessage() {
2323
const text = document.getElementById('userInput').value;
24+
25+
// Disable submit button
26+
document.getElementById('sendButton').disabled = true;
27+
2428
fetch('/polls/chat/', {
2529
method: 'POST',
2630
headers: {'Content-Type': 'application/json'},
2731
body: JSON.stringify({message: text})
2832
})
2933
.then(response => response.json())
3034
.then(data => {
35+
// Clear input value
36+
document.getElementById('userInput').value = '';
37+
3138
document.getElementById('responseLabel').textContent = data.reply;
32-
});
39+
}).finally(() => {
40+
// Enable submit button
41+
document.getElementById('sendButton').disabled = false;
42+
})
3343
}
3444
</script>
3545

polls/views.py

Lines changed: 108 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -19,105 +19,115 @@
1919
@login_required()
2020
@csrf_exempt
2121
def chat_view(request):
22-
if request.method == 'POST':
22+
if request.method == "POST":
2323
client = OpenAI(
2424
api_key=settings.OPENAI_API_KEY,
2525
)
2626

2727
data = json.loads(request.body)
28-
message = data.get('message', '')
28+
message = data.get("message", "")
2929
response = client.chat.completions.create(
3030
model="gpt-4o-mini",
31-
messages=[{"role": "user", "content": message}]
31+
messages=[
32+
{
33+
"role": "user",
34+
"content": f"Respond to the following: {message}, and return only plain text. Avoid any code formatting or backticks.",
35+
}
36+
],
3237
)
3338
reply = response.choices[0].message.content
34-
return JsonResponse({'reply': reply})
39+
return JsonResponse({"reply": reply})
40+
3541

3642
@login_required()
3743
def chat_page(request):
38-
return render(request, 'polls/chat.html')
44+
return render(request, "polls/chat.html")
45+
3946

4047
@login_required()
4148
def polls_list(request):
4249
all_polls = Poll.objects.all()
43-
search_term = ''
44-
if 'name' in request.GET:
45-
all_polls = all_polls.order_by('text')
50+
search_term = ""
51+
if "name" in request.GET:
52+
all_polls = all_polls.order_by("text")
4653

47-
if 'date' in request.GET:
48-
all_polls = all_polls.order_by('pub_date')
54+
if "date" in request.GET:
55+
all_polls = all_polls.order_by("pub_date")
4956

50-
if 'vote' in request.GET:
51-
all_polls = all_polls.annotate(Count('vote')).order_by('vote__count')
57+
if "vote" in request.GET:
58+
all_polls = all_polls.annotate(Count("vote")).order_by("vote__count")
5259

53-
if 'search' in request.GET:
54-
search_term = request.GET['search']
60+
if "search" in request.GET:
61+
search_term = request.GET["search"]
5562
all_polls = all_polls.filter(text__icontains=search_term)
5663

5764
paginator = Paginator(all_polls, 6) # Show 6 contacts per page
58-
page = request.GET.get('page')
65+
page = request.GET.get("page")
5966
polls = paginator.get_page(page)
6067

6168
get_dict_copy = request.GET.copy()
62-
params = get_dict_copy.pop('page', True) and get_dict_copy.urlencode()
69+
params = get_dict_copy.pop("page", True) and get_dict_copy.urlencode()
6370

6471
context = {
65-
'polls': polls,
66-
'params': params,
67-
'search_term': search_term,
72+
"polls": polls,
73+
"params": params,
74+
"search_term": search_term,
6875
}
69-
return render(request, 'polls/polls_list.html', context)
76+
return render(request, "polls/polls_list.html", context)
77+
7078

7179
@login_required()
7280
def dashboard(request):
7381
polls = Poll.objects.all()
7482
poll_data = []
7583

7684
for poll in polls:
77-
unique_voters = Vote.objects.filter(poll=poll).values('user').distinct().count()
78-
poll_data.append({'question': poll.text, 'unique_voters': unique_voters})
85+
unique_voters = Vote.objects.filter(poll=poll).values("user").distinct().count()
86+
poll_data.append({"question": poll.text, "unique_voters": unique_voters})
87+
88+
context = {"poll_data": poll_data}
89+
return render(request, "polls/dashboard.html", context)
7990

80-
context = {'poll_data': poll_data}
81-
return render(request, 'polls/dashboard.html', context)
8291

8392
@login_required()
8493
def list_by_user(request):
8594
all_polls = Poll.objects.filter(owner=request.user)
8695
paginator = Paginator(all_polls, 7) # Show 7 contacts per page
8796

88-
page = request.GET.get('page')
97+
page = request.GET.get("page")
8998
polls = paginator.get_page(page)
9099

91100
context = {
92-
'polls': polls,
101+
"polls": polls,
93102
}
94-
return render(request, 'polls/polls_list.html', context)
103+
return render(request, "polls/polls_list.html", context)
95104

96105

97106
@login_required()
98107
def polls_add(request):
99-
if request.user.has_perm('polls.add_poll'):
100-
if request.method == 'POST':
108+
if request.user.has_perm("polls.add_poll"):
109+
if request.method == "POST":
101110
form = PollAddForm(request.POST)
102111
if form.is_valid:
103112
poll = form.save(commit=False)
104113
poll.owner = request.user
105114
poll.save()
106-
Choice(
107-
poll=poll, choice_text=form.cleaned_data['choice1']).save()
108-
Choice(
109-
poll=poll, choice_text=form.cleaned_data['choice2']).save()
115+
Choice(poll=poll, choice_text=form.cleaned_data["choice1"]).save()
116+
Choice(poll=poll, choice_text=form.cleaned_data["choice2"]).save()
110117

111118
messages.success(
112-
request, "Poll & Choices added successfully.", extra_tags='alert alert-success alert-dismissible fade show')
119+
request,
120+
"Poll & Choices added successfully.",
121+
extra_tags="alert alert-success alert-dismissible fade show",
122+
)
113123

114-
return redirect('polls:list')
124+
return redirect("polls:list")
115125
else:
116126
form = PollAddForm()
117127
context = {
118-
'form': form,
128+
"form": form,
119129
}
120-
return render(request, 'polls/add_poll.html', context)
130+
return render(request, "polls/add_poll.html", context)
121131
else:
122132
return HttpResponse("Sorry but you don't have permission to do that!")
123133

@@ -126,146 +136,167 @@ def polls_add(request):
126136
def polls_edit(request, poll_id):
127137
poll = get_object_or_404(Poll, pk=poll_id)
128138
if request.user != poll.owner:
129-
return redirect('home')
139+
return redirect("home")
130140

131-
if request.method == 'POST':
141+
if request.method == "POST":
132142
form = EditPollForm(request.POST, instance=poll)
133143
if form.is_valid:
134144
form.save()
135-
messages.success(request, "Poll Updated successfully.",
136-
extra_tags='alert alert-success alert-dismissible fade show')
145+
messages.success(
146+
request,
147+
"Poll Updated successfully.",
148+
extra_tags="alert alert-success alert-dismissible fade show",
149+
)
137150
return redirect("polls:list")
138151

139152
else:
140153
form = EditPollForm(instance=poll)
141154

142-
return render(request, "polls/poll_edit.html", {'form': form, 'poll': poll})
155+
return render(request, "polls/poll_edit.html", {"form": form, "poll": poll})
143156

144157

145158
@login_required
146159
def polls_delete(request, poll_id):
147160
poll = get_object_or_404(Poll, pk=poll_id)
148161
if request.user != poll.owner:
149-
return redirect('home')
162+
return redirect("home")
150163
poll.delete()
151-
messages.success(request, "Poll Deleted successfully.",
152-
extra_tags='alert alert-success alert-dismissible fade show')
164+
messages.success(
165+
request,
166+
"Poll Deleted successfully.",
167+
extra_tags="alert alert-success alert-dismissible fade show",
168+
)
153169
return redirect("polls:list")
154170

155171

156172
@login_required
157173
def add_choice(request, poll_id):
158174
poll = get_object_or_404(Poll, pk=poll_id)
159175
if request.user != poll.owner:
160-
return redirect('home')
176+
return redirect("home")
161177

162-
if request.method == 'POST':
178+
if request.method == "POST":
163179
form = ChoiceAddForm(request.POST)
164180
if form.is_valid:
165181
new_choice = form.save(commit=False)
166182
new_choice.poll = poll
167183
new_choice.save()
168184
messages.success(
169-
request, "Choice added successfully.", extra_tags='alert alert-success alert-dismissible fade show')
170-
return redirect('polls:edit', poll.id)
185+
request,
186+
"Choice added successfully.",
187+
extra_tags="alert alert-success alert-dismissible fade show",
188+
)
189+
return redirect("polls:edit", poll.id)
171190
else:
172191
form = ChoiceAddForm()
173192
context = {
174-
'form': form,
193+
"form": form,
175194
}
176-
return render(request, 'polls/add_choice.html', context)
195+
return render(request, "polls/add_choice.html", context)
177196

178197

179198
@login_required
180199
def choice_edit(request, choice_id):
181200
choice = get_object_or_404(Choice, pk=choice_id)
182201
poll = get_object_or_404(Poll, pk=choice.poll.id)
183202
if request.user != poll.owner:
184-
return redirect('home')
203+
return redirect("home")
185204

186-
if request.method == 'POST':
205+
if request.method == "POST":
187206
form = ChoiceAddForm(request.POST, instance=choice)
188207
if form.is_valid:
189208
new_choice = form.save(commit=False)
190209
new_choice.poll = poll
191210
new_choice.save()
192211
messages.success(
193-
request, "Choice Updated successfully.", extra_tags='alert alert-success alert-dismissible fade show')
194-
return redirect('polls:edit', poll.id)
212+
request,
213+
"Choice Updated successfully.",
214+
extra_tags="alert alert-success alert-dismissible fade show",
215+
)
216+
return redirect("polls:edit", poll.id)
195217
else:
196218
form = ChoiceAddForm(instance=choice)
197219
context = {
198-
'form': form,
199-
'edit_choice': True,
200-
'choice': choice,
220+
"form": form,
221+
"edit_choice": True,
222+
"choice": choice,
201223
}
202-
return render(request, 'polls/add_choice.html', context)
224+
return render(request, "polls/add_choice.html", context)
203225

204226

205227
@login_required
206228
def choice_delete(request, choice_id):
207229
choice = get_object_or_404(Choice, pk=choice_id)
208230
poll = get_object_or_404(Poll, pk=choice.poll.id)
209231
if request.user != poll.owner:
210-
return redirect('home')
232+
return redirect("home")
211233
choice.delete()
212234
messages.success(
213-
request, "Choice Deleted successfully.", extra_tags='alert alert-success alert-dismissible fade show')
214-
return redirect('polls:edit', poll.id)
235+
request,
236+
"Choice Deleted successfully.",
237+
extra_tags="alert alert-success alert-dismissible fade show",
238+
)
239+
return redirect("polls:edit", poll.id)
215240

216241

217242
def poll_detail(request, poll_id):
218243
poll = get_object_or_404(Poll, id=poll_id)
219244

220245
if not poll.active:
221-
return render(request, 'polls/poll_result.html', {'poll': poll})
246+
return render(request, "polls/poll_result.html", {"poll": poll})
222247
loop_count = poll.choice_set.count()
223248
context = {
224-
'poll': poll,
225-
'loop_time': range(0, loop_count),
249+
"poll": poll,
250+
"loop_time": range(0, loop_count),
226251
}
227-
return render(request, 'polls/poll_detail.html', context)
252+
return render(request, "polls/poll_detail.html", context)
228253

229254

230255
@login_required
231256
def poll_vote(request, poll_id):
232257
poll = get_object_or_404(Poll, pk=poll_id)
233-
choice_id = request.POST.get('choice')
258+
choice_id = request.POST.get("choice")
234259
if not poll.user_can_vote(request.user):
235260
messages.error(
236-
request, "You already voted this poll!", extra_tags='alert alert-warning alert-dismissible fade show')
261+
request,
262+
"You already voted this poll!",
263+
extra_tags="alert alert-warning alert-dismissible fade show",
264+
)
237265
return redirect("polls:list")
238266

239267
if choice_id:
240268
choice = Choice.objects.get(id=choice_id)
241269
vote = Vote(user=request.user, poll=poll, choice=choice)
242-
vote.save()
270+
vote.save()
243271

244272
# get poll creator email
245273
poll_creator_email = poll.owner.email
246274
# Construct the email
247-
subject = f'New vote for your poll: {poll.text}'
275+
subject = f"New vote for your poll: {poll.text}"
248276
message = f'A new vote has been cast for your poll "{poll.text}".'
249277
# Send the email
250-
send_mail(subject, message, settings.EMAIL_HOST_USER, [poll_creator_email])
278+
send_mail(subject, message, settings.EMAIL_HOST_USER, [poll_creator_email])
251279

252-
return render(request, 'polls/poll_result.html', {'poll': poll})
280+
return render(request, "polls/poll_result.html", {"poll": poll})
253281
else:
254282
messages.error(
255-
request, "No choice selected!", extra_tags='alert alert-warning alert-dismissible fade show')
283+
request,
284+
"No choice selected!",
285+
extra_tags="alert alert-warning alert-dismissible fade show",
286+
)
256287
return redirect("polls:detail", poll_id)
257-
return render(request, 'polls/poll_result.html', {'poll': poll})
288+
return render(request, "polls/poll_result.html", {"poll": poll})
258289

259290

260291
@login_required
261292
def end_poll(request, poll_id):
262293
poll = get_object_or_404(Poll, pk=poll_id)
263294
if request.user != poll.owner:
264-
return redirect('home')
295+
return redirect("home")
265296

266297
if poll.active is True:
267298
poll.active = False
268299
poll.save()
269-
return render(request, 'polls/poll_result.html', {'poll': poll})
300+
return render(request, "polls/poll_result.html", {"poll": poll})
270301
else:
271-
return render(request, 'polls/poll_result.html', {'poll': poll})
302+
return render(request, "polls/poll_result.html", {"poll": poll})

0 commit comments

Comments
 (0)