diff options
42 files changed, 3241 insertions, 1255 deletions
diff --git a/CHANGES.md b/CHANGES.md index ddb825759..33ba9cf24 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,20 @@ Ishtar changelog ================ +v0.99.11 (2017-02-06) +--------------------- +### Features ### +- Imports: manage model limitation (don't create items not in a whitelist) +- Harmonize CSV import and CSV exports +- Imports: multi format parse of dates +- Find sheet: display treatment states in treatment table +- Basket sheet: add basket name and basic informations +- Admin: improve search and ordering +- Update labels and translations + +### Bug fixes ### +- Fix UI bug: validation button at the bottom of the page + v0.99.10 (2017-02-04) --------------------- diff --git a/Makefile.example b/Makefile.example index cc6eac60f..89cae31a1 100644 --- a/Makefile.example +++ b/Makefile.example @@ -175,6 +175,7 @@ fixtures_common: fixtures_common_importers fixtures_spatialrefsystem fixtures_common_importers: cd $(project); $(PYTHON) ./manage.py dumpdata --indent 4 \ + ishtar_common.importermodel \ ishtar_common.importertype \ ishtar_common.regexp \ ishtar_common.importerdefault \ diff --git a/archaeological_context_records/forms.py b/archaeological_context_records/forms.py index 0452243e2..953d33417 100644 --- a/archaeological_context_records/forms.py +++ b/archaeological_context_records/forms.py @@ -144,7 +144,7 @@ class RecordFormGeneral(ManageOldType, forms.Form): width = forms.FloatField(label=_(u"Width (m)"), required=False) thickness = forms.FloatField(label=_(u"Thickness (m)"), required=False) depth = forms.FloatField(label=_(u"Depth (m)"), required=False) - unit = forms.ChoiceField(label=_("Unit"), required=False, choices=[]) + unit = forms.ChoiceField(label=_("Context record type"), required=False, choices=[]) has_furniture = forms.NullBooleanField(label=_(u"Has furniture?"), required=False) location = forms.CharField( @@ -352,7 +352,7 @@ class RecordSourceSelect(SourceSelect): context_record__datings__period = forms.ChoiceField( label=_(u"Period of the context record"), choices=[]) context_record__unit = forms.ChoiceField( - label=_(u"Unit type of the context record"), choices=[]) + label=_(u"Context record type"), choices=[]) def __init__(self, *args, **kwargs): super(RecordSourceSelect, self).__init__(*args, **kwargs) diff --git a/archaeological_context_records/locale/django.pot b/archaeological_context_records/locale/django.pot index 75e6a2160..e42400f29 100644 --- a/archaeological_context_records/locale/django.pot +++ b/archaeological_context_records/locale/django.pot @@ -3,7 +3,7 @@ # This file is distributed under the same license as the Ishtar package. # Étienne Loks <etienne.loks at peacefrogs net>, 2010-2015. # Valérie-Emma Leroux <emma@iggdrasil.net>, 2016. #zanata -# Étienne Loks <etienne.loks@iggdrasil.net>, 2017. #zanata +# Valérie-Emma Leroux <emma@iggdrasil.net>, 2017. #zanata msgid "" msgstr "" @@ -253,11 +253,11 @@ msgid "Dating types" msgstr "" #: models.py:47 -msgid "Dating quality" +msgid "Dating quality type" msgstr "" #: models.py:48 -msgid "Dating qualities" +msgid "Dating quality types" msgstr "" #: models.py:62 diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index 9714673e6..377cea087 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -76,12 +76,12 @@ class Dating(models.Model): class Unit(GeneralType): order = models.IntegerField(_(u"Order")) - parent = models.ForeignKey("Unit", verbose_name=_(u"Parent unit"), + parent = models.ForeignKey("Unit", verbose_name=_(u"Parent context record type"), blank=True, null=True) class Meta: - verbose_name = _(u"Unit Type") - verbose_name_plural = _(u"Unit Types") + verbose_name = _(u"Context record Type") + verbose_name_plural = _(u"Context record Types") ordering = ('order', 'label') def __unicode__(self): @@ -193,7 +193,7 @@ class ContextRecord(BaseHistorizedItem, ImageModel, OwnPerms, datings = models.ManyToManyField(Dating) datings_comment = models.TextField(_(u"Comment on datings"), blank=True, null=True) - unit = models.ForeignKey(Unit, verbose_name=_(u"Unit"), related_name='+', + unit = models.ForeignKey(Unit, verbose_name=_(u"Context record type"), related_name='+', blank=True, null=True) has_furniture = models.NullBooleanField(_(u"Has furniture?"), blank=True, null=True) @@ -410,13 +410,13 @@ class RecordRelations(GeneralRecordRelations, models.Model): ] COL_LABELS = { "left_record__label": _(u"ID (left)"), - "left_record__unit": _(u"Unit (left)"), + "left_record__unit": _(u"Context record type (left)"), "left_record__parcel": _(u"Parcel (left)"), "left_record__description": _(u"Description (left)"), "left_record__datings__period": _(u"Periods (left)"), "relation_type": _(u"Relation type"), "right_record__label": _(u"ID (right)"), - "right_record__unit": _(u"Unit (right)"), + "right_record__unit": _(u"Context record type (right)"), "right_record__parcel": _(u"Parcel (right)"), "right_record__description": _(u"Description (right)"), "right_record__datings__period": _(u"Periods (right)") @@ -454,7 +454,7 @@ class RecordRelationView(models.Model): COL_LABELS = { "relation_type": _(u"Relation type"), "right_record__label": _(u"ID"), - "right_record__unit": _(u"Unit"), + "right_record__unit": _(u"Context record type"), "right_record__parcel": _(u"Parcel"), "right_record__description": _(u"Description"), "right_record__datings__period": _(u"Periods") diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index 87eb80c57..f1e6581d7 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -1,6 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -# Copyright (C) 2015 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet> +# Copyright (C) 2015-2017 É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 @@ -20,76 +20,129 @@ import json from django.conf import settings -from django.core.exceptions import ValidationError -from django.core.files.uploadedfile import SimpleUploadedFile +from django.core.exceptions import ValidationError, ImproperlyConfigured from django.core.urlresolvers import reverse from django.test import TestCase from django.test.client import Client -from ishtar_common.models import ImporterType, IshtarSiteProfile +from ishtar_common.models import IshtarSiteProfile, ImporterModel from ishtar_common.tests import create_superuser from archaeological_operations.tests import OperationInitTest, \ - ImportOperationTest + ImportTest, ImportOperationTest from archaeological_operations import models as models_ope from archaeological_context_records import models -from ishtar_common import forms_common -class ImportContextRecordTest(ImportOperationTest): - test_operations = False - test_context_records = True +class ImportContextRecordTest(ImportTest, TestCase): fixtures = ImportOperationTest.fixtures + [ settings.ROOT_PATH + '../archaeological_context_records/fixtures/initial_data-fr.json', ] - def testMCCImportContextRecords(self, test=True): - if test and not self.test_context_records: - return - self.testMCCImportParcels(test=False) - + def test_mcc_import_contextrecords(self): old_nb = models.ContextRecord.objects.count() - MCC = ImporterType.objects.get(name=u"MCC - UE") - mcc_file = open( - settings.ROOT_PATH + - '../archaeological_context_records/tests/' - 'MCC-context-records-example.csv', 'rb') - file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name, - mcc_file.read())} - post_dict = {'importer_type': MCC.pk, 'skip_lines': 1, - "encoding": 'utf-8'} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - instance=None) - form.is_valid() - if test: - self.assertTrue(form.is_valid()) + mcc, form = self.init_context_record_import() + + self.assertTrue(form.is_valid()) impt = form.save(self.ishtar_user) impt.initialize() - # doing manual connections - hc = models.Unit.objects.get(txt_idx='not_in_context').pk - self.setTargetKey('unit', 'hc', hc) - self.setTargetKey('unit', 'hors-contexte', hc) - layer = models.Unit.objects.get(txt_idx='layer').pk - self.setTargetKey('unit', 'couche', layer) - + self.init_cr_targetkey(impt) impt.importation() - if not test: - return - - # new ues has now been imported + # new context records has now been imported current_nb = models.ContextRecord.objects.count() - self.assertTrue(current_nb == (old_nb + 4)) + self.assertEqual(current_nb, old_nb + 4) self.assertEqual( - models.ContextRecord.objects.filter(unit__pk=hc).count(), 3) + models.ContextRecord.objects.filter( + unit__txt_idx='not_in_context').count(), 3) self.assertEqual( - models.ContextRecord.objects.filter(unit__pk=layer).count(), 1) + models.ContextRecord.objects.filter( + unit__txt_idx='layer').count(), 1) + def test_model_limitation(self): + old_nb = models.ContextRecord.objects.count() + mcc, form = self.init_context_record_import() + mcc.created_models.clear() + + self.assertTrue(form.is_valid()) + impt = form.save(self.ishtar_user) + impt.initialize() + + self.init_cr_targetkey(impt) + impt.importation() + # no model defined in created_models: normal import + current_nb = models.ContextRecord.objects.count() + self.assertEqual(current_nb, old_nb + 4) + + # add an inadequate model to make created_models non empty + for cr in models.ContextRecord.objects.all(): + cr.delete() + mcc, form = self.init_context_record_import() + mcc.created_models.clear() + mcc.created_models.add(ImporterModel.objects.get( + klass='ishtar_common.models.Organization' + )) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_cr_targetkey(impt) + # Dating is not in models that can be created but force new is + # set for a column that references Dating + with self.assertRaises(ImproperlyConfigured): + impt.importation() + + # retry with only Dating (no context record) + for cr in models.ContextRecord.objects.all(): + cr.delete() + mcc, form = self.init_context_record_import() + mcc.created_models.clear() + dat_model, c = ImporterModel.objects.get_or_create( + klass='archaeological_context_records.models.Dating', + defaults={"name": 'Dating'}) + mcc.created_models.add(dat_model) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_cr_targetkey(impt) + impt.importation() + + current_nb = models.ContextRecord.objects.count() + self.assertEqual(current_nb, 0) + + # add a context record model + for cr in models.ContextRecord.objects.all(): + cr.delete() + mcc, form = self.init_context_record_import() + mcc.created_models.clear() + mcc.created_models.add(ImporterModel.objects.get( + klass='archaeological_context_records.models.ContextRecord' + )) + mcc.created_models.add(dat_model) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_cr_targetkey(impt) + impt.importation() + current_nb = models.ContextRecord.objects.count() + self.assertEqual(current_nb, 4) + ''' + + # add a context record model + for cr in models.ContextRecord.objects.all(): + cr.delete() + mcc, form = self.init_context_record_import() + mcc.created_models.clear() + mcc.created_models.add(ImporterModel.objects.get( + klass='archaeological_context_records.models.ContextRecord' + )) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_cr_targetkey(impt) + impt.importation() + current_nb = models.ContextRecord.objects.count() + self.assertEqual(current_nb, 4) + ''' -class ContextRecordInit(OperationInitTest): - test_operations = False +class ContextRecordInit(OperationInitTest): def create_context_record(self, user=None, data={}, force=False): if not getattr(self, 'context_records', None): self.context_records = [] diff --git a/archaeological_context_records/tests/MCC-context-records-example.csv b/archaeological_context_records/tests/MCC-context-records-example.csv index d246623cd..9a6ad5f09 100644 --- a/archaeological_context_records/tests/MCC-context-records-example.csv +++ b/archaeological_context_records/tests/MCC-context-records-example.csv @@ -1,5 +1,5 @@ code OA,numero INSEE commune,identifiant parcelle,identifiant UE,type,description,interpretation,date ouverture,date fermeture,identifiant document georeferencement,commentaire,nature,chronologie 4200,75101,XXXX,HC,Hors contexte,UE globale pour cette parcelle,Non-applicable,,,,UE virtuelle,, 4200,75101,XXXX,H.-C.,HC,UE globale pour cette parcelle,NA,,,,UE virtuelle,, -4200,59350,YY55,XXXXXX,HC,UE globale pour cette parcelle,,,,,UE virtuelle,, +4200,59350,YY55,XXXXXX,HC,UE globale pour cette parcelle,,,,,UE virtuelle,,paleolithic 4200,59350,YY55,US17,couche,couche de cendre,comblement,,,,présence de charbons,,indéterminé diff --git a/archaeological_files/locale/django.pot b/archaeological_files/locale/django.pot index 111ba45c4..3eecfc8cd 100644 --- a/archaeological_files/locale/django.pot +++ b/archaeological_files/locale/django.pot @@ -5,6 +5,7 @@ # Étienne Loks <etienne.loks@iggdrasil.net>, 2015. #zanata # Valérie-Emma Leroux <emma@iggdrasil.net>, 2016. #zanata # Étienne Loks <etienne.loks@iggdrasil.net>, 2016. #zanata +# Valérie-Emma Leroux <emma@iggdrasil.net>, 2017. #zanata msgid "" msgstr "" diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html index f579a9d47..72dc1d35d 100644 --- a/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_instruction.html @@ -58,9 +58,14 @@ <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> {{ previous_fields|safe }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} </div> </form> <script type='text/javascript'> diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html index d520c1ec8..36f1aa4f8 100644 --- a/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_person_orga.html @@ -62,9 +62,14 @@ $(function() { <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> {{ previous_fields|safe }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% 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 index bfa490680..5eb7c014b 100644 --- a/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_planningservice.html @@ -37,9 +37,14 @@ <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> {{ previous_fields|safe }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} </div> </form> {% endblock %} diff --git a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html index 304b58b76..95e8e8841 100644 --- a/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html +++ b/archaeological_files_pdl/templates/ishtar/wizard/wizard_preventiveplanning.html @@ -103,9 +103,14 @@ <input type="hidden" name="{{ step_field }}" value="{{ step0 }}" /> {{ previous_fields|safe }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} </div> </form> {% endblock %} diff --git a/archaeological_finds/locale/django.pot b/archaeological_finds/locale/django.pot index 819cf38bf..b25eac027 100644 --- a/archaeological_finds/locale/django.pot +++ b/archaeological_finds/locale/django.pot @@ -4,7 +4,6 @@ # Étienne Loks <etienne.loks at peacefrogs net>, 2010-2015. # Valérie-Emma Leroux <emma@iggdrasil.net>, 2016. #zanata # Valérie-Emma Leroux <emma@iggdrasil.net>, 2017. #zanata -# Étienne Loks <etienne.loks@iggdrasil.net>, 2017. #zanata msgid "" msgstr "" diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html index bb2e629c7..4ae6dbffe 100644 --- a/archaeological_finds/templates/ishtar/sheet_find.html +++ b/archaeological_finds/templates/ishtar/sheet_find.html @@ -95,6 +95,7 @@ <th>{% trans "Year - index" %}</th> <th>{% trans "Label" %}</th> <th>{% trans "Type" %}</th> + <th>{% trans "State" %}</th> <th>{% trans "Related finds (max. 15 displayed)" %}</th> <th>{% trans "Doer" %}</th> <th>{% trans "Container" %}</th> @@ -112,6 +113,7 @@ <td class='string'>{{ treatment.year }} - {{treatment.index}}</td> <td class='string'>{{ treatment.label|default_if_none:"-" }}</td> <td class='string'>{{ treatment.treatment_types_lbl }}</td> + <td class='string'>{{ treatment.treatment_state|default_if_none:"-" }}</td> <td class='item-list'>{% for item in items %}<span>{{item}} {{ item|link_to_window}}</span>{% endfor %}</td> <td class='string'>{{ treatment.person|default_if_none:"-" }}</td> <td class='string'>{{ treatment.container|default_if_none:"-" }}</td> @@ -135,6 +137,7 @@ <th>{% trans "Year - index" %}</th> <th>{% trans "Label" %}</th> <th>{% trans "Type" %}</th> + <th>{% trans "State" %}</th> <th>{% trans "Related finds (max. 15 displayed)" %}</th> <th>{% trans "Doer" %}</th> <th>{% trans "Container" %}</th> @@ -152,6 +155,7 @@ <td class='string'>{{ treatment.year }} - {{treatment.index}}</td> <td class='string'>{{ treatment.label }}</td> <td class='string'>{{ treatment.treatment_types_lbl }}</td> + <td class='string'>{{ treatment.treatment_state|default_if_none:"-" }}</td> <td class='item-list'>{% for item in items %}<span>{{item}} {{ item|link_to_window}}</span>{% endfor %}</td> <td class='string'>{{ treatment.person|default_if_none:"" }}</td> <td class='string'>{{ treatment.container|default_if_none:"-" }}</td> diff --git a/archaeological_finds/templates/ishtar/sheet_findbasket.html b/archaeological_finds/templates/ishtar/sheet_findbasket.html index 7738a872d..6f8b12e6d 100644 --- a/archaeological_finds/templates/ishtar/sheet_findbasket.html +++ b/archaeological_finds/templates/ishtar/sheet_findbasket.html @@ -1,9 +1,13 @@ {% extends "ishtar/sheet.html" %} -{% load i18n window_tables window_header from_dict %} +{% load i18n window_tables window_header from_dict window_field %} {% block head_title %}{% trans "Find basket" %}{% endblock %} {% block content %} + {% window_nav item window_id 'show-findbasket' 'select_itemsinbasket' %} +<p class="window-refs">{{ item.label|default:"" }}</p> +{% field "Owned by" item.user %} +{% field "Comment" item.comment %} {% dynamic_table_document_large finds 'finds_for_ope' 'basket' item.pk 'TABLE_COLS_FOR_OPE' output %} {% endblock %} diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index f0112123b..a1dc33dd8 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -33,11 +33,12 @@ from archaeological_context_records.models import Period, Dating from archaeological_finds import models, views from archaeological_warehouse.models import Warehouse, WarehouseType -from archaeological_context_records.tests import ImportContextRecordTest, \ - ContextRecordInit - from ishtar_common import forms_common + from ishtar_common.tests import WizardTest, WizardTestFormData as FormData +from archaeological_operations.tests import ImportTest +from archaeological_context_records.tests import ImportContextRecordTest, \ + ContextRecordInit class FindInit(ContextRecordInit): @@ -217,17 +218,14 @@ class ATreatmentWizardCreationTest(WizardTest, FindInit, TestCase): treat) -class ImportFindTest(ImportContextRecordTest): - test_operations = False - test_context_records = False - +class ImportFindTest(ImportTest, TestCase): fixtures = ImportContextRecordTest.fixtures + [ settings.ROOT_PATH + '../archaeological_finds/fixtures/initial_data-fr.json', ] - def testMCCImportFinds(self, test=True): - self.testMCCImportContextRecords(test=False) + def test_mcc_import_finds(self): + self.init_context_record() old_nb = models.BaseFind.objects.count() old_nb_find = models.Find.objects.count() @@ -252,22 +250,18 @@ class ImportFindTest(ImportContextRecordTest): mcc_images.read())} post_dict = {'importer_type': MCC.pk, 'skip_lines': 1, "encoding": 'utf-8'} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - instance=None) + form = forms_common.NewImportForm(data=post_dict, files=file_dict) form.is_valid() - if test: - self.assertTrue(form.is_valid()) + self.assertTrue(form.is_valid()) impt = form.save(self.ishtar_user) impt.initialize() # doing manual connections ceram = models.MaterialType.objects.get(txt_idx='ceramic').pk glass = models.MaterialType.objects.get(txt_idx='glass').pk - self.setTargetKey('find__material_types', 'terre-cuite', ceram) - self.setTargetKey('find__material_types', 'verre', glass) + self.set_target_key('find__material_types', 'terre-cuite', ceram) + self.set_target_key('find__material_types', 'verre', glass) impt.importation() - if not test: - return # new finds has now been imported current_nb = models.BaseFind.objects.count() self.assertEqual(current_nb, (old_nb + 4)) diff --git a/archaeological_operations/admin.py b/archaeological_operations/admin.py index d8ce23662..3abf22eae 100644 --- a/archaeological_operations/admin.py +++ b/archaeological_operations/admin.py @@ -105,10 +105,16 @@ class ActTypeAdmin(GeneralTypeAdmin): list_filter = ('intented_to',) list_display = ['label', 'txt_idx', 'available', 'intented_to'] - admin.site.register(models.ActType, ActTypeAdmin) -general_models = [models.RemainType, models.ReportState] + +class ReportStateAdmin(GeneralTypeAdmin): + list_display = ['label', 'txt_idx', 'available', 'order', 'comment'] + +admin.site.register(models.ReportState, ReportStateAdmin) + + +general_models = [models.RemainType] for model in general_models: admin.site.register(model, GeneralTypeAdmin) diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index d4134693f..040c7c3d8 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -35,71 +35,44 @@ import models from archaeological_operations import views from ishtar_common.models import OrganizationType, Organization, \ - ImporterType, IshtarUser, TargetKey, IshtarSiteProfile, Town + ImporterType, IshtarUser, TargetKey, ImporterModel, IshtarSiteProfile, Town +from archaeological_context_records.models import Unit from ishtar_common import forms_common from ishtar_common.tests import WizardTest, WizardTestFormData as FormData, \ create_superuser, create_user -class ImportOperationTest(TestCase): - fixtures = [settings.ROOT_PATH + - '../fixtures/initial_data-auth-fr.json', - settings.ROOT_PATH + - '../ishtar_common/fixtures/initial_data-fr.json', - settings.ROOT_PATH + - '../ishtar_common/fixtures/test_towns.json', - settings.ROOT_PATH + - '../ishtar_common/fixtures/initial_importtypes-fr.json', - settings.ROOT_PATH + - '../archaeological_operations/fixtures/initial_data-fr.json'] - test_operations = True +class ImportTest(object): + def setUp(self): + self.username, self.password, self.user = create_superuser() + self.ishtar_user = IshtarUser.objects.get(pk=self.user.pk) - def setTargetKey(self, target, key, value): - tg = TargetKey.objects.get(target__target=target, key=key) + def set_target_key(self, target, key, value, imp=None): + keys = {'target__target': target, 'key': key} + if imp: + keys['associated_import'] = imp + tg = TargetKey.objects.get(**keys) tg.value = value tg.is_set = True tg.save() - def setUp(self): - self.username, self.password, self.user = create_superuser() - self.ishtar_user = IshtarUser.objects.get(pk=self.user.pk) - - def testMCCImportOperation(self, test=True): - # MCC opérations - if self.test_operations is False: - test = False - first_ope_nb = models.Operation.objects.count() - MCC_OPERATION = ImporterType.objects.get(name=u"MCC - Opérations") + def init_ope_import(self): + mcc_operation = ImporterType.objects.get(name=u"MCC - Opérations") mcc_operation_file = open( settings.ROOT_PATH + '../archaeological_operations/tests/MCC-operations-example.csv', 'rb') file_dict = {'imported_file': SimpleUploadedFile( mcc_operation_file.name, mcc_operation_file.read())} - post_dict = {'importer_type': MCC_OPERATION.pk, 'skip_lines': 1, + post_dict = {'importer_type': mcc_operation.pk, 'skip_lines': 1, "encoding": 'utf-8'} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - instance=None) + form = forms_common.NewImportForm(data=post_dict, files=file_dict) form.is_valid() - if test: - self.assertTrue(form.is_valid()) - impt = form.save(self.ishtar_user) - target_key_nb = TargetKey.objects.count() - impt.initialize() - # new key have to be set - if test: - self.assertTrue(TargetKey.objects.count() > target_key_nb) - - # first try to import - impt.importation() - current_ope_nb = models.Operation.objects.count() - # no new operation imported because of a missing connection for - # operation_type value - if test: - self.assertTrue(current_ope_nb == first_ope_nb) + return mcc_operation, form - # doing manualy connections + def init_ope_targetkey(self, imp): + # doing manually connections tg = TargetKey.objects.filter(target__target='operation_type' ).order_by('-pk').all()[0] tg.value = models.OperationType.objects.get( @@ -107,21 +80,109 @@ class ImportOperationTest(TestCase): tg.is_set = True tg.save() - target = TargetKey.objects.get(key='gallo-romain') + target = TargetKey.objects.get(key='gallo-romain', + associated_import=imp) gallo = models.Period.objects.get(txt_idx='gallo-roman') target.value = gallo.pk target.is_set = True target.save() - target = TargetKey.objects.get(key='age-du-fer') + target = TargetKey.objects.get(key='age-du-fer', + associated_import=imp) iron = models.Period.objects.get(txt_idx='iron_age') target.value = iron.pk target.is_set = True target.save() + def init_ope(self): + importer, form = self.init_ope_import() + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_ope_targetkey(imp=impt) + impt.importation() + + def init_parcel_import(self): + self.init_ope() + mcc_parcel = ImporterType.objects.get(name=u"MCC - Parcelles") + mcc_file = open( + settings.ROOT_PATH + + '../archaeological_operations/tests/MCC-parcelles-example.csv', + 'rb') + file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name, + mcc_file.read())} + post_dict = {'importer_type': mcc_parcel.pk, 'skip_lines': 1, + "encoding": 'utf-8'} + form = forms_common.NewImportForm(data=post_dict, files=file_dict) + form.is_valid() + return mcc_parcel, form + + def init_parcel(self): + importer, form = self.init_parcel_import() + impt = form.save(self.ishtar_user) + impt.initialize() + impt.importation() + + def init_context_record_import(self): + self.init_parcel() + mcc = ImporterType.objects.get(name=u"MCC - UE") + mcc_file = open( + settings.ROOT_PATH + + '../archaeological_context_records/tests/' + 'MCC-context-records-example.csv', 'rb') + file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name, + mcc_file.read())} + post_dict = {'importer_type': mcc.pk, 'skip_lines': 1, + "encoding": 'utf-8'} + form = forms_common.NewImportForm(data=post_dict, files=file_dict) + form.is_valid() + return mcc, form + + def init_cr_targetkey(self, imp): + hc = Unit.objects.get(txt_idx='not_in_context').pk + self.set_target_key('unit', 'hc', hc, imp=imp) + self.set_target_key('unit', 'hors-contexte', hc, imp=imp) + layer = Unit.objects.get(txt_idx='layer').pk + self.set_target_key('unit', 'couche', layer, imp=imp) + + def init_context_record(self): + mcc, form = self.init_context_record_import() + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_cr_targetkey(impt) + impt.importation() + + +class ImportOperationTest(ImportTest, TestCase): + fixtures = [settings.ROOT_PATH + + '../fixtures/initial_data-auth-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_data-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/test_towns.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_importtypes-fr.json', + settings.ROOT_PATH + + '../archaeological_operations/fixtures/initial_data-fr.json'] + + def test_mcc_import_operation(self): + first_ope_nb = models.Operation.objects.count() + importer, form = self.init_ope_import() + self.assertTrue(form.is_valid()) + impt = form.save(self.ishtar_user) + target_key_nb = TargetKey.objects.count() + impt.initialize() + # new key have to be set + self.assertTrue(TargetKey.objects.count() > target_key_nb) + + # first try to import + impt.importation() + current_ope_nb = models.Operation.objects.count() + # no new operation imported because of a missing connection for + # operation_type value + self.assertTrue(current_ope_nb == first_ope_nb) + self.init_ope_targetkey(imp=impt) + impt.importation() - if not test: - return # a new operation has now been imported current_ope_nb = models.Operation.objects.count() self.assertTrue(current_ope_nb == (first_ope_nb + 1)) @@ -131,8 +192,9 @@ class ImportOperationTest(TestCase): self.assertTrue(last_ope.code_patriarche == 4200) self.assertTrue(last_ope.operation_type.txt_idx == 'prog_excavation') self.assertEqual(last_ope.periods.count(), 2) - periods = last_ope.periods.all() - self.assertTrue(iron in periods and gallo in periods) + periods = [period.txt_idx for period in last_ope.periods.all()] + self.assertIn('iron_age', periods) + self.assertIn('gallo-roman', periods) # a second importation will be not possible: no two same patriarche # code @@ -141,33 +203,62 @@ class ImportOperationTest(TestCase): self.assertTrue(last_ope == models.Operation.objects.order_by('-pk').all()[0]) - def testMCCImportParcels(self, test=True): - if self.test_operations is False: - test = False - self.testMCCImportOperation(test=False) + def test_model_limitation(self): + importer, form = self.init_ope_import() + importer.created_models.clear() + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_ope_targetkey(imp=impt) + + # no model defined in created_models: normal import + init_ope_number = models.Operation.objects.count() + impt.importation() + current_ope_nb = models.Operation.objects.count() + self.assertEqual(current_ope_nb, init_ope_number + 1) + + last_ope = models.Operation.objects.order_by('-pk').all()[0] + last_ope.delete() + + importer, form = self.init_ope_import() + # add an inadequate model to make created_models non empty + importer.created_models.clear() + importer.created_models.add(ImporterModel.objects.get( + klass='ishtar_common.models.Organization' + )) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_ope_targetkey(imp=impt) + + # no imports + impt.importation() + current_ope_nb = models.Operation.objects.count() + self.assertEqual(current_ope_nb, init_ope_number) + + importer, form = self.init_ope_import() + # add operation model to allow creation + importer.created_models.clear() + importer.created_models.add(ImporterModel.objects.get( + klass='archaeological_operations.models.Operation' + )) + impt = form.save(self.ishtar_user) + impt.initialize() + self.init_ope_targetkey(imp=impt) + + # import of operations + impt.importation() + current_ope_nb = models.Operation.objects.count() + self.assertEqual(current_ope_nb, init_ope_number + 1) + + def test_mcc_import_parcels(self): old_nb = models.Parcel.objects.count() - MCC_PARCEL = ImporterType.objects.get(name=u"MCC - Parcelles") - mcc_file = open( - settings.ROOT_PATH + - '../archaeological_operations/tests/MCC-parcelles-example.csv', - 'rb') - file_dict = {'imported_file': SimpleUploadedFile(mcc_file.name, - mcc_file.read())} - post_dict = {'importer_type': MCC_PARCEL.pk, 'skip_lines': 1, - "encoding": 'utf-8'} - form = forms_common.NewImportForm(data=post_dict, files=file_dict, - instance=None) - form.is_valid() - if test: - self.assertTrue(form.is_valid()) + mcc_parcel, form = self.init_parcel_import() impt = form.save(self.ishtar_user) impt.initialize() impt.importation() - if not test: - return # new parcels has now been imported current_nb = models.Parcel.objects.count() - self.assertTrue(current_nb == (old_nb + 2)) + self.assertEqual(current_nb, old_nb + 2) + # and well imported last_parcels = models.Parcel.objects.order_by('-pk').all()[0:2] external_ids = sorted(['4200-59350-YY55', '4200-75101-XXXX']) @@ -195,8 +286,6 @@ class ImportOperationTest(TestCase): self.assertEqual(parcel_count - 2, models.Parcel.objects.count()) def testParseParcels(self): - if not self.test_operations: - return # the database needs to be initialised before importing from archaeological_operations.import_from_csv import parse_parcels # default_town = Town.objects.create(numero_insee="12345", diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py index 7b671caae..e2ecbf839 100644 --- a/ishtar_common/admin.py +++ b/ishtar_common/admin.py @@ -201,6 +201,7 @@ admin.site.register(models.GlobalVar, GlobalVarAdmin) class GeneralTypeAdmin(admin.ModelAdmin): list_display = ['label', 'txt_idx', 'available', 'comment'] + search_fields = ('label', 'txt_idx', 'comment',) actions = ['import_generic', export_as_csv_action()] import_generic = gen_import_generic @@ -249,6 +250,13 @@ class ImporterColumnAdmin(admin.ModelAdmin): admin.site.register(models.ImporterColumn, ImporterColumnAdmin) +class ImporterModelAdmin(admin.ModelAdmin): + list_display = ('name', 'klass') + model = models.ImporterModel + +admin.site.register(models.ImporterModel, ImporterModelAdmin) + + class FormaterTypeAdmin(admin.ModelAdmin): list_display = ('formater_type', 'options') admin.site.register(models.FormaterType, FormaterTypeAdmin) diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 49705f0df..a03f4de34 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -29,6 +29,7 @@ import zipfile from django.conf import settings from django.contrib.auth.models import User +from django.core.exceptions import ImproperlyConfigured from django.core.files import File from django.db import IntegrityError, DatabaseError, transaction from django.template.defaultfilters import slugify @@ -613,6 +614,8 @@ class Importer(object): OBJECT_CLS = None IMPORTED_LINE_FIELD = None UNICITY_KEYS = [] + # if set only models inside this list can be created + MODEL_CREATION_LIMIT = [] EXTRA_DEFAULTS = {} DEFAULTS = {} ERRORS = { @@ -626,10 +629,19 @@ class Importer(object): 'no_data': _(u"No data provided"), 'value_required': _(u"Value is required"), 'not_enough_cols': _(u"At least %d columns must be filled"), - 'regex_not_match': _(u"The regexp doesn't match.") + 'regex_not_match': _(u"The regexp doesn't match."), + 'improperly_configured': _( + u"Forced creation is set for model {} but this model is not in the " + u"list of models allowed to be created."), + 'does_not_exist_in_db': _(u"{} with values {} doesn't exist in the " + u"database. Create it first or fix your source file."), } def _create_models(self, force=False): + """ + Create a db config from a hardcoded import. + Not useful anymore? + """ from ishtar_common import models q = models.ImporterType.objects.filter(slug=self.SLUG) if not force and (not self.SLUG or q.count()): @@ -640,6 +652,9 @@ class Importer(object): model_name = self.OBJECT_CLS.__module__ + '.' + \ self.OBJECT_CLS.__name__ + model_cls, c = models.ImporterModel.object.get_or_create( + klass=model_name, default={'name': self.OBJECT_CLS.__name__} + ) unicity_keys = '' if self.UNICITY_KEYS: @@ -647,7 +662,7 @@ class Importer(object): importer = models.ImporterType.objects.create( slug=self.SLUG, name=name, description=self.DESC, - associated_models=model_name, unicity_keys=unicity_keys) + associated_models=model_cls, unicity_keys=unicity_keys) for default in self.DEFAULTS: values = self.DEFAULTS[default] @@ -712,6 +727,28 @@ class Importer(object): comment=line.comment) return True + def _get_improperly_conf_error(self, model): + from ishtar_common.models import ImporterModel + cls_name = model.__module__ + "." + model.__name__ + q = ImporterModel.objects.filter(klass=cls_name) + if q.count(): + cls_name = q.all()[0].name + return ImproperlyConfigured( + unicode(self.ERRORS['improperly_configured']).format(cls_name)) + + def _get_does_not_exist_in_db_error(self, model, data): + from ishtar_common.models import ImporterModel + cls_name = model.__module__ + "." + model.__name__ + q = ImporterModel.objects.filter(klass=cls_name) + if q.count(): + cls_name = q.all()[0].name + values = u", ".join( + [u"{}: {}".format(k, data[k]) for k in data] + ) + raise ImporterError( + unicode(self.ERRORS['does_not_exist_in_db'] + ).format(cls_name, values)) + def __init__(self, skip_lines=0, reference_header=None, check_col_num=False, test=False, history_modifier=None, output='silent', import_instance=None, @@ -1006,11 +1043,26 @@ class Importer(object): if k not in formater.through_unicity_keys \ and k != 'defaults': data['defaults'][k] = data.pop(k) + created = False if '__force_new' in data: + if self.MODEL_CREATION_LIMIT and \ + through_cls not in self.MODEL_CREATION_LIMIT: + raise self._get_improperly_conf_error(through_cls) created = data.pop('__force_new') t_obj = through_cls.objects.create(**data) else: - t_obj, created = through_cls.objects.get_or_create(**data) + if not self.MODEL_CREATION_LIMIT or \ + through_cls in self.MODEL_CREATION_LIMIT: + t_obj, created = through_cls.objects.get_or_create(**data) + else: + get_data = data.copy() + if 'defaults' in get_data: + get_data.pop('defaults') + try: + t_obj = through_cls.objects.get(**get_data) + except through_cls.DoesNotExist: + raise self._get_does_not_exist_in_db_error( + through_cls, get_data) if not created and 'defaults' in data: for k in data['defaults']: setattr(t_obj, k, data['defaults'][k]) @@ -1244,6 +1296,9 @@ class Importer(object): new_created[attribute].append(key) has_values = bool([1 for k in v if v[k]]) if has_values: + if self.MODEL_CREATION_LIMIT and \ + model not in self.MODEL_CREATION_LIMIT: + raise self._get_improperly_conf_error(model) v = model.objects.create(**v) else: continue @@ -1252,14 +1307,25 @@ class Importer(object): extra_fields = {} # "File" type is a temp object and can be different # for the same filename - it must be treated - # separatly + # separately for field in model._meta.fields: k = field.name - # attr_class est un attribut de FileField + # attr_class is a FileField attribute if hasattr(field, 'attr_class') and k in v: extra_fields[k] = v.pop(k) - v, created = model.objects.get_or_create( - **v) + if not self.MODEL_CREATION_LIMIT or \ + model in self.MODEL_CREATION_LIMIT: + v, created = model.objects.get_or_create( + **v) + else: + get_v = v.copy() + if 'defaults' in get_v: + get_v.pop('defaults') + try: + v = model.objects.get(**get_v) + except model.DoesNotExist: + raise self._get_does_not_exist_in_db_error( + model, get_v) changed = False for k in extra_fields.keys(): if extra_fields[k]: @@ -1333,6 +1399,7 @@ class Importer(object): 'history_modifier': create_dict.pop('history_modifier') }) + created = False try: try: dct = create_dict.copy() @@ -1345,6 +1412,9 @@ class Importer(object): return None, created new_dct = defaults.copy() new_dct.update(dct) + if self.MODEL_CREATION_LIMIT and \ + cls not in self.MODEL_CREATION_LIMIT: + raise self._get_improperly_conf_error(cls) obj = cls.objects.create(**new_dct) else: # manage UNICITY_KEYS - only level 1 @@ -1353,9 +1423,17 @@ class Importer(object): if k not in self.UNICITY_KEYS \ and k != 'defaults': defaults[k] = dct.pop(k) - - dct['defaults'] = defaults.copy() - obj, created = cls.objects.get_or_create(**dct) + if not self.MODEL_CREATION_LIMIT or \ + cls in self.MODEL_CREATION_LIMIT: + dct['defaults'] = defaults.copy() + obj, created = cls.objects.get_or_create(**dct) + else: + try: + obj = cls.objects.get(**dct) + dct['defaults'] = defaults.copy() + except cls.DoesNotExist: + raise self._get_does_not_exist_in_db_error( + cls, dct) if not created and not path and self.UNICITY_KEYS: changed = False diff --git a/ishtar_common/fixtures/initial_importtypes-fr.json b/ishtar_common/fixtures/initial_importtypes-fr.json index f87a529a7..1b155ddf6 100644 --- a/ishtar_common/fixtures/initial_importtypes-fr.json +++ b/ishtar_common/fixtures/initial_importtypes-fr.json @@ -1,14 +1,95 @@ [ { "pk": 2, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Archaeological files", + "klass": "archaeological_files.models.File" + } + }, + { + "pk": 4, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Archaeological site", + "klass": "archaeological_operations.models.ArchaeologicalSite" + } + }, + { + "pk": 3, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Base finds", + "klass": "archaeological_finds.models.BaseFind" + } + }, + { + "pk": 10, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Context record relations", + "klass": "archaeological_context_records.models.RecordRelations" + } + }, + { + "pk": 7, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Context records", + "klass": "archaeological_context_records.models.ContextRecord" + } + }, + { + "pk": 6, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Operation", + "klass": "archaeological_operations.models.Operation" + } + }, + { + "pk": 8, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Operation source", + "klass": "archaeological_operations.models.OperationSource" + } + }, + { + "pk": 1, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Organization", + "klass": "ishtar_common.models.Organization" + } + }, + { + "pk": 9, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Parcels", + "klass": "archaeological_operations.models.Parcel" + } + }, + { + "pk": 5, + "model": "ishtar_common.importermodel", + "fields": { + "name": "Person", + "klass": "ishtar_common.models.Person" + } + }, + { + "pk": 2, "model": "ishtar_common.importertype", "fields": { "description": "", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "mcc-parcelles", - "associated_models": "archaeological_operations.models.Parcel", + "associated_models": 9, "name": "MCC - Parcelles" } }, @@ -17,11 +98,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "mcc-operations", - "associated_models": "archaeological_operations.models.Operation", + "associated_models": 6, "name": "MCC - Op\u00e9rations" } }, @@ -30,11 +112,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "", + "created_models": [], "is_template": true, "unicity_keys": "", "users": [], "slug": "mcc-documentation", - "associated_models": "archaeological_operations.models.OperationSource", + "associated_models": 8, "name": "MCC - Documentation" } }, @@ -43,11 +126,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "mcc-ue", - "associated_models": "archaeological_context_records.models.ContextRecord", + "associated_models": 7, "name": "MCC - UE" } }, @@ -56,11 +140,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "mcc-mobilier", - "associated_models": "archaeological_finds.models.BaseFind", + "associated_models": 3, "name": "MCC - Mobilier" } }, @@ -69,11 +154,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "Unit\u00e9s d'enregisttrement", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "ishtar_context_record", - "associated_models": "archaeological_context_records.models.ContextRecord", + "associated_models": 7, "name": "ISHTAR-UE" } }, @@ -82,11 +168,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "Parcelles de terrain", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "ishtar_parcels", - "associated_models": "archaeological_operations.models.Parcel", + "associated_models": 9, "name": "ISHTAR-PARCELLES" } }, @@ -95,11 +182,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "Import complet standard operations", + "created_models": [], "is_template": true, "unicity_keys": "code_patriarche", "users": [], "slug": "ishtar_operations", - "associated_models": "archaeological_operations.models.Operation", + "associated_models": 6, "name": "ISHTAR-OP\u00c9RATIONS" } }, @@ -108,11 +196,12 @@ "model": "ishtar_common.importertype", "fields": { "description": "Mobilier", + "created_models": [], "is_template": true, "unicity_keys": "external_id", "users": [], "slug": "ishtar_finds", - "associated_models": "archaeological_finds.models.BaseFind", + "associated_models": 3, "name": "ISHTAR-MOBILIER" } }, diff --git a/ishtar_common/locale/django.pot b/ishtar_common/locale/django.pot index 458368a35..fbc4b4eac 100644 --- a/ishtar_common/locale/django.pot +++ b/ishtar_common/locale/django.pot @@ -6,7 +6,6 @@ # Valérie-Emma Leroux <emma@iggdrasil.net>, 2016. #zanata # Étienne Loks <etienne.loks@iggdrasil.net>, 2016. #zanata # Valérie-Emma Leroux <emma@iggdrasil.net>, 2017. #zanata -# Étienne Loks <etienne.loks@iggdrasil.net>, 2017. #zanata msgid "" msgstr "" @@ -22,109 +21,125 @@ msgstr "" msgid "Related item" msgstr "" -#: data_importer.py:182 +#: admin.py:79 +msgid "Export selected as CSV file" +msgstr "" + +#: data_importer.py:183 #, python-format msgid "\"%(value)s\" is too long. The max length is %(length)d characters." msgstr "" -#: data_importer.py:199 +#: data_importer.py:200 #, python-format msgid "\"%(value)s\" not equal to yes or no" msgstr "" -#: data_importer.py:211 +#: data_importer.py:212 #, python-format msgid "\"%(value)s\" is not a float" msgstr "" -#: data_importer.py:224 data_importer.py:238 data_importer.py:482 +#: data_importer.py:225 data_importer.py:239 data_importer.py:483 #, python-format msgid "\"%(value)s\" is not a valid date" msgstr "" -#: data_importer.py:251 +#: data_importer.py:252 #, python-format msgid "\"%(value)s\" is not an integer" msgstr "" -#: data_importer.py:302 data_importer.py:545 +#: data_importer.py:303 data_importer.py:546 #, python-format msgid "Choice for \"%s\" is not available. Which one is relevant?\n" msgstr "" -#: data_importer.py:309 +#: data_importer.py:310 #, python-format msgid "%d. None of the above - create new" msgstr "" -#: data_importer.py:312 +#: data_importer.py:313 #, python-format msgid "%d. None of the above - skip" msgstr "" -#: data_importer.py:508 +#: data_importer.py:509 #, python-format msgid "\"%(value)s\" is not a valid path for the given archive" msgstr "" -#: data_importer.py:620 +#: data_importer.py:623 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 " "reference file." msgstr "" -#: data_importer.py:624 +#: data_importer.py:627 #, python-format msgid "Too many cols (%(user_col)d) when maximum is %(ref_col)d" msgstr "" -#: data_importer.py:626 +#: data_importer.py:629 msgid "No data provided" msgstr "" -#: data_importer.py:627 +#: data_importer.py:630 msgid "Value is required" msgstr "" -#: data_importer.py:628 +#: data_importer.py:631 #, python-format msgid "At least %d columns must be filled" msgstr "" -#: data_importer.py:629 +#: data_importer.py:632 msgid "The regexp doesn't match." msgstr "" -#: data_importer.py:1037 +#: data_importer.py:634 +msgid "" +"Forced creation is set for model {} but this model is not in the list of " +"models allowed to be created." +msgstr "" + +#: data_importer.py:636 +msgid "" +"{} with values {} doesn't exist in the database. Create it first or fix your " +"source file." +msgstr "" + +#: data_importer.py:1089 msgid "Not imported" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "line" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "col" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "error" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "field" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "source" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "result" msgstr "" -#: data_importer.py:1466 +#: data_importer.py:1544 #, python-format msgid "\"%(value)s\" not in %(values)s" msgstr "" @@ -157,12 +172,12 @@ msgstr "" msgid "Add a new item" msgstr "" -#: forms.py:262 models.py:1473 +#: forms.py:262 models.py:1475 msgid "Template" msgstr "" #: forms_common.py:41 forms_common.py:59 forms_common.py:182 -#: forms_common.py:406 models.py:1539 models.py:2940 +#: forms_common.py:406 models.py:1541 models.py:2950 #: templates/blocks/JQueryAdvancedTown.html:19 #: templates/ishtar/sheet_organization.html:13 msgid "Town" @@ -178,9 +193,8 @@ msgid "" "french town Saint-Denis in the Seine-Saint-Denis department.</p>" msgstr "" -#: forms_common.py:68 forms_common.py:855 ishtar_menu.py:47 models.py:1712 -#: models.py:2567 models.py:2749 models.py:2810 -#: templates/ishtar/sheet_person.html:4 +#: forms_common.py:68 forms_common.py:855 ishtar_menu.py:47 models.py:2574 +#: models.py:2756 models.py:2818 templates/ishtar/sheet_person.html:4 msgid "Person" msgstr "" @@ -191,63 +205,63 @@ msgid "" msgstr "" #: forms_common.py:170 forms_common.py:327 forms_common.py:451 -#: ishtar_menu.py:75 models.py:1713 models.py:2450 models.py:2541 +#: ishtar_menu.py:75 models.py:2457 models.py:2548 #: templates/ishtar/sheet_organization.html:4 msgid "Organization" msgstr "" #: forms_common.py:173 forms_common.py:210 forms_common.py:322 -#: forms_common.py:376 forms_common.py:446 models.py:1094 models.py:1472 -#: models.py:1758 models.py:1977 models.py:2444 models.py:2553 models.py:2926 -#: templates/ishtar/sheet_organization.html:8 +#: forms_common.py:376 forms_common.py:446 models.py:1096 models.py:1474 +#: models.py:1742 models.py:1758 models.py:1984 models.py:2451 models.py:2560 +#: models.py:2936 templates/ishtar/sheet_organization.html:8 #: templates/ishtar/sheet_organization.html:21 msgid "Name" msgstr "" -#: forms_common.py:174 models.py:1694 models.py:2108 +#: forms_common.py:174 models.py:1696 models.py:2115 msgid "Organization type" msgstr "" -#: forms_common.py:176 forms_common.py:400 models.py:1534 +#: forms_common.py:176 forms_common.py:400 models.py:1536 #: templates/ishtar/sheet_organization.html:10 msgid "Address" msgstr "" -#: forms_common.py:178 forms_common.py:403 models.py:1535 +#: forms_common.py:178 forms_common.py:403 models.py:1537 #: templates/ishtar/sheet_organization.html:11 msgid "Address complement" msgstr "" -#: forms_common.py:180 forms_common.py:404 models.py:1537 +#: forms_common.py:180 forms_common.py:404 models.py:1539 #: templates/ishtar/sheet_organization.html:12 msgid "Postal code" msgstr "" -#: forms_common.py:183 forms_common.py:407 models.py:1540 +#: forms_common.py:183 forms_common.py:407 models.py:1542 msgid "Country" msgstr "" #: forms_common.py:185 forms_common.py:324 forms_common.py:380 -#: forms_common.py:448 forms_common.py:572 models.py:1567 +#: forms_common.py:448 forms_common.py:572 models.py:1569 msgid "Email" msgstr "" -#: forms_common.py:186 forms_common.py:383 models.py:1552 +#: forms_common.py:186 forms_common.py:383 models.py:1554 #: templates/ishtar/sheet_organization.html:14 #: templates/ishtar/sheet_person.html:19 #: templates/ishtar/wizard/wizard_person.html:17 msgid "Phone" msgstr "" -#: forms_common.py:187 forms_common.py:392 models.py:1564 +#: forms_common.py:187 forms_common.py:392 models.py:1566 #: templates/ishtar/sheet_organization.html:15 #: templates/ishtar/sheet_person.html:37 #: templates/ishtar/wizard/wizard_person.html:35 msgid "Mobile phone" msgstr "" -#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2144 -#: models.py:2446 models.py:2861 templates/sheet_ope.html:85 +#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2151 +#: models.py:2453 models.py:2871 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:23 @@ -271,7 +285,7 @@ msgstr "" msgid "Organization to merge" msgstr "" -#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2551 +#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2558 #: templates/ishtar/sheet_organization.html:22 msgid "Surname" msgstr "" @@ -289,25 +303,25 @@ msgstr "" msgid "Identity" msgstr "" -#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2109 -#: models.py:2545 models.py:2547 models.py:2858 templates/sheet_ope.html:104 +#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2116 +#: models.py:2552 models.py:2554 models.py:2868 templates/sheet_ope.html:104 #: templates/ishtar/blocks/window_tables/documents.html:7 msgid "Title" msgstr "" -#: forms_common.py:372 models.py:2549 +#: forms_common.py:372 models.py:2556 msgid "Salutation" msgstr "" -#: forms_common.py:378 models.py:2555 +#: forms_common.py:378 models.py:2562 msgid "Raw name" msgstr "" -#: forms_common.py:381 models.py:1553 +#: forms_common.py:381 models.py:1555 msgid "Phone description" msgstr "" -#: forms_common.py:384 models.py:1555 models.py:1557 +#: forms_common.py:384 models.py:1557 models.py:1559 msgid "Phone description 2" msgstr "" @@ -315,11 +329,11 @@ msgstr "" msgid "Phone 2" msgstr "" -#: forms_common.py:388 models.py:1561 +#: forms_common.py:388 models.py:1563 msgid "Phone description 3" msgstr "" -#: forms_common.py:390 models.py:1559 +#: forms_common.py:390 models.py:1561 msgid "Phone 3" msgstr "" @@ -327,23 +341,23 @@ msgstr "" msgid "Current organization" msgstr "" -#: forms_common.py:409 models.py:1542 +#: forms_common.py:409 models.py:1544 msgid "Other address: address" msgstr "" -#: forms_common.py:412 models.py:1545 +#: forms_common.py:412 models.py:1547 msgid "Other address: address complement" msgstr "" -#: forms_common.py:414 models.py:1546 +#: forms_common.py:414 models.py:1548 msgid "Other address: postal code" msgstr "" -#: forms_common.py:416 models.py:1548 +#: forms_common.py:416 models.py:1550 msgid "Other address: town" msgstr "" -#: forms_common.py:418 models.py:1550 +#: forms_common.py:418 models.py:1552 msgid "Other address: country" msgstr "" @@ -359,7 +373,7 @@ msgstr "" msgid "Account search" msgstr "" -#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2498 +#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2505 msgid "Person type" msgstr "" @@ -391,7 +405,7 @@ msgstr "" msgid "Send the new password by email?" msgstr "" -#: forms_common.py:628 forms_common.py:641 models.py:2941 +#: forms_common.py:628 forms_common.py:641 models.py:2951 msgid "Towns" msgstr "" @@ -407,7 +421,7 @@ msgstr "" msgid "Documentation informations" msgstr "" -#: forms_common.py:775 forms_common.py:823 models.py:2110 models.py:2835 +#: forms_common.py:775 forms_common.py:823 models.py:2117 models.py:2843 msgid "Source type" msgstr "" @@ -419,37 +433,37 @@ msgstr "" msgid "Internal reference" msgstr "" -#: forms_common.py:783 models.py:2872 +#: forms_common.py:783 models.py:2882 msgid "Numerical ressource (web address)" msgstr "" -#: forms_common.py:784 models.py:2874 +#: forms_common.py:784 models.py:2884 msgid "Receipt date" msgstr "" -#: forms_common.py:786 models.py:2273 models.py:2876 +#: forms_common.py:786 models.py:2280 models.py:2886 msgid "Creation date" msgstr "" -#: forms_common.py:789 models.py:2879 +#: forms_common.py:789 models.py:2889 msgid "Receipt date in documentation" msgstr "" -#: forms_common.py:791 forms_common.py:827 models.py:376 models.py:687 -#: models.py:2004 models.py:2559 models.py:2886 +#: forms_common.py:791 forms_common.py:827 models.py:377 models.py:689 +#: models.py:2011 models.py:2566 models.py:2896 msgid "Comment" msgstr "" -#: forms_common.py:793 forms_common.py:826 models.py:1096 models.py:1762 -#: models.py:1936 models.py:1978 models.py:2885 templates/sheet_ope.html:128 +#: forms_common.py:793 forms_common.py:826 models.py:1098 models.py:1762 +#: models.py:1943 models.py:1985 models.py:2895 templates/sheet_ope.html:128 msgid "Description" msgstr "" -#: forms_common.py:796 models.py:2887 +#: forms_common.py:796 models.py:2897 msgid "Additional information" msgstr "" -#: forms_common.py:798 forms_common.py:830 models.py:2889 +#: forms_common.py:798 forms_common.py:830 models.py:2899 msgid "Has a duplicate" msgstr "" @@ -464,7 +478,7 @@ msgid "" "p>" msgstr "" -#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2815 +#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2823 #: templates/ishtar/wizard/wizard_person_deletion.html:124 msgid "Author" msgstr "" @@ -477,7 +491,7 @@ msgstr "" msgid "Would you like to delete this documentation?" msgstr "" -#: forms_common.py:856 models.py:2111 models.py:2803 models.py:2812 +#: forms_common.py:856 models.py:2118 models.py:2810 models.py:2820 msgid "Author type" msgstr "" @@ -489,7 +503,7 @@ msgstr "" msgid "There are identical authors." msgstr "" -#: forms_common.py:893 models.py:2816 models.py:2868 +#: forms_common.py:893 models.py:2824 models.py:2878 #: templates/sheet_ope.html:106 #: templates/ishtar/blocks/window_tables/documents.html:9 msgid "Authors" @@ -507,7 +521,7 @@ msgstr "" msgid "Deletion" msgstr "" -#: ishtar_menu.py:39 models.py:1268 views.py:1548 +#: ishtar_menu.py:39 models.py:1270 views.py:1549 msgid "Global variables" msgstr "" @@ -535,278 +549,278 @@ msgstr "" msgid "Manual merge" msgstr "" -#: ishtar_menu.py:109 models.py:2284 +#: ishtar_menu.py:109 models.py:2291 msgid "Imports" msgstr "" -#: ishtar_menu.py:112 views.py:1556 +#: ishtar_menu.py:112 views.py:1557 msgid "New import" msgstr "" -#: ishtar_menu.py:116 views.py:1570 +#: ishtar_menu.py:116 views.py:1571 msgid "Current imports" msgstr "" -#: ishtar_menu.py:120 views.py:1606 +#: ishtar_menu.py:120 views.py:1607 msgid "Old imports" msgstr "" -#: models.py:183 +#: models.py:184 msgid "Not a valid item." msgstr "" -#: models.py:196 +#: models.py:197 msgid "A selected item is not a valid item." msgstr "" -#: models.py:207 +#: models.py:208 msgid "This item already exists." msgstr "" -#: models.py:372 models.py:686 models.py:1507 models.py:1519 models.py:1933 +#: models.py:373 models.py:688 models.py:1509 models.py:1521 models.py:1940 msgid "Label" msgstr "" -#: models.py:374 +#: models.py:375 msgid "Textual ID" msgstr "" -#: models.py:377 models.py:689 models.py:1476 +#: models.py:378 models.py:691 models.py:1478 msgid "Available" msgstr "" -#: models.py:713 models.py:2050 +#: models.py:715 models.py:2057 msgid "Key" msgstr "" -#: models.py:719 +#: models.py:721 msgid "Specific key to an import" msgstr "" -#: models.py:811 +#: models.py:813 msgid "Last editor" msgstr "" -#: models.py:814 +#: models.py:816 msgid "Creator" msgstr "" -#: models.py:956 models.py:2952 models.py:3008 +#: models.py:958 models.py:2962 models.py:3018 msgid "Order" msgstr "" -#: models.py:957 +#: models.py:959 msgid "Symmetrical" msgstr "" -#: models.py:958 +#: models.py:960 msgid "Tiny label" msgstr "" -#: models.py:972 +#: models.py:974 msgid "Cannot have symmetrical and an inverse_relation" msgstr "" -#: models.py:1088 +#: models.py:1090 msgid "Euro" msgstr "" -#: models.py:1089 +#: models.py:1091 msgid "US dollar" msgstr "" -#: models.py:1095 models.py:1760 +#: models.py:1097 models.py:1760 msgid "Slug" msgstr "" -#: models.py:1098 +#: models.py:1100 msgid "CSS color code for base module" msgstr "" -#: models.py:1100 +#: models.py:1102 msgid "Files module" msgstr "" -#: models.py:1102 +#: models.py:1104 msgid "CSS color code for files module" msgstr "" -#: models.py:1104 +#: models.py:1106 msgid "Context records module" msgstr "" -#: models.py:1107 +#: models.py:1109 msgid "CSS color code for context record module" msgstr "" -#: models.py:1109 +#: models.py:1111 msgid "Finds module" msgstr "" -#: models.py:1110 +#: models.py:1112 msgid "Need context records module" msgstr "" -#: models.py:1112 +#: models.py:1114 msgid "CSS color code for find module" msgstr "" -#: models.py:1115 +#: models.py:1117 msgid "Warehouses module" msgstr "" -#: models.py:1116 +#: models.py:1118 msgid "Need finds module" msgstr "" -#: models.py:1118 +#: models.py:1120 msgid "CSS code for warehouse module" msgstr "" -#: models.py:1120 +#: models.py:1122 msgid "Mapping module" msgstr "" -#: models.py:1122 +#: models.py:1124 msgid "CSS code for mapping module" msgstr "" -#: models.py:1125 +#: models.py:1127 msgid "Home page" msgstr "" -#: models.py:1126 +#: models.py:1128 #, python-brace-format msgid "" "Homepage of Ishtar - if not defined a default homepage will appear. Use the " "markdown syntax. {random_image} can be used to display a random image." msgstr "" -#: models.py:1130 +#: models.py:1132 msgid "File external id" msgstr "" -#: models.py:1132 +#: models.py:1134 msgid "" "Formula to manage file external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1137 +#: models.py:1139 msgid "Parcel external id" msgstr "" -#: models.py:1140 +#: models.py:1142 msgid "" "Formula to manage parcel external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1145 +#: models.py:1147 msgid "Context record external id" msgstr "" -#: models.py:1147 +#: models.py:1149 msgid "" "Formula to manage context record external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1152 +#: models.py:1154 msgid "Base find external id" msgstr "" -#: models.py:1154 +#: models.py:1156 msgid "" "Formula to manage base find external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1159 +#: models.py:1161 msgid "Find external id" msgstr "" -#: models.py:1161 +#: models.py:1163 msgid "" "Formula to manage find external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1166 +#: models.py:1168 msgid "Container external id" msgstr "" -#: models.py:1168 +#: models.py:1170 msgid "" "Formula to manage container external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1173 +#: models.py:1175 msgid "Warehouse external id" msgstr "" -#: models.py:1175 +#: models.py:1177 msgid "" "Formula to manage warehouse external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1180 +#: models.py:1182 msgid "Raw name for person" msgstr "" -#: models.py:1182 +#: models.py:1184 msgid "" "Formula to manage person raw_name. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1186 +#: models.py:1188 msgid "Current active" msgstr "" -#: models.py:1187 +#: models.py:1189 msgid "Currency" msgstr "" -#: models.py:1191 +#: models.py:1193 msgid "Ishtar site profile" msgstr "" -#: models.py:1192 +#: models.py:1194 msgid "Ishtar site profiles" msgstr "" -#: models.py:1261 +#: models.py:1263 msgid "Variable name" msgstr "" -#: models.py:1262 +#: models.py:1264 msgid "Description of the variable" msgstr "" -#: models.py:1264 models.py:2051 +#: models.py:1266 models.py:2058 msgid "Value" msgstr "" -#: models.py:1267 +#: models.py:1269 msgid "Global variable" msgstr "" -#: models.py:1377 models.py:1407 +#: models.py:1379 models.py:1409 msgid "Total" msgstr "" -#: models.py:1384 models.py:1508 models.py:1520 +#: models.py:1386 models.py:1510 models.py:1522 #: templates/ishtar/sheet_person.html:22 #: templates/ishtar/dashboards/dashboard_main_detail.html:141 #: templates/ishtar/dashboards/dashboard_main_detail_users.html:26 @@ -814,641 +828,633 @@ msgstr "" msgid "Number" msgstr "" -#: models.py:1471 +#: models.py:1473 msgid "Administrative Act" msgstr "" -#: models.py:1475 +#: models.py:1477 msgid "Associated object" msgstr "" -#: models.py:1479 +#: models.py:1481 msgid "Document template" msgstr "" -#: models.py:1480 +#: models.py:1482 msgid "Document templates" msgstr "" -#: models.py:1511 models.py:1521 models.py:2268 +#: models.py:1513 models.py:1523 models.py:2275 msgid "State" msgstr "" -#: models.py:1525 templates/blocks/JQueryAdvancedTown.html:12 +#: models.py:1527 templates/blocks/JQueryAdvancedTown.html:12 msgid "Department" msgstr "" -#: models.py:1526 +#: models.py:1528 msgid "Departments" msgstr "" -#: models.py:1563 +#: models.py:1565 msgid "Raw phone" msgstr "" -#: models.py:1569 +#: models.py:1571 msgid "Alternative address is prefered" msgstr "" -#: models.py:1608 +#: models.py:1610 msgid "Tel: " msgstr "" -#: models.py:1612 +#: models.py:1614 msgid "Mobile: " msgstr "" -#: models.py:1616 +#: models.py:1618 msgid "Email: " msgstr "" -#: models.py:1621 +#: models.py:1623 msgid "Merge key" msgstr "" -#: models.py:1695 +#: models.py:1697 msgid "Organization types" msgstr "" -#: models.py:1714 views.py:241 -msgid "Operation" -msgstr "" - -#: models.py:1716 -msgid "Archaeological site" +#: models.py:1743 +msgid "Class name" msgstr "" -#: models.py:1717 -msgid "Parcels" +#: models.py:1746 +msgid "Importer - Model" msgstr "" -#: models.py:1719 -msgid "Operation source" +#: models.py:1747 +msgid "Importer - Models" msgstr "" -#: models.py:1722 views.py:1364 views.py:1414 -msgid "Archaeological files" -msgstr "" - -#: models.py:1724 views.py:1367 views.py:1422 -msgid "Context records" -msgstr "" - -#: models.py:1726 -msgid "Context record relations" +#: models.py:1764 templates/ishtar/dashboards/dashboard_main.html:25 +msgid "Users" msgstr "" -#: models.py:1728 -msgid "Base finds" +#: models.py:1767 +msgid "Associated model" msgstr "" -#: models.py:1764 templates/ishtar/dashboards/dashboard_main.html:25 -msgid "Users" +#: models.py:1770 +msgid "Models that can accept new items" msgstr "" -#: models.py:1766 -msgid "Associated model" +#: models.py:1771 +msgid "Leave blank for no restrictions" msgstr "" -#: models.py:1769 +#: models.py:1773 msgid "Is template" msgstr "" -#: models.py:1770 +#: models.py:1774 msgid "Unicity keys (separator \";\")" msgstr "" -#: models.py:1774 +#: models.py:1778 msgid "Importer - Type" msgstr "" -#: models.py:1775 +#: models.py:1779 msgid "Importer - Types" msgstr "" -#: models.py:1865 +#: models.py:1872 msgid "Importer - Default" msgstr "" -#: models.py:1866 +#: models.py:1873 msgid "Importer - Defaults" msgstr "" -#: models.py:1901 +#: models.py:1908 msgid "Importer - Default value" msgstr "" -#: models.py:1902 +#: models.py:1909 msgid "Importer - Default values" msgstr "" -#: models.py:1935 +#: models.py:1942 msgid "Column number" msgstr "" -#: models.py:1938 +#: models.py:1945 msgid "Required" msgstr "" -#: models.py:1941 +#: models.py:1948 msgid "Importer - Column" msgstr "" -#: models.py:1942 +#: models.py:1949 msgid "Importer - Columns" msgstr "" -#: models.py:1962 +#: models.py:1969 msgid "Field name" msgstr "" -#: models.py:1964 models.py:1998 +#: models.py:1971 models.py:2005 msgid "Force creation of new items" msgstr "" -#: models.py:1966 models.py:2000 +#: models.py:1973 models.py:2007 msgid "Concatenate with existing" msgstr "" -#: models.py:1968 models.py:2002 +#: models.py:1975 models.py:2009 msgid "Concatenate character" msgstr "" -#: models.py:1972 +#: models.py:1979 msgid "Importer - Duplicate field" msgstr "" -#: models.py:1973 +#: models.py:1980 msgid "Importer - Duplicate fields" msgstr "" -#: models.py:1980 +#: models.py:1987 msgid "Regular expression" msgstr "" -#: models.py:1983 +#: models.py:1990 msgid "Importer - Regular expression" msgstr "" -#: models.py:1984 +#: models.py:1991 msgid "Importer - Regular expressions" msgstr "" -#: models.py:2007 +#: models.py:2014 msgid "Importer - Target" msgstr "" -#: models.py:2008 +#: models.py:2015 msgid "Importer - Targets" msgstr "" -#: models.py:2032 views.py:545 +#: models.py:2039 views.py:545 msgid "True" msgstr "" -#: models.py:2033 views.py:547 +#: models.py:2040 views.py:547 msgid "False" msgstr "" -#: models.py:2052 +#: models.py:2059 msgid "Is set" msgstr "" -#: models.py:2059 +#: models.py:2066 msgid "Importer - Target key" msgstr "" -#: models.py:2060 +#: models.py:2067 msgid "Importer - Targets keys" msgstr "" -#: models.py:2112 models.py:2851 models.py:2864 +#: models.py:2119 models.py:2874 msgid "Format" msgstr "" -#: models.py:2113 models.py:2956 +#: models.py:2120 models.py:2966 msgid "Operation type" msgstr "" -#: models.py:2114 +#: models.py:2121 msgid "Period" msgstr "" -#: models.py:2115 +#: models.py:2122 msgid "Report state" msgstr "" -#: models.py:2116 +#: models.py:2123 msgid "Remain type" msgstr "" -#: models.py:2117 +#: models.py:2124 msgid "Unit" msgstr "" -#: models.py:2118 +#: models.py:2125 msgid "Activity type" msgstr "" -#: models.py:2119 +#: models.py:2126 msgid "Material" msgstr "" -#: models.py:2121 +#: models.py:2128 msgid "Conservatory state" msgstr "" -#: models.py:2122 +#: models.py:2129 msgid "Container type" msgstr "" -#: models.py:2123 +#: models.py:2130 msgid "Preservation type" msgstr "" -#: models.py:2124 +#: models.py:2131 msgid "Object type" msgstr "" -#: models.py:2125 +#: models.py:2132 msgid "Integrity type" msgstr "" -#: models.py:2126 +#: models.py:2133 msgid "Remarkability type" msgstr "" -#: models.py:2127 +#: models.py:2134 msgid "Batch type" msgstr "" -#: models.py:2129 +#: models.py:2136 msgid "Identification type" msgstr "" -#: models.py:2131 +#: models.py:2138 msgid "Context record relation type" msgstr "" -#: models.py:2132 models.py:3014 +#: models.py:2139 models.py:3024 msgid "Spatial reference system" msgstr "" -#: models.py:2133 models.py:2843 +#: models.py:2140 models.py:2852 msgid "Support type" msgstr "" -#: models.py:2134 models.py:2510 +#: models.py:2141 models.py:2517 msgid "Title type" msgstr "" -#: models.py:2140 +#: models.py:2147 msgid "Integer" msgstr "" -#: models.py:2141 +#: models.py:2148 msgid "Float" msgstr "" -#: models.py:2142 +#: models.py:2149 msgid "String" msgstr "" -#: models.py:2143 templates/sheet_ope.html:86 +#: models.py:2150 templates/sheet_ope.html:86 msgid "Date" msgstr "" -#: models.py:2145 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 +#: models.py:2152 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 #: templates/ishtar/dashboards/dashboard_main_detail.html:126 msgid "Year" msgstr "" -#: models.py:2146 +#: models.py:2153 msgid "String to boolean" msgstr "" -#: models.py:2147 +#: models.py:2154 msgctxt "filesystem" msgid "File" msgstr "" -#: models.py:2148 +#: models.py:2155 msgid "Unknow type" msgstr "" -#: models.py:2164 +#: models.py:2171 msgid "4 digit year. e.g.: \"2015\"" msgstr "" -#: models.py:2165 +#: models.py:2172 msgid "4 digit year/month/day. e.g.: \"2015/02/04\"" msgstr "" -#: models.py:2166 +#: models.py:2173 msgid "Day/month/4 digit year. e.g.: \"04/02/2015\"" msgstr "" -#: models.py:2176 +#: models.py:2183 msgid "Options" msgstr "" -#: models.py:2178 +#: models.py:2185 msgid "Split character(s)" msgstr "" -#: models.py:2182 +#: models.py:2189 msgid "Importer - Formater type" msgstr "" -#: models.py:2183 +#: models.py:2190 msgid "Importer - Formater types" msgstr "" -#: models.py:2232 templates/ishtar/dashboards/dashboard_main_detail.html:63 +#: models.py:2239 templates/ishtar/dashboards/dashboard_main_detail.html:63 msgid "Created" msgstr "" -#: models.py:2233 +#: models.py:2240 msgid "Analyse in progress" msgstr "" -#: models.py:2234 +#: models.py:2241 msgid "Analysed" msgstr "" -#: models.py:2235 +#: models.py:2242 msgid "Import pending" msgstr "" -#: models.py:2236 +#: models.py:2243 msgid "Import in progress" msgstr "" -#: models.py:2237 +#: models.py:2244 msgid "Finished with errors" msgstr "" -#: models.py:2238 +#: models.py:2245 msgid "Finished" msgstr "" -#: models.py:2239 +#: models.py:2246 msgid "Archived" msgstr "" -#: models.py:2252 +#: models.py:2259 msgid "Imported file" msgstr "" -#: models.py:2254 +#: models.py:2261 msgid "Associated images (zip file)" msgstr "" -#: models.py:2256 +#: models.py:2263 msgid "Encoding" msgstr "" -#: models.py:2258 +#: models.py:2265 msgid "Skip lines" msgstr "" -#: models.py:2259 templates/ishtar/import_list.html:47 +#: models.py:2266 templates/ishtar/import_list.html:47 msgid "Error file" msgstr "" -#: models.py:2262 +#: models.py:2269 msgid "Result file" msgstr "" -#: models.py:2265 templates/ishtar/import_list.html:53 +#: models.py:2272 templates/ishtar/import_list.html:53 msgid "Match file" msgstr "" -#: models.py:2271 +#: models.py:2278 msgid "Conservative import" msgstr "" -#: models.py:2276 +#: models.py:2283 msgid "End date" msgstr "" -#: models.py:2278 +#: models.py:2285 msgid "Remaining seconds" msgstr "" -#: models.py:2283 +#: models.py:2290 msgid "Import" msgstr "" -#: models.py:2300 +#: models.py:2307 msgid "Analyse" msgstr "" -#: models.py:2302 models.py:2305 +#: models.py:2309 models.py:2312 msgid "Re-analyse" msgstr "" -#: models.py:2303 +#: models.py:2310 msgid "Launch import" msgstr "" -#: models.py:2306 +#: models.py:2313 msgid "Re-import" msgstr "" -#: models.py:2307 +#: models.py:2314 msgid "Archive" msgstr "" -#: models.py:2309 +#: models.py:2316 msgid "Unarchive" msgstr "" -#: models.py:2310 widgets.py:130 templates/ishtar/form_delete.html:11 +#: models.py:2317 widgets.py:130 templates/ishtar/form_delete.html:11 msgid "Delete" msgstr "" -#: models.py:2451 +#: models.py:2458 msgid "Organizations" msgstr "" -#: models.py:2453 +#: models.py:2460 msgid "Can view all Organizations" msgstr "" -#: models.py:2454 +#: models.py:2461 msgid "Can view own Organization" msgstr "" -#: models.py:2455 +#: models.py:2462 msgid "Can add own Organization" msgstr "" -#: models.py:2457 +#: models.py:2464 msgid "Can change own Organization" msgstr "" -#: models.py:2459 +#: models.py:2466 msgid "Can delete own Organization" msgstr "" -#: models.py:2494 +#: models.py:2501 msgid "Groups" msgstr "" -#: models.py:2499 +#: models.py:2506 msgid "Person types" msgstr "" -#: models.py:2511 +#: models.py:2518 msgid "Title types" msgstr "" -#: models.py:2520 +#: models.py:2527 msgid "Mr" msgstr "" -#: models.py:2521 +#: models.py:2528 msgid "Miss" msgstr "" -#: models.py:2522 +#: models.py:2529 msgid "Mr and Mrs" msgstr "" -#: models.py:2523 +#: models.py:2530 msgid "Mrs" msgstr "" -#: models.py:2524 +#: models.py:2531 msgid "Doctor" msgstr "" -#: models.py:2557 +#: models.py:2564 msgid "Contact type" msgstr "" -#: models.py:2560 models.py:2624 +#: models.py:2567 models.py:2631 msgid "Types" msgstr "" -#: models.py:2563 +#: models.py:2570 msgid "Is attached to" msgstr "" -#: models.py:2568 +#: models.py:2575 msgid "Persons" msgstr "" -#: models.py:2570 +#: models.py:2577 msgid "Can view all Persons" msgstr "" -#: models.py:2571 +#: models.py:2578 msgid "Can view own Person" msgstr "" -#: models.py:2572 +#: models.py:2579 msgid "Can add own Person" msgstr "" -#: models.py:2573 +#: models.py:2580 msgid "Can change own Person" msgstr "" -#: models.py:2574 +#: models.py:2581 msgid "Can delete own Person" msgstr "" -#: models.py:2752 +#: models.py:2759 msgid "Advanced shortcut menu" msgstr "" -#: models.py:2755 +#: models.py:2762 msgid "Ishtar user" msgstr "" -#: models.py:2756 +#: models.py:2763 msgid "Ishtar users" msgstr "" -#: models.py:2798 +#: models.py:2805 msgid "To modify the password use the form in Auth > User" msgstr "" -#: models.py:2804 +#: models.py:2811 msgid "Author types" msgstr "" -#: models.py:2836 +#: models.py:2844 msgid "Source types" msgstr "" -#: models.py:2844 +#: models.py:2853 msgid "Support types" msgstr "" -#: models.py:2852 -msgid "Formats" +#: models.py:2860 +msgid "Format type" +msgstr "" + +#: models.py:2861 +msgid "Format types" msgstr "" -#: models.py:2859 +#: models.py:2869 msgid "External ID" msgstr "" -#: models.py:2862 +#: models.py:2872 msgid "Support" msgstr "" -#: models.py:2866 +#: models.py:2876 msgid "Scale" msgstr "" -#: models.py:2880 +#: models.py:2890 msgid "Item number" msgstr "" -#: models.py:2881 +#: models.py:2891 msgid "Ref." msgstr "" -#: models.py:2884 +#: models.py:2894 msgid "Internal ref." msgstr "" -#: models.py:2927 +#: models.py:2937 msgid "Surface (m2)" msgstr "" -#: models.py:2928 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 +#: models.py:2938 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 msgid "Localisation" msgstr "" -#: models.py:2953 +#: models.py:2963 msgid "Is preventive" msgstr "" -#: models.py:2957 +#: models.py:2967 msgid "Operation types" msgstr "" -#: models.py:2986 +#: models.py:2996 msgid "Preventive" msgstr "" -#: models.py:2987 +#: models.py:2997 msgid "Research" msgstr "" -#: models.py:3010 +#: models.py:3020 msgid "Authority name" msgstr "" -#: models.py:3011 +#: models.py:3021 msgid "Authority SRID" msgstr "" -#: models.py:3015 +#: models.py:3025 msgid "Spatial reference systems" msgstr "" @@ -1496,6 +1502,10 @@ msgstr "" msgid "Archaeological file" msgstr "" +#: views.py:241 +msgid "Operation" +msgstr "" + #: views.py:243 msgid "Context record" msgstr "" @@ -1512,48 +1522,56 @@ msgstr "" msgid "Treatment" msgstr "" -#: views.py:1303 views.py:1346 +#: views.py:1304 views.py:1347 msgid "Operation not permitted." msgstr "" -#: views.py:1305 +#: views.py:1306 #, python-format msgid "New %s" msgstr "" -#: views.py:1365 views.py:1418 +#: views.py:1365 views.py:1415 +msgid "Archaeological files" +msgstr "" + +#: views.py:1366 views.py:1419 msgid "Operations" msgstr "" -#: views.py:1369 views.py:1425 +#: views.py:1368 views.py:1423 +msgid "Context records" +msgstr "" + +#: views.py:1370 views.py:1426 msgid "Finds" msgstr "" -#: views.py:1618 templates/ishtar/import_list.html:43 +#: views.py:1619 templates/ishtar/import_list.html:43 msgid "Link unmatched items" msgstr "" -#: views.py:1633 +#: views.py:1634 msgid "Delete import" msgstr "" -#: views.py:1672 +#: views.py:1673 msgid "Merge persons" msgstr "" -#: views.py:1696 +#: views.py:1697 msgid "Select the main person" msgstr "" -#: views.py:1705 +#: views.py:1706 msgid "Merge organization" msgstr "" -#: views.py:1715 +#: views.py:1716 msgid "Select the main organization" msgstr "" -#: views.py:1755 views.py:1771 +#: views.py:1756 views.py:1772 msgid "Corporation manager" msgstr "" diff --git a/ishtar_common/migrations/0070_auto__add_importermodel__add_field_importertype_new_associated_models.py b/ishtar_common/migrations/0070_auto__add_importermodel__add_field_importertype_new_associated_models.py new file mode 100644 index 000000000..b78e71bbf --- /dev/null +++ b/ishtar_common/migrations/0070_auto__add_importermodel__add_field_importertype_new_associated_models.py @@ -0,0 +1,515 @@ +# -*- 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 'ImporterModel' + db.create_table('ishtar_common_importermodel', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=200)), + ('klass', self.gf('django.db.models.fields.CharField')(max_length=200)), + )) + db.send_create_signal('ishtar_common', ['ImporterModel']) + + # Adding field 'ImporterType.new_associated_models' + db.add_column('ishtar_common_importertype', 'new_associated_models', + self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='+', null=True, to=orm['ishtar_common.ImporterModel']), + keep_default=False) + + # Adding M2M table for field created_models on 'ImporterType' + db.create_table('ishtar_common_importertype_created_models', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('importertype', models.ForeignKey(orm['ishtar_common.importertype'], null=False)), + ('importermodel', models.ForeignKey(orm['ishtar_common.importermodel'], null=False)) + )) + db.create_unique('ishtar_common_importertype_created_models', ['importertype_id', 'importermodel_id']) + + + def backwards(self, orm): + # Deleting model 'ImporterModel' + db.delete_table('ishtar_common_importermodel') + + # Deleting field 'ImporterType.new_associated_models' + db.delete_column('ishtar_common_importertype', 'new_associated_models_id') + + # Removing M2M table for field created_models on 'ImporterType' + db.delete_table('ishtar_common_importertype_created_models') + + + 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': {'ordering': "['label']", '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': {'ordering': "('formater_type', 'options')", '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.historicalperson': { + 'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalPerson'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}), + 'attached_to_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.import': { + 'Meta': {'object_name': 'Import'}, + 'conservative_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), + 'encoding': ('django.db.models.fields.CharField', [], {'default': "'utf-8'", 'max_length': '15'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '220'}), + 'imported_images': ('django.db.models.fields.files.FileField', [], {'max_length': '220', 'null': 'True', 'blank': 'True'}), + 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), + 'match_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', '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': {'ordering': "('importer_type', 'col_number')", 'unique_together': "(('importer_type', 'col_number'),)", 'object_name': 'ImporterColumn'}, + 'col_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + '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']"}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + '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']"}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'field_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'ishtar_common.importermodel': { + 'Meta': {'object_name': 'ImporterModel'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'klass': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + 'ishtar_common.importertype': { + 'Meta': {'object_name': 'ImporterType'}, + 'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'created_models': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.ImporterModel']"}), + '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'}), + 'new_associated_models': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['ishtar_common.ImporterModel']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'unicity_keys': ('django.db.models.fields.CharField', [], {'max_length': '500', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.ishtarsiteprofile': { + 'Meta': {'ordering': "['label']", 'object_name': 'IshtarSiteProfile'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'base_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 0, 0, 0)'", 'max_length': '200'}), + 'base_find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{context_record__external_id}-{label}'"}), + 'container_external_id': ('django.db.models.fields.TextField', [], {'default': "'{responsible__external_id}-{index}'"}), + 'context_record': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'context_record_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,200,0,0.2)'", 'max_length': '200'}), + 'context_record_external_id': ('django.db.models.fields.TextField', [], {'default': "'{parcel__external_id}-{label}'"}), + 'currency': ('django.db.models.fields.CharField', [], {'default': "u'\\u20ac'", 'max_length': "'5'"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file_external_id': ('django.db.models.fields.TextField', [], {'default': "'{year}-{numeric_reference}'"}), + 'files': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'files_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 32, 210, 0.1)'", 'max_length': '200'}), + 'find': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'find_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,0,0,0.15)'", 'max_length': '200'}), + 'find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{get_first_base_find__context_record__external_id}-{label}'"}), + 'homepage': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.TextField', [], {}), + 'mapping': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'mapping_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(72, 236, 0, 0.15)'", 'max_length': '200'}), + 'parcel_external_id': ('django.db.models.fields.TextField', [], {'default': "'{associated_file__external_id}{operation__code_patriarche}-{town__numero_insee}-{section}{parcel_number}'"}), + 'person_raw_name': ('django.db.models.fields.TextField', [], {'default': "'{name|upper} {surname}'"}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'warehouse': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'warehouse_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(10,20,200,0.15)'", 'max_length': '200'}), + 'warehouse_external_id': ('django.db.models.fields.TextField', [], {'default': "'{name|slug}'"}) + }, + 'ishtar_common.ishtaruser': { + 'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, + 'advanced_shortcut_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.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'}) + }, + '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.TitleType']", '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': {'ordering': "['label']", '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.spatialreferencesystem': { + 'Meta': {'ordering': "('label',)", 'object_name': 'SpatialReferenceSystem'}, + 'auth_name': ('django.db.models.fields.CharField', [], {'default': "'EPSG'", 'max_length': '256'}), + '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': '10'}), + 'srid': ('django.db.models.fields.IntegerField', [], {}), + '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', 'key', 'associated_user', 'associated_import'),)", 'object_name': 'TargetKey'}, + 'associated_import': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}), + 'associated_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}), + '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.titletype': { + 'Meta': {'ordering': "('label',)", 'object_name': 'TitleType'}, + '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'}), + 'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_town'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), + '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/migrations/0071_migrate_importermodels.py b/ishtar_common/migrations/0071_migrate_importermodels.py new file mode 100644 index 000000000..cc9b6f449 --- /dev/null +++ b/ishtar_common/migrations/0071_migrate_importermodels.py @@ -0,0 +1,520 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +def get_importer_models(): + MODELS = [ + ('ishtar_common.models.Person', u"Person"), + ('ishtar_common.models.Organization', u"Organization"), + ('archaeological_operations.models.Operation', u"Operation"), + ('archaeological_operations.models.ArchaeologicalSite', + u"Archaeological site"), + ('archaeological_operations.models.Parcel', u"Parcels"), + ('archaeological_operations.models.OperationSource', + u"Operation source"), + ] + MODELS = [('archaeological_files.models.File', + u"Archaeological files")] + MODELS + MODELS = [('archaeological_context_records.models.ContextRecord', + u"Context records"), + ('archaeological_context_records.models.RecordRelations', + u"Context record relations")] + MODELS + MODELS = [('archaeological_finds.models.BaseFind', + u"Base finds"), ] + MODELS + return MODELS + + +class Migration(SchemaMigration): + + def forwards(self, orm): + models = dict(get_importer_models()) + for klass in models.keys(): + obj, c = orm['ishtar_common.importermodel'].objects.get_or_create( + name=models[klass], klass=klass + ) + models[klass] = obj + + for imp in orm['ishtar_common.importertype'].objects.all(): + if imp.associated_models not in models: + raise NotImplemented("{} is missing in models types") + imp.new_associated_models = models[imp.associated_models] + imp.save() + + def backwards(self, orm): + pass + + 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': {'ordering': "['label']", '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': {'ordering': "('formater_type', 'options')", '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.historicalperson': { + 'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalPerson'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}), + 'attached_to_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.import': { + 'Meta': {'object_name': 'Import'}, + 'conservative_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), + 'encoding': ('django.db.models.fields.CharField', [], {'default': "'utf-8'", 'max_length': '15'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '220'}), + 'imported_images': ('django.db.models.fields.files.FileField', [], {'max_length': '220', 'null': 'True', 'blank': 'True'}), + 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), + 'match_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', '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': {'ordering': "('importer_type', 'col_number')", 'unique_together': "(('importer_type', 'col_number'),)", 'object_name': 'ImporterColumn'}, + 'col_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + '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']"}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + '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']"}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'field_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'ishtar_common.importermodel': { + 'Meta': {'object_name': 'ImporterModel'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'klass': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + 'ishtar_common.importertype': { + 'Meta': {'object_name': 'ImporterType'}, + 'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'created_models': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.ImporterModel']"}), + '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'}), + 'new_associated_models': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['ishtar_common.ImporterModel']"}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'unicity_keys': ('django.db.models.fields.CharField', [], {'max_length': '500', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.ishtarsiteprofile': { + 'Meta': {'ordering': "['label']", 'object_name': 'IshtarSiteProfile'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'base_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 0, 0, 0)'", 'max_length': '200'}), + 'base_find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{context_record__external_id}-{label}'"}), + 'container_external_id': ('django.db.models.fields.TextField', [], {'default': "'{responsible__external_id}-{index}'"}), + 'context_record': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'context_record_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,200,0,0.2)'", 'max_length': '200'}), + 'context_record_external_id': ('django.db.models.fields.TextField', [], {'default': "'{parcel__external_id}-{label}'"}), + 'currency': ('django.db.models.fields.CharField', [], {'default': "u'\\u20ac'", 'max_length': "'5'"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file_external_id': ('django.db.models.fields.TextField', [], {'default': "'{year}-{numeric_reference}'"}), + 'files': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'files_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 32, 210, 0.1)'", 'max_length': '200'}), + 'find': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'find_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,0,0,0.15)'", 'max_length': '200'}), + 'find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{get_first_base_find__context_record__external_id}-{label}'"}), + 'homepage': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.TextField', [], {}), + 'mapping': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'mapping_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(72, 236, 0, 0.15)'", 'max_length': '200'}), + 'parcel_external_id': ('django.db.models.fields.TextField', [], {'default': "'{associated_file__external_id}{operation__code_patriarche}-{town__numero_insee}-{section}{parcel_number}'"}), + 'person_raw_name': ('django.db.models.fields.TextField', [], {'default': "'{name|upper} {surname}'"}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'warehouse': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'warehouse_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(10,20,200,0.15)'", 'max_length': '200'}), + 'warehouse_external_id': ('django.db.models.fields.TextField', [], {'default': "'{name|slug}'"}) + }, + 'ishtar_common.ishtaruser': { + 'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, + 'advanced_shortcut_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.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'}) + }, + '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.TitleType']", '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': {'ordering': "['label']", '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.spatialreferencesystem': { + 'Meta': {'ordering': "('label',)", 'object_name': 'SpatialReferenceSystem'}, + 'auth_name': ('django.db.models.fields.CharField', [], {'default': "'EPSG'", 'max_length': '256'}), + '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': '10'}), + 'srid': ('django.db.models.fields.IntegerField', [], {}), + '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', 'key', 'associated_user', 'associated_import'),)", 'object_name': 'TargetKey'}, + 'associated_import': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}), + 'associated_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}), + '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.titletype': { + 'Meta': {'ordering': "('label',)", 'object_name': 'TitleType'}, + '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'}), + 'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_town'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), + '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/migrations/0072_auto__del_field_importertype_new_associated_models__chg_field_importer.py b/ishtar_common/migrations/0072_auto__del_field_importertype_new_associated_models__chg_field_importer.py new file mode 100644 index 000000000..9d1c9f55c --- /dev/null +++ b/ishtar_common/migrations/0072_auto__del_field_importertype_new_associated_models__chg_field_importer.py @@ -0,0 +1,489 @@ +# -*- 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): + db.delete_column('ishtar_common_importertype', 'associated_models') + db.rename_column('ishtar_common_importertype', + 'new_associated_models_id', 'associated_models_id') + + def backwards(self, orm): + # User chose to not deal with backwards NULL issues for 'ImporterType.associated_models' + raise RuntimeError("Cannot reverse this migration. 'ImporterType.associated_models' and its values cannot be restored.") + + 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': {'ordering': "['label']", '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': {'ordering': "('formater_type', 'options')", '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.historicalperson': { + 'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalPerson'}, + 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}), + 'attached_to_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}), + 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}) + }, + 'ishtar_common.import': { + 'Meta': {'object_name': 'Import'}, + 'conservative_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), + 'encoding': ('django.db.models.fields.CharField', [], {'default': "'utf-8'", 'max_length': '15'}), + 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}), + 'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '220'}), + 'imported_images': ('django.db.models.fields.files.FileField', [], {'max_length': '220', 'null': 'True', 'blank': 'True'}), + 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}), + 'match_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '255', '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': {'ordering': "('importer_type', 'col_number')", 'unique_together': "(('importer_type', 'col_number'),)", 'object_name': 'ImporterColumn'}, + 'col_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + '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']"}), + 'label': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + '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']"}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'field_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'ishtar_common.importermodel': { + 'Meta': {'ordering': "('name',)", 'object_name': 'ImporterModel'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'klass': ('django.db.models.fields.CharField', [], {'max_length': '200'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}) + }, + 'ishtar_common.importertype': { + 'Meta': {'object_name': 'ImporterType'}, + 'associated_models': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'to': "orm['ishtar_common.ImporterModel']"}), + 'created_models': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.ImporterModel']"}), + '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'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}), + 'unicity_keys': ('django.db.models.fields.CharField', [], {'max_length': '500', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}), + 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.ishtarsiteprofile': { + 'Meta': {'ordering': "['label']", 'object_name': 'IshtarSiteProfile'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'base_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 0, 0, 0)'", 'max_length': '200'}), + 'base_find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{context_record__external_id}-{label}'"}), + 'container_external_id': ('django.db.models.fields.TextField', [], {'default': "'{responsible__external_id}-{index}'"}), + 'context_record': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'context_record_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,200,0,0.2)'", 'max_length': '200'}), + 'context_record_external_id': ('django.db.models.fields.TextField', [], {'default': "'{parcel__external_id}-{label}'"}), + 'currency': ('django.db.models.fields.CharField', [], {'default': "u'\\u20ac'", 'max_length': "'5'"}), + 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'file_external_id': ('django.db.models.fields.TextField', [], {'default': "'{year}-{numeric_reference}'"}), + 'files': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'files_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(0, 32, 210, 0.1)'", 'max_length': '200'}), + 'find': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'find_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(210,0,0,0.15)'", 'max_length': '200'}), + 'find_external_id': ('django.db.models.fields.TextField', [], {'default': "'{get_first_base_find__context_record__external_id}-{label}'"}), + 'homepage': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'label': ('django.db.models.fields.TextField', [], {}), + 'mapping': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'mapping_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(72, 236, 0, 0.15)'", 'max_length': '200'}), + 'parcel_external_id': ('django.db.models.fields.TextField', [], {'default': "'{associated_file__external_id}{operation__code_patriarche}-{town__numero_insee}-{section}{parcel_number}'"}), + 'person_raw_name': ('django.db.models.fields.TextField', [], {'default': "'{name|upper} {surname}'"}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}), + 'warehouse': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'warehouse_color': ('django.db.models.fields.CharField', [], {'default': "'rgba(10,20,200,0.15)'", 'max_length': '200'}), + 'warehouse_external_id': ('django.db.models.fields.TextField', [], {'default': "'{name|slug}'"}) + }, + 'ishtar_common.ishtaruser': { + 'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']}, + 'advanced_shortcut_menu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + '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.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'}) + }, + '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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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': '300', '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.TextField', [], {'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': '500'}), + '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'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'}), + 'alt_address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'alt_address_is_prefered': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'alt_country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}), + 'alt_postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}), + 'alt_town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'}), + 'archived': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', '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']"}), + 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'contact_type': ('django.db.models.fields.CharField', [], {'max_length': '300', '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': '300', '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.TextField', [], {'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'}), + 'old_title': ('django.db.models.fields.CharField', [], {'max_length': '100', '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'}), + 'phone2': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone3': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}), + 'phone_desc': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc2': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}), + 'phone_desc3': ('django.db.models.fields.CharField', [], {'max_length': '300', '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'}), + 'raw_phone': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'salutation': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), + 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}), + 'title': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.TitleType']", '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': {'ordering': "['label']", '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.spatialreferencesystem': { + 'Meta': {'ordering': "('label',)", 'object_name': 'SpatialReferenceSystem'}, + 'auth_name': ('django.db.models.fields.CharField', [], {'default': "'EPSG'", 'max_length': '256'}), + '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': '10'}), + 'srid': ('django.db.models.fields.IntegerField', [], {}), + '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', 'key', 'associated_user', 'associated_import'),)", 'object_name': 'TargetKey'}, + 'associated_import': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}), + 'associated_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}), + '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.titletype': { + 'Meta': {'ordering': "('label',)", 'object_name': 'TitleType'}, + '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'}), + 'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_town'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}), + '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 15c8fe5da..c9903525d 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -35,7 +35,8 @@ import zipfile from django.conf import settings from django.core.cache import cache -from django.core.exceptions import ObjectDoesNotExist, ValidationError +from django.core.exceptions import ObjectDoesNotExist, ValidationError, \ + SuspiciousOperation from django.core.files import File from django.core.files.uploadedfile import SimpleUploadedFile from django.core.validators import validate_slug @@ -665,8 +666,9 @@ class GeneralType(Cached, models.Model): def get_keys(self): keys = [self.txt_idx] content_type = ContentType.objects.get_for_model(self.__class__) - for ik in ItemKey.objects.filter(content_type=content_type, - object_id=self.pk).all(): + for ik in ItemKey.objects.filter( + content_type=content_type, object_id=self.pk).exclude( + key=self.txt_idx).all(): keys.append(ik.key) return keys @@ -1707,28 +1709,6 @@ IMPORTER_CLASSES.update({ 'archaeological_files.data_importer.FileImporterSraPdL'}) -def get_importer_models(): - MODELS = [ - ('ishtar_common.models.Person', _(u"Person")), - ('ishtar_common.models.Organization', _(u"Organization")), - ('archaeological_operations.models.Operation', _(u"Operation")), - ('archaeological_operations.models.ArchaeologicalSite', - _(u"Archaeological site")), - ('archaeological_operations.models.Parcel', _(u"Parcels")), - ('archaeological_operations.models.OperationSource', - _(u"Operation source")), - ] - MODELS = [('archaeological_files.models.File', - _(u"Archaeological files"))] + MODELS - MODELS = [('archaeological_context_records.models.ContextRecord', - _(u"Context records")), - ('archaeological_context_records.models.RecordRelations', - _(u"Context record relations"))] + MODELS - MODELS = [('archaeological_finds.models.BaseFind', - _(u"Base finds")), ] + MODELS - return MODELS - - def get_model_fields(model): """ Return a dict of fields from model @@ -1744,13 +1724,33 @@ def get_model_fields(model): def import_class(full_path_classname): + """ + Return the model class from the full path + TODO: add a white list for more security + """ mods = full_path_classname.split('.') if len(mods) == 1: mods = ['ishtar_common', 'models', mods[0]] + elif 'models' not in mods: + raise SuspiciousOperation( + u"Try to import a non model from a string") module = import_module('.'.join(mods[:-1])) return getattr(module, mods[-1]) +class ImporterModel(models.Model): + name = models.CharField(_(u"Name"), max_length=200) + klass = models.CharField(_(u"Class name"), max_length=200) + + class Meta: + verbose_name = _(u"Importer - Model") + verbose_name_plural = _(u"Importer - Models") + ordering = ('name',) + + def __unicode__(self): + return self.name + + class ImporterType(models.Model): """ Description of a table to be mapped with ishtar database @@ -1763,9 +1763,13 @@ class ImporterType(models.Model): max_length=500) users = models.ManyToManyField('IshtarUser', verbose_name=_(u"Users"), blank=True, null=True) - associated_models = models.CharField(_(u"Associated model"), - max_length=200, - choices=get_importer_models()) + associated_models = models.ForeignKey( + ImporterModel, verbose_name=_(u"Associated model"), + related_name='+', blank=True, null=True) + created_models = models.ManyToManyField( + ImporterModel, verbose_name=_(u"Models that can accept new items"), + blank=True, null=True, help_text=_(u"Leave blank for no restrictions"), + related_name='+') is_template = models.BooleanField(_(u"Is template"), default=False) unicity_keys = models.CharField(_(u"Unicity keys (separator \";\")"), blank=True, null=True, max_length=500) @@ -1781,7 +1785,7 @@ class ImporterType(models.Model): if self.slug and self.slug in IMPORTER_CLASSES: cls = import_class(IMPORTER_CLASSES[self.slug]) return cls - OBJECT_CLS = import_class(self.associated_models) + OBJECT_CLS = import_class(self.associated_models.klass) DEFAULTS = dict([(default.keys, default.values) for default in self.defaults.all()]) LINE_FORMAT = [] @@ -1824,9 +1828,13 @@ class ImporterType(models.Model): UNICITY_KEYS = [] if self.unicity_keys: UNICITY_KEYS = [un.strip() for un in self.unicity_keys.split(';')] + MODEL_CREATION_LIMIT = [] + for modls in self.created_models.all(): + MODEL_CREATION_LIMIT.append(import_class(modls.klass)) args = {'OBJECT_CLS': OBJECT_CLS, 'DESC': self.description, 'DEFAULTS': DEFAULTS, 'LINE_FORMAT': LINE_FORMAT, - 'UNICITY_KEYS': UNICITY_KEYS} + 'UNICITY_KEYS': UNICITY_KEYS, + 'MODEL_CREATION_LIMIT': MODEL_CREATION_LIMIT} name = str(''.join( x for x in slugify(self.name).replace('-', ' ').title() if not x.isspace())) @@ -1836,7 +1844,6 @@ class ImporterType(models.Model): def get_associated_model(parent_model, keys): model = None - OBJECT_CLS = None if isinstance(parent_model, unicode) or \ isinstance(parent_model, str): OBJECT_CLS = import_class(parent_model) @@ -1874,7 +1881,7 @@ class ImporterDefault(models.Model): @property def associated_model(self): - return get_associated_model(self.importer_type.associated_models, + return get_associated_model(self.importer_type.associated_models.klass, self.keys) @property @@ -2014,7 +2021,7 @@ class ImportTarget(models.Model): def associated_model(self): try: return get_associated_model( - self.column.importer_type.associated_models, + self.column.importer_type.associated_models.klass, self.target.split('__')) except KeyError: return @@ -2221,7 +2228,10 @@ class FormaterType(models.Model): pass return UnicodeFormater(**kwargs) elif self.formater_type == 'DateFormater': - return DateFormater(self.options, **kwargs) + date_formats = self.options + if self.many_split: + date_formats = self.options.split(kwargs.pop('many_split')) + return DateFormater(date_formats, **kwargs) elif self.formater_type == 'StrToBoolean': return StrToBoolean(**kwargs) elif self.formater_type == 'UnknowType': diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index 5ff9e9895..06c80c194 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -382,6 +382,14 @@ div#header{ background-repeat:no-repeat; } +.confirm-message{ + background-color: rgb(170, 170, 170); + margin: 0px; + color: rgb(255, 255, 255); + padding: 2px; + font-weight: bold; +} + div#validation-bar p{ margin:0; } diff --git a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html index 1fbaadcd1..565256552 100644 --- a/ishtar_common/templates/ishtar/wizard/confirm_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/confirm_wizard.html @@ -37,10 +37,17 @@ </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> + + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + <p class="confirm-message">{%if confirm_end_msg %}{{confirm_end_msg|safe}}{%else%}{% trans "Would you like to save them?" %}{%endif%}</p> + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} + </div> </form> {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/default_wizard.html b/ishtar_common/templates/ishtar/wizard/default_wizard.html index e77484e61..204feeebe 100644 --- a/ishtar_common/templates/ishtar/wizard/default_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/default_wizard.html @@ -46,12 +46,12 @@ {{ previous_fields|safe }} {% block "footer" %} <div id="footer"> -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} -{% include 'ishtar/blocks/footer.html' %} -{% endblock %} + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} </div> +{% 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 e417b5e4d..28ec962f4 100644 --- a/ishtar_common/templates/ishtar/wizard/parcels_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/parcels_wizard.html @@ -24,9 +24,14 @@ <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 }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} </div> </form> {% endblock %} diff --git a/ishtar_common/templates/ishtar/wizard/relations_wizard.html b/ishtar_common/templates/ishtar/wizard/relations_wizard.html index 9ca592ca8..3f12bcd60 100644 --- a/ishtar_common/templates/ishtar/wizard/relations_wizard.html +++ b/ishtar_common/templates/ishtar/wizard/relations_wizard.html @@ -23,9 +23,14 @@ <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 }} -{% block "validation_bar" %} -{% include 'ishtar/wizard/validation_bar.html' %} -{% endblock %} + {% block "footer" %} + <div id="footer"> + {% block "validation_bar" %} + {% include 'ishtar/wizard/validation_bar.html' %} + {% endblock %} + {% include 'ishtar/blocks/footer.html' %} + </div> + {% endblock %} </div> </form> {% endblock %} diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index 0082624d7..a3fa62ce7 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -27,6 +27,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.cache import cache from django.core.exceptions import ValidationError from django.core.files.base import File as DjangoFile +from django.core.files.uploadedfile import SimpleUploadedFile from django.core.management import call_command from django.core.urlresolvers import reverse from django.template.defaultfilters import slugify @@ -35,6 +36,7 @@ from django.test.client import Client from django.test.simple import DjangoTestSuiteRunner from ishtar_common import models +from ishtar_common import forms_common from ishtar_common.utils import post_save_point """ @@ -271,10 +273,12 @@ class AdminGenTypeTest(TestCase): '../ishtar_common/fixtures/initial_importtypes-fr.json', settings.ROOT_PATH + '../archaeological_operations/fixtures/initial_data-fr.json'] - models = [models.OrganizationType, models.PersonType, models.TitleType, - models.AuthorType, models.SourceType, models.OperationType, - models.SpatialReferenceSystem] - # models.Format, models.SupportType -- need fixtures + gen_models = [ + models.OrganizationType, models.PersonType, models.TitleType, + models.AuthorType, models.SourceType, models.OperationType, + models.SpatialReferenceSystem, models.Format, models.SupportType] + models_with_data = gen_models + [models.ImporterModel] + models = models_with_data module_name = 'ishtar_common' def setUp(self): @@ -294,14 +298,15 @@ class AdminGenTypeTest(TestCase): self.assertEqual( response.status_code, 200, msg="Can not access admin list for {}.".format(model)) - url = base_url + "{}/".format(model.objects.all()[0].pk) - response = self.client.get(url) - self.assertEqual( - response.status_code, 200, - msg="Can not access admin detail for {}.".format(model)) + if model in self.models_with_data: + url = base_url + "{}/".format(model.objects.all()[0].pk) + response = self.client.get(url) + self.assertEqual( + response.status_code, 200, + msg="Can not access admin detail for {}.".format(model)) def test_csv_export(self): - for model in self.models: + for model in self.gen_models: url = '/admin/{}/{}/'.format(self.module_name, model.__name__.lower()) response = self.client.post(url, {'action': 'export_as_csv'}) @@ -311,7 +316,7 @@ class AdminGenTypeTest(TestCase): def test_str(self): # test __str__ - for model in self.models: + for model in self.models_with_data: self.assertTrue(str(model.objects.all()[0])) @@ -768,8 +773,10 @@ class ImportTest(TestCase): # create an import, fields are not relevant... create_user() + imp_model = models.ImporterModel.objects.create( + klass='ishtar_common.models.Person', name='Person') importer_type = models.ImporterType.objects.create( - associated_models='ishtar_common.models.Person') + associated_models=imp_model) mcc_operation_file = DjangoFile(file( settings.ROOT_PATH + '../archaeological_operations/tests/MCC-operations-example.csv', diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 467401b8f..c9eb9fec8 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -73,7 +73,7 @@ from ishtar_common.models import HistoryError, PRIVATE_FIELDS, \ import models -CSV_OPTIONS = {'delimiter': ';', 'quotechar': '"', 'quoting': csv.QUOTE_ALL} +CSV_OPTIONS = {'delimiter': ',', 'quotechar': '"', 'quoting': csv.QUOTE_ALL} ENCODING = settings.ENCODING or 'utf-8' logger = logging.getLogger(__name__) @@ -993,7 +993,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], new_vals.append(u"{}{}{}".format( vals[idx], u' - ', format_val(v))) my_vals = new_vals[:] - data.append(" ; ".join(my_vals) or u"") + data.append(u" & ".join(my_vals) or u"") datas.append(data) if manual_sort_key: # +1 because the id is added as a first col @@ -1068,7 +1068,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], col_names = [] for field_name in table_cols: if type(field_name) in (list, tuple): - field_name = " ; ".join(field_name) + field_name = u" & ".join(field_name) if hasattr(model, 'EXTRA_FULL_FIELDS_LABELS') and\ field_name in model.EXTRA_FULL_FIELDS_LABELS: field = model.EXTRA_FULL_FIELDS_LABELS[field_name] diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py index 020eca5af..597fb2764 100644 --- a/ishtar_common/widgets.py +++ b/ishtar_common/widgets.py @@ -657,7 +657,7 @@ class JQueryJqGrid(forms.RadioSelect): self.associated_model.__module__, self.associated_model.__name__) for imp in models.ImporterType.objects.filter( - slug__isnull=False, associated_models=model_name, + slug__isnull=False, associated_models__klass=model_name, is_template=True).all(): dct['extra_sources'].append(( imp.slug, imp.name, diff --git a/translations/de/ishtar_common.po b/translations/de/ishtar_common.po index 6aae6aaa7..ca174763b 100644 --- a/translations/de/ishtar_common.po +++ b/translations/de/ishtar_common.po @@ -23,109 +23,125 @@ msgstr "" msgid "Related item" msgstr "" -#: data_importer.py:182 +#: admin.py:79 +msgid "Export selected as CSV file" +msgstr "" + +#: data_importer.py:183 #, python-format msgid "\"%(value)s\" is too long. The max length is %(length)d characters." msgstr "" -#: data_importer.py:199 +#: data_importer.py:200 #, python-format msgid "\"%(value)s\" not equal to yes or no" msgstr "" -#: data_importer.py:211 +#: data_importer.py:212 #, python-format msgid "\"%(value)s\" is not a float" msgstr "" -#: data_importer.py:224 data_importer.py:238 data_importer.py:482 +#: data_importer.py:225 data_importer.py:239 data_importer.py:483 #, python-format msgid "\"%(value)s\" is not a valid date" msgstr "" -#: data_importer.py:251 +#: data_importer.py:252 #, python-format msgid "\"%(value)s\" is not an integer" msgstr "" -#: data_importer.py:302 data_importer.py:545 +#: data_importer.py:303 data_importer.py:546 #, python-format msgid "Choice for \"%s\" is not available. Which one is relevant?\n" msgstr "" -#: data_importer.py:309 +#: data_importer.py:310 #, python-format msgid "%d. None of the above - create new" msgstr "" -#: data_importer.py:312 +#: data_importer.py:313 #, python-format msgid "%d. None of the above - skip" msgstr "" -#: data_importer.py:508 +#: data_importer.py:509 #, python-format msgid "\"%(value)s\" is not a valid path for the given archive" msgstr "" -#: data_importer.py:620 +#: data_importer.py:623 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 " "reference file." msgstr "" -#: data_importer.py:624 +#: data_importer.py:627 #, python-format msgid "Too many cols (%(user_col)d) when maximum is %(ref_col)d" msgstr "" -#: data_importer.py:626 +#: data_importer.py:629 msgid "No data provided" msgstr "" -#: data_importer.py:627 +#: data_importer.py:630 msgid "Value is required" msgstr "" -#: data_importer.py:628 +#: data_importer.py:631 #, python-format msgid "At least %d columns must be filled" msgstr "" -#: data_importer.py:629 +#: data_importer.py:632 msgid "The regexp doesn't match." msgstr "" -#: data_importer.py:1037 +#: data_importer.py:634 +msgid "" +"Forced creation is set for model {} but this model is not in the list of " +"models allowed to be created." +msgstr "" + +#: data_importer.py:636 +msgid "" +"{} with values {} doesn't exist in the database. Create it first or fix your " +"source file." +msgstr "" + +#: data_importer.py:1089 msgid "Not imported" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "line" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "col" msgstr "" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "error" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "field" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "source" msgstr "" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "result" msgstr "" -#: data_importer.py:1466 +#: data_importer.py:1544 #, python-format msgid "\"%(value)s\" not in %(values)s" msgstr "" @@ -158,12 +174,12 @@ msgstr "" msgid "Add a new item" msgstr "" -#: forms.py:262 models.py:1473 +#: forms.py:262 models.py:1475 msgid "Template" msgstr "" #: forms_common.py:41 forms_common.py:59 forms_common.py:182 -#: forms_common.py:406 models.py:1539 models.py:2940 +#: forms_common.py:406 models.py:1541 models.py:2950 #: templates/blocks/JQueryAdvancedTown.html:19 #: templates/ishtar/sheet_organization.html:13 msgid "Town" @@ -179,9 +195,8 @@ msgid "" "french town Saint-Denis in the Seine-Saint-Denis department.</p>" msgstr "" -#: forms_common.py:68 forms_common.py:855 ishtar_menu.py:47 models.py:1712 -#: models.py:2567 models.py:2749 models.py:2810 -#: templates/ishtar/sheet_person.html:4 +#: forms_common.py:68 forms_common.py:855 ishtar_menu.py:47 models.py:2574 +#: models.py:2756 models.py:2818 templates/ishtar/sheet_person.html:4 msgid "Person" msgstr "" @@ -192,63 +207,63 @@ msgid "" msgstr "" #: forms_common.py:170 forms_common.py:327 forms_common.py:451 -#: ishtar_menu.py:75 models.py:1713 models.py:2450 models.py:2541 +#: ishtar_menu.py:75 models.py:2457 models.py:2548 #: templates/ishtar/sheet_organization.html:4 msgid "Organization" msgstr "" #: forms_common.py:173 forms_common.py:210 forms_common.py:322 -#: forms_common.py:376 forms_common.py:446 models.py:1094 models.py:1472 -#: models.py:1758 models.py:1977 models.py:2444 models.py:2553 models.py:2926 -#: templates/ishtar/sheet_organization.html:8 +#: forms_common.py:376 forms_common.py:446 models.py:1096 models.py:1474 +#: models.py:1742 models.py:1758 models.py:1984 models.py:2451 models.py:2560 +#: models.py:2936 templates/ishtar/sheet_organization.html:8 #: templates/ishtar/sheet_organization.html:21 msgid "Name" msgstr "" -#: forms_common.py:174 models.py:1694 models.py:2108 +#: forms_common.py:174 models.py:1696 models.py:2115 msgid "Organization type" msgstr "" -#: forms_common.py:176 forms_common.py:400 models.py:1534 +#: forms_common.py:176 forms_common.py:400 models.py:1536 #: templates/ishtar/sheet_organization.html:10 msgid "Address" msgstr "" -#: forms_common.py:178 forms_common.py:403 models.py:1535 +#: forms_common.py:178 forms_common.py:403 models.py:1537 #: templates/ishtar/sheet_organization.html:11 msgid "Address complement" msgstr "" -#: forms_common.py:180 forms_common.py:404 models.py:1537 +#: forms_common.py:180 forms_common.py:404 models.py:1539 #: templates/ishtar/sheet_organization.html:12 msgid "Postal code" msgstr "" -#: forms_common.py:183 forms_common.py:407 models.py:1540 +#: forms_common.py:183 forms_common.py:407 models.py:1542 msgid "Country" msgstr "" #: forms_common.py:185 forms_common.py:324 forms_common.py:380 -#: forms_common.py:448 forms_common.py:572 models.py:1567 +#: forms_common.py:448 forms_common.py:572 models.py:1569 msgid "Email" msgstr "" -#: forms_common.py:186 forms_common.py:383 models.py:1552 +#: forms_common.py:186 forms_common.py:383 models.py:1554 #: templates/ishtar/sheet_organization.html:14 #: templates/ishtar/sheet_person.html:19 #: templates/ishtar/wizard/wizard_person.html:17 msgid "Phone" msgstr "" -#: forms_common.py:187 forms_common.py:392 models.py:1564 +#: forms_common.py:187 forms_common.py:392 models.py:1566 #: templates/ishtar/sheet_organization.html:15 #: templates/ishtar/sheet_person.html:37 #: templates/ishtar/wizard/wizard_person.html:35 msgid "Mobile phone" msgstr "" -#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2144 -#: models.py:2446 models.py:2861 templates/sheet_ope.html:85 +#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2151 +#: models.py:2453 models.py:2871 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:23 @@ -272,7 +287,7 @@ msgstr "" msgid "Organization to merge" msgstr "" -#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2551 +#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2558 #: templates/ishtar/sheet_organization.html:22 msgid "Surname" msgstr "" @@ -290,25 +305,25 @@ msgstr "" msgid "Identity" msgstr "" -#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2109 -#: models.py:2545 models.py:2547 models.py:2858 templates/sheet_ope.html:104 +#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2116 +#: models.py:2552 models.py:2554 models.py:2868 templates/sheet_ope.html:104 #: templates/ishtar/blocks/window_tables/documents.html:7 msgid "Title" msgstr "" -#: forms_common.py:372 models.py:2549 +#: forms_common.py:372 models.py:2556 msgid "Salutation" msgstr "" -#: forms_common.py:378 models.py:2555 +#: forms_common.py:378 models.py:2562 msgid "Raw name" msgstr "" -#: forms_common.py:381 models.py:1553 +#: forms_common.py:381 models.py:1555 msgid "Phone description" msgstr "" -#: forms_common.py:384 models.py:1555 models.py:1557 +#: forms_common.py:384 models.py:1557 models.py:1559 msgid "Phone description 2" msgstr "" @@ -316,11 +331,11 @@ msgstr "" msgid "Phone 2" msgstr "" -#: forms_common.py:388 models.py:1561 +#: forms_common.py:388 models.py:1563 msgid "Phone description 3" msgstr "" -#: forms_common.py:390 models.py:1559 +#: forms_common.py:390 models.py:1561 msgid "Phone 3" msgstr "" @@ -328,23 +343,23 @@ msgstr "" msgid "Current organization" msgstr "" -#: forms_common.py:409 models.py:1542 +#: forms_common.py:409 models.py:1544 msgid "Other address: address" msgstr "" -#: forms_common.py:412 models.py:1545 +#: forms_common.py:412 models.py:1547 msgid "Other address: address complement" msgstr "" -#: forms_common.py:414 models.py:1546 +#: forms_common.py:414 models.py:1548 msgid "Other address: postal code" msgstr "" -#: forms_common.py:416 models.py:1548 +#: forms_common.py:416 models.py:1550 msgid "Other address: town" msgstr "" -#: forms_common.py:418 models.py:1550 +#: forms_common.py:418 models.py:1552 msgid "Other address: country" msgstr "" @@ -360,7 +375,7 @@ msgstr "" msgid "Account search" msgstr "" -#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2498 +#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2505 msgid "Person type" msgstr "" @@ -392,7 +407,7 @@ msgstr "" msgid "Send the new password by email?" msgstr "" -#: forms_common.py:628 forms_common.py:641 models.py:2941 +#: forms_common.py:628 forms_common.py:641 models.py:2951 msgid "Towns" msgstr "" @@ -408,7 +423,7 @@ msgstr "" msgid "Documentation informations" msgstr "" -#: forms_common.py:775 forms_common.py:823 models.py:2110 models.py:2835 +#: forms_common.py:775 forms_common.py:823 models.py:2117 models.py:2843 msgid "Source type" msgstr "" @@ -420,37 +435,37 @@ msgstr "" msgid "Internal reference" msgstr "" -#: forms_common.py:783 models.py:2872 +#: forms_common.py:783 models.py:2882 msgid "Numerical ressource (web address)" msgstr "" -#: forms_common.py:784 models.py:2874 +#: forms_common.py:784 models.py:2884 msgid "Receipt date" msgstr "" -#: forms_common.py:786 models.py:2273 models.py:2876 +#: forms_common.py:786 models.py:2280 models.py:2886 msgid "Creation date" msgstr "" -#: forms_common.py:789 models.py:2879 +#: forms_common.py:789 models.py:2889 msgid "Receipt date in documentation" msgstr "" -#: forms_common.py:791 forms_common.py:827 models.py:376 models.py:687 -#: models.py:2004 models.py:2559 models.py:2886 +#: forms_common.py:791 forms_common.py:827 models.py:377 models.py:689 +#: models.py:2011 models.py:2566 models.py:2896 msgid "Comment" msgstr "" -#: forms_common.py:793 forms_common.py:826 models.py:1096 models.py:1762 -#: models.py:1936 models.py:1978 models.py:2885 templates/sheet_ope.html:128 +#: forms_common.py:793 forms_common.py:826 models.py:1098 models.py:1762 +#: models.py:1943 models.py:1985 models.py:2895 templates/sheet_ope.html:128 msgid "Description" msgstr "" -#: forms_common.py:796 models.py:2887 +#: forms_common.py:796 models.py:2897 msgid "Additional information" msgstr "" -#: forms_common.py:798 forms_common.py:830 models.py:2889 +#: forms_common.py:798 forms_common.py:830 models.py:2899 msgid "Has a duplicate" msgstr "" @@ -465,7 +480,7 @@ msgid "" "p>" msgstr "" -#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2815 +#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2823 #: templates/ishtar/wizard/wizard_person_deletion.html:124 msgid "Author" msgstr "" @@ -478,7 +493,7 @@ msgstr "" msgid "Would you like to delete this documentation?" msgstr "" -#: forms_common.py:856 models.py:2111 models.py:2803 models.py:2812 +#: forms_common.py:856 models.py:2118 models.py:2810 models.py:2820 msgid "Author type" msgstr "" @@ -490,7 +505,7 @@ msgstr "" msgid "There are identical authors." msgstr "" -#: forms_common.py:893 models.py:2816 models.py:2868 +#: forms_common.py:893 models.py:2824 models.py:2878 #: templates/sheet_ope.html:106 #: templates/ishtar/blocks/window_tables/documents.html:9 msgid "Authors" @@ -508,7 +523,7 @@ msgstr "" msgid "Deletion" msgstr "" -#: ishtar_menu.py:39 models.py:1268 views.py:1548 +#: ishtar_menu.py:39 models.py:1270 views.py:1549 msgid "Global variables" msgstr "" @@ -536,278 +551,278 @@ msgstr "" msgid "Manual merge" msgstr "" -#: ishtar_menu.py:109 models.py:2284 +#: ishtar_menu.py:109 models.py:2291 msgid "Imports" msgstr "" -#: ishtar_menu.py:112 views.py:1556 +#: ishtar_menu.py:112 views.py:1557 msgid "New import" msgstr "" -#: ishtar_menu.py:116 views.py:1570 +#: ishtar_menu.py:116 views.py:1571 msgid "Current imports" msgstr "" -#: ishtar_menu.py:120 views.py:1606 +#: ishtar_menu.py:120 views.py:1607 msgid "Old imports" msgstr "" -#: models.py:183 +#: models.py:184 msgid "Not a valid item." msgstr "" -#: models.py:196 +#: models.py:197 msgid "A selected item is not a valid item." msgstr "" -#: models.py:207 +#: models.py:208 msgid "This item already exists." msgstr "" -#: models.py:372 models.py:686 models.py:1507 models.py:1519 models.py:1933 +#: models.py:373 models.py:688 models.py:1509 models.py:1521 models.py:1940 msgid "Label" msgstr "" -#: models.py:374 +#: models.py:375 msgid "Textual ID" msgstr "" -#: models.py:377 models.py:689 models.py:1476 +#: models.py:378 models.py:691 models.py:1478 msgid "Available" msgstr "" -#: models.py:713 models.py:2050 +#: models.py:715 models.py:2057 msgid "Key" msgstr "" -#: models.py:719 +#: models.py:721 msgid "Specific key to an import" msgstr "" -#: models.py:811 +#: models.py:813 msgid "Last editor" msgstr "" -#: models.py:814 +#: models.py:816 msgid "Creator" msgstr "" -#: models.py:956 models.py:2952 models.py:3008 +#: models.py:958 models.py:2962 models.py:3018 msgid "Order" msgstr "" -#: models.py:957 +#: models.py:959 msgid "Symmetrical" msgstr "" -#: models.py:958 +#: models.py:960 msgid "Tiny label" msgstr "" -#: models.py:972 +#: models.py:974 msgid "Cannot have symmetrical and an inverse_relation" msgstr "" -#: models.py:1088 +#: models.py:1090 msgid "Euro" msgstr "" -#: models.py:1089 +#: models.py:1091 msgid "US dollar" msgstr "" -#: models.py:1095 models.py:1760 +#: models.py:1097 models.py:1760 msgid "Slug" msgstr "" -#: models.py:1098 +#: models.py:1100 msgid "CSS color code for base module" msgstr "" -#: models.py:1100 +#: models.py:1102 msgid "Files module" msgstr "" -#: models.py:1102 +#: models.py:1104 msgid "CSS color code for files module" msgstr "" -#: models.py:1104 +#: models.py:1106 msgid "Context records module" msgstr "" -#: models.py:1107 +#: models.py:1109 msgid "CSS color code for context record module" msgstr "" -#: models.py:1109 +#: models.py:1111 msgid "Finds module" msgstr "" -#: models.py:1110 +#: models.py:1112 msgid "Need context records module" msgstr "" -#: models.py:1112 +#: models.py:1114 msgid "CSS color code for find module" msgstr "" -#: models.py:1115 +#: models.py:1117 msgid "Warehouses module" msgstr "" -#: models.py:1116 +#: models.py:1118 msgid "Need finds module" msgstr "" -#: models.py:1118 +#: models.py:1120 msgid "CSS code for warehouse module" msgstr "" -#: models.py:1120 +#: models.py:1122 msgid "Mapping module" msgstr "" -#: models.py:1122 +#: models.py:1124 msgid "CSS code for mapping module" msgstr "" -#: models.py:1125 +#: models.py:1127 msgid "Home page" msgstr "" -#: models.py:1126 +#: models.py:1128 #, python-brace-format msgid "" "Homepage of Ishtar - if not defined a default homepage will appear. Use the " "markdown syntax. {random_image} can be used to display a random image." msgstr "" -#: models.py:1130 +#: models.py:1132 msgid "File external id" msgstr "" -#: models.py:1132 +#: models.py:1134 msgid "" "Formula to manage file external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1137 +#: models.py:1139 msgid "Parcel external id" msgstr "" -#: models.py:1140 +#: models.py:1142 msgid "" "Formula to manage parcel external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1145 +#: models.py:1147 msgid "Context record external id" msgstr "" -#: models.py:1147 +#: models.py:1149 msgid "" "Formula to manage context record external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1152 +#: models.py:1154 msgid "Base find external id" msgstr "" -#: models.py:1154 +#: models.py:1156 msgid "" "Formula to manage base find external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1159 +#: models.py:1161 msgid "Find external id" msgstr "" -#: models.py:1161 +#: models.py:1163 msgid "" "Formula to manage find external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1166 +#: models.py:1168 msgid "Container external id" msgstr "" -#: models.py:1168 +#: models.py:1170 msgid "" "Formula to manage container external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1173 +#: models.py:1175 msgid "Warehouse external id" msgstr "" -#: models.py:1175 +#: models.py:1177 msgid "" "Formula to manage warehouse external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " "data can be destructive." msgstr "" -#: models.py:1180 +#: models.py:1182 msgid "Raw name for person" msgstr "" -#: models.py:1182 +#: models.py:1184 msgid "" "Formula to manage person raw_name. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " "be destructive." msgstr "" -#: models.py:1186 +#: models.py:1188 msgid "Current active" msgstr "" -#: models.py:1187 +#: models.py:1189 msgid "Currency" msgstr "" -#: models.py:1191 +#: models.py:1193 msgid "Ishtar site profile" msgstr "" -#: models.py:1192 +#: models.py:1194 msgid "Ishtar site profiles" msgstr "" -#: models.py:1261 +#: models.py:1263 msgid "Variable name" msgstr "" -#: models.py:1262 +#: models.py:1264 msgid "Description of the variable" msgstr "" -#: models.py:1264 models.py:2051 +#: models.py:1266 models.py:2058 msgid "Value" msgstr "" -#: models.py:1267 +#: models.py:1269 msgid "Global variable" msgstr "" -#: models.py:1377 models.py:1407 +#: models.py:1379 models.py:1409 msgid "Total" msgstr "" -#: models.py:1384 models.py:1508 models.py:1520 +#: models.py:1386 models.py:1510 models.py:1522 #: templates/ishtar/sheet_person.html:22 #: templates/ishtar/dashboards/dashboard_main_detail.html:141 #: templates/ishtar/dashboards/dashboard_main_detail_users.html:26 @@ -815,641 +830,633 @@ msgstr "" msgid "Number" msgstr "" -#: models.py:1471 +#: models.py:1473 msgid "Administrative Act" msgstr "" -#: models.py:1475 +#: models.py:1477 msgid "Associated object" msgstr "" -#: models.py:1479 +#: models.py:1481 msgid "Document template" msgstr "" -#: models.py:1480 +#: models.py:1482 msgid "Document templates" msgstr "" -#: models.py:1511 models.py:1521 models.py:2268 +#: models.py:1513 models.py:1523 models.py:2275 msgid "State" msgstr "" -#: models.py:1525 templates/blocks/JQueryAdvancedTown.html:12 +#: models.py:1527 templates/blocks/JQueryAdvancedTown.html:12 msgid "Department" msgstr "" -#: models.py:1526 +#: models.py:1528 msgid "Departments" msgstr "" -#: models.py:1563 +#: models.py:1565 msgid "Raw phone" msgstr "" -#: models.py:1569 +#: models.py:1571 msgid "Alternative address is prefered" msgstr "" -#: models.py:1608 +#: models.py:1610 msgid "Tel: " msgstr "" -#: models.py:1612 +#: models.py:1614 msgid "Mobile: " msgstr "" -#: models.py:1616 +#: models.py:1618 msgid "Email: " msgstr "" -#: models.py:1621 +#: models.py:1623 msgid "Merge key" msgstr "" -#: models.py:1695 +#: models.py:1697 msgid "Organization types" msgstr "" -#: models.py:1714 views.py:241 -msgid "Operation" -msgstr "" - -#: models.py:1716 -msgid "Archaeological site" +#: models.py:1743 +msgid "Class name" msgstr "" -#: models.py:1717 -msgid "Parcels" +#: models.py:1746 +msgid "Importer - Model" msgstr "" -#: models.py:1719 -msgid "Operation source" +#: models.py:1747 +msgid "Importer - Models" msgstr "" -#: models.py:1722 views.py:1364 views.py:1414 -msgid "Archaeological files" -msgstr "" - -#: models.py:1724 views.py:1367 views.py:1422 -msgid "Context records" -msgstr "" - -#: models.py:1726 -msgid "Context record relations" +#: models.py:1764 templates/ishtar/dashboards/dashboard_main.html:25 +msgid "Users" msgstr "" -#: models.py:1728 -msgid "Base finds" +#: models.py:1767 +msgid "Associated model" msgstr "" -#: models.py:1764 templates/ishtar/dashboards/dashboard_main.html:25 -msgid "Users" +#: models.py:1770 +msgid "Models that can accept new items" msgstr "" -#: models.py:1766 -msgid "Associated model" +#: models.py:1771 +msgid "Leave blank for no restrictions" msgstr "" -#: models.py:1769 +#: models.py:1773 msgid "Is template" msgstr "" -#: models.py:1770 +#: models.py:1774 msgid "Unicity keys (separator \";\")" msgstr "" -#: models.py:1774 +#: models.py:1778 msgid "Importer - Type" msgstr "" -#: models.py:1775 +#: models.py:1779 msgid "Importer - Types" msgstr "" -#: models.py:1865 +#: models.py:1872 msgid "Importer - Default" msgstr "" -#: models.py:1866 +#: models.py:1873 msgid "Importer - Defaults" msgstr "" -#: models.py:1901 +#: models.py:1908 msgid "Importer - Default value" msgstr "" -#: models.py:1902 +#: models.py:1909 msgid "Importer - Default values" msgstr "" -#: models.py:1935 +#: models.py:1942 msgid "Column number" msgstr "" -#: models.py:1938 +#: models.py:1945 msgid "Required" msgstr "" -#: models.py:1941 +#: models.py:1948 msgid "Importer - Column" msgstr "" -#: models.py:1942 +#: models.py:1949 msgid "Importer - Columns" msgstr "" -#: models.py:1962 +#: models.py:1969 msgid "Field name" msgstr "" -#: models.py:1964 models.py:1998 +#: models.py:1971 models.py:2005 msgid "Force creation of new items" msgstr "" -#: models.py:1966 models.py:2000 +#: models.py:1973 models.py:2007 msgid "Concatenate with existing" msgstr "" -#: models.py:1968 models.py:2002 +#: models.py:1975 models.py:2009 msgid "Concatenate character" msgstr "" -#: models.py:1972 +#: models.py:1979 msgid "Importer - Duplicate field" msgstr "" -#: models.py:1973 +#: models.py:1980 msgid "Importer - Duplicate fields" msgstr "" -#: models.py:1980 +#: models.py:1987 msgid "Regular expression" msgstr "" -#: models.py:1983 +#: models.py:1990 msgid "Importer - Regular expression" msgstr "" -#: models.py:1984 +#: models.py:1991 msgid "Importer - Regular expressions" msgstr "" -#: models.py:2007 +#: models.py:2014 msgid "Importer - Target" msgstr "" -#: models.py:2008 +#: models.py:2015 msgid "Importer - Targets" msgstr "" -#: models.py:2032 views.py:545 +#: models.py:2039 views.py:545 msgid "True" msgstr "" -#: models.py:2033 views.py:547 +#: models.py:2040 views.py:547 msgid "False" msgstr "" -#: models.py:2052 +#: models.py:2059 msgid "Is set" msgstr "" -#: models.py:2059 +#: models.py:2066 msgid "Importer - Target key" msgstr "" -#: models.py:2060 +#: models.py:2067 msgid "Importer - Targets keys" msgstr "" -#: models.py:2112 models.py:2851 models.py:2864 +#: models.py:2119 models.py:2874 msgid "Format" msgstr "" -#: models.py:2113 models.py:2956 +#: models.py:2120 models.py:2966 msgid "Operation type" msgstr "" -#: models.py:2114 +#: models.py:2121 msgid "Period" msgstr "" -#: models.py:2115 +#: models.py:2122 msgid "Report state" msgstr "" -#: models.py:2116 +#: models.py:2123 msgid "Remain type" msgstr "" -#: models.py:2117 +#: models.py:2124 msgid "Unit" msgstr "" -#: models.py:2118 +#: models.py:2125 msgid "Activity type" msgstr "" -#: models.py:2119 +#: models.py:2126 msgid "Material" msgstr "" -#: models.py:2121 +#: models.py:2128 msgid "Conservatory state" msgstr "" -#: models.py:2122 +#: models.py:2129 msgid "Container type" msgstr "" -#: models.py:2123 +#: models.py:2130 msgid "Preservation type" msgstr "" -#: models.py:2124 +#: models.py:2131 msgid "Object type" msgstr "" -#: models.py:2125 +#: models.py:2132 msgid "Integrity type" msgstr "" -#: models.py:2126 +#: models.py:2133 msgid "Remarkability type" msgstr "" -#: models.py:2127 +#: models.py:2134 msgid "Batch type" msgstr "" -#: models.py:2129 +#: models.py:2136 msgid "Identification type" msgstr "" -#: models.py:2131 +#: models.py:2138 msgid "Context record relation type" msgstr "" -#: models.py:2132 models.py:3014 +#: models.py:2139 models.py:3024 msgid "Spatial reference system" msgstr "" -#: models.py:2133 models.py:2843 +#: models.py:2140 models.py:2852 msgid "Support type" msgstr "" -#: models.py:2134 models.py:2510 +#: models.py:2141 models.py:2517 msgid "Title type" msgstr "" -#: models.py:2140 +#: models.py:2147 msgid "Integer" msgstr "" -#: models.py:2141 +#: models.py:2148 msgid "Float" msgstr "" -#: models.py:2142 +#: models.py:2149 msgid "String" msgstr "" -#: models.py:2143 templates/sheet_ope.html:86 +#: models.py:2150 templates/sheet_ope.html:86 msgid "Date" msgstr "" -#: models.py:2145 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 +#: models.py:2152 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 #: templates/ishtar/dashboards/dashboard_main_detail.html:126 msgid "Year" msgstr "" -#: models.py:2146 +#: models.py:2153 msgid "String to boolean" msgstr "" -#: models.py:2147 +#: models.py:2154 msgctxt "filesystem" msgid "File" msgstr "" -#: models.py:2148 +#: models.py:2155 msgid "Unknow type" msgstr "" -#: models.py:2164 +#: models.py:2171 msgid "4 digit year. e.g.: \"2015\"" msgstr "" -#: models.py:2165 +#: models.py:2172 msgid "4 digit year/month/day. e.g.: \"2015/02/04\"" msgstr "" -#: models.py:2166 +#: models.py:2173 msgid "Day/month/4 digit year. e.g.: \"04/02/2015\"" msgstr "" -#: models.py:2176 +#: models.py:2183 msgid "Options" msgstr "" -#: models.py:2178 +#: models.py:2185 msgid "Split character(s)" msgstr "" -#: models.py:2182 +#: models.py:2189 msgid "Importer - Formater type" msgstr "" -#: models.py:2183 +#: models.py:2190 msgid "Importer - Formater types" msgstr "" -#: models.py:2232 templates/ishtar/dashboards/dashboard_main_detail.html:63 +#: models.py:2239 templates/ishtar/dashboards/dashboard_main_detail.html:63 msgid "Created" msgstr "" -#: models.py:2233 +#: models.py:2240 msgid "Analyse in progress" msgstr "" -#: models.py:2234 +#: models.py:2241 msgid "Analysed" msgstr "" -#: models.py:2235 +#: models.py:2242 msgid "Import pending" msgstr "" -#: models.py:2236 +#: models.py:2243 msgid "Import in progress" msgstr "" -#: models.py:2237 +#: models.py:2244 msgid "Finished with errors" msgstr "" -#: models.py:2238 +#: models.py:2245 msgid "Finished" msgstr "" -#: models.py:2239 +#: models.py:2246 msgid "Archived" msgstr "" -#: models.py:2252 +#: models.py:2259 msgid "Imported file" msgstr "" -#: models.py:2254 +#: models.py:2261 msgid "Associated images (zip file)" msgstr "" -#: models.py:2256 +#: models.py:2263 msgid "Encoding" msgstr "" -#: models.py:2258 +#: models.py:2265 msgid "Skip lines" msgstr "" -#: models.py:2259 templates/ishtar/import_list.html:47 +#: models.py:2266 templates/ishtar/import_list.html:47 msgid "Error file" msgstr "" -#: models.py:2262 +#: models.py:2269 msgid "Result file" msgstr "" -#: models.py:2265 templates/ishtar/import_list.html:53 +#: models.py:2272 templates/ishtar/import_list.html:53 msgid "Match file" msgstr "" -#: models.py:2271 +#: models.py:2278 msgid "Conservative import" msgstr "" -#: models.py:2276 +#: models.py:2283 msgid "End date" msgstr "" -#: models.py:2278 +#: models.py:2285 msgid "Remaining seconds" msgstr "" -#: models.py:2283 +#: models.py:2290 msgid "Import" msgstr "" -#: models.py:2300 +#: models.py:2307 msgid "Analyse" msgstr "" -#: models.py:2302 models.py:2305 +#: models.py:2309 models.py:2312 msgid "Re-analyse" msgstr "" -#: models.py:2303 +#: models.py:2310 msgid "Launch import" msgstr "" -#: models.py:2306 +#: models.py:2313 msgid "Re-import" msgstr "" -#: models.py:2307 +#: models.py:2314 msgid "Archive" msgstr "" -#: models.py:2309 +#: models.py:2316 msgid "Unarchive" msgstr "" -#: models.py:2310 widgets.py:130 templates/ishtar/form_delete.html:11 +#: models.py:2317 widgets.py:130 templates/ishtar/form_delete.html:11 msgid "Delete" msgstr "" -#: models.py:2451 +#: models.py:2458 msgid "Organizations" msgstr "" -#: models.py:2453 +#: models.py:2460 msgid "Can view all Organizations" msgstr "" -#: models.py:2454 +#: models.py:2461 msgid "Can view own Organization" msgstr "" -#: models.py:2455 +#: models.py:2462 msgid "Can add own Organization" msgstr "" -#: models.py:2457 +#: models.py:2464 msgid "Can change own Organization" msgstr "" -#: models.py:2459 +#: models.py:2466 msgid "Can delete own Organization" msgstr "" -#: models.py:2494 +#: models.py:2501 msgid "Groups" msgstr "" -#: models.py:2499 +#: models.py:2506 msgid "Person types" msgstr "" -#: models.py:2511 +#: models.py:2518 msgid "Title types" msgstr "" -#: models.py:2520 +#: models.py:2527 msgid "Mr" msgstr "" -#: models.py:2521 +#: models.py:2528 msgid "Miss" msgstr "" -#: models.py:2522 +#: models.py:2529 msgid "Mr and Mrs" msgstr "" -#: models.py:2523 +#: models.py:2530 msgid "Mrs" msgstr "" -#: models.py:2524 +#: models.py:2531 msgid "Doctor" msgstr "" -#: models.py:2557 +#: models.py:2564 msgid "Contact type" msgstr "" -#: models.py:2560 models.py:2624 +#: models.py:2567 models.py:2631 msgid "Types" msgstr "" -#: models.py:2563 +#: models.py:2570 msgid "Is attached to" msgstr "" -#: models.py:2568 +#: models.py:2575 msgid "Persons" msgstr "" -#: models.py:2570 +#: models.py:2577 msgid "Can view all Persons" msgstr "" -#: models.py:2571 +#: models.py:2578 msgid "Can view own Person" msgstr "" -#: models.py:2572 +#: models.py:2579 msgid "Can add own Person" msgstr "" -#: models.py:2573 +#: models.py:2580 msgid "Can change own Person" msgstr "" -#: models.py:2574 +#: models.py:2581 msgid "Can delete own Person" msgstr "" -#: models.py:2752 +#: models.py:2759 msgid "Advanced shortcut menu" msgstr "" -#: models.py:2755 +#: models.py:2762 msgid "Ishtar user" msgstr "" -#: models.py:2756 +#: models.py:2763 msgid "Ishtar users" msgstr "" -#: models.py:2798 +#: models.py:2805 msgid "To modify the password use the form in Auth > User" msgstr "" -#: models.py:2804 +#: models.py:2811 msgid "Author types" msgstr "" -#: models.py:2836 +#: models.py:2844 msgid "Source types" msgstr "" -#: models.py:2844 +#: models.py:2853 msgid "Support types" msgstr "" -#: models.py:2852 -msgid "Formats" +#: models.py:2860 +msgid "Format type" +msgstr "" + +#: models.py:2861 +msgid "Format types" msgstr "" -#: models.py:2859 +#: models.py:2869 msgid "External ID" msgstr "" -#: models.py:2862 +#: models.py:2872 msgid "Support" msgstr "" -#: models.py:2866 +#: models.py:2876 msgid "Scale" msgstr "" -#: models.py:2880 +#: models.py:2890 msgid "Item number" msgstr "" -#: models.py:2881 +#: models.py:2891 msgid "Ref." msgstr "" -#: models.py:2884 +#: models.py:2894 msgid "Internal ref." msgstr "" -#: models.py:2927 +#: models.py:2937 msgid "Surface (m2)" msgstr "" -#: models.py:2928 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 +#: models.py:2938 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 msgid "Localisation" msgstr "" -#: models.py:2953 +#: models.py:2963 msgid "Is preventive" msgstr "" -#: models.py:2957 +#: models.py:2967 msgid "Operation types" msgstr "" -#: models.py:2986 +#: models.py:2996 msgid "Preventive" msgstr "" -#: models.py:2987 +#: models.py:2997 msgid "Research" msgstr "" -#: models.py:3010 +#: models.py:3020 msgid "Authority name" msgstr "" -#: models.py:3011 +#: models.py:3021 msgid "Authority SRID" msgstr "" -#: models.py:3015 +#: models.py:3025 msgid "Spatial reference systems" msgstr "" @@ -1497,6 +1504,10 @@ msgstr "" msgid "Archaeological file" msgstr "" +#: views.py:241 +msgid "Operation" +msgstr "" + #: views.py:243 msgid "Context record" msgstr "" @@ -1513,48 +1524,56 @@ msgstr "" msgid "Treatment" msgstr "" -#: views.py:1303 views.py:1346 +#: views.py:1304 views.py:1347 msgid "Operation not permitted." msgstr "" -#: views.py:1305 +#: views.py:1306 #, python-format msgid "New %s" msgstr "" -#: views.py:1365 views.py:1418 +#: views.py:1365 views.py:1415 +msgid "Archaeological files" +msgstr "" + +#: views.py:1366 views.py:1419 msgid "Operations" msgstr "" -#: views.py:1369 views.py:1425 +#: views.py:1368 views.py:1423 +msgid "Context records" +msgstr "" + +#: views.py:1370 views.py:1426 msgid "Finds" msgstr "" -#: views.py:1618 templates/ishtar/import_list.html:43 +#: views.py:1619 templates/ishtar/import_list.html:43 msgid "Link unmatched items" msgstr "" -#: views.py:1633 +#: views.py:1634 msgid "Delete import" msgstr "" -#: views.py:1672 +#: views.py:1673 msgid "Merge persons" msgstr "" -#: views.py:1696 +#: views.py:1697 msgid "Select the main person" msgstr "" -#: views.py:1705 +#: views.py:1706 msgid "Merge organization" msgstr "" -#: views.py:1715 +#: views.py:1716 msgid "Select the main organization" msgstr "" -#: views.py:1755 views.py:1771 +#: views.py:1756 views.py:1772 msgid "Corporation manager" msgstr "" diff --git a/translations/fr/archaeological_context_records.po b/translations/fr/archaeological_context_records.po index 633a55cec..f25806fc8 100644 --- a/translations/fr/archaeological_context_records.po +++ b/translations/fr/archaeological_context_records.po @@ -9,8 +9,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-02 10:17-0500\n" -"Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n" +"PO-Revision-Date: 2017-02-05 05:22-0500\n" +"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n" "Language-Team: \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=n>1;\n" @@ -264,12 +264,12 @@ msgid "Dating types" msgstr "Types de datation" #: models.py:47 -msgid "Dating quality" -msgstr "Qualité de datation" +msgid "Dating quality type" +msgstr "Type de qualité de datation" #: models.py:48 -msgid "Dating qualities" -msgstr "Qualités de datation" +msgid "Dating quality types" +msgstr "Types de qualité de datation" #: models.py:62 msgid "Precise dating" @@ -364,24 +364,24 @@ msgid "" "\"Terminus Ante Quem\" the context record can't have been created after this " "date" msgstr "" -"« Terminus Ante Quem » l'Unité d'Enregistrement ne peut avoir été créée " -"après cette date" +"« Terminus Ante Quem ». L'Unité d'Enregistrement ne peut avoir été créée " +"après cette date." #: models.py:209 msgid "Estimation of a \"Terminus Ante Quem\"" -msgstr "Estimation d'un « Terminus Ante Quem »" +msgstr "Estimation d'un « Terminus Ante Quem »." #: models.py:212 msgid "" "\"Terminus Post Quem\" the context record can't have been created before " "this date" msgstr "" -"« Terminus Post Quem » l'Unité d'Enregistrement ne peut avoir été créée " -"avant cette date" +"« Terminus Post Quem ». L'Unité d'Enregistrement ne peut avoir été créée " +"avant cette date." #: models.py:216 msgid "Estimation of a \"Terminus Post Quem\"" -msgstr "Estimation d'un « Terminus Post Quem »" +msgstr "Estimation d'un « Terminus Post Quem »." #: models.py:224 msgid "Point" @@ -554,7 +554,7 @@ msgstr "Dossier actif" #: templates/ishtar/sheet_contextrecord.html:76 msgid "Closed operation" -msgstr "Opération fermée" +msgstr "Opération close" #: templates/ishtar/sheet_contextrecord.html:78 msgid "Closing date:" diff --git a/translations/fr/archaeological_files.po b/translations/fr/archaeological_files.po index 61dcf1376..17b2d6784 100644 --- a/translations/fr/archaeological_files.po +++ b/translations/fr/archaeological_files.po @@ -11,7 +11,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-02 10:01-0500\n" +"PO-Revision-Date: 2017-02-05 05:21-0500\n" "Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n" "Language-Team: \n" "Language: fr\n" @@ -410,7 +410,7 @@ msgstr "Peut supprimer son propre Dossier" #: models.py:230 msgid "Can close File" -msgstr "Peut fermer un Dossier" +msgstr "Peut clore un Dossier" #: models.py:236 msgid "FILE" @@ -494,7 +494,7 @@ msgstr "Dossier actif" #: templates/ishtar/sheet_file.html:37 msgid "Closed file" -msgstr "Dossier fermé" +msgstr "Dossier clos" #: templates/ishtar/sheet_file.html:39 msgid "Closing date:" diff --git a/translations/fr/archaeological_finds.po b/translations/fr/archaeological_finds.po index 88e73087a..609ad25c3 100644 --- a/translations/fr/archaeological_finds.po +++ b/translations/fr/archaeological_finds.po @@ -9,8 +9,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-02 09:58-0500\n" -"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n" +"PO-Revision-Date: 2017-02-05 05:22-0500\n" +"Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n" "Language-Team: \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=n>1;\n" @@ -1274,7 +1274,7 @@ msgstr "Documentation associée au mobilier" #: templates/ishtar/sheet_treatment.html:20 msgctxt "Treatment" msgid "Closed" -msgstr "Clôturé" +msgstr "Close" #: templates/ishtar/sheet_treatment.html:22 msgctxt "Treatment" @@ -1292,7 +1292,7 @@ msgstr "Opérations associées" #: templates/ishtar/sheet_treatmentfile.html:16 msgctxt "Treatment request" msgid "Closed" -msgstr "Clôturée" +msgstr "Close" #: templates/ishtar/sheet_treatmentfile.html:18 msgctxt "Treatment request" diff --git a/translations/fr/archaeological_operations.po b/translations/fr/archaeological_operations.po index df903a8ec..cdb8dd3be 100644 --- a/translations/fr/archaeological_operations.po +++ b/translations/fr/archaeological_operations.po @@ -11,8 +11,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-02 10:02-0500\n" -"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n" +"PO-Revision-Date: 2017-02-06 09:32-0500\n" +"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n" "Language-Team: \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=n>1;\n" @@ -701,7 +701,7 @@ msgstr "Année - Index" #: models.py:234 msgid "Associated file (label)" -msgstr "Fichier associé (nom)" +msgstr "Dossier associé (nom)" #: models.py:235 msgid "Operator name" @@ -713,7 +713,7 @@ msgstr "Responsable scientifique (nom complet)" #: models.py:237 msgid "Associated file (external ID)" -msgstr "Fichier associé (identifiant externe)" +msgstr "Dossier associé (identifiant externe)" #: models.py:238 msgid "Scientist (title)" @@ -812,7 +812,7 @@ msgstr "Peut supprimer sa propre Opération" #: models.py:377 msgid "Can close Operation" -msgstr "Peut fermer une Opération" +msgstr "Peut clore une Opération" #: models.py:406 msgid "OPE" @@ -1146,7 +1146,7 @@ msgstr "Dossier actif" #: templates/ishtar/sheet_operation.html:35 msgid "Closed operation" -msgstr "Opération fermée" +msgstr "Opération close" #: templates/ishtar/sheet_operation.html:36 msgid "Closing date:" diff --git a/translations/fr/archaeological_warehouse.po b/translations/fr/archaeological_warehouse.po index 7071aec57..e7bdbe6f6 100644 --- a/translations/fr/archaeological_warehouse.po +++ b/translations/fr/archaeological_warehouse.po @@ -9,8 +9,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-02 10:17-0500\n" -"Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n" +"PO-Revision-Date: 2017-02-04 08:26-0500\n" +"Last-Translator: Copied by Zanata <copied-by-zanata@zanata.org>\n" "Language-Team: \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=n>1;\n" @@ -176,7 +176,7 @@ msgstr "Contenants" #: models.py:37 msgid "Warehouse types" -msgstr "Types de dépôts" +msgstr "Types de dépôt" #: models.py:56 models.py:186 msgid "External ID" diff --git a/translations/fr/ishtar_common.po b/translations/fr/ishtar_common.po index a5cd454fd..ef36de26d 100644 --- a/translations/fr/ishtar_common.po +++ b/translations/fr/ishtar_common.po @@ -11,8 +11,8 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" "Content-Type: text/plain; charset=UTF-8\n" -"PO-Revision-Date: 2017-02-03 04:25-0500\n" -"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n" +"PO-Revision-Date: 2017-02-06 09:49-0500\n" +"Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n" "Language-Team: \n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=n>1;\n" @@ -30,54 +30,58 @@ msgstr "courriel" msgid "Related item" msgstr "Élément associé" -#: data_importer.py:182 +#: admin.py:79 +msgid "Export selected as CSV file" +msgstr "Exporter la sélection en fichier CSV" + +#: data_importer.py:183 #, 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:199 +#: data_importer.py:200 #, python-format msgid "\"%(value)s\" not equal to yes or no" msgstr "\"%(value)s\" diffère de oui ou non" -#: data_importer.py:211 +#: data_importer.py:212 #, python-format msgid "\"%(value)s\" is not a float" msgstr "\"%(value)s\" n'est pas un nombre à virgule" -#: data_importer.py:224 data_importer.py:238 data_importer.py:482 +#: data_importer.py:225 data_importer.py:239 data_importer.py:483 #, python-format msgid "\"%(value)s\" is not a valid date" msgstr "\"%(value)s\" n'est pas une date valide" -#: data_importer.py:251 +#: data_importer.py:252 #, python-format msgid "\"%(value)s\" is not an integer" msgstr "\"%(value)s\" n'est pas un entier" -#: data_importer.py:302 data_importer.py:545 +#: data_importer.py:303 data_importer.py:546 #, 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:309 +#: data_importer.py:310 #, python-format msgid "%d. None of the above - create new" msgstr "%d. Aucun de ceux-là - créer un nouveau" -#: data_importer.py:312 +#: data_importer.py:313 #, python-format msgid "%d. None of the above - skip" msgstr "%d. Aucun de ceux-là - passer" -#: data_importer.py:508 +#: data_importer.py:509 #, python-format msgid "\"%(value)s\" is not a valid path for the given archive" msgstr "\"%(value)s\" n'est pas un chemin valide pour cette archive" -#: data_importer.py:620 +#: data_importer.py:623 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 " @@ -87,57 +91,73 @@ msgstr "" "utilisez un fichier CSV : vérifiez que le séparateur de colonnes et " "l'encodage sont similaires à ceux du fichier de référence." -#: data_importer.py:624 +#: data_importer.py:627 #, 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:626 +#: data_importer.py:629 msgid "No data provided" msgstr "Aucune donnée fournie" -#: data_importer.py:627 +#: data_importer.py:630 msgid "Value is required" msgstr "Valeur requise" -#: data_importer.py:628 +#: data_importer.py:631 #, python-format msgid "At least %d columns must be filled" msgstr "Au moins %d colonnes doivent être remplies" -#: data_importer.py:629 +#: data_importer.py:632 msgid "The regexp doesn't match." msgstr "L'expression régulière ne fonctionne pas." -#: data_importer.py:1037 +#: data_importer.py:634 +msgid "" +"Forced creation is set for model {} but this model is not in the list of " +"models allowed to be created." +msgstr "" +"La création forcée est possible pour le modèle {} mais ce modèle ne fait pas " +"partie de la liste des créations de modèle autorisées." + +#: data_importer.py:636 +msgid "" +"{} with values {} doesn't exist in the database. Create it first or fix your " +"source file." +msgstr "" +"L'élément {} avec les valeurs {} n'existe pas dans la base de données. Créez-" +"le d'abord ou corrigez votre fichier source." + +#: data_importer.py:1089 msgid "Not imported" msgstr "Non importé" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "line" msgstr "ligne" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "col" msgstr "colonne" -#: data_importer.py:1444 +#: data_importer.py:1522 msgid "error" msgstr "erreur" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "field" msgstr "champ" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "source" msgstr "source" -#: data_importer.py:1450 +#: data_importer.py:1528 msgid "result" msgstr "résultat" -#: data_importer.py:1466 +#: data_importer.py:1544 #, python-format msgid "\"%(value)s\" not in %(values)s" msgstr "\"%(value)s\" n'est pas dans %(values)s" @@ -170,12 +190,12 @@ msgstr "Vous devez sélectionner un élément." msgid "Add a new item" msgstr "Ajouter un nouvel élément" -#: forms.py:262 models.py:1473 +#: forms.py:262 models.py:1475 msgid "Template" msgstr "Patron" #: forms_common.py:41 forms_common.py:59 forms_common.py:182 -#: forms_common.py:406 models.py:1539 models.py:2940 +#: forms_common.py:406 models.py:1541 models.py:2950 #: templates/blocks/JQueryAdvancedTown.html:19 #: templates/ishtar/sheet_organization.html:13 msgid "Town" @@ -198,9 +218,8 @@ 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:68 forms_common.py:855 ishtar_menu.py:47 models.py:1712 -#: models.py:2567 models.py:2749 models.py:2810 -#: templates/ishtar/sheet_person.html:4 +#: forms_common.py:68 forms_common.py:855 ishtar_menu.py:47 models.py:2574 +#: models.py:2756 models.py:2818 templates/ishtar/sheet_person.html:4 msgid "Person" msgstr "Personne" @@ -213,63 +232,63 @@ msgstr "" "pas possible." #: forms_common.py:170 forms_common.py:327 forms_common.py:451 -#: ishtar_menu.py:75 models.py:1713 models.py:2450 models.py:2541 +#: ishtar_menu.py:75 models.py:2457 models.py:2548 #: templates/ishtar/sheet_organization.html:4 msgid "Organization" msgstr "Organisation" #: forms_common.py:173 forms_common.py:210 forms_common.py:322 -#: forms_common.py:376 forms_common.py:446 models.py:1094 models.py:1472 -#: models.py:1758 models.py:1977 models.py:2444 models.py:2553 models.py:2926 -#: templates/ishtar/sheet_organization.html:8 +#: forms_common.py:376 forms_common.py:446 models.py:1096 models.py:1474 +#: models.py:1742 models.py:1758 models.py:1984 models.py:2451 models.py:2560 +#: models.py:2936 templates/ishtar/sheet_organization.html:8 #: templates/ishtar/sheet_organization.html:21 msgid "Name" msgstr "Nom" -#: forms_common.py:174 models.py:1694 models.py:2108 +#: forms_common.py:174 models.py:1696 models.py:2115 msgid "Organization type" msgstr "Type d'organisation" -#: forms_common.py:176 forms_common.py:400 models.py:1534 +#: forms_common.py:176 forms_common.py:400 models.py:1536 #: templates/ishtar/sheet_organization.html:10 msgid "Address" msgstr "Adresse" -#: forms_common.py:178 forms_common.py:403 models.py:1535 +#: forms_common.py:178 forms_common.py:403 models.py:1537 #: templates/ishtar/sheet_organization.html:11 msgid "Address complement" msgstr "Complément d'adresse" -#: forms_common.py:180 forms_common.py:404 models.py:1537 +#: forms_common.py:180 forms_common.py:404 models.py:1539 #: templates/ishtar/sheet_organization.html:12 msgid "Postal code" msgstr "Code postal" -#: forms_common.py:183 forms_common.py:407 models.py:1540 +#: forms_common.py:183 forms_common.py:407 models.py:1542 msgid "Country" msgstr "Pays" #: forms_common.py:185 forms_common.py:324 forms_common.py:380 -#: forms_common.py:448 forms_common.py:572 models.py:1567 +#: forms_common.py:448 forms_common.py:572 models.py:1569 msgid "Email" msgstr "Courriel" -#: forms_common.py:186 forms_common.py:383 models.py:1552 +#: forms_common.py:186 forms_common.py:383 models.py:1554 #: templates/ishtar/sheet_organization.html:14 #: templates/ishtar/sheet_person.html:19 #: templates/ishtar/wizard/wizard_person.html:17 msgid "Phone" msgstr "Téléphone" -#: forms_common.py:187 forms_common.py:392 models.py:1564 +#: forms_common.py:187 forms_common.py:392 models.py:1566 #: templates/ishtar/sheet_organization.html:15 #: templates/ishtar/sheet_person.html:37 #: templates/ishtar/wizard/wizard_person.html:35 msgid "Mobile phone" msgstr "Téléphone portable" -#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2144 -#: models.py:2446 models.py:2861 templates/sheet_ope.html:85 +#: forms_common.py:211 forms_common.py:325 forms_common.py:449 models.py:2151 +#: models.py:2453 models.py:2871 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:23 @@ -293,7 +312,7 @@ msgstr "Fusionner tous les éléments dans" msgid "Organization to merge" msgstr "Organisation à fusionner" -#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2551 +#: forms_common.py:323 forms_common.py:374 forms_common.py:447 models.py:2558 #: templates/ishtar/sheet_organization.html:22 msgid "Surname" msgstr "Prénom" @@ -311,25 +330,25 @@ msgstr "Personne à fusionner" msgid "Identity" msgstr "Identité" -#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2109 -#: models.py:2545 models.py:2547 models.py:2858 templates/sheet_ope.html:104 +#: forms_common.py:371 forms_common.py:773 forms_common.py:822 models.py:2116 +#: models.py:2552 models.py:2554 models.py:2868 templates/sheet_ope.html:104 #: templates/ishtar/blocks/window_tables/documents.html:7 msgid "Title" msgstr "Titre" -#: forms_common.py:372 models.py:2549 +#: forms_common.py:372 models.py:2556 msgid "Salutation" msgstr "Formule d'appel" -#: forms_common.py:378 models.py:2555 +#: forms_common.py:378 models.py:2562 msgid "Raw name" msgstr "Nom brut" -#: forms_common.py:381 models.py:1553 +#: forms_common.py:381 models.py:1555 msgid "Phone description" msgstr "Type de téléphone" -#: forms_common.py:384 models.py:1555 models.py:1557 +#: forms_common.py:384 models.py:1557 models.py:1559 msgid "Phone description 2" msgstr "Type de téléphone 2" @@ -337,11 +356,11 @@ msgstr "Type de téléphone 2" msgid "Phone 2" msgstr "Téléphone 2" -#: forms_common.py:388 models.py:1561 +#: forms_common.py:388 models.py:1563 msgid "Phone description 3" msgstr "Type de téléphone 3" -#: forms_common.py:390 models.py:1559 +#: forms_common.py:390 models.py:1561 msgid "Phone 3" msgstr "Téléphone 3" @@ -349,23 +368,23 @@ msgstr "Téléphone 3" msgid "Current organization" msgstr "Organisation actuelle" -#: forms_common.py:409 models.py:1542 +#: forms_common.py:409 models.py:1544 msgid "Other address: address" msgstr "Autre adresse : adresse" -#: forms_common.py:412 models.py:1545 +#: forms_common.py:412 models.py:1547 msgid "Other address: address complement" msgstr "Autre adresse : complément d'adresse" -#: forms_common.py:414 models.py:1546 +#: forms_common.py:414 models.py:1548 msgid "Other address: postal code" msgstr "Autre adresse : code postal" -#: forms_common.py:416 models.py:1548 +#: forms_common.py:416 models.py:1550 msgid "Other address: town" msgstr "Autre adresse : ville" -#: forms_common.py:418 models.py:1550 +#: forms_common.py:418 models.py:1552 msgid "Other address: country" msgstr "Autre adresse : pays" @@ -381,7 +400,7 @@ msgstr "Nom d'utilisateur" msgid "Account search" msgstr "Rechercher un compte" -#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2498 +#: forms_common.py:510 forms_common.py:550 forms_common.py:554 models.py:2505 msgid "Person type" msgstr "Type de personne" @@ -413,7 +432,7 @@ msgstr "Ce nom d'utilisateur existe déjà." msgid "Send the new password by email?" msgstr "Envoyer le nouveau mot de passe par courriel ?" -#: forms_common.py:628 forms_common.py:641 models.py:2941 +#: forms_common.py:628 forms_common.py:641 models.py:2951 msgid "Towns" msgstr "Communes" @@ -429,7 +448,7 @@ msgstr "Seul un choix peut être coché." msgid "Documentation informations" msgstr "Information sur le document" -#: forms_common.py:775 forms_common.py:823 models.py:2110 models.py:2835 +#: forms_common.py:775 forms_common.py:823 models.py:2117 models.py:2843 msgid "Source type" msgstr "Type de document" @@ -441,37 +460,37 @@ msgstr "Référence" msgid "Internal reference" msgstr "Référence interne" -#: forms_common.py:783 models.py:2872 +#: forms_common.py:783 models.py:2882 msgid "Numerical ressource (web address)" msgstr "Ressource numérique (adresse web)" -#: forms_common.py:784 models.py:2874 +#: forms_common.py:784 models.py:2884 msgid "Receipt date" msgstr "Date de réception" -#: forms_common.py:786 models.py:2273 models.py:2876 +#: forms_common.py:786 models.py:2280 models.py:2886 msgid "Creation date" msgstr "Date de création" -#: forms_common.py:789 models.py:2879 +#: forms_common.py:789 models.py:2889 msgid "Receipt date in documentation" msgstr "Date de réception en documentation" -#: forms_common.py:791 forms_common.py:827 models.py:376 models.py:687 -#: models.py:2004 models.py:2559 models.py:2886 +#: forms_common.py:791 forms_common.py:827 models.py:377 models.py:689 +#: models.py:2011 models.py:2566 models.py:2896 msgid "Comment" msgstr "Commentaire" -#: forms_common.py:793 forms_common.py:826 models.py:1096 models.py:1762 -#: models.py:1936 models.py:1978 models.py:2885 templates/sheet_ope.html:128 +#: forms_common.py:793 forms_common.py:826 models.py:1098 models.py:1762 +#: models.py:1943 models.py:1985 models.py:2895 templates/sheet_ope.html:128 msgid "Description" msgstr "Description" -#: forms_common.py:796 models.py:2887 +#: forms_common.py:796 models.py:2897 msgid "Additional information" -msgstr "Informations supplémentaires" +msgstr "Information supplémentaire" -#: forms_common.py:798 forms_common.py:830 models.py:2889 +#: forms_common.py:798 forms_common.py:830 models.py:2899 msgid "Has a duplicate" msgstr "Existe en doublon" @@ -488,20 +507,20 @@ msgstr "" "<p>Les images trop grandes sont retaillées en : %(width)dx%(height)d (le " "ratio est conservé).</p>" -#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2815 +#: forms_common.py:819 forms_common.py:848 forms_common.py:882 models.py:2823 #: templates/ishtar/wizard/wizard_person_deletion.html:124 msgid "Author" msgstr "Auteur" #: forms_common.py:829 msgid "Additional informations" -msgstr "Informations complémentaires" +msgstr "Informations supplémentaires" #: forms_common.py:840 msgid "Would you like to delete this documentation?" msgstr "Voulez-vous supprimer ce document ?" -#: forms_common.py:856 models.py:2111 models.py:2803 models.py:2812 +#: forms_common.py:856 models.py:2118 models.py:2810 models.py:2820 msgid "Author type" msgstr "Type d'auteur" @@ -513,7 +532,7 @@ msgstr "Sélection d'auteur" msgid "There are identical authors." msgstr "Il y a des auteurs identiques." -#: forms_common.py:893 models.py:2816 models.py:2868 +#: forms_common.py:893 models.py:2824 models.py:2878 #: templates/sheet_ope.html:106 #: templates/ishtar/blocks/window_tables/documents.html:9 msgid "Authors" @@ -531,7 +550,7 @@ msgstr "Ajout/modification" msgid "Deletion" msgstr "Suppression" -#: ishtar_menu.py:39 models.py:1268 views.py:1548 +#: ishtar_menu.py:39 models.py:1270 views.py:1549 msgid "Global variables" msgstr "Variables globales" @@ -559,147 +578,147 @@ msgstr "Fusion automatique" msgid "Manual merge" msgstr "Fusion manuelle" -#: ishtar_menu.py:109 models.py:2284 +#: ishtar_menu.py:109 models.py:2291 msgid "Imports" msgstr "Imports" -#: ishtar_menu.py:112 views.py:1556 +#: ishtar_menu.py:112 views.py:1557 msgid "New import" msgstr "Nouvel import" -#: ishtar_menu.py:116 views.py:1570 +#: ishtar_menu.py:116 views.py:1571 msgid "Current imports" msgstr "Imports en cours" -#: ishtar_menu.py:120 views.py:1606 +#: ishtar_menu.py:120 views.py:1607 msgid "Old imports" msgstr "Anciens imports" -#: models.py:183 +#: models.py:184 msgid "Not a valid item." msgstr "Élément invalide." -#: models.py:196 +#: models.py:197 msgid "A selected item is not a valid item." msgstr "Un élément sélectionné n'est pas valide." -#: models.py:207 +#: models.py:208 msgid "This item already exists." msgstr "Cet élément existe déjà." -#: models.py:372 models.py:686 models.py:1507 models.py:1519 models.py:1933 +#: models.py:373 models.py:688 models.py:1509 models.py:1521 models.py:1940 msgid "Label" msgstr "Libellé" -#: models.py:374 +#: models.py:375 msgid "Textual ID" msgstr "Identifiant textuel" -#: models.py:377 models.py:689 models.py:1476 +#: models.py:378 models.py:691 models.py:1478 msgid "Available" msgstr "Disponible" -#: models.py:713 models.py:2050 +#: models.py:715 models.py:2057 msgid "Key" msgstr "Clé" -#: models.py:719 +#: models.py:721 msgid "Specific key to an import" msgstr "Clé spécifique à un import" -#: models.py:811 +#: models.py:813 msgid "Last editor" msgstr "Dernier éditeur" -#: models.py:814 +#: models.py:816 msgid "Creator" msgstr "Créateur" -#: models.py:956 models.py:2952 models.py:3008 +#: models.py:958 models.py:2962 models.py:3018 msgid "Order" msgstr "Ordre" -#: models.py:957 +#: models.py:959 msgid "Symmetrical" msgstr "Symétrique" -#: models.py:958 +#: models.py:960 msgid "Tiny label" msgstr "Libellé court" -#: models.py:972 +#: models.py:974 msgid "Cannot have symmetrical and an inverse_relation" msgstr "Ne peut pas être symétrique et avoir une relation inverse" -#: models.py:1088 +#: models.py:1090 msgid "Euro" msgstr "Euro" -#: models.py:1089 +#: models.py:1091 msgid "US dollar" msgstr "Dollar US" -#: models.py:1095 models.py:1760 +#: models.py:1097 models.py:1760 msgid "Slug" msgstr "Identifiant texte" -#: models.py:1098 +#: models.py:1100 msgid "CSS color code for base module" msgstr "Code couleur CSS pour le tronc commun" -#: models.py:1100 +#: models.py:1102 msgid "Files module" msgstr "Module Dossiers" -#: models.py:1102 +#: models.py:1104 msgid "CSS color code for files module" msgstr "Code couleur CSS pour le module Dossier" -#: models.py:1104 +#: models.py:1106 msgid "Context records module" msgstr "Module Unités d'Enregistrement" -#: models.py:1107 +#: models.py:1109 msgid "CSS color code for context record module" msgstr "Code couleur CSS pour le module Unité d'Enregistrement" -#: models.py:1109 +#: models.py:1111 msgid "Finds module" msgstr "Module Mobilier" -#: models.py:1110 +#: models.py:1112 msgid "Need context records module" msgstr "Nécessite le module Unités d'Enregistrement" -#: models.py:1112 +#: models.py:1114 msgid "CSS color code for find module" msgstr "Code couleur CSS pour le module Mobilier" -#: models.py:1115 +#: models.py:1117 msgid "Warehouses module" msgstr "Module Dépôts" -#: models.py:1116 +#: models.py:1118 msgid "Need finds module" msgstr "Nécessite le module mobilier" -#: models.py:1118 +#: models.py:1120 msgid "CSS code for warehouse module" msgstr "Code couleur CSS pour le module Dépôt" -#: models.py:1120 +#: models.py:1122 msgid "Mapping module" msgstr "Module cartographique" -#: models.py:1122 +#: models.py:1124 msgid "CSS code for mapping module" msgstr "Code couleur CSS pour le module cartographique" -#: models.py:1125 +#: models.py:1127 msgid "Home page" msgstr "Page d'accueil" -#: models.py:1126 +#: models.py:1128 #, python-brace-format msgid "" "Homepage of Ishtar - if not defined a default homepage will appear. Use the " @@ -709,11 +728,11 @@ msgstr "" "défaut apparaît. Utiliser la syntaxe Markdown. {random_image} peut être " "utilisé pour afficher une image au hasard." -#: models.py:1130 +#: models.py:1132 msgid "File external id" msgstr "Identifiant externe de fichier" -#: models.py:1132 +#: models.py:1134 msgid "" "Formula to manage file external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " @@ -723,11 +742,11 @@ msgstr "" "précaution. Une formule incorrecte peut rendre l'application inutilisable et " "l'import de données externes peut alors être destructif." -#: models.py:1137 +#: models.py:1139 msgid "Parcel external id" msgstr "Identifiant externe de parcelle" -#: models.py:1140 +#: models.py:1142 msgid "" "Formula to manage parcel external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " @@ -737,11 +756,11 @@ msgstr "" "précaution. Une formule incorrecte peut rendre l'application inutilisable et " "l'import de données externes peut alors être destructif." -#: models.py:1145 +#: models.py:1147 msgid "Context record external id" msgstr "Identifiant externe d'unité d'enregistrement" -#: models.py:1147 +#: models.py:1149 msgid "" "Formula to manage context record external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " @@ -751,11 +770,11 @@ msgstr "" "manipuler avec précaution. Une formule incorrecte peut rendre l'application " "inutilisable et l'import de données externes peut alors être destructif." -#: models.py:1152 +#: models.py:1154 msgid "Base find external id" msgstr "Identifiant externe de mobilier de base" -#: models.py:1154 +#: models.py:1156 msgid "" "Formula to manage base find external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " @@ -765,11 +784,11 @@ msgstr "" "manipuler avec précaution. Une formule incorrecte peut rendre l'application " "inutilisable et l'import de données externes peut alors être destructif." -#: models.py:1159 +#: models.py:1161 msgid "Find external id" msgstr "Identifiant externe de mobilier" -#: models.py:1161 +#: models.py:1163 msgid "" "Formula to manage find external ID. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " @@ -779,11 +798,11 @@ msgstr "" "précaution. Une formule incorrecte peut rendre l'application inutilisable et " "l'import de données externes peut alors être destructif." -#: models.py:1166 +#: models.py:1168 msgid "Container external id" msgstr "ID externe du contenant" -#: models.py:1168 +#: models.py:1170 msgid "" "Formula to manage container external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " @@ -793,11 +812,11 @@ msgstr "" "précaution. Une formule incorrecte peut rendre l'application inutilisable et " "l'import de données externes peut alors être destructif." -#: models.py:1173 +#: models.py:1175 msgid "Warehouse external id" msgstr "ID externe du dépôt" -#: models.py:1175 +#: models.py:1177 msgid "" "Formula to manage warehouse external ID. Change this with care. With " "incorrect formula, the application might be unusable and import of external " @@ -807,11 +826,11 @@ msgstr "" "précaution. Une formule incorrecte peut rendre l'application inutilisable et " "l'import de données externes peut alors être destructif." -#: models.py:1180 +#: models.py:1182 msgid "Raw name for person" msgstr "Nom brut pour une personne" -#: models.py:1182 +#: models.py:1184 msgid "" "Formula to manage person raw_name. Change this with care. With incorrect " "formula, the application might be unusable and import of external data can " @@ -821,43 +840,43 @@ msgstr "" "Une formule incorrecte peut rendre l'application inutilisable et l'import de " "données externes peut alors être destructif." -#: models.py:1186 +#: models.py:1188 msgid "Current active" msgstr "Actuellement utilisé" -#: models.py:1187 +#: models.py:1189 msgid "Currency" msgstr "Devise" -#: models.py:1191 +#: models.py:1193 msgid "Ishtar site profile" msgstr "Profil d'instance Ishtar" -#: models.py:1192 +#: models.py:1194 msgid "Ishtar site profiles" msgstr "Profils d'instance Ishtar" -#: models.py:1261 +#: models.py:1263 msgid "Variable name" msgstr "Nom de la variable" -#: models.py:1262 +#: models.py:1264 msgid "Description of the variable" msgstr "Description de la variable" -#: models.py:1264 models.py:2051 +#: models.py:1266 models.py:2058 msgid "Value" msgstr "Valeur" -#: models.py:1267 +#: models.py:1269 msgid "Global variable" msgstr "Variable globale" -#: models.py:1377 models.py:1407 +#: models.py:1379 models.py:1409 msgid "Total" msgstr "Total" -#: models.py:1384 models.py:1508 models.py:1520 +#: models.py:1386 models.py:1510 models.py:1522 #: templates/ishtar/sheet_person.html:22 #: templates/ishtar/dashboards/dashboard_main_detail.html:141 #: templates/ishtar/dashboards/dashboard_main_detail_users.html:26 @@ -865,643 +884,635 @@ msgstr "Total" msgid "Number" msgstr "Nombre" -#: models.py:1471 +#: models.py:1473 msgid "Administrative Act" msgstr "Acte administratif" -#: models.py:1475 +#: models.py:1477 msgid "Associated object" msgstr "Objet associé" -#: models.py:1479 +#: models.py:1481 msgid "Document template" msgstr "Patron de document" -#: models.py:1480 +#: models.py:1482 msgid "Document templates" msgstr "Patrons de document" -#: models.py:1511 models.py:1521 models.py:2268 +#: models.py:1513 models.py:1523 models.py:2275 msgid "State" msgstr "État" -#: models.py:1525 templates/blocks/JQueryAdvancedTown.html:12 +#: models.py:1527 templates/blocks/JQueryAdvancedTown.html:12 msgid "Department" msgstr "Département" -#: models.py:1526 +#: models.py:1528 msgid "Departments" msgstr "Départements" -#: models.py:1563 +#: models.py:1565 msgid "Raw phone" msgstr "Téléphone brut" -#: models.py:1569 +#: models.py:1571 msgid "Alternative address is prefered" msgstr "L'adresse alternative est préférée" -#: models.py:1608 +#: models.py:1610 msgid "Tel: " msgstr "Tél :" -#: models.py:1612 +#: models.py:1614 msgid "Mobile: " msgstr "Mobile :" -#: models.py:1616 +#: models.py:1618 msgid "Email: " msgstr "Courriel :" -#: models.py:1621 +#: models.py:1623 msgid "Merge key" msgstr "Clé de fusion" -#: models.py:1695 +#: models.py:1697 msgid "Organization types" msgstr "Types d'organisation" -#: models.py:1714 views.py:241 -msgid "Operation" -msgstr "Opération" - -#: models.py:1716 -msgid "Archaeological site" -msgstr "Entité Archéologique" - -#: models.py:1717 -msgid "Parcels" -msgstr "Parcelles" - -#: models.py:1719 -msgid "Operation source" -msgstr "Documentation de l'opération" - -#: models.py:1722 views.py:1364 views.py:1414 -msgid "Archaeological files" -msgstr "Dossiers" - -#: models.py:1724 views.py:1367 views.py:1422 -msgid "Context records" -msgstr "Unités d'Enregistrement" +#: models.py:1743 +msgid "Class name" +msgstr "Nom de la classe" -#: models.py:1726 -msgid "Context record relations" -msgstr "Relations entre Unités d'Enregistrement" +#: models.py:1746 +msgid "Importer - Model" +msgstr "Importeur - Modèle" -#: models.py:1728 -msgid "Base finds" -msgstr "Mobilier de base" +#: models.py:1747 +msgid "Importer - Models" +msgstr "Importeur - Modèles" #: models.py:1764 templates/ishtar/dashboards/dashboard_main.html:25 msgid "Users" msgstr "Utilisateurs" -#: models.py:1766 +#: models.py:1767 msgid "Associated model" msgstr "Modèle associé" -#: models.py:1769 +#: models.py:1770 +msgid "Models that can accept new items" +msgstr "Modèles qui peuvent accepter de nouveaux éléments" + +#: models.py:1771 +msgid "Leave blank for no restrictions" +msgstr "Laissez vide pour aucune restriction" + +#: models.py:1773 msgid "Is template" msgstr "Est un patron" -#: models.py:1770 +#: models.py:1774 msgid "Unicity keys (separator \";\")" msgstr "Clés d'unicité (séparateur « ; »)" -#: models.py:1774 +#: models.py:1778 msgid "Importer - Type" msgstr "Importeur - Type" -#: models.py:1775 +#: models.py:1779 msgid "Importer - Types" msgstr "Importeur - Types" -#: models.py:1865 +#: models.py:1872 msgid "Importer - Default" msgstr "Importeur - Par défaut" -#: models.py:1866 +#: models.py:1873 msgid "Importer - Defaults" msgstr "Importeur - Par défaut" -#: models.py:1901 +#: models.py:1908 msgid "Importer - Default value" msgstr "Importeur - Valeur par défaut" -#: models.py:1902 +#: models.py:1909 msgid "Importer - Default values" msgstr "Importeur - Valeurs par défaut" -#: models.py:1935 +#: models.py:1942 msgid "Column number" msgstr "Numéro de colonne" -#: models.py:1938 +#: models.py:1945 msgid "Required" msgstr "Requis" -#: models.py:1941 +#: models.py:1948 msgid "Importer - Column" msgstr "Importeur - Colonne" -#: models.py:1942 +#: models.py:1949 msgid "Importer - Columns" msgstr "Importeur - Colonnes" -#: models.py:1962 +#: models.py:1969 msgid "Field name" msgstr "Nom du champ" -#: models.py:1964 models.py:1998 +#: models.py:1971 models.py:2005 msgid "Force creation of new items" msgstr "Forcer la création de nouveaux éléments" -#: models.py:1966 models.py:2000 +#: models.py:1973 models.py:2007 msgid "Concatenate with existing" msgstr "Concaténer avec l'existant" -#: models.py:1968 models.py:2002 +#: models.py:1975 models.py:2009 msgid "Concatenate character" msgstr "Caractère de concaténation" -#: models.py:1972 +#: models.py:1979 msgid "Importer - Duplicate field" msgstr "Importeur - Champ dupliqué" -#: models.py:1973 +#: models.py:1980 msgid "Importer - Duplicate fields" msgstr "Importeur - Champs dupliqués" -#: models.py:1980 +#: models.py:1987 msgid "Regular expression" msgstr "Expression régulière" -#: models.py:1983 +#: models.py:1990 msgid "Importer - Regular expression" msgstr "Importeur - Expression régulière" -#: models.py:1984 +#: models.py:1991 msgid "Importer - Regular expressions" msgstr "Importeur - Expressions régulières" -#: models.py:2007 +#: models.py:2014 msgid "Importer - Target" msgstr "Importeur - Cible" -#: models.py:2008 +#: models.py:2015 msgid "Importer - Targets" msgstr "Importeur - Cibles" -#: models.py:2032 views.py:545 +#: models.py:2039 views.py:545 msgid "True" msgstr "Oui" -#: models.py:2033 views.py:547 +#: models.py:2040 views.py:547 msgid "False" msgstr "Non" -#: models.py:2052 +#: models.py:2059 msgid "Is set" msgstr "Est défini" -#: models.py:2059 +#: models.py:2066 msgid "Importer - Target key" msgstr "Importeur - Clé de rapprochement" -#: models.py:2060 +#: models.py:2067 msgid "Importer - Targets keys" msgstr "Importeur - Clés de rapprochement" -#: models.py:2112 models.py:2851 models.py:2864 +#: models.py:2119 models.py:2874 msgid "Format" msgstr "Format" -#: models.py:2113 models.py:2956 +#: models.py:2120 models.py:2966 msgid "Operation type" msgstr "Type d'opération" -#: models.py:2114 +#: models.py:2121 msgid "Period" msgstr "Périodes" -#: models.py:2115 +#: models.py:2122 msgid "Report state" msgstr "État de rapport" -#: models.py:2116 +#: models.py:2123 msgid "Remain type" msgstr "Type de vestige" -#: models.py:2117 +#: models.py:2124 msgid "Unit" msgstr "Unité" -#: models.py:2118 +#: models.py:2125 msgid "Activity type" msgstr "Type d'activité" -#: models.py:2119 +#: models.py:2126 msgid "Material" msgstr "Matériau" -#: models.py:2121 +#: models.py:2128 msgid "Conservatory state" msgstr "État de conservation" -#: models.py:2122 +#: models.py:2129 msgid "Container type" msgstr "Type de contenant" -#: models.py:2123 +#: models.py:2130 msgid "Preservation type" msgstr "Type de conservation" -#: models.py:2124 +#: models.py:2131 msgid "Object type" msgstr "Type d'objet" -#: models.py:2125 +#: models.py:2132 msgid "Integrity type" msgstr "Type d'intégrité" -#: models.py:2126 +#: models.py:2133 msgid "Remarkability type" msgstr "Type de remarquabilité" -#: models.py:2127 +#: models.py:2134 msgid "Batch type" msgstr "Type de lot" -#: models.py:2129 +#: models.py:2136 msgid "Identification type" msgstr "Type d'identification" -#: models.py:2131 +#: models.py:2138 msgid "Context record relation type" msgstr "Type de relations entre Unités d'Enregistrement" -#: models.py:2132 models.py:3014 +#: models.py:2139 models.py:3024 msgid "Spatial reference system" msgstr "Système de référence spatiale" -#: models.py:2133 models.py:2843 +#: models.py:2140 models.py:2852 msgid "Support type" msgstr "Type de support" -#: models.py:2134 models.py:2510 +#: models.py:2141 models.py:2517 msgid "Title type" msgstr "Type de titre" -#: models.py:2140 +#: models.py:2147 msgid "Integer" msgstr "Entier" -#: models.py:2141 +#: models.py:2148 msgid "Float" msgstr "Nombre à virgule" -#: models.py:2142 +#: models.py:2149 msgid "String" msgstr "Chaîne de caractères" -#: models.py:2143 templates/sheet_ope.html:86 +#: models.py:2150 templates/sheet_ope.html:86 msgid "Date" msgstr "Date" -#: models.py:2145 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 +#: models.py:2152 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83 #: templates/ishtar/dashboards/dashboard_main_detail.html:126 msgid "Year" msgstr "Année" -#: models.py:2146 +#: models.py:2153 msgid "String to boolean" msgstr "Chaîne de caractères vers booléen" -#: models.py:2147 +#: models.py:2154 msgctxt "filesystem" msgid "File" msgstr "Fichier" -#: models.py:2148 +#: models.py:2155 msgid "Unknow type" msgstr "Type inconnu" -#: models.py:2164 +#: models.py:2171 msgid "4 digit year. e.g.: \"2015\"" msgstr "Année sur 4 chiffres. Exemple : « 2015 »" -#: models.py:2165 +#: models.py:2172 msgid "4 digit year/month/day. e.g.: \"2015/02/04\"" msgstr "Année sur 4 chiffres/mois/jour. Exemple : « 2015/02/04 »" -#: models.py:2166 +#: models.py:2173 msgid "Day/month/4 digit year. e.g.: \"04/02/2015\"" msgstr "Jour/mois/année sur 4 chiffres. Exemple : « 04/02/2015 »" -#: models.py:2176 +#: models.py:2183 msgid "Options" msgstr "Options" -#: models.py:2178 +#: models.py:2185 msgid "Split character(s)" msgstr "Caractère(s) de séparation" -#: models.py:2182 +#: models.py:2189 msgid "Importer - Formater type" msgstr "Importeur - Type de mise en forme" -#: models.py:2183 +#: models.py:2190 msgid "Importer - Formater types" msgstr "Importeur - Types de mise en forme" -#: models.py:2232 templates/ishtar/dashboards/dashboard_main_detail.html:63 +#: models.py:2239 templates/ishtar/dashboards/dashboard_main_detail.html:63 msgid "Created" msgstr "Créé" -#: models.py:2233 +#: models.py:2240 msgid "Analyse in progress" msgstr "Analyse en cours" -#: models.py:2234 +#: models.py:2241 msgid "Analysed" msgstr "Analysé" -#: models.py:2235 +#: models.py:2242 msgid "Import pending" msgstr "Import en attente" -#: models.py:2236 +#: models.py:2243 msgid "Import in progress" msgstr "Import en cours" -#: models.py:2237 +#: models.py:2244 msgid "Finished with errors" msgstr "Terminé avec des erreurs" -#: models.py:2238 +#: models.py:2245 msgid "Finished" msgstr "Terminé" -#: models.py:2239 +#: models.py:2246 msgid "Archived" msgstr "Archivé" -#: models.py:2252 +#: models.py:2259 msgid "Imported file" msgstr "Fichier importé" -#: models.py:2254 +#: models.py:2261 msgid "Associated images (zip file)" msgstr "Images associées (fichier zip)" -#: models.py:2256 +#: models.py:2263 msgid "Encoding" msgstr "Codage" -#: models.py:2258 +#: models.py:2265 msgid "Skip lines" msgstr "Nombre de lignes d'entête" -#: models.py:2259 templates/ishtar/import_list.html:47 +#: models.py:2266 templates/ishtar/import_list.html:47 msgid "Error file" msgstr "Fichier erreur" -#: models.py:2262 +#: models.py:2269 msgid "Result file" msgstr "Fichier résultant" -#: models.py:2265 templates/ishtar/import_list.html:53 +#: models.py:2272 templates/ishtar/import_list.html:53 msgid "Match file" msgstr "Fichier de correspondance" -#: models.py:2271 +#: models.py:2278 msgid "Conservative import" msgstr "Import conservateur" -#: models.py:2276 +#: models.py:2283 msgid "End date" msgstr "Date de fin" -#: models.py:2278 +#: models.py:2285 msgid "Remaining seconds" msgstr "Secondes restantes" -#: models.py:2283 +#: models.py:2290 msgid "Import" msgstr "Import" -#: models.py:2300 +#: models.py:2307 msgid "Analyse" msgstr "Analyser" -#: models.py:2302 models.py:2305 +#: models.py:2309 models.py:2312 msgid "Re-analyse" msgstr "Analyser de nouveau " -#: models.py:2303 +#: models.py:2310 msgid "Launch import" msgstr "Lancer l'import" -#: models.py:2306 +#: models.py:2313 msgid "Re-import" msgstr "Ré-importer" -#: models.py:2307 +#: models.py:2314 msgid "Archive" msgstr "Archiver" -#: models.py:2309 +#: models.py:2316 msgid "Unarchive" msgstr "Désarchiver" -#: models.py:2310 widgets.py:130 templates/ishtar/form_delete.html:11 +#: models.py:2317 widgets.py:130 templates/ishtar/form_delete.html:11 msgid "Delete" msgstr "Supprimer" -#: models.py:2451 +#: models.py:2458 msgid "Organizations" msgstr "Organisations" -#: models.py:2453 +#: models.py:2460 msgid "Can view all Organizations" msgstr "Peut voir toutes les Organisations" -#: models.py:2454 +#: models.py:2461 msgid "Can view own Organization" msgstr "Peut voir sa propre Organisation" -#: models.py:2455 +#: models.py:2462 msgid "Can add own Organization" msgstr "Peut ajouter sa propre Organisation" -#: models.py:2457 +#: models.py:2464 msgid "Can change own Organization" msgstr "Peut modifier sa propre Organisation" -#: models.py:2459 +#: models.py:2466 msgid "Can delete own Organization" msgstr "Peut supprimer sa propre Organisation" -#: models.py:2494 +#: models.py:2501 msgid "Groups" msgstr "Groupes" -#: models.py:2499 +#: models.py:2506 msgid "Person types" msgstr "Types de personne" -#: models.py:2511 +#: models.py:2518 msgid "Title types" msgstr "Types de titre" -#: models.py:2520 +#: models.py:2527 msgid "Mr" msgstr "M." -#: models.py:2521 +#: models.py:2528 msgid "Miss" msgstr "Mlle" -#: models.py:2522 +#: models.py:2529 msgid "Mr and Mrs" msgstr "M. et Mme" -#: models.py:2523 +#: models.py:2530 msgid "Mrs" msgstr "Mme" -#: models.py:2524 +#: models.py:2531 msgid "Doctor" msgstr "Dr." -#: models.py:2557 +#: models.py:2564 msgid "Contact type" msgstr "Type de contact" -#: models.py:2560 models.py:2624 +#: models.py:2567 models.py:2631 msgid "Types" msgstr "Types" -#: models.py:2563 +#: models.py:2570 msgid "Is attached to" msgstr "Est rattaché à" -#: models.py:2568 +#: models.py:2575 msgid "Persons" msgstr "Personnes" -#: models.py:2570 +#: models.py:2577 msgid "Can view all Persons" msgstr "Peut voir toutes les Personnes" -#: models.py:2571 +#: models.py:2578 msgid "Can view own Person" msgstr "Peut voir sa propre Personne" -#: models.py:2572 +#: models.py:2579 msgid "Can add own Person" msgstr "Peut ajouter sa propre Personne" -#: models.py:2573 +#: models.py:2580 msgid "Can change own Person" msgstr "Peut modifier sa propre Personne" -#: models.py:2574 +#: models.py:2581 msgid "Can delete own Person" msgstr "Peut supprimer sa propre Personne" -#: models.py:2752 +#: models.py:2759 msgid "Advanced shortcut menu" msgstr "Menu de raccourci (avancé)" -#: models.py:2755 +#: models.py:2762 msgid "Ishtar user" msgstr "Utilisateur d'Ishtar" -#: models.py:2756 +#: models.py:2763 msgid "Ishtar users" msgstr "Utilisateurs d'Ishtar" -#: models.py:2798 +#: models.py:2805 msgid "To modify the password use the form in Auth > User" msgstr "" "Pour modifier le mot de passe, utilisez le formulaire dans Authentification " "> Utilisateurs" -#: models.py:2804 +#: models.py:2811 msgid "Author types" msgstr "Types d'auteur" -#: models.py:2836 +#: models.py:2844 msgid "Source types" msgstr "Types de document" -#: models.py:2844 +#: models.py:2853 msgid "Support types" msgstr "Types de support" -#: models.py:2852 -msgid "Formats" -msgstr "Formats" +#: models.py:2860 +msgid "Format type" +msgstr "Type de format" + +#: models.py:2861 +msgid "Format types" +msgstr "Types de format" -#: models.py:2859 +#: models.py:2869 msgid "External ID" msgstr "Identifiant externe" -#: models.py:2862 +#: models.py:2872 msgid "Support" msgstr "Support" -#: models.py:2866 +#: models.py:2876 msgid "Scale" msgstr "Échelle" -#: models.py:2880 +#: models.py:2890 msgid "Item number" msgstr "Numéro d'élément" -#: models.py:2881 +#: models.py:2891 msgid "Ref." msgstr "Réf." -#: models.py:2884 +#: models.py:2894 msgid "Internal ref." msgstr "Réf. interne" -#: models.py:2927 +#: models.py:2937 msgid "Surface (m2)" msgstr "Surface (m2)" -#: models.py:2928 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 +#: models.py:2938 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107 msgid "Localisation" msgstr "Localisation" -#: models.py:2953 +#: models.py:2963 msgid "Is preventive" msgstr "Est du préventif" -#: models.py:2957 +#: models.py:2967 msgid "Operation types" msgstr "Types d'opération" -#: models.py:2986 +#: models.py:2996 msgid "Preventive" msgstr "Préventif" -#: models.py:2987 +#: models.py:2997 msgid "Research" msgstr "Programmé" -#: models.py:3010 +#: models.py:3020 msgid "Authority name" msgstr "Registre" -#: models.py:3011 +#: models.py:3021 msgid "Authority SRID" msgstr "SRID" -#: models.py:3015 +#: models.py:3025 msgid "Spatial reference systems" msgstr "Systèmes de référence spatiale" @@ -1549,6 +1560,10 @@ msgstr "Supprimer un compte" msgid "Archaeological file" msgstr "Dossier" +#: views.py:241 +msgid "Operation" +msgstr "Opération" + #: views.py:243 msgid "Context record" msgstr "Unité d'Enregistrement" @@ -1565,48 +1580,56 @@ msgstr "Demande de traitement" msgid "Treatment" msgstr "Traitement" -#: views.py:1303 views.py:1346 +#: views.py:1304 views.py:1347 msgid "Operation not permitted." msgstr "Opération non permise." -#: views.py:1305 +#: views.py:1306 #, python-format msgid "New %s" msgstr "Nouveau %s" -#: views.py:1365 views.py:1418 +#: views.py:1365 views.py:1415 +msgid "Archaeological files" +msgstr "Dossiers" + +#: views.py:1366 views.py:1419 msgid "Operations" msgstr "Opérations" -#: views.py:1369 views.py:1425 +#: views.py:1368 views.py:1423 +msgid "Context records" +msgstr "Unités d'Enregistrement" + +#: views.py:1370 views.py:1426 msgid "Finds" msgstr "Mobilier" -#: views.py:1618 templates/ishtar/import_list.html:43 +#: views.py:1619 templates/ishtar/import_list.html:43 msgid "Link unmatched items" msgstr "Associer les éléments non rapprochés" -#: views.py:1633 +#: views.py:1634 msgid "Delete import" msgstr "Supprimer un import" -#: views.py:1672 +#: views.py:1673 msgid "Merge persons" msgstr "Fusionner des personnes" -#: views.py:1696 +#: views.py:1697 msgid "Select the main person" msgstr "Choisir la personne principale" -#: views.py:1705 +#: views.py:1706 msgid "Merge organization" msgstr "Fusionner des organisations" -#: views.py:1715 +#: views.py:1716 msgid "Select the main organization" msgstr "Sélectionner l'organisation principale" -#: views.py:1755 views.py:1771 +#: views.py:1756 views.py:1772 msgid "Corporation manager" msgstr "Représentant de la personne morale" @@ -1793,7 +1816,7 @@ msgstr "Dossier actif" #: templates/sheet_ope.html:21 msgid "Closed operation" -msgstr "Opération fermée" +msgstr "Opération close" #: templates/sheet_ope.html:22 msgid "Closing date:" diff --git a/version.py b/version.py index 9bde12a00..f635dd125 100644 --- a/version.py +++ b/version.py @@ -1,4 +1,4 @@ -VERSION = (0, 99, 10) +VERSION = (0, 99, 11) def get_version(): |