Monday, February 27, 2023

Web App ช่วยจัดตารางเรียน (Idea เบื้องต้น)

 Web App ช่วยจัดตารางเรียน (Idea เริ่มต้น)

Requirement

  1. สามารถตรวจสอบเวลาเรียน-สอบได้

  2. แสดงผลเป็น ตารางเรียน, ตารางสอบ

  3. สามารถกำหนดรายวิชาที่ต้องลงได้

  4. สามารถระบุวิชาเลือกที่อยากลงได้

  5. เช็คเวลาเรียน-สอบ?

    1. ผู้ใช้ใส่เวลาเรียน-สอบ เอง

    2. ดึงเองจากเว็บม. หรือ มีเก็บใน database

  6. แสดงรายวิชาที่ไม่สามารถลงได้ในเงื่อนไขที่กำหนด



ข้อดี

  1. สามารถเช็ครายวิชาที่ตารางเรียน-สอบชนกันได้ง่ายขึ้น

  2. หาก sec เต็มสามารถจัดตารางเรียนใหม่ได้อย่างรวจเร็ว

  3. เลือกวิชา เลือกเรียน ในเทอมนั้นๆง่ายขึ้น


ข้อเสีย

  1. ต้อง copy-paste วิชา-sec ที่จะลง ไปใส่ในเว็บลงทะเบียน

  2. ต้องหา-เลือกวิชาที่อยากลงเอง

  3. บางวิชาอาจลงไม่ได้ในเว็บลงทะเบียน


โปรแกรมเขียนใน

  1. Web App

    1. HTML + CSS

    2. JavaScript

    3. สามารถ ฝาก .HTML กับ host server ให้ผู้อื่นใช้งานได้

  2. Desktop App

    1. python or java

    2. การติดตั้งโปรแกรมอาจยุ่งยาก

Test Case V.1

  1. ลงวิชาเรียน

    1. กรอกวิชาที่ต้องลง

      1. ใส่รหัสวิชา

      2. ใส่ sec ใส่เวลาเรียน

        1. อาจมีปุ่มกดเพิ่มช่อง

      3. ใส่เวลาสอบ

      4. กดเปลี่ยนหน้า

    2. กรอกวิชาที่อยากลง

      1. ใส่รหัสวิชา

      2. ใส่ sec ใส่เวลาเรียน

      3. ใส่เวลาสอบ

      4. กดแสดงตารางเรียนสอบ

    3. แสดงตารางเรียนสอบ

      1. แสดงตารางเรียน-สอบ

      2. แสดงวิชาที่ไม่สามารถลงได้

        1. ลบวิชานั้น

        2. หาsecเรียนใหม่



Wednesday, February 22, 2023

Django Tutorial Part6 (update week12-2)

 Part6 : Static Files

ในพาร์ทนี้เราจะทำการเพิ่ม stylesheet และรูปภาพลงหน้าเว็บของเรา 

นอกเหนือจาก HTML โดยทั่วไป web application จำเป็นต้องมีไฟล์อื่นๆ เช่น รูปภาพ, JavaScript หรือ CSS ซึ่งจำเป็นต่อการแสดงหน้าเว็บที่สมบูรณ์ ใน Django จะเรียกไฟล์เหล่านี้ว่า " static files"

django.contrib.staticfiles มีไว้เพื่อรวบรวม static files จากแต่ละ app ของเรา(และที่อื่นๆ ที่ระบุไว้) ไว้ในตำแหน่งเดียวที่สามารถเรียกใช้ได้ง่าย

Customize your app's look and feel

ขั้นแรกสร้าง directory ชื่อ static ใน poll จากนั้นสร้าง directory ชื่อ polls ใน static ซึ่งภายใน directory จะสร้างไฟล์ที่ชื่อ style.css กล่าวคือ stylesheet ของคุณควรอยู่ที่ polls/static/polls/style.css 

จากนั้นเขียน code นี้ใน stylesheet นั้น (polls/static/polls/style.css ):

จากนั้นแก้ไข้โค้ด polls/templates/polls/index.html 

