Как изменить дубликат формы в менеджере баз данных? - PullRequest
5 голосов
/ 28 мая 2019

Я хочу добавить в эту форму другое поле, к которому можно получить доступ из менеджера баз данных в Odoo

enter image description here

Данные отправляются на этотконтроллер:

@http.route('/web/database/duplicate', type='http', auth="none", methods=['POST'], csrf=False)
def duplicate(self, master_pwd, name, new_name):
    try:
        if not re.match(DBNAME_PATTERN, new_name):
            raise Exception(_('Invalid database name. Only alphanumerical characters, underscore, hyphen and dot are allowed.'))
        dispatch_rpc('db', 'duplicate_database', [master_pwd, name, new_name])
        return http.local_redirect('/web/database/manager')
    except Exception as e:
        error = "Database duplication error: %s" % (str(e) or repr(e))
        return self._render_template(error=error)

Но форма представляет собой простой HTML, поэтому я не могу унаследовать и изменить любой шаблон:

<!-- Duplicate DB -->
<div class="modal fade o_database_duplicate" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
        <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title">Duplicate Database</h4>
        </div>
        <form id="form-duplicate-db" role="form" action="/web/database/duplicate" method="post">
            <div class="modal-body">
            {{ master_input() }}
            <div class="form-group">
                <label for="name" class="control-label">Database Name</label>
                <input id="name" type="text" name="name" class="form-control" required="required" readonly="readonly"/>
            </div>
            <div class="form-group">
                <label for="new_name" class="control-label">New Name</label>
                <input id="new_name" type="text" name="new_name" class="form-control" required="required" pattern="{{ pattern }}" title="Only alphanumerical characters, underscore, hyphen and dot are allowed"/>
            </div>
            </div>
            <div class="modal-footer">
            <input type="submit" value="Continue" class="btn btn-primary pull-right"/>
            </div>
        </form>
        </div>
    </div>
</div>

Я нашел код Python, где этот HTML отображается

class Database(http.Controller):

    def _render_template(self, **d):
        d.setdefault('manage',True)
        d['insecure'] = odoo.tools.config.verify_admin_password('admin')
        d['list_db'] = odoo.tools.config['list_db']
        d['langs'] = odoo.service.db.exp_list_lang()
        d['countries'] = odoo.service.db.exp_list_countries()
        d['pattern'] = DBNAME_PATTERN
        # databases list
        d['databases'] = []
        try:
            d['databases'] = http.db_list()
            d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
        except odoo.exceptions.AccessDenied:
            monodb = db_monodb()
            if monodb:
                d['databases'] = [monodb]
        return env.get_template("database_manager.html").render(d)

Должен ли я изменить этот код для использования другого шаблона?Или есть другое более подходящее решение?

Является ли изменение исходного кода непосредственно в веб-модуле единственным способом достижения этого?Есть ли способ изменить все это поведение, унаследовав модуль web?

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Конечно, вы можете сделать это с помощью пользовательского модуля. Во-первых, вы должны определить свой собственный HTML-шаблон в соответствии с вашими потребностями, а затем переписать контроллер, который отображает HTML-файл.

Вы можете использовать следующий код для перезаписи контроллера.

from odoo.addons.web.controllers.main import Database  # importing base controller class

class MyDatabase(Database):
    def _render_template(self, **d):
       d.setdefault('manage',True)
       d['insecure'] = odoo.tools.config.verify_admin_password('admin')
       d['list_db'] = odoo.tools.config['list_db']
       d['langs'] = odoo.service.db.exp_list_lang()
       d['countries'] = odoo.service.db.exp_list_countries()
       d['pattern'] = DBNAME_PATTERN
       #additional parameters if any
       d['databases'] = []
       try:
           d['databases'] = http.db_list()
           d['incompatible_databases'] = odoo.service.db.list_db_incompatible(d['databases'])
       except odoo.exceptions.AccessDenied:
           monodb = db_monodb()
           if monodb:
               d['databases'] = [monodb]

       return env.get_template("your_modified_template.html").render(d)  #render your modified html template.

Если у вас есть какие-либо сомнения, загляните в код Этот модуль.

0 голосов
/ 28 мая 2019

Да, вам нужно перезаписать метод _render_template веб-модуля. А также вам нужно будет создать собственный HTML-шаблон для этого и передать его для рендеринга.

from odoo.addons.web.controllers.main import db_monodb, Database as DB, env
import jinja2

loader = jinja2.PackageLoader('odoo.addons.your_custom_module_name', "views")
env = jinja2.Environment(loader=loader, autoescape=True)
env.filters["json"] = json.dumps

База данных класса (БД):

def _render_template(self, **d):
    d.setdefault('manage',True)
    d['insecure'] = odoo.tools.config['admin_passwd'] == 'admin'
    d['list_db'] = odoo.tools.config['list_db']
    d['langs'] = odoo.service.db.exp_list_lang()
    d['countries'] = odoo.service.db.exp_list_countries()
    d['pattern'] = DBNAME_PATTERN
        # databases list
        d['databases'] = []
        try:
            d['databases'] = http.db_list()
        except odoo.exceptions.AccessDenied:
            monodb = db_monodb()
            if monodb:
                d['databases'] = [monodb]
        return env.get_template("your_html_template_file_name.html").render(d)

Это пример из v10. Вы можете просто скопировать и вставить метод из модуля Odoo той версии, над которой вы работаете.

...