diff options
75 files changed, 6858 insertions, 536 deletions
| diff --git a/archaeological_context_records/data_importer.py b/archaeological_context_records/data_importer.py index 0bf6f83a1..8c5df2ddf 100644 --- a/archaeological_context_records/data_importer.py +++ b/archaeological_context_records/data_importer.py @@ -43,9 +43,9 @@ class ContextRecordsImporterBibracte(Importer):          # interprétation          ImportFormater('interpretation', UnicodeFormater(1000), required=False,),          # date ouverture -        ImportFormater('opening_date', DateFormater('%Y/%m/%d'), required=False,), +        ImportFormater('opening_date', DateFormater(['%Y/%m/%d']), required=False,),          # date fermeture -        ImportFormater('closing_date', DateFormater('%Y/%m/%d'), required=False,), +        ImportFormater('closing_date', DateFormater(['%Y/%m/%d']), required=False,),          # lien vers parcelle          ImportFormater('parcel__external_id', UnicodeFormater(12),                         required=False,), diff --git a/archaeological_context_records/migrations/0011_auto__chg_field_datingtype_txt_idx__chg_field_datingquality_txt_idx__c.py b/archaeological_context_records/migrations/0011_auto__chg_field_datingtype_txt_idx__chg_field_datingquality_txt_idx__c.py new file mode 100644 index 000000000..dec4559be --- /dev/null +++ b/archaeological_context_records/migrations/0011_auto__chg_field_datingtype_txt_idx__chg_field_datingquality_txt_idx__c.py @@ -0,0 +1,579 @@ +# -*- 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): + +        # Changing field 'DatingType.txt_idx' +        db.alter_column('archaeological_context_records_datingtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'DatingQuality.txt_idx' +        db.alter_column('archaeological_context_records_datingquality', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'RelationType.txt_idx' +        db.alter_column('archaeological_context_records_relationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'IdentificationType.txt_idx' +        db.alter_column('archaeological_context_records_identificationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'Unit.txt_idx' +        db.alter_column('archaeological_context_records_unit', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'ActivityType.txt_idx' +        db.alter_column('archaeological_context_records_activitytype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): + +        # Changing field 'DatingType.txt_idx' +        db.alter_column('archaeological_context_records_datingtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'DatingQuality.txt_idx' +        db.alter_column('archaeological_context_records_datingquality', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'RelationType.txt_idx' +        db.alter_column('archaeological_context_records_relationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'IdentificationType.txt_idx' +        db.alter_column('archaeological_context_records_identificationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'Unit.txt_idx' +        db.alter_column('archaeological_context_records_unit', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'ActivityType.txt_idx' +        db.alter_column('archaeological_context_records_activitytype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'archaeological_context_records.activitytype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'ActivityType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.contextrecord': { +            'Meta': {'object_name': 'ContextRecord'}, +            'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.ActivityType']", 'null': 'True', 'blank': 'True'}), +            'closing_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'datings': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_context_records.Dating']", 'symmetrical': 'False'}), +            'depth': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'filling': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'has_furniture': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'identification': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.IdentificationType']", 'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_context_records_contextrecord'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'interpretation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'location': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'opening_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'context_record'", 'to': "orm['archaeological_operations.Operation']"}), +            'parcel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'context_record'", 'to': "orm['archaeological_operations.Parcel']"}), +            'related_context_records': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_context_records.ContextRecord']", 'null': 'True', 'through': "orm['archaeological_context_records.RecordRelations']", 'blank': 'True'}), +            'taq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'taq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'thickness': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'unit': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_context_records.Unit']"}), +            'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_context_records.contextrecordsource': { +            'Meta': {'object_name': 'ContextRecordSource'}, +            'additional_information': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'authors': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'contextrecordsource_related'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Author']"}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'context_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'source'", 'to': "orm['archaeological_context_records.ContextRecord']"}), +            'creation_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'format_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Format']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'item_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'receipt_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'scale': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'source_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SourceType']"}), +            'support_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SupportType']", 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}) +        }, +        'archaeological_context_records.dating': { +            'Meta': {'object_name': 'Dating'}, +            'dating_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.DatingType']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'period': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Period']"}), +            'quality': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.DatingQuality']", 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_context_records.datingquality': { +            'Meta': {'ordering': "('label',)", 'object_name': 'DatingQuality'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.datingtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'DatingType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.historicalcontextrecord': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalContextRecord'}, +            'activity_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'closing_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'depth': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'filling': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'has_furniture': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'identification_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'interpretation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'location': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'opening_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'operation_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'parcel_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'taq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'taq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'thickness': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'unit_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_context_records.identificationtype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'IdentificationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.recordrelations': { +            'Meta': {'object_name': 'RecordRelations'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'left_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_relations'", 'to': "orm['archaeological_context_records.ContextRecord']"}), +            'relation_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.RelationType']"}), +            'right_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_relations'", 'to': "orm['archaeological_context_records.ContextRecord']"}) +        }, +        'archaeological_context_records.relationtype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'RelationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'inverse_relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.RelationType']", 'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'symmetrical': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.unit': { +            'Meta': {'ordering': "('order',)", 'object_name': 'Unit'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.Unit']", 'null': 'True', 'blank': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.file': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'File'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_advised': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'classified_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'departments': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'file_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.FileType']"}), +            'general_contractor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'general_contractor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_line': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_files_file'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'instruction_deadline': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'locality': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'main_town': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_main'", 'null': 'True', 'to': "orm['ishtar_common.Town']"}), +            'mh_listing': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'mh_register': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'numeric_reference': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'permit_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'permit_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.PermitType']", 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'protected_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'raw_general_contractor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'raw_town_planning_service': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'related_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.File']", 'null': 'True', 'blank': 'True'}), +            'requested_operation_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_operations.OperationType']"}), +            'research_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'responsible_town_planning_service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'responsible_town_planning_service'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'saisine_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.SaisineType']", 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'total_developed_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'total_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'file'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'default': '2015'}) +        }, +        'archaeological_files.filetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'FileType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.permittype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PermitType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.saisinetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'SaisineType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'delay': ('django.db.models.fields.IntegerField', [], {'default': '30'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.archaeologicalsite': { +            'Meta': {'object_name': 'ArchaeologicalSite'}, +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_archaeologicalsite'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.RemainType']", 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operation': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'Operation'}, +            'archaeological_sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.ArchaeologicalSite']", 'symmetrical': 'False'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operations'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'cira_rapporteur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'cira_rapporteur'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'code_dracar': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'code_patriarche': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'common_name': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'eas_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'effective_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'excavation_end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_financing': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'geoarchaeological_context_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_operation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'large_area_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'negative_result': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'operation_code': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['archaeological_operations.OperationType']"}), +            'operator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'operator_reference': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'optional_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.Period']", 'symmetrical': 'False'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.RemainType']", 'symmetrical': 'False'}), +            'report_delivery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'scheduled_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_scientist_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.Town']", 'symmetrical': 'False'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'zoning_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operationtype': { +            'Meta': {'ordering': "['-preventive', 'order', 'label']", 'object_name': 'OperationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preventive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.parcel': { +            'Meta': {'ordering': "('year', 'section', 'parcel_number')", 'object_name': 'Parcel'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_parcel'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_operations.Operation']"}), +            'parcel_number': ('django.db.models.fields.CharField', [], {'max_length': '6', 'null': 'True', 'blank': 'True'}), +            'section': ('django.db.models.fields.CharField', [], {'max_length': '4'}), +            'town': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parcels'", 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.period': { +            'Meta': {'ordering': "('order',)", 'object_name': 'Period'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.IntegerField', [], {}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.remaintype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'RemainType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.arrondissement': { +            'Meta': {'object_name': 'Arrondissement'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.author': { +            'Meta': {'object_name': 'Author'}, +            'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"}) +        }, +        'ishtar_common.authortype': { +            'Meta': {'object_name': 'AuthorType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.canton': { +            'Meta': {'object_name': 'Canton'}, +            'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.department': { +            'Meta': {'ordering': "['number']", 'object_name': 'Department'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}), +            'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.format': { +            'Meta': {'object_name': 'Format'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.sourcetype': { +            'Meta': {'object_name': 'SourceType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.state': { +            'Meta': {'ordering': "['number']", 'object_name': 'State'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) +        }, +        'ishtar_common.supporttype': { +            'Meta': {'object_name': 'SupportType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.town': { +            'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, +            'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), +            'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), +            'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        } +    } + +    complete_apps = ['archaeological_context_records']
\ No newline at end of file diff --git a/archaeological_files/data_importer.py b/archaeological_files/data_importer.py index ae0cf340c..2b715cb42 100644 --- a/archaeological_files/data_importer.py +++ b/archaeological_files/data_importer.py @@ -41,7 +41,36 @@ class ImportClosingFormater(ImportFormater):          obj.end_date = open_date + datetime.timedelta(30)          obj.save() -class FileImporterSraPdL(Importer): +class ImportMayorFormater(ImportFormater): +    def post_process(self, obj, context, value, owner=None): +        value = self.formater.format(value) +        if type(self.field_name) in (list, tuple): +            return #not managed +        associated_obj = get_object_from_path(obj, self.field_name) +        if not value or not obj.main_town or not associated_obj: +            return +        if slugify(value).endswith('le-maire'): +            value += u" de " + obj.main_town.name +            value = value[:300] +        setattr(associated_obj, self.field_name.split('__')[-1], value) +        associated_obj.save() + +class FilePostProcessing(object): +    # erroneaous date to be easily identified on post-processing +    DEFAULT_YEAR = 1756 +    EXTRA_DEFAULTS = {tuple():{'year':DEFAULT_YEAR}} + +    def post_processing(self, item, data): +        if item.year == self.DEFAULT_YEAR: +            if item.creation_date: +                item.year = item.creation_date.year +            elif item.reception_date: +                item.year = item.reception_date.year +        item.save() +        return item + +class FileImporterSraPdL(FilePostProcessing, Importer): +    DESC = u"Exports dossiers SRA PdL : importeur Filemaker dossiers"      LINE_FORMAT = []      OBJECT_CLS = models.File      DEFAULTS = {('responsible_town_planning_service', 'attached_to'):{ @@ -52,42 +81,43 @@ class FileImporterSraPdL(Importer):                                               txt_idx="general_contractor")},                  tuple():{                      'file_type': models.FileType.objects.get( -                                             txt_idx='undefined'), +                                             txt_idx='preventive'),                  },                  ('in_charge',):{'attached_to':None}, # initialized in __init__                 } +    STR_CUT = {tuple():{'comment':2000}}      def _init_line_format(self):          tf = TownFormater()          tf.town_dct_init()          self.line_format = [          None, # A, 1 -        ImportFormater(['address', 'postal_code', ['towns', 'parcels__town']], # B, 2 +        ImportFormater(['address', 'postal_code', ['main_town', 'parcels__town']], # B, 2                      [UnicodeFormater(500, clean=True),                       UnicodeFormater(5, re_filter=RE_CD_POSTAL_FILTER),                       tf],                      regexp=RE_ADD_CD_POSTAL_TOWN,                      regexp_formater_args=[[0], [1], [2, 1]], required=False, -                    comment="Dossier - adresse"), -        ImportFormater('general_contractor__raw_name', # C, 3 TODO - extraire nom_prenom_titre +                    comment=u"Dossier - adresse"), +        ImportMayorFormater('general_contractor__raw_name', # C, 3 TODO - extraire nom_prenom_titre                         UnicodeFormater(200),                         comment=u"Aménageur - nom brut", -                       duplicate_fields=['general_contractor__attached_to__name'], +                       post_processing=True,                         required=False), -        ImportFormater(['general_contractor__attached_to__address', # D, 4 -                        'general_contractor__attached_to__postal_code', -                        'general_contractor__attached_to__town'], +        ImportFormater(['general_contractor__address', # D, 4 +                        'general_contractor__postal_code', +                        'general_contractor__town'],                      [UnicodeFormater(500, clean=True),                       UnicodeFormater(5, re_filter=RE_CD_POSTAL_FILTER),                       TownFormater(town_full_dct=tf._town_full_dct,                                    town_dct=tf._town_dct)],                      regexp=RE_ADD_CD_POSTAL_TOWN,                      regexp_formater_args=[[0], [1], [2, 1]], required=False, -                    comment="Aménageur - adresse"), +                    comment=u"Aménageur - adresse"),          ImportFormater("general_contractor__title", # E, 5                          StrChoiceFormater(Person.TYPE, cli=True),                          required=False, -                        comment="Aménageur - titre"), +                        comment=u"Aménageur - titre"),          None, # F, 6          None, # G, 7          None, # H, 8 @@ -96,19 +126,18 @@ class FileImporterSraPdL(Importer):                          required=False),          ImportParcelFormater('', required=False, post_processing=True), # J, 10          None, # K, 11 -        ImportFormater([['towns', 'parcels__town']], # L, 12 +        ImportFormater([['main_town', 'parcels__town']], # L, 12                         tf,                         required=False, -                       comment="Commune (si non définie avant)"), -        ImportFormater([['towns', 'parcels__town']], # M, 13 +                       comment=u"Commune (si non définie avant)"), +        ImportFormater([['main_town', 'parcels__town']], # M, 13                         tf,                         required=False, -                       comment="Commune (si non définie avant)"), +                       comment=u"Commune (si non définie avant)"),          ImportFormater('saisine_type', # N, 14 -                        StrChoiceFormater(models.SaisineType.get_types(), -                                          model=models.SaisineType, cli=True), +                        TypeFormater(models.SaisineType),                          required=False, -                        comment="Type de saisine"), +                        comment=u"Type de saisine"),          None, # O, 15          ImportFormater('comment', # P, 16                         UnicodeFormater(2000), @@ -117,9 +146,9 @@ class FileImporterSraPdL(Importer):          None, # Q, 17          ImportFormater([                      'responsible_town_planning_service__raw_name', # R, 18 service instructeur -                    'responsible_town_planning_service__attached_to__address', -                    'responsible_town_planning_service__attached_to__postal_code', -                    'responsible_town_planning_service__attached_to__town',], +                    'responsible_town_planning_service__address', +                    'responsible_town_planning_service__postal_code', +                    'responsible_town_planning_service__town',],                      [UnicodeFormater(300, clean=True),                       UnicodeFormater(300, clean=True),                       UnicodeFormater(5, re_filter=RE_CD_POSTAL_FILTER), @@ -127,14 +156,14 @@ class FileImporterSraPdL(Importer):                                    town_dct=tf._town_dct)],                      regexp=RE_NAME_ADD_CD_POSTAL_TOWN,                      regexp_formater_args=[[0], [1], [2], [3, 2]], -                    comment="Aménageur - adresse", +                    comment=u"Aménageur - adresse",                      required=False),          ImportFormater('comment', # S, 19                         UnicodeFormater(2000),                         comment=u"Commentaire",                         concat=True, required=False),          ImportYearFormater('reception_date', # T, 20 -                       DateFormater(), +                       DateFormater(['%d/%m/%Y', '%d/%m/%Y']),                         comment=u"Date de création",                         required=False,                         duplicate_fields=['creation_date']), @@ -153,7 +182,7 @@ class FileImporterSraPdL(Importer):          None, # AG, 33          None, # AH, 34          ImportFormater('creation_date', # AI, 35 -                       DateFormater(), +                       DateFormater(['%d/%m/%Y', '%d/%m/%y']),                         force_value=True,                         comment=u"Date de création",                         required=False,), @@ -182,7 +211,7 @@ class FileImporterSraPdL(Importer):          ImportFormater('permit_reference', # AW, 49                         UnicodeFormater(300, clean=True),                         regexp=RE_PERMIT_REFERENCE, -                       comment="Réf. du permis de construire", +                       comment=u"Réf. du permis de construire",                         required=False),          None, # AX, 50          None, # AY, 51 @@ -191,10 +220,10 @@ class FileImporterSraPdL(Importer):          None, # BB, 54          None, # BC, 55          None, # BD, 56 -        ImportFormater([['towns', 'parcels__town']], # BE, 57 +        ImportFormater([['main_town', 'parcels__town']], # BE, 57                         TownINSEEFormater(),                         required=False, -                       comment="Commune (si non définie avant)"), +                       comment=u"Commune (si non définie avant)"),          ImportFormater('comment', # BF, 58                         UnicodeFormater(2000),                         comment=u"Commentaire", @@ -212,15 +241,11 @@ class FileImporterSraPdL(Importer):          None, # BQ, 69          None, # BR, 70          None, # BS, 71 -        ImportFormater( -                    'responsible_town_planning_service__attached_to__name', # BT, 72 service instructeur -                    UnicodeFormater(300, clean=True), -                    regexp=RE_ORGA, -                    comment="Service instructeur - nom", -                    required=False), +        None, # BT, 72          None, # BU, 73          ImportClosingFormater('', StrToBoolean(cli=True), -                              post_processing=True, required=False), # BV, 74, end date +                              post_processing=True, required=False, +                              comment=u'Dossier clos'), # BV, 74, end date          ImportClosingFormater('in_charge__raw_name', # BW, 75 responsable                         UnicodeFormater(200),                         comment=u"Responsable - nom brut", @@ -241,10 +266,9 @@ class FileImporterSraPdL(Importer):          None, # CE, 83          None, # CF, 84          ImportFormater('permit_type', -                        StrChoiceFormater(models.PermitType.get_types(), -                                          model=models.PermitType, cli=True), +                        TypeFormater(models.PermitType),                          required=False, -                        comment="Type de permis"), # CG, 85 +                        comment=u"Type de permis"), # CG, 85          None, # CH, 85          ] diff --git a/archaeological_files/ishtar_menu.py b/archaeological_files/ishtar_menu.py index fc0401115..df4946330 100644 --- a/archaeological_files/ishtar_menu.py +++ b/archaeological_files/ishtar_menu.py @@ -46,9 +46,13 @@ MENU_SECTIONS = [                      access_controls=['delete_file', 'delete_own_file']),                  SectionItem('admin_act_files', _(u"Administrative act"),              childs=[ +                MenuItem('file_administrativeactfile_search', +                         _(u"Search"), +                  model=AdministrativeAct, +                  access_controls=['change_file', 'change_own_file']),                  MenuItem('file_administrativeactfile',                           _(u"Add"), -                  model=Operation, +                  model=AdministrativeAct,                    access_controls=['change_file', 'change_own_file']),                  MenuItem('file_administrativeactfile_modification',                           _(u"Modification"), diff --git a/archaeological_files/locale/fr/LC_MESSAGES/django.po b/archaeological_files/locale/fr/LC_MESSAGES/django.po index c358ca579..c9c502d6e 100644 --- a/archaeological_files/locale/fr/LC_MESSAGES/django.po +++ b/archaeological_files/locale/fr/LC_MESSAGES/django.po @@ -1,15 +1,15 @@  # Ishtar po translation. -# Copyright (C) 2010-2015 +# Copyright (C) 2010-2014  # This file is distributed under the same license as the Ishtar package. -# Étienne Loks <etienne.loks at peacefrogs net>, 2010-2015. +# Étienne Loks <etienne.loks at peacefrogs net>, 2010-2014.  #  #, fuzzy  msgid ""  msgstr ""  "Project-Id-Version: alpha\n"  "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-24 23:33+0100\n" -"PO-Revision-Date: 2015-01-24\n" +"POT-Creation-Date: 2014-12-31 12:06+0100\n" +"PO-Revision-Date: 2010-12-09\n"  "Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n"  "Language-Team: \n"  "Language: \n" @@ -24,8 +24,8 @@ msgid "Choice for \"%s\" is not available. Which one is relevant?\n"  msgstr "Le choix pour \"%s\" n'est pas disponible. Lequel est pertinent ?\n"  #: forms.py:55 forms.py:188 forms.py:228 forms.py:339 forms.py:379 -#: models.py:70 templates/ishtar/sheet_file.html:98 -#: templates/ishtar/sheet_file.html:126 +#: models.py:70 templates/ishtar/sheet_file.html:105 +#: templates/ishtar/sheet_file.html:133  msgid "Year"  msgstr "Année" @@ -65,7 +65,7 @@ msgstr "Aménageur"  msgid "Organization of general contractor"  msgstr "Organisation de l'aménageur" -#: forms.py:80 forms.py:383 templates/ishtar/sheet_file.html:102 +#: forms.py:80 forms.py:383 templates/ishtar/sheet_file.html:109  msgid "In charge"  msgstr "Responsable" @@ -85,11 +85,11 @@ msgstr "Recherche de dossiers archéologiques"  msgid "You should select a file."  msgstr "Vous devez sélectionner un dossier archéologique." -#: forms.py:125 forms.py:197 models.py:98 +#: forms.py:125 forms.py:197 models.py:100  msgid "Creation date"  msgstr "Date de création" -#: forms.py:126 forms.py:269 models.py:100 +#: forms.py:126 forms.py:269 models.py:102  msgid "Reception date"  msgstr "Date de réception" @@ -113,7 +113,7 @@ msgstr "Date après"  msgid "Date before"  msgstr "Date avant" -#: forms.py:178 templates/ishtar/sheet_file.html:24 +#: forms.py:178 templates/ishtar/sheet_file.html:31  msgid "General"  msgstr "Général" @@ -125,23 +125,23 @@ msgstr "Responsable"  msgid "Name"  msgstr "Nom" -#: forms.py:200 models.py:102 +#: forms.py:200 models.py:104  msgid "Related file"  msgstr "Dossier en relation avec" -#: forms.py:204 forms.py:310 models.py:118 templates/ishtar/sheet_file.html:85 +#: forms.py:204 forms.py:310 models.py:122 templates/ishtar/sheet_file.html:92  msgid "Comment"  msgstr "Commentaire" -#: forms.py:208 models.py:109 +#: forms.py:208 models.py:113  msgid "Total surface (m²)"  msgstr "Surface totale des terrains (m²)" -#: forms.py:211 models.py:113 +#: forms.py:211 models.py:119  msgid "Main address"  msgstr "Adresse des terrains" -#: forms.py:212 models.py:114 +#: forms.py:212  msgid "Main address - complement"  msgstr "Adresse des terrains - complément" @@ -162,24 +162,24 @@ msgstr "Responsable au service instructeur"  msgid "Permit type"  msgstr "Type de permis" -#: forms.py:263 models.py:112 +#: forms.py:263 models.py:116  msgid "Total developed surface (m²)"  msgstr "Surface totale aménagée (m²)" -#: forms.py:280 templates/ishtar/sheet_file.html:75 +#: forms.py:280 templates/ishtar/sheet_file.html:82  #: templates/ishtar/dashboards/dashboard_file.html:42  msgid "Research archaeology"  msgstr "Archéologie programmée" -#: forms.py:288 models.py:121 templates/ishtar/sheet_file.html:76 +#: forms.py:288 models.py:125 templates/ishtar/sheet_file.html:83  msgid "Departments"  msgstr "Départements" -#: forms.py:298 models.py:133 +#: forms.py:298 models.py:137  msgid "Scientist in charge"  msgstr "Responsable scientifique" -#: forms.py:300 models.py:126 templates/ishtar/sheet_file.html:78 +#: forms.py:300 models.py:130 templates/ishtar/sheet_file.html:85  msgid "Requested operation type"  msgstr "Type d'opération demandée" @@ -187,21 +187,21 @@ msgstr "Type d'opération demandée"  msgid "Lead organization"  msgstr "Organisation porteuse du projet" -#: forms.py:319 models.py:137 templates/ishtar/sheet_file.html:83 +#: forms.py:319 models.py:141 templates/ishtar/sheet_file.html:90  msgid "Classified area"  msgstr "Au sein d'un site classé" -#: forms.py:321 models.py:139 templates/ishtar/sheet_file.html:84 +#: forms.py:321 models.py:143 templates/ishtar/sheet_file.html:91  msgid "Protected area"  msgstr "Au sein d'un secteur sauvegardé"  #: forms.py:332  msgid "Would you like to close this archaeological file?" -msgstr "Voulez-vous clore ce dossier archéologique ?" +msgstr "Voulez vous clore ce dossier archéologique ?"  #: forms.py:336  msgid "Would you like to delete this archaelogical file ?" -msgstr "Voulez-vous supprimer ce dossier archéologique ?" +msgstr "Voulez vous supprimer ce dossier archéologique ?"  #: forms.py:340  msgid "Index" @@ -219,7 +219,7 @@ msgstr "Date de signature après"  msgid "Signature date before"  msgstr "Date de signature avant" -#: ishtar_menu.py:30 models.py:154 templates/ishtar/sheet_file.html:6 +#: ishtar_menu.py:30 models.py:158 templates/ishtar/sheet_file.html:6  msgid "Archaeological file"  msgstr "Dossier" @@ -237,7 +237,7 @@ msgstr "Modification"  #: ishtar_menu.py:41  msgid "Closing" -msgstr "Clôture" +msgstr "Clotûre"  #: ishtar_menu.py:44 ishtar_menu.py:58  msgid "Deletion" @@ -263,7 +263,7 @@ msgstr "Tableau de bord"  msgid "General informations"  msgstr "Informations générales" -#: ishtar_menu.py:73 models.py:155 +#: ishtar_menu.py:73 models.py:159  #: templates/ishtar/dashboards/dashboard_file.html:8  msgid "Archaeological files"  msgstr "Dossiers archéologiques" @@ -282,7 +282,7 @@ msgstr "Types de permis"  #: models.py:60  msgid "Delay (in days)" -msgstr "Délai (en jours)" +msgstr "Delai (en jours)"  #: models.py:74  msgid "Internal reference" @@ -290,113 +290,125 @@ msgstr "Référence interne"  #: models.py:95  msgid "Closing date" -msgstr "Date de clôture" +msgstr "Date de clotûre"  #: models.py:96 +msgid "Town" +msgstr "Commune" + +#: models.py:98  msgid "Towns"  msgstr "Communes" -#: models.py:107 +#: models.py:109  msgid "Ref. number"  msgstr "Réf. numérique" -#: models.py:116 +#: models.py:111 +msgid "Instruction deadline" +msgstr "Date limite d'instruction" + +#: models.py:117 +msgid "Locality" +msgstr "Lieu-dit" + +#: models.py:120  msgid "Main address - postal code"  msgstr "Adresse des terrains - code postal" -#: models.py:128 templates/ishtar/sheet_file.html:79 +#: models.py:132 templates/ishtar/sheet_file.html:86  msgid "Organization"  msgstr "Organisation" -#: models.py:134 +#: models.py:138  msgid "Research archaeology comment"  msgstr "Commentaire archéologie programmée" -#: models.py:148 +#: models.py:152  msgid "Cached name"  msgstr "Nom en cache" -#: models.py:150 +#: models.py:154  msgid "Imported line"  msgstr "Ligne importée" -#: models.py:157 +#: models.py:161  msgid "Can view all Archaelogical file" -msgstr "Peut voir tous les dossiers archéologiques" +msgstr "Peut voir tous les dossier archéologique" -#: models.py:158 +#: models.py:162  msgid "Can view own Archaelogical file"  msgstr "Peut voir son propre Dossier" -#: models.py:159 +#: models.py:163  msgid "Can add own Archaelogical file"  msgstr "Peut ajouter son propre Dossier" -#: models.py:160 +#: models.py:164  msgid "Can change own Archaelogical file"  msgstr "Peut changer son propre Dossier" -#: models.py:161 +#: models.py:165  msgid "Can delete own Archaelogical file"  msgstr "Peut supprimer son propre Dossier" -#: models.py:162 +#: models.py:166  msgid "Can close File"  msgstr "Peut fermer un dossier" -#: models.py:168 +#: models.py:172  msgid "FILE"  msgstr "DOSSIER" -#: models.py:270 +#: models.py:274  msgid "Intercommunal"  msgstr "Intercommunal" -#: models.py:334 +#: models.py:340  msgid "File"  msgstr "Dossier" -#: models.py:335 +#: models.py:341  msgid "Department"  msgstr "Département" -#: views.py:121 +#: views.py:130  msgid "File search"  msgstr "Recherche de dossier archéologique" -#: views.py:131 +#: views.py:140  msgid "New file"  msgstr "Nouveau dossier archéologique" -#: views.py:150 +#: views.py:159  msgid "File modification"  msgstr "Modification de dossier archéologique" -#: views.py:172 +#: views.py:181  msgid "File closing" -msgstr "Clôture de dossier" +msgstr "Clotûre de dossier" -#: views.py:179 +#: views.py:188  msgid "File deletion"  msgstr "Suppression de dossier archéologique" -#: views.py:187 +#: views.py:196  msgid "File: new administrative act"  msgstr "Dossier : nouvel acte administratif" -#: views.py:197 +#: views.py:206  msgid "File: administrative act modification"  msgstr "Dossier : modification d'acte administratif" -#: views.py:206 +#: views.py:215  msgid "File: administrative act deletion"  msgstr "Dossier : suppression acte administratif" -#: wizards.py:139 templates/ishtar/sheet_file.html:96 +#: wizards.py:145 templates/ishtar/sheet_file.html:103  msgid "Associated operations"  msgstr "Opérations associées" -#: wizards.py:165 wizards.py:175 +#: wizards.py:171 wizards.py:181  msgid "Archaelogical file"  msgstr "Dossier" @@ -418,7 +430,7 @@ msgstr "Version précédente"  #: templates/ishtar/sheet_file.html:17  msgid "Are you sure to rollback to this version?" -msgstr "Êtes-vous sûr de vouloir revenir à cette version ?" +msgstr "Êtes vous sûr de vouloir revenir à cette version ?"  #: templates/ishtar/sheet_file.html:18  msgid "Next version" @@ -436,186 +448,190 @@ msgstr "Fichier OpenOffice.org"  msgid "PDF file"  msgstr "Fichier PDF" -#: templates/ishtar/sheet_file.html:23 +#: templates/ishtar/sheet_file.html:24  msgid "Modify"  msgstr "Modifier" -#: templates/ishtar/sheet_file.html:25 +#: templates/ishtar/sheet_file.html:27 +msgid "Add an associated archaeological operation" +msgstr "Ajouter une opération archéologique associée à ce dossier" + +#: templates/ishtar/sheet_file.html:32  msgid "Year:"  msgstr "Année :" -#: templates/ishtar/sheet_file.html:26 +#: templates/ishtar/sheet_file.html:33  msgid "Numerical reference:"  msgstr "Référence numérique :" -#: templates/ishtar/sheet_file.html:27 +#: templates/ishtar/sheet_file.html:34  msgid "Other reference:"  msgstr "Autre référence :" -#: templates/ishtar/sheet_file.html:29 +#: templates/ishtar/sheet_file.html:36  msgid "Name:"  msgstr "Nom :" -#: templates/ishtar/sheet_file.html:31 +#: templates/ishtar/sheet_file.html:38  msgid "Edition date:"  msgstr "Date d'édition :" -#: templates/ishtar/sheet_file.html:32 +#: templates/ishtar/sheet_file.html:39  msgid "Reception date:"  msgstr "Date de réception :" -#: templates/ishtar/sheet_file.html:33 +#: templates/ishtar/sheet_file.html:40  msgid "Creation date:"  msgstr "Date de création :" -#: templates/ishtar/sheet_file.html:34 +#: templates/ishtar/sheet_file.html:41  msgid "Created by:"  msgstr "Créé par :" -#: templates/ishtar/sheet_file.html:41 +#: templates/ishtar/sheet_file.html:48  msgid "In charge:"  msgstr "Responsable :" -#: templates/ishtar/sheet_file.html:42 +#: templates/ishtar/sheet_file.html:49  msgid "State:"  msgstr "État :" -#: templates/ishtar/sheet_file.html:42 +#: templates/ishtar/sheet_file.html:49  msgid "Active file"  msgstr "Dossier actif" -#: templates/ishtar/sheet_file.html:43 +#: templates/ishtar/sheet_file.html:50  msgid "Closed file"  msgstr "Dossier fermé" -#: templates/ishtar/sheet_file.html:44 +#: templates/ishtar/sheet_file.html:51  msgid "Closing date:" -msgstr "Date de clôture :" +msgstr "Date de clotûre :" -#: templates/ishtar/sheet_file.html:44 +#: templates/ishtar/sheet_file.html:51  msgid "by"  msgstr "par" -#: templates/ishtar/sheet_file.html:47 +#: templates/ishtar/sheet_file.html:54  msgid "Type:"  msgstr "Type :" -#: templates/ishtar/sheet_file.html:49 +#: templates/ishtar/sheet_file.html:56  msgid "Related file:"  msgstr "Dossier en relation avec :" -#: templates/ishtar/sheet_file.html:50 +#: templates/ishtar/sheet_file.html:57  msgid "Comment:"  msgstr "Commentaire :" -#: templates/ishtar/sheet_file.html:52 +#: templates/ishtar/sheet_file.html:59  msgid "Localisation"  msgstr "Localisation" -#: templates/ishtar/sheet_file.html:53 +#: templates/ishtar/sheet_file.html:60  msgid "Towns:"  msgstr "Communes :" -#: templates/ishtar/sheet_file.html:55 +#: templates/ishtar/sheet_file.html:62  msgid "Main address:"  msgstr "Adresse principale :" -#: templates/ishtar/sheet_file.html:56 +#: templates/ishtar/sheet_file.html:63  msgid "Complement:"  msgstr "Complément :" -#: templates/ishtar/sheet_file.html:57 +#: templates/ishtar/sheet_file.html:64  msgid "Postal code:"  msgstr "Code postal :" -#: templates/ishtar/sheet_file.html:59 +#: templates/ishtar/sheet_file.html:66  msgid "Surface:"  msgstr "Surface :" -#: templates/ishtar/sheet_file.html:64 +#: templates/ishtar/sheet_file.html:71  msgid "Preventive archaelogical file"  msgstr "Dossier d'archéologie préventive" -#: templates/ishtar/sheet_file.html:65 +#: templates/ishtar/sheet_file.html:72  msgid "Developed surface:"  msgstr "Surface aménagée :" -#: templates/ishtar/sheet_file.html:66 +#: templates/ishtar/sheet_file.html:73  msgid "Saisine type:"  msgstr "Type de saisine :" -#: templates/ishtar/sheet_file.html:67 +#: templates/ishtar/sheet_file.html:74  msgid "Town planning service:"  msgstr "Service instructeur :" -#: templates/ishtar/sheet_file.html:68 +#: templates/ishtar/sheet_file.html:75  msgid "Permit type:"  msgstr "Type de permis :" -#: templates/ishtar/sheet_file.html:69 +#: templates/ishtar/sheet_file.html:76  msgid "Permit reference:"  msgstr "Référence du permis :" -#: templates/ishtar/sheet_file.html:70 +#: templates/ishtar/sheet_file.html:77  msgid "General contractor organisation:" -msgstr "Aménageur (organisation) :" +msgstr "Aménageur (organiation) :" -#: templates/ishtar/sheet_file.html:71 +#: templates/ishtar/sheet_file.html:78  msgid "General contractor:"  msgstr "Aménageur :" -#: templates/ishtar/sheet_file.html:76 templates/ishtar/sheet_file.html:77 -#: templates/ishtar/sheet_file.html:78 templates/ishtar/sheet_file.html:79 -#: templates/ishtar/sheet_file.html:85 +#: templates/ishtar/sheet_file.html:83 templates/ishtar/sheet_file.html:84 +#: templates/ishtar/sheet_file.html:85 templates/ishtar/sheet_file.html:86 +#: templates/ishtar/sheet_file.html:92  #: templates/ishtar/dashboards/dashboard_file.html:14  msgid ":"  msgstr " :" -#: templates/ishtar/sheet_file.html:77 +#: templates/ishtar/sheet_file.html:84  msgid "Head scientist"  msgstr "Responsable scientifique" -#: templates/ishtar/sheet_file.html:89 +#: templates/ishtar/sheet_file.html:96  msgid "Associated parcels"  msgstr "Opérations associées" -#: templates/ishtar/sheet_file.html:92 +#: templates/ishtar/sheet_file.html:99  msgid "Administrativ acts" -msgstr "Actes administratifs" +msgstr "Actes administratif" -#: templates/ishtar/sheet_file.html:99 templates/ishtar/sheet_file.html:127 +#: templates/ishtar/sheet_file.html:106 templates/ishtar/sheet_file.html:134  msgid "Ref."  msgstr "Ref." -#: templates/ishtar/sheet_file.html:101 templates/ishtar/sheet_file.html:128 +#: templates/ishtar/sheet_file.html:108 templates/ishtar/sheet_file.html:135  msgid "Type"  msgstr "Type" -#: templates/ishtar/sheet_file.html:103 +#: templates/ishtar/sheet_file.html:110  msgid "Start date"  msgstr "Date de début" -#: templates/ishtar/sheet_file.html:104 +#: templates/ishtar/sheet_file.html:111  msgid "Excavation end date"  msgstr "Date de fin de chantier" -#: templates/ishtar/sheet_file.html:116 +#: templates/ishtar/sheet_file.html:123  msgid "Details"  msgstr "Détails" -#: templates/ishtar/sheet_file.html:119 +#: templates/ishtar/sheet_file.html:126  msgid "No operation associated to this archaelogical file"  msgstr "Pas d'opération associée à ce dossier archéologique" -#: templates/ishtar/sheet_file.html:124 +#: templates/ishtar/sheet_file.html:131  msgid "Admninistrative acts linked to associated operations" -msgstr "Actes administratifs associés à ces opérations" +msgstr "Actes administratifs associé à ces opérations" -#: templates/ishtar/sheet_file.html:129 +#: templates/ishtar/sheet_file.html:136  msgid "Date"  msgstr "Date" -#: templates/ishtar/sheet_file.html:139 +#: templates/ishtar/sheet_file.html:146  msgid "No administrative act linked to operations"  msgstr "Pas d'acte administratif associé à ces opérations" @@ -697,9 +713,6 @@ msgstr "Principales communes en surface (ha)"  #~ msgid "Creation date before"  #~ msgstr "Date de création avant" -#~ msgid "Town" -#~ msgstr "Commune" -  #~ msgid "Section"  #~ msgstr "Section" diff --git a/archaeological_files/migrations/0021_auto__chg_field_saisinetype_txt_idx__chg_field_filetype_txt_idx__del_f.py b/archaeological_files/migrations/0021_auto__chg_field_saisinetype_txt_idx__chg_field_filetype_txt_idx__del_f.py new file mode 100644 index 000000000..f68da341d --- /dev/null +++ b/archaeological_files/migrations/0021_auto__chg_field_saisinetype_txt_idx__chg_field_filetype_txt_idx__del_f.py @@ -0,0 +1,442 @@ +# -*- 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): + +        for file in orm['archaeological_files.File'].objects.all(): +            if file.towns.count() == 1: +                file.main_town = file.towns.all()[0] +                file.save() + +        for file in orm['archaeological_files.File'].objects.all(): +            address_comp = file.address_complement.strip() +            if not address_comp: +                continue +            address = file.address.strip() +            if address: +                address += """ +""" +            address += address_comp +            file.address = address +            file.save() + +        # Changing field 'SaisineType.txt_idx' +        db.alter_column('archaeological_files_saisinetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'FileType.txt_idx' +        db.alter_column('archaeological_files_filetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) +        # Deleting field 'File.address_complement' +        db.delete_column('archaeological_files_file', 'address_complement') + +        # Adding field 'File.raw_general_contractor' +        db.add_column('archaeological_files_file', 'raw_general_contractor', +                      self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), +                      keep_default=False) + +        # Adding field 'File.raw_town_planning_service' +        db.add_column('archaeological_files_file', 'raw_town_planning_service', +                      self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), +                      keep_default=False) + +        # Adding field 'File.main_town' +        db.add_column('archaeological_files_file', 'main_town', +                      self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='file_main', null=True, to=orm['ishtar_common.Town']), +                      keep_default=False) + +        # Adding field 'File.instruction_deadline' +        db.add_column('archaeological_files_file', 'instruction_deadline', +                      self.gf('django.db.models.fields.DateField')(null=True, blank=True), +                      keep_default=False) + +        # Adding field 'File.locality' +        db.add_column('archaeological_files_file', 'locality', +                      self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True), +                      keep_default=False) + +        # Deleting field 'HistoricalFile.address_complement' +        db.delete_column('archaeological_files_historicalfile', 'address_complement') + +        # Adding field 'HistoricalFile.raw_general_contractor' +        db.add_column('archaeological_files_historicalfile', 'raw_general_contractor', +                      self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), +                      keep_default=False) + +        # Adding field 'HistoricalFile.raw_town_planning_service' +        db.add_column('archaeological_files_historicalfile', 'raw_town_planning_service', +                      self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True), +                      keep_default=False) + +        # Adding field 'HistoricalFile.main_town_id' +        db.add_column('archaeological_files_historicalfile', 'main_town_id', +                      self.gf('django.db.models.fields.IntegerField')(db_index=True, null=True, blank=True), +                      keep_default=False) + +        # Adding field 'HistoricalFile.instruction_deadline' +        db.add_column('archaeological_files_historicalfile', 'instruction_deadline', +                      self.gf('django.db.models.fields.DateField')(null=True, blank=True), +                      keep_default=False) + +        # Adding field 'HistoricalFile.locality' +        db.add_column('archaeological_files_historicalfile', 'locality', +                      self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True), +                      keep_default=False) + + +        # Changing field 'PermitType.txt_idx' +        db.alter_column('archaeological_files_permittype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): + +        # Changing field 'SaisineType.txt_idx' +        db.alter_column('archaeological_files_saisinetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'FileType.txt_idx' +        db.alter_column('archaeological_files_filetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) +        # Adding field 'File.address_complement' +        db.add_column('archaeological_files_file', 'address_complement', +                      self.gf('django.db.models.fields.TextField')(null=True, blank=True), +                      keep_default=False) + +        # Deleting field 'File.raw_general_contractor' +        db.delete_column('archaeological_files_file', 'raw_general_contractor') + +        # Deleting field 'File.raw_town_planning_service' +        db.delete_column('archaeological_files_file', 'raw_town_planning_service') + +        # Deleting field 'File.main_town' +        db.delete_column('archaeological_files_file', 'main_town_id') + +        # Deleting field 'File.instruction_deadline' +        db.delete_column('archaeological_files_file', 'instruction_deadline') + +        # Deleting field 'File.locality' +        db.delete_column('archaeological_files_file', 'locality') + +        # Adding field 'HistoricalFile.address_complement' +        db.add_column('archaeological_files_historicalfile', 'address_complement', +                      self.gf('django.db.models.fields.TextField')(null=True, blank=True), +                      keep_default=False) + +        # Deleting field 'HistoricalFile.raw_general_contractor' +        db.delete_column('archaeological_files_historicalfile', 'raw_general_contractor') + +        # Deleting field 'HistoricalFile.raw_town_planning_service' +        db.delete_column('archaeological_files_historicalfile', 'raw_town_planning_service') + +        # Deleting field 'HistoricalFile.main_town_id' +        db.delete_column('archaeological_files_historicalfile', 'main_town_id') + +        # Deleting field 'HistoricalFile.instruction_deadline' +        db.delete_column('archaeological_files_historicalfile', 'instruction_deadline') + +        # Deleting field 'HistoricalFile.locality' +        db.delete_column('archaeological_files_historicalfile', 'locality') + + +        # Changing field 'PermitType.txt_idx' +        db.alter_column('archaeological_files_permittype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'archaeological_files.file': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'File'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_advised': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'classified_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'departments': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'file_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.FileType']"}), +            'general_contractor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'general_contractor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_line': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_files_file'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'instruction_deadline': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'locality': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'main_town': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_main'", 'null': 'True', 'to': "orm['ishtar_common.Town']"}), +            'mh_listing': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'mh_register': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'numeric_reference': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'permit_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'permit_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.PermitType']", 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'protected_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'raw_general_contractor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'raw_town_planning_service': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'related_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.File']", 'null': 'True', 'blank': 'True'}), +            'requested_operation_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_operations.OperationType']"}), +            'research_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'responsible_town_planning_service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'responsible_town_planning_service'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'saisine_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.SaisineType']", 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'total_developed_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'total_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'file'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'default': '2015'}) +        }, +        'archaeological_files.filebydepartment': { +            'Meta': {'object_name': 'FileByDepartment', 'db_table': "'file_department'", 'managed': 'False'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.File']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) +        }, +        'archaeological_files.filetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'FileType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.historicalfile': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalFile'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_advised': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'classified_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'file_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'general_contractor_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'imported_line': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'in_charge_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'instruction_deadline': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'locality': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'main_town_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'mh_listing': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'mh_register': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'numeric_reference': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'organization_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'permit_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'permit_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'protected_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'raw_general_contractor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'raw_town_planning_service': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'related_file_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'requested_operation_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'research_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'responsible_town_planning_service_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'saisine_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'scientist_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'total_developed_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'total_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'year': ('django.db.models.fields.IntegerField', [], {'default': '2015'}) +        }, +        'archaeological_files.permittype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PermitType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.saisinetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'SaisineType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'delay': ('django.db.models.fields.IntegerField', [], {'default': '30'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.operationtype': { +            'Meta': {'ordering': "['-preventive', 'order', 'label']", 'object_name': 'OperationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preventive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.arrondissement': { +            'Meta': {'object_name': 'Arrondissement'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.canton': { +            'Meta': {'object_name': 'Canton'}, +            'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.department': { +            'Meta': {'ordering': "['number']", 'object_name': 'Department'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}), +            'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.state': { +            'Meta': {'ordering': "['number']", 'object_name': 'State'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) +        }, +        'ishtar_common.town': { +            'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, +            'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), +            'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), +            'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        } +    } + +    complete_apps = ['archaeological_files'] diff --git a/archaeological_files/models.py b/archaeological_files/models.py index a1b42f722..2b0b299ec 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -46,7 +46,7 @@ class FileType(GeneralType):          try:              preventive = FileType.objects.get(txt_idx=key).pk              return file_type_id == preventive -        except ObjectDoesNotExist: +        except FileType.DoesNotExist:              return False  class PermitType(GeneralType): @@ -57,7 +57,7 @@ class PermitType(GeneralType):  if settings.COUNTRY == 'fr':      class SaisineType(GeneralType, ValueGetter): -        delay = models.IntegerField(_(u"Delay (in days)")) +        delay = models.IntegerField(_(u"Delay (in days)"), default=30)          class Meta:              verbose_name = u"Type Saisine"              verbose_name_plural = u"Types Saisine" @@ -83,16 +83,23 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,                 related_name='general_contractor',                 verbose_name=_(u"General contractor"), blank=True, null=True,                 on_delete=models.SET_NULL,) # aménageur +    raw_general_contractor = models.CharField(_(u"General contractor (raw)"), +                                        max_length=200, blank=True, null=True)      responsible_town_planning_service = models.ForeignKey(Person,                 related_name='responsible_town_planning_service',                 blank=True, null=True,                 verbose_name=_(u"Responsible for town planning service"),                 on_delete=models.SET_NULL,) # service instructeur +    raw_town_planning_service = models.CharField( +                        _(u"Town planning service (raw)"), max_length=200, +                        blank=True, null=True)      permit_type = models.ForeignKey(PermitType, verbose_name=_(u"Permit type"),                                                            blank=True, null=True)      permit_reference = models.CharField(_(u"Permit reference"),                                            max_length=60, blank=True, null=True)      end_date = models.DateField(_(u"Closing date"), null=True, blank=True) +    main_town = models.ForeignKey(Town, verbose_name=_(u"Town"), null=True, +                                  blank=True, related_name='file_main')      towns = models.ManyToManyField(Town, verbose_name=_(u"Towns"),                                     related_name='file')      creation_date = models.DateField(_(u"Creation date"), @@ -106,13 +113,15 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,                                           verbose_name= u"Type de saisine")          reference_number = models.IntegerField(_(u"Ref. number"),                                                 blank=True, null=True) +        instruction_deadline = models.DateField(_(u'Instruction deadline'), +                                                blank=True, null=True)      total_surface = models.IntegerField(_(u"Total surface (m²)"),                                          blank=True, null=True)      total_developed_surface = models.IntegerField(              _(u"Total developed surface (m²)"), blank=True, null=True) +    locality = models.CharField(_(u"Locality"), +                                max_length=100, null=True, blank=True)      address = models.TextField(_(u"Main address"), null=True, blank=True) -    address_complement = models.TextField(_(u"Main address - complement"), -                                          null=True, blank=True)      postal_code = models.CharField(_(u"Main address - postal code"),                                     max_length=10, null=True, blank=True)      comment = models.TextField(_(u"Comment"), null=True, blank=True) @@ -253,7 +262,7 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,      @property      def reference(self): -        return u"-".join((unicode(self.year), +        return settings.FILE_PREFIX+u"-".join((unicode(self.year),                            unicode(self.numeric_reference or '0')))      def _generate_cached_label(self): @@ -268,7 +277,9 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,      def get_town_label(self):          lbl = unicode(_('Intercommunal')) -        if self.towns.count() == 1: +        if self.main_town: +            lbl = self.main_town.name +        elif self.towns.count() == 1:              lbl = self.towns.all()[0].name          return lbl @@ -315,8 +326,43 @@ class File(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,                  acts.append(act)          return acts +    def update_raw_town_planning_service(self): +        if (self.raw_town_planning_service and not \ +           self.responsible_town_planning_service) or \ +           not self.responsible_town_planning_service: +            return False +        current_lbl = "" +        if self.raw_town_planning_service: +            current_lbl = self.raw_town_planning_service[:] +        lbl = unicode(self.responsible_town_planning_service) +        if not lbl: +            return False +        self.raw_town_planning_service = lbl[:200] +        return current_lbl != self.raw_town_planning_service + +    def update_raw_general_contractor(self): +        if (self.raw_general_contractor and not \ +           self.general_contractor) or \ +           not self.general_contractor: +            return False +        current_lbl = "" +        if self.raw_general_contractor: +            current_lbl = self.raw_general_contractor[:] +        lbl = unicode(self.general_contractor) +        if not lbl: +            return False +        self.raw_general_contractor = lbl[:200] +        return current_lbl != self.raw_general_contractor + +      def save(self, *args, **kwargs):          returned = super(File, self).save(*args, **kwargs) +        if self.main_town and not self.main_town in list(self.towns.all()): +            self.towns.add(self.main_town) +        updated = self.update_raw_town_planning_service() +        updated += self.update_raw_general_contractor() +        if updated: +            self.save()          self.update_delay_date()          self.update_short_menu_class()          return returned diff --git a/archaeological_files/templates/ishtar/sheet_file.html b/archaeological_files/templates/ishtar/sheet_file.html index 11a90df9e..2d7b6262d 100644 --- a/archaeological_files/templates/ishtar/sheet_file.html +++ b/archaeological_files/templates/ishtar/sheet_file.html @@ -20,7 +20,14 @@  </div>  {% endif %}  <div class='tool'>{%trans "Export as:"%} <a href='{% url show-file item.pk "odt" %}'>{%trans "OpenOffice.org file"%}</a>, <a href='{% url show-file item.pk "pdf" %}'>{%trans "PDF file"%}</a></div> +<hr/>  <div class='tool modify'><a href='{% url file_modify item.pk %}'>{% trans "Modify" %}</a></div> + +{% if can_add_operation %} +<div class='tool modify'><a href='{% url operation_add item.pk %}'>{%trans "Add an associated archaeological operation"%}</a></div> + +{%endif%} +  <h3>{% trans "General"%}</h3>  <p><label>{%trans "Year:"%}</label> <span class='value strong'>{{ item.year }}</span></p>  {% if item.numeric_reference %}<p><label>{%trans "Numerical reference:"%}</label> <span class='value strong'>{{ item.numeric_reference }}</span></p>{% endif %} @@ -95,7 +102,6 @@  <table>    <caption>{%trans "Associated operations"%}</caption>    <tr> -    <th>{% trans "Year" %}</th>      <th>{% trans "Ref." %}</th>      <th>Code Patriarche</th>      <th>{% trans "Type" %}</th> @@ -106,9 +112,8 @@    </tr>    {% for operation in item.operations.all %}    <tr> -    <td>{{operation.year}}</td> -    <td>{{operation.operation_code}}</td> -    <td>{{operation.code_patriarche|default:""}}</td> +    <td>{{operation.year_index}}</td> +    <td>{{operation.full_code_patriarche|default:""}}</td>      <td class='string'>{{operation.operation_type}}</td>      <td class='string'>{{operation.in_charge|default:""}}</td>      <td>{{operation.start_date|default:""}}</td> diff --git a/archaeological_files/urls.py b/archaeological_files/urls.py index 694cb1791..f7f5cc7d5 100644 --- a/archaeological_files/urls.py +++ b/archaeological_files/urls.py @@ -23,6 +23,9 @@ import views  # forms:  urlpatterns = patterns('', +       url(r'file_administrativeactfile_search/(?P<step>.+)?$', +           views.file_administrativeactfile_search_wizard, +           name='file_administrativeactfile_search'),         url(r'file_administrativeactfile/(?P<step>.+)?$',             views.file_administrativeactfile_wizard,             name='file_administrativeactfile'), diff --git a/archaeological_files/views.py b/archaeological_files/views.py index ba640a785..942ee6ae3 100644 --- a/archaeological_files/views.py +++ b/archaeological_files/views.py @@ -28,6 +28,7 @@ from django.utils.translation import ugettext_lazy as _  from ishtar_common.views import get_item, show_item, revert_item  from ishtar_common.models import Person +from archaeological_operations.models import Operation  import models  from ishtar_common.wizards import SearchWizard @@ -85,9 +86,17 @@ get_file = get_item(models.File, 'get_file', 'file',          'general_contractor__attached_to':'general_contractor__attached_to__pk',          'history_creator':'history_creator__ishtaruser__person__pk',              },) -show_file = show_item(models.File, 'file')  revert_file = revert_item(models.File) +def extra_file_dct(request, item): +    dct = {} +    if (request.user.has_perm('ishtar_common.add_operation', Operation) +       or request.user.ishtaruser.has_right('add_operation')): +        dct['can_add_operation'] = True +    return dct + +show_file = show_item(models.File, 'file', extra_dct=extra_file_dct) +  get_administrativeactfile = get_item(AdministrativeAct,          'get_administrativeactfile', 'administrativeactfile',        associated_models = [(models.File, 'associated_file'), @@ -179,6 +188,12 @@ file_deletion_wizard = FileDeletionWizard.as_view([                        label=_(u"File deletion"),                        url_name='file_deletion',) +file_administrativeactfile_search_wizard = SearchWizard.as_view([ +       ('selec-file_administrativeactfile_search', +                                 AdministrativeActFileFormSelection)], +       label=_(u"File: search administrative act"), +       url_name='file_administrativeactfile_search',) +  file_administrativeactfile_wizard = FileAdministrativeActWizard.as_view([         ('selec-file_administrativeactfile', FileFormSelection),         ('administrativeact-file_administrativeactfile', @@ -206,3 +221,16 @@ file_administrativeactfile_deletion_wizard = \                        label=_(u"File: administrative act deletion"),                        url_name='file_administrativeactfile_deletion',) +def reset_wizards(request): +    for wizard_class, url_name in ( +            (FileWizard, 'file_creation'), +            (FileModificationWizard, 'file_modification'), +            (FileClosingWizard, 'file_modification'), +            (FileDeletionWizard, 'file_deletion'), +            (FileAdministrativeActWizard, 'file_administrativeactfile'), +            (FileEditAdministrativeActWizard, +                        'file_administrativeactfile_modification_wizard'), +            (AdministrativeActDeletionWizard, +                        'file_administrativeactfile_deletion_wizard'), +        ): +        wizard_class.session_reset(request, url_name) diff --git a/archaeological_files/wizards.py b/archaeological_files/wizards.py index 4ad947641..3ccd6e3d9 100644 --- a/archaeological_files/wizards.py +++ b/archaeological_files/wizards.py @@ -38,8 +38,10 @@ class FileWizard(OperationWizard):      model = models.File      object_parcel_type = 'associated_file'      parcel_step_key = 'parcels-' +    town_step_keys = ['towns-']      wizard_done_window = reverse_lazy('show-file') +    '''      def get_form(self, step=None, data=None, files=None):          """          Manage towns @@ -53,8 +55,10 @@ class FileWizard(OperationWizard):              # step = self.determine_step(request, storage)              step = self.steps.current          form = self.get_form_list()[step] -        town_form_key = 'towns-' + self.url_name -        if step.startswith('parcels-') and hasattr(form, 'management_form') \ +        town_form_key = self.town_step_key +        town_form_key += self.url_name +        if step.startswith(self.parcel_step_key) \ +           and hasattr(form, 'management_form') \             and self.session_has_key(town_form_key):              towns = []              qdict = self.request.session[self.storage.prefix]['step_data']\ @@ -68,7 +72,9 @@ class FileWizard(OperationWizard):                          pass              data['TOWNS'] = sorted(towns, key=lambda x:x[1])          form = super(FileWizard, self).get_form(step, data, files) +        """          return form +    '''      def get_extra_model(self, dct, form_list):          dct = super(FileWizard, self).get_extra_model(dct, form_list) diff --git a/archaeological_files_pdl/forms.py b/archaeological_files_pdl/forms.py index 87221f24c..53d473b96 100644 --- a/archaeological_files_pdl/forms.py +++ b/archaeological_files_pdl/forms.py @@ -21,20 +21,22 @@ import datetime  from django import forms  from django.core import validators +from django.utils.safestring import mark_safe  from django.utils.translation import ugettext_lazy as _ -from ishtar_common.models import Person +from ishtar_common.models import Person, PersonType, valid_id  from archaeological_files import models -from ishtar_common.forms import get_now +from ishtar_common.forms import get_now, reverse_lazy +from ishtar_common.forms_common import get_advanced_town_field +from archaeological_files.forms import GENERAL_CONTRACTOR, \ +                                       RESPONSIBLE_PLANNING_SERVICE  from ishtar_common import widgets  class FileFormGeneral(forms.Form):      form_label = _("General") -    associated_models = {'in_charge':Person, -                         'related_file':models.File, -                         'file_type':models.FileType} +    associated_models = {'file_type':models.FileType}      file_type = forms.ChoiceField(label=_("File type"), choices=[])      year = forms.IntegerField(label=_("Year"),                                initial=lambda:datetime.datetime.now().year, @@ -43,9 +45,203 @@ class FileFormGeneral(forms.Form):      creation_date = forms.DateField(label=_(u"Creation date"),                                      initial=get_now, widget=widgets.JQueryDate)      reception_date = forms.DateField(label=_(u"Reception date"), -                                    initial=get_now, widget=widgets.JQueryDate) +                                     widget=widgets.JQueryDate)      def __init__(self, *args, **kwargs):          super(FileFormGeneral, self).__init__(*args, **kwargs)          self.fields['file_type'].choices = models.FileType.get_types()          self.fields['file_type'].help_text = models.FileType.get_help() + +class FileFormPreventiveType(forms.Form): +    form_label = u"Saisine" +    associated_models = {'saisine_type':models.SaisineType, +                         'permit_type':models.PermitType} +    permit_type = forms.ChoiceField(label=_(u"Permit type"), required=False, +                                    choices=[]) +    saisine_type = forms.ChoiceField(label=_(u"Saisine type"), +                                     choices=[]) +    def __init__(self, *args, **kwargs): +        super(FileFormPreventiveType, self).__init__(*args, **kwargs) +        self.fields['saisine_type'].choices = models.SaisineType.get_types() +        self.fields['saisine_type'].help_text = models.SaisineType.get_help() +        self.fields['permit_type'].choices = models.PermitType.get_types( +                                                              default='NP') +        self.fields['permit_type'].help_text = models.PermitType.get_help() + +class FileFormPlanning(forms.Form): +    form_label = _(u"Planning") +    associated_models = {'main_town':models.Town} +    name = forms.CharField(label=_(u"Planning name"), required=False, +                           max_length=100) +    main_town = get_advanced_town_field(required=True) +    locality = forms.CharField(label=_(u"Locality"), max_length=100, +                               required=False) +    address = forms.CharField(label=_(u"Address (number/street)"), +                              widget=forms.Textarea( +                                    attrs={"placeholder":_(u"Number/street")}), +                              required=False, +                              ) +    postal_code = forms.CharField(label=_(u"Postal code"), max_length=10, +                                  required=False) +    total_surface = forms.IntegerField(required=False, +                           widget=widgets.AreaWidget, +                           label=_(u"Total surface (m²)"), +                           validators=[validators.MinValueValidator(0), +                                       validators.MaxValueValidator(999999999)]) +    total_developed_surface = forms.IntegerField(widget=widgets.AreaWidget, +           label=_(u"Total developed surface (m²)"), +           required=False, validators=[validators.MinValueValidator(0), +                                       validators.MaxValueValidator(999999999)]) + +class FileFormResearchAddress(forms.Form): +    form_label = _(u"Address") +    associated_models = {'main_town':models.Town} +    main_town = get_advanced_town_field(required=True) +    locality = forms.CharField(label=_(u"Locality"), max_length=100, +                               required=False) +    address = forms.CharField(label=_(u"Address (number/street)"), +                              widget=forms.Textarea( +                                    attrs={"placeholder":_(u"Number/street")}), +                              required=False, +                              ) +    postal_code = forms.CharField(label=_(u"Postal code"), max_length=10, +                                  required=False) + +class PersonOrgaForm(forms.Form): +    PERSON_FIELD = 'TO BE DEFINED' +    ORGA_FIELD = 'TO BE DEFINED' +    PERSON_TYPE = GENERAL_CONTRACTOR + +    def _media(self): +        if self.status == 'corporation': +            return forms.Media(js=('pdl/JQueryCorporation.js',)) +    media = property(_media) + +    def __init__(self, *args, **kwargs): + +        # get the status: natural person or corporation +        DEFAULT_STATUS = 'natural' +        current_status = '' +        if 'data' in kwargs: +            current_item_key = ((kwargs['prefix'] + '-') if kwargs.get('prefix')\ +                                                 else '') + self.PERSON_FIELD +            if kwargs['data'] and kwargs['data'].get(current_item_key): +                model = self.associated_models[self.PERSON_FIELD] +                try: +                    item = model.objects.get(pk=kwargs['data'][current_item_key]) +                    current_status = 'natural' +                except (model.DoesNotExist, ValueError): +                    pass +            current_item_key = ((kwargs['prefix'] + '-') if kwargs.get('prefix')\ +                                         else '') + self.ORGA_FIELD +            if kwargs['data'] and kwargs['data'].get(current_item_key): +                current_status = 'corporation' + +        status = '' +        if 'status' in kwargs: +            status = kwargs.pop('status') +            if current_status != status: +                if kwargs.get('data'): +                    # status is different from the existing - clear fields +                    kwargs.pop('data') +        elif current_status: +            status = current_status +        else: +            status = DEFAULT_STATUS + +        self.status = status + +        if status not in ('natural', 'corporation'): +            status = DEFAULT_STATUS +        super(PersonOrgaForm, self).__init__(*args, **kwargs) + +        # distinct widget for natural and corporation +        if status == 'natural': +            self.fields[self.PERSON_FIELD] = forms.IntegerField( +             label=self.fields[self.ORGA_FIELD].label, +             required=False, +             widget=widgets.JQueryPersonOrganization( +                reverse_lazy('autocomplete-person', +                             args=[self.PERSON_TYPE.pk]), +                reverse_lazy('person_create'), +                model=Person, +                limit={'person_types':[self.PERSON_TYPE.pk], +                       'attached_to__isnull':True}, +                js_template='ishtar/blocks/JQueryNaturalPerson.js', +                new=True), +             validators=[valid_id(Person)]) + +class FileFormGeneralContractor(PersonOrgaForm): +    form_label = _(u"General contractor") +    associated_models = {'general_contractor':models.Person} +    raw_general_contractor = forms.CharField(label=_(u"General contractor"), +                                            required=False, max_length=200) +    PERSON_FIELD = 'general_contractor' +    ORGA_FIELD = 'raw_general_contractor' +    PERSON_TYPE = GENERAL_CONTRACTOR + +class FileFormPlanningService(PersonOrgaForm): +    form_label = _(u"Town planning service") +    associated_models = {'responsible_town_planning_service':models.Person} + +    reference_number = forms.IntegerField(label=_(u"File reference"), +                                          required=False) +    raw_town_planning_service = forms.CharField( +            label=_(u"Responsible town planning service"), required=False, +            max_length=200) +    PERSON_FIELD = 'responsible_town_planning_service' +    ORGA_FIELD = 'raw_town_planning_service' +    PERSON_TYPE = RESPONSIBLE_PLANNING_SERVICE + +    def __init__(self, *args, **kwargs): +        super(FileFormPlanningService, self).__init__(*args, **kwargs) +        self.fields.keyOrder = [] +        if self.ORGA_FIELD in self.fields: +            self.fields.keyOrder.append(self.ORGA_FIELD) +        elif self.PERSON_FIELD in self.fields: +            self.fields.keyOrder.append(self.PERSON_FIELD) +        self.fields.keyOrder.append('reference_number') + +class FileFormInstruction(forms.Form): +    form_label = u"Instruction SRA" +    associated_models = {'in_charge':models.Person} +    in_charge = forms.IntegerField(label=_("Person in charge"), +        widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-person', +          args=[PersonType.objects.get(txt_idx='sra_agent').pk]), +        limit={'person_types':[PersonType.objects.get(txt_idx='sra_agent').pk]}, +        associated_model=Person, new=True), +        validators=[valid_id(Person)]) +    related_file = forms.IntegerField(label=_("Related file"), required=False, +         widget=widgets.JQueryAutoComplete(reverse_lazy('autocomplete-file'), +                                           associated_model=models.File), +         validators=[valid_id(models.File)]) +    comment = forms.CharField(label=_(u"Comment"), widget=forms.Textarea, +                              required=False) +    instruction_deadline = forms.DateField(widget=widgets.JQueryDate, +                                           required=False) +    year = forms.IntegerField(label=_("Year"), +                              validators=[validators.MinValueValidator(1900), +                                          validators.MaxValueValidator(2100)]) +    numeric_reference = forms.IntegerField(label=_("Numeric reference"), +                                           required=False) +    end_date = forms.DateField(initial=get_now, widget=widgets.JQueryDate, +                               required=False) + +    def __init__(self, *args, **kwargs): +        c_year = datetime.date.today().year +        if 'year' in kwargs: +            c_year = kwargs.pop('year') +        super(FileFormInstruction, self).__init__(*args, **kwargs) +        self.fields['year'].initial = c_year +        self.fields['year'].widget.attrs.update({'readonly':'readonly'}) +        c_num, lasts = 0, "" +        q = models.File.objects.filter(numeric_reference__isnull=False, +                        year=c_year).order_by('-numeric_reference') +        if q.count(): +            num = q.all()[0].numeric_reference +            lasts = u"SRA %s-%d" % (unicode(c_year), num) +        lbl = self.fields['numeric_reference'].label +        if lasts: +            lbl += u"<br/>(dernière entrée : %s)" % lasts +        self.fields['numeric_reference'].label = mark_safe(lbl) +        self.fields['numeric_reference'].initial = c_num + 1 diff --git a/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po b/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..5d8feb4ab --- /dev/null +++ b/archaeological_files_pdl/locale/fr/LC_MESSAGES/django.po @@ -0,0 +1,139 @@ +# Ishtar po translation. +# Copyright (C) 2014 +# This file is distributed under the same license as the Ishtar package. +# Étienne Loks <etienne.loks at peacefrogs net>, 2014. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: stable\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-31 12:09+0100\n" +"PO-Revision-Date: 2014-12-31 12:09+0100\n" +"Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" + +#: forms.py:38 +msgid "General" +msgstr "Général" + +#: forms.py:40 +msgid "File type" +msgstr "Type de dossier" + +#: forms.py:41 forms.py:199 +msgid "Year" +msgstr "Année" + +#: forms.py:45 +msgid "Creation date" +msgstr "Date de création" + +#: forms.py:47 +msgid "Reception date" +msgstr "Date de réception" + +#: forms.py:59 +msgid "Permit type" +msgstr "Type de permis" + +#: forms.py:61 +msgid "Saisine type" +msgstr "Type de saisine" + +#: forms.py:72 +msgid "Planning" +msgstr "Aménagement" + +#: forms.py:74 +msgid "Planning name" +msgstr "Nom de l'aménagement" + +#: forms.py:77 +msgid "Locality" +msgstr "Lieu-dit" + +#: forms.py:79 +msgid "Address (number/street)" +msgstr "Adresse (n° / voie)" + +#: forms.py:81 +msgid "Number/street" +msgstr "n° / voie" + +#: forms.py:84 +msgid "Postal code" +msgstr "Code postal" + +#: forms.py:88 +msgid "Total surface (m²)" +msgstr "Surface totale des terrains (m²)" + +#: forms.py:92 +msgid "Total developed surface (m²)" +msgstr "Surface totale aménagée (m²)" + +#: forms.py:97 forms.py:136 forms.py:149 +msgid "General contractor" +msgstr "Aménageur" + +#: forms.py:161 +msgid "Town planning service" +msgstr "Service instructeur" + +#: forms.py:163 +msgid "File reference" +msgstr "Référence du dossier" + +#: forms.py:169 +msgid "Responsible town planning service" +msgstr "Dossier suivi par" + +#: forms.py:185 +msgid "Person in charge" +msgstr "Dossier suivi par" + +#: forms.py:191 +msgid "Related file" +msgstr "Dossier lié à" + +#: forms.py:195 +msgid "Comment" +msgstr "Commentaire" + +#: forms.py:202 +msgid "Numeric reference" +msgstr "Référence numérique" + +#: views.py:46 +msgid "New file" +msgstr "Nouveau dossier" + +#: views.py:58 views.py:61 +msgid "File followed by" +msgstr "Dossier suivi par" + +#: templates/ishtar/wizard/wizard_generalcontractor.html:12 +msgid "Corporation" +msgstr "Personne morale" + +#: templates/ishtar/wizard/wizard_generalcontractor.html:16 +msgid "Natural person" +msgstr "Personne physique" + +#: templates/ishtar/wizard/wizard_generalcontractor.html:27 +#: templates/ishtar/wizard/wizard_instruction.html:60 +#: templates/ishtar/wizard/wizard_preventiveplanning.html:76 +msgid "Validate" +msgstr "Validation" + +#: templates/ishtar/wizard/wizard_generalcontractor.html:28 +#: templates/ishtar/wizard/wizard_instruction.html:61 +#: templates/ishtar/wizard/wizard_preventiveplanning.html:77 +msgid "Validate and end" +msgstr "Terminer" diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js new file mode 100644 index 000000000..3eb375167 --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryCorporationPerson.js @@ -0,0 +1,2 @@ +var current_status = 'corporation'; +{% include "ishtar/blocks/JQueryPersonOrga.js" %} diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js new file mode 100644 index 000000000..fc4b9a90c --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryNaturalPerson.js @@ -0,0 +1,2 @@ +var current_status = 'natural'; +{% include "ishtar/blocks/JQueryPersonOrga.js" %} diff --git a/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js b/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js new file mode 100644 index 000000000..c151a5e4d --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/blocks/JQueryPersonOrga.js @@ -0,0 +1,65 @@ +person_save_callback = function(item_id, lbl){ +    var url =  {{edit_source}}; +    $('#id_{{field_id}}').val(null); +    $('#id_select_{{field_id}}').val(lbl); +    if (item_id){ +        url = {{edit_source}}+item_id; +        $('#id_{{field_id}}').val(item_id); +    } +    $("#id_select_{{field_id}}").trigger('autocompletechange'); +    $.get(url , function( data ) { +        $( "#div-{{field_id}}" ).html( data ); +    }); +}; + +edit_url =  {{edit_source}}; +parent_id = "{{field_id}}"; + +person_new_callback = function(){ +    var url =  {{edit_source}}; +    $('#id_{{field_id}}').val(null); +    $('#id_select_{{field_id}}').val(null); +} + +$(function() { +    var $radios = $('input:radio[name=person_type]'); +    if($radios.is(':checked') === false) { +        $radios.filter('[value='+ current_status +']').prop('checked', true); +    } + +    $radios.change(function(){ +        var loc = window.location; +        window.location = loc.protocol + '//' + loc.host + loc.pathname + "?status=" + $('input:radio[name=person_type]:checked').val(); +    }); + +    $("#id_select_{{field_id}}").autocomplete({ +        source: {{source}}, +        select: function( event, ui ) { +                var url =  {{edit_source}}; +                if(ui.item){ +                    url = {{edit_source}}+ui.item.id; +                    $('#id_{{field_id}}').val(ui.item.id); +                } else { +                    $('#id_{{field_id}}').val(null); +                } +                $.get(url , function( data ) { +                    $( "#div-{{field_id}}" ).html( data ); +                }); +            }, +        minLength: 2{% if options %}, +        {{options}} +        {% endif %} +    }); + +    $.get( {{edit_source}}{% if selected %}+'{{selected}}'{% endif %}, function( data ) { +        $( "#div-{{field_id}}" ).html( data ); +    }); + +    $('#id_select_{{field_id}}').live('click', function(){ +        $('#id_{{field_id}}').val(null); +        $('#id_select_{{field_id}}').val(null); +        $.get( {{edit_source}}, function( data ) { +            $( "#div-{{field_id}}" ).html( data ); +        }); +    }); +}); diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html new file mode 100644 index 000000000..e43e336c4 --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_generalcontractor.html @@ -0,0 +1,15 @@ +{% extends "ishtar/wizard/wizard_person_orga.html" %} + +{% block corporation %} +  <tr class='required'> +    <th>{{ wizard.form.raw_general_contractor.label_tag }}</th> +    <td> {{ wizard.form.raw_general_contractor.errors }}{{wizard.form.raw_general_contractor|safe}}</td> +  </tr> +{% endblock %} + +{% block natural %} +  <tr class='required'> +    <th>{{ wizard.form.general_contractor.label_tag }}</th> +    <td> {{ wizard.form.general_contractor.errors }}{{wizard.form.general_contractor|safe}}</td> +  </tr> +{% endblock %} diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html new file mode 100644 index 000000000..4162a3764 --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html @@ -0,0 +1,106 @@ +{% extends "ishtar/wizard/default_wizard.html" %} +{% load i18n range table_form %} +{% block wizard_form %} +<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %} +<div class='form'> +{{ wizard.form.media }} +{{ wizard.management_form }} + +<table> + +<tr class='required'> +  <th><label for="id_instruction-{{CURRENT_ACTION}}-in_charge">Dossier suivi par</label></th> +</tr> +<tr class='required'> +  <td>{{wizard.form.in_charge.errors}}{{wizard.form.in_charge|safe}}</td> +</tr> + +<tr> +  <th><label for="id_instruction-{{CURRENT_ACTION}}-related_file">Dossier lié à</label></th> +</tr> +<tr> +  <td>{{wizard.form.related_file|safe}}</td> +</tr> + +<tr> +  <th><label for="id_instruction-{{CURRENT_ACTION}}-comment">Commentaire</label></th> +</tr> +<tr> +  <td>{{wizard.form.comment|safe}}</td> +</tr> + +<tr class='required'> +  <th><label>État du dossier</label></th> +</tr> +<tr> +  <td><input type='radio' name='state' value='open' id='state-open'/> <label for='state-open'>Dossier actif</label></td> +</tr> +<tr> +  <td><input type='radio' name='state' value='closed' id='state-closed'/> <label for='state-closed'>Dossier clos / date de clôture</label> : {{wizard.form.end_date|safe}}</td> +</tr> + +<tr class='required'> +  <th><label for="id_instruction-{{CURRENT_ACTION}}-instruction_deadline">Date limite d'instruction</label></th> +</tr> +<tr class='required'> +  <td>{{wizard.form.instruction_deadline.errors}}{{wizard.form.instruction_deadline|safe}}</td> +</tr> + +<tr class='required'> +  <th><label for="id_instruction-{{CURRENT_ACTION}}-year">{{wizard.form.numeric_reference.label}}</label></th> +</tr> +<tr> +  <td>{{wizard.form.numeric_reference.errors}}SRA <span class='small'>{{wizard.form.year|safe}}</span> - <span class='small'>{{wizard.form.numeric_reference|safe}}</span></td> +</tr> +</table> + +<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> +{{ previous_fields|safe }} +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %} +</div> +</form> +<script type='text/javascript'> +$(function(){ + +    if ($('#id_instruction-{{CURRENT_ACTION}}-end_date').val()){ +        $("#state-closed").prop('checked', true); +    } else { +        $("#state-open").prop('checked', true); +    } + +    check_state = function(){ +        var state = $("input[name=state]:checked").val(); +        if (state == 'closed'){ +            $('#id_instruction-{{CURRENT_ACTION}}-end_date').focus(); +            $('#id_instruction-{{CURRENT_ACTION}}-end_date').prop('disabled', false); +        } else if (state == 'open'){ +            $('#id_instruction-{{CURRENT_ACTION}}-end_date').val(''); +            $('#id_instruction-{{CURRENT_ACTION}}-end_date').prop('disabled', true); +        } +    }; + +    $('input[name=state]').click(check_state); + +    check_state(); + +    $('#submit_form').click(function(){ +        var state = $("input[name=state]:checked").val(); +        if (state == 'closed'){ +            if (!$('#id_instruction-{{CURRENT_ACTION}}-end_date').val()){ +                alert("Vous devez sélectionner une date de clôture.") +                return false; +            } +            return true; +        } else if (state == 'open'){ +            return true; +        } else { +            alert("Vous devez choisir un état pour ce dossier.") +            return false; +        } +        return true; +    }); +}); +</script> +{% endblock %} diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html new file mode 100644 index 000000000..91dd7e042 --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html @@ -0,0 +1,66 @@ +{% extends "ishtar/wizard/default_wizard.html" %} +{% load i18n range table_form %} +{% block wizard_form %} +<script type='text/javascript'> +function update_form(){ +    if ($('input[name="person_type"]:radio:checked').val() == 'corporation'){ +        $('#natural_div').hide(); +        $('#corporation_div').show(); +    } else { +        $('#natural_div').show(); +        $('#corporation_div').hide(); +    } +} +$(function() { +    update_form(); +}); +</script> +<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %} +<div class='form'> +{% if wizard.form.media %}{{ wizard.form.media }}{% endif %} +{{ wizard.management_form }} + +<table class='formset'> +  <caption>Statut</caption> +  <tr> +    <th><label>{% trans "Corporation" %}</label></th> +    <td><input type='radio' name='person_type' value='corporation'/></td> +  </tr> +  <tr> +    <th><label>{% trans "Natural person" %}</label></th> +    <td><input type='radio' name='person_type' value='natural'/></td> +  </tr> +</table> + +<table id='corporation_div'> +  {% if wizard.form.non_field_errors %}<tr class='errors'> +    <td colspan='3'>{{wizard.form.non_field_errors}}</td> +  </tr>{%endif%} + +{% block corporation %} +{% endblock %} +</table> + +<div id='natural_div'> +<table> +  {% if wizard.form.non_field_errors %}<tr class='errors'> +    <td colspan='3'>{{wizard.form.non_field_errors}}</td> +  </tr>{%endif%} + +{% block natural %} +{% endblock %} +</table> +</div> + +{% block otherfields %} +{% endblock %} + +<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> +{{ previous_fields|safe }} +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %} +</div> +</form> +{% endblock %} + diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html new file mode 100644 index 000000000..29bc2397c --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html @@ -0,0 +1,15 @@ +{% extends "ishtar/wizard/wizard_person_orga.html" %} + +{% block corporation %} +  <tr class='required'> +    <th>{{ wizard.form.raw_town_planning_service.label_tag }}</th> +    <td> {{ wizard.form.raw_town_planning_service.errors }}{{wizard.form.raw_town_planning_service|safe}}</td> +  </tr> +{% endblock %} + +{% block natural %} +  <tr class='required'> +    <th>{{ wizard.form.responsible_town_planning_service.label_tag }}</th> +    <td> {{ wizard.form.responsible_town_planning_service.errors }}{{wizard.form.responsible_town_planning_service|safe}}</td> +  </tr> +{% endblock %} diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html new file mode 100644 index 000000000..66569a66d --- /dev/null +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html @@ -0,0 +1,80 @@ +{% extends "ishtar/wizard/default_wizard.html" %} +{% load i18n range table_form %} +{% block wizard_form %} +<form action="." method="post" name='wizard'{% if wizard.form.file_upload %} enctype="multipart/form-data"{% endif %}>{% csrf_token %} +<div class='form'> +{{ wizard.form.media }} +{{ wizard.management_form }} + +<table> + +<tr class='required'> +  <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-name">Nom de l'aménagement</label></th> +</tr> +<tr class='required'> +  <td>{{wizard.form.name|safe}}</td> +</tr> + +</table> + +<h4>Localisation</h4> +<table> + +{% if wizard.form.main_town.errors %}<tr> +  <td colspan="2">{{wizard.form.main_town.errors}}</td> +</tr>{% endif %} + +<tr> +  <td>{{wizard.form.main_town|safe}}</td> +</tr> + +<tr> +  <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-locality">Lieu-dit</label></th> +</tr> +<tr> +  <td colspan='2'>{{wizard.form.locality|safe}}</td> +</tr> + +<tr> +  <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-address">Adresse</label></th> +</tr> +<tr> +  <td colspan='2'>{{wizard.form.address|safe}}</td> +</tr> + +<tr> +  <th colspan='2'><label for="id_preventiveplanning-{{CURRENT_ACTION}}-postal_code">Code postal</label></th> +</tr> +<tr> +  <td colspan='2'>{{wizard.form.postal_code|safe}}</td> +</tr> + +</table> + +<h4>Surfaces</h4> +<table> + +<tr> +  <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-total_surface">Surface totale des terrains</label></th> +</tr> +<tr> +  <td>{{wizard.form.total_surface|safe}}</td> +</tr> + +<tr> +  <th><label for="id_preventiveplanning-{{CURRENT_ACTION}}-total_developed_surface">Surface totale aménagée</label></th> +</tr> +<tr> +  <td>{{wizard.form.total_developed_surface|safe}}</td> +</tr> + +</table> + +<input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> +{{ previous_fields|safe }} +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %} +</div> +</form> +{% endblock %} diff --git a/archaeological_files_pdl/urls.py b/archaeological_files_pdl/urls.py index b6878e90b..4cd746e8a 100644 --- a/archaeological_files_pdl/urls.py +++ b/archaeological_files_pdl/urls.py @@ -24,4 +24,12 @@ from archaeological_files_pdl import views  urlpatterns = patterns('',         url(r'file_creation/(?P<step>.+)?$',             views.file_creation_wizard, name='file_creation'), +       url(r'file_modification/(?P<step>.+)?$', +           views.file_modification_wizard, name='file_modification'), +       url(r'townplanning-edit/$', +           views.TownPlanningCreate.as_view(), +           name='townplanning_create'), +       url(r'townplanning-edit/(?P<pk>\d+)$', +           views.TownPlanningEdit.as_view(), +           name='townplanning_edit'),  ) diff --git a/archaeological_files_pdl/views.py b/archaeological_files_pdl/views.py index 7d51c8ec5..bcb1c0211 100644 --- a/archaeological_files_pdl/views.py +++ b/archaeological_files_pdl/views.py @@ -19,30 +19,81 @@  from django.utils.translation import ugettext_lazy as _ -from archaeological_files.wizards import FileWizard +from archaeological_files_pdl.wizards import FileWizard, FileModificationWizard  from archaeological_operations.wizards import is_preventive, is_not_preventive -from ishtar_common.forms_common import TownFormset +from ishtar_common.views import OrganizationPersonCreate, OrganizationPersonEdit +  from archaeological_files_pdl import forms  from archaeological_files import forms as ref_forms  from archaeological_operations.forms import ParcelFormSet  from archaeological_files import models + +file_creation_wizard_is_preventive = is_preventive('general-file_creation', +                                models.FileType, type_key='file_type') +file_creation_wizard_is_not_preventive = is_not_preventive( +        'general-file_creation', models.FileType, type_key='file_type')  file_creation_wizard = FileWizard.as_view([ -                    ('general-file_creation', forms.FileFormGeneral), -                    ('towns-file_creation', TownFormset), -                    ('parcels-file_creation', ParcelFormSet), -                    ('preventive-file_creation', ref_forms.FileFormPreventive), -                    ('research-file_creation', ref_forms.FileFormResearch), -                    ('final-file_creation', ref_forms.FinalForm)], +                ('general-file_creation', forms.FileFormGeneral), +                ('preventivetype-file_creation', forms.FileFormPreventiveType), +                ('preventiveplanning-file_creation', forms.FileFormPlanning), +                ('researchaddress-file_creation', forms.FileFormResearchAddress), +                ('parcelspdl-file_creation', ParcelFormSet), +                ('generalcontractor-file_creation', +                                            forms.FileFormGeneralContractor), +                ('planningservice-file_creation', +                                            forms.FileFormPlanningService), +                ('research-file_creation', ref_forms.FileFormResearch), +                ('instruction-file_creation', +                                            forms.FileFormInstruction), +                ('final-file_creation', ref_forms.FinalForm)],               label=_(u"New file"),               condition_dict={ -        'preventive-file_creation':\ -            is_preventive( 'general-file_creation', models.FileType, -                          type_key='file_type'), -        'research-file_creation':\ -            is_not_preventive('general-file_creation', models.FileType, -                              type_key='file_type'), +        'preventivetype-file_creation':file_creation_wizard_is_preventive, +        'preventiveplanning-file_creation':file_creation_wizard_is_preventive, +        'generalcontractor-file_creation':file_creation_wizard_is_preventive, +        'planningservice-file_creation':file_creation_wizard_is_preventive, +        'researchaddress-file_creation':file_creation_wizard_is_not_preventive, +        'research-file_creation':file_creation_wizard_is_not_preventive               },               url_name='file_creation',) + +file_modification_wizard_is_preventive = is_preventive('general-file_modification', +                                models.FileType, type_key='file_type') +file_modification_wizard_is_not_preventive = is_not_preventive( +        'general-file_modification', models.FileType, type_key='file_type') +file_modification_wizard = FileModificationWizard.as_view([ +            ('selec-file_modification', ref_forms.FileFormSelection), + +            ('general-file_modification', forms.FileFormGeneral), +            ('preventivetype-file_modification', forms.FileFormPreventiveType), +            ('preventiveplanning-file_modification', forms.FileFormPlanning), +            ('researchaddress-file_modification', forms.FileFormResearchAddress), +            ('parcelspdl-file_modification', ParcelFormSet), +            ('generalcontractor-file_modification', +                                        forms.FileFormGeneralContractor), +            ('planningservice-file_modification', +                                        forms.FileFormPlanningService), +            ('research-file_modification', ref_forms.FileFormResearch), +            ('instruction-file_modification', +                                        forms.FileFormInstruction), +            ('final-file_modification', ref_forms.FinalForm)], +             label=_(u"File modification"), +             condition_dict={ +    'preventivetype-file_modification':file_modification_wizard_is_preventive, +    'preventiveplanning-file_modification':file_modification_wizard_is_preventive, +    'generalcontractor-file_modification':file_modification_wizard_is_preventive, +    'planningservice-file_modification':file_modification_wizard_is_preventive, +    'researchaddress-file_modification':file_modification_wizard_is_not_preventive, +    'research-file_modification':file_modification_wizard_is_not_preventive +         }, +         url_name='file_modification',) + + +class TownPlanningEdit(OrganizationPersonEdit): +    relative_label = _("File followed by") + +class TownPlanningCreate(OrganizationPersonCreate): +    relative_label = _("File followed by") diff --git a/archaeological_files_pdl/wizards.py b/archaeological_files_pdl/wizards.py new file mode 100644 index 000000000..2d3491c8d --- /dev/null +++ b/archaeological_files_pdl/wizards.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (C) 2014  Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# See the file COPYING for details. + +from archaeological_files.wizards import FileWizard as BaseFileWizard + +class FileWizard(BaseFileWizard): +    parcel_step_key = 'parcelspdl-' +    town_step_keys = ['preventiveplanning-', 'researchaddress-'] +    town_input_id = 'main_town' +    multi_towns = False +    wizard_templates = { +        'generalcontractor-%(url_name)s':\ +                    'ishtar/wizard/wizard_generalcontractor.html', +        'planningservice-%(url_name)s':\ +                    'ishtar/wizard/wizard_planningservice.html', +        'instruction-%(url_name)s':\ +                    'ishtar/wizard/wizard_instruction.html', +        'preventiveplanning-%(url_name)s':\ +                    'ishtar/wizard/wizard_preventiveplanning.html', +                    } + +    def get_current_year(self): +        general_form_key = 'general-' + self.url_name +        return self.session_get_value(general_form_key, 'year') + +    def get_form_kwargs(self, *args, **kwargs): +        returned = super(FileWizard, self).get_form_kwargs(*args, **kwargs) +        if args and (args[0].startswith('generalcontractor-') or  +                     args[0].startswith('planningservice-')): +            if 'status' in self.request.GET: +                returned['status'] = self.request.GET['status'] +        if args and args[0].startswith('instruction-'): +            returned['year'] = self.get_current_year() +        return returned + +class FileModificationWizard(FileWizard): +    modification = True diff --git a/archaeological_finds/data_importer.py b/archaeological_finds/data_importer.py index 197bf20ec..40808cbcd 100644 --- a/archaeological_finds/data_importer.py +++ b/archaeological_finds/data_importer.py @@ -64,7 +64,7 @@ class FindsImporterBibracte(Importer):          # lien UE          ImportFormater('context_record__external_id', UnicodeFormater(120),),          # date decouverte -        ImportFormater('discovery_date', DateFormater('%Y/%m/%d'), required=False,), +        ImportFormater('discovery_date', DateFormater(['%Y/%m/%d']), required=False,),          # lien parcelle (unique)          None,          # etat conservation diff --git a/archaeological_finds/migrations/0019_auto__chg_field_preservationtype_txt_idx__chg_field_treatmenttype_txt_.py b/archaeological_finds/migrations/0019_auto__chg_field_preservationtype_txt_idx__chg_field_treatmenttype_txt_.py new file mode 100644 index 000000000..56331ba2a --- /dev/null +++ b/archaeological_finds/migrations/0019_auto__chg_field_preservationtype_txt_idx__chg_field_treatmenttype_txt_.py @@ -0,0 +1,824 @@ +# -*- 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): + +        # Changing field 'PreservationType.txt_idx' +        db.alter_column('archaeological_finds_preservationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'TreatmentType.txt_idx' +        db.alter_column('archaeological_finds_treatmenttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'MaterialType.txt_idx' +        db.alter_column('archaeological_finds_materialtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'ConservatoryState.txt_idx' +        db.alter_column('archaeological_finds_conservatorystate', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): + +        # Changing field 'PreservationType.txt_idx' +        db.alter_column('archaeological_finds_preservationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'TreatmentType.txt_idx' +        db.alter_column('archaeological_finds_treatmenttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'MaterialType.txt_idx' +        db.alter_column('archaeological_finds_materialtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'ConservatoryState.txt_idx' +        db.alter_column('archaeological_finds_conservatorystate', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'archaeological_context_records.activitytype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'ActivityType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.contextrecord': { +            'Meta': {'object_name': 'ContextRecord'}, +            'activity': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.ActivityType']", 'null': 'True', 'blank': 'True'}), +            'closing_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'datings': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_context_records.Dating']", 'symmetrical': 'False'}), +            'depth': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'filling': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'has_furniture': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'identification': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.IdentificationType']", 'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_context_records_contextrecord'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'interpretation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'location': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'opening_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'context_record'", 'to': "orm['archaeological_operations.Operation']"}), +            'parcel': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'context_record'", 'to': "orm['archaeological_operations.Parcel']"}), +            'related_context_records': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_context_records.ContextRecord']", 'null': 'True', 'through': "orm['archaeological_context_records.RecordRelations']", 'blank': 'True'}), +            'taq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'taq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'thickness': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'tpq_estimated': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'unit': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_context_records.Unit']"}), +            'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_context_records.dating': { +            'Meta': {'object_name': 'Dating'}, +            'dating_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.DatingType']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'period': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Period']"}), +            'quality': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.DatingQuality']", 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_context_records.datingquality': { +            'Meta': {'ordering': "('label',)", 'object_name': 'DatingQuality'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.datingtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'DatingType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.identificationtype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'IdentificationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.recordrelations': { +            'Meta': {'object_name': 'RecordRelations'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'left_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'right_relations'", 'to': "orm['archaeological_context_records.ContextRecord']"}), +            'relation_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.RelationType']"}), +            'right_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'left_relations'", 'to': "orm['archaeological_context_records.ContextRecord']"}) +        }, +        'archaeological_context_records.relationtype': { +            'Meta': {'ordering': "('order',)", 'object_name': 'RelationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'inverse_relation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.RelationType']", 'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'symmetrical': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_context_records.unit': { +            'Meta': {'ordering': "('order',)", 'object_name': 'Unit'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.Unit']", 'null': 'True', 'blank': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.file': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'File'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_advised': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'classified_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'departments': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'file_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.FileType']"}), +            'general_contractor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'general_contractor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_line': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_files_file'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'instruction_deadline': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'locality': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'main_town': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_main'", 'null': 'True', 'to': "orm['ishtar_common.Town']"}), +            'mh_listing': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'mh_register': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'numeric_reference': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'permit_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'permit_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.PermitType']", 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'protected_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'raw_general_contractor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'raw_town_planning_service': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'related_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.File']", 'null': 'True', 'blank': 'True'}), +            'requested_operation_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_operations.OperationType']"}), +            'research_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'responsible_town_planning_service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'responsible_town_planning_service'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'saisine_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.SaisineType']", 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'total_developed_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'total_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'file'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'default': '2015'}) +        }, +        'archaeological_files.filetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'FileType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.permittype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PermitType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.saisinetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'SaisineType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'delay': ('django.db.models.fields.IntegerField', [], {'default': '30'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_finds.basefind': { +            'Meta': {'object_name': 'BaseFind'}, +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'context_record': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'base_finds'", 'to': "orm['archaeological_context_records.ContextRecord']"}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'discovery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_finds_basefind'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), +            'is_isolated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '60'}), +            'material_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), +            'special_interest': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'topographic_localisation': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_finds.conservatorystate': { +            'Meta': {'ordering': "('label',)", 'object_name': 'ConservatoryState'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.ConservatoryState']", 'null': 'True', 'blank': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_finds.find': { +            'Meta': {'object_name': 'Find'}, +            'base_finds': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'find'", 'symmetrical': 'False', 'to': "orm['archaeological_finds.BaseFind']"}), +            'conservatory_state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.ConservatoryState']", 'null': 'True', 'blank': 'True'}), +            'container': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'finds'", 'null': 'True', 'to': "orm['archaeological_warehouse.Container']"}), +            'dating': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_context_records.Dating']", 'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'downstream_treatment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'upstream_treatment'", 'null': 'True', 'to': "orm['archaeological_finds.Treatment']"}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'find_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_finds_find'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '60'}), +            'material_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.MaterialType']"}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preservation_to_consider': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.PreservationType']", 'null': 'True', 'blank': 'True'}), +            'thumbnail': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'upstream_treatment': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'downstream_treatment'", 'null': 'True', 'to': "orm['archaeological_finds.Treatment']"}), +            'volume': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'weight_unit': ('django.db.models.fields.CharField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_finds.findsource': { +            'Meta': {'object_name': 'FindSource'}, +            'additional_information': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'authors': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'findsource_related'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Author']"}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'find': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'source'", 'to': "orm['archaeological_finds.Find']"}), +            'format_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Format']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'item_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'receipt_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'scale': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'source_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SourceType']"}), +            'support_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SupportType']", 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}) +        }, +        'archaeological_finds.historicalbasefind': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalBaseFind'}, +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'context_record_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'discovery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), +            'is_isolated': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '60'}), +            'material_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}), +            'special_interest': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'topographic_localisation': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_finds.historicalfind': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalFind'}, +            'conservatory_state_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'container_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'dating_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'downstream_treatment_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'find_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '60'}), +            'material_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preservation_to_consider_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'thumbnail': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'upstream_treatment_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'volume': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'weight': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'weight_unit': ('django.db.models.fields.CharField', [], {'max_length': '1', 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_finds.historicaltreatment': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalTreatment'}, +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'container_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'location_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'other_location': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'treatment_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_finds.materialtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'MaterialType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.MaterialType']", 'null': 'True', 'blank': 'True'}), +            'recommendation': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_finds.preservationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PreservationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_finds.property': { +            'Meta': {'object_name': 'Property'}, +            'administrative_act': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.AdministrativeAct']"}), +            'end_date': ('django.db.models.fields.DateField', [], {}), +            'find': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.Find']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_finds_property'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'properties'", 'to': "orm['ishtar_common.Person']"}), +            'start_date': ('django.db.models.fields.DateField', [], {}) +        }, +        'archaeological_finds.treatment': { +            'Meta': {'object_name': 'Treatment'}, +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'container': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.Container']", 'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_finds_treatment'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'location': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.Warehouse']", 'null': 'True', 'blank': 'True'}), +            'other_location': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'treatments'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'treatment_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_finds.TreatmentType']"}) +        }, +        'archaeological_finds.treatmentsource': { +            'Meta': {'object_name': 'TreatmentSource'}, +            'additional_information': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'authors': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'treatmentsource_related'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Author']"}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'format_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Format']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'item_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'receipt_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'scale': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'source_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SourceType']"}), +            'support_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SupportType']", 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'treatment': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'source'", 'to': "orm['archaeological_finds.Treatment']"}) +        }, +        'archaeological_finds.treatmenttype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'TreatmentType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), +            'virtual': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) +        }, +        'archaeological_operations.acttype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'ActType'}, +            'associated_template': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'acttypes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.DocumentTemplate']"}), +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'indexed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'intented_to': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.administrativeact': { +            'Meta': {'ordering': "('year', 'signature_date', 'index', 'act_type')", 'object_name': 'AdministrativeAct'}, +            'act_object': ('django.db.models.fields.TextField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'act_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.ActType']"}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'administrative_act'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_administrativeact'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_operation_in_charge'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'administrative_act'", 'null': 'True', 'to': "orm['archaeological_operations.Operation']"}), +            'operator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_operator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'ref_sra': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'signatory': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'signatory'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'signature_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.archaeologicalsite': { +            'Meta': {'object_name': 'ArchaeologicalSite'}, +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_archaeologicalsite'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.RemainType']", 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operation': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'Operation'}, +            'archaeological_sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.ArchaeologicalSite']", 'symmetrical': 'False'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operations'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'cira_rapporteur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'cira_rapporteur'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'code_dracar': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'code_patriarche': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'common_name': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'eas_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'effective_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'excavation_end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_financing': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'geoarchaeological_context_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_operation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'large_area_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'negative_result': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'operation_code': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['archaeological_operations.OperationType']"}), +            'operator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'operator_reference': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'optional_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.Period']", 'symmetrical': 'False'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.RemainType']", 'symmetrical': 'False'}), +            'report_delivery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'scheduled_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_scientist_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.Town']", 'symmetrical': 'False'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'zoning_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operationtype': { +            'Meta': {'ordering': "['-preventive', 'order', 'label']", 'object_name': 'OperationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preventive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.parcel': { +            'Meta': {'ordering': "('year', 'section', 'parcel_number')", 'object_name': 'Parcel'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_parcel'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_operations.Operation']"}), +            'parcel_number': ('django.db.models.fields.CharField', [], {'max_length': '6', 'null': 'True', 'blank': 'True'}), +            'section': ('django.db.models.fields.CharField', [], {'max_length': '4'}), +            'town': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parcels'", 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.period': { +            'Meta': {'ordering': "('order',)", 'object_name': 'Period'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.IntegerField', [], {}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.remaintype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'RemainType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_warehouse.container': { +            'Meta': {'object_name': 'Container'}, +            'comment': ('django.db.models.fields.TextField', [], {}), +            'container_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.ContainerType']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_warehouse_container'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'location': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.Warehouse']"}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '40'}) +        }, +        'archaeological_warehouse.containertype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'ContainerType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), +            'volume': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_warehouse.warehouse': { +            'Meta': {'object_name': 'Warehouse'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_warehouse_warehouse'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), +            'person_in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'warehouse_in_charge'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), +            'warehouse_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.WarehouseType']"}) +        }, +        'archaeological_warehouse.warehousetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'WarehouseType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.arrondissement': { +            'Meta': {'object_name': 'Arrondissement'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.author': { +            'Meta': {'object_name': 'Author'}, +            'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"}) +        }, +        'ishtar_common.authortype': { +            'Meta': {'object_name': 'AuthorType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.canton': { +            'Meta': {'object_name': 'Canton'}, +            'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.department': { +            'Meta': {'ordering': "['number']", 'object_name': 'Department'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}), +            'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.documenttemplate': { +            'Meta': {'ordering': "['associated_object_name', 'name']", 'object_name': 'DocumentTemplate'}, +            'associated_object_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'template': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) +        }, +        'ishtar_common.format': { +            'Meta': {'object_name': 'Format'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.sourcetype': { +            'Meta': {'object_name': 'SourceType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.state': { +            'Meta': {'ordering': "['number']", 'object_name': 'State'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) +        }, +        'ishtar_common.supporttype': { +            'Meta': {'object_name': 'SupportType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.town': { +            'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, +            'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), +            'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), +            'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        } +    } + +    complete_apps = ['archaeological_finds']
\ No newline at end of file diff --git a/archaeological_operations/data_importer.py b/archaeological_operations/data_importer.py index 94bbdff7c..252fdcca0 100644 --- a/archaeological_operations/data_importer.py +++ b/archaeological_operations/data_importer.py @@ -170,9 +170,9 @@ class OperationImporterBibracte(Importer):          # resp. lien IMPORT avec personne          ImportFormater('in_charge__raw_name', UnicodeFormater(300),),          # début -        ImportFormater('start_date', DateFormater('%Y/%m/%d'),), +        ImportFormater('start_date', DateFormater(['%Y/%m/%d']),),          # fin -        ImportFormater('excavation_end_date', DateFormater('%Y/%m/%d'),), +        ImportFormater('excavation_end_date', DateFormater(['%Y/%m/%d']),),          # Chronos          ImportFormater('periods', TypeFormater(models.Period, many_split="&"),                         required=False), @@ -242,7 +242,7 @@ class DocImporterBibracte(Importer):          # auteur          ImportFormater('authors__person__raw_name', UnicodeFormater(300), required=False),          # annee -        ImportFormater('creation_date', DateFormater('%Y'),), +        ImportFormater('creation_date', DateFormater(['%Y']),),          # format          ImportFormater('format_type', TypeFormater(Format), required=False),          # description legende diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py index 1a09b66b4..d0e4be0d3 100644 --- a/archaeological_operations/forms.py +++ b/archaeological_operations/forms.py @@ -89,7 +89,7 @@ class ParcelForm(forms.Form):                      kwargs.pop('files')          super(ParcelForm, self).__init__(*args, **kwargs)          if towns: -            self.fields['town'].choices = [('', '--')] + towns +            self.fields['town'].choices = towns      def clean(self):          """Check required fields""" @@ -98,9 +98,10 @@ class ParcelForm(forms.Form):          if not self.cleaned_data or (DELETION_FIELD_NAME in self.cleaned_data \             and self.cleaned_data[DELETION_FIELD_NAME]):              return -        if not self.cleaned_data.get('parcel_number'): +        if not self.cleaned_data.get('parcel_number') and \ +           self.cleaned_data.get('section') != 'DP':              return {} -        for key in ('town', 'parcel_number', 'section'): +        for key in ('town', 'section'):              if not key in self.cleaned_data or not self.cleaned_data[key]:                  raise forms.ValidationError(_(u"Town section and parcel number "                                                u"fields are required.")) diff --git a/archaeological_operations/ishtar_menu.py b/archaeological_operations/ishtar_menu.py index 237cc84cc..249c86185 100644 --- a/archaeological_operations/ishtar_menu.py +++ b/archaeological_operations/ishtar_menu.py @@ -50,6 +50,11 @@ MENU_SECTIONS = [                                 'change_own_operation']),              SectionItem('operation_source', _(u"Documentation"),                  childs=[ +                    MenuItem('operation_source_search', +                             _(u"Search"), +                             model=models.OperationSource, +                             access_controls=['change_operation', +                                              'change_own_operation']),                      MenuItem('operation_source_creation',                               _(u"Add"),                               model=models.OperationSource, @@ -96,6 +101,11 @@ if FILES_AVAILABLE:              SectionItem('admin_act_operations',                          _(u"Administrative act"),              childs=[ +                MenuItem('operation_administrativeactop_search', +                         _(u"Search"), +                  model=models.Operation, +                  access_controls=['change_operation', +                                   'change_own_operation']),                  MenuItem('operation_administrativeactop',                           _(u"Add"),                    model=models.Operation, diff --git a/archaeological_operations/management/commands/import_operations.py b/archaeological_operations/management/commands/ishtar_imports.py index 09bfe23b6..3f4d9e2e8 100644 --- a/archaeological_operations/management/commands/import_operations.py +++ b/archaeological_operations/management/commands/ishtar_imports.py @@ -18,6 +18,7 @@  # See the file COPYING for details.  import datetime, unicodecsv +from optparse import make_option  from django.conf import settings  from django.core.management.base import BaseCommand, CommandError @@ -31,6 +32,12 @@ IMPORTERS = {          }  try: +    from archaeological_files.data_importer import * +    IMPORTERS['sra-pdl-files'] = FileImporterSraPdL +except ImportError: +    pass + +try:      from archaeological_context_records.data_importer import *      IMPORTERS['bibracte-ue'] = ContextRecordsImporterBibracte      IMPORTERS['bibracte-ue-rel'] = ContextRecordsRelationImporterBibracte @@ -48,6 +55,14 @@ except ImportError:  class Command(BaseCommand):      args = '<filename> <importer_name> [<nb lines skipped>]'      help = "Import archaeological operations" +    option_list = BaseCommand.option_list + ( +        make_option('--choose-default', +            action='store_true', +            dest='choose_default', +            default=False, +            help='When a choice is requested choose the first one available. '\ +                 'For testing purpose'), +        )      def handle(self, *args, **options):          if not args or not args[0]: @@ -62,6 +77,7 @@ class Command(BaseCommand):              skip_lines = int(args[2])          except:              skip_lines = 0 +        choose_default = options.get('choose_default')          filename = args[0]          importer = IMPORTERS[args[1]](skip_lines=skip_lines, output='cli')          sys.stdout.write("*" * 72 + "\n") @@ -76,7 +92,8 @@ class Command(BaseCommand):              for encoding in encodings:                  try:                      importer.importation([line for line in -                            unicodecsv.reader(csv_file, encoding='utf-8')]) +                            unicodecsv.reader(csv_file, encoding='utf-8')], +                            choose_default=choose_default)                      errors = importer.get_csv_errors()                      sys.stdout.write("\n")                      if errors: diff --git a/archaeological_operations/migrations/0037_auto__chg_field_parcel_parcel_number__chg_field_operationtype_txt_idx_.py b/archaeological_operations/migrations/0037_auto__chg_field_parcel_parcel_number__chg_field_operationtype_txt_idx_.py new file mode 100644 index 000000000..aa023a7eb --- /dev/null +++ b/archaeological_operations/migrations/0037_auto__chg_field_parcel_parcel_number__chg_field_operationtype_txt_idx_.py @@ -0,0 +1,559 @@ +# -*- 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): + +        # Changing field 'Parcel.parcel_number' +        db.alter_column('archaeological_operations_parcel', 'parcel_number', self.gf('django.db.models.fields.CharField')(max_length=6, null=True)) + +        # Changing field 'OperationType.txt_idx' +        db.alter_column('archaeological_operations_operationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'Period.txt_idx' +        db.alter_column('archaeological_operations_period', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'ActType.txt_idx' +        db.alter_column('archaeological_operations_acttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'RemainType.txt_idx' +        db.alter_column('archaeological_operations_remaintype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): + +        # Changing field 'Parcel.parcel_number' +        db.alter_column('archaeological_operations_parcel', 'parcel_number', self.gf('django.db.models.fields.CharField')(default='-', max_length=6)) + +        # Changing field 'OperationType.txt_idx' +        db.alter_column('archaeological_operations_operationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'Period.txt_idx' +        db.alter_column('archaeological_operations_period', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'ActType.txt_idx' +        db.alter_column('archaeological_operations_acttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'RemainType.txt_idx' +        db.alter_column('archaeological_operations_remaintype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'archaeological_files.file': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'File'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_advised': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'classified_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'departments': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'file_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.FileType']"}), +            'general_contractor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'general_contractor'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_line': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_files_file'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'instruction_deadline': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'locality': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'main_town': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'file_main'", 'null': 'True', 'to': "orm['ishtar_common.Town']"}), +            'mh_listing': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'mh_register': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'numeric_reference': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'organization': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'files'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'permit_reference': ('django.db.models.fields.CharField', [], {'max_length': '60', 'null': 'True', 'blank': 'True'}), +            'permit_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.PermitType']", 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'protected_area': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'raw_general_contractor': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'raw_town_planning_service': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'reception_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference_number': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'related_file': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.File']", 'null': 'True', 'blank': 'True'}), +            'requested_operation_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['archaeological_operations.OperationType']"}), +            'research_comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'responsible_town_planning_service': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'responsible_town_planning_service'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'saisine_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_files.SaisineType']", 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'total_developed_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'total_surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'file'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'default': '2015'}) +        }, +        'archaeological_files.filetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'FileType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.permittype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PermitType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_files.saisinetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'SaisineType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'delay': ('django.db.models.fields.IntegerField', [], {'default': '30'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.acttype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'ActType'}, +            'associated_template': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'acttypes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.DocumentTemplate']"}), +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'indexed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'intented_to': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.administrativeact': { +            'Meta': {'ordering': "('year', 'signature_date', 'index', 'act_type')", 'object_name': 'AdministrativeAct'}, +            'act_object': ('django.db.models.fields.TextField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'act_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.ActType']"}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'administrative_act'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_administrativeact'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_operation_in_charge'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'administrative_act'", 'null': 'True', 'to': "orm['archaeological_operations.Operation']"}), +            'operator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_operator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'ref_sra': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'adminact_scientist'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'signatory': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'signatory'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'signature_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.archaeologicalsite': { +            'Meta': {'object_name': 'ArchaeologicalSite'}, +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_archaeologicalsite'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '20'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['archaeological_operations.RemainType']", 'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.historicaladministrativeact': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalAdministrativeAct'}, +            'act_object': ('django.db.models.fields.TextField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'act_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'associated_file_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'in_charge_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'operator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'ref_sra': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}), +            'scientist_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'signatory_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'signature_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.historicaloperation': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalOperation'}, +            'associated_file_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'cira_rapporteur_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'code_dracar': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'code_patriarche': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'common_name': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'eas_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'effective_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'excavation_end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_financing': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'geoarchaeological_context_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'in_charge_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'large_area_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'negative_result': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'operation_code': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'operator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'operator_reference': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'optional_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'report_delivery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'scheduled_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'scientist_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'zoning_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operation': { +            'Meta': {'ordering': "('cached_label',)", 'object_name': 'Operation'}, +            'archaeological_sites': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.ArchaeologicalSite']", 'symmetrical': 'False'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operations'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'cached_label': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'cira_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'cira_rapporteur': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'cira_rapporteur'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'code_dracar': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'code_patriarche': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'common_name': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}), +            'cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.date.today'}), +            'eas_number': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'effective_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'excavation_end_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_cost': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'fnap_financing': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), +            'geoarchaeological_context_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_operation'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'large_area_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'negative_result': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}), +            'operation_code': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'operation_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['archaeological_operations.OperationType']"}), +            'operator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operator'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'operator_reference': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), +            'optional_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'periods': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.Period']", 'symmetrical': 'False'}), +            'remains': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['archaeological_operations.RemainType']", 'symmetrical': 'False'}), +            'report_delivery_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'scheduled_man_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'scientist': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'operation_scientist_responsability'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'start_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'towns': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.Town']", 'symmetrical': 'False'}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'zoning_prescription': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.operationbydepartment': { +            'Meta': {'object_name': 'OperationByDepartment', 'db_table': "'operation_department'", 'managed': 'False'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Operation']"}) +        }, +        'archaeological_operations.operationsource': { +            'Meta': {'object_name': 'OperationSource'}, +            'additional_information': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'authors': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'operationsource_related'", 'symmetrical': 'False', 'to': "orm['ishtar_common.Author']"}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'creation_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'format_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Format']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'index': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'internal_reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'item_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'source'", 'to': "orm['archaeological_operations.Operation']"}), +            'receipt_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True', 'blank': 'True'}), +            'scale': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'source_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SourceType']"}), +            'support_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.SupportType']", 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '300'}) +        }, +        'archaeological_operations.operationtype': { +            'Meta': {'ordering': "['-preventive', 'order', 'label']", 'object_name': 'OperationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'preventive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.parcel': { +            'Meta': {'ordering': "('year', 'section', 'parcel_number')", 'object_name': 'Parcel'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'associated_file': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_files.File']"}), +            'external_id': ('django.db.models.fields.CharField', [], {'max_length': '12', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_parcel'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'operation': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parcels'", 'null': 'True', 'to': "orm['archaeological_operations.Operation']"}), +            'parcel_number': ('django.db.models.fields.CharField', [], {'max_length': '6', 'null': 'True', 'blank': 'True'}), +            'section': ('django.db.models.fields.CharField', [], {'max_length': '4'}), +            'town': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parcels'", 'to': "orm['ishtar_common.Town']"}), +            'year': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_operations.parcelowner': { +            'Meta': {'object_name': 'ParcelOwner'}, +            'end_date': ('django.db.models.fields.DateField', [], {}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_operations_parcelowner'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parcel_owner'", 'to': "orm['ishtar_common.Person']"}), +            'parcel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Parcel']"}), +            'start_date': ('django.db.models.fields.DateField', [], {}) +        }, +        'archaeological_operations.period': { +            'Meta': {'ordering': "('order',)", 'object_name': 'Period'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.IntegerField', [], {}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'order': ('django.db.models.fields.IntegerField', [], {}), +            'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_operations.Period']", 'null': 'True', 'blank': 'True'}), +            'start_date': ('django.db.models.fields.IntegerField', [], {}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'archaeological_operations.remaintype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'RemainType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.arrondissement': { +            'Meta': {'object_name': 'Arrondissement'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.author': { +            'Meta': {'object_name': 'Author'}, +            'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"}) +        }, +        'ishtar_common.authortype': { +            'Meta': {'object_name': 'AuthorType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.canton': { +            'Meta': {'object_name': 'Canton'}, +            'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.department': { +            'Meta': {'ordering': "['number']", 'object_name': 'Department'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}), +            'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.documenttemplate': { +            'Meta': {'ordering': "['associated_object_name', 'name']", 'object_name': 'DocumentTemplate'}, +            'associated_object_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'template': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) +        }, +        'ishtar_common.format': { +            'Meta': {'object_name': 'Format'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.sourcetype': { +            'Meta': {'object_name': 'SourceType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.state': { +            'Meta': {'ordering': "['number']", 'object_name': 'State'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) +        }, +        'ishtar_common.supporttype': { +            'Meta': {'object_name': 'SupportType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.town': { +            'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, +            'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), +            'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), +            'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        } +    } + +    complete_apps = ['archaeological_operations']
\ No newline at end of file diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py index 7d44a8bcf..53e572a20 100644 --- a/archaeological_operations/models.py +++ b/archaeological_operations/models.py @@ -204,7 +204,7 @@ class Operation(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,      if settings.COUNTRY == 'fr':          code_patriarche = models.IntegerField(u"Code PATRIARCHE", null=True,                                                blank=True) -        TABLE_COLS = ['code_patriarche'] + TABLE_COLS +        TABLE_COLS = ['full_code_patriarche'] + TABLE_COLS          code_dracar = models.CharField(u"Code DRACAR", max_length=10, null=True,                                         blank=True)          fnap_financing = models.FloatField(u"Financement FNAP (%)", @@ -291,12 +291,13 @@ class Operation(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,      def get_reference(self, full=False):          ref = ""          if self.code_patriarche: -            ref = unicode(self.code_patriarche) +            ref = "OA" + unicode(self.code_patriarche)              if not full:                  return ref          if self.year and self.operation_code:              if ref:                  ref += u" - " +            ref += settings.OP_PREFIX              ref += u"-".join((unicode(self.year),                                unicode(self.operation_code)))          return ref or "00" @@ -370,9 +371,15 @@ class Operation(BaseHistorizedItem, OwnPerms, ValueGetter, ShortMenuItem,              return ""          lbl = unicode(self.operation_code)          year = self.year or 0 -        lbl = u"%d-%s%s" % (year, (3-len(lbl))*"0", lbl) +        lbl = settings.OP_PREFIX + u"%d-%s%s" % (year, (3-len(lbl))*"0", lbl)          return lbl +    @property +    def full_code_patriarche(self): +        if not self.code_patriarche: +            return '' +        return u"OA" + unicode(self.code_patriarche) +      def clean(self):          objs = self.__class__.objects.filter(year=self.year,                                               operation_code=self.operation_code) @@ -674,7 +681,8 @@ class Parcel(LightHistorizedItem):      town = models.ForeignKey(Town, related_name='parcels',                               verbose_name=_(u"Town"))      section = models.CharField(_(u"Section"), max_length=4) -    parcel_number = models.CharField(_(u"Parcel number"), max_length=6) +    parcel_number = models.CharField(_(u"Parcel number"), max_length=6, +                                     null=True, blank=True)      external_id = models.CharField(_(u"External ID"), max_length=12, null=True,                                     blank=True)      address = models.TextField(_(u"Address - Locality"), null=True, blank=True) diff --git a/archaeological_operations/templates/ishtar/sheet_operation.html b/archaeological_operations/templates/ishtar/sheet_operation.html index 5f0626a02..cc69abda0 100644 --- a/archaeological_operations/templates/ishtar/sheet_operation.html +++ b/archaeological_operations/templates/ishtar/sheet_operation.html @@ -30,7 +30,7 @@  {% if item.year  %}<p><label>{%trans "Year:"%}</label> <span class='value strong'>{{ item.year }}</span></p>{% endif %}  {% if item.operation_code %}<p><label>{%trans "Numerical reference:"%}</label> <span class='value strong'>{{ item.operation_code }}</span></p>{% endif %} -{% if item.code_patriarche %}<p><label>{%trans "Patriarche OA code:"%}</label> <span class='value'>{{ item.code_patriarche }}</span></p>{%else%} +{% if item.code_patriarche %}<p><label>{%trans "Patriarche OA code:"%}</label> <span class='value'>OA{{ item.code_patriarche }}</span></p>{%else%}  <p class='alert'>{%trans "Patriarche OA code not yet recorded!"%}</p>{%endif%}  <p><label>{%trans "Edition date:"%}</label> <span class='value'>{% if item.history_date %}{{ item.history_date }}{% else %}{{ item.history.all.0.history_date }}{% endif %}</span></p> <!-- date = now --> diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py index fcd85efb5..f448fd6a7 100644 --- a/archaeological_operations/urls.py +++ b/archaeological_operations/urls.py @@ -23,6 +23,9 @@ import views  # forms  urlpatterns = patterns('', +       url(r'operation_administrativeactop_search/(?P<step>.+)?$', +           views.operation_administrativeactop_search_wizard, +           name='operation_administrativeactop_search'),         url(r'operation_administrativeactop/(?P<step>.+)?$',             views.operation_administrativeactop_wizard,             name='operation_administrativeactop'), @@ -32,6 +35,9 @@ urlpatterns = patterns('',         url(r'operation_administrativeactop_deletion/(?P<step>.+)?$',             views.operation_administrativeactop_deletion_wizard,             name='operation_administrativeactop_deletion'), +       url(r'operation_source_search/(?P<step>.+)?$', +           views.operation_source_search_wizard, +           name='operation_source_search'),         url(r'operation_source_creation/(?P<step>.+)?$',             views.operation_source_creation_wizard,             name='operation_source_creation'), @@ -45,6 +51,8 @@ urlpatterns = patterns('',             views.operation_search_wizard, name='operation_search'),         url(r'operation_creation/(?P<step>.+)?$',             views.operation_creation_wizard, name='operation_creation'), +       url(r'operation_add/(?P<file_id>\d+)$', +           views.operation_add, name='operation_add'),         url(r'operation_modification/(?P<step>.+)?$',             views.operation_modification_wizard,             name='operation_modification'), diff --git a/archaeological_operations/views.py b/archaeological_operations/views.py index b4e9d2a2f..a8ded32cf 100644 --- a/archaeological_operations/views.py +++ b/archaeological_operations/views.py @@ -255,6 +255,14 @@ def operation_modify(request, pk):      return redirect(reverse('operation_modification',                              kwargs={'step':'general-operation_modification'})) +def operation_add(request, file_id): +    view = operation_creation_wizard(request) +    OperationWizard.session_set_value( +                    request, 'filechoice-operation_creation', 'associated_file', +                    file_id, reset=True) +    return redirect(reverse('operation_creation', +                            kwargs={'step':'general-operation_creation'})) +  operation_closing_wizard = OperationClosingWizard.as_view([      ('selec-operation_closing', OperationFormSelection),      ('date-operation_closing', ClosingDateFormSelection), @@ -268,6 +276,11 @@ operation_deletion_wizard = OperationDeletionWizard.as_view([      label=_(u"Operation deletion"),      url_name='operation_deletion',) +operation_source_search_wizard = SearchWizard.as_view([ +    ('selec-operation_source_search', OperationSourceFormSelection)], +    label=_(u"Operation: source search"), +    url_name='operation_source_search',) +  operation_source_creation_wizard = OperationSourceWizard.as_view([      ('selec-operation_source_creation', SourceOperationFormSelection),      ('source-operation_source_creation',OperationSourceForm), @@ -290,6 +303,12 @@ operation_source_deletion_wizard = OperationSourceDeletionWizard.as_view([      label=_(u"Operation: source deletion"),      url_name='operation_source_deletion',) +operation_administrativeactop_search_wizard = SearchWizard.as_view([ +    ('general-operation_administrativeactop_search', +    AdministrativeActOpeFormSelection)], +    label=_(u"Administrative act search"), +    url_name='operation_administrativeactop_search',) +  operation_administrativeactop_wizard = \                                  OperationAdministrativeActWizard.as_view([      ('selec-operation_administrativeactop', OperationFormSelection), @@ -381,3 +400,20 @@ def administrativeactfile_document(request, operation=True):                                                          operation=operation)      return render_to_response('ishtar/administrativeact_document.html', dct,                                context_instance=RequestContext(request)) + +def reset_wizards(request): +    for wizard_class, url_name in ( +            (OperationWizard, 'operation_creation'), +            (OperationModificationWizard, 'operation_modification'), +            (OperationClosingWizard, 'operation_closing'), +            (OperationDeletionWizard, 'operation_deletion_wizard'), +            (OperationSourceWizard, 'operation_source_creation'), +            (OperationSourceWizard, 'operation_source_modification'), +            (OperationSourceDeletionWizard, 'operation_source_deletion'), +            (OperationAdministrativeActWizard, 'operation_administrativeactop'), +            (OperationEditAdministrativeActWizard, +                        'operation_administrativeactop_modification'), +            (AdministrativeActDeletionWizard, +                        'operation_administrativeactop_deletion'), +        ): +        wizard_class.session_reset(request, url_name) diff --git a/archaeological_operations/wizards.py b/archaeological_operations/wizards.py index 1e4de70b7..01f15886d 100644 --- a/archaeological_operations/wizards.py +++ b/archaeological_operations/wizards.py @@ -39,6 +39,9 @@ class OperationWizard(Wizard):      model = models.Operation      object_parcel_type = 'operation'      parcel_step_key = 'parcelsgeneral-' +    town_step_keys = ['towns-'] # step contening the current(s) town(s) +    town_input_id = 'town' # input id of the current(s) town(s) +    multi_towns = True # true if current town are multi      wizard_done_window = reverse_lazy('show-operation')      def get_template_names(self): @@ -47,8 +50,7 @@ class OperationWizard(Wizard):          if current_step.startswith('towns-'):              #templates = ['ishtar/wizard/towns_wizard.html'] + templates              pass -        if current_step.startswith('parcels-') or \ -           current_step.startswith('parcelsgeneral-') : +        if current_step.startswith(self.parcel_step_key):              templates = ['ishtar/wizard/parcels_wizard.html'] + templates          return templates @@ -131,16 +133,22 @@ class OperationWizard(Wizard):          # manage the dynamic choice of towns          if step.startswith('towns') and hasattr(form, 'management_form'):              data['TOWNS'] = self.get_towns() -        elif step.startswith('parcels') and hasattr(form, 'management_form'): +        elif step.startswith(self.parcel_step_key) \ +             and hasattr(form, 'management_form'):              file = self.get_current_file()              if file:                  data['PARCELS'] = self.get_available_parcels(file)              else: -                town_form_key = step.startswith('parcelsgeneral') \ -                                and 'townsgeneral-' or 'towns-' -                town_form_key += self.url_name -                town_ids = self.session_get_value(town_form_key, 'town', -                                                  multi=True) or [] +                town_ids = [] +                for town_step_key in self.town_step_keys: +                    town_form_key = town_step_key + self.url_name +                    town_ids = self.session_get_value(town_form_key, +                                                  self.town_input_id, +                                                  multi=self.multi_towns) or [] +                    if town_ids: +                        break +                if not self.multi_towns and town_ids: +                    town_ids = [town_ids]                  towns = []                  for town_id in town_ids:                      try: diff --git a/archaeological_warehouse/migrations/0007_auto__chg_field_warehousetype_txt_idx__chg_field_containertype_txt_idx.py b/archaeological_warehouse/migrations/0007_auto__chg_field_warehousetype_txt_idx__chg_field_containertype_txt_idx.py new file mode 100644 index 000000000..a823623b9 --- /dev/null +++ b/archaeological_warehouse/migrations/0007_auto__chg_field_warehousetype_txt_idx__chg_field_containertype_txt_idx.py @@ -0,0 +1,206 @@ +# -*- 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): + +        # Changing field 'WarehouseType.txt_idx' +        db.alter_column('archaeological_warehouse_warehousetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'ContainerType.txt_idx' +        db.alter_column('archaeological_warehouse_containertype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): + +        # Changing field 'WarehouseType.txt_idx' +        db.alter_column('archaeological_warehouse_warehousetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'ContainerType.txt_idx' +        db.alter_column('archaeological_warehouse_containertype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'archaeological_warehouse.container': { +            'Meta': {'object_name': 'Container'}, +            'comment': ('django.db.models.fields.TextField', [], {}), +            'container_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.ContainerType']"}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_warehouse_container'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'location': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.Warehouse']"}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '40'}) +        }, +        'archaeological_warehouse.containertype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'ContainerType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'reference': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}), +            'volume': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'width': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'archaeological_warehouse.warehouse': { +            'Meta': {'object_name': 'Warehouse'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_archaeological_warehouse_warehouse'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}), +            'person_in_charge': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'warehouse_in_charge'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Person']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), +            'warehouse_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['archaeological_warehouse.WarehouseType']"}) +        }, +        'archaeological_warehouse.warehousetype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'WarehouseType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        } +    } + +    complete_apps = ['archaeological_warehouse']
\ No newline at end of file diff --git a/example_project/settings.py b/example_project/settings.py index f81e3e984..901987905 100644 --- a/example_project/settings.py +++ b/example_project/settings.py @@ -48,6 +48,8 @@ LANGUAGE_CODE = 'fr-fr'  COUNTRY = "fr"  OOOK_DATE_FORMAT = u"%-d %B %Y" +OOO_DATE_FORMAT = u"%-d %B %Y" +DATE_FORMAT = u"%-d %B %Y"  SITE_ID = 1 @@ -190,16 +192,23 @@ ISHTAR_DOC_TYPES = {u"undefined":u"Undefined"}  ISHTAR_DPTS = [] +OP_PREFIX = 'OP' +FILE_PREFIX = 'SRA' + +PRE_APPS = []  EXTRA_APPS = []  try:      from local_settings import *  except ImportError, e: -    print 'Unable to load local_settings.py:', e +    print('Unable to load local_settings.py:', e)  if 'test' in sys.argv:      SOUTH_TESTS_MIGRATE = False +for app in PRE_APPS: +    INSTALLED_APPS.insert(INSTALLED_APPS.index('ishtar_common'), app) +  if 'archaeological_files' in EXTRA_APPS:      EXTRA_APPS.pop(EXTRA_APPS.index('archaeological_files'))      INSTALLED_APPS.insert(INSTALLED_APPS.index('archaeological_operations'), diff --git a/install/install.sh b/install/install.sh index 3f9181bb0..9a2ba4094 100755 --- a/install/install.sh +++ b/install/install.sh @@ -64,8 +64,8 @@ apt-get -q -y install git apg python-pip 2> /dev/null > /dev/null  apt-get -q -y install python python-django \        libjs-jquery libjs-jquery-ui python-pisa python-django-registration \ -      python-utidylib python-imaging python-django-south \ -      python-psycopg2 python-gdal gettext python-tidylib python-lxml \ +      python-utidylib python-lxml python-imaging python-django-south \ +      python-psycopg2 python-gdal gettext python-bs4 python-tidylib \        python-django-extra-views python-memcache python-dbf 2> /dev/null > /dev/null  apt-get -q -y install uwsgi uwsgi-plugin-python nginx memcached 2> /dev/null > /dev/null diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index f5e70e0ee..a7c32e6a8 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -63,14 +63,15 @@ class ImportFormater(object):      def report_error(self, *args):          return -    def init(self, vals, output=None): +    def init(self, vals, output=None, choose_default=False):          try:              lst = iter(self.formater)          except TypeError:              lst = [self.formater]          for formater in lst:              if formater: -                formater.check(vals, output) +                formater.check(vals, output, self.comment, +                               choose_default=choose_default)      def post_process(self, obj, context, value, owner=None):          raise NotImplemented() @@ -92,9 +93,19 @@ class Formater(object):      def format(self, value):          return value -    def check(self, values, output=None): +    def check(self, values, output=None, comment='', choose_default=False):          return +class ChoiceChecker(object): +    def report_new(self, comment): +        if not self.new_keys: +            return +        msg = u"For \"%s\" these new associations have been made:\n" % comment +        sys.stderr.write(msg.encode('utf-8')) +        for k in self.new_keys: +            msg = u'"%s";"%s"\n' % (k, self.new_keys[k]) +            sys.stderr.write(msg.encode('utf-8')) +  class UnicodeFormater(Formater):      def __init__(self, max_length, clean=False, re_filter=None, notnull=False,                   db_target=None): @@ -183,7 +194,7 @@ class IntegerFormater(Formater):              raise ValueError(_(u"\"%(value)s\" is not an integer") % {                                                                   'value':value}) -class StrChoiceFormater(Formater): +class StrChoiceFormater(Formater, ChoiceChecker):      def __init__(self, choices, strict=False, equiv_dict={}, model=None,                   cli=False, many_split='', db_target=None):          self.choices = list(choices) @@ -194,6 +205,7 @@ class StrChoiceFormater(Formater):          self.db_target = db_target          self.create = False          self.missings = set() +        self.new_keys = {}          self.many_split = many_split          for key, value in self.choices:              value = unicode(value) @@ -219,8 +231,9 @@ class StrChoiceFormater(Formater):      def prepare(self, value):          return unicode(value).strip() -    def _get_choices(self): -        msgstr = unicode(_(u"Choice for \"%s\" is not available. "\ +    def _get_choices(self, comment=''): +        msgstr = comment + u" - " +        msgstr += unicode(_(u"Choice for \"%s\" is not available. "\                             u"Which one is relevant?\n"))          idx = -1          for idx, choice in enumerate(self.choices): @@ -233,8 +246,8 @@ class StrChoiceFormater(Formater):          msgstr += unicode(_(u"%d. None of the above - skip")) % idx + u"\n"          return msgstr, idx -    def check(self, values, output=None): -        if not output or output == 'silent': +    def check(self, values, output=None, comment='', choose_default=False): +        if (not output or output == 'silent') and not choose_default:              return          if self.many_split:              new_values = [] @@ -247,14 +260,18 @@ class StrChoiceFormater(Formater):              value = self.prepare(value)              if value in self.equiv_dict:                  continue -            if output != 'cli': +            if output != 'cli' and not choose_default:                  self.missings.add(value)                  continue -            msgstr, idx = self._get_choices() +            msgstr, idx = self._get_choices(comment)              res = None +            if choose_default: +                res = 1              while res not in range(1, idx+1): -                sys.stdout.write(msgstr % value) -                res = raw_input(">>> ") +                msg = msgstr % value +                sys.stdout.write(msg.encode('utf-8')) +                sys.stdout.write("\n>>> ") +                res = raw_input()                  try:                      res = int(res)                  except ValueError: @@ -266,10 +283,12 @@ class StrChoiceFormater(Formater):                      v = self.model.objects.get(pk=v)                  self.equiv_dict[value] = v                  self.add_key(v, value) +                self.new_keys[value] = v              elif self.create and res == len(self.choices):                  self.equiv_dict[value] = self.new(base_value)                  self.choices.append((self.equiv_dict[value].pk,                                       unicode(self.equiv_dict[value]))) +                self.new_keys[value] = unicode(self.equiv_dict[value])              else:                  self.equiv_dict[value] = None          if output == 'db' and self.db_target: @@ -283,6 +302,8 @@ class StrChoiceFormater(Formater):                          TargetKey.objects.create(**q)                      except IntegrityError:                          pass +        if output == 'cli': +            self.report_new(comment)      def new(self, value):          return @@ -308,6 +329,7 @@ class TypeFormater(StrChoiceFormater):          self.db_target = db_target          self.missings = set()          self.equiv_dict, self.choices = {}, [] +        self.new_keys = {}          for item in model.objects.all():              self.choices.append((item.pk, unicode(item)))              for key in item.get_keys(): @@ -332,21 +354,25 @@ class TypeFormater(StrChoiceFormater):          return self.model.objects.create(**values)  class DateFormater(Formater): -    def __init__(self, date_format="%d/%m/%Y", db_target=None): -        self.date_format = date_format +    def __init__(self, date_formats=["%d/%m/%Y"], db_target=None): +        self.date_formats = date_formats +        if type(date_formats) not in (list, tuple): +            self.date_formats = [self.date_formats]          self.db_target = db_target      def format(self, value):          value = value.strip()          if not value:              return -        try: -            return datetime.datetime.strptime(value, self.date_format).date() -        except: -            raise ValueError(_(u"\"%(value)s\" is not a valid date") % { +        for date_format in self.date_formats: +            try: +                return datetime.datetime.strptime(value, date_format).date() +            except: +                continue +        raise ValueError(_(u"\"%(value)s\" is not a valid date") % {                                                             'value':value}) -class StrToBoolean(Formater): +class StrToBoolean(Formater, ChoiceChecker):      def __init__(self, choices={}, cli=False, strict=False, db_target=None):          self.dct = copy.copy(choices)          self.cli = cli @@ -367,6 +393,7 @@ class StrToBoolean(Formater):                  else:                      v = None                  self.dct[value] = v +        self.new_keys = {}      def prepare(self, value):          value = unicode(value).strip() @@ -374,10 +401,11 @@ class StrToBoolean(Formater):              value = slugify(value)          return value -    def check(self, values, output=None): -        if not output or output == 'silent': +    def check(self, values, output=None, comment='', choose_default=False): +        if (not output or output == 'silent') and not choose_default:              return -        msgstr = unicode(_(u"Choice for \"%s\" is not available. "\ +        msgstr = comment + u" - " +        msgstr += unicode(_(u"Choice for \"%s\" is not available. "\                             u"Which one is relevant?\n"))          msgstr += u"1. True\n"          msgstr += u"2. False\n" @@ -386,13 +414,17 @@ class StrToBoolean(Formater):              value = self.prepare(value)              if value in self.dct:                  continue -            if not self.cli: +            if output != 'cli' and not choose_default:                  self.missings.add(value)                  continue              res = None +            if choose_default: +                res = 1              while res not in range(1, 4): -                sys.stdout.write(msgstr % value) -                res = raw_input(">>> ") +                msg = msgstr % value +                sys.stdout.write(msg.encode('utf-8')) +                sys.stdout.write("\n>>> ") +                res = raw_input()                  try:                      res = int(res)                  except ValueError: @@ -411,6 +443,9 @@ class StrToBoolean(Formater):                      models.TargetKey.objects.create(**q)                  except IntegrityError:                      pass +            self.new_keys[value] = unicode(self.dct[value]) +        if output == 'cli': +            self.report_new(comment)      def format(self, value):          value = self.prepare(value) @@ -419,13 +454,22 @@ class StrToBoolean(Formater):  logger = logging.getLogger(__name__) +def get_object_from_path(obj, path): +    for k in path.split('__')[:-1]: +        if not hasattr(obj, k): +            return +        obj = getattr(obj, k) +    return obj +  class Importer(object):      DESC = ""      LINE_FORMAT = []      OBJECT_CLS = None      IMPORTED_LINE_FIELD = None      UNICITY_KEYS = [] +    EXTRA_DEFAULTS = {}      DEFAULTS = {} +    STR_CUT = {}      ERRORS = {          'header_check':_(u"The given file is not correct. Check the file "                    u"format. If you use a CSV file: check that column separator " @@ -459,6 +503,12 @@ class Importer(object):          self.line_format = copy.copy(self.LINE_FORMAT)          self.import_instance = import_instance          self._defaults = self.DEFAULTS.copy() +        # EXTRA_DEFAULTS are for multiple inheritance +        if self.EXTRA_DEFAULTS: +            for k in self.EXTRA_DEFAULTS: +                if k not in self._defaults: +                    self._defaults[k] = {} +                self._defaults[k].update(self.EXTRA_DEFAULTS[k])          self.history_modifier = history_modifier          self.output = output          if not self.history_modifier: @@ -469,7 +519,10 @@ class Importer(object):                  self.history_modifier = User.objects.filter(                                  is_superuser=True).order_by('pk')[0] -    def initialize(self, table, output='silent'): +    def post_processing(self, item, data): +        return item + +    def initialize(self, table, output='silent', choose_default=False):          """          copy vals in columns and initialize formaters          * output: @@ -491,11 +544,11 @@ class Importer(object):                  vals[idx_col].append(val)          for idx, formater in enumerate(self.line_format):              if formater and idx < len(vals): -                formater.init(vals[idx], output) +                formater.init(vals[idx], output, choose_default=choose_default) -    def importation(self, table, initialize=True): +    def importation(self, table, initialize=True, choose_default=False):          if initialize: -            self.initialize(table, self.output) +            self.initialize(table, self.output, choose_default=choose_default)          self._importation(table)      @classmethod @@ -560,10 +613,10 @@ class Importer(object):                      time_by_item = ellapsed/idx_line                      if time_by_item:                          left = ((total - idx_line)*time_by_item).seconds -                txt = "\r* %d/%d" % (idx_line+1, total) +                txt = u"\r* %d/%d" % (idx_line+1, total)                  if left: -                    txt += " (%d seconds left)" % left -                sys.stdout.write(txt) +                    txt += u" (%d seconds left)" % left +                sys.stdout.write(txt.encode('utf-8'))                  sys.stdout.flush()              try:                  self._line_processing(idx_line, line) @@ -623,8 +676,8 @@ class Importer(object):          if 'history_modifier' in \                         self.OBJECT_CLS._meta.get_all_field_names():              data['history_modifier'] = self.history_modifier -        obj, created = self.get_object(self.OBJECT_CLS, data) +        obj, created = self.get_object(self.OBJECT_CLS, data)          if self.import_instance and hasattr(obj, 'imports'):              obj.imports.add(self.import_instance) @@ -669,6 +722,8 @@ class Importer(object):          for formater, val in self._post_processing:              formater.post_process(obj, data, val, owner=self.history_modifier) +        obj = self.post_processing(obj, data) +      def _row_processing(self, c_row, idx_col, idx_line, val, data):          if idx_col >= len(self.line_format):              return @@ -833,12 +888,19 @@ class Importer(object):                                                      self.history_modifier                      data[attribute], created = self.get_object(                                     field_object.rel.to, data[attribute], c_path) +            # default values              path = tuple(path)              if path in self._defaults:                  for k in self._defaults[path]:                      if k not in data or not data[k]:                          data[k] = self._defaults[path][k] +            # pre treatment +            if path in self.STR_CUT: +                for k in self.STR_CUT[path]: +                    if k in data and data[k]: +                        data[k] = unicode(data[k])[:self.STR_CUT[path][k]] +              # filter default values              create_dict = copy.deepcopy(data)              for k in create_dict.keys(): @@ -857,11 +919,7 @@ class Importer(object):                          obj.imports.add(self.import_instance)                  except IntegrityError as e:                      raise IntegrityError(e.message) -                except: -                    q = cls.objects.filter(**create_dict) -                    if not q.count(): -                        raise ImporterError("Erreur d'import %s, contexte : %s"\ -                                                % (unicode(cls), unicode(data))) +                except cls.MultipleObjectsReturned:                      created = False                      obj = cls.objects.filter(**create_dict).all()[0]                  for attr, value in m2ms: @@ -871,6 +929,15 @@ class Importer(object):                      for v in values:                          getattr(obj, attr).add(v)              except IntegrityError as e: +                message = e.message +                try: +                    message = unicode(e.message.decode('utf-8')) +                except (UnicodeDecodeError, UnicodeDecodeError): +                    message = '' +                try: +                    data = unicode(data) +                except UnicodeDecodeError: +                    data = ''                  raise ImporterError(                      "Erreur d'import %s, contexte : %s, erreur : %s" \                      % (unicode(cls), unicode(data), e.message.decode('utf-8'))) diff --git a/ishtar_common/fixtures/initial_dpts-fr.json b/ishtar_common/fixtures/initial_dpts-fr.json new file mode 100644 index 000000000..721a96a8a --- /dev/null +++ b/ishtar_common/fixtures/initial_dpts-fr.json @@ -0,0 +1,1127 @@ +[ +    { +        "pk": 28,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "1",  +            "label": "Guadeloupe" +        } +    },  +    { +        "pk": 33,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "11",  +            "label": "\u00cele-de-France" +        } +    },  +    { +        "pk": 29,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "2",  +            "label": "Martinique" +        } +    },  +    { +        "pk": 34,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "21",  +            "label": "Champagne-Ardenne" +        } +    },  +    { +        "pk": 35,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "22",  +            "label": "Picardie" +        } +    },  +    { +        "pk": 36,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "23",  +            "label": "Haute-Normandie" +        } +    },  +    { +        "pk": 37,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "24",  +            "label": "Centre" +        } +    },  +    { +        "pk": 38,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "25",  +            "label": "Basse-Normandie" +        } +    },  +    { +        "pk": 39,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "26",  +            "label": "Bourgogne" +        } +    },  +    { +        "pk": 30,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "3",  +            "label": "Guyane" +        } +    },  +    { +        "pk": 40,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "31",  +            "label": "Nord-Pas-de-Calais" +        } +    },  +    { +        "pk": 31,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "4",  +            "label": "La R\u00e9union" +        } +    },  +    { +        "pk": 41,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "41",  +            "label": "Lorraine" +        } +    },  +    { +        "pk": 42,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "42",  +            "label": "Alsace" +        } +    },  +    { +        "pk": 43,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "43",  +            "label": "Franche-Comt\u00e9" +        } +    },  +    { +        "pk": 44,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "52",  +            "label": "Pays de la Loire" +        } +    },  +    { +        "pk": 45,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "53",  +            "label": "Bretagne" +        } +    },  +    { +        "pk": 46,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "54",  +            "label": "Poitou-Charentes" +        } +    },  +    { +        "pk": 32,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "6",  +            "label": "Mayotte" +        } +    },  +    { +        "pk": 47,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "72",  +            "label": "Aquitaine" +        } +    },  +    { +        "pk": 48,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "73",  +            "label": "Midi-Pyr\u00e9n\u00e9es" +        } +    },  +    { +        "pk": 49,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "74",  +            "label": "Limousin" +        } +    },  +    { +        "pk": 50,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "82",  +            "label": "Rh\u00f4ne-Alpes" +        } +    },  +    { +        "pk": 51,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "83",  +            "label": "Auvergne" +        } +    },  +    { +        "pk": 52,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "91",  +            "label": "Languedoc-Roussillon" +        } +    },  +    { +        "pk": 53,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "93",  +            "label": "Provence-Alpes-C\u00f4te d'Azur" +        } +    },  +    { +        "pk": 54,  +        "model": "ishtar_common.state",  +        "fields": { +            "number": "94",  +            "label": "Corse" +        } +    },  +    { +        "pk": 1,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "01",  +            "label": "Ain" +        } +    },  +    { +        "pk": 2,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 35,  +            "number": "02",  +            "label": "Aisne" +        } +    },  +    { +        "pk": 3,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 51,  +            "number": "03",  +            "label": "Allier" +        } +    },  +    { +        "pk": 4,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "04",  +            "label": "Alpes-de-Haute-Provence" +        } +    },  +    { +        "pk": 5,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "05",  +            "label": "Hautes-Alpes" +        } +    },  +    { +        "pk": 6,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "06",  +            "label": "Alpes-Maritimes" +        } +    },  +    { +        "pk": 7,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "07",  +            "label": "Ard\u00e8che" +        } +    },  +    { +        "pk": 8,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 34,  +            "number": "08",  +            "label": "Ardennes" +        } +    },  +    { +        "pk": 9,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "09",  +            "label": "Ari\u00e8ge" +        } +    },  +    { +        "pk": 10,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 34,  +            "number": "10",  +            "label": "Aube" +        } +    },  +    { +        "pk": 11,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 52,  +            "number": "11",  +            "label": "Aude" +        } +    },  +    { +        "pk": 12,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "12",  +            "label": "Aveyron" +        } +    },  +    { +        "pk": 13,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "13",  +            "label": "Bouches-du-Rh\u00f4ne" +        } +    },  +    { +        "pk": 14,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 38,  +            "number": "14",  +            "label": "Calvados" +        } +    },  +    { +        "pk": 15,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 51,  +            "number": "15",  +            "label": "Cantal" +        } +    },  +    { +        "pk": 16,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 46,  +            "number": "16",  +            "label": "Charente" +        } +    },  +    { +        "pk": 17,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 46,  +            "number": "17",  +            "label": "Charente-Maritime" +        } +    },  +    { +        "pk": 18,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "18",  +            "label": "Cher" +        } +    },  +    { +        "pk": 19,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 49,  +            "number": "19",  +            "label": "Corr\u00e8ze" +        } +    },  +    { +        "pk": 22,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 39,  +            "number": "21",  +            "label": "C\u00f4te-d'Or" +        } +    },  +    { +        "pk": 23,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 45,  +            "number": "22",  +            "label": "C\u00f4tes-d'Armor" +        } +    },  +    { +        "pk": 24,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 49,  +            "number": "23",  +            "label": "Creuse" +        } +    },  +    { +        "pk": 25,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 47,  +            "number": "24",  +            "label": "Dordogne" +        } +    },  +    { +        "pk": 26,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 43,  +            "number": "25",  +            "label": "Doubs" +        } +    },  +    { +        "pk": 27,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "26",  +            "label": "Dr\u00f4me" +        } +    },  +    { +        "pk": 28,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 36,  +            "number": "27",  +            "label": "Eure" +        } +    },  +    { +        "pk": 29,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "28",  +            "label": "Eure-et-Loir" +        } +    },  +    { +        "pk": 30,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 45,  +            "number": "29",  +            "label": "Finist\u00e8re" +        } +    },  +    { +        "pk": 20,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 54,  +            "number": "2A",  +            "label": "Corse-du-Sud" +        } +    },  +    { +        "pk": 21,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 54,  +            "number": "2B",  +            "label": "Haute-Corse" +        } +    },  +    { +        "pk": 31,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 52,  +            "number": "30",  +            "label": "Gard" +        } +    },  +    { +        "pk": 32,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "31",  +            "label": "Haute-Garonne" +        } +    },  +    { +        "pk": 33,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "32",  +            "label": "Gers" +        } +    },  +    { +        "pk": 34,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 47,  +            "number": "33",  +            "label": "Gironde" +        } +    },  +    { +        "pk": 35,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 52,  +            "number": "34",  +            "label": "H\u00e9rault" +        } +    },  +    { +        "pk": 36,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 45,  +            "number": "35",  +            "label": "Ille-et-Vilaine" +        } +    },  +    { +        "pk": 37,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "36",  +            "label": "Indre" +        } +    },  +    { +        "pk": 38,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "37",  +            "label": "Indre-et-Loire" +        } +    },  +    { +        "pk": 39,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "38",  +            "label": "Is\u00e8re" +        } +    },  +    { +        "pk": 40,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 43,  +            "number": "39",  +            "label": "Jura" +        } +    },  +    { +        "pk": 41,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 47,  +            "number": "40",  +            "label": "Landes" +        } +    },  +    { +        "pk": 42,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "41",  +            "label": "Loir-et-Cher" +        } +    },  +    { +        "pk": 43,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "42",  +            "label": "Loire" +        } +    },  +    { +        "pk": 44,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 51,  +            "number": "43",  +            "label": "Haute-Loire" +        } +    },  +    { +        "pk": 45,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 44,  +            "number": "44",  +            "label": "Loire-Atlantique" +        } +    },  +    { +        "pk": 46,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 37,  +            "number": "45",  +            "label": "Loiret" +        } +    },  +    { +        "pk": 47,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "46",  +            "label": "Lot" +        } +    },  +    { +        "pk": 48,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 47,  +            "number": "47",  +            "label": "Lot-et-Garonne" +        } +    },  +    { +        "pk": 49,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 52,  +            "number": "48",  +            "label": "Loz\u00e8re" +        } +    },  +    { +        "pk": 50,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 44,  +            "number": "49",  +            "label": "Maine-et-Loire" +        } +    },  +    { +        "pk": 51,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 38,  +            "number": "50",  +            "label": "Manche" +        } +    },  +    { +        "pk": 52,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 34,  +            "number": "51",  +            "label": "Marne" +        } +    },  +    { +        "pk": 53,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 34,  +            "number": "52",  +            "label": "Haute-Marne" +        } +    },  +    { +        "pk": 54,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 44,  +            "number": "53",  +            "label": "Mayenne" +        } +    },  +    { +        "pk": 55,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 41,  +            "number": "54",  +            "label": "Meurthe-et-Moselle" +        } +    },  +    { +        "pk": 56,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 41,  +            "number": "55",  +            "label": "Meuse" +        } +    },  +    { +        "pk": 57,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 45,  +            "number": "56",  +            "label": "Morbihan" +        } +    },  +    { +        "pk": 58,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 41,  +            "number": "57",  +            "label": "Moselle" +        } +    },  +    { +        "pk": 59,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 39,  +            "number": "58",  +            "label": "Ni\u00e8vre" +        } +    },  +    { +        "pk": 60,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 40,  +            "number": "59",  +            "label": "Nord" +        } +    },  +    { +        "pk": 61,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 35,  +            "number": "60",  +            "label": "Oise" +        } +    },  +    { +        "pk": 62,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 38,  +            "number": "61",  +            "label": "Orne" +        } +    },  +    { +        "pk": 63,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 40,  +            "number": "62",  +            "label": "Pas-de-Calais" +        } +    },  +    { +        "pk": 64,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 51,  +            "number": "63",  +            "label": "Puy-de-D\u00f4me" +        } +    },  +    { +        "pk": 65,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 47,  +            "number": "64",  +            "label": "Pyr\u00e9n\u00e9es-Atlantiques" +        } +    },  +    { +        "pk": 66,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "65",  +            "label": "Hautes-Pyr\u00e9n\u00e9es" +        } +    },  +    { +        "pk": 67,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 52,  +            "number": "66",  +            "label": "Pyr\u00e9n\u00e9es-Orientales" +        } +    },  +    { +        "pk": 68,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 42,  +            "number": "67",  +            "label": "Bas-Rhin" +        } +    },  +    { +        "pk": 69,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 42,  +            "number": "68",  +            "label": "Haut-Rhin" +        } +    },  +    { +        "pk": 70,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "69",  +            "label": "Rh\u00f4ne" +        } +    },  +    { +        "pk": 71,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 43,  +            "number": "70",  +            "label": "Haute-Sa\u00f4ne" +        } +    },  +    { +        "pk": 72,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 39,  +            "number": "71",  +            "label": "Sa\u00f4ne-et-Loire" +        } +    },  +    { +        "pk": 73,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 44,  +            "number": "72",  +            "label": "Sarthe" +        } +    },  +    { +        "pk": 74,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "73",  +            "label": "Savoie" +        } +    },  +    { +        "pk": 75,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 50,  +            "number": "74",  +            "label": "Haute-Savoie" +        } +    },  +    { +        "pk": 76,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "75",  +            "label": "Paris" +        } +    },  +    { +        "pk": 77,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 36,  +            "number": "76",  +            "label": "Seine-Maritime" +        } +    },  +    { +        "pk": 78,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "77",  +            "label": "Seine-et-Marne" +        } +    },  +    { +        "pk": 79,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "78",  +            "label": "Yvelines" +        } +    },  +    { +        "pk": 80,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 46,  +            "number": "79",  +            "label": "Deux-S\u00e8vres" +        } +    },  +    { +        "pk": 81,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 35,  +            "number": "80",  +            "label": "Somme" +        } +    },  +    { +        "pk": 82,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "81",  +            "label": "Tarn" +        } +    },  +    { +        "pk": 83,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 48,  +            "number": "82",  +            "label": "Tarn-et-Garonne" +        } +    },  +    { +        "pk": 84,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "83",  +            "label": "Var" +        } +    },  +    { +        "pk": 85,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 53,  +            "number": "84",  +            "label": "Vaucluse" +        } +    },  +    { +        "pk": 86,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 44,  +            "number": "85",  +            "label": "Vend\u00e9e" +        } +    },  +    { +        "pk": 87,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 46,  +            "number": "86",  +            "label": "Vienne" +        } +    },  +    { +        "pk": 88,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 49,  +            "number": "87",  +            "label": "Haute-Vienne" +        } +    },  +    { +        "pk": 89,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 41,  +            "number": "88",  +            "label": "Vosges" +        } +    },  +    { +        "pk": 90,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 39,  +            "number": "89",  +            "label": "Yonne" +        } +    },  +    { +        "pk": 91,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 43,  +            "number": "90",  +            "label": "Territoire de Belfort" +        } +    },  +    { +        "pk": 92,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "91",  +            "label": "Essonne" +        } +    },  +    { +        "pk": 93,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "92",  +            "label": "Hauts-de-Seine" +        } +    },  +    { +        "pk": 94,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "93",  +            "label": "Seine-Saint-Denis" +        } +    },  +    { +        "pk": 95,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "94",  +            "label": "Val-de-Marne" +        } +    },  +    { +        "pk": 96,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 33,  +            "number": "95",  +            "label": "Val-d'Oise" +        } +    },  +    { +        "pk": 97,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 28,  +            "number": "971",  +            "label": "Guadeloupe" +        } +    },  +    { +        "pk": 98,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 29,  +            "number": "972",  +            "label": "Martinique" +        } +    },  +    { +        "pk": 99,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 30,  +            "number": "973",  +            "label": "Guyane" +        } +    },  +    { +        "pk": 100,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 31,  +            "number": "974",  +            "label": "La R\u00e9union" +        } +    },  +    { +        "pk": 101,  +        "model": "ishtar_common.department",  +        "fields": { +            "state": 32,  +            "number": "976",  +            "label": "Mayotte" +        } +    } +]
\ No newline at end of file diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py index 88a3306f4..e6f21ae5b 100644 --- a/ishtar_common/forms.py +++ b/ishtar_common/forms.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2010-2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2010-2015 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index 091d31c1c..664dfb775 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -54,6 +54,14 @@ def get_town_field(label=_(u"Town"), required=True):           validators=[models.valid_id(models.Town)], label=label,           help_text=mark_safe(help_text), required=required) +def get_advanced_town_field(label=_(u"Town"), required=True): +    # !FIXME hard_link, reverse_lazy doen't seem to work with formsets +    return forms.IntegerField( +         widget=widgets.JQueryTown("/" + settings.URL_PATH + \ +                                   'autocomplete-advanced-town'), +         validators=[models.valid_id(models.Town)], label=label, +         required=required) +  def get_person_field(label=_(u"Person"), required=True, person_types=[]):      # !FIXME hard_link, reverse_lazy doen't seem to work with formsets      widget = None @@ -193,6 +201,13 @@ class OrganizationFormSelection(forms.Form):                                       OrganizationSelect, models.Organization),           validators=[models.valid_id(models.Organization)]) +class BaseOrganizationForm(forms.ModelForm): +    form_prefix = "orga" +    class Meta: +        model = models.Organization +        fields = ['name', 'organization_type', 'address', 'address_complement', +                  'town', 'postal_code',] +  class PersonSelect(TableSelect):      name = forms.CharField(label=_(u"Name"), max_length=30)      surname = forms.CharField(label=_(u"Surname"), max_length=20) @@ -244,6 +259,39 @@ class SimplePersonForm(NewItemForm):                      associated_model=models.Organization, new=True),          validators=[models.valid_id(models.Organization)], required=False) +class BasePersonForm(forms.ModelForm): +    class Meta: +        model = models.Person +        fields = ['title', 'name', 'surname', 'address', 'address_complement', +                  'town', 'postal_code'] + +class BaseOrganizationPersonForm(forms.ModelForm): +    class Meta: +        model = models.Person +        fields = ['attached_to', 'title', 'name', 'surname',] +        widgets = {'attached_to':widgets.JQueryPersonOrganization( +                reverse_lazy('autocomplete-organization'), +                reverse_lazy('organization_create'), +                model=models.Organization, +                attrs={'hidden':True}, +                new=True), +        } + +    def __init__(self, *args, **kwargs): +        super(BaseOrganizationPersonForm, self).__init__(*args, **kwargs) + +    def save(self, *args, **kwargs): +        person = super(BaseOrganizationPersonForm, self).save(*args, **kwargs) +        instance = person.attached_to +        form = BaseOrganizationForm(self.data, instance=instance, +                                    prefix=BaseOrganizationForm.form_prefix) +        if form.is_valid(): +            orga = form.save() +            if not person.attached_to: +                person.attached_to = orga +                person.save() +        return person +  class PersonForm(SimplePersonForm):      person_types = forms.MultipleChoiceField(label=_("Person type"),                               choices=[], widget=forms.CheckboxSelectMultiple) diff --git a/ishtar_common/ishtar_menu.py b/ishtar_common/ishtar_menu.py index fdfe60448..a26234265 100644 --- a/ishtar_common/ishtar_menu.py +++ b/ishtar_common/ishtar_menu.py @@ -39,6 +39,9 @@ MENU_SECTIONS = [              childs=[                  SectionItem('person', _(u"Person"),                  childs=[ +                    MenuItem('person_search', _(u"Search"), +                        model=models.Person, +                        access_controls=['add_person', 'add_own_person']),                      MenuItem('person_creation', _(u"Creation"),                          model=models.Person,                          access_controls=['add_person', 'add_own_person']), @@ -54,6 +57,10 @@ MENU_SECTIONS = [                      ]),                  SectionItem('organization', _(u"Organization"),                  childs=[ +                    MenuItem('organization_search', _(u"Search"), +                        model=models.Organization, +                        access_controls=['add_organization', +                                         'add_own_organization']),                      MenuItem('organization_creation', _(u"Creation"),                          model=models.Organization,                          access_controls=['add_organization', diff --git a/ishtar_common/locale/fr/LC_MESSAGES/django.po b/ishtar_common/locale/fr/LC_MESSAGES/django.po index 224d480f2..48c5cd2b1 100644 --- a/ishtar_common/locale/fr/LC_MESSAGES/django.po +++ b/ishtar_common/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid ""  msgstr ""  "Project-Id-Version: alpha\n"  "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-06-02 01:14+0200\n" +"POT-Creation-Date: 2015-06-02 01:17+0200\n"  "PO-Revision-Date: 2015-01-25\n"  "Last-Translator: Étienne Loks <etienne.loks at peacefrogs net>\n"  "Language-Team: \n" @@ -32,7 +32,7 @@ msgstr "courriel"  msgid "Archaeological file"  msgstr "Dossier" -#: context_processors.py:35 models.py:970 +#: context_processors.py:35 models.py:983  msgid "Operation"  msgstr "Opération" @@ -44,49 +44,49 @@ msgstr "Unité d'Enregistrement"  msgid "Find"  msgstr "Mobilier" -#: data_importer.py:123 +#: data_importer.py:134  #, python-format  msgid "\"%(value)s\" is too long. The max length is %(length)d characters."  msgstr ""  "\"%(value)s\" est trop long. La longueur maximum est de  %(length)d "  "caractères." -#: data_importer.py:137 +#: data_importer.py:148  #, python-format  msgid "\"%(value)s\" not equal to yes or no"  msgstr "\"%(value)s\" diffère de oui ou non" -#: data_importer.py:148 +#: data_importer.py:159  #, python-format  msgid "\"%(value)s\" is not a float"  msgstr "\"%(value)s\" n'est pas un flottant" -#: data_importer.py:160 data_importer.py:172 data_importer.py:346 +#: data_importer.py:171 data_importer.py:183 data_importer.py:372  #, python-format  msgid "\"%(value)s\" is not a valid date"  msgstr "\"%(value)s\" n'est pas une date valide" -#: data_importer.py:183 +#: data_importer.py:194  #, python-format  msgid "\"%(value)s\" is not an integer"  msgstr "\"%(value)s\" n'est pas un entier" -#: data_importer.py:223 data_importer.py:380 +#: data_importer.py:236 data_importer.py:408  #, python-format  msgid "Choice for \"%s\" is not available. Which one is relevant?\n"  msgstr "Le choix pour \"%s\" n'est pas disponible. Lequel est pertinent ?\n" -#: data_importer.py:230 +#: data_importer.py:243  #, python-format  msgid "%d. None of the above - create new"  msgstr "%d. Aucun de ceux-là - créer un nouveau" -#: data_importer.py:233 +#: data_importer.py:246  #, python-format  msgid "%d. None of the above - skip"  msgstr "%d. Aucun de ceux-là - passer" -#: data_importer.py:430 +#: data_importer.py:474  msgid ""  "The given file is not correct. Check the file format. If you use a CSV file: "  "check that column separator and encoding are similar to the ones used by the " @@ -96,41 +96,41 @@ msgstr ""  "utilisez un fichier CSV : vérifiez que le séparateur de colonne et "  "l'encodage sont similaires à ceux du fichier de référence." -#: data_importer.py:434 +#: data_importer.py:478  #, python-format  msgid "Too many cols (%(user_col)d) when maximum is %(ref_col)d"  msgstr "Trop de colonnes (%(user_col)d). Le maximum est %(ref_col)d" -#: data_importer.py:436 +#: data_importer.py:480  msgid "No data provided"  msgstr "Aucune donnée fournie" -#: data_importer.py:437 +#: data_importer.py:481  msgid "Value is required"  msgstr "Valeur requise" -#: data_importer.py:438 +#: data_importer.py:482  #, python-format  msgid "At least %d columns must be filled"  msgstr "Au moins %d colonnes doivent être remplies" -#: data_importer.py:439 +#: data_importer.py:483  msgid "The regexp doesn't match."  msgstr "L'expression régulière ne fonctionne pas" -#: data_importer.py:896 +#: data_importer.py:963  msgid "line"  msgstr "ligne" -#: data_importer.py:896 +#: data_importer.py:963  msgid "col"  msgstr "colonne" -#: data_importer.py:896 +#: data_importer.py:963  msgid "error"  msgstr "erreur" -#: data_importer.py:909 +#: data_importer.py:976  #, python-format  msgid "\"%(value)s\" not in %(values)s"  msgstr "\"%(value)s\" n'est pas dans %(values)s" @@ -139,7 +139,7 @@ msgstr "\"%(value)s\" n'est pas dans %(values)s"  msgid "Enter a valid name consisting of letters, spaces and hyphens."  msgstr "Entrez un nom correct composé de lettres, espaces et tirets." -#: forms.py:76 forms_common.py:331 +#: forms.py:76 forms_common.py:379  msgid "Confirm"  msgstr "Confirmation" @@ -167,8 +167,9 @@ msgstr "Ajouter un nouvel élément"  msgid "Template"  msgstr "Patron" -#: forms_common.py:43 forms_common.py:153 forms_common.py:234 -#: forms_common.py:239 models.py:901 models.py:1777 +#: forms_common.py:43 forms_common.py:57 forms_common.py:161 +#: forms_common.py:249 forms_common.py:254 models.py:914 models.py:1805 +#: templates/blocks/JQueryAdvancedTown.html:19  #: templates/ishtar/sheet_organization.html:17  #: templates/ishtar/sheet_person.html:20 templates/ishtar/sheet_person.html:30  msgid "Town" @@ -192,70 +193,70 @@ msgstr ""  "<p class='example'>Par exemple tapez « saint denis 93 » pour obtenir la "  "commune Saint-Denis dans le département français de Seine-Saint-Denis.</p>" -#: forms_common.py:57 forms_common.py:519 ishtar_menu.py:40 models.py:1553 -#: models.py:1639 models.py:1679 templates/ishtar/sheet_person.html:6 +#: forms_common.py:65 forms_common.py:567 ishtar_menu.py:40 models.py:1566 +#: models.py:1667 models.py:1707 templates/ishtar/sheet_person.html:6  msgid "Person"  msgstr "Individu" -#: forms_common.py:141 forms_common.py:201 ishtar_menu.py:55 models.py:1491 +#: forms_common.py:149 forms_common.py:216 ishtar_menu.py:58 models.py:1504  #: templates/ishtar/sheet_organization.html:6  msgid "Organization"  msgstr "Organisation" -#: forms_common.py:143 forms_common.py:179 forms_common.py:197 -#: forms_common.py:226 models.py:850 models.py:1005 models.py:1163 -#: models.py:1486 models.py:1543 models.py:1763 +#: forms_common.py:151 forms_common.py:187 forms_common.py:212 +#: forms_common.py:241 models.py:850 models.py:1018 models.py:1176 +#: models.py:1499 models.py:1556 models.py:1791  #: templates/ishtar/sheet_organization.html:12  #: templates/ishtar/sheet_organization.html:25  #: templates/ishtar/sheet_person.html:12 templates/ishtar/sheet_person.html:26  msgid "Name"  msgstr "Nom" -#: forms_common.py:145 models.py:965 models.py:1244 +#: forms_common.py:153 models.py:978 models.py:1257  msgid "Organization type"  msgstr "Type d'organisation" -#: forms_common.py:147 forms_common.py:228 models.py:896 +#: forms_common.py:155 forms_common.py:243 models.py:909  #: templates/ishtar/sheet_organization.html:14  #: templates/ishtar/sheet_person.html:17 templates/ishtar/sheet_person.html:27  msgid "Address"  msgstr "Adresse" -#: forms_common.py:149 forms_common.py:230 models.py:897 +#: forms_common.py:157 forms_common.py:245 models.py:910  #: templates/ishtar/sheet_organization.html:15  #: templates/ishtar/sheet_person.html:18 templates/ishtar/sheet_person.html:28  msgid "Address complement"  msgstr "Complément d'adresse" -#: forms_common.py:151 forms_common.py:232 models.py:899 +#: forms_common.py:159 forms_common.py:247 models.py:912  #: templates/ishtar/sheet_organization.html:16  #: templates/ishtar/sheet_person.html:19 templates/ishtar/sheet_person.html:29  msgid "Postal code"  msgstr "Code postal" -#: forms_common.py:154 forms_common.py:235 models.py:902 +#: forms_common.py:162 forms_common.py:250 models.py:915  msgid "Country"  msgstr "Pays" -#: forms_common.py:156 forms_common.py:199 forms_common.py:237 -#: forms_common.py:289 models.py:907 templates/ishtar/sheet_person.html:15 +#: forms_common.py:164 forms_common.py:214 forms_common.py:252 +#: forms_common.py:337 models.py:920 templates/ishtar/sheet_person.html:15  msgid "Email"  msgstr "Courriel" -#: forms_common.py:157 forms_common.py:238 models.py:904 +#: forms_common.py:165 forms_common.py:253 models.py:917  #: templates/ishtar/sheet_organization.html:18  #: templates/ishtar/sheet_person.html:21 templates/ishtar/sheet_person.html:31  msgid "Phone"  msgstr "Téléphone" -#: forms_common.py:158 models.py:905 +#: forms_common.py:166 models.py:918  #: templates/ishtar/sheet_organization.html:19  #: templates/ishtar/sheet_person.html:22 templates/ishtar/sheet_person.html:32  msgid "Mobile phone"  msgstr "Téléphone portable" -#: forms_common.py:180 forms_common.py:200 models.py:1259 models.py:1488 -#: models.py:1715 templates/sheet_ope.html:85 templates/sheet_ope.html.py:105 +#: forms_common.py:188 forms_common.py:215 models.py:1272 models.py:1501 +#: models.py:1743 templates/sheet_ope.html:85 templates/sheet_ope.html.py:105  #: templates/sheet_ope.html:126 templates/ishtar/import_list.html:13  #: templates/ishtar/sheet_organization.html:27  #: templates/ishtar/sheet_person.html:42 templates/ishtar/sheet_person.html:95 @@ -263,121 +264,121 @@ msgstr "Téléphone portable"  msgid "Type"  msgstr "Type" -#: forms_common.py:188 +#: forms_common.py:196 views.py:106  msgid "Organization search"  msgstr "Recherche d'organisations" -#: forms_common.py:198 forms_common.py:224 models.py:1541 +#: forms_common.py:213 forms_common.py:239 models.py:1554  #: templates/ishtar/sheet_organization.html:26  #: templates/ishtar/sheet_person.html:13  msgid "Surname"  msgstr "Prénom" -#: forms_common.py:212 +#: forms_common.py:227 views.py:80  msgid "Person search"  msgstr "Recherche d'individus" -#: forms_common.py:221 +#: forms_common.py:236  msgid "Identity"  msgstr "Identité" -#: forms_common.py:223 forms_common.py:476 models.py:1539 models.py:1712 +#: forms_common.py:238 forms_common.py:524 models.py:1552 models.py:1740  #: templates/sheet_ope.html:104 templates/ishtar/sheet_person.html:94  #: templates/ishtar/blocks/window_tables/documents.html:5  msgid "Title"  msgstr "Titre" -#: forms_common.py:241 +#: forms_common.py:256  msgid "Current organization"  msgstr "Organisation actuelle" -#: forms_common.py:248 forms_common.py:271 forms_common.py:274 models.py:1524 +#: forms_common.py:296 forms_common.py:319 forms_common.py:322 models.py:1537  msgid "Person type"  msgstr "Type d'individu" -#: forms_common.py:284 forms_common.py:288 +#: forms_common.py:332 forms_common.py:336  msgid "Account"  msgstr "Compte" -#: forms_common.py:291 wizards.py:938 +#: forms_common.py:339 wizards.py:948  msgid "New password"  msgstr "Nouveau mot de passe" -#: forms_common.py:295 +#: forms_common.py:343  msgid "New password (confirmation)"  msgstr "Nouveau mot de passe (confirmation)" -#: forms_common.py:313 +#: forms_common.py:361  msgid "Your password and confirmation password do not match."  msgstr "La vérification du mot de passe a échoué." -#: forms_common.py:318 +#: forms_common.py:366  msgid "You must provide a correct password."  msgstr "Vous devez fournir un mot de passe correct." -#: forms_common.py:326 +#: forms_common.py:374  msgid "This username already exists."  msgstr "Ce nom d'utilisateur existe déjà." -#: forms_common.py:332 +#: forms_common.py:380  msgid "Send the new password by email?"  msgstr "Envoyer le nouveau mot de passe par courriel ?" -#: forms_common.py:340 forms_common.py:352 models.py:1778 +#: forms_common.py:388 forms_common.py:400 models.py:1806  #: templates/ishtar/sheet_person.html:72  msgid "Towns"  msgstr "Communes" -#: forms_common.py:349 +#: forms_common.py:397  msgid "There are identical towns."  msgstr "Il y a des communes identiques." -#: forms_common.py:428 +#: forms_common.py:476  msgid "Only one choice can be checked."  msgstr "Seul un choix peut être coché." -#: forms_common.py:474 +#: forms_common.py:522  msgid "Documentation informations"  msgstr "Information sur le document" -#: forms_common.py:478 forms_common.py:497 models.py:1245 models.py:1698 +#: forms_common.py:526 forms_common.py:545 models.py:1258 models.py:1726  msgid "Source type"  msgstr "Type de source" -#: forms_common.py:480 models.py:1725 +#: forms_common.py:528 models.py:1753  msgid "Numerical ressource (web address)"  msgstr "Ressource numérique (adresse web)" -#: forms_common.py:481 models.py:1727 +#: forms_common.py:529 models.py:1755  msgid "Receipt date"  msgstr "Date de réception" -#: forms_common.py:483 models.py:1355 models.py:1729 +#: forms_common.py:531 models.py:1368 models.py:1757  msgid "Creation date"  msgstr "Date de création" -#: forms_common.py:494 forms_common.py:513 forms_common.py:544 models.py:1684 +#: forms_common.py:542 forms_common.py:561 forms_common.py:592 models.py:1712  #: templates/ishtar/wizard/wizard_person_deletion.html:124  msgid "Author"  msgstr "Auteur" -#: forms_common.py:506 +#: forms_common.py:554  msgid "Would you like to delete this documentation?"  msgstr "Voulez-vous supprimer ce document ?" -#: forms_common.py:520 models.py:1246 models.py:1675 models.py:1681 +#: forms_common.py:568 models.py:1259 models.py:1703 models.py:1709  msgid "Author type"  msgstr "Type d'auteur" -#: forms_common.py:538 +#: forms_common.py:586  msgid "Author selection"  msgstr "Sélection d'auteur" -#: forms_common.py:550 +#: forms_common.py:598  msgid "There are identical authors."  msgstr "Il y a des auteurs identiques." -#: forms_common.py:554 models.py:1685 models.py:1722 +#: forms_common.py:602 models.py:1713 models.py:1750  #: templates/sheet_ope.html:106  #: templates/ishtar/blocks/window_tables/documents.html:7  msgid "Authors" @@ -387,11 +388,11 @@ msgstr "Auteurs"  msgid "Administration"  msgstr "Administration" -#: ishtar_menu.py:30 views.py:122 +#: ishtar_menu.py:30 views.py:132  msgid "Account management"  msgstr "Gestion des comptes" -#: ishtar_menu.py:33 models.py:641 views.py:864 +#: ishtar_menu.py:33 models.py:641 views.py:930  msgid "Global variables"  msgstr "Variables globales" @@ -399,35 +400,39 @@ msgstr "Variables globales"  msgid "Directory"  msgstr "Annuaire" -#: ishtar_menu.py:42 ishtar_menu.py:57 templates/ishtar/import_list.html:15 +#: ishtar_menu.py:42 ishtar_menu.py:60 templates/blocks/JQueryJqGrid.html:4 +msgid "Search" +msgstr "Recherche" + +#: ishtar_menu.py:45 ishtar_menu.py:64 templates/ishtar/import_list.html:15  msgid "Creation"  msgstr "Ajout" -#: ishtar_menu.py:45 ishtar_menu.py:61 +#: ishtar_menu.py:48 ishtar_menu.py:68  msgid "Modification"  msgstr "Modification" -#: ishtar_menu.py:48 ishtar_menu.py:65 templates/ishtar/merge.html:5 +#: ishtar_menu.py:51 ishtar_menu.py:72 templates/ishtar/merge.html:5  msgid "Merge"  msgstr "Fusion" -#: ishtar_menu.py:51 ishtar_menu.py:68 models.py:1389 widgets.py:107 +#: ishtar_menu.py:54 ishtar_menu.py:75 models.py:1402 widgets.py:108  msgid "Delete"  msgstr "Suppression" -#: ishtar_menu.py:75 models.py:1363 +#: ishtar_menu.py:82 models.py:1376  msgid "Imports"  msgstr "Imports" -#: ishtar_menu.py:77 views.py:871 +#: ishtar_menu.py:84 views.py:937  msgid "New import"  msgstr "Nouvel import" -#: ishtar_menu.py:80 views.py:884 +#: ishtar_menu.py:87 views.py:950  msgid "Current imports"  msgstr "Imports en cours" -#: ishtar_menu.py:83 +#: ishtar_menu.py:90  msgid "Old imports"  msgstr "Anciens imports" @@ -443,7 +448,7 @@ msgstr "Un élément sélectionné n'est pas valide."  msgid "This item already exist."  msgstr "Cet élément existe déjà." -#: models.py:239 models.py:884 +#: models.py:239 models.py:884 models.py:895  msgid "Label"  msgstr "Libellé" @@ -451,7 +456,7 @@ msgstr "Libellé"  msgid "Textual ID"  msgstr "Identifiant textuel" -#: models.py:242 models.py:1736 +#: models.py:242 models.py:1764  msgid "Comment"  msgstr "Commentaire" @@ -459,7 +464,7 @@ msgstr "Commentaire"  msgid "Available"  msgstr "Disponible" -#: models.py:415 models.py:1207 +#: models.py:415 models.py:1220  msgid "Key"  msgstr "Clé" @@ -483,7 +488,7 @@ msgstr "Nom de la variable"  msgid "Description of the variable"  msgstr "Description de la variable" -#: models.py:638 models.py:1208 +#: models.py:638 models.py:1221  msgid "Value"  msgstr "Valeur" @@ -495,7 +500,7 @@ msgstr "Variables globales"  msgid "Total"  msgstr "Total" -#: models.py:762 models.py:885 +#: models.py:762 models.py:885 models.py:896  #: templates/ishtar/dashboards/dashboard_main_detail.html:135  #: templates/ishtar/dashboards/dashboard_main_detail_users.html:26  msgid "Number" @@ -517,439 +522,439 @@ msgstr "Patron de document"  msgid "Document templates"  msgstr "Patrons de documents" -#: models.py:888 +#: models.py:888 models.py:897 models.py:1366 +msgid "State" +msgstr "État" + +#: models.py:901 templates/blocks/JQueryAdvancedTown.html:12  msgid "Department"  msgstr "Département" -#: models.py:889 +#: models.py:902  msgid "Departments"  msgstr "Départements" -#: models.py:914 +#: models.py:927  msgid "Merge key"  msgstr "Clé de fusion" -#: models.py:966 +#: models.py:979  msgid "Organization types"  msgstr "Types d'organisation" -#: models.py:971 +#: models.py:984  msgid "Parcels"  msgstr "Parcelles" -#: models.py:973 +#: models.py:986  msgid "Operation source"  msgstr "Documentation de l'opération" -#: models.py:976 views.py:709 views.py:765 +#: models.py:989 views.py:761 views.py:817  msgid "Archaeological files"  msgstr "Dossiers archéologiques" -#: models.py:980 views.py:712 views.py:774 +#: models.py:993 views.py:764 views.py:826  msgid "Context records"  msgstr "Unité d'Enregistrement" -#: models.py:1007 models.py:1164 models.py:1735 templates/sheet_ope.html:128 +#: models.py:1020 models.py:1177 models.py:1763 templates/sheet_ope.html:128  msgid "Description"  msgstr "Description" -#: models.py:1009 templates/ishtar/dashboards/dashboard_main.html:26 +#: models.py:1022 templates/ishtar/dashboards/dashboard_main.html:26  msgid "Users"  msgstr "Utilisateurs" -#: models.py:1011 +#: models.py:1024  msgid "Associated model"  msgstr "Modèle associé" -#: models.py:1013 +#: models.py:1026  msgid "Is template"  msgstr "Est un patron" -#: models.py:1015 +#: models.py:1028  msgid "Importer - Type"  msgstr "Importeur - Type" -#: models.py:1016 +#: models.py:1029  msgid "Importer - Types"  msgstr "Importeur - Types" -#: models.py:1085 +#: models.py:1098  msgid "Importer - Default"  msgstr "Importeur - Par défaut" -#: models.py:1086 +#: models.py:1099  msgid "Importer - Defaults"  msgstr "Importeur - Par défaut" -#: models.py:1112 +#: models.py:1125  msgid "Importer - Default value"  msgstr "Importeur - Valeur par défaut" -#: models.py:1113 +#: models.py:1126  msgid "Importer - Default values"  msgstr "Importeur - Valeurs par défaut" -#: models.py:1144 +#: models.py:1157  msgid "Column number"  msgstr "Numéro de colonne" -#: models.py:1146 +#: models.py:1159  msgid "Required"  msgstr "Requis" -#: models.py:1148 +#: models.py:1161  msgid "Importer - Column"  msgstr "Importeur - Colonne" -#: models.py:1149 +#: models.py:1162  msgid "Importer - Columns"  msgstr "Importeur - Colonnes" -#: models.py:1156 +#: models.py:1169  msgid "Field name"  msgstr "Nom du champ" -#: models.py:1159 +#: models.py:1172  msgid "Importer - Duplicate field"  msgstr "Importeur - Champ dupliqué" -#: models.py:1160 +#: models.py:1173  msgid "Importer - Duplicate fields"  msgstr "Importeur - Champs dupliqués" -#: models.py:1166 +#: models.py:1179  msgid "Regular expression"  msgstr "Expression régulière" -#: models.py:1168 +#: models.py:1181  msgid "Importer - Regular expression"  msgstr "Importeur - Expression régulière" -#: models.py:1169 +#: models.py:1182  msgid "Importer - Regular expressions"  msgstr "Importeur - Expressions régulières" -#: models.py:1183 +#: models.py:1196  msgid "Importer - Target"  msgstr "Importeur - Cible" -#: models.py:1184 +#: models.py:1197  msgid "Importer - Targets"  msgstr "Importeur - Cibles" -#: models.py:1209 +#: models.py:1222  msgid "Is set"  msgstr "Est défini" -#: models.py:1213 +#: models.py:1226  msgid "Importer - Target key"  msgstr "Importeur - Rapprochement" -#: models.py:1214 +#: models.py:1227  msgid "Importer - Targets keys"  msgstr "Importeur - Rapprochements" -#: models.py:1247 models.py:1708 models.py:1718 +#: models.py:1260 models.py:1736 models.py:1746  msgid "Format"  msgstr "Format" -#: models.py:1248 +#: models.py:1261  msgid "Operation type"  msgstr "Type d'opération" -#: models.py:1249 +#: models.py:1262  msgid "Period"  msgstr "Périodes" -#: models.py:1255 +#: models.py:1268  msgid "Integer"  msgstr "Entier" -#: models.py:1256 +#: models.py:1269  msgid "Float"  msgstr "Nombre à virgule" -#: models.py:1257 +#: models.py:1270  msgid "String"  msgstr "Chaine de caractères" -#: models.py:1258 templates/sheet_ope.html:86 +#: models.py:1271 templates/sheet_ope.html:86  msgid "Date"  msgstr "Date" -#: models.py:1260 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 +#: models.py:1273 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83  #: templates/ishtar/sheet_person.html:39 templates/ishtar/sheet_person.html:68  #: templates/ishtar/sheet_person.html:93  #: templates/ishtar/dashboards/dashboard_main_detail.html:120  msgid "Year"  msgstr "Année" -#: models.py:1273 +#: models.py:1286  msgid "4 digit year. e.g.: \"2015\""  msgstr "Année à 4 chiffres. Exemple : « 2015 »" -#: models.py:1274 +#: models.py:1287  msgid "4 digit year/month/day. e.g.: \"2015/02/04\""  msgstr "Année à 4 chiffres/mois/jour. Exemple : « 2015/02/04 »" -#: models.py:1275 +#: models.py:1288  msgid "Day/month/4 digit year. e.g.: \"04/02/2015\""  msgstr "Jour/mois/année à 4 chiffres. Exemple : « 04/02/2015 »" -#: models.py:1284 +#: models.py:1297  msgid "Options"  msgstr "Options" -#: models.py:1286 +#: models.py:1299  msgid "Split character(s)"  msgstr "Caractère de séparation" -#: models.py:1289 +#: models.py:1302  msgid "Importer - Formater type"  msgstr "Importeur - Type de mise en forme" -#: models.py:1290 +#: models.py:1303  msgid "Importer - Formater types"  msgstr "Importeur - Types de mise en forme" -#: models.py:1329 templates/ishtar/dashboards/dashboard_main_detail.html:61 +#: models.py:1342 templates/ishtar/dashboards/dashboard_main_detail.html:61  msgid "Created"  msgstr "Créé" -#: models.py:1330 +#: models.py:1343  msgid "Analyse in progress"  msgstr "Analyse en cours" -#: models.py:1331 +#: models.py:1344  msgid "Analysed"  msgstr "Analysé" -#: models.py:1332 +#: models.py:1345  msgid "Import pending"  msgstr "Import en attente" -#: models.py:1333 +#: models.py:1346  msgid "Import in progress"  msgstr "Import en cours" -#: models.py:1334 +#: models.py:1347  msgid "Finished with errors"  msgstr "Finis avec des erreurs" -#: models.py:1335 +#: models.py:1348  msgid "Finished"  msgstr "Terminé" -#: models.py:1336 +#: models.py:1349  msgid "Archived"  msgstr "Archivé" -#: models.py:1344 +#: models.py:1357  msgid "Imported file"  msgstr "Fichier importé" -#: models.py:1346 +#: models.py:1359  msgid "Skip lines"  msgstr "Nombre de lignes d'entête" -#: models.py:1347 templates/ishtar/import_list.html:47 +#: models.py:1360 templates/ishtar/import_list.html:47  msgid "Error file"  msgstr "Fichier erreur" -#: models.py:1350 +#: models.py:1363  msgid "Result file"  msgstr "Fichier résultant" -#: models.py:1353 -msgid "State" -msgstr "État" - -#: models.py:1357 +#: models.py:1370  msgid "End date"  msgstr "Date de fin" -#: models.py:1359 +#: models.py:1372  msgid "Seconds remaining"  msgstr "Secondes restantes" -#: models.py:1362 +#: models.py:1375  msgid "Import"  msgstr "Import" -#: models.py:1379 +#: models.py:1392  msgid "Analyse"  msgstr "Analyser" -#: models.py:1381 models.py:1384 +#: models.py:1394 models.py:1397  msgid "Re-analyse"  msgstr "Analyser de nouveau " -#: models.py:1382 +#: models.py:1395  msgid "Launch import"  msgstr "Lancer l'import" -#: models.py:1385 +#: models.py:1398  msgid "Re-import" -msgstr "Re-import" +msgstr "re-import" -#: models.py:1386 +#: models.py:1399  msgid "Archive"  msgstr "Archiver" -#: models.py:1388 +#: models.py:1401  msgid "Unarchive"  msgstr "Dé-archiver" -#: models.py:1492 +#: models.py:1505  msgid "Organizations"  msgstr "Organisations" -#: models.py:1494 +#: models.py:1507  msgid "Can view all Organization"  msgstr "Peut voir toutes les Organisations" -#: models.py:1495 +#: models.py:1508  msgid "Can view own Organization"  msgstr "Peut voir sa propre Organisation" -#: models.py:1496 +#: models.py:1509  msgid "Can add own Organization"  msgstr "Peut ajouter sa propre Organisation" -#: models.py:1497 +#: models.py:1510  msgid "Can change own Organization"  msgstr "Peut changer sa propre Organisation" -#: models.py:1498 +#: models.py:1511  msgid "Can delete own Organization"  msgstr "Peut supprimer sa propre Organisation" -#: models.py:1521 +#: models.py:1534  msgid "Groups"  msgstr "Groupes" -#: models.py:1525 +#: models.py:1538  msgid "Person types"  msgstr "Types d'individu" -#: models.py:1531 +#: models.py:1544  msgid "Mr"  msgstr "M." -#: models.py:1532 +#: models.py:1545  msgid "Miss"  msgstr "Mlle" -#: models.py:1533 +#: models.py:1546  msgid "Mr and Miss"  msgstr "M. et Mme" -#: models.py:1534 +#: models.py:1547  msgid "Mrs"  msgstr "Mme" -#: models.py:1535 +#: models.py:1548  msgid "Doctor"  msgstr "Dr." -#: models.py:1545 +#: models.py:1558  msgid "Raw name"  msgstr "Nom brut" -#: models.py:1547 models.py:1584 +#: models.py:1560 models.py:1600  msgid "Types"  msgstr "Types" -#: models.py:1550 +#: models.py:1563  msgid "Is attached to"  msgstr "Est rattaché à" -#: models.py:1554 +#: models.py:1567  msgid "Persons"  msgstr "Individus" -#: models.py:1556 +#: models.py:1569  msgid "Can view all Person"  msgstr "Peut voir toutes les Personnes" -#: models.py:1557 +#: models.py:1570  msgid "Can view own Person"  msgstr "Peut voir sa propre Personne" -#: models.py:1558 +#: models.py:1571  msgid "Can add own Person"  msgstr "Peut ajouter sa propre Personne" -#: models.py:1559 +#: models.py:1572  msgid "Can change own Person"  msgstr "Peut changer sa propre Personne" -#: models.py:1560 +#: models.py:1573  msgid "Can delete own Person"  msgstr "Peut supprimer sa propre Personne" -#: models.py:1643 +#: models.py:1671  msgid "Ishtar user"  msgstr "Utilisateur d'Ishtar" -#: models.py:1644 +#: models.py:1672  msgid "Ishtar users"  msgstr "Utilisateurs d'Ishtar" -#: models.py:1676 +#: models.py:1704  msgid "Author types"  msgstr "Types d'auteur" -#: models.py:1699 +#: models.py:1727  msgid "Source types"  msgstr "Types de source" -#: models.py:1703 +#: models.py:1731  msgid "Support type"  msgstr "Type de support" -#: models.py:1704 +#: models.py:1732  msgid "Support types"  msgstr "Types de support" -#: models.py:1709 +#: models.py:1737  msgid "Formats"  msgstr "Formats" -#: models.py:1713 +#: models.py:1741  msgid "External ID"  msgstr "Identifiant extern" -#: models.py:1716 +#: models.py:1744  msgid "Support"  msgstr "Support" -#: models.py:1720 +#: models.py:1748  msgid "Scale"  msgstr "Échelle" -#: models.py:1730 +#: models.py:1758  msgid "Item number"  msgstr "Numéro d'élément" -#: models.py:1731 templates/ishtar/sheet_person.html:40 +#: models.py:1759 templates/ishtar/sheet_person.html:40  #: templates/ishtar/sheet_person.html:67  msgid "Ref."  msgstr "Réf." -#: models.py:1733 +#: models.py:1761  msgid "Internal reference"  msgstr "Référence interne" -#: models.py:1737 +#: models.py:1765  msgid "Additional information"  msgstr "Informations supplémentaires" -#: models.py:1764 +#: models.py:1792  msgid "Surface (m²)"  msgstr "Surface (m²)" -#: models.py:1765 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 +#: models.py:1793 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107  msgid "Localisation"  msgstr "Localisation" @@ -957,90 +962,98 @@ msgstr "Localisation"  msgid " (...)"  msgstr " (...)" -#: views.py:82 +#: views.py:87  msgid "New person"  msgstr "Nouvelle personne" -#: views.py:90 +#: views.py:95  msgid "Person modification"  msgstr "Modification d'une personne" -#: views.py:96 +#: views.py:101  msgid "Person deletion"  msgstr "Suppression de personne" -#: views.py:102 +#: views.py:112  msgid "New organization"  msgstr "Nouvelle organisation" -#: views.py:109 +#: views.py:119  msgid "Organization modification"  msgstr "Modification d'une organisation" -#: views.py:115 +#: views.py:125  msgid "Organization deletion"  msgstr "Suppression d'une organisation" -#: views.py:212 +#: views.py:261  msgid "True"  msgstr "Oui" -#: views.py:214 +#: views.py:263  msgid "False"  msgstr "Non" -#: views.py:437 templates/base.html:75 +#: views.py:486 templates/base.html:76  #: templates/ishtar/sheet_organization.html:35  #: templates/ishtar/sheet_person.html:57 templates/ishtar/sheet_person.html:83  msgid "Details"  msgstr "Détails" -#: views.py:645 views.py:692 +#: views.py:697 views.py:744  msgid "Operation not permitted."  msgstr "Opération non permise." -#: views.py:647 +#: views.py:699  #, python-format  msgid "New %s"  msgstr "Nouveau %s" -#: views.py:710 views.py:769 +#: views.py:762 views.py:821  msgid "Operations"  msgstr "Opérations" -#: views.py:714 views.py:779 +#: views.py:766 views.py:831  msgid "Finds"  msgstr "Mobilier" -#: views.py:928 templates/ishtar/import_list.html:43 +#: views.py:994 templates/ishtar/import_list.html:43  msgid "Link unmatched items"  msgstr "Associer les éléments non rapprochés" -#: views.py:942 +#: views.py:1008  msgid "Delete import"  msgstr "Suppression de l'import" -#: widgets.py:352 +#: views.py:1056 views.py:1071 +msgid "Corporation manager" +msgstr "Représentant de la personne morale" + +#: widgets.py:222 widgets.py:326 widgets.py:441 +msgid "Search..." +msgstr "Recherche..." + +#: widgets.py:552  msgid "No results"  msgstr "Pas de résultats" -#: widgets.py:353 +#: widgets.py:553  msgid "Loading..."  msgstr "Chargement..." -#: widgets.py:354 +#: widgets.py:554  msgid "Remove"  msgstr "Enlever" -#: wizards.py:227 templates/ishtar/import_delete.html:14 +#: wizards.py:230 templates/ishtar/import_delete.html:14  msgid "Yes"  msgstr "Oui" -#: wizards.py:229 +#: wizards.py:232  msgid "No"  msgstr "Non" -#: wizards.py:992 +#: wizards.py:1002  #, python-format  msgid "[%(app_name)s] Account creation/modification"  msgstr "[%(app_name)s] Ajout - modification du compte" @@ -1079,38 +1092,38 @@ msgstr "Merci pour l'intérêt que vous portez au projet."  msgid "The %(app_name)s team"  msgstr "L'équipe %(app_name)s" -#: templates/base.html:29 +#: templates/base.html:30  msgid "Logged in"  msgstr "Connecté" -#: templates/base.html:30 +#: templates/base.html:31  msgid "Log out"  msgstr "Déconnexion" -#: templates/base.html:31 +#: templates/base.html:32  msgid "Change password"  msgstr "Changement de mot de passe" -#: templates/base.html:33 templates/registration/activate.html:10 +#: templates/base.html:34 templates/registration/activate.html:10  #: templates/registration/login.html:8 templates/registration/login.html:10  #: templates/registration/password_reset_complete.html:8  msgid "Log in"  msgstr "Connexion" -#: templates/base.html:39 +#: templates/base.html:40  msgid "Lang"  msgstr "Langue" -#: templates/base.html:39 templates/base.html.py:86 +#: templates/base.html:40 templates/base.html.py:87  #: templates/ishtar/import_delete.html:10  msgid ":"  msgstr " :" -#: templates/base.html:64 +#: templates/base.html:65  msgid "Default selected items"  msgstr "Éléments sélectionnés par défaut" -#: templates/base.html:84 +#: templates/base.html:85  msgid "Current items"  msgstr "Éléments courants" @@ -1349,9 +1362,14 @@ msgstr "Ajout"  msgid "Ishtar administration"  msgstr "Administration d'Ishtar" -#: templates/blocks/JQueryJqGrid.html:4 -msgid "Search" -msgstr "Recherche" +#: templates/blocks/JQueryAdvancedTown.html:3 +msgctxt "Région" +msgid "State" +msgstr "Région" + +#: templates/blocks/JQueryAdvancedTown.html:29 +msgid "Choose a state first" +msgstr "Choisissez une région"  #: templates/blocks/JQueryJqGrid.html:10  msgid "Search and select an item" @@ -1381,14 +1399,10 @@ msgstr "Aide"  #: templates/ishtar/form.html:10 templates/ishtar/formset.html:8  #: templates/ishtar/import_list.html:55 templates/ishtar/merge.html:31 -#: templates/ishtar/wizard/confirm_wizard.html:40 -#: templates/ishtar/wizard/default_wizard.html:28 -#: templates/ishtar/wizard/default_wizard.html:44 -#: templates/ishtar/wizard/parcels_wizard.html:12 -#: templates/ishtar/wizard/parcels_wizard.html:27 +#: templates/ishtar/wizard/confirm_wizard.html:41 +#: templates/ishtar/wizard/default_wizard.html:29  #: templates/ishtar/wizard/search.html:13 -#: templates/ishtar/wizard/towns_wizard.html:12 -#: templates/ishtar/wizard/towns_wizard.html:32 +#: templates/ishtar/wizard/validation_bar.html:4  msgid "Validate"  msgstr "Valider" @@ -1461,6 +1475,36 @@ msgstr "A doublonne B"  msgid "Is not duplicate"  msgstr "N'est pas un doublon" +#: templates/ishtar/organization_person_form.html:9 +#: templates/ishtar/person_form.html:9 +msgid "Identification" +msgstr "Identification" + +#: templates/ishtar/organization_person_form.html:32 +#: templates/ishtar/person_form.html:43 +msgid "Modify" +msgstr "Modifier" + +#: templates/ishtar/organization_person_form.html:33 +#: templates/ishtar/person_form.html:44 +msgid "New" +msgstr "Nouveau" + +#: templates/ishtar/organization_person_form.html:34 +#: templates/ishtar/person_form.html:45 +msgid "Save" +msgstr "Enregistrer" + +#: templates/ishtar/organization_person_form.html:35 +#: templates/ishtar/person_form.html:46 +#: templates/ishtar/wizard/validation_bar.html:6 +msgid "Cancel" +msgstr "Annuler" + +#: templates/ishtar/person_form.html:24 +msgid "Contact informations" +msgstr "Coordonnées" +  #: templates/ishtar/sheet.html:21  msgid "Previous"  msgstr "Précédent" @@ -1642,22 +1686,17 @@ msgstr "Type d'utilisateur"  msgid "You have entered the following informations:"  msgstr "Vous avez entré les informations suivantes :" -#: templates/ishtar/wizard/confirm_wizard.html:39 +#: templates/ishtar/wizard/confirm_wizard.html:40  msgid "Would you like to save them?"  msgstr "Voulez-vous sauver ces informations ?" -#: templates/ishtar/wizard/default_wizard.html:34 -#: templates/ishtar/wizard/parcels_wizard.html:24 +#: templates/ishtar/wizard/default_wizard.html:35 +#: templates/ishtar/wizard/parcels_wizard.html:23  #: templates/ishtar/wizard/search.html:20 -#: templates/ishtar/wizard/towns_wizard.html:20 +#: templates/ishtar/wizard/towns_wizard.html:19  msgid "Add/Modify"  msgstr "Ajouter-Modifier" -#: templates/ishtar/wizard/default_wizard.html:45 -#: templates/ishtar/wizard/parcels_wizard.html:28 -msgid "Validate and end" -msgstr "Valider et confirmer" -  #: templates/ishtar/wizard/default_wizard.html:56  msgid ""  "The form has changed if you don't validate it all your changes will be lost." @@ -1665,18 +1704,22 @@ msgstr ""  "Le formulaire a changé. Si vous ne le validez pas, tous vos changements "  "seront perdus." -#: templates/ishtar/wizard/parcels_wizard.html:20 +#: templates/ishtar/wizard/parcels_wizard.html:19  msgid "all"  msgstr "tout" -#: templates/ishtar/wizard/parcels_wizard.html:23 +#: templates/ishtar/wizard/parcels_wizard.html:22  msgid "Add all parcels from the archaeological file"  msgstr "Ajouter toutes les parcelles du dossier archéologique associé" -#: templates/ishtar/wizard/towns_wizard.html:28 +#: templates/ishtar/wizard/towns_wizard.html:27  msgid "No town set in the associated file."  msgstr "Pas de commune dans le dossier associé." +#: templates/ishtar/wizard/validation_bar.html:5 +msgid "Validate and end" +msgstr "Valider et confirmer" +  #: templates/ishtar/wizard/wizard_closing_done.html:4  msgid "Item successfully closed"  msgstr "Élément clos avec succès" @@ -1962,9 +2005,6 @@ msgstr ""  #~ msgid "Activity:"  #~ msgstr "Activité :" -#~ msgid "Identification:" -#~ msgstr "Identification :" -  #~ msgid "Interpretation:"  #~ msgstr "Interpretation :" diff --git a/ishtar_common/management/commands/update_towns.py b/ishtar_common/management/commands/update_towns.py new file mode 100644 index 000000000..fa201b677 --- /dev/null +++ b/ishtar_common/management/commands/update_towns.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import csv +import datetime, time + +from django.conf import settings +from django.core.management.base import BaseCommand, CommandError + +from ishtar_common import tasks + +class Command(BaseCommand): +    help = "Update department for french towns" + +    def handle(self, *args, **options): +        self.stdout.write("* Loading towns\n") +        self.stdout.flush() +        created, updated = tasks.update_towns() +        self.stdout.write("%d towns created, %s towns updated\n\n" % (created, +                                                                      updated)) +        self.stdout.flush() + diff --git a/ishtar_common/migrations/0030_auto__add_state__chg_field_sourcetype_txt_idx__chg_field_authortype_tx.py b/ishtar_common/migrations/0030_auto__add_state__chg_field_sourcetype_txt_idx__chg_field_authortype_tx.py new file mode 100644 index 000000000..3f7a2e498 --- /dev/null +++ b/ishtar_common/migrations/0030_auto__add_state__chg_field_sourcetype_txt_idx__chg_field_authortype_tx.py @@ -0,0 +1,371 @@ +# -*- 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 model 'State' +        db.create_table('ishtar_common_state', ( +            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), +            ('label', self.gf('django.db.models.fields.CharField')(max_length=30)), +            ('number', self.gf('django.db.models.fields.CharField')(unique=True, max_length=3)), +        )) +        db.send_create_signal('ishtar_common', ['State']) + + +        # Changing field 'SourceType.txt_idx' +        db.alter_column('ishtar_common_sourcetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'AuthorType.txt_idx' +        db.alter_column('ishtar_common_authortype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'PersonType.txt_idx' +        db.alter_column('ishtar_common_persontype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) +        # Adding field 'Department.state' +        db.add_column('ishtar_common_department', 'state', +                      self.gf('django.db.models.fields.related.ForeignKey')(to=orm['ishtar_common.State'], null=True, blank=True), +                      keep_default=False) + + +        # Changing field 'OrganizationType.txt_idx' +        db.alter_column('ishtar_common_organizationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'SupportType.txt_idx' +        db.alter_column('ishtar_common_supporttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +        # Changing field 'Format.txt_idx' +        db.alter_column('ishtar_common_format', 'txt_idx', self.gf('django.db.models.fields.CharField')(unique=True, max_length=100)) + +    def backwards(self, orm): +        # Deleting model 'State' +        db.delete_table('ishtar_common_state') + + +        # Changing field 'SourceType.txt_idx' +        db.alter_column('ishtar_common_sourcetype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'AuthorType.txt_idx' +        db.alter_column('ishtar_common_authortype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'PersonType.txt_idx' +        db.alter_column('ishtar_common_persontype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) +        # Deleting field 'Department.state' +        db.delete_column('ishtar_common_department', 'state_id') + + +        # Changing field 'OrganizationType.txt_idx' +        db.alter_column('ishtar_common_organizationtype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'SupportType.txt_idx' +        db.alter_column('ishtar_common_supporttype', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +        # Changing field 'Format.txt_idx' +        db.alter_column('ishtar_common_format', 'txt_idx', self.gf('django.db.models.fields.CharField')(max_length=30, unique=True)) + +    models = { +        'auth.group': { +            'Meta': {'object_name': 'Group'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), +            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) +        }, +        'auth.permission': { +            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, +            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) +        }, +        'auth.user': { +            'Meta': {'object_name': 'User'}, +            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), +            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), +            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), +            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), +            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), +            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) +        }, +        'contenttypes.contenttype': { +            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, +            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) +        }, +        'ishtar_common.arrondissement': { +            'Meta': {'object_name': 'Arrondissement'}, +            'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.author': { +            'Meta': {'object_name': 'Author'}, +            'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"}) +        }, +        'ishtar_common.authortype': { +            'Meta': {'object_name': 'AuthorType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.canton': { +            'Meta': {'object_name': 'Canton'}, +            'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '30'}) +        }, +        'ishtar_common.department': { +            'Meta': {'ordering': "['number']", 'object_name': 'Department'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}), +            'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.documenttemplate': { +            'Meta': {'ordering': "['associated_object_name', 'name']", 'object_name': 'DocumentTemplate'}, +            'associated_object_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'template': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) +        }, +        'ishtar_common.format': { +            'Meta': {'object_name': 'Format'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.formatertype': { +            'Meta': {'unique_together': "(('formater_type', 'options', 'many_split'),)", 'object_name': 'FormaterType'}, +            'formater_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'many_split': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'options': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.globalvar': { +            'Meta': {'ordering': "['slug']", 'object_name': 'GlobalVar'}, +            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), +            'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.historicalorganization': { +            'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalOrganization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), +            'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}), +            'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}), +            'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.import': { +            'Meta': {'object_name': 'Import'}, +            'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), +            'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), +            'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), +            'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), +            'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}), +            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"}) +        }, +        'ishtar_common.importercolumn': { +            'Meta': {'object_name': 'ImporterColumn'}, +            'col_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'columns'", 'to': "orm['ishtar_common.ImporterType']"}), +            'regexp_pre_filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Regexp']", 'null': 'True', 'blank': 'True'}), +            'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}) +        }, +        'ishtar_common.importerdefault': { +            'Meta': {'object_name': 'ImporterDefault'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'defaults'", 'to': "orm['ishtar_common.ImporterType']"}), +            'target': ('django.db.models.fields.CharField', [], {'max_length': '500'}) +        }, +        'ishtar_common.importerdefaultvalues': { +            'Meta': {'object_name': 'ImporterDefaultValues'}, +            'default_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_values'", 'to': "orm['ishtar_common.ImporterDefault']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'target': ('django.db.models.fields.CharField', [], {'max_length': '500'}), +            'value': ('django.db.models.fields.CharField', [], {'max_length': '500'}) +        }, +        'ishtar_common.importerduplicatefield': { +            'Meta': {'object_name': 'ImporterDuplicateField'}, +            'column': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'duplicate_fields'", 'to': "orm['ishtar_common.ImporterColumn']"}), +            'field_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) +        }, +        'ishtar_common.importertype': { +            'Meta': {'object_name': 'ImporterType'}, +            'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), +            'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.importtarget': { +            'Meta': {'object_name': 'ImportTarget'}, +            'column': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'targets'", 'to': "orm['ishtar_common.ImporterColumn']"}), +            'formater_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.FormaterType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'regexp_filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Regexp']", 'null': 'True', 'blank': 'True'}), +            'target': ('django.db.models.fields.CharField', [], {'max_length': '500'}) +        }, +        'ishtar_common.ishtaruser': { +            'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, +            'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}), +            'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'}) +        }, +        'ishtar_common.itemkey': { +            'Meta': {'object_name': 'ItemKey'}, +            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'importer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}), +            'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}) +        }, +        'ishtar_common.organization': { +            'Meta': {'object_name': 'Organization'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}), +            'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.organizationtype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.person': { +            'Meta': {'object_name': 'Person'}, +            'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}), +            'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), +            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}), +            'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), +            'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}), +            'merge_key': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), +            'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}), +            'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), +            'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), +            'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), +            'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), +            'title': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True', 'blank': 'True'}), +            'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.persontype': { +            'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.regexp': { +            'Meta': {'object_name': 'Regexp'}, +            'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'regexp': ('django.db.models.fields.CharField', [], {'max_length': '500'}) +        }, +        'ishtar_common.sourcetype': { +            'Meta': {'object_name': 'SourceType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.state': { +            'Meta': {'ordering': "['number']", 'object_name': 'State'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}), +            'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}) +        }, +        'ishtar_common.supporttype': { +            'Meta': {'object_name': 'SupportType'}, +            'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), +            'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'}) +        }, +        'ishtar_common.targetkey': { +            'Meta': {'unique_together': "(('target', 'value'),)", 'object_name': 'TargetKey'}, +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'is_set': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), +            'key': ('django.db.models.fields.TextField', [], {}), +            'target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'keys'", 'to': "orm['ishtar_common.ImportTarget']"}), +            'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}) +        }, +        'ishtar_common.town': { +            'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'}, +            'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}), +            'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}), +            'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}), +            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), +            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), +            'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}), +            'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}) +        } +    } + +    complete_apps = ['ishtar_common']
\ No newline at end of file diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 1dc4b6ced..fdad39c83 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -238,7 +238,7 @@ class GeneralType(models.Model):      """      label = models.CharField(_(u"Label"), max_length=100)      txt_idx = models.CharField(_(u"Textual ID"), -                         validators=[validate_slug], max_length=30, unique=True) +                         validators=[validate_slug], max_length=100, unique=True)      comment = models.TextField(_(u"Comment"), blank=True, null=True)      available = models.BooleanField(_(u"Available"), default=True)      HELP_TEXT = u"" @@ -365,7 +365,7 @@ class GeneralType(models.Model):              self.label = u" ".join(u" ".join(self.txt_idx.split('-')                                                          ).split('_')).title()          if not self.txt_idx: -            self.txt_idx = slugify(self.label) +            self.txt_idx = slugify(self.label)[:100]          # clean old keys          if self.pk: @@ -880,9 +880,22 @@ class DocumentTemplate(models.Model):          missing = ooo_replace(self.template, output_name, values)          return output_name +class State(models.Model): +    label = models.CharField(_(u"Label"), max_length=30) +    number = models.CharField(_(u"Number"), unique=True, max_length=3) + +    class Meta: +        verbose_name = _(u"State") +        ordering = ['number'] + +    def __unicode__(self): +        return self.label +  class Department(models.Model):      label = models.CharField(_(u"Label"), max_length=30)      number = models.CharField(_(u"Number"), unique=True, max_length=3) +    state = models.ForeignKey('State', verbose_name=_(u"State"), blank=True, +                              null=True)      class Meta:          verbose_name = _(u"Department") @@ -890,7 +903,7 @@ class Department(models.Model):          ordering = ['number']      def __unicode__(self): -        return u"%s (%s)" % (self.label, self.number) +        return self.label  class Address(BaseHistorizedItem):      address = models.TextField(_(u"Address"), null=True, blank=True) @@ -1564,10 +1577,13 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :          values = [unicode(getattr(self, attr))                     for attr in ('surname', 'name')                                 if getattr(self, attr)] -        if not values: -            values = [self.raw_name or ""] +        if not values and self.raw_name: +            values = [self.raw_name]          if self.attached_to: -            values.append(u"- " + unicode(self.attached_to)) +            attached_to = unicode(self.attached_to) +            if values: +                values.append(u'-') +            values.append(attached_to)          return u" ".join(values)      def get_values(self, prefix=''): @@ -1601,6 +1617,9 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :              self.merge_key += "-" + self.attached_to.merge_key          self.merge_key = self.merge_key[:300] +    def is_natural(self): +        return not self.attached_to +      def has_right(self, right_name):          if '.' in right_name:              right_name = right_name.split('.')[-1] @@ -1635,6 +1654,15 @@ class Person(Address, Merge, OwnPerms, ValueGetter) :                                 if getattr(self, attr)]          return slugify(u"-".join(values)) +    def save(self, *args, **kwargs): +        super(Person, self).save(*args, **kwargs) +        if hasattr(self, 'responsible_town_planning_service'): +            for fle in self.responsible_town_planning_service.all(): +                fle.save() # force update of raw_town_planning_service +        if hasattr(self, 'general_contractor'): +            for fle in self.general_contractor.all(): +                fle.save() # force update of raw_general_contractor +  class IshtarUser(User):      person = models.ForeignKey(Person, verbose_name=_(u"Person"), unique=True,                                 related_name='ishtaruser') diff --git a/ishtar_common/ooo_replace.py b/ishtar_common/ooo_replace.py index 4c487dd17..54ecfced4 100644 --- a/ishtar_common/ooo_replace.py +++ b/ishtar_common/ooo_replace.py @@ -23,6 +23,18 @@ from cStringIO import StringIO  from xml.etree.cElementTree import ElementTree, fromstring  from django.conf import settings +from ooo_translation import ooo_translation + +def translate_context(context, locale): +    if locale not in ooo_translation: +        return context +    new_context = {} +    for k in context: +        new_key = k +        if k in ooo_translation[locale]: +            new_key = ooo_translation[locale][k] +        new_context[new_key] = context[k] +    return new_context  OOO_NS = "{urn:oasis:names:tc:opendocument:xmlns:text:1.0}" @@ -135,13 +147,9 @@ def _custom_parsing(context, value, default_value=''):              value = re.sub(sub_exp % (pre_tag, base_key), v, value)      return value -def ooo_replace(infile, outfile, context, default_value=''): -    inzip = ZipFile(infile, 'r', ZIP_DEFLATED) -    outzip = ZipFile(outfile, 'w', ZIP_DEFLATED) +def _ooo_replace(content, context, missing_keys, default_value=''):      # regular ooo parsing -    content = ElementTree(fromstring(inzip.read('content.xml'))) -    missing_keys = set()      for xp in ('variable-set', 'variable-get'):          for p in content.findall(".//"+OOO_NS+xp):              name = p.get(OOO_NS+"name") @@ -167,12 +175,25 @@ def ooo_replace(infile, outfile, context, default_value=''):      content.write(str_io)      value = str_io.getvalue()      value = _custom_parsing(context, value, default_value).encode('utf-8') +    return value + +def ooo_replace(infile, outfile, context, default_value=''): +    inzip = ZipFile(infile, 'r', ZIP_DEFLATED) +    outzip = ZipFile(outfile, 'w', ZIP_DEFLATED) + +    values = {} +    missing_keys = set() +    for xml_file in ('content.xml', 'styles.xml'): +        content = ElementTree(fromstring(inzip.read(xml_file))) +        values[xml_file] = _ooo_replace(content, context, missing_keys, +                                        default_value)      for f in inzip.infolist(): -        if f.filename == 'content.xml': -            outzip.writestr('content.xml', value) +        if f.filename in values: +            outzip.writestr(f.filename, values[f.filename])          else:              outzip.writestr(f, inzip.read(f.filename)) +      inzip.close()      outzip.close()      return missing_keys diff --git a/ishtar_common/ooo_translation.py b/ishtar_common/ooo_translation.py new file mode 100644 index 000000000..a93a916ae --- /dev/null +++ b/ishtar_common/ooo_translation.py @@ -0,0 +1,37 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Copyright (C) 2013-2015 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program.  If not, see <http://www.gnu.org/licenses/>. + +# See the file COPYING for details. + +from django.conf import settings +from django.utils import translation +from django.utils.translation import pgettext_lazy + +# [('study', pgettext_lazy('ooo key', u'study')),] +TRANSLATION_STRINGS = [] + +ooo_translation = {} +cur_language = translation.get_language() + +try: +    for language, lbl in settings.LANGUAGES: +        translation.activate(language) +        ooo_translation[language] = {} +        for k, v in TRANSLATION_STRINGS: +            ooo_translation[language][k] = unicode(v) +finally: +    translation.activate(cur_language) diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index 5168cba6e..0505e21a5 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -3,7 +3,7 @@      background-color:#ff6e6e;  } -a.add-button, a.remove, +a.remove,  #progress-content{      background-color:#fff;  } @@ -16,16 +16,19 @@ div.form {      background-color: #922;  } +a.add-button, #reset_wizards{ +    background-color: #D14; +} +  /* color  */ +#window hr,  #context_menu .red,  a, a.remove {      color:#D14;  } -a.add-button{ -    color:#61615C; -} - +a.add-button, +#reset_wizards,  #window h1{      color:#fff;  } @@ -49,6 +52,11 @@ div.form {      border:0 solid #CCC;  } +#window hr{ +    border:0; +    border-bottom:1px solid #D14; +} +  /* shadows */  #progress-content,  .sheet{ @@ -58,6 +66,7 @@ div.form {  }  /* radius */ +a.button,  a.add-button, a.remove,  .sheet,  #progress-content, @@ -96,6 +105,10 @@ h3{      margin:1em 0 0.5em 0;  } +h4{ +    margin:10px 0; +} +  select{      max-width:550px;  } @@ -120,6 +133,15 @@ td{      text-align:left;  } +div.selected{ +    border:1px solid #922; +} + +textarea:disabled, +input[type="text"]:disabled{ +    background-color: #eee; +} +  button{      background-color:#f1f2f6;      border:1px solid #AAA; @@ -197,8 +219,7 @@ div#header{      width:100%;      text-align:left;      font-size: 0.9em; -    background-color: #f1f2f6; -    border-bottom:1px solid #CCC; +    background-color: #CCC;      margin-bottom:10px;      line-height:30px;      padding:0 20px; @@ -218,6 +239,26 @@ div#logo{      background-repeat:no-repeat;  } +div#validation-bar p{ +    margin:0; +} + +div#validation-bar input{ +    margin:0 30px; +} + +div#validation-bar.big{ +    height:60px; +} + +a.button{ +    padding:0.5em; +} + +#reset_wizards{ +    color: white; +} +  .display_details_inline,  .display_details{      display:inline-block; @@ -348,7 +389,7 @@ div#main_menu > ul > li{  div#content{      clear:both; -    margin:0 200px; +    margin:0 200px 70px 200px;      text-align:center;  } @@ -843,6 +884,7 @@ td.submit_button{  a.add-button, a.remove{      padding:0 4px; +    font-weight:bold;  }  a.remove{ @@ -897,6 +939,10 @@ a.remove{      width:60px;  } +.small, .small input{ +    width:60px; +} +  #progress{      display:none;      position:fixed; diff --git a/ishtar_common/tasks.py b/ishtar_common/tasks.py index a9db26087..a8db97bb1 100644 --- a/ishtar_common/tasks.py +++ b/ishtar_common/tasks.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -*- coding: utf-8 -*- -# Copyright (C) 2013 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2013-2014 Étienne Loks  <etienne.loks_AT_peacefrogsDOTnet>  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as @@ -17,13 +17,15 @@  # See the file COPYING for details. +import sys +  from django.conf import settings  from django.db.models import Q -from geodjangofla.models import Commune -from ishtar_common.models import Town +from ishtar_common.models import Town, Department  def load_towns(): +    from geodjangofla.models import Commune      q = None      for dpt_number in settings.ISHTAR_DPTS:          query = Q(insee_com__istartswith=dpt_number) @@ -51,3 +53,30 @@ def load_towns():                  setattr(town, k, defaults[k])              town.save()      return nb, updated + +def update_towns(): +    nb, updated = 0, 0 +    dpts = dict([(dpt.number, dpt) for dpt in Department.objects.all()]) +    q = Town.objects.filter(numero_insee__isnull=False) +    total = q.count() +    for idx, town in enumerate(q.all()): +        sys.stdout.write('\rProcessing... %s/%d' % ( +                                str(idx+1).zfill(len(str(total))), total)) +        if len(town.numero_insee) < 2: +            continue +        dpt_code = town.numero_insee[:2] +        if dpt_code.startswith('9') and int(dpt_code) > 95: +            dpt_code = town.numero_insee[:3] +        if dpt_code not in dpts: +            sys.stdout.write('Missing department with INSEE code: %s' % dpt_code) +            continue +        if town.departement == dpts[dpt_code]: +            continue +        if town.departement: +            updated += 1 +        else: +            nb += 1 +        town.departement = dpts[dpt_code] +        town.save() +    sys.stdout.write('\n') +    return nb, updated diff --git a/ishtar_common/templates/base.html b/ishtar_common/templates/base.html index 1ebebd815..92e61493b 100644 --- a/ishtar_common/templates/base.html +++ b/ishtar_common/templates/base.html @@ -19,6 +19,7 @@      <link type="text/css" href="{{JQUERY_UI_URL}}css/smoothness/jquery-ui.css" rel="stylesheet" />      <link rel="stylesheet" href="{{STATIC_URL}}/js/prettyPhoto/css/prettyPhoto.css" />      <link rel="stylesheet" href="{{STATIC_URL}}/media/style.css" /> +    {% include "blocks/extra_head.html" %}      {% block extra_head %}      {% endblock %}  </head> diff --git a/ishtar_common/templates/blocks/JQueryAdvancedTown.html b/ishtar_common/templates/blocks/JQueryAdvancedTown.html new file mode 100644 index 000000000..78d2d7831 --- /dev/null +++ b/ishtar_common/templates/blocks/JQueryAdvancedTown.html @@ -0,0 +1,99 @@ +{% load i18n %}{% load url from future %}</td></tr> +<tr> +  <td>{% trans "State" context "Région" %}</td> +  <td> +  <select id='current-state'> +    <option value=''>--------</option>{% for state in states %} +    <option value='{{state.number}}'{% if state.number == selected_state %}selected='selected'{% endif %}>{{state}}</option> +  {% endfor %}</select> +  </td> +</tr> +<tr> +  <td>{% trans "Department" %}</td> +  <td> +  <select id='current-department'> +  </select> +  </td> +</tr> +<tr class='required'> +  <th><label>{% trans "Town" %}</label></th> +  <td><input{{attrs_select}}/> +<input type="hidden"{{attrs_hidden}}/> +<script type="text/javascript"><!--// +    selected_department = "{{selected_department}}"; +    var empty_select = "<option value=''>--------</option>"; + +    function update_department_field(){ +        var selected_state = $("#current-state").val(); +        if (!selected_state){ +            $("#current-department").html("<option value=''>"+"{% trans 'Choose a state first' %}"+"</option>"); +            $("#current-department").prop('disabled', true); +            $('#id_select_{{field_id}}').prop('disabled', true); +            return; +        } +        $.ajax({ +            url: "{% url 'department-by-state' %}" + selected_state, +            type: 'get', +            dataType: 'json', +            success: function(data) { +                var html = ""; +                for (idx in data){ +                    dpt = data[idx]; +                    html += "<option value='" + dpt.number + "'"; +                    if (String(dpt.number) == String(selected_department)){ +                        html += " selected='selected'"; +                    } +                    html += ">" + dpt.value + "</option>"; +                } +                $("#current-department").html(html); +                $("#current-department").prop('disabled', false); +                update_search_town(); +            } +        }); +    } + +    function update_search_town(){ +        selected_department = $("#current-department").val(); +        if (selected_department){ +            $("#id_select_{{field_id}}").autocomplete( "option", "source", {{source}}+selected_department); +            $('#id_select_{{field_id}}').prop('disabled', false); +        } else { +            $('#id_select_{{field_id}}').prop('disabled', true); +        } +    } + +    function empty_town(){ +        $('#id_{{field_id}}').val(null); +        $('#id_select_{{field_id}}').val(null); +    } + +    $(function() { +        update_department_field(); + +        $("#current-state").change(function(){ +            empty_town(); +            update_department_field(); +        }); + +        $("#current-department").change(function(){ +            empty_town(); +            update_search_town(); +        }); + +        $("#id_select_{{field_id}}").autocomplete({ +            source: {{source}}, +            select: function( event, ui ) { +                    if(ui.item){ +                        $('#id_{{field_id}}').val(ui.item.id); +                    } else { +                        $('#id_{{field_id}}').val(null); +                    } +                }, +            minLength: 2{% if options %}, +            {{options}} +            {% endif %} +        }); + +        $('#id_select_{{field_id}}').live('click', empty_town); + +});//--></script> diff --git a/ishtar_common/templates/blocks/JQueryAdvancedTown.js b/ishtar_common/templates/blocks/JQueryAdvancedTown.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/ishtar_common/templates/blocks/JQueryAdvancedTown.js @@ -0,0 +1 @@ + diff --git a/ishtar_common/templates/blocks/JQueryPersonOrganization.js b/ishtar_common/templates/blocks/JQueryPersonOrganization.js new file mode 100644 index 000000000..b13a2c28e --- /dev/null +++ b/ishtar_common/templates/blocks/JQueryPersonOrganization.js @@ -0,0 +1,50 @@ + +$("#id_select_{{field_id}}").autocomplete({ +    source: {{source}}, +    select: function( event, ui ) { +            var url =  {{edit_source}}; +            if(ui.item){ +                url = {{edit_source}}+ui.item.id; +                $('#id_{{field_id}}').val(ui.item.id); +            } else { +                $('#id_{{field_id}}').val(null); +            } +            $.get(url , function( data ) { +                $( "#div-{{field_id}}" ).html( data ); +            }); +        }, +    minLength: 2{% if options %}, +    {{options}} +    {% endif %} +}); + +$.get( {{edit_source}}{% if selected %}+'{{selected}}'{% endif %}, function( data ) { +    $( "#div-{{field_id}}" ).html( data ); +}); + +$('#id_select_{{field_id}}').live('click', function(){ +    $('#id_{{field_id}}').val(null); +    $('#id_select_{{field_id}}').val(null); +    $.get( {{edit_source}}, function( data ) { +        $( "#div-{{field_id}}" ).html( data ); +    }); +}); + +person_save_callback = function(item_id, lbl){ +    var url =  {{edit_source}}; +    $('#id_{{field_id}}').val(null); +    $('#id_select_{{field_id}}').val(lbl); +    if (item_id){ +        url = {{edit_source}}+item_id; +        $('#id_{{field_id}}').val(item_id); +    } +    $("#id_select_{{field_id}}").trigger('autocompletechange'); +    $.get(url , function( data ) { +        $( "#div-{{field_id}}" ).html( data ); +    }); +}; +person_new_callback = function(){ +    var url =  {{edit_source}}; +    $('#id_{{field_id}}').val(null); +    $('#id_select_{{field_id}}').val(null); +} diff --git a/ishtar_common/templates/blocks/PersonOrganization.html b/ishtar_common/templates/blocks/PersonOrganization.html new file mode 100644 index 000000000..6e7264c8e --- /dev/null +++ b/ishtar_common/templates/blocks/PersonOrganization.html @@ -0,0 +1,9 @@ +{% load i18n %}<input{{attrs_select}}/> +</table> + +<div id='div-{{name}}'></div> + +<input type="hidden"{{attrs_hidden}}/> +<script type="text/javascript"><!--// +{{js}} +//--></script> diff --git a/ishtar_common/templates/blocks/extra_head.html b/ishtar_common/templates/blocks/extra_head.html new file mode 100644 index 000000000..139597f9c --- /dev/null +++ b/ishtar_common/templates/blocks/extra_head.html @@ -0,0 +1,2 @@ + + diff --git a/ishtar_common/templates/ishtar/organization_form.html b/ishtar_common/templates/ishtar/organization_form.html new file mode 100644 index 000000000..207116c21 --- /dev/null +++ b/ishtar_common/templates/ishtar/organization_form.html @@ -0,0 +1,30 @@ +{% load i18n %}<table class='organization'> +<tr> +    <th><label>{{form.name.label}}</label></th> +    <td>{{form.name}}</td> +</tr> +</table> +{% for hidden in form.hidden_fields %}{{hidden}}{% endfor %} +<table class='organization-address'> +<tr> +    <th><label>{{form.organization_type.label}}</label></th> +    <td>{{form.organization_type}}</td> +</tr> +<tr> +    <th><label>{{form.address.label}}</label></th> +    <td>{{form.address}}</td> +</tr> +<tr> +    <th><label>{{form.address_complement.label}}</label></th> +    <td>{{form.address_complement}}</td> +</tr> +<tr> +    <th><label>{{form.postal_code.label}}</label></th> +    <td>{{form.postal_code}}</td> +</tr> +<tr> +    <th><label>{{form.town.label}}</label></th> +    <td>{{form.town}}</td> +</tr> +</table> + diff --git a/ishtar_common/templates/ishtar/organization_person_form.html b/ishtar_common/templates/ishtar/organization_person_form.html new file mode 100644 index 000000000..46f2cdc15 --- /dev/null +++ b/ishtar_common/templates/ishtar/organization_person_form.html @@ -0,0 +1,131 @@ +{% load i18n %}{% load url from future %} +<div id='orga-person-form'> +<form id='dyn-form-person' method='post'> +{% csrf_token %} +{% for hidden_field in form.hidden_fields %}{{hidden_field}}{% endfor %} +<input type='hidden' name='hidden_person_pk' id='hidden_person_pk' value='{{object.pk}}'/> +<input type='hidden' name='hidden_person_lbl' id='hidden_person_lbl' value="{{object}}"/> +<table class='organization'> +<caption>{% trans "Identification" %}</caption> +<tr> +    <th> </th> +    <td>{{form.attached_to}}</td> +</tr> +</table> + +<table class='person'> +<caption>{{relative_label}}</caption> +<tr> +    <th><label>{{form.title.label}}</label></th> +    <td>{{form.title}}</td> +</tr> +<tr> +    <th><label>{{form.name.label}}</label></th> +    <td>{{form.name}}</td> +</tr> +<tr> +    <th><label>{{form.surname.label}}</label></th> +    <td>{{form.surname}}</td> +</tr> +</table> +<div> +<input type='submit' id='btn-modify-person' value="{% trans "Modify"%}"/> +<input type='submit' id='btn-new-person' value="{% trans "New"%}"/> +<input type='submit' id='btn-save-person' value="{% trans "Save"%}"/> +<input type='submit' id='btn-cancel-person' value="{% trans "Cancel"%}"/> +</div> +</form> +</div> +<script type="text/javascript"><!--// + +function checkPendingRequest(todo) { +    window.setTimeout(function () { +        if ($.active > 0) { +            window.setTimeout(checkPendingRequest(todo), 250); +        } else { +            todo();  +        } +    }, 250); +}; + +person_save_callback = function(){ +    var item_id = $('#hidden_person_pk').val(); + +    var url = edit_url; +    $('#id_' + parent_id).val(null); +    if (item_id){ +        url = edit_url+item_id; +        $('#id_'+parent_id).val(item_id); +    } +    $("#id_select_"+parent_id).trigger('autocompletechange'); +    $.get(url , function( data ) { +        $( "#div-"+parent_id ).html( data ); +        var lbl = $('#hidden_person_lbl').val(); +        $('#id_select_' + parent_id).val(lbl); +    }); +}; + +person_new_callback = function(){ +    var url = edit_url; +    $('#id_'+parent_id).val(null); +    $('#id_select_'+parent_id).val(null); +} +$(function() { +    disable_person = function(){ +        $("#orga-person-form :input[type='text'], #orga-person-form textarea, #orga-person-form select").prop("disabled", true); +        $("#btn-save-person").hide(); +        $("#btn-cancel-person").hide(); +        $("#btn-modify-person").show(); +        $("#btn-new-person").show(); +        $("#orga-person-form").removeClass('selected'); +    } +    enable_person = function(){ +        $("#orga-person-form :input[type='text'], #orga-person-form textarea, #orga-person-form select").prop("disabled", false); +        $("#btn-save-person").show(); +        $("#btn-cancel-person").show(); +        $("#btn-modify-person").hide(); +        $("#btn-new-person").hide(); +        $("#orga-person-form").addClass('selected'); +    } + +    checkPendingRequest(disable_person); + +    $("#btn-modify-person").on('click', function(){ +        {% if object %}submit_url = "{% url 'organization_person_edit' object.pk %}"; +        {% else %}submit_url = "{% url 'organization_person_create' %}";{% endif %} +        enable_person(); +        return false; +    }); +    $("#btn-new-person").on('click', function(){ +        submit_url = "{% url 'organization_person_create' %}"; +        $("#orga-person-form").find("input[type=text], textarea, input[type=hidden]").val(""); +        enable_person(); +        person_new_callback(); +        return false; +    }); +    $("#btn-cancel-person").on('click', function(){ +        person_save_callback(); +        disable_person(); +        return false; +    }); +    $("#btn-save-person").on('click', function(){ +        var form = $("#dyn-form-person"); +        $.ajax({ +            url: submit_url, +            type: 'post', +            data: form.serialize(), +            dataType: 'html', +            success: function(data) { +                $("#orga-person-form").parent().html(data); +                person_save_callback(); +                disable_person(); +                return false; +            } +        }); +        return false; +    }); + + +}); +//--></script> + diff --git a/ishtar_common/templates/ishtar/person_form.html b/ishtar_common/templates/ishtar/person_form.html new file mode 100644 index 000000000..555aa1a5f --- /dev/null +++ b/ishtar_common/templates/ishtar/person_form.html @@ -0,0 +1,113 @@ +{% load i18n %}{% load url from future %} +<div id='person-form'> +<form id='dyn-form-person' method='post'> +{% csrf_token %} +{% for hidden_field in form.hidden_fields %}{{hidden_field}}{% endfor %} +<input type='hidden' name='hidden_person_pk' id='hidden_person_pk' value='{{object.pk}}'/> +<input type='hidden' name='hidden_person_lbl' id='hidden_person_lbl' value="{{object}}"/> +<table class='person'> +<caption>{% trans "Identification" %}</caption> +<tr> +    <th><label>{{form.title.label}}</label></th> +    <td>{{form.title}}</td> +</tr> +<tr> +    <th><label>{{form.name.label}}</label></th> +    <td>{{form.name}}</td> +</tr> +<tr> +    <th><label>{{form.surname.label}}</label></th> +    <td>{{form.surname}}</td> +</tr> +</table> +<table class='person-address'> +<caption>{% trans "Contact informations" %}</caption> +<tr> +    <th><label>{{form.address.label}}</label></th> +    <td>{{form.address}}</td> +</tr> +<tr> +    <th><label>{{form.address_complement.label}}</label></th> +    <td>{{form.address_complement}}</td> +</tr> +<tr> +    <th><label>{{form.postal_code.label}}</label></th> +    <td>{{form.postal_code}}</td> +</tr> +<tr> +    <th><label>{{form.town.label}}</label></th> +    <td>{{form.town}}</td> +</tr> +</table> +<div> +<input type='submit' id='btn-modify-person' value="{% trans "Modify"%}"/> +<input type='submit' id='btn-new-person' value="{% trans "New"%}"/> +<input type='submit' id='btn-save-person' value="{% trans "Save"%}"/> +<input type='submit' id='btn-cancel-person' value="{% trans "Cancel"%}"/> +</div> +</form> +</div> +<script type="text/javascript"><!--// +$(function() { +    // person_save_callback and person_new_callback must have been defined +    disable_person = function(){ +        $("#person-form :input[type='text'], #person-form textarea, #person-form select").prop("disabled", true); +        $("#btn-save-person").hide(); +        $("#btn-cancel-person").hide(); +        $("#btn-modify-person").show(); +        $("#btn-new-person").show(); +        $("#person-form").removeClass('selected'); +    } + +    enable_person = function(){ +        $("#person-form :input[type='text'], #person-form textarea, #person-form select").prop("disabled", false); +        $("#btn-save-person").show(); +        $("#btn-cancel-person").show(); +        $("#btn-modify-person").hide(); +        $("#btn-new-person").hide(); +        $("#person-form").addClass('selected'); +    } + +    disable_person(); + +    var submit_url; +    $("#btn-modify-person").on('click', function(){ +        {% if object %}submit_url = "{% url 'person_edit' object.pk %}"; +        {% else %}submit_url = "{% url 'person_create' %}";{% endif %} +        enable_person(); +        return false; +    }); +    $("#btn-new-person").on('click', function(){ +        submit_url = "{% url 'person_create' %}"; +        $("#person-form").find("input[type=text], textarea").val(""); +        enable_person(); +        person_new_callback(); +        return false; +    }); +    $("#btn-cancel-person").on('click', function(){ +        person_save_callback($('#hidden_person_pk').val(), +                             $('#hidden_person_lbl').val()); +        disable_person(); +        return false; +    }); +    $("#btn-save-person").on('click', function(){ +        var form = $("#dyn-form-person"); +        $.ajax({ +            url: submit_url, +            type: 'post', +            data: form.serialize(), +            dataType: 'html', +            success: function(data) { +                $("#person-form").parent().html(data); +                person_save_callback($('#hidden_person_pk').val(), +                                     $('#hidden_person_lbl').val()); +                disable_person(); +                return false; +            } +        }); +        return false; +    }); + + +}); +//--></script> diff --git a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html index 0dd1f6f12..15bb9e9bd 100644 --- a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html @@ -36,8 +36,10 @@    </table>    {% endif %}    {% block "extra_informations" %}{% endblock %} +<div id='validation-bar' class='big'>    <p>{%if confirm_end_msg %}{{confirm_end_msg|safe}}{%else%}{% trans "Would you like to save them?" %}{%endif%}</p>    <input type="submit" value="{% trans "Validate" %}"/>  </div> +</div>  </form>  {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/default_wizard.html b/ishtar_common/templates/ishtar/wizard/default_wizard.html index 3f2f3943e..a39037d10 100644 --- a/ishtar_common/templates/ishtar/wizard/default_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/default_wizard.html @@ -1,5 +1,6 @@  {% extends "base.html" %}  {% load i18n range table_form %} +{% load url from future %}  {% block extra_head %}  {{form.media}}  {% endblock %} @@ -40,10 +41,9 @@  {% endif %}  <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />  {{ previous_fields|safe }} -<div id='validation-bar'> -  <input type="submit" id="submit_form" name='validate' value="{% trans "Validate" %}"/> -  {% if next_steps %}<input type="submit" id="submit_end_form" name='validate_and_end' value="{% trans "Validate and end" %}"/>{% endif %} -</div> +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %}  </div>  </form>  {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/parcels_wizard.html b/ishtar_common/templates/ishtar/wizard/parcels_wizard.html index b550cf6c4..ce2bc9780 100644 --- a/ishtar_common/templates/ishtar/wizard/parcels_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/parcels_wizard.html @@ -9,7 +9,6 @@  {{ wizard.form.media }}  {{ wizard.management_form }}    {{ wizard.form.management_form }} -<div class='top_button'><input type="submit" id="submit_form" value="{% trans "Validate" %}"/></div>    {%if wizard.form.non_form_errors%}  <table class='formset'>  <tr class='error'><th colspan='2'>{{wizard.form.non_form_errors}}</th></tr> @@ -24,8 +23,9 @@  <p><button name="formset_modify" value="{{wizard.steps.current}}">{% trans "Add/Modify" %}</button></p>  <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />  {{ previous_fields|safe }} -<input type="submit" id="submit_form" name='validate' value="{% trans "Validate" %}"/> -{% if next_steps %}<input type="submit" id="submit_end_form" name='validate_and_end' value="{% trans "Validate and end" %}"/>{% endif %} +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %}  </div>  </form>  {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/towns_wizard.html b/ishtar_common/templates/ishtar/wizard/towns_wizard.html index 8e0b3551f..4f9ff6c5f 100644 --- a/ishtar_common/templates/ishtar/wizard/towns_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/towns_wizard.html @@ -9,7 +9,6 @@  <div class='form'>  {% if TOWNS %}  {% if wizard.form.forms %} -<div class='top_button'><input type="submit" id="submit_form" value="{% trans "Validate" %}"/></div>  <table class='formset'>    {{ wizard.management_form }}    {%if wizard.form.non_form_errors%}<tr class='error'><th colspan='2'>{{wizard.form.non_form_errors}}</th></tr>{%endif%} @@ -29,7 +28,9 @@  {% endif %}  <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" />  {{ previous_fields|safe }} -<input type="submit" id="submit_form" value="{% trans "Validate" %}"/> +{% block "validation_bar" %} +{% include 'ishtar/wizard/validation_bar.html' %} +{% endblock %}  </div>  </form>  {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/validation_bar.html b/ishtar_common/templates/ishtar/wizard/validation_bar.html new file mode 100644 index 000000000..09907af67 --- /dev/null +++ b/ishtar_common/templates/ishtar/wizard/validation_bar.html @@ -0,0 +1,7 @@ +{% load i18n %} +{% load url from future %} +<div id='validation-bar'> +  <input type="submit" id="submit_form" name='validate' value="{% trans "Validate" %}"/> +  {% if next_steps %}<input type="submit" id="submit_end_form" name='validate_and_end' value="{% trans "Validate and end" %}"/>{% endif %} +  <a href='{% url 'reset_wizards' %}' id="reset_wizards" class='button'>{% trans "Cancel" %}</a> +</div> diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 97fe4f81a..13c19096e 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -33,12 +33,20 @@ urlpatterns = patterns('',         # internationalization         url(r'^i18n/', include('django.conf.urls.i18n')),         # General +       url(r'person_search/(?P<step>.+)?$', +           views.person_search_wizard, name='person_search'),         url(r'person_creation/(?P<step>.+)?$',             views.person_creation_wizard, name='person_creation'),         url(r'person_modification/(?P<step>.+)?$',             views.person_modification_wizard, name='person_modification'),         url(r'person_deletion/(?P<step>.+)?$',             views.person_deletion_wizard, name='person_deletion'), +       url(r'^person-edit/$', +           views.PersonCreate.as_view(), name='person_create'), +       url(r'^person-edit/(?P<pk>\d+)$', +           views.PersonEdit.as_view(), name='person_edit'), +       url(r'organization_search/(?P<step>.+)?$', +           views.organization_search_wizard, name='organization_search'),         url(r'organization_creation/(?P<step>.+)?$',             views.organization_creation_wizard, name='organization_creation'),         url(r'organization_modification/(?P<step>.+)?$', @@ -46,6 +54,16 @@ urlpatterns = patterns('',             name='organization_modification'),         url(r'organization_deletion/(?P<step>.+)?$',             views.organization_deletion_wizard, name='organization_deletion'), +       url(r'organization-edit/$', +           views.OrganizationCreate.as_view(), name='organization_create'), +       url(r'organization-edit/(?P<pk>\d+)$', +           views.OrganizationEdit.as_view(), name='organization_edit'), +       url(r'organization-person-edit/$', +           views.OrganizationPersonCreate.as_view(), +           name='organization_person_create'), +       url(r'organization-person-edit/(?P<pk>\d+)$', +           views.OrganizationPersonEdit.as_view(), +           name='organization_person_edit'),         url(r'account_management/(?P<step>.+)?$',             views.account_management_wizard, name='account_management'),         url(r'import/$', views.NewImportView.as_view(), name='new_import'), @@ -84,8 +102,12 @@ urlpatterns += patterns('ishtar_common.views',             name='get-person'),       url(r'show-person(?:/(?P<pk>.+))?/(?P<type>.+)?$',             'show_person', name='show-person'), +     url(r'department-by-state/(?P<state_id>.+)?$', 'department_by_state', +           name='department-by-state'),       url(r'autocomplete-town/?$', 'autocomplete_town',             name='autocomplete-town'), +     url(r'autocomplete-advanced-town/(?P<department_id>[0-9]+[ABab]?)?$', +        'autocomplete_advanced_town', name='autocomplete-advanced-town'),       url(r'autocomplete-department/?$', 'autocomplete_department',             name='autocomplete-department'),       url(r'new-author/(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$', @@ -105,6 +127,7 @@ urlpatterns += patterns('ishtar_common.views',       url(r'person_merge/(?:(?P<page>\d+)/)?$', 'person_merge', name='person_merge'),       url(r'organization_merge/(?:(?P<page>\d+)/)?$', 'organization_merge',           name='organization_merge'), +     url(r'reset/$', 'reset_wizards', name='reset_wizards'),       url(r'(?P<action_slug>' + actions + r')/$', 'action', name='action'),  ) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 1b27bcf43..519332222 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -44,7 +44,7 @@ from django.shortcuts import render_to_response, redirect  from django.template import RequestContext, loader  from django.utils.decorators import method_decorator  from django.utils.translation import ugettext, ugettext_lazy as _ -from django.views.generic import ListView +from django.views.generic import ListView, UpdateView, CreateView  from django.views.generic.edit import CreateView, DeleteView  from xhtml2odt import xhtml2odt @@ -75,6 +75,11 @@ def index(request):          return render_to_response('index.html', dct,                                context_instance=RequestContext(request)) +person_search_wizard = wizards.SearchWizard.as_view([ +                        ('general-person_search', forms.PersonFormSelection)], +                        label=_(u"Person search"), +                        url_name='person_search',) +  person_creation_wizard = wizards.PersonWizard.as_view([                          ('identity-person_creation', forms.SimplePersonForm),                          ('person_type-person_creation', forms.PersonTypeForm), @@ -96,6 +101,11 @@ person_deletion_wizard = wizards.PersonDeletionWizard.as_view([                        label=_(u"Person deletion"),                        url_name='person_deletion',) +organization_search_wizard = wizards.SearchWizard.as_view([ +        ('general-organization_search', forms.OrganizationFormSelection)], +        label=_(u"Organization search"), +        url_name='organization_search',) +  organization_creation_wizard = wizards.OrganizationWizard.as_view([                      ('identity-organization_creation', forms.OrganizationForm),                      ('final-organization_creation', FinalForm)], @@ -202,6 +212,45 @@ def autocomplete_town(request):                                            for town in towns])      return HttpResponse(data, mimetype='text/plain') +def autocomplete_advanced_town(request, department_id=None, state_id=None): +    if not request.GET.get('term'): +        return HttpResponse(mimetype='text/plain') +    q = request.GET.get('term') +    q = unicodedata.normalize("NFKD", q).encode('ascii','ignore') +    query = Q() +    for q in q.split(' '): +        extra = Q(name__icontains=q) +        if settings.COUNTRY == 'fr': +            extra = extra | Q(numero_insee__istartswith=q) +            if not department_id: +                extra = extra | Q(departement__label__istartswith=q) +        query = query & extra +    if department_id: +        query = query & Q(departement__number__iexact=department_id) +    if state_id: +        query = query & Q(departement__state__number__iexact=state_id) +    limit = 20 +    towns = models.Town.objects.filter(query)[:limit] +    result = [] +    for town in towns: +        val = town.name +        if hasattr(town, 'numero_insee'): +            val += " (%s)" % town.numero_insee +        result.append({'id':town.pk, 'value':val}) +    data = json.dumps(result) +    return HttpResponse(data, mimetype='text/plain') + +def department_by_state(request, state_id=''): +    if not state_id: +        data = [] +    else: +        departments = models.Department.objects.filter(state__number=state_id) +        data = json.dumps([{'id':department.pk, 'number':department.number, +                            'value':unicode(department)} +                                          for department in departments]) +    return HttpResponse(data, mimetype='text/plain') + +  from types import NoneType  def format_val(val): @@ -480,7 +529,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],      return func -def show_item(model, name): +def show_item(model, name, extra_dct=None):      def func(request, pk, **dct):          try:              item = model.objects.get(pk=pk) @@ -511,6 +560,9 @@ def show_item(model, name):                  if len(historized) > 1:                      dct['previous'] = historized[1].history_date          dct['item'], dct['item_name'] = item, name +        # add context +        if extra_dct: +            dct.update(extra_dct(request, item))          context_instance = RequestContext(request)          context_instance.update(dct)          n = datetime.datetime.now() @@ -790,6 +842,20 @@ def dashboard_main_detail(request, item_name):      return render_to_response('ishtar/dashboards/dashboard_main_detail.html',                              dct, context_instance=RequestContext(request)) +def reset_wizards(request): +    # dynamicaly execute each reset_wizards of each ishtar app +    for app in settings.INSTALLED_APPS: +        if app == 'ishtar_common': +            # no need for infinite recursion +            continue +        try: +            module = __import__(app) +        except ImportError: +            continue +        if hasattr(module, 'views') and hasattr(module.views, 'reset_wizards'): +            module.views.reset_wizards(request) +    return redirect(reverse('start')) +  ITEM_PER_PAGE = 20  def merge_action(model, form, key):      def merge(request, page=1): @@ -943,3 +1009,72 @@ class ImportDeleteView(IshtarMixin, LoginRequiredMixin, DeleteView):      def get_success_url(self):          return reverse('current_imports') + +class PersonCreate(LoginRequiredMixin, CreateView): +    model = models.Person +    form_class = forms.BasePersonForm +    template_name = 'ishtar/person_form.html' + +    def get_success_url(self): +        return reverse('person_edit', args=[self.object.pk]) + +class PersonEdit(LoginRequiredMixin, UpdateView): +    model = models.Person +    form_class = forms.BasePersonForm +    template_name = 'ishtar/person_form.html' + +    def get_success_url(self): +        return reverse('person_edit', args=[self.object.pk]) + +class OrganizationCreate(LoginRequiredMixin, CreateView): +    model = models.Organization +    form_class = forms.BaseOrganizationForm +    template_name = 'ishtar/organization_form.html' +    form_prefix = "orga" + +    def get_form_kwargs(self): +        kwargs = super(OrganizationCreate, self).get_form_kwargs() +        if hasattr(self.form_class, 'form_prefix'): +            kwargs.update({'prefix': self.form_class.form_prefix}) +        return kwargs + +class OrganizationEdit(LoginRequiredMixin, UpdateView): +    model = models.Organization +    form_class = forms.BaseOrganizationForm +    template_name = 'ishtar/organization_form.html' + +    def get_form_kwargs(self): +        kwargs = super(OrganizationEdit, self).get_form_kwargs() +        if hasattr(self.form_class, 'form_prefix'): +            kwargs.update({'prefix': self.form_class.form_prefix}) +        return kwargs + +class OrganizationPersonCreate(LoginRequiredMixin, CreateView): +    model = models.Person +    form_class = forms.BaseOrganizationPersonForm +    template_name = 'ishtar/organization_person_form.html' +    relative_label = _("Corporation manager") + +    def get_context_data(self, *args, **kwargs): +        data = super(OrganizationPersonCreate, self).get_context_data(*args, +                                                                      **kwargs) +        data['relative_label'] = self.relative_label +        return data + +    def get_success_url(self): +        return reverse('organization_person_edit', args=[self.object.pk]) + +class OrganizationPersonEdit(LoginRequiredMixin, UpdateView): +    model = models.Person +    form_class = forms.BaseOrganizationPersonForm +    template_name = 'ishtar/organization_person_form.html' +    relative_label = _("Corporation manager") + +    def get_context_data(self, *args, **kwargs): +        data = super(OrganizationPersonEdit, self).get_context_data(*args, +                                                                      **kwargs) +        data['relative_label'] = self.relative_label +        return data + +    def get_success_url(self): +        return reverse('organization_person_edit', args=[self.object.pk]) diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 0ba4061a8..ba7e61e46 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -26,6 +26,7 @@ from django.db.models import fields  from django.forms import ClearableFileInput  from django.forms.widgets import flatatt  from django.template import Context, loader +from django.template.defaultfilters import slugify  from django.utils.encoding import smart_unicode  from django.utils.functional import lazy  from django.utils.html import escape @@ -33,7 +34,7 @@ from django.utils.safestring import mark_safe  from django.utils.simplejson import JSONEncoder  from django.utils.translation import ugettext_lazy as _ -import models +from ishtar_common import models  reverse_lazy = lazy(reverse, unicode) @@ -203,7 +204,7 @@ class JQueryAutoComplete(forms.TextInput):              except:                  raise ValueError('source type is not valid')          dct = {'source':mark_safe(source), -               'field_id':field_id} +               'field_id':field_id,}          if self.options:              dct['options'] = mark_safe('%s' % self.options) @@ -218,6 +219,7 @@ class JQueryAutoComplete(forms.TextInput):      def render(self, name, value=None, attrs=None):          attrs_hidden = self.build_attrs(attrs, name=name)          attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...")          if value:              hiddens = []              selects = [] @@ -281,6 +283,204 @@ class JQueryAutoComplete(forms.TextInput):          }          return html +class JQueryTown(forms.TextInput): +    """ +    Town fields whith state and department pre-selections +    """ + +    def __init__(self, source, options={}, +                 attrs={}, new=False, limit={}): +        self.options = None +        self.attrs = {} +        self.source = source +        if len(options) > 0: +            self.options = JSONEncoder().encode(options) +        self.attrs.update(attrs) +        self.new = new +        self.limit = limit + +    @classmethod +    def encode_source(cls, source): +        encoded_src = '' +        if isinstance(source, list): +            encoded_src = JSONEncoder().encode(source) +        elif isinstance(source, str) \ +           or isinstance(source, unicode): +            src = escape(source) +            if not src.endswith('/'): +                src += "/" +            encoded_src = "'%s'" % src +        else: +            try: +                src = unicode(source) +                if not src.endswith('/'): +                    src += "/" +                encoded_src = "'%s'" % src +            except: +                raise ValueError('source type is not valid') +        return encoded_src + +    def render(self, name, value=None, attrs=None): +        attrs_hidden = self.build_attrs(attrs, name=name) +        attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...") +        selected = '' +        selected_state = '' +        selected_department = '' +        if value: +            hiddens = [] +            selects = [] +            if type(value) not in (list, tuple): +                values = unicode(escape(smart_unicode(value))) +                values = values.replace('[', '').replace(']', '') +                values = values.split(',') +            else: +                values = [] +                for v in value: +                    values += v.split(',') +            for v in values: +                if not v: +                    continue +                hiddens.append(v) +                selects.append(v) +                try: +                    item = models.Town.objects.get(pk=v) +                    selects[-1] = unicode(item) +                    if item.departement: +                        selected_department = item.departement.number +                        if item.departement.state: +                            selected_state = item.departement.state.number +                    selected = item.pk +                except (models.Town.DoesNotExist, ValueError): +                    selects.pop() +                    hiddens.pop() +            if hiddens and selects: +                attrs_hidden['value'] = hiddens[0] +                attrs_select['value'] = selects[0] +        if not self.attrs.has_key('id'): +            attrs_hidden['id'] = 'id_%s' % name +            attrs_select['id'] = 'id_select_%s' % name +        if 'class' not in attrs_select: +            attrs_select['class'] = 'autocomplete' + +        source = self.encode_source(self.source) +        dct = {'source':mark_safe(source), +               'selected':selected, +               'safe_field_id':slugify(name).replace('-', '_'), +               'field_id':name} +        if self.options: +            dct['options'] = mark_safe('%s' % self.options) + +        dct.update({'attrs_select':mark_safe(flatatt(attrs_select)), +               'attrs_hidden':mark_safe(flatatt(attrs_hidden)), +               'name':name, +               'states':models.State.objects.all().order_by('label'), +               'selected_department':selected_department, +               'selected_state':selected_state +               }) +        html = loader.get_template('blocks/JQueryAdvancedTown.html').render( +                                                                Context(dct)) +        return html + +class JQueryPersonOrganization(forms.TextInput): +    """ +    Complex widget which manage: +     * link between person and organization +     * display addresses of the person and of the organization +     * create new person and new organization +    """ + +    def __init__(self, source, edit_source, model, options={}, +                 attrs={}, new=False, limit={}, +                 html_template = 'blocks/PersonOrganization.html', +                 js_template='blocks/JQueryPersonOrganization.js'): +        self.options = None +        self.attrs = {} +        self.model = model +        self.source = source +        self.edit_source = edit_source +        if len(options) > 0: +            self.options = JSONEncoder().encode(options) +        self.attrs.update(attrs) +        self.new = new +        self.limit = limit +        self.js_template = js_template +        self.html_template = html_template + +    @classmethod +    def encode_source(cls, source): +        encoded_src = '' +        if isinstance(source, list): +            encoded_src = JSONEncoder().encode(source) +        elif isinstance(source, str) \ +           or isinstance(source, unicode): +            encoded_src = "'%s'" % escape(source) +        else: +            try: +                encoded_src = "'" + unicode(source) + "'" +            except: +                raise ValueError('source type is not valid') +        return encoded_src + +    def render_js(self, field_id, selected=''): +        source = self.encode_source(self.source) +        edit_source = self.encode_source(self.edit_source) +        dct = {'source':mark_safe(source), +               'edit_source':mark_safe(edit_source), +               'selected':selected, +               'safe_field_id':slugify(field_id).replace('-', '_'), +               'field_id':field_id} +        if self.options: +            dct['options'] = mark_safe('%s' % self.options) +        js = loader.get_template(self.js_template).render(Context(dct)) +        return js + +    def render(self, name, value=None, attrs=None): +        attrs_hidden = self.build_attrs(attrs, name=name) +        attrs_select = self.build_attrs(attrs) +        attrs_select['placeholder'] = _(u"Search...") +        selected = '' +        if value: +            hiddens = [] +            selects = [] +            if type(value) not in (list, tuple): +                values = unicode(escape(smart_unicode(value))) +                values = values.replace('[', '').replace(']', '') +                values = values.split(',') +            else: +                values = [] +                for v in value: +                    values += v.split(',') +            for v in values: +                if not v: +                    continue +                hiddens.append(v) +                selects.append(v) +                if self.model: +                    try: +                        item = self.model.objects.get(pk=v) +                        selects[-1] = unicode(item) +                        selected = item.pk +                    except (self.model.DoesNotExist, ValueError): +                        selects.pop() +                        hiddens.pop() +            if hiddens and selects: +                attrs_hidden['value'] = hiddens[0] +                attrs_select['value'] = selects[0] +        if not self.attrs.has_key('id'): +            attrs_hidden['id'] = 'id_%s' % name +            attrs_select['id'] = 'id_select_%s' % name +        if 'class' not in attrs_select: +            attrs_select['class'] = 'autocomplete' +        new = '' +        dct = {'attrs_select':mark_safe(flatatt(attrs_select)), +               'attrs_hidden':mark_safe(flatatt(attrs_hidden)), +               'name':name, +               'js':self.render_js(name, selected), +               'new':mark_safe(new)} +        html = loader.get_template(self.html_template).render(Context(dct)) +        return html +  class JQueryJqGrid(forms.RadioSelect):      COL_TPL = "{name:'%(idx)s', index:'%(idx)s', sortable:true}"      class Media: diff --git a/ishtar_common/wizards.py b/ishtar_common/wizards.py index 190a7fc86..1e515d13e 100644 --- a/ishtar_common/wizards.py +++ b/ishtar_common/wizards.py @@ -95,8 +95,11 @@ class Wizard(NamedUrlWizardView):      def get_template_names(self):          templates = ['ishtar/wizard/default_wizard.html']          current_step = self.steps.current -        if current_step in self.wizard_templates: -            templates = [self.wizard_templates[current_step]] + templates +        wizard_templates = dict([ +            (key % {'url_name':self.url_name}, self.wizard_templates[key]) +                            for key in self.wizard_templates]) +        if current_step in wizard_templates: +            templates = [wizard_templates[current_step]] + templates          elif current_step == self.steps.last:              templates = ['ishtar/wizard/confirm_wizard.html'] + templates          return templates @@ -617,6 +620,13 @@ class Wizard(NamedUrlWizardView):          return key in request.session[storage.prefix]['step_data'][form_key]      @classmethod +    def session_reset(cls, request, url_name): +        prefix = url_name + normalize_name(cls.__name__) +        storage = get_storage(cls.storage_name, prefix, request, +                              getattr(cls, 'file_storage', None)) +        storage.reset() + +    @classmethod      def session_set_value(cls, request, form_key, key, value, reset=False):          prefix = form_key.split('-')[1] + normalize_name(cls.__name__)          storage = get_storage(cls.storage_name, prefix, request, diff --git a/ishtar_pdl/__init__.py b/ishtar_pdl/__init__.py new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/ishtar_pdl/__init__.py @@ -0,0 +1 @@ +  diff --git a/ishtar_pdl/models.py b/ishtar_pdl/models.py new file mode 100644 index 000000000..8d1c8b69c --- /dev/null +++ b/ishtar_pdl/models.py @@ -0,0 +1 @@ +  diff --git a/ishtar_pdl/static/pdl/JQueryCorporation.js b/ishtar_pdl/static/pdl/JQueryCorporation.js new file mode 100644 index 000000000..e65001506 --- /dev/null +++ b/ishtar_pdl/static/pdl/JQueryCorporation.js @@ -0,0 +1,14 @@ +var current_status = 'corporation'; + +$(function() { +    var $radios = $('input:radio[name=person_type]'); +    if($radios.is(':checked') === false) { +        $radios.filter('[value='+ current_status +']').prop('checked', true); +    } + +    $radios.change(function(){ +        var loc = window.location; +        window.location = loc.protocol + '//' + loc.host + loc.pathname + "?status=" + $('input:radio[name=person_type]:checked').val(); +    }); +    $("#corporation_div").show(); +}); diff --git a/ishtar_pdl/static/pdl/styles.css b/ishtar_pdl/static/pdl/styles.css new file mode 100644 index 000000000..f7a73f8eb --- /dev/null +++ b/ishtar_pdl/static/pdl/styles.css @@ -0,0 +1,14 @@ +div#validation-bar{ +    position: fixed; +    bottom: 0px; +    background-color: #CCC; +    width: 100%; +    left: 0px; +    height: 40px; +    padding: 5px; +} + +#reset_wizards{ +    right:50px; +    position:absolute; +} diff --git a/ishtar_pdl/templates/blocks/extra_head.html b/ishtar_pdl/templates/blocks/extra_head.html new file mode 100644 index 000000000..5a75d0728 --- /dev/null +++ b/ishtar_pdl/templates/blocks/extra_head.html @@ -0,0 +1 @@ +    <link rel="stylesheet" href="{{STATIC_URL}}/pdl/styles.css" /> | 
