From 5a08be868af0e73cb9b443a0209b24e63c96366b Mon Sep 17 00:00:00 2001 From: afabiani Date: Fri, 26 Oct 2018 11:07:51 +0200 Subject: [PATCH 1/3] [Fixes #4025] Regression with uploading a shapefile with no ascii characters --- geonode/geoserver/views.py | 2 +- geonode/layers/models.py | 2 +- geonode/upload/models.py | 8 ++++---- geonode/upload/utils.py | 25 ++++++++++++++----------- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/geonode/geoserver/views.py b/geonode/geoserver/views.py index ecff719f464..49e2eb90696 100644 --- a/geonode/geoserver/views.py +++ b/geonode/geoserver/views.py @@ -851,7 +851,7 @@ def get_capabilities(request, layerid=None, user=None, 'catalogue_url': settings.CATALOGUE['default']['URL'], } gc_str = tpl.render(ctx) - gc_str = gc_str.encode("utf-8") + gc_str = gc_str.encode("utf-8", "replace") layerelem = etree.XML(gc_str) rootdoc = etree.ElementTree(layerelem) except Exception as e: diff --git a/geonode/layers/models.py b/geonode/layers/models.py index 5df5c480434..a89df0e6616 100644 --- a/geonode/layers/models.py +++ b/geonode/layers/models.py @@ -495,7 +495,7 @@ class Attribute(models.Model): def __unicode__(self): return "%s" % self.attribute_label.encode( - "utf-8") if self.attribute_label else self.attribute.encode("utf-8") + "utf-8", "replace") if self.attribute_label else self.attribute.encode("utf-8", "replace") def unique_values_as_list(self): return self.unique_values.split(',') diff --git a/geonode/upload/models.py b/geonode/upload/models.py index d9f096103ee..5fbd3738040 100644 --- a/geonode/upload/models.py +++ b/geonode/upload/models.py @@ -87,7 +87,7 @@ class Meta: def get_session(self): if self.session: - return pickle.loads(str(self.session)) + return pickle.loads(self.session.encode("utf-8", "replace")) def update_from_session(self, upload_session): self.state = upload_session.import_session.state @@ -97,10 +97,10 @@ def update_from_session(self, upload_session): self.session = None else: # Make sure we don't pickle UTF-8 chars - upload_session.user.first_name = u'{}'.format(upload_session.user.first_name).encode('ascii', 'ignore') - upload_session.user.last_name = u'{}'.format(upload_session.user.last_name).encode('ascii', 'ignore') + upload_session.user.first_name = u'{}'.format(upload_session.user.first_name).decode("utf-8", "replace") + upload_session.user.last_name = u'{}'.format(upload_session.user.last_name).decode("utf-8", "replace") unicode_session = pickle.dumps(upload_session) - self.session = unicode_session + self.session = unicode_session.decode("utf-8", "replace") if self.upload_dir is None: self.upload_dir = path.dirname(upload_session.base_file) self.name = upload_session.layer_title or upload_session.name diff --git a/geonode/upload/utils.py b/geonode/upload/utils.py index 7a7585d1795..ac686f3baed 100644 --- a/geonode/upload/utils.py +++ b/geonode/upload/utils.py @@ -523,17 +523,20 @@ def _get_layer_values(layer, upload_session, expand=0): lyr = inDataSource.GetLayer(str(layer.name)) limit = 100 for feat in islice(lyr, 0, limit): - feat_values = json_loads_byteified(feat.ExportToJson()).get('properties') - for k in feat_values.keys(): - type_code = feat.GetFieldDefnRef(k).GetType() - binding = feat.GetFieldDefnRef(k).GetFieldTypeName(type_code) - feat_value = feat_values[k] if str(feat_values[k]) != 'None' else 0 - if expand > 0: - ff = {'value': feat_value, 'binding': binding} - feat_values[k] = ff - else: - feat_values[k] = feat_value - layer_values.append(feat_values) + try: + feat_values = json_loads_byteified(feat.ExportToJson()).get('properties') + for k in feat_values.keys(): + type_code = feat.GetFieldDefnRef(k).GetType() + binding = feat.GetFieldDefnRef(k).GetFieldTypeName(type_code) + feat_value = feat_values[k] if str(feat_values[k]) != 'None' else 0 + if expand > 0: + ff = {'value': feat_value, 'binding': binding} + feat_values[k] = ff + else: + feat_values[k] = feat_value + layer_values.append(feat_values) + except BaseException: + pass return layer_values From b31cbf713653b22c93d375bd39b091c3b09c1c03 Mon Sep 17 00:00:00 2001 From: afabiani Date: Mon, 29 Oct 2018 10:50:49 +0100 Subject: [PATCH 2/3] [Fixes #4025] Regression with uploading a shapefile with no ascii characters --- geonode/base/models.py | 8 +-- geonode/geoserver/signals.py | 47 ++++++++----- geonode/geoserver/upload.py | 11 ++- geonode/tests/data/ming_female_1.zip | Bin 0 -> 11220 bytes .../data/ming_female_1/ming_female_1.cst | 1 + .../data/ming_female_1/ming_female_1.dbf | Bin 0 -> 937931 bytes .../data/ming_female_1/ming_female_1.prj | 1 + .../data/ming_female_1/ming_female_1.shp | Bin 0 -> 10096 bytes .../data/ming_female_1/ming_female_1.shx | Bin 0 -> 2956 bytes .../tests/data/ming_female_1/wfsrequest.txt | 1 + geonode/tests/data/zhejiang_yangcan_yanyu.zip | Bin 0 -> 5182 bytes .../zhejiang_yangcan_yanyu/wfsrequest.txt | 1 + .../zhejiang_yangcan_yanyu.cst | 1 + .../zhejiang_yangcan_yanyu.dbf | Bin 0 -> 234983 bytes .../zhejiang_yangcan_yanyu.prj | 1 + .../zhejiang_yangcan_yanyu.shp | Bin 0 -> 6064 bytes .../zhejiang_yangcan_yanyu.shx | Bin 0 -> 1804 bytes geonode/tests/integration.py | 65 ++++++++++++++---- 18 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 geonode/tests/data/ming_female_1.zip create mode 100644 geonode/tests/data/ming_female_1/ming_female_1.cst create mode 100644 geonode/tests/data/ming_female_1/ming_female_1.dbf create mode 100644 geonode/tests/data/ming_female_1/ming_female_1.prj create mode 100644 geonode/tests/data/ming_female_1/ming_female_1.shp create mode 100644 geonode/tests/data/ming_female_1/ming_female_1.shx create mode 100644 geonode/tests/data/ming_female_1/wfsrequest.txt create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu.zip create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/wfsrequest.txt create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.cst create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.dbf create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.prj create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shp create mode 100644 geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shx diff --git a/geonode/base/models.py b/geonode/base/models.py index f93f5bab284..bf3270aea46 100644 --- a/geonode/base/models.py +++ b/geonode/base/models.py @@ -799,7 +799,7 @@ def csw_crs(self): @property def group_name(self): if self.group: - return str(self.group) + return str(self.group).encode("utf-8", "replace") return None @property @@ -902,13 +902,13 @@ def metadata_completeness(self): return '{}%'.format(len(filled_fields) * 100 / len(required_fields)) def keyword_list(self): - return [kw.name for kw in self.keywords.all()] + return [kw.name.encode("utf-8", "replace") for kw in self.keywords.all()] def keyword_slug_list(self): - return [kw.slug for kw in self.keywords.all()] + return [kw.slug.encode("utf-8", "replace") for kw in self.keywords.all()] def region_name_list(self): - return [region.name for region in self.regions.all()] + return [region.name.encode("utf-8", "replace") for region in self.regions.all()] def spatial_representation_type_string(self): if hasattr(self.spatial_representation_type, 'identifier'): diff --git a/geonode/geoserver/signals.py b/geonode/geoserver/signals.py index e4297681b25..9db98eed857 100644 --- a/geonode/geoserver/signals.py +++ b/geonode/geoserver/signals.py @@ -243,14 +243,17 @@ def geoserver_post_save_local(instance, *args, **kwargs): instance.workspace = gs_resource.store.workspace.name instance.store = gs_resource.store.name - bbox = gs_resource.native_bbox - - # Set bounding box values - instance.bbox_x0 = bbox[0] - instance.bbox_x1 = bbox[1] - instance.bbox_y0 = bbox[2] - instance.bbox_y1 = bbox[3] - instance.srid = bbox[4] + try: + bbox = gs_resource.native_bbox + + # Set bounding box values + instance.bbox_x0 = bbox[0] + instance.bbox_x1 = bbox[1] + instance.bbox_y0 = bbox[2] + instance.bbox_y1 = bbox[3] + instance.srid = bbox[4] + except BaseException: + pass if instance.srid: instance.srid_url = "http://www.spatialreference.org/ref/" + \ @@ -271,14 +274,17 @@ def geoserver_post_save_local(instance, *args, **kwargs): gs_catalog.save(gs_resource) if not settings.FREETEXT_KEYWORDS_READONLY: - if len(instance.keyword_list()) == 0 and gs_resource.keywords: - for keyword in gs_resource.keywords: - if keyword not in instance.keyword_list(): - instance.keywords.add(keyword) + try: + if len(instance.keyword_list()) == 0 and gs_resource.keywords: + for keyword in gs_resource.keywords: + if keyword not in instance.keyword_list(): + instance.keywords.add(keyword) + except BaseException: + pass if any(instance.keyword_list()): keywords = instance.keyword_list() - gs_resource.keywords = list(set(keywords)) + gs_resource.keywords = [kw.decode("utf-8", "replace") for kw in list(set(keywords))] # gs_resource should only be called if # ogc_server_settings.BACKEND_WRITE_ENABLED == True @@ -321,7 +327,10 @@ def geoserver_post_save_local(instance, *args, **kwargs): # store the resource to avoid another geoserver call in the post_save instance.gs_resource = gs_resource - bbox = gs_resource.native_bbox + try: + bbox = gs_resource.native_bbox + except BaseException: + bbox = instance.bbox dx = float(bbox[1]) - float(bbox[0]) dy = float(bbox[3]) - float(bbox[2]) @@ -337,7 +346,10 @@ def geoserver_post_save_local(instance, *args, **kwargs): instance.bbox_x1, instance.bbox_y1]) # Create Raw Data download link - path = gs_resource.dom.findall('nativeName') + try: + path = gs_resource.dom.findall('nativeName') + except BaseException: + path = instance.alternate download_url = urljoin(settings.SITEURL, reverse('download', args=[instance.id])) Link.objects.get_or_create(resource=instance.resourcebase_ptr, @@ -397,7 +409,10 @@ def geoserver_post_save_local(instance, *args, **kwargs): url=ogc_server_settings.public_url, repo_name=geogig_repo_name) - path = gs_resource.dom.findall('nativeName') + try: + path = gs_resource.dom.findall('nativeName') + except BaseException: + path = instance.alternate if path: path = 'path={path}'.format(path=path[0].text) diff --git a/geonode/geoserver/upload.py b/geonode/geoserver/upload.py index ed74216d1dc..5e728543f76 100644 --- a/geonode/geoserver/upload.py +++ b/geonode/geoserver/upload.py @@ -180,8 +180,13 @@ def geoserver_upload( # Step 6. Make sure our data always has a valid projection # FIXME: Put this in gsconfig.py logger.info('>>> Step 6. Making sure [%s] has a valid projection' % name) - if gs_resource.native_bbox is None: - box = gs_resource.native_bbox[:4] + _native_bbox = None + try: + _native_bbox = gs_resource.native_bbox + except BaseException: + pass + if _native_bbox and len(_native_bbox) >= 5 and _native_bbox[4:5][0] == 'EPSG:4326': + box = _native_bbox[:4] minx, maxx, miny, maxy = [float(a) for a in box] if -180 <= minx <= 180 and -180 <= maxx <= 180 and \ - 90 <= miny <= 90 and -90 <= maxy <= 90: @@ -190,7 +195,7 @@ def geoserver_upload( # If GeoServer couldn't figure out the projection, we just # assume it's lat/lon to avoid a bad GeoServer configuration - gs_resource.latlon_bbox = gs_resource.native_bbox + gs_resource.latlon_bbox = _native_bbox gs_resource.projection = "EPSG:4326" cat.save(gs_resource) else: diff --git a/geonode/tests/data/ming_female_1.zip b/geonode/tests/data/ming_female_1.zip new file mode 100644 index 0000000000000000000000000000000000000000..14f1baa70a2e150b1f726e37e89159ca4cf2fdb0 GIT binary patch literal 11220 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 literal 0 HcmV?d00001 diff --git a/geonode/tests/data/ming_female_1/ming_female_1.cst b/geonode/tests/data/ming_female_1/ming_female_1.cst new file mode 100644 index 00000000000..3ad133c048f --- /dev/null +++ b/geonode/tests/data/ming_female_1/ming_female_1.cst @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/geonode/tests/data/ming_female_1/ming_female_1.dbf b/geonode/tests/data/ming_female_1/ming_female_1.dbf new file mode 100644 index 0000000000000000000000000000000000000000..97fa67ed595e9f685ace737510f01848509580c6 GIT binary patch literal 937931 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 Luc literal 0 HcmV?d00001 diff --git a/geonode/tests/data/ming_female_1/ming_female_1.prj b/geonode/tests/data/ming_female_1/ming_female_1.prj new file mode 100644 index 00000000000..ebb59326939 --- /dev/null +++ b/geonode/tests/data/ming_female_1/ming_female_1.prj @@ -0,0 +1 @@ +GEOGCS["Xian 1980", DATUM["Xian 1980", SPHEROID["IAG 1975", 6378140.0, 298.257, AUTHORITY["EPSG","7049"]], AUTHORITY["EPSG","6610"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4610"]] \ No newline at end of file diff --git a/geonode/tests/data/ming_female_1/ming_female_1.shp b/geonode/tests/data/ming_female_1/ming_female_1.shp new file mode 100644 index 0000000000000000000000000000000000000000..4c35f66899e437b3aafb57b2baa926ba499cd6b5 GIT binary patch literal 10096 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 literal 0 HcmV?d00001 diff --git a/geonode/tests/data/ming_female_1/wfsrequest.txt b/geonode/tests/data/ming_female_1/wfsrequest.txt new file mode 100644 index 00000000000..066e912c7c0 --- /dev/null +++ b/geonode/tests/data/ming_female_1/wfsrequest.txt @@ -0,0 +1 @@ +http://amap.zju.edu.cn:8080/geoserver/wfs?access_token=vKa0jUDKSIJVS8mxn3QbeXlNKbxFlO?format_options=charset%3AUTF-8&typename=geonode%3Aming_female_1&outputFormat=SHAPE-ZIP&version=1.0.0&service=WFS&request=GetFeature&access_token=vKa0jUDKSIJVS8mxn3QbeXlNKbxFlO \ No newline at end of file diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu.zip b/geonode/tests/data/zhejiang_yangcan_yanyu.zip new file mode 100644 index 0000000000000000000000000000000000000000..6251e31985142e8e068feb3aebc9e84538bbe8ff GIT binary patch literal 5182 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 literal 0 HcmV?d00001 diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/wfsrequest.txt b/geonode/tests/data/zhejiang_yangcan_yanyu/wfsrequest.txt new file mode 100644 index 00000000000..393c4117973 --- /dev/null +++ b/geonode/tests/data/zhejiang_yangcan_yanyu/wfsrequest.txt @@ -0,0 +1 @@ +http://128.31.22.46:8080/geoserver/wfs?access_token=TCSt2nAzYCZeeSF9jTDULPff6YUWrI?outputFormat=SHAPE-ZIP&service=WFS&srs=EPSG%3A4610&request=GetFeature&format_options=charset%3AUTF-8&typename=geonode%3Azhejiang_yangcan_yanyu&version=1.0.0&access_token=TCSt2nAzYCZeeSF9jTDULPff6YUWrI \ No newline at end of file diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.cst b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.cst new file mode 100644 index 00000000000..3ad133c048f --- /dev/null +++ b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.cst @@ -0,0 +1 @@ +UTF-8 \ No newline at end of file diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.dbf b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.dbf new file mode 100644 index 0000000000000000000000000000000000000000..9e2303913d334f12b87bf993ed6e7a8e87d90043 GIT binary patch literal 234983 zcmeI5y^dsO6-C>a2+6X5%uy2~mFnL5kB5Y0NFlNa2;l{Y2u8?~2QU(r3G9Fb5!l%B zNVc&oo`N@+YU76hQN{E*d+OH6)~;~Z>ZHG}K3_vE_F3v~_H@1cz3;sCubZ2jmtK1K z?ZdmXw;%tgA9{E^eZN0^c6j~QKdeU{96$Hp`sn`s>#zN%9(nNHm(D-`tDpb!7xx1X zUj5ej=YLwaZ*CsG^775i4_?&+$J5XB;ltSrKL2|E$KO2o$>Hd1LL&G?q&9^7Am{3^Er@FbOteijB37+GJi}NWSxfTN0L>qxk+|-L*pO)^|U_OTc zHt9XM#U^g9#jZ~)_iHepLjarf9$*tY)?(MEwf#l75JLc)^d4XnJJn*>r;YtZxDZ1C zoAe%F6Fb#n*Qc%hMYs?{0Gsq4U=uslV%Mjg{YAJCLjarf9$*tY)nZqtVQzmBF2oSP zCbb8**u+k?*wtyE3u{x%xqwY-53q@!YO$-+Ko{1>7;^)g)E;0HKh$DZr-3f4k1^&3 zHmNbxn_5hpsp%%M34Rm3Bj4?N` zN$mkP@k1?kbsFfx`WRzwV3XPdY~qJn?CLboh4nGU+`uNa2iU|9wb<2ZpbP6`jJbhL zY7el9A8N6y(?}QA#~5=1o75g)6F<~qSErFKtdB9~1~#cZz$SjE#jZ{xU05Gu%nfW( zdw@;+P>WriM!K**#+Vz}r1k)t_@NfNI*oK;eT*?Tuu1I!Ht|C(c6A!*!ul9vZeWwz z18m}lTI}jH(uMUg#@xUrwFlV554G6UX`~D5V~n|hO==IYi63gQtJ6pq*2frg1Dn(y zU=u&oVppe;F079+<_0#YJ-{Y@sKu^M3%amA#+Vz}r1k)t_@NfNIxXnJ`WRzwV3XPd zY~qJn?CP|j3+rQyxq(e;53q?JYO$-+f-bC&G3Ev~sXf3ZeyGK+P7AuQKE{|E*rfIV zoA{v?yE-lC!ul9vZeWwz18m}lTI}kypbP6`jJbhLY7el9A8N6y(}FInk1^&3HmN

Fjhg$6Fw4@8`V~n|hO==IY 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 literal 0 HcmV?d00001 diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.prj b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.prj new file mode 100644 index 00000000000..ebb59326939 --- /dev/null +++ b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.prj @@ -0,0 +1 @@ +GEOGCS["Xian 1980", DATUM["Xian 1980", SPHEROID["IAG 1975", 6378140.0, 298.257, AUTHORITY["EPSG","7049"]], AUTHORITY["EPSG","6610"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4610"]] \ No newline at end of file diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shp b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shp new file mode 100644 index 0000000000000000000000000000000000000000..ef6831b45a75c2e28a3876cc385a4364a4b4edd2 GIT binary patch literal 6064 zcmaLbS4L5pVprU?pjfbD1-oMJ9qhehSM1mu*iC#T zF-D{DUE_nh-!X|K$A2DnHuKw^yPcicnfVMO#K-WMd_R9HWf&!Fb7jXBqW&B9U3G|9BEO%=$N2eMe=a7|Yr{CuP_m~i}bxbO2|rNO+w z%7B#xD+lHc=CrRoyN74+1@i+d4^{!JB3LCbf3V760bnk$DqvN?s)1Dps{vLMtQJ^p zusUFYU_oGY!Rmq42WtQp4Au~=5m*RVW3VP*O~FFJ!oZq=H3w?}77o@DtQA-USZlC0 zU~RR@JP=^1pY}A6ks{ygc3|znI)Fujbp(q7iw27Uiv?5K^7HKU*Hn`GNxO6c>kQUK zTS1yV3;P$gb*R+Y6|5Urcd$6Hc(5K|J;8c`^#nRIu4#bHL_;%>$bcwg4;*EFEm2HfQ_h`emwgXCoIW<7kmK zJ2#AQOG%z9w%9(G{fd+owIyIn!Ipt72U`KQ5-bC371(O9HDGJO)`6`D+W@u^Y!ldK zuq|L)!M1^I2iu`d;tRorebA6TxD#v_*lw^rV42!vjQla(F^<$IWtV4x?FHMXO~+4y zBmf|F?gu*nb`b24Hd&7+T1v)!w*1~Daey VNebj!@LrpTdF%t&N3c)D**{WsZ2JHJ literal 0 HcmV?d00001 diff --git a/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shx b/geonode/tests/data/zhejiang_yangcan_yanyu/zhejiang_yangcan_yanyu.shx new file mode 100644 index 0000000000000000000000000000000000000000..a530bbfcd2754095c7a606287d44acd07903a110 GIT binary patch literal 1804 zcmZ|NZ$zF^7zg0D^=H*4lT0Q_rcEYknM~R%(e;!=L{FQ#*f_QerQ4xGnmUlma&R;Y-R_0Ilxg) z@fBD2p5OQ@G%*i&@SZHn5dle8?e=bB2pt<410DKlDfvGnmUlma&R;Y-R_0Ilxg)@fBAB F{{o?-fnERr literal 0 HcmV?d00001 diff --git a/geonode/tests/integration.py b/geonode/tests/integration.py index a782481f908..0f461499d73 100644 --- a/geonode/tests/integration.py +++ b/geonode/tests/integration.py @@ -512,13 +512,8 @@ def test_layer_upload_metadata(self): # layer have projection file, but has no valid srid self.assertEqual( str(e), - "Invalid Layers. " - "Needs an authoritative SRID in its CRS to be accepted") - # except: - # # Sometimes failes with the message: - # # UploadError: Could not save the layer air_runways, - # # there was an upload error: Error occured unzipping file - # pass + "GeoServer failed to detect the projection for layer [air_runways]. " + "It doesn't look like EPSG:4326, so backing out the layer.") finally: # Clean up and completely delete the layer if uploaded: @@ -610,11 +605,57 @@ def test_layer_zip_upload_metadata(self): uploaded.metadata_xml = thelayer_metadata regions_resolved, regions_unresolved = resolve_regions(regions) self.assertIsNotNone(regions_resolved) - # except: - # # Sometimes failes with the message: - # # UploadError: Could not save the layer air_runways, - # # there was an upload error: Error occured unzipping file - # pass + finally: + # Clean up and completely delete the layer + if uploaded: + uploaded.delete() + + @on_ogc_backend(geoserver.BACKEND_PACKAGE) + @timeout_decorator.timeout(LOCAL_TIMEOUT) + def test_layer_zip_upload_non_utf8(self): + """Test uploading a layer with non UTF-8 attributes names""" + uploaded = None + PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) + thelayer_path = os.path.join( + PROJECT_ROOT, + 'data/zhejiang_yangcan_yanyu') + thelayer_zip = os.path.join( + PROJECT_ROOT, + 'data/', + 'zhejiang_yangcan_yanyu.zip') + try: + if os.path.exists(thelayer_zip): + os.remove(thelayer_zip) + if os.path.exists(thelayer_path) and not os.path.exists(thelayer_zip): + zip_dir(thelayer_path, thelayer_zip) + if os.path.exists(thelayer_zip): + uploaded = file_upload(thelayer_zip, overwrite=True) + self.assertEquals(uploaded.title, 'Zhejiang Yangcan Yanyu') + self.assertEquals(len(uploaded.keyword_list()), 0) + self.assertEquals(uploaded.constraints_other, None) + finally: + # Clean up and completely delete the layer + if uploaded: + uploaded.delete() + + uploaded = None + thelayer_path = os.path.join( + PROJECT_ROOT, + 'data/ming_female_1') + thelayer_zip = os.path.join( + PROJECT_ROOT, + 'data/', + 'ming_female_1.zip') + try: + if os.path.exists(thelayer_zip): + os.remove(thelayer_zip) + if os.path.exists(thelayer_path) and not os.path.exists(thelayer_zip): + zip_dir(thelayer_path, thelayer_zip) + if os.path.exists(thelayer_zip): + uploaded = file_upload(thelayer_zip, overwrite=True) + self.assertEquals(uploaded.title, 'Ming Female 1') + self.assertEquals(len(uploaded.keyword_list()), 0) + self.assertEquals(uploaded.constraints_other, None) finally: # Clean up and completely delete the layer if uploaded: From a5143545886b82d9d981f1a64ab360bf33f90ecc Mon Sep 17 00:00:00 2001 From: afabiani Date: Wed, 31 Oct 2018 10:58:11 +0100 Subject: [PATCH 3/3] - Rename columns of non-UTF-8 shapefiles attributes before ingesting - Fix test cases --- geonode/layers/views.py | 14 +++++- geonode/tests/integration.py | 8 ++-- geonode/upload/files.py | 36 ++++++++++------ geonode/upload/forms.py | 1 + geonode/upload/utils.py | 25 +++++------ geonode/upload/views.py | 10 +++-- geonode/utils.py | 84 ++++++++++++++++++++---------------- 7 files changed, 105 insertions(+), 73 deletions(-) diff --git a/geonode/layers/views.py b/geonode/layers/views.py index d99088a275f..d7b7fd961f8 100644 --- a/geonode/layers/views.py +++ b/geonode/layers/views.py @@ -27,7 +27,7 @@ import uuid import decimal import re - +import cPickle as pickle from django.db.models import Q from celery.exceptions import TimeoutError @@ -239,7 +239,7 @@ def layer_upload(request, template='upload/layer_upload.html'): user=request.user).order_by('-date') if latest_uploads.count() > 0: upload_session = latest_uploads[0] - upload_session.error = str(error) + upload_session.error = pickle.dumps(error).decode("utf-8", "replace") upload_session.traceback = traceback.format_exc(tb) upload_session.context = log_snippet(CONTEXT_LOG_FILE) upload_session.save() @@ -286,6 +286,16 @@ def layer_upload(request, template='upload/layer_upload.html'): layer_name = saved_layer.alternate if hasattr( saved_layer, 'alternate') else name request.add_resource('layer', layer_name) + _keys = ['info', 'errors'] + for _k in _keys: + if _k in out: + if isinstance(out[_k], unicode) or isinstance( + out[_k], str): + out[_k] = out[_k].decode(saved_layer.charset).encode("utf-8") + elif isinstance(out[_k], dict): + for key, value in out[_k].iteritems(): + out[_k][key] = out[_k][key].decode(saved_layer.charset).encode("utf-8") + out[_k][key.decode(saved_layer.charset).encode("utf-8")] = out[_k].pop(key) return HttpResponse( json.dumps(out), content_type='application/json', diff --git a/geonode/tests/integration.py b/geonode/tests/integration.py index 0f461499d73..a4527700dfe 100644 --- a/geonode/tests/integration.py +++ b/geonode/tests/integration.py @@ -629,9 +629,9 @@ def test_layer_zip_upload_non_utf8(self): if os.path.exists(thelayer_path) and not os.path.exists(thelayer_zip): zip_dir(thelayer_path, thelayer_zip) if os.path.exists(thelayer_zip): - uploaded = file_upload(thelayer_zip, overwrite=True) + uploaded = file_upload(thelayer_zip, overwrite=True, charset='windows-1258') self.assertEquals(uploaded.title, 'Zhejiang Yangcan Yanyu') - self.assertEquals(len(uploaded.keyword_list()), 0) + self.assertEquals(len(uploaded.keyword_list()), 2) self.assertEquals(uploaded.constraints_other, None) finally: # Clean up and completely delete the layer @@ -652,9 +652,9 @@ def test_layer_zip_upload_non_utf8(self): if os.path.exists(thelayer_path) and not os.path.exists(thelayer_zip): zip_dir(thelayer_path, thelayer_zip) if os.path.exists(thelayer_zip): - uploaded = file_upload(thelayer_zip, overwrite=True) + uploaded = file_upload(thelayer_zip, overwrite=True, charset='windows-1258') self.assertEquals(uploaded.title, 'Ming Female 1') - self.assertEquals(len(uploaded.keyword_list()), 0) + self.assertEquals(len(uploaded.keyword_list()), 2) self.assertEquals(uploaded.constraints_other, None) finally: # Clean up and completely delete the layer diff --git a/geonode/upload/files.py b/geonode/upload/files.py index 99d82ca71ae..9fdfbd44b4d 100644 --- a/geonode/upload/files.py +++ b/geonode/upload/files.py @@ -25,9 +25,9 @@ ''' import os.path -from geoserver.resource import FeatureType -from geoserver.resource import Coverage +from geonode.utils import fixup_shp_columnnames +from geoserver.resource import FeatureType, Coverage from django.utils.translation import ugettext as _ from UserList import UserList @@ -256,17 +256,24 @@ def get_scan_hint(valid_extensions): return result -def scan_file(file_name, scan_hint=None): +def scan_file(file_name, scan_hint=None, charset=None): '''get a list of SpatialFiles for the provided file''' if not os.path.exists(file_name): raise Exception(_("Could not access to uploaded data.")) dirname = os.path.dirname(file_name) if zipfile.is_zipfile(file_name): - paths, kept_zip = _process_zip(file_name, dirname, scan_hint=scan_hint) + paths, kept_zip = _process_zip(file_name, + dirname, + scan_hint=scan_hint, + charset=charset) archive = file_name if kept_zip else None else: - paths = [os.path.join(dirname, p) for p in os.listdir(dirname)] + paths = [] + for p in os.listdir(dirname): + _f = os.path.join(dirname, p) + fixup_shp_columnnames(_f, charset) + paths.append(_f) archive = None if paths is not None: safe_paths = _rename_files(paths) @@ -305,7 +312,7 @@ def scan_file(file_name, scan_hint=None): return SpatialFiles(dirname, found, archive=archive) -def _process_zip(zip_path, destination_dir, scan_hint=None): +def _process_zip(zip_path, destination_dir, scan_hint=None, charset=None): """Perform sanity checks on uploaded zip file This function will check if the zip file's contents have legal names. @@ -318,10 +325,10 @@ def _process_zip(zip_path, destination_dir, scan_hint=None): safe_zip_path = _rename_files([zip_path])[0] with zipfile.ZipFile(safe_zip_path, "r") as zip_handler: if scan_hint in _keep_original_data: - extracted_paths = _extract_zip(zip_handler, destination_dir) + extracted_paths = _extract_zip(zip_handler, destination_dir, charset) else: extracted_paths = _sanitize_zip_contents( - zip_handler, destination_dir) + zip_handler, destination_dir, charset) if extracted_paths is not None: all_paths = extracted_paths kept_zip = False @@ -333,16 +340,21 @@ def _process_zip(zip_path, destination_dir, scan_hint=None): return all_paths, kept_zip -def _sanitize_zip_contents(zip_handler, destination_dir): +def _sanitize_zip_contents(zip_handler, destination_dir, charset): clean_macosx_dir(zip_handler.namelist()) - result = _extract_zip(zip_handler, destination_dir) + result = _extract_zip(zip_handler, destination_dir, charset) return result -def _extract_zip(zip_handler, destination): +def _extract_zip(zip_handler, destination, charset): file_names = zip_handler.namelist() zip_handler.extractall(destination) - return [os.path.join(destination, p) for p in file_names] + paths = [] + for p in file_names: + _f = os.path.join(destination, p) + fixup_shp_columnnames(_f, charset) + paths.append(_f) + return paths def _probe_zip_for_sld(zip_handler, destination_dir): diff --git a/geonode/upload/forms.py b/geonode/upload/forms.py index dbd52d820f4..fcb8afa94ed 100644 --- a/geonode/upload/forms.py +++ b/geonode/upload/forms.py @@ -47,6 +47,7 @@ class LayerUploadForm(forms.Form): shx_file = forms.FileField(required=False) prj_file = forms.FileField(required=False) xml_file = forms.FileField(required=False) + charset = forms.CharField(required=False) if check_ogc_backend(geoserver.BACKEND_PACKAGE): sld_file = forms.FileField(required=False) diff --git a/geonode/upload/utils.py b/geonode/upload/utils.py index 634f4e4a0f9..cfca799aa65 100644 --- a/geonode/upload/utils.py +++ b/geonode/upload/utils.py @@ -523,20 +523,17 @@ def _get_layer_values(layer, upload_session, expand=0): lyr = inDataSource.GetLayer(str(layer.name)) limit = 100 for feat in islice(lyr, 0, limit): - try: - feat_values = json_loads_byteified(feat.ExportToJson()).get('properties') - for k in feat_values.keys(): - type_code = feat.GetFieldDefnRef(k).GetType() - binding = feat.GetFieldDefnRef(k).GetFieldTypeName(type_code) - feat_value = feat_values[k] if str(feat_values[k]) != 'None' else 0 - if expand > 0: - ff = {'value': feat_value, 'binding': binding} - feat_values[k] = ff - else: - feat_values[k] = feat_value - layer_values.append(feat_values) - except BaseException: - pass + feat_values = json_loads_byteified(feat.ExportToJson()).get('properties') + for k in feat_values.keys(): + type_code = feat.GetFieldDefnRef(k).GetType() + binding = feat.GetFieldDefnRef(k).GetFieldTypeName(type_code) + feat_value = feat_values[k] if str(feat_values[k]) != 'None' else 0 + if expand > 0: + ff = {'value': feat_value, 'binding': binding} + feat_values[k] = ff + else: + feat_values[k] = feat_value + layer_values.append(feat_values) return layer_values diff --git a/geonode/upload/views.py b/geonode/upload/views.py index 12a97a16045..cfbbce5de4f 100644 --- a/geonode/upload/views.py +++ b/geonode/upload/views.py @@ -52,7 +52,7 @@ from django.shortcuts import get_object_or_404 from django.shortcuts import render from django.views.generic import CreateView, DeleteView -from geonode.utils import unzip_file +from geonode.utils import fixup_shp_columnnames from geonode.base.enumerations import CHARSETS from .forms import ( @@ -171,7 +171,8 @@ def save_step_view(req, session): scan_hint = get_scan_hint(form.cleaned_data["valid_extensions"]) spatial_files = scan_file( base_file, - scan_hint=scan_hint + scan_hint=scan_hint, + charset=form.cleaned_data["charset"] ) logger.info("spatial_files: {}".format(spatial_files)) import_session = save_step( @@ -191,14 +192,15 @@ def save_step_view(req, session): ) sld = None - if spatial_files[0].sld_files: sld = spatial_files[0].sld_files[0] if not os.path.isfile(os.path.join(tempdir, spatial_files[0].base_file)): tmp_files = [f for f in os.listdir(tempdir) if os.path.isfile(os.path.join(tempdir, f))] for f in tmp_files: if zipfile.is_zipfile(os.path.join(tempdir, f)): - unzip_file(os.path.join(tempdir, f), '.shp', tempdir=tempdir) + fixup_shp_columnnames(os.path.join(tempdir, f), + form.cleaned_data["charset"], + tempdir=tempdir) _log('provided sld is %s' % sld) # upload_type = get_upload_type(base_file) diff --git a/geonode/utils.py b/geonode/utils.py index 17af3c6a7a7..738657c7891 100755 --- a/geonode/utils.py +++ b/geonode/utils.py @@ -61,7 +61,7 @@ from django.core.serializers.json import DjangoJSONEncoder from django.utils import timezone -from geonode import geoserver, qgis_server # noqa +from geonode import geoserver, qgis_server, GeoNodeException # noqa try: import json @@ -965,14 +965,21 @@ def check_shp_columnnames(layer): """ Check if shapefile for a given layer has valid column names. If not, try to fix column names and warn the user """ - # TODO we may add in a better location this method inShapefile = '' for f in layer.upload_session.layerfile_set.all(): if os.path.splitext(f.file.name)[1] == '.shp': inShapefile = f.file.path + if inShapefile: + return fixup_shp_columnnames(inShapefile, layer.charset) + + +def fixup_shp_columnnames(inShapefile, charset, tempdir=None): + """ Try to fix column names and warn the user + """ - tempdir = tempfile.mkdtemp() + if not tempdir: + tempdir = tempfile.mkdtemp() if is_zipfile(inShapefile): inShapefile = unzip_file(inShapefile, '.shp', tempdir=tempdir) @@ -1004,46 +1011,49 @@ def check_shp_columnnames(layer): if a.match(field_name): list_col_original.append(field_name) - try: - for i in range(0, inLayerDefn.GetFieldCount()): - charset = layer.charset if layer.charset and 'undefined' not in layer.charset \ - else 'UTF-8' - field_name = unicode( - inLayerDefn.GetFieldDefn(i).GetName(), - charset) - - if not a.match(field_name): - # once the field_name contains Chinese, to use slugify_zh - has_ch = False - for ch in field_name: - if u'\u4e00' <= ch <= u'\u9fff': + + for i in range(0, inLayerDefn.GetFieldCount()): + charset = charset if charset and 'undefined' not in charset \ + else 'UTF-8' + + field_name = inLayerDefn.GetFieldDefn(i).GetName() + if not a.match(field_name): + # once the field_name contains Chinese, to use slugify_zh + has_ch = False + for ch in field_name: + try: + if u'\u4e00' <= ch.decode("utf-8", "replace") <= u'\u9fff': has_ch = True break - if has_ch: - new_field_name = slugify_zh(field_name, separator='_') - else: - new_field_name = custom_slugify(field_name) - if not b.match(new_field_name): - new_field_name = '_' + new_field_name - j = 0 - while new_field_name in list_col_original or new_field_name in list_col.values(): - if j == 0: - new_field_name += '_0' - if new_field_name.endswith('_' + str(j)): - j += 1 - new_field_name = new_field_name[:-2] + '_' + str(j) - list_col.update({field_name: new_field_name}) - except UnicodeDecodeError as e: - logger.error(str(e)) - return False, None, None + except UnicodeDecodeError: + has_ch = True + break + if has_ch: + new_field_name = slugify_zh(field_name, separator='_') + else: + new_field_name = custom_slugify(field_name) + if not b.match(new_field_name): + new_field_name = '_' + new_field_name + j = 0 + while new_field_name in list_col_original or new_field_name in list_col.values(): + if j == 0: + new_field_name += '_0' + if new_field_name.endswith('_' + str(j)): + j += 1 + new_field_name = new_field_name[:-2] + '_' + str(j) + list_col.update({field_name: new_field_name}) if len(list_col) == 0: return True, None, None else: - for key in list_col.keys(): - qry = u"ALTER TABLE {0} RENAME COLUMN \"{1}\" TO \"{2}\"".format( - inLayer.GetName(), key, list_col[key]) - inDataSource.ExecuteSQL(qry.encode(layer.charset)) + try: + for key in list_col.keys(): + qry = u"ALTER TABLE {} RENAME COLUMN \"".format(inLayer.GetName()) + qry = qry + key.decode(charset) + u"\" TO \"{}\"".format(list_col[key]) + inDataSource.ExecuteSQL(qry.encode(charset)) + except UnicodeDecodeError: + raise GeoNodeException( + "Could not decode SHAPEFILE attributes by using the specified charset '{}'.".format(charset)) return True, None, list_col