วันเสาร์ที่ 14 เมษายน พ.ศ. 2561

Commit 7 Wordbucket : Manage database change (item to word and add Explanation and Like_and_dislike)

Assignment1 : Wordbucket GitHub Link

Commit 7 Wordbucket : Manage database change (item to word and add Explanation and Like_and_dislike)

Commits on Mar 1, 2018

- เพิ่ม urls.py ใน app ของเราและไปเชื่อมต่อกับ โปรเจคโดยตั้งใน urls.py ของโปรเจค

project
@@ -16,8 +16,10 @@
from django.contrib import admin
from django.urls import include, path, re_path
from wordbucket import views
+from wordbucket import urls as wordbucket_urls
urlpatterns = [
path('', views.home_page, name='home'),
+ path('wordbucket/', include(wordbucket_urls)),
path('admin/', admin.site.urls),
]

app.
@@ -0,0 +1,6 @@
+from django.urls import path, re_path
+from wordbucket import views
+
+urlpatterns = [
+
+]


- แก้ models.py เปลี่ยน Item เป็น Word และสร้าง อีก 2 classes อธิบายดังนี้

Class
  • Word
    • word > text เก็บคำต่าง
  • Explanation
    • word > foreignkey เชื่อมสัมพันธ์กับ ตาราง Word
    • explanation_text > text เก็บคำอธิบายของคำ(word)
  • Like_and_dislike
    • explanation > foreignkey เชื่อมสัมพันธ์กับ ตาราง Explanation
    • votes_like > Integer เก็บ like
    • votes_dislike > Integer เก็บ dislike
# note : ในขั้นนี้ ณ เวลานั้นคิดว่าจะทำ Like ของ user anonymous แยกกับ login แต่ปัจจุบันใช้ร่วมกัน

@@ -1,4 +1,21 @@
from django.db import models
-class Item(models.Model):
+class Word(models.Model):
+ #word (text)
word = models.TextField(default='')
+ def __str__(self):
+ return self.question_text
+
+class Explanation(models.Model):
+ #foreign key
+ word = models.ForeignKey(Word, on_delete=models.CASCADE)
+ explanation_text = models.CharField(max_length=600)
+ def __str__(self):
+ return self.explanation_text
+
+class Like_and_dislike(models.Model):
+ #foreign key for Like and Dislike
+ explanation = models.ForeignKey(Explanation, on_delete=models.CASCADE)
+ #votes count
+ votes_like = models.IntegerField(default=0)
+ votes_dislike = models.IntegerField(default=0)

- เพิ่มหน้า admin track กับ models ของเราเพื่อจัดการ database ผ่าน admin template ได้

@@ -1,3 +1,10 @@
from django.contrib import admin
+
+from .models import Word, Explanation, Like_and_dislike
+
# Register your models here.
+
+admin.site.register(Word)
+admin.site.register(Explanation)
+admin.site.register(Like_and_dislike)

- แก้ชื่อใน template home.html ตามที่เราแก้ model

@@ -5,13 +5,13 @@
<body>
<h1>Word Bucket</h1>
<form method="POST">
- <input name="item_text" id="id_new_item" placeholder="Add new word" />
+ <input name="word_text" id="id_new_word" placeholder="Add new word" />
{% csrf_token %}
</form>
<table id="id_list_table">
- {% for item in items %}
- <tr><td>{{ forloop.counter }}: {{ item.word }}</td></tr>
+ {% for word in words %}
+ <tr><td>{{ forloop.counter }}: {{ word.word }}</td></tr>
{% endfor %}
</table>
</body>

- unit test ก็แก้ชื่อต่างๆให้เหมาะสมเช่นกัน 

เช่น ItemModelTest แยกเป็น WordAndExplanationModelTest กับ ExplanationAndLike_and_dislikeModelTest ในการ unit test database และเพิ่ม test ความสัมพันธ์ระหว่างตารางต่างๆอีกด้วย 

