diff options
author | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-12-08 00:12:12 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@peacefrogs.net> | 2012-12-08 00:15:52 +0100 |
commit | 8d2fb762f22d4899941b5cea2117365eb55a87d6 (patch) | |
tree | 26ece5edb55f6f3aea316ac41d35964217fbd88e | |
parent | af8522d68d00ff30bc188513525020f0eda3ae2d (diff) | |
download | Chimère-8d2fb762f22d4899941b5cea2117365eb55a87d6.tar.bz2 Chimère-8d2fb762f22d4899941b5cea2117365eb55a87d6.zip |
Imports: Manage overwrite optionaly
-rw-r--r-- | chimere/forms.py | 6 | ||||
-rw-r--r-- | chimere/migrations/0041_auto__add_field_importer_overwrite.py | 244 | ||||
-rw-r--r-- | chimere/models.py | 11 | ||||
-rw-r--r-- | chimere/static/chimere/js/importer_interface.js | 9 | ||||
-rw-r--r-- | chimere/tests.py | 81 | ||||
-rw-r--r-- | chimere/utils.py | 12 |
6 files changed, 328 insertions, 35 deletions
diff --git a/chimere/forms.py b/chimere/forms.py index eb64a04..0d4bba6 100644 --- a/chimere/forms.py +++ b/chimere/forms.py @@ -118,7 +118,7 @@ class NewsAdminForm(forms.ModelForm): class ImporterAdminForm(forms.ModelForm): filtr = forms.CharField(widget=ImportFiltrWidget, required=False) importer_type = forms.ChoiceField(widget=ImporterChoicesWidget, - choices=[('', '--')]+list(IMPORTER_CHOICES)) + choices=[('', '--')]+list(IMPORTER_CHOICES)) class Meta: model = Importer widgets = { @@ -134,11 +134,11 @@ class ImporterAdminForm(forms.ModelForm): if self.cleaned_data.get('importer_type') == 'OSM' and \ not self.cleaned_data.get('filtr'): raise forms.ValidationError(_(u"For OSM import you must be "\ - u"provide a filter. Select an area and node/way filter.")) + u"provide a filter. Select an area and node/way filter.")) if self.cleaned_data.get('importer_type') == 'OSM' and \ not RE_XAPI.match(self.cleaned_data.get('filtr')): raise forms.ValidationError(_(u"For OSM import you must be "\ - u"provide a filter. Select an area and node/way filter.")) + u"provide a filter. Select an area and node/way filter.")) if self.cleaned_data.get('importer_type') == 'SHP' and \ not self.cleaned_data.get('zipped'): raise forms.ValidationError(_(u"Shapefiles must be provided in a "\ diff --git a/chimere/migrations/0041_auto__add_field_importer_overwrite.py b/chimere/migrations/0041_auto__add_field_importer_overwrite.py new file mode 100644 index 0000000..9ae6b84 --- /dev/null +++ b/chimere/migrations/0041_auto__add_field_importer_overwrite.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'Importer.overwrite' + db.add_column('chimere_importer', 'overwrite', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'Importer.overwrite' + db.delete_column('chimere_importer', 'overwrite') + + + models = { + 'chimere.area': { + 'Meta': {'ordering': "('order', 'name')", 'object_name': 'Area'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'default_subcategories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False', 'blank': 'True'}), + 'dynamic_categories': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'external_css': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layers': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'through': "orm['chimere.AreaLayers']", 'to': "orm['chimere.Layer']"}), + 'lower_right_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}), + 'restrict_to_extent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'areas'", 'blank': 'True', 'db_table': "'chimere_subcategory_areas'", 'to': "orm['chimere.SubCategory']"}), + 'upper_left_corner': ('django.contrib.gis.db.models.fields.PointField', [], {'default': "'POINT(0 0)'"}), + 'urn': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'blank': 'True'}), + 'welcome_message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.arealayers': { + 'Meta': {'ordering': "('order',)", 'object_name': 'AreaLayers'}, + 'area': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Area']"}), + 'default': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Layer']"}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.category': { + 'Meta': {'ordering': "['order']", 'object_name': 'Category'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.color': { + 'Meta': {'ordering': "['order']", 'object_name': 'Color'}, + 'code': ('django.db.models.fields.CharField', [], {'max_length': '6'}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.colortheme': { + 'Meta': {'object_name': 'ColorTheme'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.icon': { + 'Meta': {'object_name': 'Icon'}, + 'height': ('django.db.models.fields.IntegerField', [], {}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'width': ('django.db.models.fields.IntegerField', [], {}) + }, + 'chimere.importer': { + 'Meta': {'object_name': 'Importer'}, + 'associate_marker_to_way': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'default_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'filtr': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'importer_type': ('django.db.models.fields.CharField', [], {'max_length': '4'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'overwrite': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'source_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'srid': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'state': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'zipped': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) + }, + 'chimere.layer': { + 'Meta': {'object_name': 'Layer'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'layer_code': ('django.db.models.fields.TextField', [], {'max_length': '300'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.marker': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Marker'}, + 'available_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'point': ('chimere.widgets.PointField', [], {}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_marker'", 'null': 'True', 'to': "orm['chimere.Marker']"}), + 'route': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'associated_marker'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.multimediaextension': { + 'Meta': {'object_name': 'MultimediaExtension'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'extensions'", 'to': "orm['chimere.MultimediaType']"}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '6'}) + }, + 'chimere.multimediafile': { + 'Meta': {'object_name': 'MultimediaFile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'multimedia_files'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'multimedia_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.MultimediaType']", 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'url': ('django.db.models.fields.URLField', [], {'max_length': '200'}) + }, + 'chimere.multimediatype': { + 'Meta': {'object_name': 'MultimediaType'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'iframe': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'media_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.news': { + 'Meta': {'object_name': 'News'}, + 'areas': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'to': "orm['chimere.Area']", 'null': 'True', 'blank': 'True'}), + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'content': ('django.db.models.fields.TextField', [], {}), + 'date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}) + }, + 'chimere.picturefile': { + 'Meta': {'object_name': 'PictureFile'}, + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'pictures'", 'to': "orm['chimere.Marker']"}), + 'miniature': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), + 'thumbnailfile': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'thumbnailfile_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'thumbnailfile_width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.property': { + 'Meta': {'object_name': 'Property'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'marker': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Marker']"}), + 'propertymodel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.PropertyModel']"}), + 'value': ('django.db.models.fields.TextField', [], {}) + }, + 'chimere.propertymodel': { + 'Meta': {'ordering': "('order',)", 'object_name': 'PropertyModel'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'mandatory': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {}), + 'subcategories': ('chimere.widgets.SelectMultipleField', [], {'symmetrical': 'False', 'related_name': "'properties'", 'blank': 'True', 'to': "orm['chimere.SubCategory']"}), + 'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}) + }, + 'chimere.route': { + 'Meta': {'ordering': "('status', 'name')", 'object_name': 'Route'}, + 'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.RouteFile']", 'null': 'True', 'blank': 'True'}), + 'categories': ('chimere.widgets.SelectMultipleField', [], {'to': "orm['chimere.SubCategory']", 'symmetrical': 'False'}), + 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'has_associated_marker': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'import_key': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_source': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'import_version': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'license': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'modified_since_import': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'not_for_osm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'origin': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'picture': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'ref_item': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'submited_route'", 'null': 'True', 'to': "orm['chimere.Route']"}), + 'route': ('chimere.widgets.RouteField', [], {}), + 'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'status': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'submiter_comment': ('django.db.models.fields.TextField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'submiter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), + 'submiter_name': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'submiter_session_key': ('django.db.models.fields.CharField', [], {'max_length': '40', 'null': 'True', 'blank': 'True'}), + 'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) + }, + 'chimere.routefile': { + 'Meta': {'ordering': "('name',)", 'object_name': 'RouteFile'}, + 'file_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'raw_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + 'simplified_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}) + }, + 'chimere.subcategory': { + 'Meta': {'ordering': "['category', 'order']", 'object_name': 'SubCategory'}, + 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'subcategories'", 'to': "orm['chimere.Category']"}), + 'color_theme': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.ColorTheme']", 'null': 'True', 'blank': 'True'}), + 'icon': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['chimere.Icon']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'item_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '150'}), + 'order': ('django.db.models.fields.IntegerField', [], {'default': '1000'}), + 'submission': ('django.db.models.fields.BooleanField', [], {'default': 'True'}) + }, + 'chimere.tinyurl': { + 'Meta': {'object_name': 'TinyUrl'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'parameters': ('django.db.models.fields.CharField', [], {'max_length': '500'}) + } + } + + complete_apps = ['chimere']
\ No newline at end of file diff --git a/chimere/models.py b/chimere/models.py index f6b1872..50a3dc9 100644 --- a/chimere/models.py +++ b/chimere/models.py @@ -239,6 +239,7 @@ class Importer(models.Model): blank=True, null=True) srid = models.IntegerField(_(u"SRID"), blank=True, null=True) zipped = models.BooleanField(_(u"Zipped file"), default=False) + overwrite = models.BooleanField(_(u"Overwrite data"), default=False) origin = models.CharField(_(u"Origin"), max_length=100, blank=True, null=True) license = models.CharField(_(u"License"), max_length=100, @@ -520,8 +521,8 @@ class Marker(GeographicItem): PRE_ATTRS = { - 'Marker':('name', 'geometry', 'import_version'), - 'Route':('name', 'geometry', 'import_version'), + 'Marker':('name', 'geometry', 'import_version', 'modified_since_import'), + 'Route':('name', 'geometry', 'import_version', 'modified_since_import'), 'Area':('urn', 'name'), } def geometry_pre_save(cls, pre_save_geom_values): @@ -550,7 +551,11 @@ def geometry_post_save(pre_save_geom_values): or kwargs['instance'].pk not in pre_save_geom_values: return instance = kwargs['instance'] - name, geometry, import_version = pre_save_geom_values[instance.pk] + name, geometry, import_version, modified_since_import = \ + pre_save_geom_values[instance.pk] + # force the reinit of modified_since_import + if modified_since_import != instance.modified_since_import: + return if (instance.import_version != import_version and instance.modified_since_import): instance.modified_since_import = False diff --git a/chimere/static/chimere/js/importer_interface.js b/chimere/static/chimere/js/importer_interface.js index 9dc669f..941f7c4 100644 --- a/chimere/static/chimere/js/importer_interface.js +++ b/chimere/static/chimere/js/importer_interface.js @@ -4,15 +4,16 @@ django.jQuery(function($) { 'field-source'), KML:new Array('field-source', 'field-source_file', 'field-default_name', 'field-filtr', 'field-zipped', 'field-origin', - 'field-license', 'field-categories'), + 'field-license', 'field-categories', 'field-overwrite'), SHP:new Array('field-source', 'field-source_file', 'field-default_name', 'field-zipped', 'field-origin', 'field-srid', - 'field-license', 'field-categories'), + 'field-license', 'field-categories', 'field-overwrite'), RSS:new Array('field-source', 'field-default_name', 'field-origin', - 'field-srid', 'field-license', 'field-categories'), + 'field-srid', 'field-license', 'field-categories', + 'field-overwrite'), CSV:new Array('field-source', 'field-source_file', 'field-default_name', 'field-origin', 'field-srid', 'field-license', - 'field-categories') + 'field-categories', 'field-overwrite') } var map_initialized; function refresh_importer_form(){ diff --git a/chimere/tests.py b/chimere/tests.py index 20c0f29..d3dc3de 100644 --- a/chimere/tests.py +++ b/chimere/tests.py @@ -62,7 +62,21 @@ def subcategory_setup(): icon=icon, order=1, item_type='M',) - return [subcategory_1, subcategory_2] + + subcategory_3 = SubCategory.objects.create(category=category, + name='Subcategory 3', + available=True, + icon=icon, + order=1, + item_type='M',) + + subcategory_4 = SubCategory.objects.create(category=category, + name='Subcategory 4', + available=True, + icon=icon, + order=1, + item_type='M',) + return [subcategory_1, subcategory_2, subcategory_3, subcategory_4] def marker_setup(sub_categories=[]): if not sub_categories: @@ -121,50 +135,73 @@ class ImporterTest: nb = max([Marker.objects.filter(categories__pk=cat.pk).count(), Route.objects.filter(categories__pk=cat.pk).count()]) self.assertEqual(nb_by_cat[cat], nb) - # update for importer, awaited_nb in self.marker_importers: + importer.overwrite = True + importer.save() nb, nb_updated, res = importer.manager.get() if awaited_nb == None: continue self.assertEqual(nb, 0) + # manage overwrite + for importer, awaited_nb in self.marker_importers: + if not awaited_nb: + continue + # mimic the modification of one item + for cls in (Marker, Route): + items = cls.objects.filter( + categories=importer.categories.all()[0] + ).order_by('-pk').all() + if items.count(): + item = items.all()[0] + item.import_version = 99999 # fake version number + item.save() + # as when the import_version it is considered as an import + # modification force the modification flag + item.modified_since_import = True + item.save() + importer.overwrite = False + importer.save() + nb, nb_updated, res = importer.manager.get() + if awaited_nb == None: + continue + self.assertEqual(nb, 1) class KMLImporterTest(TestCase, ImporterTest): def setUp(self): - subcategory_1, subcategory_2 = subcategory_setup() + subcategories = subcategory_setup() importer1 = Importer.objects.create(importer_type='KML', source=test_dir_path+'tests/sample.kml', filtr="Category 1") - importer1.categories.add(subcategory_1) + importer1.categories.add(subcategories[0]) importer2 = Importer.objects.create(importer_type='KML', source=test_dir_path+'tests/sample.kml', filtr="Subcategory 1", associate_marker_to_way=True) - importer2.categories.add(subcategory_1) - importer2.categories.add(subcategory_2) + importer2.categories.add(subcategories[1]) importer3 = Importer.objects.create(importer_type='KML', source=test_path+'tests/sample.kml', filtr="Subcategory 3") - importer3.categories.add(subcategory_2) + importer3.categories.add(subcategories[2]) importer4 = Importer.objects.create(importer_type='KML', source=test_dir_path+'tests/sample.kml.zip', zipped=True) - importer4.categories.add(subcategory_1) + importer4.categories.add(subcategories[3]) self.marker_importers = [(importer1, 1), (importer2, 3), (importer3, 0), (importer4, 4)] class ShapefileImporterTest(TestCase, ImporterTest): def setUp(self): - self.subcategory_1, self.subcategory_2 = subcategory_setup() + self.subcategories = subcategory_setup() importer = Importer.objects.create(importer_type='SHP', source=test_dir_path+'tests/sample_nodes.shp.zip', zipped=True) - importer.categories.add(self.subcategory_1) + importer.categories.add(self.subcategories[0]) importer2 = Importer.objects.create(importer_type='SHP', source=test_dir_path+'tests/sample_ways.shp.zip', zipped=True) - importer2.categories.add(self.subcategory_2) + importer2.categories.add(self.subcategories[1]) self.marker_importers = [(importer, 29), (importer2, 5),] @@ -179,40 +216,42 @@ class ShapefileImporterTest(TestCase, ImporterTest): importer.associate_marker_to_way = True importer.save() nb, nb_updated, res = importer.manager.get() - nb = Marker.objects.filter(categories__pk=self.subcategory_2.pk).count() + nb = Marker.objects.filter(categories__pk=self.subcategories[1].pk + ).count() self.assertEqual(nb, 5) - Marker.objects.filter(categories__pk=self.subcategory_2.pk).delete() - Route.objects.filter(categories__pk=self.subcategory_2.pk).delete() + Marker.objects.filter(categories__pk=self.subcategories[1].pk).delete() + Route.objects.filter(categories__pk=self.subcategories[1].pk).delete() importer.associate_marker_to_way = False importer.save() nb, nb_updated, res = importer.manager.get() - nb = Marker.objects.filter(categories__pk=self.subcategory_2.pk).count() + nb = Marker.objects.filter(categories__pk=self.subcategories[1].pk + ).count() self.assertEqual(nb, 0) class OSMImporterTest(TestCase, ImporterTest): def setUp(self): - subcategory_1, subcategory_2 = subcategory_setup() + subcategories = subcategory_setup() markers = marker_setup() importer1 = Importer.objects.create(importer_type='OSM', source=test_dir_path+'tests/sample_nodes.osm') - importer1.categories.add(subcategory_1) + importer1.categories.add(subcategories[0]) importer2 = Importer.objects.create(importer_type='OSM', source=test_dir_path+'tests/sample_ways.osm') - importer2.categories.add(subcategory_2) + importer2.categories.add(subcategories[1]) self.marker_importers = [(importer1, 19), (importer2, 8)] class GeoRSSImporterTest(TestCase, ImporterTest): def setUp(self): - subcategory_1, subcategory_2 = subcategory_setup() + subcategories = subcategory_setup() importer1 = Importer.objects.create(importer_type='RSS', source=test_dir_path+'tests/georss_simple.xml') - importer1.categories.add(subcategory_1) + importer1.categories.add(subcategories[0]) importer2 = Importer.objects.create(importer_type='RSS', source=test_dir_path+'tests/eqs7day-M5.xml') - importer2.categories.add(subcategory_2) + importer2.categories.add(subcategories[1]) self.marker_importers = [(importer1, 1), (importer2, 32)] diff --git a/chimere/utils.py b/chimere/utils.py index 73eecd0..8a9855a 100644 --- a/chimere/utils.py +++ b/chimere/utils.py @@ -71,7 +71,7 @@ class ImportManager: pass def create_or_update_item(self, cls, values, import_key, version=None, - key='', pk=None, overload=True): + key='', pk=None): updated, created, item = False, False, None import_key = unicode(import_key).replace(':', '^') if not key: @@ -88,7 +88,8 @@ class ImportManager: if version and ref_item.import_version == int(version): # no update since the last import return ref_item, None, None - if not overload and item.modified_since_import: + if not self.importer_instance.overwrite \ + and ref_item.modified_since_import: dct_import['ref_item'] = ref_item else: item = ref_item @@ -96,6 +97,9 @@ class ImportManager: setattr(item, k, values[k]) try: item.save() + # force the modified_since_import status + item.modified_since_import = False + item.save() except TypeError: # error on data source return None, False, False @@ -684,7 +688,7 @@ class OSMManager(ImportManager): or u'ODbL', 'import_version':version} item, updated, created = self.create_or_update_item( - Route, dct, node_id, version, overload=False) + Route, dct, node_id, version) if updated: updated_item += 1 if created: @@ -717,7 +721,7 @@ class OSMManager(ImportManager): or u'ODbL', 'import_version':version} item, updated, created = self.create_or_update_item( - Marker, dct, node_id, version, overload=False) + Marker, dct, node_id, version) if updated: updated_item += 1 if created: |