<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="th">
	<id>http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=Openerp%2Fmodule_5</id>
	<title>Openerp/module 5 - ประวัติรุ่นแก้ไข</title>
	<link rel="self" type="application/atom+xml" href="http://158.108.32.49/wiki/index.php?action=history&amp;feed=atom&amp;title=Openerp%2Fmodule_5"/>
	<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Openerp/module_5&amp;action=history"/>
	<updated>2026-05-06T16:47:17Z</updated>
	<subtitle>ประวัติรุ่นแก้ไขของหน้านี้ในวิกิ</subtitle>
	<generator>MediaWiki 1.33.1</generator>
	<entry>
		<id>http://158.108.32.49/wiki/index.php?title=Openerp/module_5&amp;diff=43010&amp;oldid=prev</id>
		<title>Chaiporn: หน้าที่ถูกสร้างด้วย &#039;== การสร้าง OTP เพื่อผนวกเข้ากับ workflow ของโมเดล HISAppointment ==  =...&#039;</title>
		<link rel="alternate" type="text/html" href="http://158.108.32.49/wiki/index.php?title=Openerp/module_5&amp;diff=43010&amp;oldid=prev"/>
		<updated>2014-05-15T07:00:00Z</updated>

		<summary type="html">&lt;p&gt;หน้าที่ถูกสร้างด้วย &amp;#039;== การสร้าง OTP เพื่อผนวกเข้ากับ workflow ของโมเดล HISAppointment ==  =...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;หน้าใหม่&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== การสร้าง OTP เพื่อผนวกเข้ากับ workflow ของโมเดล HISAppointment ==&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ sms.py ===&lt;br /&gt;
เตรียมฟังก์ชัน send_sms สำหรับส่ง SMS ผ่านเว็บเซอร์วิส thsms.com&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import urllib&lt;br /&gt;
import urllib2&lt;br /&gt;
&lt;br /&gt;
def send_sms(username, password, fromnumber, tonumber, message):&lt;br /&gt;
    data = {&amp;#039;method&amp;#039;: &amp;#039;send&amp;#039;,&lt;br /&gt;
            &amp;#039;username&amp;#039;: username,&lt;br /&gt;
            &amp;#039;password&amp;#039;: password,&lt;br /&gt;
            &amp;#039;from&amp;#039;: fromnumber,&lt;br /&gt;
            &amp;#039;to&amp;#039;: tonumber,&lt;br /&gt;
            &amp;#039;message&amp;#039;: message,&lt;br /&gt;
            }&lt;br /&gt;
    encoded_data = urllib.urlencode(data)&lt;br /&gt;
    url = &amp;#039;http://www.thsms.com/api/rest?&amp;#039; + encoded_data&lt;br /&gt;
    result = urllib2.urlopen(url)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ histest.py ===&lt;br /&gt;