@@ -4,7 +4,7 @@
from django.template.loader import render_to_string
from wordbucket.views import home_page
-from wordbucket.models import Item
+from wordbucket.models import Word, Explanation, Like_and_dislike
class HomePageTest(TestCase):
@@ -13,14 +13,14 @@ def test_uses_home_template(self):
self.assertTemplateUsed(response, 'home.html')
def test_can_save_a_POST_request(self):
- self.client.post('/', data={'item_text': 'A new list item'})
+ self.client.post('/', data={'word_text': 'A new list word'})
- self.assertEqual(Item.objects.count(), 1)
- new_item = Item.objects.first()
- self.assertEqual(new_item.word, 'A new list item')
+ self.assertEqual(Word.objects.count(), 1)
+ new_word = Word.objects.first()
+ self.assertEqual(new_word.word, 'A new list word')
def test_redirects_after_POST(self):
- response = self.client.post('/', data={'item_text': 'A new list item'})
+ response = self.client.post('/', data={'word_text': 'A new list word'})
self.assertEqual(response.status_code, 302)
self.assertEqual(response['location'], '/')
@@ -34,30 +34,81 @@ def test_home_page_returns_correct_html(self):
self.assertTemplateUsed(response, 'home.html')
- def test_displays_all_list_items(self):
- Item.objects.create(word='itemey 1')
- Item.objects.create(word='itemey 2')
+ def test_displays_all_list_words(self):
+ Word.objects.create(word='wordey 1')
+ Word.objects.create(word='wordey 2')
response = self.client.get('/')
- self.assertIn('itemey 1', response.content.decode())
- self.assertIn('itemey 2', response.content.decode())
+ self.assertIn('wordey 1', response.content.decode())
+ self.assertIn('wordey 2', response.content.decode())
-class ItemModelTest(TestCase):
- def test_saving_and_retrieving_items(self):
- first_item = Item()
- first_item.word = 'The first (ever) word item'
- first_item.save()
+class WordAndExplanationModelTest(TestCase):
+
+ def test_saving_and_retrieving_words(self):
+
+ word_ = Word()
+ word_.save()
+
+ first_explanation = Explanation()
+ first_explanation.explanation_text = 'The first (ever) word explanation'
+ first_explanation.word = word_
+ first_explanation.save()
+
+ second_explanation = Explanation()
+ second_explanation.explanation_text = 'Explanation the second'
+ second_explanation.word = word_
+ second_explanation.save()
+
+ saved_word = Word.objects.first()
+ self.assertEqual(saved_word, word_)
+
+ saved_explanations = Explanation.objects.all()
+ self.assertEqual(saved_explanations.count(), 2)
+
+ first_saved_explanation = saved_explanations[0]
+ second_saved_explanation = saved_explanations[1]
+ self.assertEqual(first_saved_explanation.explanation_text, 'The first (ever) word explanation')
+ self.assertEqual(first_saved_explanation.word, word_)
+ self.assertEqual(second_saved_explanation.explanation_text, 'Explanation the second')
+ self.assertEqual(second_saved_explanation.word, word_)
+
+
+class ExplanationAndLike_and_dislikeModelTest(TestCase):
+
+ def test_saving_and_retrieving_like_and_dislike(self):
+
+ word_ = Word()
+ word_.save()
+
+ explanation_ = Explanation()
+ explanation_.explanation_text = 'test'
+ explanation_.word = word_
+ explanation_.save()
+
+ first_votes_like = Like_and_dislike()
+ first_votes_like.votes_like = 1
+ first_votes_like.explanation = explanation_
+ first_votes_like.save()
+
+ second_votes_dislike = Like_and_dislike()
+ second_votes_dislike.votes_dislike = 2
+ second_votes_dislike.explanation = explanation_
+ second_votes_dislike.save()
+
+ saved_explanation = Explanation.objects.first()
+ self.assertEqual(saved_explanation, explanation_)
+
+ saved_likes_and_dislikes = Like_and_dislike.objects.all()
+ self.assertEqual(saved_likes_and_dislikes.count(), 2)
+
+ first_saved_votes_like = saved_likes_and_dislikes[0]
+ second_saved_votes_like = saved_likes_and_dislikes[1]
+ self.assertEqual(first_saved_votes_like.votes_like, 1)
+ self.assertEqual(first_saved_votes_like.explanation, explanation_)
+ self.assertEqual(second_saved_votes_like.votes_dislike, 2)
+ self.assertEqual(second_saved_votes_like.explanation, explanation_)
- second_item = Item()
- second_item.word = 'Item the second'
- second_item.save()
- saved_items = Item.objects.all()
- self.assertEqual(saved_items.count(), 2)
- first_saved_item = saved_items[0]
- second_saved_item = saved_items[1]
- self.assertEqual(first_saved_item.word, 'The first (ever) word item')
- self.assertEqual(second_saved_item.word, 'Item the second')

- แก้ views.py ชื่อ Item เป็น Word เช่นกัน

@@ -1,10 +1,10 @@
from django.shortcuts import redirect, render
-from wordbucket.models import Item
+from wordbucket.models import Word
def home_page(request):
if request.method == 'POST':
- Item.objects.create(word=request.POST['item_text'])
+ Word.objects.create(word=request.POST['word_text'])
return redirect('/')
- items = Item.objects.all()
- return render(request, 'home.html', {'items': items})
+ words = Word.objects.all()
+ return render(request, 'home.html', {'words': words})

ไม่มีความคิดเห็น:

แสดงความคิดเห็น