File: website_slides_templates_lesson.xml

package info (click to toggle)
odoo 18.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 878,716 kB
  • sloc: javascript: 927,937; python: 685,670; xml: 388,524; sh: 1,033; sql: 415; makefile: 26
file content (555 lines) | stat: -rw-r--r-- 35,812 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
<?xml version="1.0" ?>
<odoo><data>

<!-- Slide: main template: detailed view -->
<template id="slide_main" name="Slide Detailed View" track="1">
    <t t-set="body_classname" t-value="'o_wslides_body'"/>
    <t t-call="website.layout">
        <div id="wrap" class="wrap o_wslides_wrap">
            <t t-call="website.record_cover">
                <t t-set="_record" t-value="slide.channel_id"/>
                <t t-set="use_filters" t-value="True"/>
                <t t-set="use_size" t-value="True"/>
                <t t-set="use_text_align" t-value="True"/>

                <div class="o_wslides_lesson_header position-relative pb-0 pt-2 pt-md-5">
                    <t t-call="website_slides.course_nav">
                        <t t-set="channel" t-value="slide.channel_id"/>
                    </t>
                    <div class="container o_wslides_lesson_header_container mt-5 mt-md-3 mt-xl-4">
                        <div class="row align-items-md-stretch">
                            <div t-attf-class="col-12 col-sm-9 d-flex flex-column #{'col-lg-6 offset-lg-3' if slide.channel_id.channel_type == 'training' else ''}">
                                <h2 class="fw-medium w-100 text-truncate overflow-hidden">
                                    <a t-att-href="'/slides/%s' % (slug(slide.channel_id))" class="text-white text-decoration-none" t-field="slide.channel_id.name"/>
                                </h2>
                                <div t-if="slide.channel_id.channel_type == 'documentation'" class="mb-3 small">
                                    <span class="fw-normal">Last update:</span>
                                    <t t-esc="slide.date_published" t-options="{'widget': 'date'}"/>
                                </div>
                                <div t-else="" t-attf-class="o_wslides_channel_completion_progressbar #{'d-none' if slide.channel_id.completed else 'd-flex'} align-items-center pb-3">
                                    <div class="progress w-50 bg-black-25" style="height: 10px;">
                                        <div class="progress-bar rounded-start bg-info" role="progressbar" aria-label="Progress bar"
                                            t-att-aria-valuenow="slide.channel_id.completion" aria-valuemin="0" aria-valuemax="100"
                                            t-attf-style="width: #{slide.channel_id.completion}%;">
                                        </div>
                                    </div>
                                    <i class="fa fa-trophy m-0 ms-2 p-0 text-black-50"></i>
                                    <small class="ms-2 text-white-50"><span class="o_wslides_progress_percentage" t-esc="slide.channel_id.completion"/> %</small>
                                </div>
                            </div>
                            <div t-attf-class="o_wslides_channel_completion_completed col-12 col-sm-3 #{'d-none' if not slide.channel_id.completed else ''}">
                                <h2>
                                    <small><span class="badge text-bg-success fw-normal"><i class="fa fa-check"/> Completed</span></small>
                                </h2>
                            </div>
                        </div>
                    </div>
                </div>
            </t>
            <div class="container o_wslides_lesson_main">
                <div class="row">
                    <t t-set="can_access_channel" t-value="slide.channel_id.is_member or slide.channel_id.can_publish"/>
                    <div t-attf-class="o_wslides_lesson_aside col-lg-3 #{'order-2' if slide.channel_id.channel_type == 'documentation' else ''}">
                        <t t-if="slide.channel_id.channel_type == 'training'" t-call="website_slides.slide_aside_training"/>
                        <t t-if="slide.channel_id.channel_type == 'documentation'" t-call="website_slides.slide_aside_documentation"/>
                    </div>
                    <div t-attf-class="o_wslides_lesson_content col-lg-9 #{'order-1' if slide.channel_id.channel_type == 'documentation' else ''}">
                        <t t-call="website_slides.slide_content_detailed"/>
                    </div>
                </div>
            </div>
        </div>
    </t>
</template>

