اذهب إلى المحتوى

لوحة المتصدرين

  1. بلال زيادة

    بلال زيادة

    الأعضاء


    • نقاط

      4

    • المساهمات

      4639


  2. Rol Ian

    Rol Ian

    الأعضاء


    • نقاط

      4

    • المساهمات

      42


  3. Abdullah Sameer

    Abdullah Sameer

    الأعضاء


    • نقاط

      3

    • المساهمات

      38


  4. Ibrahim Almahdy

    Ibrahim Almahdy

    الأعضاء


    • نقاط

      2

    • المساهمات

      104


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 09/01/25 في كل الموقع

  1. عندما أفتح موقع أكاديمية حسوب دونًا عن أي موقع تظهر هذه الرسالة، فما الحل؟
    2 نقاط
  2. هو أنا هستفاد بميزه موقع سنديان ب أي ؟ اعمل موقع احترافي لي مدى الحياه ولا أي ولا اعمل مواقع للعملاء بتوعي ولا أي بالظبط وهل ينفع اعمل موقع عليه دلوقتي ولا لا ؟
    1 نقطة
  3. 1 نقطة
  4. كيف ممكن اضيف اضافات للبي شارب مثل تلوين الكود و غيرها و ماهي الاضافات المهمة التي ممكن ان اضيفها
    1 نقطة
  5. يعني هذا سيكون مجانا لي لمده سنه هذا مقصدي وعند انتهاء السنه هل الموقع هيتسحب مني لو مدفعتش ولا اي
    1 نقطة
  6. السلام عليكم ورحمة الله وبركاته مساء الخير لدي مشكلة معقدة في ضبط الهاتف يستمر في التوقف باستمرار وميزة الرفاهية الرقمية لاتوجد فيه اريد حل للمشكلة
    1 نقطة
  7. المشكلة تظهر في هذا الجهاز فقط وعلى أي متصفح، فمثلا على الهاتف يفتح الموقع بشكل طبيعي
    1 نقطة
  8. لم استطع وضع الصورة رقم انها بنفس المجلد لكن اسم المجلد بالعربي!
    1 نقطة
  9. أنا فتحت اول طبقت بعدين حذفت الملف ويمكن ما تنحذف زين ما ادري حاولت افتح ملف ثاني ما عرفت واذا حطيت ملف جديد واجي ابي احفظة مافيه لغه html
    1 نقطة
  10. بالفعل مهنة المبرمج تحتاج تركيز كبير على الجوانب الصحية التي تتأثر بالجلوس كثيراً أما الشاشات أي طبيعة عمل المبرمج . ويعتبر أكثر المشكلات أهمية هي إصابة العين بالجفاف والتي تسبب الكثير من المشكلات ويعتبر علاجها هو استخدام أدوية مرطبة للعين النظر بعيداً عن الشاشة كل نصف ساعة وما إلى ذلك جعل المسافة بينك وبين الشاشة بعيدة قدر الإمكان ثانياً آلام الظهر والرقبة وأيضاً الركبة وهذه المشكلات يمكن معالجتها من خلال كرسي مكتب مناسب لك ويحافظ على وضعية مريحة لك وأيضاً مكتب مناسب لك ويجب الإطلاع على الشروط الواجب توافرها في المكتب والكرسي للحفاظ على صحتك قبل الشراء . وأخيراً النقطة الأهم والتي تجعل تأثير الجلوس كثيراً منعدم هي الرياضة يومياً فبدونها ستعاني من سلبيات هذه الوظيفة وأيضاً نصيحة أخيرة مهمة وهي شرب المياه كثيراً يساعد على علاج الصداع الناتج من الجلوس كثيراً أمام الشاشة
    1 نقطة
  11. أواجه مشكلة مع أن نسخة البايثون حديثة
    1 نقطة
  12. - ImportError Traceback (most recent call last) File c:\Users\Ra\AppData\Local\Programs\Python\Python311\Lib\site-packages\tensorflow\python\pywrap_tensorflow.py:73 72 try: ---> 73 from tensorflow.python._pywrap_tensorflow_internal import * 74 # This try catch logic is because there is no bazel equivalent for py_extension. 75 # Externally in opensource we must enable exceptions to load the shared object 76 # by exposing the PyInit symbols with pybind. This error will only be 77 # caught internally or if someone changes the name of the target _pywrap_tensorflow_internal. 78 79 # This logic is used in other internal projects using py_extension. ImportError: DLL load failed while importing _pywrap_tensorflow_internal: A dynamic link library (DLL) initialization routine failed. During handling of the above exception, another exception occurred: ImportError Traceback (most recent call last) Cell In[3], line 5 3 import os 4 import PIL ----> 5 import tensorflow as tf 6 from tensorflow import keras 7 from keras import Sequential File c:\Users\RA\AppData\Local\Programs\Python\Python311\Lib\site-packages\tensorflow\__init__.py:40 ... File c:\Users\RA\AppData\Local\Programs\Python\Python311\Lib\site-packages\tensorflow\__init__.py:40 ... Failed to load the native TensorFlow runtime.
    1 نقطة
  13. قمت بتحميل النسخة 3.11 ولكن لازلت أواجه نفس المشكلة
    1 نقطة
  14. تحقق مما إذا كان Python مثبتًا على جهازك. يمكنك تحميل أحدث إصدار من الموقع الرسمي وتأكد من اختيار خيار "Add Python to PATH" أثناء التثبيت. إضافة Python إلى PATH يدويًا ابحث عن "Environment Variables" في البحث على نظام Windows. افتح "Edit the system environment variables" واضغط على "Environment Variables". في قسم "System variables" أو "User variables"، ابحث عن متغير Path وأضف المسار إلى مجلد Python (مثل C:\Python39 و C:\Python39\Scripts). بعد تحديث المسار، أغلق وأعد فتح نافذة موجه الأوامر (Command Prompt) ثم جرب كتابة python --version مرة أخرى.
    1 نقطة
  15. ولكن أواجه مشكلة عند تحميل المكتبة
    1 نقطة
  16. تأكد أن إصدار بايثون الخاص بك متوافق مع إصدار TensorFlow الذي تقوم بتثبيته. TensorFlow عادةً يعمل مع بايثون 3.7-3.10 ثم تثبيت Microsoft Visual C++ Redistributable: هذه تبعية شائعة لـ TensorFlow على ويندوز. قم بتحميلها وتثبيتها من الموقع الرسمي لمايكروسوفت إذا كانت مفقودة. نفّذ pip install --upgrade pip ثم pip install tensorflow للتأكد من أن لديك أحدث إصدار وتثبيت نظيف ثم قم بإلغاء تثبيت TensorFlow باستخدام pip uninstall tensorflow ثم أعد تثبيته.
    1 نقطة
  17. لا يوجد إصدار متوافق بعد مع بايثون 3.13، ستحتاج إلى تثبيت بايثون 3.11 وحذف إصدار 3.13، ثم أعد تثبيت مكتبة tensorflow. أيضًا يجب تثبيت Microsoft Visual C++ Redistributable (x64) والتي بها ملفات ضرورية لكي تعمل مكتبة TensorFlow، لأن نواتها مبنية من خلال C++
    1 نقطة
  18. يجب التأكد من أن ملف views/pos_templates.xml يحتوي على تعليمات XML صالحة لتعديل واجهة نقطة البيع (POS) كما هو مطلوب أضف الكود التالي إلى ملف views/pos_templates.xml لتعديل واجهة نقطة البيع بحيث تتضمن خيار تحديد نوع الطلب (استلام أو توصيل) وحقول التوصيل (عنوان، عامل التوصيل، رسوم التوصيل). <?xml version="1.0" encoding="UTF-8"?> <templates id="template" xml:space="preserve"> <!-- تعديل شاشة الإيصال لإضافة خيار نوع الطلب --> <t t-extend="PosTicket"> <t t-jquery=".pos-receipt" t-operation="after"> <div class="order-type-selector"> <label>Order Type:</label> <select class="order-type" onchange="setOrderType(this)"> <option value="pickup">Pickup</option> <option value="delivery">Delivery</option> </select> </div> <!-- إضافة تفاصيل التوصيل إذا تم اختيار التوصيل --> <t t-if="order.order_type == 'delivery'"> <div class="delivery-info"> <p>Delivery Address: <t t-esc="order.delivery_address"/></p> <p>Delivery Person: <t t-esc="order.delivery_person"/></p> <p>Delivery Fee: <t t-esc="order.delivery_fee"/></p> </div> </t> </t> </t> <!-- تعديل شاشة الدفع لإضافة حقول إدخال تفاصيل التوصيل --> <t t-extend="PaymentScreenWidget"> <t t-jquery=".paymentlines" t-operation="after"> <t t-if="order.order_type == 'delivery'"> <div class="delivery-details"> <label>Delivery Address:</label> <input type="text" class="delivery-address"/> <label>Delivery Person:</label> <input type="text" class="delivery-person"/> <label>Delivery Fee:</label> <input type="number" class="delivery-fee"/> </div> </t> </t> </t> </templates> تأكد من أن ملف __manifest__.py يشير إلى ملف views/pos_templates.xml بشكل صحيح وأن الأصول (assets) تشمل الملفات في static/src/js وstatic/src/xml إذا كنت تستخدم ملفات JavaScript أو XML إضافية في تلك المجلدات. الكود الذي قدمته في __manifest__.py يبدو صحيحًا، لكن دعنا نتحقق منه. { 'name': 'Custom POS Delivery and Pickup', 'version': '1.0', 'depends': ['point_of_sale'], 'data': [ 'views/pos_templates.xml', ], 'assets': { 'point_of_sale.assets': [ 'custom_pos_delivery/static/src/js/*.js', ], }, } الكود التالي يجب أن يكون موجودًا في static/src/js/pos_delivery.js odoo.define('custom_pos_delivery.pos_delivery', function(require) { 'use strict'; var models = require('point_of_sale.models'); var PosModel = models.PosModel; models.load_fields('pos.order', ['order_type', 'delivery_address', 'delivery_person', 'delivery_fee']); var _super_order = models.Order.prototype; models.Order = models.Order.extend({ initialize: function() { _super_order.initialize.apply(this, arguments); this.order_type = 'pickup'; this.delivery_address = ''; this.delivery_person = ''; this.delivery_fee = 0.0; }, set_order_type: function(type) { this.order_type = type; this.trigger('change', this); }, set_delivery_details: function(address, person, fee) { this.delivery_address = address; this.delivery_person = person; this.delivery_fee = parseFloat(fee) || 0.0; this.trigger('change', this); }, export_as_JSON: function() { var json = _super_order.export_as_JSON.apply(this, arguments); json.order_type = this.order_type; json.delivery_address = this.delivery_address; json.delivery_person = this.delivery_person; json.delivery_fee = this.delivery_fee; return json; }, }); var _super_posmodel = PosModel.prototype; models.PosModel = models.PosModel.extend({ initialize: function() { _super_posmodel.initialize.apply(this, arguments); this.on('change:order_type', this, this.add_delivery_fee); }, add_delivery_fee: function(order) { if (order.order_type === 'delivery') { var delivery_product = this.db.get_product_by_id(DELIVERY_PRODUCT_ID); // استبدل بمعرف المنتج if (delivery_product) { order.add_product(delivery_product, { price: order.delivery_fee }); } } }, }); return models; });
    1 نقطة
  19. سنبدأ في هذا المقال من سلسلة برمجة الذكاء الاصطناعي في تعلم أساسيات لغة بايثون، وهي من أهم لغات البرمجة على الإطلاق المستخدمة في مجال الذكاء الاصطناعي، ولكنها ليست لذلك فقط؛ إذ تُستعمَل لغة بايثون في كثير من المجالات الأخرى مثل برمجة المواقع وبرامج سطح المكتب وأنظمة التشغيل وغيرها. قبل البدء في أساسيات لغة بايثون: ما هي لغة البرمجة بايثون؟ تعني بايثون في اللغة الإنجليزية نوعًا من الثعابين الكبيرة، لكنها لم تُسمى لذلك بل سُمِّيَت بهذا الاسم تيمنًا ببرنامج ترفيهي قدَّمته قناة BBC يحمل اسم Monty Python’s Flying Circus، وذلك بعد ما شاهده مخترع اللغة. وتُعَدّ بايثون لغةً برمجيةً عامةً، أي تستطيع استخدامها في مجالات عدة على عكس بعض اللغات الأخرى التي تتخصص في مجال ما دونًا عن الآخر، كما تُعَدّ لغةً بسيطةً ومتطورةً للغاية، بالإضافة إلى أنها تدعم البرمجة كائنية التوجه Object Oriented Programming أو OOP اختصارًا. صُنِعت بايثون بواسطة الهولندي جايدو فان روسم Guido van Rossum، وأُصدِرت في شهر 11 من عام 1994م بعدما عُمِل عليها في معهد الأبحاث القومي للرياضيات وعلوم الحاسوب في هولندا، في حين نُشر الإصدار الثاني من بايثون في عام 2000م؛ أما الإصدار الثالث، فقد نُشِر في عام 2008م وهو الإصدار المستخدم حاليًا من بايثون لأن الإصدار الثاني السابق قد توقف دعمه وتطويره. خصائص لغة بايثون تُعَدّ لغة بايثون لغةً مفتوحة المصدر تجد شيفرتها المصدرية على موقع GitHub، وبالتالي يستطيع أيّ مبرمج المشاركة في تطوير اللغة. وبحسب موقع جيت هاب GitHub، فقد شارك أكثر من 1200 شخص حول العالم في تطويرها، كما تُعرَف بايثون بسهولة تراكيب الجمل فيها Syntax التي تشبه تركيب اللغة الإنجليزية بنسبة كبيرة، وهي لغة مهمة جدًا للطلبة والباحثين والمهنيين على حد سواء في الكثير من النطاقات العلمية والعملية. وتتميز بايثون بالميزات التالية: لغة برمجة مفسرة Interpreted تدعم البرمجة الكائنية مناسبة للمبتدئين مدعومة بالكثير من المكتبات لغة مجانية ومفتوحة المصدر تستخدم في العديد من التخصصات لغة برمجة مفسرة Interpreted أي أنها تُنفَّذ مباشرةً مثل لغة PHP ولغة Perl، ولا تحتاج إلى تصريف كامل الشيفرة أولًا ثم تنفيذها مثل لغة C، فلا يتطلب الأمر تحويل الشيفرة الخاصة بك إلى شيفرة ثنائية تفهمها الآلة أولًا لتبدأ عملية التنفيذ، وهذا قد يميز شيفرات بايثون في سرعة تنفيذها أثناء البرمجة. وفي تلك النقطة بالتحديد قد يختلف بعض المبرمجين، فالبرغم من تصنيف بايثون أنها لغة مفسَّرة، إلا أنّ الشيفرة تُصرَّف compiled أولًا ليستطيع المُفسِّر فهمها قبل تنفيذها، لذلك قد تجد بعض النقاشات المتباينة حول بايثون لمحاولة تصنيفها تصنيفًا دقيقًا. يذهب بعض المبرمجين إلى القول بأنّ لغة بايثون لها طريقتها الخاصة في تلك النقطة، فالأمر معقَّد ولا نريد الخوض فيه. تدعم البرمجة الكائنية تدعم بايثون نمطًا يُدعى الكائنية في البرمجة Object-oriented programming (أو تدعى الشيئية أحيانًا)، وهو نمط شهير ومهم، إذ تُكتَب الشيفرة ويُتعامَل مع أجزاء التطبيق على أساس الكائنات Objects، وهو نمط غير مدعوم في بعض اللغات القديمة مثل لغة C، كما أنها تدعم البرمجة الوظيفية Functional والهيكلية Structured وغيرها. أساسيات لغة بايثون مناسبة للمبتدئين تُعَد بايثون مناسبةً جدًا للمبتدئين، حيث أنَّ صياغة الجمل فيها بسيطة للغاية، ولا يتطلب الأمر الدخول في تفاصيل كثيرة عند كتابتها؛ لذلك فهي سهلة التعلم والقراءة. مدعومة بالكثير من المكتبات يمكنك في بايثون إيجاد مكتبات بسيطة الاستخدام تستطيع بها برمجة تطبيقات معقدة جدًا، فهي لغة لديها أرشيف واسع من المكتبات في كافة المجالات تقريبًا. لغة مجانية ومفتوحة المصدر توجد بعض لغات البرمجة غير المجانية، أي أنك مُطالَب بدفع الأموال لشركة ما، كي تستطيع استخدام تلك اللغة، كما أنَه لا يمكنك ولا يمكن لأيّ شخص آخر إصلاح مشكلة ما في اللغة أو أن يطوِّر ميزةً أو خاصيةً جديدةً في اللغة، فالشيفرة المصدرية في تلك الحالة تقع تحت أيدي الشركة المصنعة فقط، وهي الوحيدة التي يحق لها تطوير اللغة أو إصلاح مشاكلها أو إصدار نسخ جديدة منها. أما في بايثون والعديد من اللغات المجانية المفتوحة المصدر، فالأمر مختلف إذ عمِل على على لغة بايثون أكثر من 1200 شخص حول العالم، فالشيفرة المصدرية للغة موجودة ومتاحة على موقع GitHub، ويمكن لأيّ شخص له الخبرة والمعرفة الكافية أن يطوِّر أو يعدِّل ميزةً ما، كما يستطيع مجتمع مبرمِجي بايثون على الإنترنت من المشاركة بآرائهم في تطوير اللغة، فالأمر بالجميع وللجميع، وهي لغة مجانية بالكامل تستطيع استخدامها في أيّ مشروع خيري أو تجاري، بدون أية مشاكل قانونية على الإطلاق. تستخدم في العديد من التخصصات لا يقتصر الأمر أبدًا على برمجة الذكاء الاصطناعي وتعلّم الآلة، ولا يقتصر على برمجة مواقع الويب أيضًا، إذ تُعَدّ بايثون من أكثر لغات البرمجة انتشارًا وتوغلًا في العديد من المجالات في حياتنا اليومية، وفي التخصصات العلمية والأبحاث ومعامل ومختبرات الجامعات حول العالم، لذلك بتعلُُّمك للغة بايثون فإنّ الأمر لا يقتصر على فرصة عمل في مجال الذكاء الاصطناعي فحسب، وإنما تستطيع استخدام معرفتك وخبرتك في بايثون في مجالات أخرى تفتح عليك أبواب دخل إضافية. تُشتهر بايثون أيضًا في استخدامها في برمجة المواقع وتطبيقات سطح المكتب وبرمجة برامج تجارية عبر بايثون مثل أودوو Odoo الذي يُعَدّ أشهرها وله متخصصين وشركات تجارية تعتمد كليةً على استخدامه. كما أنَّ لغة بايثون كما أوردنا تدخل في الكثير من مجالات البحث العلمي، فهي من أكثر اللغات التي تحتوي على مكتبات تهدف إلى خدمة مجالات البحث العلمي والرياضيات من الذكاء الاصطناعي حتى التغير المناخي وتُعَد دراسة لغة بايثون أمرًا أساسيًا بالنسبة لمبرمجي الذكاء الاصطناعي، لذلك سنبدأ الآن في دراسة أساسيات اللغة حتى نكون على قدر من المعرفة المطلوبة لنبدأ في دراسة وتطبيق الخوارزميات الأساسية في تعلُّم الآلة. لذلك فإن السهل البدء بتعلم أساسيات بايثون والبدء في عالم البرمجة بسهولة. تثبيت لغة بايثون أول ما نبدأ به في تعلم أساسيات لغة Python ولكي تستطيع العمل بلغة بايثون، يجب عليك أولًا تثبيت البرنامج الذي يفهم اللغة ثم ينفذها، وذلك لكي يستطيع حاسوبك التعرف على الأوامر التي تكتبها لتعمل عليه بصورة صحيحة، لذلك من الضروري أن تكون أول خطوة نقوم بها هي تثبيت لغة بايثون على حاسوبك. يختلف أمر تثبيت اللغة باختلاف نظام التشغيل، فإذا كان حاسوبك مثلًا يعمل على نظام لينكس Linux، فعلى الأرجح أنّ حاسوبك مثبَّت عليه بالفعل لغة بايثون، وللتأكد من ذلك يمكنك فتح الطرفية Terminal ثم كتابة الأمر الآتي: >> python --version أول الأمر التالي بالنسبة للإصدار الثالث: >> python3 --version إذا كانت بايثون مثبتةً بالفعل على حاسوبك، فسيظهر لك رقم الإصدار المثبَّت، والجدير بالذكر أنه يجب أن يكون الإصدار المثبت لديك هو الإصدار الثالث، وبالتالي يجب بدء رقم الإصدار بالرقم 3؛ أما إذا لم تكن اللغة مثبتةً على حاسوبك، فيمكنك ذلك عبر تنفيذ الأمر الآتي في الطرفية Terminal على لينكس. >> sudo apt-get install python3.6 أما إذا كنت مستخدِمًا لنظام التشغيل ماك macOS بمختلف إصداراته، فعلى الأغلب أيضًا أنّ لغة بايثون مثبتة بالفعل على حاسوبك، وتستطيع اختبار ذلك عبر الأمر السابق ذكره بخصوص نظام لينكس، فإذا لم تكن اللغة مثبتةً، فيمكنك ببساطة تثبيتها مثل أيّ برنامج أخر عن طريق الموقع الرسمي للغة /Python. بعد تثبيت اللغة بالطرق الموضحة أعلاه في نظامي لينكس وماكينتوش، فمن المحتمل ألا يعمل أمر التحقق من الإصدار وألا يكون جاهزًا للعمل بعد، إذ أنه قد لا يُتعرَّف على برنامج بايثون عندما تُنفِّذ الأمر التالي: >> python --version ولحل ذلك يجب تنفيذ الأمر التالي في الطرفية Terminal: >> export PYTHONPATH=/usr/local/bin/python3.6 مع تغيير كلمة python3.6 لأنها قد تختلف حسب الإصدار الذي ثبَّته؛ لذلك يجب التحقق من ذلك المسار على حاسوبك أولًا لترى أيّ الإصدارات يجب استدعاؤها في الأمر السابق. أما في حالة مستخدمي نظام الويندوز، فالأمر بسيط للغاية، إذ تستطيع تنزيل برنامج اللغة من الموقع الرسمي السالف ذكره، ثم تثبيته مثل أيّ برنامج آخر على حاسوبك دون تعقيدات قد لا يعمل كذلك أمر التحقق من إصدار اللغة بصورة تلقائية بعد التثبيت، ولحل ذلك ببساطة يمكنك فتح موجِّه الأوامر Command Prompt في ويندوز ثم تنفيذ الأمر الآتي: >> %path%;C:\Python مع الأخذ في الحسبان إمكانية تغيير النص C:\Python إذا كنت قد تثبَّت اللغة في مسار آخر على حاسوبك أثناء عملية التثبيت. استعمال بايثون مع خدمة Google Colab ضمن أساسيات لغة بايثون وبالرغم من سهولة عملية تثبيت بايثون على حاسوبك، فإنه ليس من الضروري فعلًا فعل تلك الخطوات السالف ذكرها، فقد أصدرت شركة جوجل مؤخرًا ما يُدعى Google Colaboratory عبر موقع الأبحاث الخاص بها \colab.research، وبالتالي تستطيع ببساطة استخدام تلك الخاصية بإنشاء ذلك النوع من الملفات على خدمة Google Drive الموجودة مجانيًا لأي عنوان بريد إلكتروني مُسجَّل على Gmail، بعدها يمكنك البدء في كتابة وتنفيذ شيفرة البايثون الخاصة بك عبر الإنترنت دون الحاجة إلى الدخول في الكثير من التعقيدات والمشاكل التقنية أثناء تعلمك، أو حتى أثناء عملك في برمجة الذكاء الاصطناعي. كما تحتوى تلك الخدمة تلقائيًا على معظم وأهم مكتبات بايثون المستخدَمة في مجال الذكاء الاصطناعي عامةً ومجال تعلّم الآلة خاصةً، فنجد مثلًا تلقائيًا في تلك الخدمة أنّ مكتبات متخصصة في الرياضيات مثل Numpy، ومكتبات متخصصة في رسم البيانات مثل Matplotlib ومكتبات متخصصة في خوارزميات تعلّم الآلة مثل Keras، ومكتبات متخصصة في التعلّم العميق والشبكات العصبية مثل Tensorflow …إلخ مثبتة ومتاحة للاستخدام مباشرةً. أُصدِرت الخدمة أساسًا للتسهيل على العاملين في مجال برمجة الذكاء الاصطناعي، وبالأخص تعلُّم الآلة ليستطيع المبرمج مشاركة الشيفرة المصدرية الخاصة به مع نتائج هذه الشيفرة والملاحظات مع شركائه في العمل أو أي شخص آخر، وهي خدمة سحابية بالكامل، أي أنها تعمل عبر الإنترنت ولا تحتاج إلى أي متطلبات أو إمكانيات في حاسوبك، فكل ما تحتاجه لاستخدام الخدمة هي وصلة الإنترنت وعنوان بريد إلكتروني من Gmail. أفضِّل شخصيًا استخدام تلك الخدمة أثناء التعلم لأنها بسيطة وسهلة، وتحتوي تلقائيًا على الكثير من مكتبات بايثون الخاصة بالذكاء الاصطناعي التي قد يكون تثبيت بعضها عملًا شاقًا إذا حدث خطأ ما أثناء التثبيت والسبب الآخر الذي يدفعني إلى التوصية باستخدام تلك الخدمة بشدة، هو عدم امتلاك بعض أجهزة الحاسوب للإمكانيات اللازمة لتشغيل نماذج تعلّم الآلة، إذ تحتاج بعض الخوارزميات إلى ذاكرة عشوائية RAM كبيرة ليُدرَّب النموذج تدريبًا صحيحًا، وذلك اعتمادًا على حجم البيانات المتدفقة إلى النموذج. ولمزيد من التفاصيل، ارجع إلى مقال دليل استخدام Google Colab. برنامجك الأول في لغة بايثون من أساسيات لغة بايثون أنك تستطيع البدء في كتابة برنامجك الأول بعدة من الطرق، أولها عبر كتابة الشيفرة مباشرةً في الطرفية Terminal في لينكس وماك وموجِّه الأوامر Command Prompt في ويندوز؛ وثانيها، كتابة البرنامج في ملف أو عدة ملفات منفصلة، ثم تشغيلها عبر البرامج السابق ذكرها؛ أما ثالثها فتكون عن طريق خدمة Google Colab التي ذكرناها سابقًا. أما كتابة الشيفرة مباشرة في الطرفية وموجه الأوامر، فالخطوات لذلك بسيطة، وكل ما عليك فعله بعد فتح أحد تلك البرامج حسب نظام التشغيل الخاص بحاسوبك هو تنفيذ الأمر الآتي: >> python أو الأمر التالي بالنسبة للإصدار 3 من بايثون: >> python3 تستطيع بعد ذلك كتابة أوامر بايثون مباشرةً وتنفيذها، كما يمكنك الخروج من هذه الشاشة بعد ذلك عبر كتابة الأمر الآتي: >> quit() وأما كتابة الشيفرة في ملف منفصل، فتستطيع إنشاء ملف جديد في أيّ مكان في حاسوبك وتسميته بأيّ اسم تريده، كما يفضَّل أن يكون الاسم معبِّرًا، فالتسمية البسيطة والمعبِّرة من الأمور المهمة. احفظ بعد ذلك الملف بصيغة py -وهي صيغة اختصارية لكلمة Python-، فإذا كان مثلًا اسم الملف Program، فستكون التسمية الكاملة للملف Program.py، ثم اذهب إلى المكان المخزن فيه الملف غبر الطرفية أو موجِّه الأوامر، وبعدها نفِّذ الأمر التالي: >> python Program.py والطريقة الثالثة، تستطيع ببساطة استخدام Google Colab من خدمة Google Drive ومن ثم إنشاء ملف جديد من نوع Google Colaboratory، ثم البدء في إضافة الفقرات، فيمكنك إضافة شيفرات بايثون في ذلك الملف بجانب نصوص عادية وبذلك تستطيع كتابة ملاحظات وتعليقات بين أسطر الشيفرات ويمكنك في الوقت نفسه تنفيذ الشيفرات ككل أو أجزاء محددة. سنبدأ بأمر الطباعة لكتابة أول برنامج بايثون خاص بك، فوظيفة أمر الطباعة في بايثون وفي كثير من اللغات الأخرى، هي طباعة نص على شاشة المستخدِم عند تشغيل البرنامج، وقد ذكرنا ذلك الأمر سابقًا عند الحديث عن الخوارزميات في البرمجة، فعند كتابة الأمر print والذي يعني اطبع بالإنجليزية، فيجب إلحاقه بقوسين، ومن ثم فتح علامات تنصيص بداخل القوسين تحتوى على الجملة التي نريد طباعتها. print ("Hello World") قد يُستخدَم الأمر print لطباعة النصوص على الشاشة أو لطباعة الأرقام، فالأمر سيان في حالة الطباعة، ولكن لا يجب إضافة علامات تنصيص في حالة طباعة الأعداد. print (3) >> 3 كما أنه من الممكن طباعة نتيجة عملية رياضية بسيطة مثل عمليات الجمع والطرح كما في الأمثلة الآتية: print (3+3) >> 6 print (6-4) >> 2 يمكن أيضًا طباعة عمليات الضرب والقسمة وباقي القسمة، إذ يمكنك عبر كتابة الشيفرة التالية طباعة حاصل ضرب عددين مثلًا: print (6*6) >> 36 والأمر بسيط كذلك لطباعة حاصل قسمة عددين: print (49/7) >> 7.0 أما حالة طباعة باقي القسمة، فسنستخدِم رمز النسبة المئوية %: print (50%7) >> 1 كما يمكنك طباعة أيّ عدد من النصوص باستخدام علامة الزائد + كما في المثال الآتي: print ("Hello " + "World!") >> Hello World! إذا أردنا تضمين قيمة عددية داخل نص، فيجب فيجب تحويل العدد إلى نص لأنّ الأعداد في بايثون وفي عدد من اللغات الأخرى عمومًا هي نوع من أنواع البيانات، لذلك يجب استخدام دالة str في هذه الحالة لتحويل العدد إلى نص لتستطيع لغة بايثون التعامل معها على أساس نص. print ("Hello "+str(2)+"nd "+"World!") >> Hello 2nd World! نستطيع الاستغناء عن دالة str إذا أدرجنا الأعداد داخل علامات التنصيص، إذ ستَعُدّ بايثون الأعداد داخل علامات التنصيص نصًا عاديًا، كما سنتعرف على الدوال بصورة أكبر في الصفحات القادمة. print ("Hello " + "2nd " + "World!") >> Hello 2nd World! المعرفات في بايثون تعد المعرِّفات Identifiers من أساسيات البايثون وهي الكلمات التي تستطيع من خلالها تعريف اسم متغير Variable أو ثابت Constant أو دالة Function أو صنف Class أو وحدة Module، ونختصر ذلك كله الآن بكلمة المعرِّفات فقط للدلالة على أيّ منهم، فتلك المتغيرات والثوابت والدوال والأصناف والوحدات، كلها مواضيع وسنتعرف عليها بالتفصيل في هذا الكتاب. تخضع تسمية المعرفات إلى قواعد محدَّدة لا يُمكن الخروج عنها في بايثون؛ لأنه عند الخروج عن إحدى القواعد سيطبع مفسر بايثون رسالة خطأ عند محاولتك تشغيل البرنامج، وتلك القواعد كما يلي: يجب أن تبدأ بحرف إنجليزي أو شَرطة سفلية Underscore _ ولا يُمكنها البدء برقم أبدًا. لا يمكنها احتواء رموز مثل % أو $ أو & …إلخ، ولكن يمكنها احتواء الأرقام. ألا تكون مطابقةً لأيّ كلمة من الكلمات المفتاحية في بايثون. الكلمات المفتاحية في بايثون هي كلمات تُستخدَم في أصل اللغة، بمعنى أنّ تلك الكلمات يقرؤها مفسر لغة بايثون لإجراء مهمة ما، فكلمة مثل print كما علمنا من قبل تؤدي مهمة طباعة نص أو عدد على الشاشة، لذلك لا نستطيع تعريف متغير أو ثابت أو دالة بهذا الاسم، وتكون جميع الكلمات المفتاحية في لغة بايثون كما يلي: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } and exec not as finally or assert for Pass break from print class global raise continue if return def import try del in while elif is with else lambda yield except والجدير بالذكر أنّ جميع تلك الكلمات المفتاحية لا تحتوي على أي حرف كبير، وبما أنّ لغة بايثون لغة حساسة لحالة الأحرف، فمن تسمية أيّ معرِّف بتلك الكلمات في حالة تغيير حالة الأحرف، بمعنى أنه لا يُمكنك تسمية متغير باسم print، لكن يمكنك تسمية متغير باسم Print أو PRINT لأنه بالنسبة لبايثون، تكون الكلمات الثلاثة السابقة مختلفةً تمامًا عن بعضها، وبناءً على ذلك، فإذا أردت تسمية متغير أو دالة أو صنف في بايثون، فيجب عليك اتباع القواعد السابقة. كما أنّ هناك أيضًا في بايثون بعض التوصيات أثناء التسمية، وهي ليست قواعدًا يجب اتباعها بل هي أقرب إلى العُرف، ولكن من الأفضل اتباعها حتى تكون الشيفرة المصدرية في أفضل صورة ممكنة، وتلك التوصيات هي كما يلي: اسم الصنف من المفضل أن يبدأ بحرف كبير مثل Mouse وليس mouse. جميع المعرِّفات الأخرى مثل المتغيرات والدوال من الأفضل أن تبدأ بحرف صغير. إذا عرَّفت متغيرًا ما خاصًا، ولا تريد أن يُستخدَم في أيّ مكان آخر في البرنامج، فمن المفضل بدء اسم المتغير بشرطة سفلية واحدة أو شرطتين إذا كان المتغير خاصًا جدًا. السطور والمسافات لدى بايثون نوعًا فريدًا من القواعد عندما يتعلق الأمر بالأسطر والمسافات وتنظيم الشيفرة، إذ تستخدِم معظم لغات البرمجة الأخرى الأقواس المعقوصة { } لكتابة كتلة من الشيفرات، لكن الأمر في بايثون مختلف قليلًا، إذ تُنظَّم كتل الشيفرات باستخدام المسافات، وهي عادةً مسافة جدولة Tab، أو فراغين أو أربعة فراغات spaces، فنكتب كتلةً من الشيفرات لتُنفَّذ عند تحقق شرط معين بالشكل التالي: if something_happens: do_this() else: do_that() نقول للمفسر في المثال السابق الوهمي إذا حدث هذا الأمر، افعل هذا؛ وإذ لم يحدث، افعل ذاك، فالأمر بسيط للغاية، المهم دقق بالمسافات وكيف أن do_this تدخل ضمن الشرط if أما do_that فتدخل ضمن else. وبالمثل، عند كتابة كتلة من الشيفرة داخل أيّ قاعدة شرطية أو غيرها من القواعد، يجب عليك البدء في كتابة أسطر الشيفرة الخاصة بالكتلة بعد مسافة تفصل بينها وبين أول السطر، أو بمعنى أدق تفصل بينها وبين كتلة الشيفرة التي تسبقها، انظر مثلًا: count = 10 if count >= 10: if count <= 20: print ("Count is between 10 and 20") else: print ("Count is larger than 20") else: print ("Count is less than 10") وإليك المثال التالي لموازنة طريقة بايثون تلك مع اللغات الأخرى مثل لغة جافاسكربت: let count = 10; if (count <= 20) { if (count <= 20) { console.log("Count is between 10 and 20"); } else { console.log("Count is larger than 20"); } } else { console.log("Count is less than 10"); } تضمَّن كتل الشيفرة في هذا المثال بداخل القواعد الشرطية داخل أقواس معقوصة بغض النظر عن المسافة بين كل سطر وبدايته، المثال السابق يكافئ: let count = 10; if (count <= 20) { if (count <= 20) { console.log("Count is between 10 and 20"); } else { console.log("Count is larger than 20"); } } else { console.log("Count is less than 10"); } المثالان السابقان متطابقان تمامًا ويعملان بلا مشكلة؛ أما في بايثون، فتخضع الشيفرة إلى قاعدة مسافات الأسطر تلك، ولا يُمكن كسر تلك القاعدة، كما أنّ كافة مبرمجي بايثون يحبون قاعدة المسافات لأنها تُجبِر المبرمجين على كتابة شيفرة بسيطة ومنظمة وسهلة القراءة. ومن أساسيات البايثون وأهم القواعد الخاصة بالأسطر في بايثون، نجد قاعدة استكمال الأسطر، فإذا كنت تكتب سطرًا ما وكان هذا السطر طويلًا للغاية وتريد تقسيمه إلى سطرين، فستستطيع في بايثون تحقيق ذلك عبر استخدام الرمز \، فإذا كتبت سطرًا يجمع رقمَين مثلًا ثم يقسم أحدهما على الآخر، وكنت تريد تجزئة هذا السطر إلى سطرين مختلفين، فيمكنك فعل ذلك كما في المثال التالي: 30 + 6 / 6 >> 31.0 30 + 6 \ / 6 >> 31.0 كتبنا في السطر الأول عملية الجمع مع عملية القسمة في سطر واحد مباشرةً وأنتج ذلك العدد 31، أما في المثال الثاني كتبنا عملية الجمع في السطر الأول فقط، ثم ألحقنا عملية الجمع بالرمز \، واستكملنا السطر التالي العمليات بكتابة عملية القسمة مباشرةً، وأنتج ذلك في النهاية العدد نفسه، لكن توجد مع ذلك حالة خاصة لأيّ سطر في بايثون يحتوي على إحدى الأقواس بمختلف أنواعها، مثل [] أو {} أو ()، إذ يمكن كتابة تلك الأسطر على سطرين أو أكثر دون استخدام الرمز السابق ذكره، فالسطر التالي مثلًا يعمل بدون مشكلة حتى مع عدم استخدامنا للرمز. items = ['item_1', 'item_2', 'item_3', 'item_4', 'item_5', 'item_6'] علامات التنصيص توجد اختلافات بسيطة بين علامات التنصيص في لغة بايثون مثل أي لغة برمجة أخرى، إذ يمكنك في بايثون تضمين أيّ نص بين علامتَي تنصيص مُفرَدة ' أو علامتي تنصيص مزدوجة " أو علامتي تنصيص ثلاثية """ أو ''' لكن من أهم قواعد استخدام علامات التنصيص في بايثون هي إنهاء النص بعلامة التنصيص نفسها المُستخدَمة في البداية، فلا يُمكن استخدام علامة تنصيص مُفرَدة في بداية النص ثم استخدام علامة تنصيص مزدوجة في نهايته، وإنما يجب تطابق العلامة في البداية والنهاية للنص الواحد، وإليك أمثلةً على ذلك في أوامر الطباعة: print ("Hello World!") print ('Hello World!') print ("""Hello World!""") أما بالنسبة لعلامات التنصيص الثلاثية، فتُستخدَم في الغالب لامتلاكها ميزةً غير موجودة في العلامات المفرَدة والمزدوجة، إذ تُعَدّ قادرةً على معالجة النصوص التي تتكون من أكثر من سطر، في حين أنّ علامات التنصيص المُفردة والمزدوجة يجب احتوائها على نص مكوَّن من سطر واحد لا أكثر، فلا يمكنك مثلًا طباعة سطرين متتالين عبر علامات التنصيص المزدوجة، أي لا يمكنك تنفيذ المثال التالي في بايثون بصورة صحيحة: print ("Hello World!") لكن يمكنك تنفيذ ذلك الأمر عند استخدام علامات التنصيص الثلاثية كما يلي: print ("""Hello World!""") >> Hello World! التعليقات في أساسيات لغة بايثون ستحتاج في كثير من الأوقات أثناء كتابتك أو عملك على برنامج ما، إلى كتابة بعض الملاحظات على بعض الأسطر، فقد تكون تلك الملاحظات موجهةً لتذكيرك بكيفية عمل هذه الكتلة من الشيفرة، أو لتذكيرك بأمر ما تريد استكماله في هذه الأسطر في وقت لاحق، وتوفر بايثون مثلها مثل بقية لغات البرمجة إمكانية كتابة التعليقات عبر استعمال الرمز # والذي سيؤدي إلى تجاهل ما يليه حتى آخر السطر، انظر مثلًا الشيفرة التالية: # هذا تعليق print ("Hello, Python!") # تعليق آخر >> Hello, Python! كما ترى، فإنّ المثال السابق يعمل عملًا عاديًا وكأنه مكتوب بالشكل التالي دون تعليقات: print ("Hello, Python!") >> Hello, Python! فإذا كتبت أيّ سطر برمجي بعد رمز # فسيتجاهله مفسر بايثون تمامًا كما لو أنه غير موجود؛ وذلك لأن التعليقات هي في الأساس جمل من اللغة الطبيعية البشرية التي يستخدمها المبرمج للتعليق وكتابة الملاحظات بين تعليمات البرنامج. كما أنه في بايثون توجد طريقة أخرى لكتابة التعليقات في أسطر عدة، وذلك باستخدام علامات التنصيص الثلاثية، ومن مميزات هذه الطريقة أنها قد تُستخدم في توثيق الدوال وغير ذلك، كما أن هنالك أدوات تستخلص تلك التعليقات لتوليد توثيق لشيفرة البرنامج ووظائفه. """This is a multi line comment. It's wonderful how easy is Python language!""" print ("Hello World!") تُستخدَم التعليقات استخدامًا كبيرًا أثناء برمجة التطبيقات المعقَّدة، فغير أنها تُستخدَم للتعليق على الشيفرة، فإنها قد تكون مفيدةً بصورة كبيرة في تعطيل وتفعيل بعض الأسطر في الشيفرة أثناء عملك على حل مشكلة ما، مثل نسخ سطر ما ووضعه بداخل التعليق حتى يتجاهله البرنامج، ولكي أحتفظ بذلك السطر لاستخدامه لاحقًا. تعليمات متعددة في سطر واحد تنتهي التعليمة البرمجية في السطر في معظم لغات البرمجة مثل لغة PHP أو جافاسكربت JavaScript عن طريق كتابة رمز الفاصلة المنقوطة ; مما يسمح بكتابة أكثر من تعليمة برمجية في سطر واحد؛ أما في بايثون، فينتهي السطر عن طريق بداية سطر جديد، ولكن مع ذلك تدعم بايثون تلك الميزة أيضًا، إذ يمكنك إنهاء التعليمة البرمجية عبر الرمز ; وهو بالإنجليزية Semicolon، وهو أمر اختياري وليس إجباريًا كما في اللغات الأخرى، وبذلك تستطيع كتابة أكثر من تعليمة برمجية في سطر واحد مثل اللغات الأخرى. print ("Hello"); print("World") >> Hello >> World اقرأ أيضًا المقال السابق: البرمجة والخوارزميات والذكاء الاصطناعي المرجع الشامل إلى تعلم لغة بايثون النسخة العربية الكاملة من كتاب البرمجة بلغة بايثون
    1 نقطة
  20. إضافة خيار قبل إنشاء الطلب (استلام من الفرع أو توصيل إلى المنزل) لإضافة خيار لتحديد نوع الطلب (استلام من الفرع أو توصيل) قبل إنشاء الطلب في جلسة نقطة البيع، يمكنك استخدام إضافة مخصصة (Custom Module) لتعديل واجهة المستخدم وسلوك النظام. قم بإنشاء موديول جديد في مجلد الـ addons الخاص بـ Odoo. قم بإنشاء الهيكلية التالية للموديول custom_pos_delivery/ ├── __init__.py ├── __manifest__.py ├── models/ │ ├── __init__.py │ ├── pos_order.py ├── static/ │ ├── src/ │ ├── js/ │ ├── xml/ └── views/ ├── pos_templates.xml عداد ملف __manifest__.py { 'name': 'Custom POS Delivery and Pickup', 'version': '1.0', 'depends': ['point_of_sale'], 'data': [ 'views/pos_templates.xml', ], 'assets': { 'point_of_sale.assets': [ 'custom_pos_delivery/static/src/js/*.js', 'custom_pos_delivery/static/src/xml/*.xml', ], }, } تعديل واجهة المستخدم (JavaScript وXML) في static/src/xml/pos_templates.xml، أضف زرين أو قائمة منسدلة لتحديد نوع الطلب (استلام أو توصيل) في واجهة نقطة البيع. <t t-extend="PosTicket"> <t t-jquery=".pos-receipt" t-operation="after"> <div class="order-type-selector"> <label>Order Type:</label> <select class="order-type" onchange="setOrderType(this)"> <option value="pickup">Pickup</option> <option value="delivery">Delivery</option> </select> </div> </t> </t> في static/src/js/pos_delivery.js، أضف منطقًا لتخزين نوع الطلب في جلسة نقطة البيع odoo.define('custom_pos_delivery.pos_delivery', function(require) { 'use strict'; var models = require('point_of_sale.models'); var PosModel = models.PosModel; models.load_fields('pos.order', ['order_type']); var _super_order = models.Order.prototype; models.Order = models.Order.extend({ initialize: function() { _super_order.initialize.apply(this, arguments); this.order_type = 'pickup'; // Default value }, set_order_type: function(type) { this.order_type = type; this.trigger('change', this); }, export_as_JSON: function() { var json = _super_order.export_as_JSON.apply(this, arguments); json.order_type = this.order_type; return json; }, }); return models; }); تعديل نموذج pos.order في Python في models/pos_order.py، أضف حقلًا لتخزين نوع الطلب from odoo import fields, models class PosOrder(models.Model): _inherit = 'pos.order' order_type = fields.Selection([ ('pickup', 'Pickup'), ('delivery', 'Delivery') ], string='Order Type', default='pickup') قم بتثبيت الموديول الجديد من خلال واجهة Odoo (Apps > Update Apps List > Install). تأكد من تمكين وضع المطور (Developer Mode) لتسهيل التعديلات. إضافة عنوان العميل، اسم عامل التوصيل، ورسوم التوصيل إذا تم اختيار "توصيل إلى المنزل"، يمكنك إضافة حقول لإدخال عنوان العميل، اسم عامل التوصيل، ورسوم التوصيل. إضافة حقول إضافية إلى نموذج pos.order في models/pos_order.py، أضف الحقول التالية from odoo import fields, models class PosOrder(models.Model): _inherit = 'pos.order' order_type = fields.Selection([ ('pickup', 'Pickup'), ('delivery', 'Delivery') ], string='Order Type', default='pickup') delivery_address = fields.Char(string='Delivery Address') delivery_person = fields.Char(string='Delivery Person') delivery_fee = fields.Float(string='Delivery Fee') تعديل واجهة نقطة البيع لإدخال التفاصيل في static/src/xml/pos_templates.xml، أضف حقول إدخال تظهر عند اختيار "توصيل" <t t-extend="PaymentScreenWidget"> <t t-jquery=".paymentlines" t-operation="after"> <t t-if="order.order_type == 'delivery'"> <div class="delivery-details"> <label>Delivery Address:</label> <input type="text" class="delivery-address"/> <label>Delivery Person:</label> <input type="text" class="delivery-person"/> <label>Delivery Fee:</label> <input type="number" class="delivery-fee"/> </div> </t> </t> </t> في static/src/js/pos_delivery.js، أضف منطقًا لحفظ بيانات التوصيل odoo.define('custom_pos_delivery.pos_delivery', function(require) { 'use strict'; var models = require('point_of_sale.models'); var PosModel = models.PosModel; models.load_fields('pos.order', ['order_type', 'delivery_address', 'delivery_person', 'delivery_fee']); var _super_order = models.Order.prototype; models.Order = models.Order.extend({ initialize: function() { _super_order.initialize.apply(this, arguments); this.order_type = 'pickup'; this.delivery_address = ''; this.delivery_person = ''; this.delivery_fee = 0.0; }, set_delivery_details: function(address, person, fee) { this.delivery_address = address; this.delivery_person = person; this.delivery_fee = parseFloat(fee) || 0.0; this.trigger('change', this); }, export_as_JSON: function() { var json = _super_order.export_as_JSON.apply(this, arguments); json.order_type = this.order_type; json.delivery_address = this.delivery_address; json.delivery_person = this.delivery_person; json.delivery_fee = this.delivery_fee; return json; }, }); return models; }); إذا كنت تريد إضافة رسوم التوصيل كعنصر في الفاتورة، قم بإنشاء منتج افتراضي في Odoo يسمى "رسوم التوصيل" (Delivery Fee) وقم بإضافته تلقائيًا إلى الطلب عند اختيار التوصيل في static/src/js/pos_delivery.js، أضف منطقًا لإضافة المنتج var _super_posmodel = PosModel.prototype; models.PosModel = models.PosModel.extend({ initialize: function() { _super_posmodel.initialize.apply(this, arguments); this.on('change:order_type', this, this.add_delivery_fee); }, add_delivery_fee: function(order) { if (order.order_type === 'delivery') { var delivery_product = this.db.get_product_by_id(DELIVERY_PRODUCT_ID); // استبدل بمعرف المنتج if (delivery_product) { order.add_product(delivery_product, { price: order.delivery_fee }); } } }, }); قم بتعديل قالب الإيصال في pos_templates.xml لإظهار عنوان التوصيل، اسم عامل التوصيل، ورسوم التوصيل <t t-extend="PosTicket"> <t t-jquery=".pos-receipt" t-operation="after"> <t t-if="order.order_type == 'delivery'"> <div class="delivery-info"> <p>Delivery Address: <t t-esc="order.delivery_address"/></p> <p>Delivery Person: <t t-esc="order.delivery_person"/></p> <p>Delivery Fee: <t t-esc="order.delivery_fee"/></p> </div> </t> </t> </t> إذا كنت تريد تحديد عامل التوصيل من قائمة موظفين، يمكنك إضافة حقل مرتبط بنموذج hr.employee class PosOrder(models.Model): _inherit = 'pos.order' delivery_person_id = fields.Many2one('hr.employee', string='Delivery Person') أو يمكنك إضافة جاهزة من Odoo Apps Store إذا كنت لا ترغب في تطوير موديول مخصص بنفسك، يمكنك استخدام إضافة مثل "POS TakeAway Order" من Odoo Apps Store، والتي تدعم إدارة الطلبات الخارجية وتفاصيل التوصيل.
    1 نقطة
×
×
  • أضف...