Le repo des sources pour le site web des JM2L
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

526 lines
22 KiB

  1. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  2. ## Afficher un form
  3. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  4. <%def name="DisplayForm(form, DicFormat)">
  5. <%
  6. TabJs = {'select':[], 'desc':[]}
  7. %>
  8. % for FieldName, Field in form._fields.items():
  9. % if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("Ignore"):
  10. <% continue %>
  11. % endif
  12. % if Field.type in ['HiddenField', 'CSRFTokenField']:
  13. ${Field}
  14. <% continue %>
  15. % elif Field.type=="SelectField":
  16. <% TabJs['select'].append(Field.label.field_id) %>
  17. % endif
  18. % if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("fieldset"):
  19. <fieldset>
  20. <legend>${Field.label.text}</legend>
  21. % else:
  22. % if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("ContainerStyle"):
  23. <div style="padding-right:5px;${DicFormat[Field.name].get("ContainerStyle")}">
  24. % else:
  25. <div style="padding-right:5px;">
  26. % endif
  27. <label for="${Field.label.field_id}">${Field.label.text}
  28. % if Field.description:
  29. <% TabJs['desc'].append(Field.label.field_id) %>
  30. <a id="${Field.label.field_id}-help" data-toggle="popover"
  31. data-original-title="${Field.label.text}"
  32. data-content="${Field.description}">
  33. <i class="icon-me" style="background-image: url('/static/Help.png');background-position:1px 2px;"></i>
  34. </a>
  35. % endif
  36. </label>
  37. % endif
  38. % if DicFormat.has_key(Field.name):
  39. % if DicFormat[Field.name].has_key("PlaceHolder") and DicFormat[Field.name].has_key("FieldStyle"):
  40. ${Field(placeholder=DicFormat[Field.name].get("PlaceHolder"), style=DicFormat[Field.name].get("FieldStyle"))}
  41. % elif DicFormat[Field.name].has_key("PlaceHolder"):
  42. ${Field(placeholder=DicFormat[Field.name].get("PlaceHolder"))}
  43. % elif DicFormat[Field.name].has_key("FieldStyle"):
  44. ${Field(style=DicFormat[Field.name].get("FieldStyle"))}
  45. % else:
  46. ${Field()}
  47. % endif
  48. % else:
  49. ${Field()}
  50. % endif
  51. % for error in Field.errors:
  52. <div class="alert alert-error">
  53. <button type="button" class="close" data-dismiss="alert">&times;</button>
  54. <h4>Erreur!</h4>
  55. ${ error }
  56. </div>
  57. % endfor
  58. % if DicFormat.has_key(Field.name) and DicFormat[Field.name].get("fieldset"):
  59. </fieldset>
  60. % else:
  61. </div>
  62. % endif
  63. % endfor
  64. ## Then Auto Handle Javascript calls
  65. <script>
  66. % for jsitem in TabJs['select']:
  67. $("#${jsitem}").select2({});
  68. % endfor
  69. % for jsitem in TabJs['desc']:
  70. $('#${jsitem}-help').popover();
  71. % endfor
  72. </script>
  73. </%def>
  74. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  75. ## Wrapper pour la form Sejour
  76. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  77. <%def name="sejour_wrapper(Places)">
  78. <div class="form-inline">
  79. Départ :
  80. <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu">
  81. % for place in Places:
  82. <option value="${place.place_id}">${place.display_name}</option>
  83. % endfor
  84. </select>
  85. </div>
  86. <br />
  87. <div class="form-inline">
  88. Arrivée :
  89. <select style="width:12em;" id="Arrival:Place" name="Arrival:Place" title="Lieu">
  90. % for place in Places:
  91. <option value="${place.place_id}">${place.display_name}</option>
  92. % endfor
  93. </select>
  94. </div>
  95. </%def>
  96. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  97. ## Wrapper pour la form Itineraire
  98. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  99. <%def name="itin_wrapper(itin_form)">
  100. <div style="padding:5px;">
  101. <div style="float:left;padding-right:5px;">
  102. <label for="${itin_form.start_place.label.field_id}">
  103. ${itin_form.start_place.label}
  104. </label>
  105. % for error in itin_form.start_place.errors:
  106. <div class="alert error">Le Depart ${ error }</div>
  107. % endfor
  108. ${itin_form.start_place(style='width:17em;')},
  109. </div>
  110. <div>
  111. <label for="${itin_form.arrival_place.label.field_id}">
  112. ${itin_form.arrival_place.label}
  113. </label>
  114. % for error in itin_form.arrival_place.errors:
  115. <div class="alert error">Arrivee ${ error }</div>
  116. % endfor
  117. ${itin_form.arrival_place(style='width:17em;')}
  118. </div>
  119. <div style="padding:5px;">
  120. <small style="color:#999">Si je n´ai pas trouvé le lieu dont j´ai besoin dans ces listes...</small>
  121. <br />
  122. <small style="color:#999">Je peux </small>
  123. <a class="btn btn-mini btn-info" role="button" href="javascript:DoGetLieu('/2015/modal/Place/0');">
  124. <i class="icon-plus-sign icon-white"></i> Ajouter un lieu
  125. </a>
  126. </div>
  127. </div>
  128. <script>
  129. $("#${itin_form.start_place.label.field_id}").select2({});
  130. $("#${itin_form.arrival_place.label.field_id}").select2({});
  131. </script>
  132. </%def> \
  133. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  134. ## Wrapper pour afficher les fichiers
  135. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  136. <%def name="medias(MediaType, UID, desc=None)"> \
  137. </%def>
  138. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  139. ## Wrapper pour uploader
  140. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  141. <%def name="uploader(MediaType, UID, desc=None)"> \
  142. <!-- The file upload form used as target for the file upload widget -->
  143. <form class="fileupload" id="fileupload_${MediaType}" action="/uploader/${MediaType}/${UID}/proceed" method="POST" enctype="multipart/form-data">
  144. <!-- Redirect browsers with JavaScript disabled to the origin page -->
  145. <noscript><input type="hidden" name="redirect" value="/"></noscript>
  146. <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
  147. <div class="fileupload-buttonbar">
  148. <!-- The fileinput-button span is used to style the file input field as button -->
  149. <span class="btn btn-success fileinput-button">
  150. <i class="icon-plus icon-white"></i>
  151. % if desc:
  152. <span>Ajouter ${desc}</span>
  153. % else:
  154. <span>Ajouter</span>
  155. % endif:
  156. <input type="file" name="files[]" multiple>
  157. </span>
  158. <!-- The global file processing state -->
  159. <span class="fileupload-process"></span>
  160. <!-- The global progress state -->
  161. <div class="fileupload-progress fade" style="float:right;">
  162. <!-- The global progress bar -->
  163. <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
  164. <div class="progress-bar progress-bar-success" style="width:0%;"></div>
  165. </div>
  166. <!-- The extended global progress state -->
  167. <div class="progress-extended">&nbsp;</div>
  168. </div>
  169. </div>
  170. <!-- The table listing the files available for upload/download -->
  171. <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
  172. </form>
  173. </%def> \
  174. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  175. ## Wrapper pour uploader - Partie JavaScript
  176. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  177. <%def name="uploader_js()"> \
  178. <!-- The template to display files available for upload -->
  179. <script id="template-upload" type="text/x-tmpl">
  180. {% for (var i=0, file; file=o.files[i]; i++) { %}
  181. <tr class="template-upload fade">
  182. <td style="width: 80px;">
  183. <span class="preview"></span>
  184. </td>
  185. <td>
  186. <p class="name">{%=file.name%}</p>
  187. <strong class="error text-danger"></strong>
  188. <p class="size">Processing...</p>
  189. <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
  190. </td>
  191. <td style="width: 85px;">
  192. {% if (!i && !o.options.autoUpload) { %}
  193. <button class="btn-mini btn-primary start" disabled style="width: 80px;">
  194. <i class="icon-upload icon-white"></i>
  195. <span>Upload</span>
  196. </button>
  197. {% } %}
  198. {% if (!i) { %}
  199. <button class="btn-mini btn-warning cancel" style="width: 80px;">
  200. <i class="icon-ban-circle icon-white"></i>
  201. <span>Annuler</span>
  202. </button>
  203. {% } %}
  204. </td>
  205. </tr>
  206. {% } %}
  207. </script>
  208. <!-- The template to display files available for download -->
  209. <script id="template-download" type="text/x-tmpl">
  210. {% for (var i=0, file; file=o.files[i]; i++) { %}
  211. <tr class="template-download fade">
  212. <td style="width: 80px;">
  213. <span class="preview">
  214. {% if (file.thumbnailUrl) { %}
  215. <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
  216. {% } %}
  217. </span>
  218. </td>
  219. <td>
  220. <p class="name">
  221. {% if (file.url) { %}
  222. <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
  223. {% } else { %}
  224. <span>{%=file.name%}</span>
  225. {% } %}
  226. </p>
  227. <p><span class="size">{%=o.formatFileSize(file.size)%}</span></p>
  228. {% if (file.error) { %}
  229. <div><span class="label label-danger">Erreur</span> {%=file.error%}</div>
  230. {% } %}
  231. </td>
  232. <td style="width: 85px;">
  233. {% if (file.deleteUrl) { %}
  234. <button class="btn-mini btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
  235. <i class="icon-trash icon-white"></i>
  236. <span>Suppr.</span>
  237. </button>
  238. <input type="checkbox" name="delete" value="1" class="toggle">
  239. {% } else { %}
  240. <button class="btn-mini btn-warning cancel">
  241. <i class="icon-ban-circle icon-white"></i>
  242. <span>Annuler</span>
  243. </button>
  244. {% } %}
  245. </td>
  246. </tr>
  247. {% } %}
  248. </script>
  249. %if 1:
  250. <script src="/static/js/allinone/jquery-uploader-min.js"></script>
  251. <script src="/static/js/main.js"></script>
  252. % else:
  253. <script src="/static/jquery.min.js"></script>
  254. <!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
  255. <script src="/static/js/vendor/jquery.ui.widget.js"></script>
  256. <!-- The Templates plugin is included to render the upload/download listings -->
  257. <script src="/static/js/tmpl.min.js"></script>
  258. <!-- The Load Image plugin is included for the preview images and image resizing functionality -->
  259. <script src="/static/js/load-image.all.min.js"></script>
  260. <!-- The Canvas to Blob plugin is included for image resizing functionality -->
  261. <script src="/static/js/canvas-to-blob.min.js"></script>
  262. <!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
  263. <script src="/static/bootstrap.min.js"></script>
  264. <!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
  265. <script src="/static/js/jquery.iframe-transport.js"></script>
  266. <!-- The basic File Upload plugin -->
  267. <script src="/static/js/jquery.fileupload.js"></script>
  268. <!-- The File Upload processing plugin -->
  269. <script src="/static/js/jquery.fileupload-process.js"></script>
  270. <!-- The File Upload image preview & resize plugin -->
  271. <script src="/static/js/jquery.fileupload-image.js"></script>
  272. <!-- The File Upload audio preview plugin -->
  273. <script src="/static/js/jquery.fileupload-audio.js"></script>
  274. <!-- The File Upload video preview plugin -->
  275. <script src="/static/js/jquery.fileupload-video.js"></script>
  276. <!-- The File Upload validation plugin -->
  277. <script src="/static/js/jquery.fileupload-validate.js"></script>
  278. <!-- The File Upload user interface plugin -->
  279. <script src="/static/js/jquery.fileupload-ui.js"></script>
  280. <!-- The main application script -->
  281. <script src="/static/js/main.js"></script>
  282. <!-- The XDomainRequest Transport is included for cross-domain file deletion for IE 8 and IE 9 -->
  283. <!--[if (gte IE 8)&(lt IE 10)]>
  284. <script src="/static/js/cors/jquery.xdr-transport.js"></script>
  285. <![endif]-->
  286. % endif
  287. </%def> \
  288. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  289. ## Wrapper pour les intervention utilisateur
  290. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  291. <%def name="show_Interventions(ListEvent, HeadTitle=None, NotFoundTitle=None)"> \
  292. <table width="100%" class="table table-striped table-bordered table-hover">
  293. <tr>
  294. <th style="width:6em;text-align:center;">Date</th>
  295. % if HeadTitle:
  296. <th style="text-align:center;">${HeadTitle}</th>
  297. % else:
  298. <th style="text-align:center;">L'historique des interventions</th>
  299. % endif
  300. </tr>
  301. % if len(ListEvent)==0:
  302. <tr>
  303. <td style="text-align:center;" colspan="2">
  304. % if NotFoundTitle:
  305. <i>${NotFoundTitle}</i>
  306. % else:
  307. <i>Désolé, Il n'y a rien dans l'historique.</i>
  308. % endif
  309. </td>
  310. </tr>
  311. % else:
  312. % for event in ListEvent:
  313. <tr>
  314. <td style="text-align:center;">
  315. <%
  316. start = event.start_time.time()
  317. end = event.end_time.time()
  318. vid = event.video.first()
  319. pres = event.presentation.first()
  320. %>
  321. ${event.start_time.strftime('%d %b %Y').decode('utf-8')}
  322. ${start.hour}:${"%.2d" % start.minute}-${end.hour}:${"%.2d" % end.minute}
  323. </td>
  324. <td style="position: relative;">${event.event_type}:
  325. <strong>
  326. <a href="/event/${event.for_year}/${event.slug}">${event.name}</a>
  327. </strong>
  328. <span style="float:right;">
  329. % if vid:
  330. <a href="${vid.get_path}">
  331. <i class="icon-film"></i>
  332. </a>
  333. % endif
  334. % if pres:
  335. <a href="${pres.get_path}">
  336. <i class="icon-list-alt"></i>
  337. </a>
  338. % endif
  339. </span>
  340. % if event.Salle:
  341. <div style="position: absolute; bottom: 2px; right: 5px;">
  342. ${event.Salle.name}
  343. </div>
  344. % endif
  345. <br/>
  346. % if event.intervenants.count()>1:
  347. avec
  348. % for num, inter in enumerate(event.intervenants.all()):
  349. <%
  350. if inter==uprofil:
  351. continue
  352. %>
  353. <a href="/user/${inter.slug}">${inter.prenom} ${inter.nom}</a>,
  354. % endfor
  355. % endif
  356. </td>
  357. </tr>
  358. % endfor
  359. % endif
  360. </table>
  361. </%def>
  362. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  363. ## Wrapper pour les badges des entités utilisateur
  364. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  365. <%def name="show_SummaryEntities(ListEntities)"> \
  366. <ul class="thumbnails">
  367. % for tiers in ListEntities:
  368. <% Entity = tiers.get_entity_type %>
  369. <li class="span3 tiers">
  370. <div class="media">
  371. <a class="pull-left" href="/entity/${Entity.entity_type}/${tiers.slug}">
  372. % if tiers.ThumbLinks:
  373. <img class="media-object" src="${tiers.ThumbLinks.pop()}" />
  374. % else:
  375. <img class="media-object" src="/img/no-image-thumb.jpg" />
  376. % endif
  377. </a>
  378. <div class="media-body">
  379. %if Entity.entity_subtype!=Entity.entity_type:
  380. <h5 style="margin:0">${Entity.entity_type} ${Entity.entity_subtype}</h5>
  381. %else:
  382. <h5 style="margin:0">${Entity.entity_type}</h5>
  383. %endif
  384. <a href="/entity/${Entity.entity_type}/${tiers.slug}">
  385. <h4 class="media-heading">${tiers.name}</h4>
  386. </a>
  387. % if Entity.entity_role:
  388. <span><i>${Entity.entity_role}</i></span>
  389. % endif
  390. </div>
  391. </div>
  392. </li>
  393. % endfor
  394. </ul>
  395. </%def>
  396. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  397. ## Wrapper pour les photos
  398. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  399. <%def name="show_pictures(uprofil)"> \
  400. <div class="profile-icon pull-right">
  401. <% photos = uprofil.PhotosLinks %>
  402. <div id="MyPictureCarousel" class="carousel slide">
  403. % if len(photos)>1:
  404. <!-- Carousel nav -->
  405. <a class="Ucarousel-control left" href="#MyPictureCarousel" data-slide="prev">&lsaquo;</a>
  406. <a class="Ucarousel-control right" href="#MyPictureCarousel" data-slide="next">&rsaquo;</a>
  407. % endif
  408. <!-- Carousel items -->
  409. <div class="carousel-inner" style="height: 220px;">
  410. % if len(photos):
  411. % for num, link in enumerate(photos):
  412. <div class="${['','active '][num==0]}item" id="UserPic${num}">
  413. <div style="margin:auto;">
  414. <img src="${link}" class="img-polaroid" style="max-height:205px;max-width:235px;" alt="Photo ${uprofil.nom} ${uprofil.prenom}" />
  415. </div>
  416. </div>
  417. % endfor
  418. % else:
  419. <div class="active item" id="UserPic0">
  420. <div style="margin:auto;width:170px;">
  421. <img src="/static/avatars/default-user.png" class="img-polaroid" alt="Photo ${uprofil.nom} ${uprofil.prenom}" style="max-height:205px;" />
  422. </div>
  423. </div>
  424. % endif
  425. </div>
  426. </div>
  427. </div>
  428. </%def> \
  429. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  430. ## Wrapper pour les échanges utilisateurs
  431. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  432. <%def name="show_exchange(Exchange, Asker, Provider)"> \
  433. <div class="media">
  434. % if Asker:
  435. <a class="pull-left" href="/user/${Asker.slug}">
  436. % if Asker.PhotosThumb:
  437. <img class="media-object"
  438. src="${Asker.PhotosThumb.pop()}"
  439. alt="${Asker.prenom} ${Asker.nom}"/>
  440. % else:
  441. <img class="media-object"
  442. src="/img/no-image-thumb.jpg"
  443. alt="${Asker.prenom} ${Asker.nom}"/>
  444. % endif
  445. </a>
  446. % else:
  447. <a class="pull-left" href="#">
  448. <img class="media-object" src="/img/personne.jpg" alt="Personne"/>
  449. </a>
  450. % endif
  451. % if Provider:
  452. <a class="pull-right" href="/user/${Provider.slug}">
  453. % if Provider.PhotosThumb:
  454. <img class="media-object"
  455. src="${Provider.PhotosThumb.pop()}"
  456. alt="${Provider.prenom} ${Provider.nom}"/>
  457. % else:
  458. <img class="media-object"
  459. src="/img/no-image-thumb.jpg"
  460. alt="${Provider.prenom} ${Provider.nom}"/>
  461. % endif
  462. </a>
  463. % else:
  464. <a class="pull-right" href="#">
  465. <img class="media-object" src="/img/personne.jpg" alt="Personne"/>
  466. </a>
  467. %endif
  468. <div class="media-body">
  469. <table style="width:100%">
  470. <tr>
  471. <td style="text-align:left;vertical-align:middle;width:40%">
  472. % if Asker:
  473. Demande de<br>
  474. <a href="/user/${Asker.slug}">${Asker.prenom} ${Asker.nom}</a>
  475. % else:
  476. <i>Pas de réponse</i>
  477. % endif
  478. </td>
  479. <td>
  480. % if Exchange.exch_done:
  481. <img class="media-object" src="/img/echange.png" alt="Echange"/>
  482. % elif Exchange.exch_state=='Ask':
  483. <img class="media-object" src="/img/asker.png" alt="Cherche"/>
  484. % elif Exchange.exch_state=='Proposal':
  485. <img class="media-object" src="/img/provider.png" alt="Propose"/>
  486. % endif
  487. </td>
  488. <td style="text-align:right;vertical-align:middle;width:40%">
  489. %if Provider:
  490. Proposition de<br>
  491. <a href="/user/${Provider.slug}">${Provider.prenom} ${Provider.nom}</a>
  492. % else:
  493. <i>Pas de réponse</i>
  494. % endif
  495. </td>
  496. </tr>
  497. </table>
  498. </div>
  499. </div>
  500. </%def> \
  501. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  502. ## Wrapper pour les addresses pour les utilisateurs
  503. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  504. <%def name="show_address(Place)"> \
  505. <address>
  506. <strong>${Place.display_name}</strong> ( ${Place.place_type} )<br>
  507. ${Place.name}<br>
  508. % if Place.specific:
  509. ${Place.specific}<br>
  510. % endif
  511. ${Place.adresse}<br>
  512. ${Place.codePostal} ${Place.ville}<br>
  513. </address>
  514. </%def> \
  515. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  516. ## Wrapper pour la description des places
  517. ## -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  518. <%def name="show_desc(Place)"> \
  519. % if Place.description:
  520. ${Place.description | n}
  521. % endif
  522. </%def> \