<!-- Slide: sidebar documentation mode -->
<template id="slide_aside_documentation" name="Slide: Sidebar in Documentation">
    <div class="o_wslides_lesson_aside_doc position-relative bg-white pb-1 my-3 border-bottom">
        <ul class="nav nav-tabs nav-fill" role="tablist">
            <li class="nav-item" role="presentation"><a aria-controls="related" href="#related" class="nav-link rounded-0 border-top-0 border-start-0 py-2 active" data-bs-toggle="tab" role="tab">Related</a></li>
            <li class="nav-item" role="presentation"><a aria-controls="most_viewed" href="#most_viewed" class="nav-link rounded-0 border-top-0 border-end-0 py-2" data-bs-toggle="tab" role="tab">Most Viewed</a></li>
        </ul>
        <div class="tab-content">
            <div role="tabpanel" id="related" class="tab-pane active bg-100">
                <ul class="list-group list-group-flush">
                    <t t-set="related_slides_list" t-value="list(related_slides)"/>
                    <t t-if="not related_slides_list">
                        No presentation available.
                    </t>
                    <t t-else="" t-foreach="related_slides_list" t-as="aside_slide">
                        <t t-call="website_slides.slide_aside_card"/>
                    </t>
                </ul>
            </div>
            <div role="tabpanel" id="most_viewed" class="tab-pane bg-100">
                <ul class="list-group list-group-flush">
                    <t t-set="most_viewed_slides_list" t-value="list(most_viewed_slides)"/>
                    <t t-if="not list(most_viewed_slides_list)">
                        No presentation available.
                    </t>
                    <t t-else="" t-foreach="most_viewed_slides_list" t-as="aside_slide">
                        <t t-call="website_slides.slide_aside_card"/>
                    </t>
                </ul>
            </div>
        </div>
    </div>
</template>

<!-- Slide sub-template: display an item in a list of related slides (Related, Most Viewed, ...) -->
<template id="slide_aside_card" name="Related Slide">
    <a class="list-group-item list-group-item-action d-flex align-items-start px-2" t-att-href="'/slides/slide/%s' % (slug(aside_slide))">
        <div class="me-1 border o_wslides_background_image_aside_card" t-attf-style="background-image: url(#{website.image_url(aside_slide, 'image_256')});"/>
        <div class="overflow-hidden d-flex flex-column justify-content-start">
            <h6 t-esc="aside_slide.name" class="o_wslides_desc_truncate_2 mb-1" style="line-height: 1.15"/>
            <small class="text-600">
                <t t-esc="aside_slide.total_views"/> Views &#8226; <timeago class="timeago" t-att-datetime="aside_slide.create_date"></timeago>
            </small>
        </div>
    </a>
</template>

<!-- Slide: sidebar training mode -->
<template id="slide_aside_training" name="Slide: Sidebar in Training">
    <div class="o_wslides_lesson_aside_list position-relative bg-white border-bottom mt-4">
        <div class="bg-100 text-1000 h6 my-0 text-decoration-none border-bottom d-flex align-items-center justify-content-between">
            <span class="p-2">Course content</span>
            <a href="#collapse_slide_aside" data-bs-toggle="collapse" class="d-lg-none p-2 text-decoration-none o_wslides_lesson_aside_collapse">
                <i class="oi oi-chevron-down d-lg-none"/>
            </a>
        </div>
        <ul id="collapse_slide_aside" class="list-unstyled my-0 pb-3 collapse d-lg-block">
            <t t-set="i" t-value="0"/>
            <t t-if="category.get('slides')" t-foreach="category_data" t-as="category">
                <t t-call="website_slides.slide_aside_training_category">
                    <t t-set="category_slide_ids" t-value="category['slides']"/>
                </t>
            </t>
        </ul>
    </div>
</template>

