Le repo des sources pour le site web des JM2L
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 
 

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