diff options
| -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:  | 
