<odoo> <template id="alerts" inherit_id="runbot_merge.alerts"> <xpath expr="//div[@id='alerts']"> <t t-set="fpcron" t-value="env(user=1).ref('forwardport.port_forward')"/> <div t-if="not fpcron.active" class="alert alert-warning col-12" role="alert"> Forward-port is disabled, merged pull requests will not be forward-ported. </div> </xpath> <!-- key block (hopefully) --> <xpath expr="//div[@id='alerts']" position="inside"> <t t-if="env['runbot_merge.pull_requests'].check_access_rights('read', False)"> <t t-set="outstanding" t-value="env['runbot_merge.pull_requests'].search_count([ ('source_id', '!=', False), ('state', 'not in', ['merged', 'closed']), ('source_id.merge_date', '<', datetime.datetime.now() - relativedelta(days=3)), ])"/> <div t-if="outstanding != 0" class="alert col-md-12 alert-warning mb-0"> <a href="/forwardport/outstanding"> <t t-esc="outstanding"/> outstanding forward-ports </a> </div> </t> </xpath> </template> <template id="pr_background"> <t t-if="p.state == 'merged'">bg-success</t> <t t-elif="p.state == 'closed'">bg-light</t> <t t-elif="p.state == 'error'">bg-danger</t> <t t-else="">bg-warning</t> </template> <record id="forwardport.outstanding_fp" model="website.page"> <field name="name">Outstanding forward ports</field> <field name="type">qweb</field> <field name="url">/forwardport/outstanding</field> <field name="website_indexed" eval="False"/> <field name="is_published">True</field> <field name="key">forwardport.outstanding_fp</field> <field name="arch" type="xml"> <t name="Outstanding forward ports" t-name="forwardport.outstanding_fp"> <t t-call="website.layout"> <t t-set="hof" t-value="env['runbot_merge.pull_requests']._hall_of_shame()"/> <div id="wrap" class="oe_structure oe_empty"><div class="container-fluid"> <ul class="alert bg-light list-inline"> <span t-foreach="hof.reviewers" t-as="count" class="list-inline-item"> <a t-attf-href="?reviewer={{count[0].id}}" t-field="count[0].display_name" t-att-title="count[1]" /> </span> </ul> <h1>List of pull requests with outstanding forward ports</h1> <t t-set="reviewer" t-value="env['res.partner'].browse(int(request.params.get('reviewer') or 0))"/> <form method="get" action="" id="reset-filter"/> <h2 t-if="reviewer" class="text-muted"> merged by <span t-field="reviewer.display_name" t-attf-title="@{{reviewer.github_login}}"/> <button form="reset-filter" type="submit" name="reviewer" value="" title="See All" class="btn fa fa-times"/> </h2> <dl><t t-foreach="hof.outstanding" t-as="x"> <t t-set="source" t-value="x[0]"/> <t t-if="not reviewer or source.reviewed_by == reviewer"> <dt> <a t-att-href="source.url"><span t-field="source.display_name"/></a> by <span t-field="source.author.display_name" t-attf-title="@{{source.author.github_login}}"/> merged <span t-field="source.merge_date" t-options="{'widget': 'relative'}" t-att-title="source.merge_date"/> <t t-if="not reviewer"> by <span t-field="source.reviewed_by.display_name" t-attf-title="@{{source.reviewed_by.github_login}}"/> </t> </dt> <dd> Outstanding forward-ports: <ul> <li t-foreach="x.prs" t-as="p"> <a t-att-href="p.url"><span t-field="p.display_name"/></a> (<span t-field="p.state"/>) targeting <span t-field="p.target.name"/> </li> </ul> </dd> </t> </t></dl> </div></div> </t> </t> </field> </record> <template id="view_pull_request" inherit_id="runbot_merge.view_pull_request"> <xpath expr="//dl[hasclass('runbot-merge-fields')]" position="inside"> <t t-if="pr.state == 'merged'"> <dt>merged</dt> <dd> <span t-field="pr.merge_date" t-options="{'widget': 'relative'}" t-att-title="pr.merge_date"/> by <span t-field="pr.reviewed_by.display_name" t-attf-title="@{{pr.reviewed_by.github_login}}"/> </dd> </t> <t t-if="pr.source_id"> <dt>forward-port of</dt> <dd> <a t-att-href="pr.source_id.url"> <span t-field="pr.source_id.display_name"/> </a> <span t-if="not pr.parent_id" class="badge badge-danger user-select-none" title="A detached PR behaves like a non-forward-port, it has to be approved via the mergebot, this is usually caused by the forward-port having been in conflict or updated."> DETACHED </span> </dd> </t> <t t-if="pr.forwardport_ids"> <dt>forward-ports</dt> <dd><ul> <t t-foreach="pr.forwardport_ids" t-as="p"> <t t-set="bgsignal"><t t-call="forwardport.pr_background"/></t> <li t-att-class="bgsignal"> <a t-att-href="p.url"><span t-field="p.display_name"/></a> targeting <span t-field="p.target.name"/> </li> </t> </ul></dd> </t> </xpath> </template> <record model="ir.ui.view" id="project"> <field name="name">Show forwardport project fields</field> <field name="inherit_id" ref="runbot_merge.runbot_merge_form_project"/> <field name="model">runbot_merge.project</field> <field name="arch" type="xml"> <xpath expr="//sheet/group[2]" position="after"> <group string="Forwardport Configuration"> <group> <field string="Token" name="fp_github_token"/> </group> <group> <field string="Bot Name" name="fp_github_name"/> <field string="Bot Email" name="fp_github_email"/> </group> </group> </xpath> <xpath expr="//field[@name='repo_ids']/tree" position="inside"> <field string="FP remote" name="fp_remote_target" help="Repository where forward port branches will be created" /> </xpath> <xpath expr="//field[@name='branch_ids']/tree" position="inside"> <field name="fp_target" string="FP to" help="This branch will be forward-ported to (from lower ones)" /> </xpath> </field> </record> <record model="ir.ui.view" id="repository"> <field name="name">Show forwardport repository fields</field> <field name="inherit_id" ref="runbot_merge.form_repository"/> <field name="model">runbot_merge.repository</field> <field name="arch" type="xml"> <field name="branch_filter" position="after"> <field string="FP remote" name="fp_remote_target" help="Repository where forward port branches will be created"/> </field> </field> </record> <record model="ir.ui.view" id="pr"> <field name="name">Show forwardport PR fields</field> <field name="inherit_id" ref="runbot_merge.runbot_merge_form_prs"/> <field name="model">runbot_merge.pull_requests</field> <field name="arch" type="xml"> <xpath expr="//field[@name='state']" position="after"> <field name="merge_date" attrs="{'invisible': [('state', '!=', 'merged')]}"/> </xpath> <xpath expr="//sheet/group[2]" position="after"> <separator string="Forward Port" attrs="{'invisible': [('source_id', '=', False)]}"/> <group attrs="{'invisible': [('source_id', '!=', False)]}"> <group> <field string="Policy" name="fw_policy"/> </group> </group> <group attrs="{'invisible': [('source_id', '=', False)]}"> <group> <field string="Original PR" name="source_id"/> </group> <group attrs="{'invisible': [('parent_id', '=', False)]}"> <field name="parent_id"/> </group> <group colspan="4" attrs="{'invisible': [('parent_id', '!=', False)]}"> <span> Detached from forward porting (either conflicting or explicitly updated). </span> </group> <group> <field string="Forward ported up to" name="limit_id"/> </group> </group> </xpath> </field> </record> </odoo>