จากนั้นก็รันเซิร์ฟเวอร์ ด้วยคำสั่ง $ python manage.py runserver หรือรีสตาร์ตหากกำลังรันเซิร์ฟเวอร์อยู่แล้ว

เราจะเห็นว่าลิงก์คำถามเป็นสีเขียว(Django style!) ซึ่งหมายความว่า stylesheet ของเราโหลดอย่างถูกต้อง

Adding a background-image

ต่อไปเราจะทำการสร้าง subdirectory สำหรับรูปภาพ สร้าง directory ชื่อ images ใน polls/static/polls ภายใน images เราได้ทำการเพิ่มรูปภาพที่ต้องการนำมาใช้เป็นพื้นหลังเข้าไป และตั้งชื่อว่า background.png ซึ่งมี path คือ polls/static/polls/images/background.png

จากนั้นเพิ่มการอ้างอิงถึงรูปภาพใน stylesheet ของเรา (polls/static/polls/style.css)

จากนั้นเราจะทำการโหลดหน้าเว็ปเราใหม่ แล้วเราก็จะเห็นพื้นหลังขึ้นมาที่ด้านซ้ายบนของหน้าจอ


Django Tutorial Part5 (update week12-2)

 Part5 : Testing

Introducing automated testing

What are automated tests?

การทดสอบเป็นกิจวัตรที่ตรวจสอบการทำงานของโค้ด

การทดสอบอัตโนมัติคือระบบจะทำการทดสอบให้คุณ โดยคุณสร้างชุดการทดสอบเพียงครั้งเดียว จากนั้นเมื่อคุณทำการเปลี่ยนแปลงในแอป คุณสามารถตรวจสอบว่าโค้ดของคุณยังคงใช้งานได้ตามที่คุณตั้งใจไว้ตั้งแต่แรก โดยไม่ต้องทำการทดสอบด้วยตนเองให้เสียเวลา

Why you need to create tests

  • การทดสอบจะช่วยคุณประหยัดเวลา
  • การทดสอบไม่เพียงแค่ระบุปัญหาเท่านั้น แต่ยังป้องกันไม่ให้เกิดปัญหาด้วย
  • การทดสอบทำให้โค้ดของคุณน่าสนใจยิ่งขึ้น
  • การทดสอบช่วยให้ทีมทำงานร่วมกัน

Writing our first test
We identify a bug
Question.was_published_recently( ) เมธอดจะคืนค่า True หาก Question มีการเผยแพร่ภายในวันสุดท้าย (ซึ่งถูกต้อง) แต่ถ้าฟิลด์ Question ของ pub_date เป็นในอนาคต (ซึ่งไม่แน่นอน)
คอนเฟิร์มbug โดยใช้ shell วิธีการตรวจสอบสำหรับคำถามที่มีวันที่อยู่ในอนาคต:


Create a test to expose the bug
เปลี่ยนสิ่งที่เพิ่งทำใน shell ให้เป็น automated test 

เราได้สร้าง django.test.TestCase คลาสย่อยด้วยเมธอดที่สร้าง Questionอินสแตนซ์ด้วย a pub_date ในอนาคต จากนั้นเราตรวจสอบผลลัพธ์ของ was_published_recently( ) -ซึ่งควรเป็นเท็จ

Running tests


เกิด AssertionError เนื่องจากการใช้ assertIs( ) method พบว่า was_published_recently( ) returns True แต่เราต้องการให้ return False

Fixing the bug
Question.was_published_recently( ) ควร return False หาก pub_date เป็นปัญหาในอนาคต แก้ไขเมธอดใน models.py เพื่อให้ return True หากวันที่เป็นวันที่ในอดีตด้วย:


และทำการทดสอบอีกครั้ง -ซึ่ง run test ผ่าน:


More comprehensive tests
เพิ่มวิธีการทดสอบอีกสองวิธีในคลาสเดียวกัน เพื่อทดสอบพฤติกรรมของวิธีการอย่างครอบคลุมมากขึ้น:


