diff --git a/addons/event/__manifest__.py b/addons/event/__manifest__.py index e5256ec1d31..21f09c9781c 100644 --- a/addons/event/__manifest__.py +++ b/addons/event/__manifest__.py @@ -55,6 +55,13 @@ Key Features 'web.assets_qweb': [ 'event/static/src/xml/**/*', ], + 'web.report_assets_common': [ + '/event/static/src/scss/event_foldable_badge_report.scss', + '/event/static/src/scss/event_full_page_ticket_report.scss', + ], + 'web.report_assets_pdf': [ + '/event/static/src/scss/event_full_page_ticket_report_pdf.scss', + ], }, 'license': 'LGPL-3', } diff --git a/addons/event/data/event_demo.xml b/addons/event/data/event_demo.xml index 7ab534cbf32..e51e5f0ecd3 100644 --- a/addons/event/data/event_demo.xml +++ b/addons/event/data/event_demo.xml @@ -14,6 +14,14 @@ + +
Important ticket information
+
    +
  • Please come at least 30 minutes before the beginning of the event.
  • +
  • Tickets can be printed or scanned directly from your phone.
  • +
  • If you don't have this ticket, you will not be allowed entry!
  • +
+
Free diff --git a/addons/event/data/event_registration_demo.xml b/addons/event/data/event_registration_demo.xml index 632702c1a26..e4197572a04 100644 --- a/addons/event/data/event_registration_demo.xml +++ b/addons/event/data/event_registration_demo.xml @@ -149,6 +149,7 @@ - badge_of_${(object.event_id.name or '').replace('/','_')} + + Foldable Badge - ${(object.event_id.name or 'Event').replace('/','')} ${object.partner_id.lang} @@ -248,6 +248,8 @@
+ + Full Page Ticket - ${(object.event_id.name or 'Event').replace('/','')} ${object.partner_id.lang} diff --git a/addons/event/models/event_event.py b/addons/event/models/event_event.py index 332c132e6b1..1ad89563585 100644 --- a/addons/event/models/event_event.py +++ b/addons/event/models/event_event.py @@ -44,6 +44,9 @@ class EventType(models.Model): _tz_get, string='Timezone', default=lambda self: self.env.user.tz or 'UTC') # communication event_type_mail_ids = fields.One2many('event.type.mail', 'event_type_id', string='Mail Schedule') + # ticket reports + ticket_instructions = fields.Html('Ticket Instructions', translate=True, + help="This information will be printed on your tickets.") @api.depends('has_seats_limitation') def _compute_default_registration(self): @@ -162,12 +165,10 @@ class EventEvent(models.Model): tracking=True, domain="['|', ('company_id', '=', False), ('company_id', '=', company_id)]") country_id = fields.Many2one( 'res.country', 'Country', related='address_id.country_id', readonly=False, store=True) - # badge fields - badge_front = fields.Html(string='Badge Front') - badge_back = fields.Html(string='Badge Back') - badge_innerleft = fields.Html(string='Badge Inner Left') - badge_innerright = fields.Html(string='Badge Inner Right') - event_logo = fields.Html(string='Event Logo') + # ticket reports + ticket_instructions = fields.Html('Ticket Instructions', translate=True, + compute='_compute_ticket_instructions', store=True, readonly=False, + help="This information will be printed on your tickets.") @api.depends('stage_id', 'kanban_state') def _compute_kanban_state_label(self): @@ -434,6 +435,13 @@ class EventEvent(models.Model): if event.event_type_id and not is_html_empty(event.event_type_id.note): event.note = event.event_type_id.note + @api.depends('event_type_id') + def _compute_ticket_instructions(self): + for event in self: + if is_html_empty(event.ticket_instructions) and not \ + is_html_empty(event.event_type_id.ticket_instructions): + event.ticket_instructions = event.event_type_id.ticket_instructions + @api.constrains('seats_max', 'seats_available', 'seats_limited') def _check_seats_limit(self): if any(event.seats_limited and event.seats_max and event.seats_available < 0 for event in self): diff --git a/addons/event/models/event_mail.py b/addons/event/models/event_mail.py index 9bdfa4cd7a8..ed1f396221f 100644 --- a/addons/event/models/event_mail.py +++ b/addons/event/models/event_mail.py @@ -235,9 +235,8 @@ You receive this email because you are: for scheduler in schedulers: try: - with self.env.cr.savepoint(): - # Prevent a mega prefetch of the registration ids of all the events of all the schedulers - self.browse(scheduler.id).execute() + # Prevent a mega prefetch of the registration ids of all the events of all the schedulers + self.browse(scheduler.id).execute() except Exception as e: _logger.exception(e) self.invalidate_cache() diff --git a/addons/event/models/event_registration.py b/addons/event/models/event_registration.py index 7a9429e3e1e..27da716a968 100644 --- a/addons/event/models/event_registration.py +++ b/addons/event/models/event_registration.py @@ -155,7 +155,11 @@ class EventRegistration(models.Model): # some were created already open if registrations._check_auto_confirmation(): registrations.sudo().action_confirm() - else: + elif not self.env.context.get('install_mode', False): + # running the scheduler for demo data can cause an issue where wkhtmltopdf runs during + # server start and hangs indefinitely, leading to serious crashes + # we currently avoid this by not running the scheduler, would be best to find the actual + # reason for this issue and fix it so we can remove this check registrations._update_mail_schedulers() return registrations @@ -167,7 +171,11 @@ class EventRegistration(models.Model): ret = super(EventRegistration, self).write(vals) - if vals.get('state') == 'open': + if vals.get('state') == 'open' and not self.env.context.get('install_mode', False): + # running the scheduler for demo data can cause an issue where wkhtmltopdf runs during + # server start and hangs indefinitely, leading to serious crashes + # we currently avoid this by not running the scheduler, would be best to find the actual + # reason for this issue and fix it so we can remove this check pre_draft._update_mail_schedulers() return ret diff --git a/addons/event/report/event_event_reports.xml b/addons/event/report/event_event_reports.xml index 0bbe4a924bd..2e48403e551 100644 --- a/addons/event/report/event_event_reports.xml +++ b/addons/event/report/event_event_reports.xml @@ -1,41 +1,89 @@ - - European A4 low margin - + + Custom Paperformat for the Event Foldable Badge report + + A4 0 0 Portrait - 5 - 5 - 5 - 5 - - 0 - 80 + 0 + 0 + 0 + 0 + 96 - - Registration Badge + + Custom Paperformat for the Event Full Page Ticket report + + + A4 + 0 + 0 + Portrait + 0 + 8 + 0 + 0 + 96 + + + + + Full Page Ticket event.registration qweb-pdf - event.event_registration_report_template_badge - event.event_registration_report_template_badge - 'Registration Event - %s' % (object.name or 'Attendee').replace('/','') - + event.event_registration_report_template_full_page_ticket + event.event_registration_report_template_full_page_ticket + 'Full Page Ticket - %s - %s' % ((object.event_id.name or 'Event').replace('/',''), object.name.replace('/','')) report + - - Event Badge - event.event - qweb-html - event.event_event_report_template_badge - event.event_event_report_template_badge - - + + Full Page Ticket Example + event.event + qweb-pdf + event.event_event_report_template_full_page_ticket + event.event_event_report_template_full_page_ticket + 'Full Page Ticket - %s' % (object.name or 'Event').replace('/','') + + report + + + + + Foldable Badge + event.registration + qweb-pdf + event.event_registration_report_template_foldable_badge + event.event_registration_report_template_foldable_badge + 'Foldable Badge - %s - %s' % ((object.event_id.name or 'Event').replace('/',''), object.name.replace('/','')) + + report + + + + + Foldable Badge Example + event.event + qweb-pdf + event.event_event_report_template_foldable_badge + event.event_event_report_template_foldable_badge + 'Foldable Badge - %s' % (object.name or 'Event').replace('/','') + + report + + diff --git a/addons/event/report/event_event_templates.xml b/addons/event/report/event_event_templates.xml index 5bad64a8e18..4aabb2dc0b2 100644 --- a/addons/event/report/event_event_templates.xml +++ b/addons/event/report/event_event_templates.xml @@ -1,104 +1,243 @@ - - - - - + + + + diff --git a/addons/event/static/src/img/how_to_fold_1.png b/addons/event/static/src/img/how_to_fold_1.png new file mode 100644 index 00000000000..61ef66f7ced Binary files /dev/null and b/addons/event/static/src/img/how_to_fold_1.png differ diff --git a/addons/event/static/src/img/how_to_fold_2.png b/addons/event/static/src/img/how_to_fold_2.png new file mode 100644 index 00000000000..4dd0fe15b58 Binary files /dev/null and b/addons/event/static/src/img/how_to_fold_2.png differ diff --git a/addons/event/static/src/img/how_to_fold_3.png b/addons/event/static/src/img/how_to_fold_3.png new file mode 100644 index 00000000000..93c20445a79 Binary files /dev/null and b/addons/event/static/src/img/how_to_fold_3.png differ diff --git a/addons/event/static/src/img/how_to_fold_4.png b/addons/event/static/src/img/how_to_fold_4.png new file mode 100644 index 00000000000..d434e4f6a3c Binary files /dev/null and b/addons/event/static/src/img/how_to_fold_4.png differ diff --git a/addons/event/static/src/img/report_foldable_badge_background.png b/addons/event/static/src/img/report_foldable_badge_background.png new file mode 100644 index 00000000000..689974fd36c Binary files /dev/null and b/addons/event/static/src/img/report_foldable_badge_background.png differ diff --git a/addons/event/static/src/img/report_full_page_ticket_background.png b/addons/event/static/src/img/report_full_page_ticket_background.png new file mode 100644 index 00000000000..eeda5fc3bea Binary files /dev/null and b/addons/event/static/src/img/report_full_page_ticket_background.png differ diff --git a/addons/event/static/src/scss/event_foldable_badge_report.scss b/addons/event/static/src/scss/event_foldable_badge_report.scss new file mode 100644 index 00000000000..c63217e65de --- /dev/null +++ b/addons/event/static/src/scss/event_foldable_badge_report.scss @@ -0,0 +1,70 @@ +.o_event_foldable_badge_container { + .o_event_foldable_badge_top { + height: 148mm; + + &.o_event_foldable_badge_ticket { + border-left: 1px dashed black; + } + } + + .o_event_foldable_badge_font_small { + font-size: .8rem; + } + + .o_event_foldable_badge_bottom.o_event_foldable_badge_left { + border-top: 1px dashed black; + height: 148mm; + + p { + margin: 0px; // to match editor style (.oe_form_field_html p) + } + } + + .o_event_foldable_badge_bottom.o_event_foldable_badge_right { + border-left: 1px dashed black; + border-top:1px dashed black; + height: 148mm; + background: white; + } + + .o_event_foldable_badge_ticket { + background-repeat: no-repeat; + background-image: url(/event/static/src/img/report_foldable_badge_background.png); + + .o_event_foldable_badge_ticket_wrapper { + background-color: white; + border: solid 1px #939393; + border-radius: .7rem; + margin: 0px 8px; + padding: 10px 3px; + font-size: 1.2rem; + box-shadow: -3px 3px 9px 0px rgba(0,0,0,0.51); + + .o_event_foldable_badge_ticket_wrapper_top { + min-height: 80mm; + } + + .o_event_foldable_badge_event_name { + color: $o-brand-odoo; + } + + .o_event_foldable_badge_font_faded { + color: #939393; + } + + .o_event_foldable_badge_barcode { + min-height: 35mm; + } + } + } + + .o_event_foldable_badge_step { + position: absolute; + padding: 3px 9px; + top: 5mm; + left: 0mm; + border-radius: 50%; + background-color: black; + color: white; + } +} diff --git a/addons/event/static/src/scss/event_full_page_ticket_report.scss b/addons/event/static/src/scss/event_full_page_ticket_report.scss new file mode 100644 index 00000000000..f0ec907d7fb --- /dev/null +++ b/addons/event/static/src/scss/event_full_page_ticket_report.scss @@ -0,0 +1,68 @@ +.o_event_full_page_ticket_footer { + .o_event_full_page_ticket_powered_by { + background-color: $o-brand-odoo; + font-size: .8rem; + line-height: 1rem; + } +} + + +.o_event_full_page_ticket_container { + z-index: 1; + background-repeat: no-repeat; + background-image: url(/event/static/src/img/report_full_page_ticket_background.png); + padding: 40px 40px 0px 40px; + + .o_event_full_page_ticket_font_faded { + color: #939393; + } + + .o_event_full_page_ticket_small { + font-size: .8rem; + } + + .o_event_full_page_ticket_small_caps { + text-transform: uppercase; + font-size: .8rem; + } + + .o_event_full_page_ticket_wrapper { + z-index: 2; + .o_event_full_page_ticket_details { + background-color: white; + border: solid 1px #939393; + border-radius: .7rem; + margin: 0px 8px; + padding: 10px 3px; + box-shadow: -3px 3px 9px 0px rgba(0,0,0,0.51); + + .o_event_full_page_ticket_event_name { + color: $o-brand-odoo; + } + + .o_event_full_page_ticket_event_logo { + max-height: 50px; + } + + .o_event_full_page_ticket_barcode { + padding-left: 30px; + + .o_event_full_page_ticket_barcode_container { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + width: 67px; + + img { + padding: 0px 10px; + } + } + } + } + } + + .o_event_full_page_extra_instructions { + p { + margin: 0px; // to match editor style (.oe_form_field_html p) + } + } +} diff --git a/addons/event/static/src/scss/event_full_page_ticket_report_pdf.scss b/addons/event/static/src/scss/event_full_page_ticket_report_pdf.scss new file mode 100644 index 00000000000..e00b244ace9 --- /dev/null +++ b/addons/event/static/src/scss/event_full_page_ticket_report_pdf.scss @@ -0,0 +1,6 @@ +// The PDF layout behaves slightly differently from the layout shown in the report editor. +// This file gaps the differences with some additional custom rules to get a pixel perfect layout. +.o_event_full_page_ticket_footer { + // make sure to take entire with, including the margin imposed by "container-fluid" + width: calc(100% + 30px) !important; +} diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml index cedc15b5e85..10cbc527b37 100644 --- a/addons/event/views/event_views.xml +++ b/addons/event/views/event_views.xml @@ -64,6 +64,9 @@ + +
+
@@ -222,7 +225,12 @@
- + + diff --git a/addons/event_sale/report/event_event_templates.xml b/addons/event_sale/report/event_event_templates.xml index fa17929cd64..f891b1c9257 100644 --- a/addons/event_sale/report/event_event_templates.xml +++ b/addons/event_sale/report/event_event_templates.xml @@ -1,24 +1,22 @@ - -