ที่ตอนต้นของไฟล์ โหลดฟังก์ชัน send_sms จากมอดูล sms.py ที่สร้างขึ้นก่อนหน้านี้ และฟังก์ชัน randint จากมอดูล random เพื่อใช้สร้าง OTP (One-Time Password) แบบสุ่ม&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# encoding=utf-8&lt;br /&gt;
from random import randint&lt;br /&gt;
from osv import osv, fields&lt;br /&gt;
from sms import send_sms&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
เพิ่มฟิลด์ phone_number ลงในโมเดล HISPatient เพื่อใช้รับ OTP ผ่าน SMS&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class HISPatient(osv.Model):&lt;br /&gt;
    :&lt;br /&gt;
    _columns={&lt;br /&gt;
        :&lt;br /&gt;
        &amp;#039;phone_number&amp;#039;: fields.char(size=20, string=u&amp;#039;โทรศัพท์&amp;#039;),&lt;br /&gt;
        :&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ในโมเดล HISAppointment เพิ่มฟิลด์ generated_otp และ entered_otp เพื่อใช้เก็บ OTP ที่ถูกสุ่มขึ้นและ OTP ที่ถูกป้อนโดยผู้ใช้ตามลำดับ รวมถึงเมท็อดที่ถูกเรียกใช้เมื่อ workflow ของการนัดหมายเข้าสู่สเตท arrived และเมท็อดสำหรับสร้าง OTP เพื่อส่งไปยังผู้ป่วยผ่าน SMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class HISAppointment(osv.Model):&lt;br /&gt;
    :&lt;br /&gt;
    _columns = {&lt;br /&gt;
            :&lt;br /&gt;
            &amp;#039;generated_otp&amp;#039;: fields.char(size=10, string=u&amp;#039;Generated OTP&amp;#039;),&lt;br /&gt;
            &amp;#039;entered_otp&amp;#039;: fields.char(size=10, string=u&amp;#039;Enter OTP&amp;#039;),&lt;br /&gt;
            :&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
    def action_arrived(self, cr, uid, ids, context=None):&lt;br /&gt;
        appointments = self.browse(cr, uid, ids)&lt;br /&gt;
        appointment = appointments[0]&lt;br /&gt;
        if appointment.generated_otp == appointment.entered_otp:&lt;br /&gt;
            self.write(cr, uid, ids, {&amp;#039;state&amp;#039;:&amp;#039;arrived&amp;#039;})&lt;br /&gt;
        else:&lt;br /&gt;
            raise osv.except_osv(&amp;#039;Error&amp;#039;, &amp;#039;Incorrect OTP&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    def generate_otp(self, cr, uid, ids, context=None):&lt;br /&gt;
        for id in ids:&lt;br /&gt;
            appointments = self.browse(cr, uid, [id])&lt;br /&gt;
            appointment = appointments[0]&lt;br /&gt;
            patient_phone_number = appointment.patient_id.phone_number&lt;br /&gt;
            new_otp = str(randint(10000, 99999))&lt;br /&gt;
            self.write(cr, uid, [id], {&amp;#039;generated_otp&amp;#039;: new_otp})&lt;br /&gt;
            send_sms(&amp;#039;jittat&amp;#039;, &amp;#039;0943fa&amp;#039;, &amp;#039;0000&amp;#039;, patient_phone_number,&lt;br /&gt;
                &amp;#039;Your OTP is: &amp;#039; + new_otp)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ histest_view.xml ===&lt;br /&gt;
เพิ่มฟิลด์ phone_number ในฟอร์มวิวของโมเดล HISPatient&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;record model=&amp;quot;ir.ui.view&amp;quot; id=&amp;quot;view_histest_patient_form&amp;quot;&amp;gt;&lt;br /&gt;
            :&lt;br /&gt;
            &amp;lt;group colspan=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
              &amp;lt;field name=&amp;quot;phone_number&amp;quot;/&amp;gt;&lt;br /&gt;
              &amp;lt;field name=&amp;quot;sex&amp;quot;/&amp;gt;&lt;br /&gt;
              &amp;lt;field name=&amp;quot;id_number&amp;quot; widget=&amp;quot;person_id&amp;quot; /&amp;gt;&lt;br /&gt;
              &amp;lt;field name=&amp;quot;appointment_ids&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;/group&amp;gt;&lt;br /&gt;
            :&lt;br /&gt;
    &amp;lt;/record&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
เพิ่มฟิลด์ generated_otp และ entered_otp ใฟ้ฟอร์มวิวของโมเดล HISAppointment รวมถึงสร้างปุ่ม Generate OTP และทำให้ปุ่มทั้งหมดแสดงผลเฉพาะใน edit mode&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;record model=&amp;quot;ir.ui.view&amp;quot; id=&amp;quot;view_histest_appointment_form&amp;quot;&amp;gt;&lt;br /&gt;
          :&lt;br /&gt;
          &amp;lt;group&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;patient_id&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;department_id&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;date&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;state&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;generated_otp&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;field name=&amp;quot;entered_otp&amp;quot;/&amp;gt;&lt;br /&gt;
            &amp;lt;button name=&amp;quot;generate_otp&amp;quot; string=&amp;quot;Generate OTP&amp;quot; type=&amp;quot;object&amp;quot;&lt;br /&gt;
                class=&amp;quot;oe_edit_only&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;button name=&amp;quot;arrive&amp;quot; string=&amp;quot;Patient Arrived&amp;quot; states=&amp;quot;new&amp;quot;&lt;br /&gt;
                class=&amp;quot;oe_edit_only&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;button name=&amp;quot;done&amp;quot; string=&amp;quot;Done&amp;quot; states=&amp;quot;arrived&amp;quot;&lt;br /&gt;
                class=&amp;quot;oe_edit_only&amp;quot; /&amp;gt;&lt;br /&gt;
          &amp;lt;/group&amp;gt;&lt;br /&gt;
          :&lt;br /&gt;
    &amp;lt;/record&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
เพิ่ม action window เพื่อแสดงผลเฉพาะการนัดหมายของวันที่ปัจจุบัน พร้อม menu item เพื่อเปิดหน้าวิว&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;record model=&amp;quot;ir.actions.act_window&amp;quot; id=&amp;quot;action_histest_today_appointments&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;name&amp;quot;&amp;gt;Today Appointments&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;res_model&amp;quot;&amp;gt;histest.appointment&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;view_type&amp;quot;&amp;gt;form&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;view_mode&amp;quot;&amp;gt;tree,form&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;domain&amp;quot;&amp;gt;&lt;br /&gt;
          [(&amp;#039;date&amp;#039;,&amp;#039;=&amp;#039;,context_today().strftime(&amp;#039;%Y-%m-%d&amp;#039;))]&lt;br /&gt;
      &amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/record&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;menuitem name=&amp;quot;การนัดหมายวันนี้&amp;quot; id=&amp;quot;menu_histest_today_appointments&amp;quot;&lt;br /&gt;
              parent=&amp;quot;menu_histest_main&amp;quot; sequence=&amp;quot;6&amp;quot;&lt;br /&gt;
              action=&amp;quot;histest.action_histest_today_appointments&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ histest_workflow.xml ===&lt;br /&gt;
กำหนดให้มีการเรียกใช้เมท็อด action_arrived() เมื่อเข้าสู่สเตท arrived&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;record model=&amp;quot;workflow.activity&amp;quot; id=&amp;quot;act_arrived&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;wkf_id&amp;quot; ref=&amp;quot;wkf_appointment&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;name&amp;quot;&amp;gt;arrived&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;kind&amp;quot;&amp;gt;function&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;action&amp;quot;&amp;gt;action_arrived()&amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/record&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== การสร้าง Scheduled Action ==&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ histest.py ===&lt;br /&gt;
เพิ่มเมท็อดลงในโมเดล HISAppointment เพื่อใช้เป็น scheduled action&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class HISAppointment(osv.Model):&lt;br /&gt;
    :&lt;br /&gt;
    def summarize_missed_appointments(self, cr, uid, context=None):&lt;br /&gt;
        print &amp;quot;*******************************************&amp;quot;&lt;br /&gt;
        print &amp;quot;*     Summarizing missed appointments     *&amp;quot;&lt;br /&gt;
        print &amp;quot;*******************************************&amp;quot;&lt;br /&gt;
        return True&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ histest_task.xml ===&lt;br /&gt;
นิยาม cron job ที่เรียกเมท็อด summarize_missed_appointment ที่นิยามไว้ข้างต้นให้ทำงานทุก ๆ 1 นาที&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;openerp&amp;gt;&lt;br /&gt;
  &amp;lt;data&amp;gt;&lt;br /&gt;
    &amp;lt;record model=&amp;quot;ir.cron&amp;quot; id=&amp;quot;ir_cron_miss_appointment&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;name&amp;quot;&amp;gt;Summarize Missed Appointments&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;user_id&amp;quot; ref=&amp;quot;base.user_root&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;interval_number&amp;quot;&amp;gt;1&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;interval_type&amp;quot;&amp;gt;minutes&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;numbercall&amp;quot;&amp;gt;-1&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;active&amp;quot;&amp;gt;True&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;doall&amp;quot; eval=&amp;quot;False&amp;quot; /&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;model&amp;quot;&amp;gt;histest.appointment&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;function&amp;quot;&amp;gt;summarize_missed_appointments&amp;lt;/field&amp;gt;&lt;br /&gt;
      &amp;lt;field name=&amp;quot;args&amp;quot;&amp;gt;()&amp;lt;/field&amp;gt;&lt;br /&gt;
    &amp;lt;/record&amp;gt;&lt;br /&gt;
  &amp;lt;/data&amp;gt;&lt;br /&gt;
&amp;lt;/openerp&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ไฟล์ __openerp__.py ===&lt;br /&gt;
ระบุให้อ่านข้อมูลจากไฟล์ histest_task.xml &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;#039;data&amp;#039;: [&lt;br /&gt;
        &amp;#039;histest_view.xml&amp;#039;,&lt;br /&gt;
        &amp;#039;histest_report.xml&amp;#039;,&lt;br /&gt;
        &amp;#039;histest_workflow.xml&amp;#039;,&lt;br /&gt;
        &amp;#039;histest_task.xml&amp;#039;,&lt;br /&gt;
    ],&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Chaiporn</name></author>
		
	</entry>
</feed>