และตอนนี้เรามีการทดสอบ 3 รายการที่ยืนยันว่า Question.was_published_recently( ) จะส่งกลับค่าที่เหมาะสมสำหรับคำถามในอดีต ปัจจุบัน และในอนาคต

Test a view
A test for a view
สำหรับการทดสอบนี้ เราต้องการตรวจสอบพฤติกรรมของมันเหมือนกับที่ผู้ใช้จะสัมผัสผ่านเว็บเบราว์เซอร์ แต่ก่อนที่จะแก้ไขอะไร มาดูเครื่องมือที่เราจัดการกันก่อน

The Django test client
Django จัดทำการทดสอบ Client เพื่อจำลองผู้ใช้โต้ตอบกับโค้ดในระดับมุมมอง เราสามารถใช้มันใน tests.py หรือแม้กระทั่งใน shell


เราได้ทำการตั้งค่าสภาพแวดล้อมการทดสอบใน shell แล้ว setup_test_environment( ) ติดตั้งตัวแสดงเทมเพลตซึ่งจะช่วยให้เราตรวจสอบแอตทริบิวต์เพิ่มเติมบางอย่างในการตอบสนอง จากนั้น import the test client class เมื่อพร้อมแล้ว เราสามารถขอให้ลูกค้าทำงานให้เราได้

Improving our view
เราจำเป็นต้องแก้ไข get_queryset( ) method และเปลี่ยนเพื่อให้ตรวจสอบวันที่โดยเปรียบเทียบกับ timezone.now( )


Question.objects.filter(pub_date__lte=timezone.now( )) จะ return ชุดข้อความค้นหาที่มี Questions ซึ่ง pub_date น้อยกว่าหรือเท่ากับ - นั่นคือ ก่อนหน้าหรือเท่ากับ timezone.now

Testing our new view
เราจะสร้าง shortcut function เพื่อสร้างคำถามและคลาสทดสอบใหม่:

  • อย่างแรกคือฟังก์ชันทางลัดคำถาม create_question เพื่อนำการทำซ้ำออกจากกระบวนการสร้างคำถาม
  • test_no_questions ไม่สร้างคำถามใดๆ แต่ตรวจสอบข้อความ: “ไม่มีการสำรวจความคิดเห็น” และตรวจสอบว่า latest_question_list ว่างเปล่า
  • ใน test_past_question เราสร้างคำถามและตรวจสอบว่าคำถามนั้นปรากฏในรายการ
  • ใน test_future_question เราสร้างคำถามด้วย a pub_date ในอนาคต ฐานข้อมูลจะถูกรีเซ็ตสำหรับวิธีการทดสอบแต่ละวิธี ดังนั้นคำถามแรกจะไม่มีอีกต่อไป และ index ก็ไม่ควรมีคำถามใดๆ ในนั้นอีก
  • ฟังก์ชันอื่นๆ เป็นการบอกเล่าเรื่องราวของผู้ดูแลระบบและระบบประสบการณ์ของผู้ใช้บนไซต์ และตรวจสอบว่าในทุกสถานะและทุกการเปลี่ยนแปลงใหม่ในสถานะของระบบ ผลลัพธ์ที่คาดหวังจะได้รับการเผยแพร่

Testing the DetailView
แม้ว่าคำถามในอนาคตจะไม่ปรากฏในดัชนี ผู้ใช้ยังคงสามารถเข้าถึงได้หากทราบหรือคาดเดา URL ที่ถูกต้อง ดังนั้นเราจึงจำเป็นต้องเพิ่มข้อจำกัดที่คล้ายกันใน DetailView:


จากนั้นเพิ่มการทดสอบเพื่อตรวจสอบว่าสามารถแสดงคำถามที่มี pub_date ในอดีตได้ และแสดงคำถามคำถามที่มี pub_date ในอนาคตไม่ได้:


Update project final week 16-2

หน้าเว็บสามารถใช้งานได้แล้ว Add วิชาขึ้นตาราง Delete วิชาออกจากตาราง จัดเรียงตารางสอบโดยนำวิชาที่มีวัน-เวลาสอบก่อนอยู่บนสุด วิชาเรียนที่มี ว...