diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-10-30 23:01:10 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2013-10-30 23:01:10 +0100 |
commit | bd6dea1a3128ab924eb82a63498cd512d0b27bfb (patch) | |
tree | 7681ec79d0858dd561455695ba1bb8f0f7acd228 | |
parent | 5b41f143a3956fbd9d3a2288e607e6aa8d8c3451 (diff) | |
download | Chimère-bd6dea1a3128ab924eb82a63498cd512d0b27bfb.tar.bz2 Chimère-bd6dea1a3128ab924eb82a63498cd512d0b27bfb.zip |
HTML-XSLT import: manage write on the database - import tests - fix pointwidget when using a name not equal to point
-rw-r--r-- | chimere/forms.py | 3 | ||||
-rw-r--r-- | chimere/models.py | 3 | ||||
-rw-r--r-- | chimere/static/chimere/js/jquery.chimere.js | 8 | ||||
-rw-r--r-- | chimere/templates/chimere/blocks/live_coordinates.html | 1 | ||||
-rw-r--r-- | chimere/tests.py | 16 | ||||
-rw-r--r-- | chimere/tests/villiers-le-bacle-detail.xslt | 19 | ||||
-rw-r--r-- | chimere/tests/villiers-le-bacle.xslt | 17 | ||||
-rw-r--r-- | chimere/utils.py | 32 | ||||
-rw-r--r-- | chimere/widgets.py | 6 |
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): |