如何将静态文件夹添加到我的Odoo自定义模块?

时间:2018-12-09 14:40:01

标签: soap odoo

如何添加一个静态文件夹,其中包含一些SOAP客户端所需的wsdl和xsd文件,以及它与我的Odoo 11自定义模块的相关路径?

------------更新---------

我在模块中创建了一个静态文件夹,其中包含src文件夹,其中包含我想要的文件。需要从我的控制器访问这些文件,正确的完整路径是什么?我应该在使用之前在任何地方添加该路径吗?

这是我试图使用文件的控制器:

检查提供给客户端的路径(zeep_test / static / src / uhud / Uhud.wsdl)

from zeep import Client, Settings, xsd
import datetime
from odoo import http
from lxml.etree import tostring

class WaseelCrm(http.Controller):
   @http.route('/test/zeep', type='json', methods=['POST'], auth="public", website=True, csrf=False)
   def test_zeep(self):
       settings = Settings(strict=False, xml_huge_tree=True)
       client = Client('zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)

       factory = client.type_factory('ns0')

       transaction = factory.TransactionCT('1.1', 'NEW', None, None, 'REQUEST')
       user = factory.UserCT('admin', 'admin', 'Ahmed Yasser')
       interaction = factory.InteractionCT(None, 102, 2260, 101)

       timestamp = datetime.datetime.combine(datetime.datetime.now(), datetime.time(10, 23))

       cmh = factory.MessageHeaderCT(transaction, interaction, user, timestamp)

       member = factory.MemberCT('0020693108', '20693101', '158')
       visitInfo = factory.visitInfoCT(timestamp, 7, 'NEW')
       eligibilityRequest = factory.EligibilitySubmissionRequestCT(member, visitInfo)

       with client.settings(raw_response=False):
           response = client.service.submitSchema(CommonMessageHeader=cmh,
                                                  EligibilitySubmissionRequest=eligibilityRequest)

       return response

这是这些文件所在的位置 Folder's Path

3 个答案:

答案 0 :(得分:1)

感谢您使用更具体的细节和代码来更新问题。您正在尝试从Odoo Python代码访问wsdl,而不是从外部作为Odoo发布的静态http内容访问。

我看到您有四种可能的方法来解决此问题:

  1. 使用相对路径访问wsdl并修改代码以使其成为可能。这是首选方式。此代码可在控制器中工作,也可在模块根目录下一级的任何其他目录中的python代码中工作。

    wsdlpath = os.path.join(os.path.dirname(os.path.abspath(__file__)), '../zeep_test/static/src/uhud/Uhud.wsdl')
    client = Client(wsdlpath, settings=settings)
    
  2. 使用绝对路径访问wsdl。更新您的代码以在zeep Client调用中包含完整的绝对路径。在此选项中,您需要对绝对路径进行硬编码。这行得通,但是不好。

    client = Client('/mnt/extra-addons/zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)
    
  3. 通过具有http地址的Odoo http服务访问wsdl。在此解决方案中,您需要在Odoo服务器看到的情况下对您的Odoo地址进行硬编码。

    client = Client('http://localhost:8069/zeep_test/static/src/uhud/Uhud.wsdl', settings=settings)
    
  4. 直接从SOAP服务提供者访问wsdl。这样,您需要从服务提供商处访问wsdl。这样,您将不需要本地的wsdl。

    client = Client('https://serviceprovider.com/xx/yy/Uhud.wsdl', settings=settings)
    

当前,您的wsdl位于公共可用的静态文件夹中。您是否真的要在Odoo中发布它?如果您没有特别的意图,我会考虑不发布此版本。如果您使用内部地址(案例1和2)从代码中引用此文件,则无需发布它。

答案 1 :(得分:0)

您可以构建Odoo模块,并将静态wsdl和xsd包含在名为static的模块文件夹中。您可以从以下资源中找到更多信息和有关创建模块的帮助:

在创建模块时,如果您无法从Odoo参考资源中找到针对特定编程难题的答案,请考虑在此处的堆栈溢出中进行询问。对于Stack Overflow问题,请提供准确且可复制的问题代码,以便人们能够为您提供最佳帮助。您可以在https://stackoverflow.com/help/how-to-ask上找到有关常见问题的说明。欢迎来到Zatar的Stack Overflow。

答案 2 :(得分:0)

好吧,我不知道所有答案是否都正确,但是您要找到Costum模块的路径的方式就是这样。

        # you need http this
        import os
        from odoo import http
        # from openerp import http



       # in your method to find the path of your costum module
       file_path = http.addons_manifest['zeep_test']['addons_path'] # I really forget the key but you can check controllers in web module you find plenty of examples there
       # now you can join this file path with your static folder use os for this to handle multi platform
       file_path = os.path.join('zeep_test', 'static', 'src', 'uhud','Uhud.wsdl')
       # and now file_path have the right path for your file

向addons_manifest添加插件的一件事,插件必须具有静态文件夹。而且您应该对此没有问题,因为您有此问题。

一件事,如果您仅在python中访问此文件,请从静态文件夹中删除它们以保护它们