1 ## -*- coding: utf-8 -*-
4 ## Etalage -- Open Data POIs portal
5 ## By: Emmanuel Raviart <eraviart@easter-eggs.com>
7 ## Copyright (C) 2011, 2012 Easter-eggs
8 ## http://gitorious.org/infos-pratiques/etalage
10 ## This file is part of Etalage.
12 ## Etalage is free software; you can redistribute it and/or modify
13 ## it under the terms of the GNU Affero General Public License as
14 ## published by the Free Software Foundation, either version 3 of the
15 ## License, or (at your option) any later version.
17 ## Etalage is distributed in the hope that it will be useful,
18 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 ## GNU Affero General Public License for more details.
22 ## You should have received a copy of the GNU Affero General Public License
23 ## along with this program. If not, see <http://www.gnu.org/licenses/>.
30 from biryani import strings
32 from etalage import conf, model, ramdb, urls
36 <%inherit file="/site.mako"/>
39 <%def name="container_content()" filter="trim">
41 % for field in (poi.fields or []):
43 if field.id in ('name', 'organism-type'):
46 <%self:field field="${field}"/>
52 for service in ramdb.pois_by_id.itervalues()
53 if service.parent_id == poi._id
55 key = lambda service: service.name,
61 % for service in services:
63 <a class="field-value internal" href="${urls.get_url(ctx, 'organismes', service.slug, service._id
64 )}">${service.name}</a>
70 field = model.Field(id = 'text-inline', label = u"Dernière mise à jour", value = u' par '.join(
73 poi.last_update_datetime.strftime('%Y-%m-%d %H:%M') if poi.last_update_datetime is not None else None,
74 poi.last_update_organization,
79 <%self:field field="${field}"/>
83 <%def name="css()" filter="trim">
85 <link rel="stylesheet" href="${conf['leaflet.css']}">
87 <link rel="stylesheet" href="${conf['leaflet.ie.css']}">
92 <%def name="field(field)" filter="trim">
94 if field.value is None:
98 <strong class="field-label">${field.label} :</strong>
99 <%self:field_value field="${field}"/>
104 <%def name="field_value(field)" filter="trim">
106 if field.value is None:
109 % if field.id == 'adr':
110 <address class="field-value offset1">
111 % for subfield in field.value:
113 if subfield.value is None:
116 % if subfield.id == 'street-address':
117 % for line in subfield.value.split('\n'):
120 % elif subfield.id == 'commune':
124 % elif subfield.id == 'postal-distribution':
129 % elif field.id == 'autocompleters':
131 slug_and_name_couples = []
132 for name in field.value:
133 slug = strings.slugify(name)
134 category = ramdb.categories_by_slug.get(slug)
135 if category is not None:
137 slug_and_name_couples.append((slug, name))
138 slug_and_name_couples.sort()
141 for slug, name in slug_and_name_couples
144 <span class="field-value">${u', '.join(names)}</span>
145 % elif field.id == 'boolean':
146 <span class="field-value">${u'Oui' if field.value and field.value != '0' else u'Non'}</span>
147 % elif field.id == 'date-range':
149 begin_field = field.get_first_field('date-range-begin')
150 begin = begin_field.value if field is not None else None
151 end_field = field.get_first_field('date-range-end')
152 end = end_field.value if field is not None else None
155 <span class="field-value">Jusqu'au ${end.strftime('%d/%m/%Y')}</span>
157 <span class="field-value">À partir du ${begin.strftime('%d/%m/%Y')}</span>
159 <span class="field-value">Le ${begin.strftime('%d/%m/%Y')}</span>
161 <span class="field-value">Du ${begin.strftime('%d/%m/%Y')} au ${end.strftime('%d/%m/%Y')}</span>
163 % elif field.id == 'email':
164 <span class="field-value"><a href="mailto:${field.value}">${field.value}</a></span>
165 % elif field.id == 'feed':
166 <div class="field-value offset1">
169 d = feedparser.parse(field.value)
171 % if d is None or 'status' not in d \
172 or not d.version and d.status != 304 and d.status != 401 \
174 <em class="error">Erreur dans le flux d'actualité <a href="${field.value}" rel="external">${field.value}</a></em>
176 <strong>${d.feed.title}</strong>
177 <a href="${field.value}" rel="external"><img alt="" src="http://cdn.comarquage.fr/images/misc/feed.png"></a>
180 % for entry in d.entries[:10]:
181 <li class="feed-entry">${entry.title | n}
182 % for content in entry.content:
183 <div>${content.value | n}</div>
187 % if len(d.entries) > 10:
192 % elif field.id == 'geo':
193 <div class="field-value offset1">
194 % if field.value[2] <= 6:
195 <div class="alert-message error">
196 <p>Cet organisme est positionné <strong>très approximativement</strong>.</p>
198 % elif field.value[2] <= 6:
199 <div class="alert-message warning">
200 <p>Cet organisme est positionné <strong>approximativement dans la rue</strong>.</p>
203 <div class="single-marker-map" id="map-poi" style="height: 500px;"></div>
205 etalage.map.singleMarkerMap("map-poi", ${field.value[0]}, ${field.value[1]});
207 <div class="bigger-map-link">
208 Voir sur une carte plus grande avec
209 <a href="${u'http://www.openstreetmap.org/?mlat={0}&mlon={1}&zoom=15&layers=M'.format(
210 field.value[0], field.value[1])}" rel="external">OpenStreetMap</a>
212 <a href="${u'http://maps.google.com/maps?q={0},{1}'.format(field.value[0], field.value[1]
213 )}" rel="external">Google Maps</a>
216 % elif field.id == 'image':
217 <div class="field-value offset1"><img alt="" src="${field.value}"></div>
218 % elif field.id == 'link':
220 target = ramdb.pois_by_id.get(field.value)
223 <em class="field-value">Lien manquant</em>
225 <a class="field-value internal" href="${urls.get_url(ctx, 'organismes', target.slug, target._id
226 )}">${target.name}</a>
228 % elif field.id == 'links':
229 % if len(field.value) == 1:
231 single_field = model.Field(id = 'link', value = field.value[0])
233 <%self:field_value field="${single_field}"/>
235 <ul class="field-value">
236 % for target_id in field.value:
238 target = ramdb.pois_by_id.get(target_id)
242 <li><a class="internal" href="${urls.get_url(ctx, 'organismes', target.slug, target._id
243 )}">${target.name}</a></li>
247 % elif field.id == 'organism-type':
249 category_slug = ramdb.categories_slug_by_pivot_code.get(field.value)
250 category = ramdb.categories_by_slug.get(category_slug) if category_slug is not None else None
251 category_name = category.name if category is not None else field.value
253 <span class="field-value">${category_name}</span>
254 % elif field.id == 'source':
255 <div class="field-value offset1">
256 % for subfield in field.value:
257 <%self:field field="${subfield}"/>
260 % elif field.id == 'tags':
265 ramdb.categories_by_slug.get(tag_slug)
266 for tag_slug in sorted(field.value)
271 <span class="field-value">${u', '.join(tags_name)}</span>
272 % elif field.id == 'territories':
274 territories_title_markup = [
275 territory.main_postal_distribution_str
276 if territory.__class__.__name__ in model.communes_kinds
277 else markupsafe.Markup(u'{0} <em>({1})</em>').format(
278 territory.main_postal_distribution_str, territory.type_short_name_fr)
280 ramdb.territories_by_id[territory_id]
281 for territory_id in field.value
283 if territory is not None
286 % if territories_title_markup:
287 % if len(territories_title_markup) == 1:
288 <span class="field-value">${territories_title_markup[0] | n}</span>
290 <ul class="field-value">
291 % for territory_title_markup in territories_title_markup:
292 <li>${territory_title_markup | n}</li>
297 % elif field.id == 'text-block':
298 <div class="field-value offset1">${markupsafe.Markup('<br>').join(field.value.split('\n'))}</div>
299 % elif field.id == 'text-rich':
300 <div class="field-value offset1">${field.value | n}</div>
301 % elif field.id in ('source-url', 'url'):
302 <a class="field-value" href="${field.value}" rel="external">${field.value}</a>
305 if field.id not in ('fax', 'name', 'org', 'source-organization', 'tel', 'text-inline'):
306 print 'Unknown ID for field {0}'.format(field)
308 <span class="field-value">${field.value}</span>
313 <%def name="footer_data_p_content()" filter="trim">
314 ${parent.footer_data_p_content()}\
315 % if conf.get('petitpois_url'):
316 — <a class="btn" href="${urlparse.urljoin(conf['petitpois_url'], '/poi/view/{0}'.format(poi._id)
317 )}" rel="external">Modifier la fiche</a>\
319 — <a class="internal" href="${urls.get_url(
320 ctx, 'minisite', 'organismes', poi.slug, poi._id)}" rel="nofollow">Minisite</a>
324 <%def name="scripts()" filter="trim">
326 <script src="${conf['leaflet.js']}"></script>
328 <script src="${conf['pie.js']}"></script>
330 <script src="/js/map.js"></script>
332 var etalage = etalage || {};
333 etalage.map.markersUrl = ${conf['markers_url'].rstrip('/') | n, js};
334 etalage.map.tileUrlTemplate = ${conf['tile_url_template'] | n, js};
339 <%def name="title_content()" filter="trim">
340 ${poi.name} - ${parent.title_content()}