<template id="slide_aside_training_category" name="Category item for the slide detailed view list">
    <t t-set="category_collapsed" t-value="category and category.get('is_collapsed')"/>
    <t t-if="category" t-set="category" t-value="category.get('category')"/>
    <li class="o_wslides_fs_sidebar_section mt-2">
        <a t-attf-href="#collapse-#{category.id if category else 0}" t-attf-id="category-collapse-#{category.id if category else 0}"
            data-bs-toggle="collapse" role="button" t-att-aria-expanded="'true' if category_collapsed else 'false'"
            class="o_wslides_lesson_aside_list_link ps-2 text-600 text-uppercase text-decoration-none p-1 small d-flex"
            t-att-aria-controls="('collapse-%s') % (category.id if category else 0)">
            <t t-if="category">
                <b t-field="category.name"/>
            </t>
            <t t-else="">
                <b>Uncategorized</b>
            </t>
            <div class="flex-grow-1"/>
            <i class="fa fa-fw fa-caret-left" role="img"/>
            <i class="fa fa-fw fa-caret-down" role="img"/>
        </a>
        <ul t-attf-class="collapse #{'show' if category_collapsed else ''} p-0 m-0 list-unstyled" t-att-id="('collapse-%s') % (category.id if category else 0)" >
            <t t-set="is_member" t-value="slide.channel_id.is_member"/>
            <t t-set="can_access_channel" t-value="is_member or slide.channel_id.can_publish"/>
            <t t-foreach="category_slide_ids" t-as="aside_slide">
                <t t-set="slide_completed" t-value="channel_progress[aside_slide.id].get('completed')"/>
                <t t-set="can_access" t-value="aside_slide.is_preview or can_access_channel"/>
                <li class="p-0 pb-1">
                    <div t-att-class="'o_wslides_lesson_aside_list_link d-flex p-1 %s%s' % (('bg-100 active' if aside_slide == slide else ''), 'text-muted' if not can_access else '')"
                        t-att-data-id="slide.id"
                        t-att-data-completed="slide_completed">
                        <t t-call="website_slides.slide_sidebar_done_button">
                            <t t-set="slide" t-value="aside_slide"/>
                            <t t-set="slide_completed" t-value="channel_progress[aside_slide.id].get('completed')"/>
                            <t t-set="use_slide_icon" t-value="True"/>
                        </t>
                        <a t-att-href="'/slides/slide/%s' % (slug(aside_slide)) if can_access else '#'"
                            t-attf-class="d-flex text-decoration-none mw-100 overflow-hidden #{'text-muted' if not can_access else ''}">
                            <div class="o_wslides_lesson_link_name text-truncate" t-att-title="aside_slide.name">
                                <span t-esc="aside_slide.name"/>
                                <span class="align-items-end" t-if="aside_slide.question_ids">
                                    <span t-att-class="'badge rounded-pill %s' % ('text-bg-success' if channel_progress[aside_slide.id].get('completed') else 'text-bg-info')">
                                        <t t-esc="channel_progress[aside_slide.id].get('quiz_karma_won') if channel_progress[aside_slide.id].get('completed') else channel_progress[aside_slide.id].get('quiz_karma_gain')"/> xp
                                    </span>
                                </span>
                            </div>
                        </a>
                    </div>
                    <ul t-if="aside_slide.sudo().slide_resource_ids or aside_slide.question_ids" class="o_wslides_lesson_aside_list_links list-group mb-1 list-unstyled fw-light">
                        <t t-if="can_access_channel" t-foreach="aside_slide.slide_resource_ids" t-as="resource">
                           <li class="ps-3">
                                <a t-if="resource.resource_type == 'url'" t-att-href="resource.link" target="new" class="text-decoration-none small">
                                    <i class="fa fa-link"/><span t-field="resource.name"/>
                                </a>
                                <a t-else="" t-att-href="resource.download_url" class="text-decoration-none small">
                                    <i class="fa fa-download"/><span t-field="resource.name"/>
                                </a>
                            </li>
                        </t>
                        <div t-else="" class="o_wslides_js_course_join o_wslides_no_access ps-3">
                            <li t-if="aside_slide.channel_id.enroll == 'public' or (aside_slide.channel_id.enroll == 'invite' and aside_slide.channel_id.is_member_invited)"
                                class="text-decoration-none small">
                                <i class="fa fa-download"/>
                                <t t-call="website_slides.join_course_link">
                                    <t t-set="for_resources" t-value="1"/>
                                </t>
                            </li>
                        </div>
                        <li t-if="aside_slide.question_ids and aside_slide.slide_category != 'quiz'" class="ps-3">
                            <a t-if="can_access" t-att-href="'/slides/slide/%s#lessonQuiz' % (slug(aside_slide))"
                                class="o_wslides_lesson_aside_list_link text-decoration-none small text-600">
                                <i class="fa fa-flag text-warning"/> Quiz
                            </a>
                            <span t-else="" class="o_wslides_lesson_aside_list_link text-decoration-none small text-600 text-muted">
                                <i class="fa fa-flag text-warning"/> Quiz
                            </span>
                        </li>
                    </ul>
                </li>
            </t>
        </ul>
    </li>
