19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:27 +01:00
parent d1963a3c3a
commit 2d3ee4855a
7430 changed files with 2687981 additions and 2965473 deletions

View file

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="paperformat_event_foldable_badge" model="report.paperformat">
<field name="name">Custom Paperformat for the Event Foldable Badge report</field>
<record id="paperformat_event_badge" model="report.paperformat">
<field name="name">Custom Paperformat for the Event Badge report</field>
<field name="default" eval="False"/>
<field name="disable_shrinking" eval="True"/>
<field name="format">A4</field>
@ -31,9 +31,8 @@
<field name="dpi">96</field>
</record>
<!-- The "Full Page Ticket", as opposed to the foldable badge that is meant to be folded and
only contains the bare minimum (attendee name + barcode), gives all the information of the
ticket in a portrait A4 format.
<!-- The "Full Page Ticket", as opposed to the (a6) badge that only contains the bare minimum
(attendee name + barcode), gives all the information of the ticket in a portrait A4 format.
It allows to add some information in the ticket_instructions field and, when printed, functions
as an "official" ticket that the attendee can show to the registration desk where all
the information are available (event name, organizer, SO reference, barcode, footer with
@ -62,28 +61,46 @@
<field name="paperformat_id" ref="paperformat_event_full_page_ticket"/>
</record>
<record id="action_report_event_registration_foldable_badge" model="ir.actions.report">
<field name="name">Foldable Badge</field>
<record id="action_report_event_registration_badge" model="ir.actions.report">
<field name="name">Badge</field>
<field name="model">event.registration</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">event.event_registration_report_template_foldable_badge</field>
<field name="report_file">event.event_registration_report_template_foldable_badge</field>
<field name="print_report_name">'Foldable Badge - %s - %s' % ((object.event_id.name or 'Event').replace('/',''), (object.name or '').replace('/',''))</field>
<field name="report_name">event.event_registration_report_template_badge</field>
<field name="report_file">event.event_registration_report_template_badge</field>
<field name="print_report_name">'Badge - %s - %s' % ((object.event_id.name or 'Event').replace('/',''), (object.name or '').replace('/',''))</field>
<field name="binding_model_id" ref="model_event_registration"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="paperformat_event_foldable_badge"/>
<field name="paperformat_id" ref="paperformat_event_badge"/>
</record>
<record id="action_report_event_event_foldable_badge" model="ir.actions.report">
<field name="name">Foldable Badge Example</field>
<record id="action_report_event_event_badge" model="ir.actions.report">
<field name="name">Badge Example</field>
<field name="model">event.event</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">event.event_event_report_template_foldable_badge</field>
<field name="report_file">event.event_event_report_template_foldable_badge</field>
<field name="print_report_name">'Foldable Badge - %s' % (object.name or 'Event').replace('/','')</field>
<field name="report_name">event.event_event_report_template_badge</field>
<field name="report_file">event.event_event_report_template_badge</field>
<field name="print_report_name">'Badge - %s' % (object.name or 'Event').replace('/','')</field>
<field name="binding_model_id" ref="model_event_event"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="paperformat_event_foldable_badge"/>
<field name="paperformat_id" ref="paperformat_event_badge"/>
</record>
<record id="action_report_event_registration_responsive_html_ticket" model="ir.actions.report">
<field name="name">Responsive Html Full Page Ticket</field>
<field name="model">event.registration</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">event.event_registration_report_template_responsive_html_ticket</field>
<field name="report_file">event.event_registration_report_template_responsive_html_ticket</field>
</record>
<record id="action_report_event_event_attendee_list" model="ir.actions.report">
<field name="name">Attendee List</field>
<field name="model">event.event</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">event.event_event_attendee_list</field>
<field name="report_file">event.event_event_attendee_list</field>
<field name="binding_model_id" ref="event.model_event_event"/>
<field name="binding_type">report</field>
<field name="print_report_name">'Attendee List - %s' % (object.name)</field>
</record>
</odoo>

View file

@ -1,67 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- EVENT FOLDABLE BADGE -->
<!-- EVENT A4 FOLDABLE BADGE (A4_french_fold) -->
<template id="event_report_template_foldable_badge">
<div class="o_event_foldable_badge_container">
<div class="o_event_foldable_badge_container o_event_badge_report_page_break">
<div class="row">
<!-- Front -->
<div class="page p-1 col-6 o_event_foldable_badge_top">
<!-- Front (Left) -->
<div class="page col-6 o_event_badge_height o_event_foldable_badge_left_quarter pt-2">
<div class="oe_structure"/>
<t t-call="event.event_report_template_badge_card"/>
</div>
<!-- Back -->
<div class="page col-6 o_event_foldable_badge_top o_event_foldable_badge_ticket pt-4">
<!-- Front (Right) -->
<div class="page col-6 o_event_badge_height position-relative pt-2">
<div class="oe_structure"/>
<div class="o_event_foldable_badge_ticket_wrapper p-2">
<div class="o_event_foldable_badge_ticket_wrapper_top page">
<h5 class="o_event_foldable_badge_event_name text-odoo fw-bold text-center" t-field="event.name"/>
<div class="text-center o_event_foldable_badge_font_small">
<span itemprop="startDate" t-field="event.date_begin"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="startDateTime" t-field="event.date_begin"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
<span class="fa fa-arrow-right o_event_foldable_badge_font_faded"/>
<span t-if="not event.is_one_day"
itemprop="endDate" t-field="event.date_end"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="endDateTime" t-field="event.date_end"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
<t t-call="event.event_report_template_badge_card"/>
</div>
</div>
<div class="row o_event_foldable_badge_bottom_row">
<!-- Inner Left -->
<div class="o_event_badge_height o_event_foldable_badge_left_quarter page col-6">
<div class="oe_structure"/>
<div class="o_event_foldable_badge_bottom_left text-center overflow-hidden pe-2 h-100 w-100">
<div class="o_event_badge_ticket_center_vertically position-relative">
<t t-if="event.use_barcode">
<t t-if="attendee">
<span t-field="attendee.barcode" class="barcode" t-options="{'widget': 'barcode', 'width': 200, 'height': 84, 'quiet': 0, 'humanreadable': 1}"/>
</t>
<t t-elif="not attendee">
<span t-out="'12345678901234567890'" class="barcode" t-options="{'widget': 'barcode', 'width': 200, 'height': 84, 'quiet': 0, 'humanreadable': 1}"/>
</t>
</t>
<div class="o_event_foldable_badge_barcode_container_top mb-2 mt-4">
<img t-attf-src="/report/barcode/QR/{{attendee.barcode if attendee else '12345678901234567890'}}?&amp;width=174&amp;height=174" alt="QR Code"/>
</div>
<div class="o_event_foldable_badge_font_faded o_event_foldable_badge_font_small text-center">
(<span itemprop="timezone" t-out="event.date_tz"/>)
<div class="fs-4 mb-3">
<span t-out="attendee.barcode if attendee else '12345678901234567890'"/>
</div>
<div t-if="event.address_id" class="o_event_foldable_badge_font_faded o_event_foldable_badge_font_small text-center">
<t t-call="event.event_report_template_formatted_event_address"/>
<h2 class="lh-1" t-if="attendee" t-field="attendee.name"/>
<h2 class="lh-1" t-elif="not attendee">John Doe</h2>
<div t-if="attendee" class="mt-3 py-2">
<span t-foreach="attendee.registration_answer_choice_ids"
class="px-2 py-1 d-inline-block bg-200 text-black m-1 o_event_foldable_badge_answer"
t-as="answer" t-out="answer.display_name"/>
</div>
<div class="text-center mt-5 pt-2">
<h2 t-if="attendee" t-field="attendee.name"/>
<h2 t-elif="not attendee"><span>John Doe</span></h2>
<t t-set="first_ticket" t-value="event.event_ticket_ids[0] if event.event_ticket_ids else None"/>
<div t-if="attendee" class="o_event_foldable_badge_font_faded" t-field="attendee.event_ticket_id"/>
<div t-elif="first_ticket" t-out="first_ticket.name"
class="o_event_foldable_badge_font_faded"/>
</div>
</div>
<div class="o_event_foldable_badge_barcode mt-2">
<div class="o_event_foldable_badge_barcode_container">
<div t-else="">
<span t-foreach="event.question_ids.filtered(lambda q: q.question_type == 'simple_choice' and q.answer_ids)"
class="px-2 py-1 d-inline-block bg-200 text-black m-1 o_event_foldable_badge_answer"
t-as="question" t-out="question.answer_ids[0].name"/>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Inner left -->
<div class="page o_event_foldable_badge_bottom o_event_foldable_badge_left p-1 px-2 col-6 overflow-hidden">
<div class="oe_structure"/>
<div t-field="event.ticket_instructions" class="p-4"></div>
</div>
<!-- Inner right -->
<div class="page o_event_foldable_badge_bottom o_event_foldable_badge_right col-6 text-center">
<!-- Inner Right -->
<div class="o_event_badge_height o_event_foldable_badge_instructions page col-6">
<div class="oe_structure"/>
<div class="h-50 col-12 row m-0">
<div class="col-6 h-100 p-0">
@ -88,20 +80,65 @@
</div>
</template>
<template id="event_registration_report_template_foldable_badge">
<!-- EVENT A6 BADGE -->
<template id="event_report_template_a6_badge">
<div class="o_event_badge_report_page_break">
<div class="row">
<div class="o_event_badge_height page col-6 pt-2">
<div class="oe_structure"/>
<t t-call="event.event_report_template_badge_card"/>
</div>
</div>
</div>
</template>
<!-- EVENT A4 4 PER SHEET -->
<template id="event_report_template_four_per_sheet_badge">
<t t-if="example_badge" t-foreach="[(0, 1), (2, 3)]" t-as="indices_pair">
<div t-att-class="'row' + (' o_event_badge_report_page_break' if indices_pair_index else '')">
<div t-foreach="indices_pair" t-as="attendee_number" class="col-6 o_event_badge_height pt-2">
<t t-call="event.event_report_template_badge_card"/>
</div>
</div>
</t>
<t t-if="not example_badge" t-foreach="[attendees[n:n+2] for n in range(0, len(attendees), 2)] if attendees else []" t-as="attendee_pair">
<t t-set="do_page_break" t-value="attendee_pair_index > 0 and attendee_pair_index % 2 or (attendee_pair_index + 1) * 2 >= len(attendees)"/>
<div t-att-class="'row' + (' o_event_badge_report_page_break' if do_page_break else '')">
<div t-foreach="attendee_pair" t-as="attendee" class="col-6 o_event_badge_height pt-2">
<t t-call="event.event_report_template_badge_card"/>
</div>
</div>
</t>
</template>
<!-- EVENT REGISTRATION BADGE - REDIRECTING TO EVENT FORMAT BADGE ABOVE -->
<template id="event_registration_report_template_badge">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="attendee">
<t t-set="event" t-value="attendee.event_id.with_context(tz=attendee.event_id.date_tz)"/>
<t t-call="event.event_report_template_foldable_badge"/>
<t t-foreach="docs.grouped('event_id').items()" t-as="attendees_per_event">
<t t-set="event" t-value="attendees_per_event[0]._set_tz_context()"/>
<t t-set="attendees" t-value="attendees_per_event[1]"/>
<t t-if="event.badge_format != 'four_per_sheet'" t-foreach="attendees" t-as="attendee">
<t t-if="event.badge_format == 'A4_french_fold'" t-call="event.event_report_template_foldable_badge" t-lang="event.lang or attendee.env.lang"/>
<t t-else="" t-call="event.event_report_template_a6_badge" t-lang="event.lang or attendee.env.lang"/>
</t>
<t t-if="event.badge_format == 'four_per_sheet'" t-call="event.event_report_template_four_per_sheet_badge" t-lang="event.lang or event.env.lang"/>
</t>
</t>
</template>
<template id="event_event_report_template_foldable_badge">
<!-- EVENT EVENT BADGE - EXAMPLE BADGE - ATTENDEE NOT SET -->
<template id="event_event_report_template_badge">
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="event">
<t t-set="event" t-value="event.with_context(tz=event.date_tz)"/>
<t t-call="event.event_report_template_foldable_badge"/>
<t t-set="event" t-value="event._set_tz_context()"/>
<t t-set="example_badge" t-value="True"/>
<t t-if="event.badge_format == 'A4_french_fold'" t-call="event.event_report_template_foldable_badge" t-lang="event.lang or event.env.lang"/>
<t t-elif="event.badge_format == 'four_per_sheet'" t-call="event.event_report_template_four_per_sheet_badge" t-lang="event.lang or event.env.lang"/>
<t t-else="" t-call="event.event_report_template_a6_badge" t-lang="event.lang or event.env.lang"/>
</t>
</t>
</template>
@ -110,61 +147,87 @@
<template id="event_report_template_full_page_ticket">
<div class="row page">
<div class="o_event_full_page_ticket_container page w-100">
<div t-attf-class="o_event_full_page_ticket_container page w-100 #{'o_event_full_page_ticket_responsive_html' if responsive_html else 'o_event_full_page_ticket'}">
<div class="o_event_full_page_ticket_wrapper">
<div class="o_event_full_page_ticket_details row">
<div class="col-10">
<div class="row">
<div class="col-8 page">
<div class="o_event_full_page_ticket_font_faded">
Event Ticket For
</div>
<h5 class="o_event_full_page_ticket_event_name text-odoo fw-bold py-0 my-0" t-field="event.name"/>
<span itemprop="startDate" t-field="event.date_begin"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="startDateTime" t-field="event.date_begin"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "hide_seconds": True, "tz_name": event.date_tz}'/>
<span class="fa fa-arrow-right o_event_full_page_ticket_font_faded"/>
<span t-if="not event.is_one_day"
itemprop="endDate" t-field="event.date_end"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="endDateTime" t-field="event.date_end"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "hide_seconds": True, "tz_name": event.date_tz}'/>
<span itemprop="timeZone" class="o_event_full_page_ticket_font_faded small">(<t t-out="event.date_tz"/>)</span>
<div t-if="event.address_id" class="o_event_full_page_ticket_font_faded">
<t t-call="event.event_report_template_formatted_event_address"/>
</div>
<br/>
<h5 t-if="attendee" t-field="attendee.name"></h5>
<h5 t-elif="not attendee"><span>John Doe</span></h5>
<div t-if="responsive_html" class="d-flex justify-content-center">
<a class="btn o_event_download_ticket_btn mb-2" title="Download Tickets" t-attf-href="/event/{{ event.id }}/my_tickets?registration_ids={{ attendee.ids }}&amp;tickets_hash={{ event._get_tickets_access_hash(attendee.ids) }}">
Download Tickets <i class="ms-1 fa fa-download"/>
</a>
</div>
<div class="o_event_full_page_ticket_details">
<div class="d-flex flex-column-reverse flex-sm-row">
<div class="o_event_full_page_left_details ps-3 pt-3 pb-2 pe-2">
<div class="o_event_full_page_left_details_top mb-3">
<h2 class="o_event_full_page_ticket_event_name fw-bold pt-3" t-field="event.name"/>
<t t-set="first_ticket" t-value="event.event_ticket_ids[0] if event.event_ticket_ids else None"/>
<div t-if="attendee" class="o_event_full_page_ticket_font_faded" t-field="attendee.event_ticket_id"/>
<div t-elif="first_ticket" t-out="first_ticket.name"
class="o_event_full_page_ticket_font_faded"/>
<h4 t-if="attendee" class="o_event_full_page_ticket_font_faded o_event_full_page_ticket_type" t-field="attendee.event_ticket_id.name"/>
<h4 t-elif="first_ticket" t-out="first_ticket.name" class="o_event_full_page_ticket_font_faded pe-4"/>
<h4 class="fw-bold mb-3 pb-2" t-if="attendee" t-field="attendee.name"/>
<h4 class="fw-bold mb-3 pb-2" t-elif="not attendee"><span>John Doe</span></h4>
<t t-set="answer_badge_classes" t-valuef="#{'badge' if responsive_html else 'px-2 py-1 d-inline-block'} bg-200 text-black my-1 me-1 fw-semibold o_event_full_page_ticket_answer"/>
<div t-if="attendee" class="mb-3">
<span t-foreach="attendee.registration_answer_choice_ids" t-att-class="answer_badge_classes"
t-as="answer" t-out="answer.display_name"/>
</div>
<div t-else="" class="mb-3">
<span t-foreach="event.question_ids.filtered(lambda q: q.question_type == 'simple_choice' and q.answer_ids)"
t-att-class="answer_badge_classes"
t-as="question" t-out="question.answer_ids[0].name"/>
</div>
</div>
<div class="col-4 o_event_full_page_ticket_side_info page">
<span t-if="event.organizer_id.image_128">
<img t-att-src="image_data_uri(event.organizer_id.image_128)" class="o_event_full_page_ticket_event_logo mb-2"/>
</span>
<div t-if="attendee and attendee.partner_id" class="mb-2 o_event_full_page_ticket_side_info_booked_by">
<div class="o_event_full_page_ticket_font_faded o_event_full_page_ticket_small_caps fw-bold">Booked By</div>
<div class="o_event_full_page_ticket_small" t-field="attendee.partner_id"/>
<div t-attf-class="row gy-0 gx-2 #{'o_event_full_page_left_details_bottom_qr_only' if not event.use_barcode else ''}">
<div t-if="event.address_id" class="col-md-6 col-12 mb-3 mb-md-0 o_event_full_page_ticket_column">
<div class="d-flex">
<i class="fa fa-map-marker fa-2x fa-fw me-2 mt-1"/>
<div>
<t t-call="event.event_report_template_formatted_event_address" multi_line_address="True"/>
</div>
</div>
</div>
<div class="col-md-6 col-12 mb-3 o_event_full_page_ticket_column">
<div class="d-flex">
<i class="fa fa-calendar fa-2x fa-fw me-2 mt-1"/>
<div t-if="attendee">
<span t-field="attendee.event_begin_date" class="text-nowrap"
t-options='{"widget": "datetime", "tz_name": event.date_tz, "format": "short"}'/><br/>
<span class="me-1">to</span><span t-field="attendee.event_end_date" class="text-nowrap"
t-options='{"widget": "datetime", "tz_name": event.date_tz, "format": "short"}'/>
</div>
<div t-elif="event.is_one_day">
<span t-field="event.date_begin" class="text-nowrap"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'/><br/>
<span class="me-1">from</span><span t-field="event.date_begin" class="text-nowrap"
t-options='{"widget": "datetime", "time_only": True, "hide_seconds": True, "tz_name": event.date_tz, "format": "short"}'/>
<span class="me-1">to</span><span t-field="event.date_end" class="text-nowrap"
t-options='{"widget": "datetime", "time_only": True, "hide_seconds": True, "tz_name": event.date_tz, "format": "short"}'/>
</div>
<div t-else="">
<span t-field="event.date_begin" class="text-nowrap"
t-options='{"widget": "datetime", "tz_name": event.date_tz, "format": "short"}'/><br/>
<span class="me-1">to</span><span t-field="event.date_end" class="text-nowrap"
t-options='{"widget": "datetime", "tz_name": event.date_tz, "format": "short"}'/>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="o_event_full_page_ticket_barcode col-2">
<div class="o_event_full_page_ticket_barcode_container">
<div t-attf-class="o_event_full_page_ticket_barcode text-center text-sm-start #{'o_event_full_page_ticket_qr_only' if not event.use_barcode else ''}">
<div class="o_event_full_page_ticket_barcode_container px-2">
<t t-if="not attendee or (attendee and attendee.barcode)">
<div t-att-class="'pb-3' if event.use_barcode else ''">
<img t-attf-src="/report/barcode/QR/{{attendee.barcode if attendee and attendee.barcode else '12345678901234567890'}}?&amp;width=152&amp;height=152&amp;quiet=0" alt="QR Code"/>
</div>
<t t-if="event.use_barcode">
<img class="o_event_barcode" t-attf-src="/report/barcode/?barcode_type=Code128&amp;value={{attendee.barcode if attendee and attendee.barcode else '12345678901234567890'}}&amp;width=168&amp;height=100&amp;humanreadable=1&amp;quiet=0" alt="Barcode"/>
</t>
</t>
</div>
</div>
</div>
<div t-if="not responsive_html" t-field="event.ticket_instructions" class="o_event_full_page_extra_instructions ps-3 pt-3 pb-2 pe-2"/>
</div>
</div>
<div class="page oe_structure"/>
<div t-field="event.ticket_instructions" class="o_event_full_page_extra_instructions px-2 pt-3"></div>
</div>
</div>
</template>
@ -180,22 +243,24 @@
</main>
</div>
<div class="oe_structure"></div>
<div class="row footer o_event_full_page_ticket_footer d-block">
<div class="o_event_full_page_ticket_powered_by bg-odoo text-white text-center p-2 w-100">
<t t-if="event.organizer_id">
<span class="fw-bold" t-field="event.organizer_id.name"></span>
<span t-if="event.organizer_id">
<span class="fw-bold" t-field="event.organizer_id.name">Marc Demo</span>
<span t-if="event.organizer_id.phone" class="ps-3 fa fa-phone"/>
<span t-if="event.organizer_id.phone" t-field="event.organizer_id.phone"/>
<span t-if="event.organizer_id.phone" t-field="event.organizer_id.phone">+123456789</span>
<span t-if="event.organizer_id.email_normalized" class="ps-3 fa fa-envelope"/>
<span t-if="event.organizer_id.email_normalized" t-field="event.organizer_id.email_normalized"/>
<span t-if="event.organizer_id.email_normalized" t-field="event.organizer_id.email_normalized">organizer@email.com</span>
<span t-if="event.organizer_id.website" class="ps-3 fa fa-globe"/>
<span t-if="event.organizer_id.website" t-field="event.organizer_id.website"/>
</t>
<span t-if="event.organizer_id.website" t-field="event.organizer_id.website">https://www.example.com</span>
</span>
<t t-else="">
<span t-out="event.name"/> <!-- Force some content to avoid messing the layout -->
<span t-out="event.name">Odoo Community Days</span> <!-- Force some content to avoid messing the layout -->
</t>
</div>
</div>
<div class="oe_structure"></div>
</template>
<template id="event_registration_report_template_full_page_ticket">
@ -203,8 +268,9 @@
<t t-call="web.html_container">
<t t-set="event" t-value="attendee.event_id._set_tz_context()"/>
<t t-set="main_object" t-value="attendee"/>
<t t-set="responsive_html" t-value="False"/>
<t t-call="event.event_report_full_page_ticket_layout">
<t t-call="event.event_report_template_full_page_ticket"/>
<t t-call="event.event_report_template_full_page_ticket" t-lang="event.lang or attendee.env.lang"/>
</t>
</t>
</t>
@ -215,37 +281,125 @@
<t t-call="web.html_container">
<t t-set="event" t-value="event._set_tz_context()"/>
<t t-set="main_object" t-value="event"/>
<t t-set="responsive_html" t-value="False"/>
<t t-call="event.event_report_full_page_ticket_layout">
<t t-call="event.event_report_template_full_page_ticket"/>
<t t-call="event.event_report_template_full_page_ticket" t-lang="event.lang or event.env.lang"/>
</t>
</t>
</t>
</template>
<!-- EVENT RESPONSIVE HTML TICKET : Responsive web page -->
<template id="event_registration_report_template_responsive_html_ticket">
<t t-foreach="docs" t-as="attendee">
<t t-call="web.html_container">
<t t-set="event" t-value="attendee.event_id._set_tz_context()"/>
<t t-set="main_object" t-value="attendee"/>
<t t-set="responsive_html" t-value="True"/>
<t t-call="event.event_report_full_page_ticket_layout">
<t t-call="event.event_report_template_full_page_ticket" t-lang="event.lang or attendee.env.lang"/>
</t>
</t>
</t>
</template>
<!-- EVENT BADGE CARD (tool template used in all badge templates)-->
<template id="event_report_template_badge_card">
<t t-set="badge_image_url" t-value="image_data_uri(event.badge_image) if event.badge_image else ''"/>
<div class="o_event_badge_ticket_wrapper" t-att-style="'background-image: url(%s);' % badge_image_url if badge_image_url else ''">
<div class="position-relative h-100">
<h3 class="fw-bold text-center" t-field="event.name"/>
<div class="text-center o_event_badge_font_small">
<t t-if="attendee">
<span itemprop="startDate" t-field="attendee.event_begin_date"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="startDateTime" t-field="attendee.event_begin_date"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
<span class="fa fa-arrow-right o_event_badge_font_faded"/>
<span itemprop="endDate" t-field="attendee.event_end_date"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="endDateTime" t-field="attendee.event_end_date"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
</t>
<t t-else="">
<span itemprop="startDate" t-field="event.date_begin"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="startDateTime" t-field="event.date_begin"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
<span class="fa fa-arrow-right o_event_badge_font_faded"/>
<span t-if="not event.is_one_day"
itemprop="endDate" t-field="event.date_end"
t-options='{"widget": "datetime", "date_only": True, "tz_name": event.date_tz}'
class="fw-bold"/>
<span itemprop="endDateTime" t-field="event.date_end"
class="fw-bold"
t-options='{"widget": "datetime", "time_only": True, "tz_name": event.date_tz, "hide_seconds": True}'/>
</t>
</div>
<div t-if="event.address_id" class="o_event_badge_font_faded o_event_badge_font_small text-center">
<t t-call="event.event_report_template_formatted_event_address">
<t t-set="use_map_marker" t-value="True"/>
</t>
</div>
<div t-attf-class="text-center py-2 #{'o_event_badge_ticket_center_vertically position-absolute w-100' if not event.use_barcode or event.badge_format == 'A4_french_fold' else 'mt-2'}">
<h2 class="mb-0" t-if="attendee" t-field="attendee.name"/>
<h2 class="mb-0" t-elif="not attendee"><span>John Doe</span> <span t-if="attendee_number" t-out="attendee_number + 1"/></h2>
<h4 t-if="attendee and attendee.company_name" class="o_event_badge_font_faded" t-field="attendee.company_name"/>
<h4 t-elif="not attendee"><span class="o_event_badge_font_faded">My Placeholder Company</span></h4>
</div>
<div class="position-absolute bottom-0 w-100 text-center">
<img t-if="event.organizer_id.image_256" class="o_event_badge_logo text-center mb-2" t-att-src="image_data_uri(event.organizer_id.image_256)"/>
<span t-if="event.badge_format != 'A4_french_fold'" class="o_event_badge_barcode_container mb-2">
<img t-att-class="'mb-2' + (' ms-5' if event.organizer_id.image_256 else '')" t-attf-src="/report/barcode/QR/{{attendee.barcode if attendee else '12345678901234567890'}}?&amp;width=116&amp;height=116&amp;quiet=0" alt="QR Code"/>
<t t-if="event.use_barcode">
<t t-if="attendee">
<span t-field="attendee.barcode" class="barcode ms-2" t-options="{'widget': 'barcode', 'width': 200, 'height': 84, 'quiet': 0, 'humanreadable': 1}"/>
</t>
<t t-elif="not attendee">
<span t-out="'12345678901234567890'" class="barcode ms-2" t-options="{'widget': 'barcode', 'width': 200, 'height': 84, 'quiet': 0, 'humanreadable': 1}"/>
</t>
</t>
</span>
<t t-set="first_ticket" t-value="event.event_ticket_ids[0] if event.event_ticket_ids else None"/>
<t t-set="ticket" t-value="attendee.event_ticket_id if attendee else first_ticket"/>
<div t-if="ticket" class="text-center w-100" t-attf-style="background-color: {{ticket.color or '#875A7B'}};">
<div class="p-2 fs-5" t-out="ticket.name"/>
</div>
</div>
</div>
</div>
</template>
<!-- MISC -->
<template id="event_report_template_formatted_event_address">
<!-- Small utility template to display "Venue" as:
fa-map-marker PartnerName
RestOfAddress -->
<span class="fa fa-map-marker"/>
<span t-if="use_map_marker" class="fa fa-map-marker"/>
<t t-if="event.address_id.contact_address.strip()">
<t t-set="address_bits" t-value="event.address_id.contact_address.split('\n')"/>
<t t-if="address_bits">
<t t-set="partner_name" t-value="address_bits[0]"/>
<span t-out="partner_name"/>
</t>
<span t-if="address_bits" t-out="address_bits[0]">Rue de la Paix 123</span>
<t t-if="len(address_bits) > 1">
<br/>
</t>
<t t-set="remaining_bits" t-value="address_bits[1:]"/>
<t t-foreach="remaining_bits" t-as="address_bit">
<t t-if="address_bit and address_bit.strip()">
<span t-out="address_bit"/>
<span class="text-muted" t-out="address_bit">Rue de la Paix 123</span><br t-if="multi_line_address"/>
</t>
</t>
</t>
<t t-else="" t-out="event.address_id.name"/>
<span t-else="" t-out="event.address_id.name">1000 Brussels</span>
</template>
</odoo>

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="action_report_event_registration_attendee_list" model="ir.actions.report">
<field name="name">Attendee List</field>
<field name="model">event.registration</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">event.event_registration_attendee_list</field>
<field name="report_file">event.event_registration_attendee_list</field>
<field name="binding_model_id" ref="event.model_event_registration"/>
<field name="binding_type">report</field>
<field name="print_report_name">'Attendee List'</field>
</record>
</data>
<template id="attendee_list">
<h1>Attendee list</h1>
<div class="row">
<div class="col-7">
<div t-out="event.name"/>
</div>
<div class="col-5">
<span t-out="event.date_begin"
t-options='{"widget": "datetime", "show_seconds": False, "tz_name": event.date_tz, "format": "medium"}'/>
<i class="fa fa-arrow-right"/>
<span t-out="event.date_end"
t-options='{"widget": "datetime", "show_seconds": False, "tz_name": event.date_tz, "format": "medium"}'/>
</div>
</div>
<table class="table mt-3" style="page-break-after:always;">
<thead>
<tr class="text-start">
<th>Name</th>
<th>Company</th>
<th>Ticket type</th>
<th>Phone number</th>
<th></th>
</tr>
</thead>
<tbody>
<tr t-foreach="attendees" t-as="attendee">
<td><t t-out="attendee.name"/></td>
<td><t t-out="attendee.company_name"/></td>
<td><t t-out="attendee.event_ticket_id.name"/></td>
<td><t t-out="attendee.phone"/></td>
<td class="text-center">
<t t-if="attendee.barcode">
<img t-attf-src="/report/barcode/QR/{{ attendee.barcode }}?&amp;width=87&amp;height=87&amp;quiet=0" alt="QR Code"/>
</t>
</td>
</tr>
</tbody>
</table>
</template>
<template id="event_registration_attendee_list">
<t t-call="web.html_container">
<t t-call="web.internal_layout">
<t t-foreach="docs.grouped('event_id').items()" t-as="group">
<t t-call="event.attendee_list">
<t t-set="event" t-value="group[0].with_context(tz=group[0].date_tz)"/>
<t t-set="attendees" t-value="group[1]"/>
</t>
</t>
</t>
</t>
</template>
<template id="event_event_attendee_list">
<t t-call="web.html_container">
<t t-call="web.internal_layout">
<t t-foreach="docs" t-as="event">
<t t-call="event.attendee_list">
<t t-set="event" t-value="event.with_context(tz=event.date_tz)"/>
<t t-set="attendees" t-value="event.registration_ids"/>
</t>
</t>
</t>
</t>
</template>
</odoo>