summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chimere/forms.py3
-rw-r--r--chimere/models.py3
-rw-r--r--chimere/static/chimere/js/jquery.chimere.js8
-rw-r--r--chimere/templates/chimere/blocks/live_coordinates.html1
-rw-r--r--chimere/tests.py16
-rw-r--r--chimere/tests/villiers-le-bacle-detail.xslt19
-rw-r--r--chimere/tests/villiers-le-bacle.xslt17
-rw-r--r--chimere/utils.py32
-rw-r--r--chimere/widgets.py6
9 files changed, 90 insertions, 15 deletions
diff --git a/chimere/forms.py b/chimere/forms.py
index 655bbd3..1ba90a0 100644
--- a/chimere/forms.py
+++ b/chimere/forms.py
@@ -165,7 +165,8 @@ class ImporterAdminForm(forms.ModelForm):
not self.cleaned_data.get('zipped'):
raise forms.ValidationError(_(u"Shapefiles must be provided in a "\
u"zipped archive."))
- if self.cleaned_data.get('source') and \
+ if self.cleaned_data.get('importer_type') != 'XSLT' and \
+ self.cleaned_data.get('source') and \
self.cleaned_data.get('source_file'):
raise forms.ValidationError(_(u"You have to set \"source\" or "
u"\"source file\" but not both."))
diff --git a/chimere/models.py b/chimere/models.py
index 727c3c7..3177864 100644
--- a/chimere/models.py
+++ b/chimere/models.py
@@ -354,7 +354,8 @@ class Importer(models.Model):
u"a marker to a way"), default=False)
default_localisation = PointField(_(u"Default localisation"),
srid=settings.CHIMERE_EPSG_DISPLAY_PROJECTION,
- blank=True, null=True, widget=HiddenPointChooserWidget)
+ blank=True, null=True,
+ widget=HiddenPointChooserWidget)
class Meta:
verbose_name = _(u"Importer")
diff --git a/chimere/static/chimere/js/jquery.chimere.js b/chimere/static/chimere/js/jquery.chimere.js
index 274af85..59e00c8 100644
--- a/chimere/static/chimere/js/jquery.chimere.js
+++ b/chimere/static/chimere/js/jquery.chimere.js
@@ -115,7 +115,8 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
icon_start: null,
icon_step: null,
icon_end: null,
- mobile:false
+ mobile:false,
+ input_id:'id_point'
};
var settings = {};
/*
@@ -1452,7 +1453,8 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
lonlat = settings.current_edit_feature.lonlat.clone().transform(
settings.map.getProjectionObject(),
EPSG_DISPLAY_PROJECTION);
- $('#id_point').val('POINT(' + lonlat.lon + ' ' + lonlat.lat + ')');
+ $('#'+settings.input_id).val(
+ 'POINT(' + lonlat.lon + ' ' + lonlat.lat + ')');
if($('#live_latitude').length){
$('#live_latitude').val(lonlat.lat);
$('#live_longitude').val(lonlat.lon);
@@ -1674,7 +1676,7 @@ OpenLayers.Layer.MapQuestOSM = OpenLayers.Class(OpenLayers.Layer.XYZ, {
jQuery('#id_route').val(current_geo);
var vertices = current_geo.getVertices();
if (vertices){
- jQuery('#id_point').val(vertices);
+ jQuery("#"+settings.input_id).val(vertices);
}
},
updateNominatimName:function(lonlat, response_id){
diff --git a/chimere/templates/chimere/blocks/live_coordinates.html b/chimere/templates/chimere/blocks/live_coordinates.html
index efb9d22..6d0dfb4 100644
--- a/chimere/templates/chimere/blocks/live_coordinates.html
+++ b/chimere/templates/chimere/blocks/live_coordinates.html
@@ -7,6 +7,7 @@
var CENTER_LONLAT = centerLonLat = new OpenLayers.LonLat%s.transform(epsg_display_projection, epsg_projection);
var DEFAULT_ZOOM = %s;
var chimere_init_options = {};
+ chimere_init_options["input_id"] = 'id_{{name}}';
chimere_init_options["default_icon"] = new OpenLayers.Icon('%schimere/img/marker-green.png', new OpenLayers.Size(21, 25), new OpenLayers.Pixel(-(21/2), -25));
chimere_init_options["map_layers"] = [%s];
chimere_init_options['dynamic_categories'] = false;
diff --git a/chimere/tests.py b/chimere/tests.py
index 5c76d2b..a051d52 100644
--- a/chimere/tests.py
+++ b/chimere/tests.py
@@ -12,6 +12,7 @@ from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.gis.geos import GEOSGeometry
from django.contrib.messages.storage.fallback import FallbackStorage
+from django.core.files import File
from django.core.urlresolvers import reverse
from django.template import Context
from django.test import TestCase
@@ -136,7 +137,8 @@ class ImporterTest:
nb, nb_updated, res = importer.manager.get()
if awaited_nb == None:
continue
- self.assertEqual(nb, awaited_nb)
+ self.assertEqual(nb, awaited_nb, msg=u"%s: get test failed" %
+ unicode(self.__class__))
self.assertEqual(nb_updated, 0)
for cat in importer.categories.all():
if cat not in nb_by_cat:
@@ -176,7 +178,8 @@ class ImporterTest:
nb, nb_updated, res = importer.manager.get()
if awaited_nb == None:
continue
- self.assertEqual(nb, 1)
+ self.assertEqual(nb, 1, msg=u"%s: overwrite test failed" %
+ unicode(self.__class__))
class KMLImporterTest(TestCase, ImporterTest):
def setUp(self):
@@ -299,9 +302,14 @@ class GeoRSSImporterTest(TestCase, ImporterTest):
class HtmlXsltImporterTest(TestCase, ImporterTest):
def setUp(self):
subcategories = subcategory_setup()
+ xslt1 = File(open(test_dir_path + 'tests/villiers-le-bacle.xslt'))
+ xslt2 = File(open(test_dir_path + 'tests/villiers-le-bacle-detail.xslt'))
importer1 = Importer.objects.create(importer_type='XSLT',
- source='http://www.ville-villierslebacle.fr/')
- self.marker_importers = [(importer1, 5),]
+ source='http://www.chymeres.net/test/ville-villierslebacle.fr/',
+ source_file=xslt1, source_file_alt=xslt2,
+ default_localisation='SRID=4326;POINT(-4.5 48.4)',)
+ importer1.categories.add(subcategories[0])
+ self.marker_importers = [(importer1, 7),]
class FeedsTest(TestCase):
def setUp(self):
diff --git a/chimere/tests/villiers-le-bacle-detail.xslt b/chimere/tests/villiers-le-bacle-detail.xslt
new file mode 100644
index 0000000..9dc757d
--- /dev/null
+++ b/chimere/tests/villiers-le-bacle-detail.xslt
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="xml" indent="yes"/>
+ <xsl:template match="/">
+ <items>
+ <xsl:for-each select="/html/body/div[@id='container']/table[@id='mainpage']/tr/td[@class='centre']/div">
+ <item>
+ <description>
+ <xsl:copy-of select="div/p[@class='soustitre']"/>
+ <xsl:if test="div[@id='documents_joints']/ul">
+ <xsl:copy-of select="div[@id='documents_joints']/ul"/>
+ </xsl:if>
+ </description>
+ </item>
+ </xsl:for-each>
+ </items>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/chimere/tests/villiers-le-bacle.xslt b/chimere/tests/villiers-le-bacle.xslt
new file mode 100644
index 0000000..fd062b1
--- /dev/null
+++ b/chimere/tests/villiers-le-bacle.xslt
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:output method="xml" indent="yes"/>
+ <xsl:template match="/">
+ <items>
+ <xsl:for-each select="/html/body/div[@id='agenda']/ul/li">
+ <item>
+ <date><xsl:value-of select="div[@class='ag-date']"/></date>
+ <name><xsl:value-of select="div[@class='titre']/a"/></name>
+ <link><xsl:value-of select="div[@class='titre']/a/@href"/></link>
+ <key><xsl:value-of select="div[@class='titre']/a/@href"/></key>
+ </item>
+ </xsl:for-each>
+ </items>
+ </xsl:template>
+</xsl:stylesheet>
+
diff --git a/chimere/utils.py b/chimere/utils.py
index 894c13c..0344421 100644
--- a/chimere/utils.py
+++ b/chimere/utils.py
@@ -856,6 +856,7 @@ class HtmlXsltManager(ImportManager):
- updated items;
- error detail on error.
"""
+ from models import Marker
try:
main_page = urllib2.urlopen(self.importer_instance.source)
assert main_page.getcode() == 200
@@ -869,8 +870,9 @@ class HtmlXsltManager(ImportManager):
dom = etree.HTML(doc, etree.HTMLParser())
try:
xslt = etree.parse(self.importer_instance.source_file)
+ self.importer_instance.source_file.seek(0)
transform = etree.XSLT(xslt)
- except (etree.XSLTParseError, etree.XMLSyntaxError):
+ except (etree.XSLTParseError, etree.XMLSyntaxError, TypeError):
return (0, 0, _(u"The source file is not a valid XSLT file."))
newdom = transform(dom)
items = []
@@ -879,8 +881,9 @@ class HtmlXsltManager(ImportManager):
if self.importer_instance.source_file_alt:
try:
alt_xslt = etree.parse(self.importer_instance.source_file_alt)
+ self.importer_instance.source_file_alt.seek(0)
transform_child = etree.XSLT(alt_xslt)
- except (etree.XSLTParseError, etree.XMLSyntaxError):
+ except (etree.XSLTParseError, etree.XMLSyntaxError, TypeError):
return (0, 0,
_(u"The alt source file is not a valid XSLT file."))
base_url = u"/".join(self.importer_instance.source.split(u'/')[:-1])
@@ -915,4 +918,27 @@ class HtmlXsltManager(ImportManager):
for r, replaced in RE_CLEANS:
val = re.sub(r, replaced % {'base_url':base_url}, val)
item[k] = val
- return (42, 43, '')
+ updated_item, new_item = 0, 0
+ for item in items:
+ if not self.importer_instance.default_localisation and \
+ not "point" in item:
+ continue
+ cls = None
+ dct = {'origin':"<a href='%s'>%s</a>" % (item['link'],
+ self.importer_instance.origin),
+ 'license':self.importer_instance.license,
+ 'name':item['name']}
+ cls = Marker
+ if 'point' in item:
+ x, y = item['point'].split(",")
+ dct['point'] = 'SRID=4326;POINT(%s %s)' % (x, y)
+ else:
+ dct['point'] = self.importer_instance.default_localisation
+ dct['description'] = item['description']
+ key = item['key']
+ it, updated, created = self.create_or_update_item(cls, dct, key)
+ if updated:
+ updated_item += 1
+ if created:
+ new_item += 1
+ return (new_item, updated_item, '')
diff --git a/chimere/widgets.py b/chimere/widgets.py
index 69ba8f5..e7d104a 100644
--- a/chimere/widgets.py
+++ b/chimere/widgets.py
@@ -255,12 +255,11 @@ class PointChooserWidget(forms.TextInput):
js = settings.OSM_JS_URLS + list(settings.JQUERY_JS_URLS) + \
["%schimere/js/jquery.chimere.js" % settings.STATIC_URL]
-
def render(self, name, value, attrs=None, area_name='', initialized=True):
'''
Render a map and latitude, longitude information field
'''
- val = '0'
+ val = ''
value_x, value_y = 0, 0
if value:
val = str(value)
@@ -313,7 +312,8 @@ class PointField(models.PointField):
Set the widget for the form field
'''
def __init__(self, *args, **kwargs):
- self.widget = kwargs.pop('widget') if 'widget' in kwargs else PointChooserWidget
+ self.widget = kwargs.pop('widget') if 'widget' in kwargs \
+ else PointChooserWidget
return super(PointField, self).__init__(*args, **kwargs)
def formfield(self, **keys):