</template>

<!-- Slide: all its content, not fullscreen mode -->
<template id="slide_content_detailed" name="Slide: Detailed Content">
    <div class="d-flex flex-wrap align-items-start my-3 w-100">
        <t t-set="slide_completed" t-value="channel_progress[slide.id].get('completed')"/>
        <div class="col-12 col-md order-2 order-md-1 d-flex">
            <div class="d-flex align-items-start overflow-hidden">
                <h1 class="h4 my-0 d-flex flex_row overflow-hidden">
                    <i t-attf-class="fa #{slide.slide_icon_class} me-2"/>
                    <span class="text-truncate" t-field="slide.name"/>
                </h1>
            </div>
        </div>
        <div class="col-12 col-md order-1 order-md-2 text-nowrap flex-grow-0 d-flex flex-wrap flex-md-nowrap justify-content-center justify-content-md-end align-items-center mb-3 mb-md-0">
            <t t-set="quiz_karma_won" t-value="channel_progress[slide.id].get('quiz_karma_won', 0)"/>
            <t t-set="quiz_karma_gain" t-value="channel_progress[slide.id].get('quiz_karma_gain', 0)"/>
            <span t-if="slide.question_ids and (slide_completed or quiz_karma_gain)" style="flex-basis: 100%"
                t-attf-class="mx-2 my-1 badge #{'text-bg-success' if slide_completed else 'text-bg-info'}">
                <span t-if="slide_completed">
                    <i class="fa fa-check-circle"/>
                    <t t-if="quiz_karma_won">
                        <t t-esc="quiz_karma_won" />
                        <span>XP</span>
                    </t>
                </span>
                <t t-else="">
                    <span t-esc="quiz_karma_gain"/>
                    <span>XP</span>
                </t>
            </span>
            <div class="btn-group flex-grow-1 flex-sm-0 my-1" role="group" aria-label="Lesson Nav">
                <a t-attf-class="o_wslides_nav_button btn btn-light border my-auto #{'disabled' if not previous_slide else ''} me-2"
                    role="button" t-att-aria-disabled="'true' if not previous_slide else None" aria-label="Previous"
                    t-att-href="'/slides/slide/%s' % (slug(previous_slide)) if previous_slide else '#'">
                    <i class="oi oi-chevron-left me-2"></i> <span class="d-none d-sm-inline-block">Prev</span>
                </a>
                <t t-if="slide.channel_id.channel_type == 'documentation' and slide.channel_id.is_member">
                    <t t-set="is_quiz" t-value="slide.slide_category == 'quiz' or slide.question_ids"/>
                    <a t-if="slide_completed and slide.can_self_mark_uncompleted" role="button"
                        class="o_wslides_undone_button btn btn-light border me-2"
                        t-attf-href="/slides/slide/#{slide.id}/set_uncompleted">
                        Mark To Do
                    </a>
                    <a t-elif="not slide_completed and is_quiz" role="button"
                        class="o_wslides_done_button btn btn-primary border text-white me-2"
                        href="#quiz_container">
                        Take Quiz
                    </a>
                    <a t-else="not slide_completed and slide.can_self_mark_completed" role="button"
                        class="o_wslides_done_button btn btn-primary border text-white me-2"
                        t-attf-href="/slides/slide/#{slide.id}/set_completed?next_slide_id=#{next_slide.id if next_slide else ''}">
                        Mark Done
                    </a>
                </t>
                <div t-if="slide.channel_id.channel_type == 'documentation' and not slide.channel_id.is_member" class="me-2">
                    <t t-call="website_slides.course_join">
                        <t t-set="channel" t-value="slide.channel_id"/>
                    </t>
                </div>
                <a t-attf-class="o_wslides_nav_button btn btn-light border my-auto #{'disabled' if not next_slide else ''}"
                    role="button" t-att-aria-disabled="'true' if not next_slide else None" aria-label="Next"
                    t-att-href="'/slides/slide/%s' % (slug(next_slide)) if next_slide else '#'">
                    <span class="d-none d-sm-inline-block">Next</span> <i class="oi oi-chevron-right ms-2"></i>
                </a>
            </div>
            <a class="btn btn-light border ms-2 my-1" role="button" t-att-href="'/slides/slide/%s?fullscreen=1' % (slug(slide))" aria-label="Fullscreen">
                <i class="fa fa-desktop me-xl-2 my-1"/>
                <span class="d-none d-xl-inline-block">Fullscreen</span>
            </a>
            <a class="o_wslides_share btn btn-light border ms-2 my-1" role="button" t-att-data-name="slide.name"
               t-att-data-id="slide.id" t-att-data-url="slide.website_share_url" t-att-data-category="slide.slide_category"
               t-att-data-email-sharing="bool(slide.channel_id.share_slide_template_id)"
               t-att-data-embed-code="slide.embed_code_external if slide.slide_category in ['video', 'document'] else False"
               aria-label="Share">
                <i class="fa fa-share-alt me-xl-2 my-1"/>
                <span class="d-none d-xl-inline-block">Share</span>
            </a>
        </div>
    </div>
    <div t-if="slide.tag_ids" class="pb-2">
        <t t-foreach="slide.tag_ids" t-as="tag">
            <a t-att-href="'/slides/%s/tag/%s' % (slug(slide.channel_id), slug(tag))" class="badge text-bg-info" t-esc="tag.name"/>
        </t>
    </div>
    <t t-set="editor_message">BUILDING BLOCKS DROPPED HERE WILL BE SHOWN ACROSS ALL LESSONS</t>
    <div class="oe_structure oe_empty" id="oe_structure_website_slides_lesson_top_1" t-att-data-editor-message="editor_message"/>
    <div t-if="slide.slide_category == 'infographic'" class="o_wslides_lesson_content_type" t-field='slide.image_1920' t-options="{'widget': 'image', 'style': 'width: 100%;'}"/>
    <div t-else="" class="o_wslides_lesson_content_type">
        <div t-if="slide.slide_category == 'document'" class="ratio ratio-4x3 embed-responsive-item mb8" style="height: 600px;">
            <t t-out="slide.embed_code"/>
        </div>
        <div t-if="slide.slide_category == 'video'" class="ratio ratio-16x9 embed-responsive-item mb8">
            <t t-out="slide.embed_code"/>
        </div>
        <div t-if="slide.slide_category == 'article'">
            <div t-if="is_html_empty(slide.html_content)" class="alert alert-info o_not_editable">
                Click on the "Edit" button in the top corner of the screen to edit your slide content.
            </div>
            <div class="bg-white p-3">
                <div t-field="slide.html_content" placeholder="Add your content here..."/>
            </div>
        </div>
    </div>

    <div class="mb-5 position-relative">
        <ul class="nav nav-tabs o_wslides_lesson_nav" role="tablist">
            <li class="nav-item" role="presentation">
                <a href="#about" aria-controls="about" t-att-class="'nav-link active' if not comments else 'nav-link'" role="tab" data-bs-toggle="tab">
                    <i class="fa fa-home"></i> About
                </a>
            </li>
            <li class="nav-item" role="presentation">
                <a href="#discuss" aria-controls="discuss" t-att-class="'nav-link active' if comments else 'nav-link'" role="tab" data-bs-toggle="tab">
                    <i class="fa fa-comments"></i> Comments (<span t-esc="slide.comments_count"/>)
                </a>
            </li>
            <li class="nav-item" role="presentation" groups="base.group_user">
                <a href="#statistic" aria-controls="statistic" class="nav-link" role="tab" data-bs-toggle="tab">
                    <i class="fa fa-bar-chart"></i> Statistics
                </a>
            </li>
        </ul>
        <div class="tab-content mt-3">
            <div role="tabpanel" t-att-class="not comments and 'tab-pane fade in show active' or 'tab-pane fade'" id="about">
                <div t-field="slide.description"/>
                <div t-if="slide.channel_id.allow_comment" class="d-flex">
                    <span class="text-muted fw-bold me-3">Rating</span>
                    <div class="text-muted border-start ps-3">
                        <div class="o_wslides_js_slide_like me-2">
                            <span t-attf-class="o_wslides_js_slide_like_up #{'disabled' if not slide.channel_id.can_vote else ''}" tabindex="0" data-bs-toggle="popover" t-att-data-slide-id="slide.id" t-att-data-user-vote="slide.user_vote">
                                <i t-attf-class="fa fa-1x #{'fa-thumbs-up' if slide.user_vote == 1 else 'fa-thumbs-o-up'}" role="img" aria-label="Likes" title="Like"/>
                                <span t-field="slide.likes" t-options="{'format_decimalized_number': True}"/>
                            </span>
                            <span t-attf-class="o_wslides_js_slide_like_down ms-3 #{'disabled' if not slide.channel_id.can_vote else ''}" tabindex="0" data-bs-toggle="popover" t-att-data-slide-id="slide.id" t-att-data-user-vote="slide.user_vote">
                                <i t-attf-class="fa fa-1x #{'fa-thumbs-down' if slide.user_vote == -1 else 'fa-thumbs-o-down'}" role="img" aria-label="Dislikes" title="Dislike"/>
                                <span t-field="slide.dislikes" t-options="{'format_decimalized_number': True}"/>
                            </span>
                        </div>
                    </div>
                </div>
            </div>
            <div role="tabpanel" t-att-class="comments and 'tab-pane fade in show active' or 'tab-pane fade'" id="discuss">
                <t t-set="enable_slide_comments" t-value="0"/>
                <p t-if="not (slide.channel_id.allow_comment and slide.channel_id.channel_type == 'training')">
                    Commenting is not enabled on this course.
                </p>
                <t t-elif="not slide.comments_count">
                    <p t-if="not can_access_channel">
                        There are no comments for now.
                        <t t-if="slide.channel_id.enroll != 'invite'">
                            <div class="o_wslides_js_course_join o_wslides_no_access_comments d-inline">
                                <t t-if="slide.channel_id.enroll == 'public'" t-call="website_slides.join_course_link"/>
                            </div>
                            to be the first to leave a comment.
                        </t>
                    </p>
                    <p t-elif="not slide.channel_id.can_comment">
                        There are no comments for now. Earn more Karma to be the first to leave a comment.
                    </p>
                    <t t-else="" t-set="enable_slide_comments" t-value="1"/>
                </t>
                <t t-else="">
                    <t t-set="enable_slide_comments" t-value="1"/>
                    <t t-if="not slide.channel_id.can_comment and can_access_channel"><p>Earn more Karma to leave a comment.</p></t>
                </t>
                <t t-if="enable_slide_comments" t-call="portal.message_thread">
                    <t t-set="object" t-value="slide"/>
                    <t t-set="disable_composer" t-value="not (slide.channel_id.can_comment and slide.channel_id.allow_comment)"/>
                    <t t-set="display_rating" t-value="False"/>
                </t>
            </div>
            <div role="tabpanel" class="tab-pane fade" groups="base.group_user" id="statistic" t-att-slide-url="slide.website_url">
                <div class="row">
                    <div class="col-md-6">
                        <table class="table table-sm">
                            <tbody>
                                <tr>
                                    <th colspan="2" class="border-top-0">Views</th>
                                </tr>
                                <tr class="border-top-0">
                                    <th class="border-top-0"><span t-esc="slide.total_views"/></th>
                                    <td class="border-top-0 w-100">Total Views</td>
                                </tr>
                                <tr>
                                    <th><span t-esc="slide.slide_views"/></th>
                                    <td>Members Views</td>
                                </tr>
                                <tr>
                                    <th><span t-esc="slide.public_views"/></th>
                                    <td>Public Views</td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="o_wslides_js_quiz_container" t-att-data-slide-id="slide.id" id="quiz_container">
        <div class="row" t-if="slide.slide_category != 'certification'">
            <t t-if="slide.question_ids">
                <t t-call="website_slides.lesson_content_quiz"/>
            </t>
            <div t-else="" class="o_wslides_js_lesson_quiz col" t-att-data-id="slide.id">
                <t t-if="slide.channel_id.can_upload" t-call="website_slides.lesson_content_quiz_add_buttons"/>
            </div>
        </div>
    </div>
    <div class="mt-3 mb-3">
        <t t-if="slide.sudo().slide_resource_ids">
            <t t-set="can_access_channel" t-value="slide.channel_id.is_member or slide.channel_id.can_publish"/>
            <t t-if="can_access_channel">
                <t t-set="links" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'url')"/>
                <div class="row mb-4 mt-4" t-if="links">
                    <span class="text-muted fw-bold col-4 col-md-3">External sources</span>
                    <div class="text-muted me-auto border-start ps-3 col-8 col-md-9">
                        <t t-foreach="links" t-as="link">
                            <a t-att-href="link.link" t-esc="link.name"/><br />
                        </t>
                    </div>
                </div>
                <t t-set="files" t-value="slide.slide_resource_ids.filtered(lambda res: res.resource_type == 'file' and res.data)"/>
                <div class="row mb-4 o_wslides_js_course_join" t-if="files">
                    <span class="text-muted fw-bold col-4 col-md-3">
                        Additional Resources
                    </span>
                    <div class="text-muted me-auto border-start ps-3 col-8 col-md-9">
                        <t t-foreach="slide.slide_resource_ids" t-as="resource" t-if="resource.resource_type == 'file' and resource.data">
                            <a t-att-href="resource.download_url" t-esc="resource.name"/><br />
                        </t>
                    </div>
                </div>
            </t>
            <t t-else="">
                <span t-if="slide.is_preview" class="text-muted fw-bold me-3">
                    Additional Resources
                </span>
                <div class="o_wslides_js_course_join o_wslides_no_access">
                    <div t-if="slide.channel_id.enroll == 'invite' and not slide.channel_id.is_member_invited">
                        <span>Content only accessible to course attendees.</span>
                    </div>
                    <div t-else="" class="text-muted me-auto border-start ps-3">
                        <t t-call="website_slides.join_course_link">
                            <t t-set="for_resources" t-value="1"/>
                        </t>
                    </div>
                </div>
            </t>
        </t>
    </div>
</template>

<!-- Slide sub-tempalte: render a quiz serverside. Should be sync with JS qweb template "slide.slide.quiz" -->
<template id="lesson_content_quiz" name="Lesson: Quiz specific content">
    <t t-set="slide_completed" t-value="channel_progress[slide.id].get('completed')"/>
    <div class="o_wslides_js_lesson_quiz col" id="lessonQuiz"
        t-att-data-id="slide.id"
        t-att-data-name="slide.name"
        t-att-data-slide-category="slide.slide_category"
        t-att-data-is-member="slide.channel_id.is_member"
        t-att-data-is-member-or-invited="slide.channel_id.is_member or slide.channel_id.is_member_invited"
        t-att-data-can-self-mark-completed="slide.can_self_mark_completed"
        t-att-data-can-self-mark-uncompleted="slide.can_self_mark_uncompleted"
        t-att-data-completed="slide_completed"
        t-att-data-quiz-attempts-count="quiz_attempts_count"
        t-att-data-quiz-karma-max="quiz_karma_max"
        t-att-data-quiz-karma-gain="quiz_karma_gain"
        t-att-data-quiz-karma-won="quiz_karma_won"
        t-att-data-has-next="1 if next_slide else 0"
        t-att-data-next-slide-url="'/slides/slide/%s' % (slug(next_slide)) if next_slide else None"
        t-att-data-channel-id="slide.channel_id.id"
        t-att-data-channel-enroll="slide.channel_id.enroll"
        t-att-data-channel-requested-access="slide.channel_id.has_requested_access"
        t-att-data-channel-can-upload="slide.channel_id.can_upload"
        t-att-data-signup-allowed="signup_allowed"
        t-att-data-session-answers="session_answers">
        <t t-foreach="slide_questions" t-as="question">
            <t t-call="website_slides.lesson_content_quiz_question"/>
        </t>
        <t t-if="slide.channel_id.can_upload" t-call="website_slides.lesson_content_quiz_add_buttons"/>
        <div class="o_wslides_js_lesson_quiz_validation pt-3"/>
    </div>
</template>

<template id="lesson_content_quiz_question" name="Lesson: Quiz question template">
    <div t-att-class="'o_wslides_js_lesson_quiz_question mt-3 %s' % ('completed-disabled' if slide_completed else ('disabled' if not (slide.channel_id.is_member or slide.is_preview) else ''))"
         t-att-data-question-id="question['id']" t-att-data-title="question['question']" >
        <div class="row d-flex mb-2 mx-0">
            <div class="h4">
                <small class="text-muted">
                    <i class="o_wslides_js_quiz_icon o_wslides_js_quiz_sequence_handler fa fa-bars me-1 text-muted" t-if="slide.channel_id.can_upload and not slide_completed" />
                    <t t-if="question_index != NoneType"><span class="o_wslides_quiz_question_sequence" t-esc="question_index+1"/>.</t>
                    <t t-else=""><span class="o_wslides_quiz_question_sequence" t-esc="question['sequence']"/>.</t>
                </small>
                <span t-esc="question['question']"/>
            </div>
            <div class="ms-auto o_wslides_js_quiz_edit_del" t-if="slide.channel_id.can_upload and not slide_completed" >
                <i class="o_wslides_js_quiz_icon o_wslides_js_quiz_edit_question fa fa-pencil-square-o p-1 text-muted"></i>
                <i class="o_wslides_js_quiz_icon o_wslides_js_quiz_delete_question fa fa-trash p-1 text-muted"></i>
            </div>
        </div>
        <div class="list-group">
            <t t-foreach="question['answer_ids']" t-as="answer">
                <a t-att-data-answer-id="answer['id']" href="#"
                    t-att-data-text="answer['text_value']" t-att-data-is-correct="answer['is_correct']" t-att-data-comment="answer['comment']"
                    t-att-class="'o_wslides_quiz_answer list-group-item list-group-item-action d-flex align-items-center %s' % ('list-group-item-success' if slide_completed and answer['is_correct'] else '')">
                    <label class="my-0 d-flex align-items-center justify-content-center me-2">
                        <input type="radio"
                            t-att-name="question['id']"
                            t-att-value="answer['id']"
                            class="d-none"
                            t-att-disabled="True if not slide.channel_id.is_member or slide_completed else ''"/>
                        <i t-att-class="'fa fa-circle text-400 %s' % ('d-none' if slide_completed and answer['is_correct'] else '')"/>
                        <i class="fa fa-times-circle text-danger d-none"></i>
                        <i t-att-class="'fa fa-check-circle text-success %s' % ('d-none' if not (slide_completed and answer['is_correct']) else '')"></i>
                    </label>
                    <span t-esc="answer['text_value']"/>
                </a>
                <t t-if="slide_completed and answer['is_correct']" t-set="correct_answer_comment" t-value="answer['comment']"/>
            </t>
            <div t-attf-class="o_wslides_quiz_answer_info list-group-item list-group-item-info #{'' if correct_answer_comment else 'd-none'}">
                <i class="fa fa-info-circle"/>
                <span class="o_wslides_quiz_answer_comment ms-1">
                    <t t-if="correct_answer_comment" t-out="correct_answer_comment"/>
                </span>
            </div>
        </div>
    </div>
</template>

<template id="lesson_content_quiz_add_buttons" name="Lesson: Quiz Add Buttons template">
    <div class="o_wslides_js_lesson_quiz_new_question mt-3">
        <a t-attf-class="o_wslides_js_quiz_add o_wslides_js_quiz_add_quiz btn btn-light border #{'d-none ' if slide.question_ids else ''}" role="button">
            <i class="fa fa-plus me-2"/>
            <span>Add Quiz</span>
        </a>
        <a t-attf-class="o_wslides_js_quiz_add o_wslides_js_quiz_add_question btn btn-light border ms-3 #{'' if slide.question_ids else 'd-none '}" role="button">
            <i class="fa fa-plus me-2"/>
            <span>Add Question</span>
        </a>
    </div>
</template>

</data></odoo>