summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--INSTALL.md2
-rw-r--r--archaeological_context_records/locale/django.pot250
-rw-r--r--archaeological_context_records/migrations/0031_auto_20181017_1642.py36
-rw-r--r--archaeological_context_records/migrations/0032_auto_20181017_1854.py25
-rw-r--r--archaeological_context_records/models.py25
-rw-r--r--archaeological_files/locale/django.pot182
-rw-r--r--archaeological_files/migrations/0014_auto_20181017_1642.py36
-rw-r--r--archaeological_files/migrations/0015_auto_20181017_1854.py25
-rw-r--r--archaeological_files/tests.py2
-rw-r--r--archaeological_finds/forms.py278
-rw-r--r--archaeological_finds/forms_treatments.py87
-rw-r--r--archaeological_finds/ishtar_menu.py25
-rw-r--r--archaeological_finds/locale/django.pot947
-rw-r--r--archaeological_finds/migrations/0035_auto_20181017_1642.py72
-rw-r--r--archaeological_finds/migrations/0036_auto_20181017_1854.py60
-rw-r--r--archaeological_finds/migrations/0037_auto_20181018_1756.py41
-rw-r--r--archaeological_finds/models_finds.py134
-rw-r--r--archaeological_finds/templates/ishtar/forms/qa_find_basket.html69
-rw-r--r--archaeological_finds/templates/ishtar/forms/qa_find_treatment.html63
-rw-r--r--archaeological_finds/templates/ishtar/sheet_find.html7
-rw-r--r--archaeological_finds/templates/ishtar/sheet_findbasket.html23
-rw-r--r--archaeological_finds/tests.py66
-rw-r--r--archaeological_finds/urls.py47
-rw-r--r--archaeological_finds/views.py129
-rw-r--r--archaeological_finds/wizards.py13
-rw-r--r--archaeological_operations/forms.py12
-rw-r--r--archaeological_operations/locale/django.pot650
-rw-r--r--archaeological_operations/migrations/0038_auto_20181017_1642.py67
-rw-r--r--archaeological_operations/migrations/0039_auto_20181017_1854.py55
-rw-r--r--archaeological_operations/models.py57
-rw-r--r--archaeological_operations/templates/ishtar/sheet_operation.html2
-rw-r--r--archaeological_operations/tests.py12
-rw-r--r--archaeological_operations/urls.py3
-rw-r--r--archaeological_warehouse/ishtar_menu.py12
-rw-r--r--archaeological_warehouse/locale/django.pot153
-rw-r--r--archaeological_warehouse/migrations/0023_auto_20181017_1642.py41
-rw-r--r--archaeological_warehouse/migrations/0024_auto_20181017_1854.py30
-rw-r--r--archaeological_warehouse/models.py22
-rw-r--r--archaeological_warehouse/urls.py11
-rw-r--r--archaeological_warehouse/views.py34
-rw-r--r--bootstrap_datepicker/widgets.py4
-rw-r--r--docs/fr/source/media-src/graphique_structure_ishtar.dot2
m---------drassm_app0
-rw-r--r--[-rwxr-xr-x]example_project/media/upload/templates/document_reference.odtbin10678 -> 10626 bytes
-rw-r--r--install/ishtar-cron-daily8
-rwxr-xr-xinstall/ishtar-install9
-rw-r--r--ishtar_common/backend.py7
-rw-r--r--ishtar_common/forms.py102
-rw-r--r--ishtar_common/forms_common.py27
-rw-r--r--ishtar_common/locale/django.pot1527
-rw-r--r--ishtar_common/management/commands/generate_rights.py71
-rw-r--r--ishtar_common/management/commands/reassociate_similar_images.py234
-rw-r--r--ishtar_common/migrations/0072_auto_20181008_1117.py24
-rw-r--r--ishtar_common/migrations/0073_auto_20181017_1642.py44
-rw-r--r--ishtar_common/migrations/0074_auto_20181017_1854.py35
-rw-r--r--ishtar_common/models.py285
-rw-r--r--ishtar_common/models_imports.py17
-rw-r--r--ishtar_common/static/bootstrap/bootstrap.css2
-rw-r--r--ishtar_common/static/js/ishtar.js222
-rw-r--r--ishtar_common/templates/base.html4
-rw-r--r--ishtar_common/templates/blocks/DataTables.html94
-rw-r--r--ishtar_common/templates/blocks/bs_form_snippet.html20
-rw-r--r--ishtar_common/templates/ishtar/blocks/advanced_shortcut_menu.html51
-rw-r--r--ishtar_common/templates/ishtar/blocks/shortcut_menu.html17
-rw-r--r--ishtar_common/templates/ishtar/blocks/window_image_detail.html2
-rw-r--r--ishtar_common/templates/ishtar/blocks/window_nav.html29
-rw-r--r--ishtar_common/templates/ishtar/forms/bookmark_delete.html7
-rw-r--r--ishtar_common/templates/ishtar/forms/qa_base.html77
-rw-r--r--ishtar_common/templates/ishtar/forms/qa_form.html33
-rw-r--r--ishtar_common/templates/ishtar/forms/success.html4
-rw-r--r--ishtar_common/templates/ishtar/manage_basket.html25
-rw-r--r--ishtar_common/templates/ishtar/sheet_document.html2
-rw-r--r--ishtar_common/templates/widgets/search_input.html2
-rw-r--r--ishtar_common/tests.py63
-rw-r--r--ishtar_common/urls.py4
-rw-r--r--ishtar_common/utils.py71
-rw-r--r--ishtar_common/utils_migrations.py22
-rw-r--r--ishtar_common/views.py179
-rw-r--r--ishtar_common/views_item.py152
-rw-r--r--ishtar_common/widgets.py9
-rw-r--r--scripts/restore_find_data.py25
-rw-r--r--scss/custom.scss57
-rw-r--r--translations/fr/archaeological_context_records.po258
-rw-r--r--translations/fr/archaeological_files.po190
-rw-r--r--translations/fr/archaeological_files_pdl.po8
-rw-r--r--translations/fr/archaeological_finds.po997
-rw-r--r--translations/fr/archaeological_operations.po664
-rw-r--r--translations/fr/archaeological_warehouse.po161
-rw-r--r--translations/fr/ishtar_common.po1612
-rw-r--r--version.py4
-rw-r--r--zanata.xml2
92 files changed, 7380 insertions, 3891 deletions
diff --git a/.gitignore b/.gitignore
index 4b58376e8..a5721c4a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,4 @@ node_modules/
package-lock.json
ishtar_common/fixtures/towns_norel-fr.json
ishtar_common/fixtures/towns-fr.json
+drassm_app
diff --git a/INSTALL.md b/INSTALL.md
index 459f1e330..7edfe8ff4 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -4,7 +4,7 @@ Install
Install from Git
----------------
-This procedure only works for Debian Jessie/Stretch for now.
+This procedure only works for Debian Stretch for now.
If you know bash and your distribution the script should be easy to adapt (contributions are welcomed!).
```
diff --git a/archaeological_context_records/locale/django.pot b/archaeological_context_records/locale/django.pot
index b6d8256eb..fbd1d8d86 100644
--- a/archaeological_context_records/locale/django.pot
+++ b/archaeological_context_records/locale/django.pot
@@ -13,11 +13,11 @@ msgstr ""
msgid "Point"
msgstr ""
-#: admin.py:51 models.py:377
+#: admin.py:51 models.py:410
msgid "Multi polygon"
msgstr ""
-#: forms.py:47 forms.py:53 models.py:319 wizards.py:77
+#: forms.py:47 forms.py:53 models.py:352 wizards.py:81
msgid "Operation"
msgstr ""
@@ -33,7 +33,7 @@ msgstr ""
msgid "Full text search"
msgstr ""
-#: forms.py:69 forms.py:155 models.py:324 models.py:696
+#: forms.py:69 forms.py:155 models.py:357 models.py:737
msgid "ID"
msgstr ""
@@ -49,7 +49,7 @@ msgstr ""
msgid "Operation's number (index by year)"
msgstr ""
-#: forms.py:80 models.py:322
+#: forms.py:80 models.py:355
msgid "Archaeological site"
msgstr ""
@@ -57,7 +57,7 @@ msgstr ""
msgid "Search within related operations"
msgstr ""
-#: forms.py:87 forms.py:288 models.py:65
+#: forms.py:87 forms.py:288 models.py:66
msgid "Period"
msgstr ""
@@ -65,7 +65,8 @@ msgstr ""
msgid "Unit type"
msgstr ""
-#: forms.py:89 forms.py:148 models.py:230 models.py:314 models.py:698
+#: forms.py:89 forms.py:148 models.py:231 models.py:232 models.py:347
+#: models.py:739
msgid "Parcel"
msgstr ""
@@ -73,7 +74,7 @@ msgstr ""
msgid "Search within relations"
msgstr ""
-#: forms.py:115 views.py:96
+#: forms.py:115 views.py:95
msgid "Context record search"
msgstr ""
@@ -89,7 +90,7 @@ msgstr ""
msgid "Context record - 020 - General"
msgstr ""
-#: forms.py:149 models.py:227 models.py:228 models.py:317
+#: forms.py:149 models.py:228 models.py:229 models.py:350
msgid "Town"
msgstr ""
@@ -97,52 +98,52 @@ msgstr ""
msgid "Only the items associated to the operation can be selected."
msgstr ""
-#: forms.py:157 models.py:325 models.py:699
+#: forms.py:157 models.py:358 models.py:740
#: templates/ishtar/sheet_contextrecord.html:45
msgid "Description"
msgstr ""
-#: forms.py:159 models.py:326
+#: forms.py:159 models.py:359
msgid "General comment"
msgstr ""
-#: forms.py:162 models.py:372
+#: forms.py:162 models.py:405
msgid "Excavation technique"
msgstr ""
-#: forms.py:163 models.py:330
+#: forms.py:163 models.py:363
msgid "Length (m)"
msgstr ""
-#: forms.py:164 models.py:331
+#: forms.py:164 models.py:364
msgid "Width (m)"
msgstr ""
-#: forms.py:165 models.py:332
+#: forms.py:165 models.py:365
msgid "Thickness (m)"
msgstr ""
-#: forms.py:166 models.py:334
+#: forms.py:166 models.py:367
msgid "Diameter (m)"
msgstr ""
-#: forms.py:167 models.py:335
+#: forms.py:167 models.py:368
msgid "Depth (m)"
msgstr ""
-#: forms.py:169 models.py:337
+#: forms.py:169 models.py:370
msgid "Depth of appearance (m)"
msgstr ""
-#: forms.py:170 models.py:346 models.py:697
+#: forms.py:170 models.py:379 models.py:738
msgid "Context record type"
msgstr ""
-#: forms.py:172 models.py:327
+#: forms.py:172 models.py:360
msgid "Opening date"
msgstr ""
-#: forms.py:174 models.py:329 templates/ishtar/sheet_contextrecord.html:128
+#: forms.py:174 models.py:362 templates/ishtar/sheet_contextrecord.html:140
msgid "Closing date"
msgstr ""
@@ -150,7 +151,7 @@ msgstr ""
msgid "Documentation"
msgstr ""
-#: forms.py:180 models.py:339
+#: forms.py:180 models.py:372
msgid "Location"
msgstr ""
@@ -162,23 +163,23 @@ msgstr ""
msgid "You have to choose a town or a parcel."
msgstr ""
-#: forms.py:283 forms.py:304 models.py:76
+#: forms.py:283 forms.py:304 models.py:77
msgid "Dating"
msgstr ""
-#: forms.py:289 models.py:66
+#: forms.py:289 models.py:67
msgid "Start date"
msgstr ""
-#: forms.py:290 models.py:67
+#: forms.py:290 models.py:68
msgid "End date"
msgstr ""
-#: forms.py:291 models.py:70
+#: forms.py:291 models.py:71
msgid "Quality"
msgstr ""
-#: forms.py:292 models.py:44 models.py:68
+#: forms.py:292 models.py:45 models.py:69
msgid "Dating type"
msgstr ""
@@ -186,7 +187,7 @@ msgstr ""
msgid "Context record - 030 - Dating"
msgstr ""
-#: forms.py:315 ishtar_menu.py:29 models.py:90
+#: forms.py:315 ishtar_menu.py:29 models.py:91
msgid "Context record"
msgstr ""
@@ -198,8 +199,8 @@ msgstr ""
msgid "Context record - 050 - Relations"
msgstr ""
-#: forms.py:337 forms.py:348 models.py:349
-#: templates/ishtar/sheet_contextrecord.html:59
+#: forms.py:337 forms.py:348 models.py:382
+#: templates/ishtar/sheet_contextrecord.html:64
msgid "Interpretation"
msgstr ""
@@ -211,31 +212,31 @@ msgstr ""
msgid "Comments on dating"
msgstr ""
-#: forms.py:346 models.py:348
+#: forms.py:346 models.py:381
msgid "Filling"
msgstr ""
-#: forms.py:350 models.py:369
+#: forms.py:350 models.py:402
msgid "Activity"
msgstr ""
-#: forms.py:352 models.py:367
+#: forms.py:352 models.py:400
msgid "Identification"
msgstr ""
-#: forms.py:354 models.py:352
+#: forms.py:354 models.py:385
msgid "TAQ"
msgstr ""
-#: forms.py:355 models.py:356
+#: forms.py:355 models.py:389
msgid "Estimated TAQ"
msgstr ""
-#: forms.py:357 models.py:359
+#: forms.py:357 models.py:392
msgid "TPQ"
msgstr ""
-#: forms.py:358 models.py:363
+#: forms.py:358 models.py:396
msgid "Estimated TPQ"
msgstr ""
@@ -267,354 +268,363 @@ msgstr ""
msgid "Deletion"
msgstr ""
-#: models.py:45
+#: models.py:46
msgid "Dating types"
msgstr ""
-#: models.py:55
+#: models.py:56
msgid "Dating quality type"
msgstr ""
-#: models.py:56
+#: models.py:57
msgid "Dating quality types"
msgstr ""
-#: models.py:72
+#: models.py:73
msgid "Precise dating"
msgstr ""
-#: models.py:77
+#: models.py:78
msgid "Datings"
msgstr ""
-#: models.py:97
+#: models.py:98
msgid "Find"
msgstr ""
-#: models.py:116 models.py:135 models.py:151
+#: models.py:117 models.py:136 models.py:152
msgid "Order"
msgstr ""
-#: models.py:118
+#: models.py:119
msgid "Parent context record type"
msgstr ""
-#: models.py:122
+#: models.py:123
msgid "Context record Type"
msgstr ""
-#: models.py:123
+#: models.py:124
msgid "Context record Types"
msgstr ""
-#: models.py:138
+#: models.py:139
msgid "Activity Type"
msgstr ""
-#: models.py:139
+#: models.py:140
msgid "Activity Types"
msgstr ""
-#: models.py:154
+#: models.py:155
msgid "Identification Type"
msgstr ""
-#: models.py:155
+#: models.py:156
msgid "Identification Types"
msgstr ""
-#: models.py:168
+#: models.py:169
msgid "Excavation technique type"
msgstr ""
-#: models.py:169
+#: models.py:170
msgid "Excavation technique types"
msgstr ""
-#: models.py:179
+#: models.py:180
msgid "Documentation type"
msgstr ""
-#: models.py:180
+#: models.py:181
msgid "Documentation types"
msgstr ""
-#: models.py:221 models.py:700
+#: models.py:222 models.py:741
msgid "Periods"
msgstr ""
-#: models.py:222
+#: models.py:223
msgid "Datings (period)"
msgstr ""
-#: models.py:223
+#: models.py:224
msgid "Related context records"
msgstr ""
-#: models.py:224
+#: models.py:225
msgid "Operation (Patriarche code)"
msgstr ""
-#: models.py:225
+#: models.py:226
msgid "Operation (name)"
msgstr ""
-#: models.py:226
+#: models.py:227
msgid "Parcel (external ID)"
msgstr ""
-#: models.py:229
+#: models.py:230
msgid "Parcel (year)"
msgstr ""
-#: models.py:262
+#: models.py:265
msgctxt "key for text search"
msgid "id"
msgstr ""
-#: models.py:266
+#: models.py:269
msgctxt "key for text search"
msgid "town"
msgstr ""
-#: models.py:270
+#: models.py:273
msgctxt "key for text search"
msgid "operation-year"
msgstr ""
-#: models.py:274
+#: models.py:277
msgctxt "key for text search"
msgid "patriarche"
msgstr ""
-#: models.py:278
+#: models.py:281
msgctxt "key for text search"
msgid "operation-code"
msgstr ""
-#: models.py:282
+#: models.py:285 models.py:327
+msgctxt "key for text search"
+msgid "operation"
+msgstr ""
+
+#: models.py:289 models.py:330
msgctxt "key for text search"
msgid "site"
msgstr ""
-#: models.py:286
+#: models.py:293
msgctxt "key for text search"
msgid "operation-relation-type"
msgstr ""
-#: models.py:290
+#: models.py:297
msgctxt "key for text search"
msgid "period"
msgstr ""
-#: models.py:294
+#: models.py:301
msgctxt "key for text search"
msgid "unit-type"
msgstr ""
-#: models.py:298
+#: models.py:305
msgctxt "key for text search"
msgid "parcel"
msgstr ""
-#: models.py:302
+#: models.py:309
msgctxt "key for text search"
msgid "record-relation-type"
msgstr ""
-#: models.py:310
+#: models.py:343
msgid "External ID"
msgstr ""
-#: models.py:312
+#: models.py:345
msgid "External ID is set automatically"
msgstr ""
-#: models.py:340
+#: models.py:373
msgid "A short description of the location of the context record"
msgstr ""
-#: models.py:344
+#: models.py:377
msgid "Comment on datings"
msgstr ""
-#: models.py:353
+#: models.py:386
msgid ""
"\"Terminus Ante Quem\" the context record can't have been created after this "
"date"
msgstr ""
-#: models.py:357
+#: models.py:390
msgid "Estimation of a \"Terminus Ante Quem\""
msgstr ""
-#: models.py:360
+#: models.py:393
msgid ""
"\"Terminus Post Quem\" the context record can't have been created before "
"this date"
msgstr ""
-#: models.py:364
+#: models.py:397
msgid "Estimation of a \"Terminus Post Quem\""
msgstr ""
-#: models.py:375
+#: models.py:408
msgid "Point (2D)"
msgstr ""
-#: models.py:376
+#: models.py:409
msgid "Point (3D)"
msgstr ""
-#: models.py:380
+#: models.py:413
msgid "Documents"
msgstr ""
-#: models.py:382
+#: models.py:415
msgid "Cached name"
msgstr ""
-#: models.py:393 models.py:394 templates/ishtar/sheet_contextrecord.html:4
+#: models.py:419 models.py:420 templates/ishtar/sheet_contextrecord.html:4
msgid "Context Record"
msgstr ""
-#: models.py:410
+#: models.py:439
msgctxt "short"
msgid "Context record"
msgstr ""
-#: models.py:627 models.py:650 models.py:695
+#: models.py:668 models.py:691 models.py:736
msgid "Relation type"
msgstr ""
-#: models.py:628
+#: models.py:669
msgid "Relation types"
msgstr ""
-#: models.py:645
+#: models.py:686
msgid "ID (left)"
msgstr ""
-#: models.py:646
+#: models.py:687
msgid "Context record type (left)"
msgstr ""
-#: models.py:647
+#: models.py:688
msgid "Parcel (left)"
msgstr ""
-#: models.py:648
+#: models.py:689
msgid "Description (left)"
msgstr ""
-#: models.py:649
+#: models.py:690
msgid "Periods (left)"
msgstr ""
-#: models.py:651
+#: models.py:692
msgid "ID (right)"
msgstr ""
-#: models.py:652
+#: models.py:693
msgid "Context record type (right)"
msgstr ""
-#: models.py:653
+#: models.py:694
msgid "Parcel (right)"
msgstr ""
-#: models.py:654
+#: models.py:695
msgid "Description (right)"
msgstr ""
-#: models.py:655
+#: models.py:696
msgid "Periods (right)"
msgstr ""
-#: models.py:664
+#: models.py:705
msgid "Record relation"
msgstr ""
-#: models.py:665
+#: models.py:706
msgid "Record relations"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:70
+#: templates/ishtar/sheet_contextrecord.html:75
msgid "Datations"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:79
+#: templates/ishtar/sheet_contextrecord.html:84
+msgid "Sheet"
+msgstr ""
+
+#: templates/ishtar/sheet_contextrecord.html:91
msgid "Context record relations"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:97
+#: templates/ishtar/sheet_contextrecord.html:109
msgid "Re-generate image"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:99
+#: templates/ishtar/sheet_contextrecord.html:111
msgid "Generate image"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:108
+#: templates/ishtar/sheet_contextrecord.html:120
msgid "Operation summary"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:111
+#: templates/ishtar/sheet_contextrecord.html:123
msgid "Patriarche OA code not yet recorded!"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:116
+#: templates/ishtar/sheet_contextrecord.html:128
msgid "Numerical reference"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:122
+#: templates/ishtar/sheet_contextrecord.html:134
msgid "State"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:123
+#: templates/ishtar/sheet_contextrecord.html:135
msgid "Active file"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:123
+#: templates/ishtar/sheet_contextrecord.html:135
msgid "Closed operation"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:130
+#: templates/ishtar/sheet_contextrecord.html:142
msgid "by"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:140
+#: templates/ishtar/sheet_contextrecord.html:152
msgid "Localisation"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:149
+#: templates/ishtar/sheet_contextrecord.html:161
msgid "No operation linked to this context record!"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:161
+#: templates/ishtar/sheet_contextrecord.html:173
msgid "Document from this context record"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:166
+#: templates/ishtar/sheet_contextrecord.html:178
msgid "Finds"
msgstr ""
-#: templates/ishtar/sheet_contextrecord.html:171
+#: templates/ishtar/sheet_contextrecord.html:183
msgid "Documents from associated finds"
msgstr ""
-#: views.py:110
+#: views.py:109
msgid "New context record"
msgstr ""
-#: views.py:126
+#: views.py:125
msgid "Context record modification"
msgstr ""
-#: views.py:137
+#: views.py:136
msgid "You don't have sufficient permissions to do this action."
msgstr ""
-#: views.py:150
+#: views.py:149
msgid "Context record deletion"
msgstr ""
diff --git a/archaeological_context_records/migrations/0031_auto_20181017_1642.py b/archaeological_context_records/migrations/0031_auto_20181017_1642.py
new file mode 100644
index 000000000..4ba07813b
--- /dev/null
+++ b/archaeological_context_records/migrations/0031_auto_20181017_1642.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['contextrecord']
+ reinit_last_modified(
+ apps, 'archaeological_context_records', models
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0030_auto_20180619_0911'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='contextrecord',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalcontextrecord',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/archaeological_context_records/migrations/0032_auto_20181017_1854.py b/archaeological_context_records/migrations/0032_auto_20181017_1854.py
new file mode 100644
index 000000000..1afe06f0a
--- /dev/null
+++ b/archaeological_context_records/migrations/0032_auto_20181017_1854.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_context_records', '0031_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='contextrecord',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='historicalcontextrecord',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ ]
diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py
index 60f8fce1b..89f3edee4 100644
--- a/archaeological_context_records/models.py
+++ b/archaeological_context_records/models.py
@@ -254,12 +254,11 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
'label': 'label__icontains',
'archaeological_sites': 'operation__archaeological_sites__pk',
'cached_label': 'cached_label__icontains',
+ 'datings__period__label': 'datings__period__label',
+ 'operation_id': 'operation_id',
}
RELATION_TYPES_PREFIX = {'ope_relation_types': 'operation__',
'cr_relation_types': ''}
- RELATIVE_SESSION_NAMES = [
- ('operation', 'operation__pk'),
- ('file', 'operation__associated_file__pk')]
# alternative names of fields for searches
ALT_NAMES = {
'label': (
@@ -282,6 +281,10 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
pgettext_lazy("key for text search", u"operation-code"),
'operation__operation_code'
),
+ 'operation__cached_label': (
+ pgettext_lazy("key for text search", u"operation"),
+ 'operation__cached_label__icontains'
+ ),
'archaeological_site': (
pgettext_lazy("key for text search", u"site"),
'archaeological_site__cached_label__icontains'
@@ -319,7 +322,22 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
"identification__label", "activity__label",
"excavation_technic__label"]
M2M_SEARCH_VECTORS = ["datings__period__label"]
+ UP_MODEL_QUERY = {
+ "operation": (
+ pgettext_lazy("key for text search", u"operation"),
+ 'cached_label'),
+ "site": (
+ pgettext_lazy("key for text search", u"site"),
+ 'cached_label'),
+ }
+ RELATIVE_SESSION_NAMES = [
+ ('operation', 'operation__pk'),
+ ('site', 'archaeological_site__pk'),
+ ('file', 'operation__associated_file__pk'),
+ ]
+
history = HistoricalRecords()
+ objects = ExternalIdManager()
# fields
external_id = models.TextField(_(u"External ID"), blank=True, null=True)
@@ -396,7 +414,6 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem,
blank=True)
cached_label = models.TextField(_(u"Cached name"), null=True, blank=True,
db_index=True)
- objects = ExternalIdManager()
class Meta:
verbose_name = _(u"Context Record")
diff --git a/archaeological_files/locale/django.pot b/archaeological_files/locale/django.pot
index 007aea421..bf7e69caa 100644
--- a/archaeological_files/locale/django.pot
+++ b/archaeological_files/locale/django.pot
@@ -15,11 +15,11 @@ msgid "Full text search"
msgstr ""
#: forms.py:56 forms.py:212 forms.py:257 forms.py:411 forms.py:444
-#: models.py:208 templates/ishtar/sheet_file.html:190
+#: models.py:221 templates/ishtar/sheet_file.html:191
msgid "Year"
msgstr ""
-#: forms.py:57 forms.py:217 forms.py:259 models.py:210
+#: forms.py:57 forms.py:217 forms.py:259 models.py:223
msgid "Numeric reference"
msgstr ""
@@ -31,7 +31,7 @@ msgstr ""
msgid "Parcel"
msgstr ""
-#: forms.py:64 forms.py:422 forms.py:455 models.py:696
+#: forms.py:64 forms.py:422 forms.py:455 models.py:717
msgid "Department"
msgstr ""
@@ -39,7 +39,7 @@ msgstr ""
msgid "File name"
msgstr ""
-#: forms.py:66 forms.py:156 forms.py:223 models.py:218
+#: forms.py:66 forms.py:156 forms.py:223 models.py:231
msgid "File type"
msgstr ""
@@ -51,23 +51,23 @@ msgstr ""
msgid "Saisine type"
msgstr ""
-#: forms.py:69 forms.py:313 models.py:63 models.py:249
+#: forms.py:69 forms.py:313 models.py:64 models.py:262
msgid "Permit type"
msgstr ""
-#: forms.py:71 forms.py:316 models.py:250
+#: forms.py:71 forms.py:316 models.py:263
msgid "Permit reference"
msgstr ""
-#: forms.py:72 forms.py:229 forms.py:373 models.py:279
+#: forms.py:72 forms.py:229 forms.py:373 models.py:292
msgid "Comment"
msgstr ""
-#: forms.py:74 templates/ishtar/sheet_file.html:166
+#: forms.py:74 templates/ishtar/sheet_file.html:167
msgid "In charge"
msgstr ""
-#: forms.py:81 forms.py:290 forms.py:466 models.py:225
+#: forms.py:81 forms.py:290 forms.py:466 models.py:238
msgid "General contractor"
msgstr ""
@@ -91,11 +91,11 @@ msgstr ""
msgid "You should select a file."
msgstr ""
-#: forms.py:144 forms.py:221 models.py:258
+#: forms.py:144 forms.py:221 models.py:271
msgid "Creation date"
msgstr ""
-#: forms.py:145 forms.py:326 models.py:260
+#: forms.py:145 forms.py:326 models.py:273
msgid "Reception date"
msgstr ""
@@ -123,23 +123,23 @@ msgstr ""
msgid "General"
msgstr ""
-#: forms.py:204 models.py:220
+#: forms.py:204 models.py:233
msgid "Person in charge"
msgstr ""
-#: forms.py:220 models.py:217
+#: forms.py:220 models.py:230
msgid "Name"
msgstr ""
-#: forms.py:225 models.py:262
+#: forms.py:225 models.py:275
msgid "Related file"
msgstr ""
-#: forms.py:233 models.py:270
+#: forms.py:233 models.py:283
msgid "Total surface (m2)"
msgstr ""
-#: forms.py:236 models.py:276
+#: forms.py:236 models.py:289
msgid "Main address"
msgstr ""
@@ -168,16 +168,16 @@ msgstr ""
msgid "Preventive informations"
msgstr ""
-#: forms.py:302 models.py:237
+#: forms.py:302 models.py:250
msgid "Responsible for planning service"
msgstr ""
-#: forms.py:319 models.py:273
+#: forms.py:319 models.py:286
msgid "Total developed surface (m2)"
msgstr ""
#: forms.py:342 templates/ishtar/dashboards/dashboard_file.html:53
-#: templates/ishtar/sheet_file.html:121
+#: templates/ishtar/sheet_file.html:122
msgid "Research archaeology"
msgstr ""
@@ -185,15 +185,15 @@ msgstr ""
msgid "Archaeological file - 045 - Research - General"
msgstr ""
-#: forms.py:351 models.py:282
+#: forms.py:351 models.py:295
msgid "Departments"
msgstr ""
-#: forms.py:360 models.py:291
+#: forms.py:360 models.py:304
msgid "Scientist in charge"
msgstr ""
-#: forms.py:362 models.py:285
+#: forms.py:362 models.py:298
msgid "Requested operation type"
msgstr ""
@@ -201,11 +201,11 @@ msgstr ""
msgid "Lead organization"
msgstr ""
-#: forms.py:380 models.py:295
+#: forms.py:380 models.py:308
msgid "Classified area"
msgstr ""
-#: forms.py:382 models.py:297
+#: forms.py:382 models.py:310
msgid "Protected area"
msgstr ""
@@ -269,8 +269,8 @@ msgstr ""
msgid "Archaeological file - Administrative act - General"
msgstr ""
-#: ishtar_menu.py:33 models.py:320 templates/ishtar/sheet_file.html:4
-#: wizards.py:152 wizards.py:162
+#: ishtar_menu.py:33 models.py:338 templates/ishtar/sheet_file.html:4
+#: wizards.py:156 wizards.py:166
msgid "Archaeological file"
msgstr ""
@@ -298,7 +298,7 @@ msgstr ""
msgid "Administrative act"
msgstr ""
-#: ishtar_menu.py:77
+#: ishtar_menu.py:77 models.py:321
msgid "Documents"
msgstr ""
@@ -310,206 +310,206 @@ msgstr ""
msgid "General informations"
msgstr ""
-#: ishtar_menu.py:89 models.py:321
+#: ishtar_menu.py:89 models.py:339
#: templates/ishtar/dashboards/dashboard_file.html:7
msgid "Archaeological files"
msgstr ""
-#: models.py:43
+#: models.py:44
msgid "Archaeological file type"
msgstr ""
-#: models.py:44
+#: models.py:45
msgid "Archaeological file types"
msgstr ""
-#: models.py:64
+#: models.py:65
msgid "Permit types"
msgstr ""
-#: models.py:74
+#: models.py:75
msgid "Delay (in days)"
msgstr ""
-#: models.py:127
+#: models.py:131 models.py:268
+msgid "Towns"
+msgstr ""
+
+#: models.py:137
msgctxt "key for text search"
msgid "year"
msgstr ""
-#: models.py:131
+#: models.py:141
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models.py:135
+#: models.py:145
msgctxt "key for text search"
msgid "other-reference"
msgstr ""
-#: models.py:139
+#: models.py:149
msgctxt "key for text search"
msgid "town"
msgstr ""
-#: models.py:143
+#: models.py:153
msgctxt "key for text search"
msgid "parcel"
msgstr ""
-#: models.py:147
+#: models.py:157
msgctxt "key for text search"
msgid "department"
msgstr ""
-#: models.py:151
+#: models.py:161
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models.py:155
+#: models.py:165
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models.py:159
+#: models.py:169
msgctxt "key for text search"
msgid "active"
msgstr ""
-#: models.py:163
+#: models.py:173
msgctxt "key for text search"
msgid "saisine-type"
msgstr ""
-#: models.py:167
+#: models.py:177
msgctxt "key for text search"
msgid "permit-type"
msgstr ""
-#: models.py:171
+#: models.py:181
msgctxt "key for text search"
msgid "permit-reference"
msgstr ""
-#: models.py:175
+#: models.py:185
msgctxt "key for text search"
msgid "comment"
msgstr ""
-#: models.py:179
+#: models.py:189
msgctxt "key for text search"
msgid "in-charge"
msgstr ""
-#: models.py:183
+#: models.py:193
msgctxt "key for text search"
msgid "general-contractor"
msgstr ""
-#: models.py:188
+#: models.py:198
msgctxt "key for text search"
msgid "general-contractor-organization"
msgstr ""
-#: models.py:192
+#: models.py:202
msgctxt "key for text search"
msgid "created-by"
msgstr ""
-#: models.py:196
+#: models.py:206
msgctxt "key for text search"
msgid "modified-by"
msgstr ""
-#: models.py:211
+#: models.py:224
msgid "Internal reference"
msgstr ""
-#: models.py:213
+#: models.py:226
msgid "External ID"
msgstr ""
-#: models.py:216
+#: models.py:229
msgid "External ID is set automatically"
msgstr ""
-#: models.py:228
+#: models.py:241
msgid "General contractor (raw)"
msgstr ""
-#: models.py:232
+#: models.py:245
msgid "General contractor organization"
msgstr ""
-#: models.py:240
+#: models.py:253
msgid "Planning service (raw)"
msgstr ""
-#: models.py:246
+#: models.py:259
msgid "Planning service organization"
msgstr ""
-#: models.py:252 templates/ishtar/sheet_file.html:55
+#: models.py:265 templates/ishtar/sheet_file.html:55
msgid "Closing date"
msgstr ""
-#: models.py:253
+#: models.py:266
msgid "Main town"
msgstr ""
-#: models.py:255
-msgid "Towns"
-msgstr ""
-
-#: models.py:268
+#: models.py:281
msgid "Instruction deadline"
msgstr ""
-#: models.py:274
+#: models.py:287
msgid "Locality"
msgstr ""
-#: models.py:277
+#: models.py:290
msgid "Main address - postal code"
msgstr ""
-#: models.py:287
+#: models.py:300
msgid "Organization"
msgstr ""
-#: models.py:292
+#: models.py:305
msgid "Research archaeology comment"
msgstr ""
-#: models.py:306
+#: models.py:324
msgid "Cached name"
msgstr ""
-#: models.py:308
+#: models.py:326
msgid "Imported line"
msgstr ""
-#: models.py:343
+#: models.py:364
msgid "FILE"
msgstr ""
-#: models.py:525
+#: models.py:546
msgid "Multi-town"
msgstr ""
-#: models.py:531
+#: models.py:552
msgid "No town"
msgstr ""
-#: models.py:695
+#: models.py:716
msgid "File"
msgstr ""
-#: templates/ishtar/administrativeact_document.html:17
+#: templates/ishtar/administrativeact_document.html:18
msgid "Document generation"
msgstr ""
-#: templates/ishtar/administrativeact_document.html:35
+#: templates/ishtar/administrativeact_document.html:36
msgid "Generate"
msgstr ""
@@ -613,63 +613,63 @@ msgstr ""
msgid "by"
msgstr ""
-#: templates/ishtar/sheet_file.html:67
+#: templates/ishtar/sheet_file.html:68
msgid "Localisation"
msgstr ""
-#: templates/ishtar/sheet_file.html:76
+#: templates/ishtar/sheet_file.html:77
msgid "Surface"
msgstr ""
-#: templates/ishtar/sheet_file.html:86
+#: templates/ishtar/sheet_file.html:87
msgid "Preventive archaeological file"
msgstr ""
-#: templates/ishtar/sheet_file.html:91
+#: templates/ishtar/sheet_file.html:92
msgid "Developed surface"
msgstr ""
-#: templates/ishtar/sheet_file.html:154
+#: templates/ishtar/sheet_file.html:155
msgid "Associated parcels"
msgstr ""
-#: templates/ishtar/sheet_file.html:157
+#: templates/ishtar/sheet_file.html:158
msgid "Administrative acts"
msgstr ""
-#: templates/ishtar/sheet_file.html:160 wizards.py:123
+#: templates/ishtar/sheet_file.html:161 wizards.py:127
msgid "Associated operations"
msgstr ""
-#: templates/ishtar/sheet_file.html:163 templates/ishtar/sheet_file.html:191
+#: templates/ishtar/sheet_file.html:164 templates/ishtar/sheet_file.html:192
msgid "Ref."
msgstr ""
-#: templates/ishtar/sheet_file.html:165 templates/ishtar/sheet_file.html:192
+#: templates/ishtar/sheet_file.html:166 templates/ishtar/sheet_file.html:193
msgid "Type"
msgstr ""
-#: templates/ishtar/sheet_file.html:167
+#: templates/ishtar/sheet_file.html:168
msgid "Start date"
msgstr ""
-#: templates/ishtar/sheet_file.html:168
+#: templates/ishtar/sheet_file.html:169
msgid "Excavation end date"
msgstr ""
-#: templates/ishtar/sheet_file.html:183
+#: templates/ishtar/sheet_file.html:184
msgid "No operation associated to this archaeological file"
msgstr ""
-#: templates/ishtar/sheet_file.html:187
+#: templates/ishtar/sheet_file.html:188
msgid "Admninistrative acts linked to associated operations"
msgstr ""
-#: templates/ishtar/sheet_file.html:193
+#: templates/ishtar/sheet_file.html:194
msgid "Date"
msgstr ""
-#: templates/ishtar/sheet_file.html:203
+#: templates/ishtar/sheet_file.html:204
msgid "No administrative act linked to operations"
msgstr ""
diff --git a/archaeological_files/migrations/0014_auto_20181017_1642.py b/archaeological_files/migrations/0014_auto_20181017_1642.py
new file mode 100644
index 000000000..a5868c692
--- /dev/null
+++ b/archaeological_files/migrations/0014_auto_20181017_1642.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['File']
+ reinit_last_modified(
+ apps, 'archaeological_files', models
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_files', '0013_file_documents'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='file',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalfile',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/archaeological_files/migrations/0015_auto_20181017_1854.py b/archaeological_files/migrations/0015_auto_20181017_1854.py
new file mode 100644
index 000000000..5c7eee3b4
--- /dev/null
+++ b/archaeological_files/migrations/0015_auto_20181017_1854.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_files', '0014_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='file',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='historicalfile',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ ]
diff --git a/archaeological_files/tests.py b/archaeological_files/tests.py
index 9f3693225..312204a14 100644
--- a/archaeological_files/tests.py
+++ b/archaeological_files/tests.py
@@ -137,6 +137,8 @@ class FileTest(TestCase, FileInit):
self.assertEqual(self.item.history.count(), nb_hist)
new_values = self.item.values()
for k in initial_values.keys():
+ if k == 'last_modified':
+ continue
self.assertTrue(k in new_values)
self.assertEqual(
new_values[k], initial_values[k],
diff --git a/archaeological_finds/forms.py b/archaeological_finds/forms.py
index fbcc32013..5ca8618d5 100644
--- a/archaeological_finds/forms.py
+++ b/archaeological_finds/forms.py
@@ -26,12 +26,13 @@ import logging
from django import forms
from django.core import validators
from django.core.exceptions import PermissionDenied
+from django.db.models import Q
from django.forms.formsets import formset_factory
from django.utils.translation import ugettext_lazy as _
import models
from archaeological_context_records.models import DatingType, DatingQuality, \
- ContextRecord, RelationType as CRRelationType
+ ContextRecord, RelationType as CRRelationType, Dating
from archaeological_finds.forms_treatments import TreatmentSelect, \
TreatmentFormSelection, BaseTreatmentForm, TreatmentModifyForm, \
AdministrativeActTreatmentForm, TreatmentFormFileChoice, \
@@ -43,7 +44,7 @@ from archaeological_finds.forms_treatments import TreatmentSelect, \
AdministrativeActTreatmentFileFormSelection, \
AdministrativeActTreatmentFileModifForm, \
DashboardForm as DashboardTreatmentForm, \
- DashboardTreatmentFileForm
+ DashboardTreatmentFileForm, QAFindTreatmentForm
from archaeological_operations.models import Period, ArchaeologicalSite, \
RelationType as OpeRelationType
from archaeological_operations.widgets import OAWidget
@@ -52,7 +53,7 @@ from bootstrap_datepicker.widgets import DatePicker
from ishtar_common import widgets
from ishtar_common.forms import CustomForm, CustomFormSearch, FormSet, \
FloatField, reverse_lazy, TableSelect, get_now, FinalForm, \
- ManageOldType, FieldType, IshtarForm, FormHeader
+ ManageOldType, FieldType, IshtarForm, FormHeader, QAForm, HistorySelect
from ishtar_common.forms_common import get_town_field
from ishtar_common.models import valid_id, valid_ids, get_current_profile, \
SpatialReferenceSystem, Area, OperationType
@@ -71,7 +72,7 @@ __all__ = [
'AdministrativeActTreatmentFileModifForm',
'DashboardTreatmentForm', 'DashboardTreatmentFileForm',
'RecordFormSelection', 'FindForm', 'DateForm', 'DatingFormSet',
- 'PreservationForm',
+ 'PreservationForm', 'FindBasketFormSelection', 'FindBasketForm',
'FindSelect', 'FindFormSelection', 'FindFormSelectionWarehouseModule',
'MultipleFindFormSelection', 'MultipleFindFormSelectionWarehouseModule',
'FindMultipleFormSelection', 'check_form', 'check_exist', 'check_not_exist',
@@ -79,6 +80,8 @@ __all__ = [
'check_treatment', 'ResultFindForm', 'ResultFindFormSet',
'FindDeletionForm', 'UpstreamFindFormSelection', 'NewFindBasketForm',
'SelectFindBasketForm', 'DeleteFindBasketForm', 'FindBasketAddItemForm',
+ 'QAFindFormSingle', 'QAFindFormMulti', 'QAFindBasketForm',
+ 'QAFindTreatmentForm'
]
logger = logging.getLogger(__name__)
@@ -207,24 +210,24 @@ class FindForm(CustomForm, ManageOldType):
dimensions_comment = forms.CharField(
label=_(u"Dimensions comment"), required=False, widget=forms.Textarea)
- HEADERS['get_first_base_find__topographic_localisation'] = FormHeader(
+ HEADERS['get_first_base_find__x'] = FormHeader(
_(u"Coordinates"))
- get_first_base_find__topographic_localisation = forms.CharField(
- label=_(u"Point of topographic reference"),
- required=False, max_length=120
- )
get_first_base_find__x = forms.FloatField(label=_(u"X"), required=False)
- get_first_base_find__y = forms.FloatField(label=_(u"Y"), required=False)
- get_first_base_find__z = forms.FloatField(label=_(u"Z"), required=False)
- get_first_base_find__spatial_reference_system = \
- forms.ChoiceField(label=_(u"Spatial Reference System"), required=False,
- choices=[])
get_first_base_find__estimated_error_x = \
forms.FloatField(label=_(u"Estimated error for X"), required=False)
+ get_first_base_find__y = forms.FloatField(label=_(u"Y"), required=False)
get_first_base_find__estimated_error_y = \
forms.FloatField(label=_(u"Estimated error for Y"), required=False)
+ get_first_base_find__z = forms.FloatField(label=_(u"Z"), required=False)
get_first_base_find__estimated_error_z = \
forms.FloatField(label=_(u"Estimated error for Z"), required=False)
+ get_first_base_find__spatial_reference_system = \
+ forms.ChoiceField(label=_(u"Spatial Reference System"), required=False,
+ choices=[])
+ get_first_base_find__topographic_localisation = forms.CharField(
+ label=_(u"Point of topographic reference"),
+ required=False, max_length=120
+ )
HEADERS['checked_type'] = FormHeader(_(u"Sheet"))
checked_type = forms.ChoiceField(label=_(u"Check"), required=False)
@@ -315,20 +318,197 @@ class FindForm(CustomForm, ManageOldType):
return self.cleaned_data
+class QAFindFormMulti(QAForm):
+ form_admin_name = _(u"Find - Quick action - Modify")
+ form_slug = "find-quickaction-modify"
+ base_models = ['get_first_base_find', 'qa_object_types',
+ 'qa_material_types', 'qa_communicabilities']
+ associated_models = {
+ 'qa_material_types': models.MaterialType,
+ 'qa_object_types': models.ObjectType,
+ 'qa_communicabilities': models.CommunicabilityType,
+ 'qa_checked_type': models.CheckedType,
+ 'qa_period': Period
+ }
+
+ MULTI = True
+ REPLACE_FIELDS = [
+ 'qa_ue', 'qa_manufacturing_place', 'qa_checked_type', 'qa_check_date'
+ ]
+
+ HEADERS = {
+ 'qa_ue': FormHeader(_(u"Context record")),
+ 'qa_label': FormHeader(_(u"Identification")),
+ 'qa_description': FormHeader(_(u"Description")),
+ 'qa_checked_type': FormHeader(_(u"Sheet")),
+ 'qa_period': FormHeader(_(u"Datation")),
+ }
+
+ SINGLE_FIELDS = [
+ 'qa_label', 'qa_denomination', 'qa_previous_id',
+ 'qa_get_first_base_find__excavation_id', 'qa_museum_id',
+ 'qa_seal_number', 'qa_mark'
+ ]
+ qa_ue = forms.IntegerField(
+ label=_(u"Context record"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-contextrecord'),
+ associated_model=ContextRecord),
+ validators=[valid_id(ContextRecord)], required=False)
+
+ qa_label = forms.CharField(
+ label=_(u"Free ID"),
+ validators=[validators.MaxLengthValidator(60)], required=False)
+ qa_denomination = forms.CharField(label=_(u"Denomination"), required=False)
+ qa_previous_id = forms.CharField(label=_("Previous ID"), required=False)
+ qa_get_first_base_find__excavation_id = forms.CharField(
+ label=_(u"Excavation ID"), required=False)
+ qa_museum_id = forms.CharField(label=_(u"Museum ID"), required=False)
+ qa_seal_number = forms.CharField(label=_(u"Seal number"), required=False)
+ qa_mark = forms.CharField(label=_(u"Mark"), required=False)
+
+ qa_description = forms.CharField(
+ label=_(u"Description"), widget=forms.Textarea, required=False)
+ qa_material_types = widgets.Select2MultipleField(
+ label=_(u"Material types"), required=False
+ )
+ qa_object_types = widgets.Select2MultipleField(
+ label=_(u"Object types"), required=False,
+ )
+ qa_manufacturing_place = forms.CharField(
+ label=_(u"Manufacturing place"), required=False)
+ qa_communicabilities = widgets.Select2MultipleField(
+ label=_(u"Communicability"), required=False
+ )
+ qa_comment = forms.CharField(
+ label=_(u"Comment"), required=False,
+ widget=forms.Textarea)
+
+ qa_checked_type = forms.ChoiceField(label=_(u"Check"), required=False)
+ qa_check_date = forms.DateField(
+ label=_(u"Check date"), widget=DatePicker, required=False)
+
+ qa_period = widgets.Select2MultipleField(
+ label=_("Period"), choices=[], required=False)
+ qa_dating_comment = forms.CharField(
+ label=_(u"Comment on dating"), required=False,
+ widget=forms.Textarea)
+
+ TYPES = [
+ FieldType('qa_material_types', models.MaterialType, is_multiple=True),
+ FieldType('qa_object_types', models.ObjectType, is_multiple=True),
+ FieldType('qa_communicabilities', models.CommunicabilityType,
+ is_multiple=True),
+ FieldType('qa_checked_type', models.CheckedType),
+ FieldType('qa_period', Period, is_multiple=True),
+ ]
+
+ def _get_qa_ue(self, value):
+ try:
+ value = ContextRecord.objects.get(pk=value).cached_label
+ except ContextRecord.DoesNotExist:
+ return ""
+ return value
+
+ def _set_qa_ue(self, item, user):
+ ue = self.cleaned_data['qa_ue']
+ if not ue:
+ return
+ cr = ContextRecord.objects.get(pk=ue)
+ bf = item.get_first_base_find()
+ bf.context_record = cr
+ bf.history_modifier = user
+ bf.save()
+
+ def _set_qa_period(self, item, user):
+ periods = self.cleaned_data['qa_period']
+ if not periods:
+ return
+ for period in periods:
+ if Dating.objects.filter(find=item, period__pk=period).count():
+ continue
+ d = Dating.objects.create(period_id=period)
+ item.datings.add(d)
+
+
+class QAFindFormSingle(QAFindFormMulti):
+ MULTI = False
+ form_admin_name = _(u"Find - Quick action - Modify single")
+ form_slug = "find-quickaction-modifysingle"
+
+ def __init__(self, *args, **kwargs):
+ super(QAFindFormSingle, self).__init__(*args, **kwargs)
+ if not self.items or \
+ not self.items[0].get_first_base_find(
+ ).context_record.operation.operation_type.judiciary:
+ self.fields.pop('qa_seal_number')
+
+
+class QAFindBasketForm(IshtarForm):
+ create_or_update = forms.ChoiceField(
+ choices=(('create', _(u"Create")),
+ ('update', _(u"Update"))), initial='create')
+ label = forms.CharField(label="", max_length=None, required=False)
+ basket = forms.ChoiceField(label=_(u"Basket"), required=False, choices=[])
+
+ def __init__(self, *args, **kwargs):
+ self.user = None
+ if 'user' in kwargs:
+ self.user = kwargs.pop('user')
+ if hasattr(self.user, 'ishtaruser'):
+ self.user = self.user.ishtaruser
+ self.items = kwargs.pop('items')
+
+ super(QAFindBasketForm, self).__init__(*args, **kwargs)
+ if not self.user:
+ return
+ self.fields['basket'].choices = [
+ (b.pk, unicode(b))
+ for b in models.FindBasket.objects.filter(user=self.user)
+ ]
+
+ def clean(self):
+ if self.cleaned_data['create_or_update'] == 'update':
+ if not self.cleaned_data['basket']:
+ raise forms.ValidationError(
+ _(u"On update, you have to select a basket."))
+ return self.cleaned_data
+ label = self.cleaned_data['label'].strip()
+ if not label:
+ raise forms.ValidationError(_(u"A label is required."))
+ if models.FindBasket.objects.filter(user=self.user,
+ label=label).count():
+ raise forms.ValidationError(_(u"A basket with this label already "
+ u"exists."))
+ return self.cleaned_data
+
+ def save(self, items):
+ if self.cleaned_data['create_or_update'] == 'update':
+ basket = models.FindBasket.objects.get(
+ user=self.user, pk=self.cleaned_data['basket'])
+ else:
+ label = self.cleaned_data['label'].strip()
+ basket = models.FindBasket.objects.create(
+ user=self.user, label=label)
+ for item in items:
+ basket.items.add(item)
+
+
class PreservationForm(CustomForm, ManageOldType):
form_label = _("Preservation")
form_admin_name = _(u"Find - 030 - Preservation")
form_slug = "find-030-preservation"
base_models = ['alteration', 'alteration_cause',
'preservation_to_consider', 'integritie', 'remarkabilitie']
- associated_models = {'alteration': models.AlterationType,
- 'alteration_cause': models.AlterationCauseType,
- 'treatment_emergency': models.TreatmentEmergencyType,
- 'conservatory_state': models.ConservatoryState,
- 'preservation_to_consider': models.TreatmentType,
- 'remarkabilitie': models.RemarkabilityType,
- 'integritie': models.IntegrityType,
- }
+ associated_models = {
+ 'alteration': models.AlterationType,
+ 'alteration_cause': models.AlterationCauseType,
+ 'treatment_emergency': models.TreatmentEmergencyType,
+ 'conservatory_state': models.ConservatoryState,
+ 'preservation_to_consider': models.TreatmentType,
+ 'remarkabilitie': models.RemarkabilityType,
+ 'integritie': models.IntegrityType,
+ }
integritie = forms.MultipleChoiceField(
label=_(u"Integrity / interest"), choices=[],
widget=widgets.Select2Multiple, required=False)
@@ -406,7 +586,7 @@ DatingFormSet.form_admin_name = _(u"Find - 040 - Dating")
DatingFormSet.form_slug = "find-040-dating"
-class FindSelect(CustomForm, TableSelect):
+class FindSelect(HistorySelect):
_model = models.Find
form_admin_name = _(u"Find - 001 - Search")
@@ -545,7 +725,7 @@ class FindFormSelection(CustomFormSearch):
label="", required=False,
widget=widgets.DataTable(
reverse_lazy('get-find'),
- FindSelect, models.Find,
+ FindSelect, models.Find,
source_full=reverse_lazy('get-find-full')),
validators=[valid_id(models.Find)])
@@ -739,6 +919,43 @@ class UpstreamFindFormSelection(FindFormSelection):
self.fields['resulting_pk'] = self.fields.pop('pk')
+class FindBasketSelect(CustomForm, TableSelect):
+ _model = models.FindBasket
+
+ form_admin_name = _(u"Find basket - 001 - Search")
+ form_slug = "findbasket-001-search"
+ search_vector = forms.CharField(
+ label=_(u"Full text search"), widget=widgets.SearchWidget(
+ 'archaeological-finds', 'findbasket'
+ ))
+
+ label = forms.CharField(label=_(u"Denomination"))
+
+
+class FindBasketFormSelection(CustomFormSearch):
+ SEARCH_AND_SELECT = True
+ form_label = _("Basket search")
+ associated_models = {'pk': models.FindBasket}
+ currents = {'pk': models.FindBasket}
+
+ pk = forms.IntegerField(
+ label="", required=False,
+ widget=widgets.DataTable(
+ reverse_lazy('get-findbasket'),
+ FindBasketSelect, models.FindBasket,
+ ),
+ validators=[valid_id(models.FindBasket)])
+
+
+class FindBasketForm(IshtarForm):
+ form_label = _(u"Find basket")
+ label = forms.CharField(
+ label=_(u"Label"),
+ validators=[validators.MaxLengthValidator(1000)])
+ comment = forms.CharField(label=_(u"Comment"),
+ widget=forms.Textarea, required=False)
+
+
class NewFindBasketForm(forms.ModelForm):
class Meta:
model = models.FindBasket
@@ -780,7 +997,9 @@ class SelectFindBasketForm(IshtarForm):
return
self.fields['basket'].choices = [('', '--')] + [
(b.pk, unicode(b))
- for b in models.FindBasket.objects.filter(user=self.user)]
+ for b in models.FindBasket.objects.filter(
+ Q(user=self.user) | Q(shared_with=self.user)
+ )]
class DeleteFindBasketForm(SelectFindBasketForm):
@@ -800,8 +1019,9 @@ class FindBasketAddItemForm(forms.Form):
def save(self, user):
try:
- basket = models.FindBasket.objects.get(
- pk=self.cleaned_data['basket_id'], user=user)
+ basket = models.FindBasket.objects.filter(
+ Q(user=user) | Q(shared_with=user)
+ ).get(pk=self.cleaned_data['basket_id'])
item = models.Find.objects.get(
pk=self.cleaned_data['item_id'])
except models.FindBasket.DoesNotExist or\
@@ -810,8 +1030,8 @@ class FindBasketAddItemForm(forms.Form):
raise PermissionDenied
# check rights
if not user.user_ptr.is_superuser and \
- not user.has_right('change_find') and \
- not (user.has_right('change_own_find')
+ not user.has_right('view_find') and \
+ not (user.has_right('view_own_find')
and item.is_own(user)):
raise PermissionDenied
basket.items.add(item)
diff --git a/archaeological_finds/forms_treatments.py b/archaeological_finds/forms_treatments.py
index 11cfd3173..b09d234f0 100644
--- a/archaeological_finds/forms_treatments.py
+++ b/archaeological_finds/forms_treatments.py
@@ -280,6 +280,92 @@ class TreatmentDeletionForm(FinalForm):
confirm_end_msg = _(u"Would you like to delete this treatment?")
+class QAFindTreatmentForm(IshtarForm):
+ container = forms.IntegerField(
+ label=_(u"Container"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-container'),
+ associated_model=Container, new=True),
+ validators=[valid_id(Container)])
+ create_treatment = forms.BooleanField(
+ label=_(u"Create a treatment"), required=False,
+ widget=widgets.CheckboxInput
+ )
+ year = forms.IntegerField(
+ label=_("Year"), initial=lambda: datetime.datetime.now().year,
+ validators=[validators.MinValueValidator(1000),
+ validators.MaxValueValidator(2100)], required=False)
+ start_date = forms.DateField(label=_(u"Precise date"), required=False,
+ widget=DatePicker)
+ person = forms.IntegerField(
+ label=_(u"Responsible"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-person'), associated_model=Person,
+ new=True),
+ validators=[valid_id(Person)], required=False)
+ organization = forms.IntegerField(
+ label=_(u"Organization"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-organization'),
+ associated_model=Organization, new=True),
+ validators=[valid_id(Organization)], required=False)
+
+ def __init__(self, *args, **kwargs):
+ self.confirm = False
+ self.user = None
+ if 'user' in kwargs:
+ self.user = kwargs.pop('user')
+ if hasattr(self.user, 'ishtaruser'):
+ self.user = self.user.ishtaruser
+ self.items = kwargs.pop('items')
+
+ super(QAFindTreatmentForm, self).__init__(*args, **kwargs)
+ if not self.user:
+ return
+
+ q = Person.objects.filter(ishtaruser__pk=self.user.pk)
+ if q.count():
+ person = q.all()[0]
+ self.fields['person'].initial = person.pk
+
+ def clean(self):
+ if not self.cleaned_data['create_treatment']:
+ return self.cleaned_data
+
+ year = self.cleaned_data['year']
+ if not year:
+ if self.cleaned_data['start_date']:
+ self.cleaned_data['year'] = self.cleaned_data['start_date'].year
+ else:
+ raise forms.ValidationError(_(u"At least a year is required."))
+ return self.cleaned_data
+
+ def save(self, items, user):
+ container = Container.objects.get(pk=self.cleaned_data['container'])
+ if self.cleaned_data['create_treatment']:
+ packaging, created = models.TreatmentType.objects.get_or_create(
+ label=u"Conditionnement",
+ txt_idx='packaging'
+ )
+ t = models.Treatment.objects.create(
+ container=container,
+ year=self.cleaned_data['year'],
+ start_date=self.cleaned_data['start_date'],
+ location=container.location,
+ person_id=self.cleaned_data['person'],
+ organization_id=self.cleaned_data['organization'],
+ history_modifier=user
+ )
+ t.treatment_types.add(packaging)
+ t.save(items=items)
+ return
+ for find in items:
+ if find.container == container:
+ continue
+ find.container = container
+ find.save()
+
+
SLICING = (("month", _(u"months")), ('year', _(u"years")),)
DATE_SOURCE = (("start", _(u"Start date")), ("end", _(u"Closing date")),)
@@ -545,6 +631,7 @@ class TreatmentFileDeletionForm(FinalForm):
confirm_msg = _(u"Are you sure you want to delete this treatment request?")
confirm_end_msg = _(u"Would you like to delete this treatment request?")
+
DATE_SOURCE_FILE = (
("creation", _(u"Creation date")),
("reception", _(u"Reception date")),
diff --git a/archaeological_finds/ishtar_menu.py b/archaeological_finds/ishtar_menu.py
index c72e9c089..afd624b74 100644
--- a/archaeological_finds/ishtar_menu.py
+++ b/archaeological_finds/ishtar_menu.py
@@ -24,7 +24,7 @@ from ishtar_common.menu_base import SectionItem, MenuItem
from archaeological_operations.models import AdministrativeAct
import models
-# be carreful: each access_controls must be relevant with check_rights in urls
+# be careful: each access_controls must be relevant with check_rights in urls
MENU_SECTIONS = [
(50,
@@ -56,22 +56,33 @@ MENU_SECTIONS = [
SectionItem(
'find_basket', _(u"Basket"),
childs=[
+ MenuItem('find_basket_search',
+ _(u"Search"),
+ model=models.FindBasket,
+ access_controls=['view_find',
+ 'view_own_find']),
MenuItem('find_basket_creation',
_(u"Creation"),
model=models.FindBasket,
- access_controls=['change_find',
- 'change_own_find']),
+ access_controls=['view_find',
+ 'view_own_find']),
+ MenuItem('find_basket_modification',
+ _(u"Modification"),
+ model=models.FindBasket,
+ access_controls=[
+ 'view_find',
+ 'view_own_find']),
MenuItem('find_basket_modification_add',
_(u"Manage items"),
model=models.FindBasket,
access_controls=[
- 'change_find',
- 'change_own_find']),
+ 'view_find',
+ 'view_own_find']),
MenuItem('find_basket_deletion',
_(u"Deletion"),
model=models.FindBasket,
- access_controls=['change_find',
- 'change_own_find']),
+ access_controls=['view_find',
+ 'view_own_find']),
]),
# MenuItem(
# 'treatment_creation', _(u"Add a treatment"),
diff --git a/archaeological_finds/locale/django.pot b/archaeological_finds/locale/django.pot
index 63d0d1c18..a15710acc 100644
--- a/archaeological_finds/locale/django.pot
+++ b/archaeological_finds/locale/django.pot
@@ -9,505 +9,559 @@
msgid ""
msgstr ""
-#: admin.py:39 models_finds.py:285
+#: admin.py:39 models_finds.py:288
msgid "Point (2D)"
msgstr ""
-#: admin.py:41 models_finds.py:287
+#: admin.py:41 models_finds.py:290
msgid "Line"
msgstr ""
-#: admin.py:43 models_finds.py:288
+#: admin.py:43 models_finds.py:291
msgid "Multi polygon"
msgstr ""
-#: forms.py:88 forms.py:94 forms.py:451 models_finds.py:619
-#: models_finds.py:1085 wizards.py:71
+#: forms.py:91 forms.py:97 forms.py:340 forms.py:353 forms.py:631
+#: models_finds.py:660 models_finds.py:1212 wizards.py:75
msgid "Context record"
msgstr ""
-#: forms.py:89
+#: forms.py:92
msgid "Find - 010 - Context record choice"
msgstr ""
-#: forms.py:123 ishtar_menu.py:32 models_finds.py:986 models_finds.py:1579
-#: models_treatments.py:338 templates/ishtar/sheet_find.html:4
+#: forms.py:126 ishtar_menu.py:32 models_finds.py:1089 models_finds.py:1716
+#: models_treatments.py:349 templates/ishtar/sheet_find.html:4
msgid "Find"
msgstr ""
-#: forms.py:124
+#: forms.py:127
msgid "Find - 020 - General"
msgstr ""
-#: forms.py:139 templates/ishtar/sheet_find.html:119
+#: forms.py:142 forms.py:341 templates/ishtar/sheet_find.html:40
msgid "Identification"
msgstr ""
-#: forms.py:142 forms.py:420 forms.py:702 models_finds.py:250
-#: models_finds.py:855 templates/ishtar/sheet_find.html:19
+#: forms.py:145 forms.py:360 forms.py:600 forms.py:889 models_finds.py:253
+#: models_finds.py:968
msgid "Free ID"
msgstr ""
-#: forms.py:144 forms.py:421 models_finds.py:856
-#: templates/ishtar/sheet_find.html:18
+#: forms.py:147 forms.py:362 forms.py:601 forms.py:932 models_finds.py:969
msgid "Denomination"
msgstr ""
-#: forms.py:145 models_finds.py:929
+#: forms.py:148 forms.py:363 models_finds.py:1042
msgid "Previous ID"
msgstr ""
-#: forms.py:147 models_finds.py:254
+#: forms.py:150 forms.py:365 models_finds.py:257
msgid "Excavation ID"
msgstr ""
-#: forms.py:148 models_finds.py:857
+#: forms.py:151 forms.py:366 models_finds.py:970
msgid "Museum ID"
msgstr ""
-#: forms.py:149 models_finds.py:852
+#: forms.py:152 forms.py:367 models_finds.py:965
msgid "Seal number"
msgstr ""
-#: forms.py:150 models_finds.py:925
+#: forms.py:153 forms.py:368 models_finds.py:1038
msgid "Mark"
msgstr ""
-#: forms.py:152 forms.py:153 forms.py:471 forms_treatments.py:139
-#: models_finds.py:255 models_finds.py:858 models_treatments.py:138
-#: templates/ishtar/sheet_find.html:134
+#: forms.py:155 forms.py:156 forms.py:342 forms.py:371 forms.py:652
+#: forms_treatments.py:139 models_finds.py:258 models_finds.py:971
+#: models_treatments.py:146 templates/ishtar/sheet_find.html:58
msgid "Description"
msgstr ""
-#: forms.py:156 models_finds.py:262
+#: forms.py:159 models_finds.py:265
msgid "Discovery date (exact or TPQ)"
msgstr ""
-#: forms.py:159 models_finds.py:264 templates/ishtar/sheet_find.html:78
+#: forms.py:162 models_finds.py:267 templates/ishtar/sheet_basefind.html:29
msgid "Discovery date (TAQ)"
msgstr ""
-#: forms.py:161 forms.py:473 models_finds.py:266
+#: forms.py:164 forms.py:654 models_finds.py:269
msgid "Batch/object"
msgstr ""
-#: forms.py:163 models_finds.py:890
+#: forms.py:166 models_finds.py:1003
msgid "Is complete?"
msgstr ""
-#: forms.py:166 models_finds.py:54 models_finds.py:642 models_finds.py:864
+#: forms.py:169 forms.py:373 models_finds.py:57 models_finds.py:685
+#: models_finds.py:977
msgid "Material types"
msgstr ""
-#: forms.py:169 models_finds.py:869
+#: forms.py:172 models_finds.py:982
msgid "Material type quality"
msgstr ""
-#: forms.py:171 models_finds.py:149 models_finds.py:643 models_finds.py:893
+#: forms.py:174 forms.py:376 models_finds.py:152 models_finds.py:686
+#: models_finds.py:1006
msgid "Object types"
msgstr ""
-#: forms.py:174 models_finds.py:898
+#: forms.py:177 models_finds.py:1011
msgid "Object type quality"
msgstr ""
-#: forms.py:175 forms.py:709 models_finds.py:876
+#: forms.py:178 forms.py:896 models_finds.py:989
msgid "Find number"
msgstr ""
-#: forms.py:177 models_finds.py:911
+#: forms.py:180 models_finds.py:1024
msgid "Minimum number of individuals (MNI)"
msgstr ""
-#: forms.py:179 models_finds.py:859
+#: forms.py:182 models_finds.py:972
msgid "Decoration"
msgstr ""
-#: forms.py:181 models_finds.py:860
+#: forms.py:184 models_finds.py:973
msgid "Inscription"
msgstr ""
-#: forms.py:184 models_finds.py:862
+#: forms.py:187 forms.py:379 models_finds.py:975
msgid "Manufacturing place"
msgstr ""
-#: forms.py:186 models_finds.py:908
+#: forms.py:189 forms.py:381 models_finds.py:1021
msgid "Communicability"
msgstr ""
-#: forms.py:188 forms_treatments.py:141 forms_treatments.py:491
-#: models_finds.py:256 models_finds.py:926 models_treatments.py:137
-#: models_treatments.py:595
+#: forms.py:191 forms.py:384 forms.py:955 forms_treatments.py:141
+#: forms_treatments.py:577 models_finds.py:259 models_finds.py:1039
+#: models_treatments.py:145 models_treatments.py:609
msgid "Comment"
msgstr ""
-#: forms.py:191 models_finds.py:927
+#: forms.py:194 forms.py:394 models_finds.py:1040
msgid "Comment on dating"
msgstr ""
-#: forms.py:193 templates/ishtar/sheet_find.html:152
+#: forms.py:196 templates/ishtar/sheet_find.html:76
msgid "Dimensions"
msgstr ""
-#: forms.py:194 models_finds.py:912
+#: forms.py:197 models_finds.py:1025
msgid "Length (cm)"
msgstr ""
-#: forms.py:195 models_finds.py:913
+#: forms.py:198 models_finds.py:1026
msgid "Width (cm)"
msgstr ""
-#: forms.py:196 models_finds.py:914
+#: forms.py:199 models_finds.py:1027
msgid "Height (cm)"
msgstr ""
-#: forms.py:197 models_finds.py:915
+#: forms.py:200 models_finds.py:1028
msgid "Diameter (cm)"
msgstr ""
-#: forms.py:198 models_finds.py:916
+#: forms.py:201 models_finds.py:1029
msgid "Thickness (cm)"
msgstr ""
-#: forms.py:199 forms.py:707 models_finds.py:872
+#: forms.py:202 forms.py:894 models_finds.py:985
msgid "Volume (l)"
msgstr ""
-#: forms.py:200 forms.py:708 templates/ishtar/sheet_find.html:160
+#: forms.py:203 forms.py:895 templates/ishtar/sheet_find.html:84
msgid "Weight (g)"
msgstr ""
-#: forms.py:202
+#: forms.py:205
msgid "Clutter long side (cm)"
msgstr ""
-#: forms.py:204
+#: forms.py:207
msgid "Clutter short side (cm)"
msgstr ""
-#: forms.py:206
+#: forms.py:209
msgid "Clutter height (cm)"
msgstr ""
-#: forms.py:208 models_finds.py:923
+#: forms.py:211 models_finds.py:1036
msgid "Dimensions comment"
msgstr ""
-#: forms.py:211 templates/ishtar/sheet_find.html:94
-#: templates/ishtar/sheet_find.html:98
+#: forms.py:214 templates/ishtar/sheet_basefind.html:46
+#: templates/ishtar/sheet_basefind.html:50
msgid "Coordinates"
msgstr ""
-#: forms.py:213 models_finds.py:271
-msgid "Point of topographic reference"
+#: forms.py:215 models_finds.py:276
+msgid "X"
msgstr ""
-#: forms.py:216 models_finds.py:273
-msgid "X"
+#: forms.py:217 models_finds.py:279
+msgid "Estimated error for X"
msgstr ""
-#: forms.py:217 models_finds.py:274
+#: forms.py:218 models_finds.py:277
msgid "Y"
msgstr ""
-#: forms.py:218 models_finds.py:275
-msgid "Z"
+#: forms.py:220 models_finds.py:281
+msgid "Estimated error for Y"
msgstr ""
-#: forms.py:220 models_finds.py:283
-msgid "Spatial Reference System"
+#: forms.py:221 models_finds.py:278
+msgid "Z"
msgstr ""
-#: forms.py:223 models_finds.py:276
-msgid "Estimated error for X"
+#: forms.py:223 models_finds.py:283
+msgid "Estimated error for Z"
msgstr ""
-#: forms.py:225 models_finds.py:278
-msgid "Estimated error for Y"
+#: forms.py:225 models_finds.py:286
+msgid "Spatial Reference System"
msgstr ""
-#: forms.py:227 models_finds.py:280
-msgid "Estimated error for Z"
+#: forms.py:228 models_finds.py:274
+msgid "Point of topographic reference"
msgstr ""
-#: forms.py:229 templates/ishtar/sheet_find.html:169
+#: forms.py:232 forms.py:343 templates/ishtar/sheet_basefind.html:66
+#: templates/ishtar/sheet_find.html:93
msgid "Sheet"
msgstr ""
-#: forms.py:230 forms.py:474 models_finds.py:931
+#: forms.py:233 forms.py:387 forms.py:655 models_finds.py:1044
msgid "Check"
msgstr ""
-#: forms.py:232 models_finds.py:933
+#: forms.py:235 forms.py:389 models_finds.py:1046
msgid "Check date"
msgstr ""
-#: forms.py:271
+#: forms.py:274
msgid ""
"Discovery date: if a TAQ date is provided a TPQ date has to be informed. If "
"you have a precise date fill only the TPQ - discovery date field."
msgstr ""
-#: forms.py:277
+#: forms.py:280
msgid "Discovery date: TAQ date must be older than TPQ date."
msgstr ""
-#: forms.py:287
+#: forms.py:290
msgid "Clutter: short side cannot be bigger than the long side."
msgstr ""
-#: forms.py:304
+#: forms.py:307
msgid "You should at least provide X, Y and the spatial reference system used."
msgstr ""
-#: forms.py:313
+#: forms.py:316
msgid "Coordinates are not relevant for the spatial reference system used: {}."
msgstr ""
-#: forms.py:319 templates/ishtar/sheet_find.html:182
+#: forms.py:322
+msgid "Find - Quick action - Modify"
+msgstr ""
+
+#: forms.py:344
+msgid "Datation"
+msgstr ""
+
+#: forms.py:392 forms.py:565 forms.py:641 templates/ishtar/sheet_find.html:123
+msgid "Period"
+msgstr ""
+
+#: forms.py:436
+msgid "Find - Quick action - Modify single"
+msgstr ""
+
+#: forms.py:449
+msgid "Create"
+msgstr ""
+
+#: forms.py:450
+msgid "Update"
+msgstr ""
+
+#: forms.py:452 forms.py:636 forms.py:982 forms.py:986 forms_treatments.py:180
+#: ishtar_menu.py:57 models_finds.py:926
+#: templates/ishtar/sheet_findbasket.html:4 views.py:646
+msgid "Basket"
+msgstr ""
+
+#: forms.py:474
+msgid "On update, you have to select a basket."
+msgstr ""
+
+#: forms.py:478
+msgid "A label is required."
+msgstr ""
+
+#: forms.py:481
+msgid "A basket with this label already exists."
+msgstr ""
+
+#: forms.py:498 templates/ishtar/sheet_find.html:102
msgid "Preservation"
msgstr ""
-#: forms.py:320
+#: forms.py:499
msgid "Find - 030 - Preservation"
msgstr ""
-#: forms.py:333 forms.py:467 models_finds.py:902
+#: forms.py:513 forms.py:648 models_finds.py:1015
msgid "Integrity / interest"
msgstr ""
-#: forms.py:336 forms.py:469 models_finds.py:905
+#: forms.py:516 forms.py:650 models_finds.py:1018
msgid "Remarkability"
msgstr ""
-#: forms.py:338 forms.py:465 models_finds.py:77 models_finds.py:943
+#: forms.py:518 forms.py:646 models_finds.py:80 models_finds.py:1056
msgid "Conservatory state"
msgstr ""
-#: forms.py:341 models_finds.py:952
+#: forms.py:521 models_finds.py:1065
msgid "Alteration"
msgstr ""
-#: forms.py:344 models_finds.py:956
+#: forms.py:524 models_finds.py:1069
msgid "Alteration cause"
msgstr ""
-#: forms.py:347 models_finds.py:949
+#: forms.py:527 models_finds.py:1062
msgid "Recommended treatments"
msgstr ""
-#: forms.py:349 models_finds.py:960
+#: forms.py:529 models_finds.py:1073
msgid "Treatment emergency"
msgstr ""
-#: forms.py:351 models_finds.py:935
+#: forms.py:531 models_finds.py:1048
msgid "Estimated value"
msgstr ""
-#: forms.py:352 models_finds.py:963
+#: forms.py:532 models_finds.py:1076
msgid "Insurance value"
msgstr ""
-#: forms.py:354 models_finds.py:965
+#: forms.py:534 models_finds.py:1078
msgid "Appraisal date"
msgstr ""
-#: forms.py:356 models_finds.py:945
+#: forms.py:536 models_finds.py:1058
msgid "Conservatory comment"
msgstr ""
-#: forms.py:380 forms.py:404 models_finds.py:884
-#: templates/ishtar/sheet_find.html:199
+#: forms.py:560 forms.py:584 models_finds.py:997
+#: templates/ishtar/sheet_find.html:119
msgid "Dating"
msgstr ""
-#: forms.py:385 forms.py:460
-msgid "Period"
-msgstr ""
-
-#: forms.py:386 forms_treatments.py:143 forms_treatments.py:284
-#: forms_treatments.py:493 models_finds.py:1584 models_treatments.py:140
-#: models_treatments.py:349 templates/ishtar/sheet_find.html:232
-#: templates/ishtar/sheet_find.html:270
+#: forms.py:566 forms_treatments.py:143 forms_treatments.py:370
+#: forms_treatments.py:579 models_finds.py:1721 models_treatments.py:148
+#: models_treatments.py:360 templates/ishtar/sheet_find.html:124
+#: templates/ishtar/sheet_find.html:185 templates/ishtar/sheet_find.html:223
msgid "Start date"
msgstr ""
-#: forms.py:388 models_finds.py:1585 models_treatments.py:350
-#: templates/ishtar/sheet_find.html:233 templates/ishtar/sheet_find.html:271
+#: forms.py:568 models_finds.py:1722 models_treatments.py:361
+#: templates/ishtar/sheet_find.html:125 templates/ishtar/sheet_find.html:186
+#: templates/ishtar/sheet_find.html:224
msgid "End date"
msgstr ""
-#: forms.py:389
+#: forms.py:569 templates/ishtar/sheet_find.html:127
msgid "Quality"
msgstr ""
-#: forms.py:391
+#: forms.py:571 templates/ishtar/sheet_find.html:126
msgid "Dating type"
msgstr ""
-#: forms.py:393
+#: forms.py:573 templates/ishtar/sheet_find.html:128
msgid "Precise dating"
msgstr ""
-#: forms.py:405
+#: forms.py:585
msgid "Find - 040 - Dating"
msgstr ""
-#: forms.py:412
+#: forms.py:592
msgid "Find - 001 - Search"
msgstr ""
-#: forms.py:415 forms_treatments.py:50 forms_treatments.py:333
-#: forms_treatments.py:406 forms_treatments.py:598
+#: forms.py:595 forms.py:928 forms_treatments.py:50 forms_treatments.py:419
+#: forms_treatments.py:492 forms_treatments.py:685
msgid "Full text search"
msgstr ""
-#: forms.py:418 models_finds.py:291
+#: forms.py:598 models_finds.py:294
msgid "Short ID"
msgstr ""
-#: forms.py:419 models_finds.py:294
+#: forms.py:599 models_finds.py:297
msgid "Complete ID"
msgstr ""
-#: forms.py:424 forms_treatments.py:56 forms_treatments.py:101
-#: forms_treatments.py:336 forms_treatments.py:411 forms_treatments.py:463
-#: forms_treatments.py:601 models_treatments.py:114 models_treatments.py:568
+#: forms.py:604 forms_treatments.py:56 forms_treatments.py:101
+#: forms_treatments.py:295 forms_treatments.py:422 forms_treatments.py:497
+#: forms_treatments.py:549 forms_treatments.py:688 models_treatments.py:122
+#: models_treatments.py:582
msgid "Year"
msgstr ""
-#: forms.py:426
+#: forms.py:606
msgid "Operation's number (index by year)"
msgstr ""
-#: forms.py:429
+#: forms.py:609
msgid "Code PATRIARCHE"
msgstr ""
-#: forms.py:433
+#: forms.py:613
msgid "Operation type"
msgstr ""
-#: forms.py:436
+#: forms.py:616
msgid "Areas"
msgstr ""
-#: forms.py:439
+#: forms.py:619
msgid "Archaeological site (attached to the operation)"
msgstr ""
-#: forms.py:445
+#: forms.py:625
msgid "Archaeological site (attached to the context record)"
msgstr ""
-#: forms.py:457
+#: forms.py:638
msgid "Search within related operations"
msgstr ""
-#: forms.py:459
+#: forms.py:640
msgid "Search within related context records"
msgstr ""
-#: forms.py:461 forms.py:706 models_finds.py:53
+#: forms.py:642 forms.py:893 models_finds.py:56
msgid "Material type"
msgstr ""
-#: forms.py:462 models_finds.py:148
+#: forms.py:643 models_finds.py:151
msgid "Object type"
msgstr ""
-#: forms.py:464
+#: forms.py:645
msgid "Preservation type"
msgstr ""
-#: forms.py:475 forms_treatments.py:59
+#: forms.py:656 forms_treatments.py:59
msgid "Has an image?"
msgstr ""
-#: forms.py:516
+#: forms.py:703
msgid "Warehouse (location)"
msgstr ""
-#: forms.py:522
+#: forms.py:709
msgid "Warehouse (responsible)"
msgstr ""
-#: forms.py:527
+#: forms.py:714
msgid "Container ID"
msgstr ""
-#: forms.py:528
+#: forms.py:715
msgid "Container ref."
msgstr ""
-#: forms.py:533 forms.py:557 views.py:156
+#: forms.py:720 forms.py:744 views.py:185
msgid "Find search"
msgstr ""
-#: forms.py:582 models_treatments.py:247
+#: forms.py:769 models_treatments.py:258
#: templates/ishtar/sheet_treatment.html:56
msgid "Upstream finds"
msgstr ""
-#: forms.py:584 models_finds.py:987
+#: forms.py:771 models_finds.py:1090
+#: templates/ishtar/forms/qa_find_treatment.html:11
msgid "Finds"
msgstr ""
-#: forms.py:596
+#: forms.py:783
msgid "You should at least select one archaeological find."
msgstr ""
-#: forms.py:699
+#: forms.py:886
msgid "Resulting find"
msgstr ""
-#: forms.py:704
+#: forms.py:891
msgid "Precise description"
msgstr ""
-#: forms.py:718
+#: forms.py:905
msgid "Resulting finds"
msgstr ""
-#: forms.py:723
+#: forms.py:910
msgid "Would you like to delete this find?"
msgstr ""
-#: forms.py:727 models_treatments.py:66
+#: forms.py:914 models_treatments.py:68
msgid "Upstream find"
msgstr ""
-#: forms.py:748
-msgid "Another basket already exists with this name."
+#: forms.py:925
+#| msgid "Find - 001 - Search"
+msgid "Find basket - 001 - Search"
msgstr ""
-#: forms.py:758 forms.py:762 forms_treatments.py:180 ishtar_menu.py:57
-msgid "Basket"
+#: forms.py:937 views.py:122
+#| msgid "Treatment search"
+msgid "Basket search"
+msgstr ""
+
+#: forms.py:951
+msgid "Find basket"
msgstr ""
-#: forms_treatments.py:54 forms_treatments.py:97 models_treatments.py:110
-#: templates/ishtar/sheet_find.html:226 templates/ishtar/sheet_find.html:264
+#: forms.py:953 forms_treatments.py:54 forms_treatments.py:97
+#: models_treatments.py:118 templates/ishtar/sheet_find.html:179
+#: templates/ishtar/sheet_find.html:217
msgid "Label"
msgstr ""
-#: forms_treatments.py:55 forms_treatments.py:100 models_treatments.py:112
+#: forms.py:972
+msgid "Another basket already exists with this name."
+msgstr ""
+
+#: forms_treatments.py:55 forms_treatments.py:100 models_treatments.py:120
msgid "Other ref."
msgstr ""
-#: forms_treatments.py:57 forms_treatments.py:232 forms_treatments.py:337
-#: forms_treatments.py:399 forms_treatments.py:412 forms_treatments.py:516
-#: forms_treatments.py:602 forms_treatments.py:669 models_treatments.py:115
-#: models_treatments.py:569
+#: forms_treatments.py:57 forms_treatments.py:232 forms_treatments.py:423
+#: forms_treatments.py:485 forms_treatments.py:498 forms_treatments.py:602
+#: forms_treatments.py:689 forms_treatments.py:756 models_treatments.py:123
+#: models_treatments.py:583
msgid "Index"
msgstr ""
-#: forms_treatments.py:58 forms_treatments.py:106 forms_treatments.py:292
-#: forms_treatments.py:353 models_finds.py:103 models_treatments.py:120
-#: models_treatments.py:348
+#: forms_treatments.py:58 forms_treatments.py:106 forms_treatments.py:378
+#: forms_treatments.py:439 models_finds.py:106 models_treatments.py:128
+#: models_treatments.py:359
msgid "Treatment type"
msgstr ""
-#: forms_treatments.py:71 views.py:383
+#: forms_treatments.py:71 views.py:420
msgid "Treatment search"
msgstr ""
@@ -519,8 +573,8 @@ msgstr ""
msgid "Treatment - 020 - General"
msgstr ""
-#: forms_treatments.py:108 models_treatments.py:68 models_treatments.py:122
-#: templates/ishtar/sheet_find.html:228 templates/ishtar/sheet_find.html:266
+#: forms_treatments.py:108 models_treatments.py:70 models_treatments.py:130
+#: templates/ishtar/sheet_find.html:181 templates/ishtar/sheet_find.html:219
msgid "State"
msgstr ""
@@ -528,15 +582,16 @@ msgstr ""
msgid "Target"
msgstr ""
-#: forms_treatments.py:112 forms_treatments.py:474 models_treatments.py:130
+#: forms_treatments.py:112 forms_treatments.py:301 forms_treatments.py:560
+#: models_treatments.py:71 models_treatments.py:138
msgid "Responsible"
msgstr ""
-#: forms_treatments.py:118 models_treatments.py:133
+#: forms_treatments.py:118 forms_treatments.py:307 models_treatments.py:141
msgid "Organization"
msgstr ""
-#: forms_treatments.py:124 models_treatments.py:125 models_treatments.py:351
+#: forms_treatments.py:124 models_treatments.py:133 models_treatments.py:362
msgid "Location"
msgstr ""
@@ -544,16 +599,16 @@ msgstr ""
msgid "Container (relevant for packaging)"
msgstr ""
-#: forms_treatments.py:136 forms_treatments.py:470
+#: forms_treatments.py:136 forms_treatments.py:556
msgid "External ref."
msgstr ""
-#: forms_treatments.py:137 models_treatments.py:139
+#: forms_treatments.py:137 models_treatments.py:147
msgid "Goal"
msgstr ""
-#: forms_treatments.py:145 forms_treatments.py:284 forms_treatments.py:499
-#: forms_treatments.py:551 models_treatments.py:141 models_treatments.py:589
+#: forms_treatments.py:145 forms_treatments.py:370 forms_treatments.py:585
+#: forms_treatments.py:638 models_treatments.py:149 models_treatments.py:603
msgid "Closing date"
msgstr ""
@@ -599,7 +654,7 @@ msgstr ""
msgid "Another treatment with this index exists for {}."
msgstr ""
-#: forms_treatments.py:262 models_treatments.py:118
+#: forms_treatments.py:262 models_treatments.py:126
msgid "Associated request"
msgstr ""
@@ -607,9 +662,9 @@ msgstr ""
msgid "Treatment - 010 - Request choice"
msgstr ""
-#: forms_treatments.py:268 forms_treatments.py:454 ishtar_menu.py:84
-#: models_treatments.py:604 models_treatments.py:632
-#: templates/ishtar/sheet_treatmentfile.html:4 wizards.py:195
+#: forms_treatments.py:268 forms_treatments.py:540 ishtar_menu.py:95
+#: models_treatments.py:618 models_treatments.py:646
+#: templates/ishtar/sheet_treatmentfile.html:4 wizards.py:207
msgid "Treatment request"
msgstr ""
@@ -623,852 +678,913 @@ msgstr ""
msgid "Would you like to delete this treatment?"
msgstr ""
-#: forms_treatments.py:283
+#: forms_treatments.py:285 models_finds.py:683 models_finds.py:1000
+#: models_treatments.py:150 models_treatments.py:363
+#: templates/ishtar/sheet_find.html:184 templates/ishtar/sheet_find.html:222
+msgid "Container"
+msgstr ""
+
+#: forms_treatments.py:291
+msgid "Create a treatment"
+msgstr ""
+
+#: forms_treatments.py:298
+msgid "Precise date"
+msgstr ""
+
+#: forms_treatments.py:340
+msgid "At least a year is required."
+msgstr ""
+
+#: forms_treatments.py:369
msgid "months"
msgstr ""
-#: forms_treatments.py:283
+#: forms_treatments.py:369
msgid "years"
msgstr ""
-#: forms_treatments.py:288 forms_treatments.py:555
+#: forms_treatments.py:374 forms_treatments.py:642
msgid "Slicing"
msgstr ""
-#: forms_treatments.py:291 forms_treatments.py:558
+#: forms_treatments.py:377 forms_treatments.py:645
msgid "Date get from"
msgstr ""
-#: forms_treatments.py:294 forms_treatments.py:561
+#: forms_treatments.py:380 forms_treatments.py:648
msgid "Date after"
msgstr ""
-#: forms_treatments.py:296 forms_treatments.py:563
+#: forms_treatments.py:382 forms_treatments.py:650
msgid "Date before"
msgstr ""
-#: forms_treatments.py:338 forms_treatments.py:388 forms_treatments.py:603
-#: forms_treatments.py:658
+#: forms_treatments.py:424 forms_treatments.py:474 forms_treatments.py:690
+#: forms_treatments.py:745
msgid "Act type"
msgstr ""
-#: forms_treatments.py:339 forms_treatments.py:604
+#: forms_treatments.py:425 forms_treatments.py:691
msgid "Indexed?"
msgstr ""
-#: forms_treatments.py:340 forms_treatments.py:605
+#: forms_treatments.py:426 forms_treatments.py:692
msgid "Object"
msgstr ""
-#: forms_treatments.py:344 forms_treatments.py:609
+#: forms_treatments.py:430 forms_treatments.py:696
msgid "Signature date after"
msgstr ""
-#: forms_treatments.py:346 forms_treatments.py:611
+#: forms_treatments.py:432 forms_treatments.py:698
msgid "Signature date before"
msgstr ""
-#: forms_treatments.py:348
+#: forms_treatments.py:434
msgid "Treatment name"
msgstr ""
-#: forms_treatments.py:349
+#: forms_treatments.py:435
msgid "Treatment year"
msgstr ""
-#: forms_treatments.py:350
+#: forms_treatments.py:436
msgid "Treatment index"
msgstr ""
-#: forms_treatments.py:352
+#: forms_treatments.py:438
msgid "Treatment internal reference"
msgstr ""
-#: forms_treatments.py:356 forms_treatments.py:625
+#: forms_treatments.py:442 forms_treatments.py:712
msgid "Modified by"
msgstr ""
-#: forms_treatments.py:386
+#: forms_treatments.py:472
msgid "Treatment - Administrative act - General"
msgstr ""
-#: forms_treatments.py:409 forms_treatments.py:461 models_treatments.py:574
+#: forms_treatments.py:495 forms_treatments.py:547 models_treatments.py:588
msgid "Name"
msgstr ""
-#: forms_treatments.py:410 forms_treatments.py:468
+#: forms_treatments.py:496 forms_treatments.py:554
msgid "Internal ref."
msgstr ""
-#: forms_treatments.py:413 forms_treatments.py:472 models_treatments.py:67
-#: templates/ishtar/sheet_find.html:227 templates/ishtar/sheet_find.html:265
+#: forms_treatments.py:499 forms_treatments.py:558 models_treatments.py:69
+#: templates/ishtar/sheet_find.html:180 templates/ishtar/sheet_find.html:218
msgid "Type"
msgstr ""
-#: forms_treatments.py:416
+#: forms_treatments.py:502
msgid "In charge"
msgstr ""
-#: forms_treatments.py:422 forms_treatments.py:480 models_treatments.py:583
+#: forms_treatments.py:508 forms_treatments.py:566 models_treatments.py:597
#: templates/ishtar/sheet_treatmentfile.html:45
msgid "Applicant"
msgstr ""
-#: forms_treatments.py:428 forms_treatments.py:486 models_treatments.py:587
+#: forms_treatments.py:514 forms_treatments.py:572 models_treatments.py:601
#: templates/ishtar/sheet_treatmentfile.html:53
msgid "Applicant organisation"
msgstr ""
-#: forms_treatments.py:442 views.py:487
+#: forms_treatments.py:528 views.py:524
msgid "Treatment request search"
msgstr ""
-#: forms_treatments.py:497 forms_treatments.py:550 models_treatments.py:593
+#: forms_treatments.py:583 forms_treatments.py:637 models_treatments.py:607
msgid "Reception date"
msgstr ""
-#: forms_treatments.py:539
+#: forms_treatments.py:625
msgid "Another treatment request with this index exists for {}."
msgstr ""
-#: forms_treatments.py:545
+#: forms_treatments.py:631
msgid "Are you sure you want to delete this treatment request?"
msgstr ""
-#: forms_treatments.py:546
+#: forms_treatments.py:632
msgid "Would you like to delete this treatment request?"
msgstr ""
-#: forms_treatments.py:549 models_treatments.py:591
+#: forms_treatments.py:636 models_treatments.py:605
msgid "Creation date"
msgstr ""
-#: forms_treatments.py:559 forms_treatments.py:622 models_treatments.py:508
-#: models_treatments.py:576
+#: forms_treatments.py:646 forms_treatments.py:709 models_treatments.py:519
+#: models_treatments.py:590
msgid "Treatment request type"
msgstr ""
-#: forms_treatments.py:614
+#: forms_treatments.py:701
msgid "Treatment request name"
msgstr ""
-#: forms_treatments.py:616
+#: forms_treatments.py:703
msgid "Treatment request year"
msgstr ""
-#: forms_treatments.py:618
+#: forms_treatments.py:705
msgid "Treatment request index"
msgstr ""
-#: forms_treatments.py:620
+#: forms_treatments.py:707
msgid "Treatment request internal reference"
msgstr ""
-#: forms_treatments.py:656
+#: forms_treatments.py:743
msgid "Treatment request - Administrative act - General"
msgstr ""
-#: ishtar_menu.py:37 ishtar_menu.py:89 ishtar_menu.py:112 ishtar_menu.py:144
-#: ishtar_menu.py:168
+#: ishtar_menu.py:37 ishtar_menu.py:60 ishtar_menu.py:100 ishtar_menu.py:123
+#: ishtar_menu.py:155 ishtar_menu.py:179
msgid "Search"
msgstr ""
-#: ishtar_menu.py:42 ishtar_menu.py:60 ishtar_menu.py:94 ishtar_menu.py:116
-#: ishtar_menu.py:149 ishtar_menu.py:172
+#: ishtar_menu.py:42 ishtar_menu.py:65 ishtar_menu.py:105 ishtar_menu.py:127
+#: ishtar_menu.py:160 ishtar_menu.py:183
msgid "Creation"
msgstr ""
-#: ishtar_menu.py:47 ishtar_menu.py:99 ishtar_menu.py:120 ishtar_menu.py:154
-#: ishtar_menu.py:177
+#: ishtar_menu.py:47 ishtar_menu.py:70 ishtar_menu.py:110 ishtar_menu.py:131
+#: ishtar_menu.py:165 ishtar_menu.py:188
msgid "Modification"
msgstr ""
-#: ishtar_menu.py:52 ishtar_menu.py:71 ishtar_menu.py:104 ishtar_menu.py:123
-#: ishtar_menu.py:159 ishtar_menu.py:180
+#: ishtar_menu.py:52 ishtar_menu.py:82 ishtar_menu.py:115 ishtar_menu.py:134
+#: ishtar_menu.py:170 ishtar_menu.py:191
msgid "Deletion"
msgstr ""
-#: ishtar_menu.py:65
+#: ishtar_menu.py:76
msgid "Manage items"
msgstr ""
-#: ishtar_menu.py:109 ishtar_menu.py:165 models_finds.py:1581
+#: ishtar_menu.py:120 ishtar_menu.py:176 models_finds.py:1718
msgid "Administrative act"
msgstr ""
-#: ishtar_menu.py:127 ishtar_menu.py:184 models_finds.py:968
-#: models_treatments.py:155 models_treatments.py:597
+#: ishtar_menu.py:138 ishtar_menu.py:195 models_finds.py:1081
+#: models_treatments.py:163 models_treatments.py:611
msgid "Documents"
msgstr ""
-#: ishtar_menu.py:136 models_treatments.py:162 models_treatments.py:340
+#: ishtar_menu.py:147 models_treatments.py:170 models_treatments.py:351
#: templates/ishtar/sheet_treatment.html:4
msgid "Treatment"
msgstr ""
-#: ishtar_menu.py:141
+#: ishtar_menu.py:152
msgid "Simple treatments"
msgstr ""
-#: models_finds.py:48
+#: models_finds.py:51
msgid "Code"
msgstr ""
-#: models_finds.py:49
+#: models_finds.py:52
msgid "Recommendation"
msgstr ""
-#: models_finds.py:63 models_finds.py:87 models_finds.py:135
-#: models_finds.py:158 models_finds.py:215 models_finds.py:854
-#: models_treatments.py:344
+#: models_finds.py:66 models_finds.py:90 models_finds.py:138
+#: models_finds.py:161 models_finds.py:218 models_finds.py:967
+#: models_treatments.py:355
msgid "Order"
msgstr ""
-#: models_finds.py:66
+#: models_finds.py:69
msgid "Material type quality type"
msgstr ""
-#: models_finds.py:67
+#: models_finds.py:70
msgid "Material type quality types"
msgstr ""
-#: models_finds.py:78
+#: models_finds.py:81
msgid "Conservatory states"
msgstr ""
-#: models_finds.py:88
+#: models_finds.py:91
msgid "Parent type"
msgstr ""
-#: models_finds.py:90
+#: models_finds.py:93
msgid "Virtual"
msgstr ""
-#: models_finds.py:92
+#: models_finds.py:95
msgid "Upstream is many"
msgstr ""
-#: models_finds.py:94
+#: models_finds.py:97
msgid "Check this if for this treatment from many finds you'll get one."
msgstr ""
-#: models_finds.py:97
+#: models_finds.py:100
msgid "Downstream is many"
msgstr ""
-#: models_finds.py:99
+#: models_finds.py:102
msgid "Check this if for this treatment from one find you'll get many."
msgstr ""
-#: models_finds.py:104 models_treatments.py:229
+#: models_finds.py:107 models_treatments.py:240
msgid "Treatment types"
msgstr ""
-#: models_finds.py:114
+#: models_finds.py:117
msgid "Integrity / interest type"
msgstr ""
-#: models_finds.py:115
+#: models_finds.py:118
msgid "Integrity / interest types"
msgstr ""
-#: models_finds.py:125
+#: models_finds.py:128
msgid "Remarkability type"
msgstr ""
-#: models_finds.py:126
+#: models_finds.py:129
msgid "Remarkability types"
msgstr ""
-#: models_finds.py:137
+#: models_finds.py:140
msgid "Batch type"
msgstr ""
-#: models_finds.py:138
+#: models_finds.py:141
msgid "Batch types"
msgstr ""
-#: models_finds.py:161
+#: models_finds.py:164
msgid "Object type quality type"
msgstr ""
-#: models_finds.py:162
+#: models_finds.py:165
msgid "Object type quality types"
msgstr ""
-#: models_finds.py:172
+#: models_finds.py:175
msgid "Alteration type"
msgstr ""
-#: models_finds.py:173
+#: models_finds.py:176
msgid "Alteration types"
msgstr ""
-#: models_finds.py:183
+#: models_finds.py:186
msgid "Alteration cause type"
msgstr ""
-#: models_finds.py:184
+#: models_finds.py:187
msgid "Alteration cause types"
msgstr ""
-#: models_finds.py:194
+#: models_finds.py:197
msgid "Treatment emergency type"
msgstr ""
-#: models_finds.py:195
+#: models_finds.py:198
msgid "Treatment emergency types"
msgstr ""
-#: models_finds.py:205
+#: models_finds.py:208
msgid "Communicability type"
msgstr ""
-#: models_finds.py:206
+#: models_finds.py:209
msgid "Communicability types"
msgstr ""
-#: models_finds.py:218
+#: models_finds.py:221
msgid "Checked type"
msgstr ""
-#: models_finds.py:219
+#: models_finds.py:222
msgid "Checked types"
msgstr ""
-#: models_finds.py:251 models_finds.py:847 models_treatments.py:135
-#: models_treatments.py:572
+#: models_finds.py:254 models_finds.py:960 models_treatments.py:143
+#: models_treatments.py:586
msgid "External ID"
msgstr ""
-#: models_finds.py:253 models_finds.py:849
+#: models_finds.py:256 models_finds.py:962
msgid "External ID is set automatically"
msgstr ""
-#: models_finds.py:257
+#: models_finds.py:260
msgid "Special interest"
msgstr ""
-#: models_finds.py:261
+#: models_finds.py:264
msgid "Context Record"
msgstr ""
-#: models_finds.py:269
+#: models_finds.py:272
msgid "Material index"
msgstr ""
-#: models_finds.py:286
+#: models_finds.py:289
msgid "Point (3D)"
msgstr ""
-#: models_finds.py:292 models_finds.py:295
+#: models_finds.py:295 models_finds.py:298
msgid "Cached value - do not edit"
msgstr ""
-#: models_finds.py:304 models_finds.py:845
+#: models_finds.py:308 models_finds.py:958
msgid "Base find"
msgstr ""
-#: models_finds.py:305
+#: models_finds.py:309
msgid "Base finds"
msgstr ""
-#: models_finds.py:549
+#: models_finds.py:565
msgid "g"
msgstr ""
-#: models_finds.py:550
+#: models_finds.py:566
msgid "kg"
msgstr ""
-#: models_finds.py:620 templates/ishtar/sheet_find.html:21
+#: models_finds.py:592 views.py:301
+msgid "Manage basket"
+msgstr ""
+
+#: models_finds.py:661
msgid "Base find - Short ID"
msgstr ""
-#: models_finds.py:621 templates/ishtar/sheet_find.html:20
+#: models_finds.py:662
msgid "Base find - Complete ID"
msgstr ""
-#: models_finds.py:623
+#: models_finds.py:664
msgid "Operation (code)"
msgstr ""
-#: models_finds.py:625
+#: models_finds.py:666
msgid "Town"
msgstr ""
-#: models_finds.py:627
+#: models_finds.py:668
msgid "Operation (name)"
msgstr ""
-#: models_finds.py:629
+#: models_finds.py:672
msgid "Parcel"
msgstr ""
-#: models_finds.py:630
+#: models_finds.py:673
msgid "Batch"
msgstr ""
-#: models_finds.py:631
+#: models_finds.py:674
msgid "Base find - Comment"
msgstr ""
-#: models_finds.py:632
+#: models_finds.py:675
msgid "Base find - Description"
msgstr ""
-#: models_finds.py:633
+#: models_finds.py:676
msgid "Base find - Topographic localisation"
msgstr ""
-#: models_finds.py:635
+#: models_finds.py:678
msgid "Base find - Special interest"
msgstr ""
-#: models_finds.py:637
+#: models_finds.py:680
msgid "Base find - Discovery date (exact or TPQ)"
msgstr ""
-#: models_finds.py:639
+#: models_finds.py:682
msgid "Base find - Discovery date (TAQ)"
msgstr ""
-#: models_finds.py:640 models_finds.py:887 models_treatments.py:142
-#: models_treatments.py:352 templates/ishtar/sheet_find.html:231
-#: templates/ishtar/sheet_find.html:269
-msgid "Container"
-msgstr ""
-
-#: models_finds.py:641
+#: models_finds.py:684
msgid "Periods"
msgstr ""
-#: models_finds.py:718
+#: models_finds.py:760
msgctxt "key for text search"
msgid "short-id"
msgstr ""
-#: models_finds.py:722
+#: models_finds.py:764
msgctxt "key for text search"
msgid "complete-id"
msgstr ""
-#: models_finds.py:726
+#: models_finds.py:768
msgctxt "key for text search"
msgid "free-id"
msgstr ""
-#: models_finds.py:730
+#: models_finds.py:772
msgctxt "key for text search"
msgid "denomination"
msgstr ""
-#: models_finds.py:734
+#: models_finds.py:776
msgctxt "key for text search"
msgid "town"
msgstr ""
-#: models_finds.py:738 models_treatments.py:84 models_treatments.py:540
+#: models_finds.py:780 models_treatments.py:87 models_treatments.py:551
msgctxt "key for text search"
msgid "year"
msgstr ""
-#: models_finds.py:742
+#: models_finds.py:784
msgctxt "key for text search"
msgid "operation-code"
msgstr ""
-#: models_finds.py:746
+#: models_finds.py:788
msgctxt "key for text search"
msgid "code-patriarche"
msgstr ""
-#: models_finds.py:750
+#: models_finds.py:792
msgctxt "key for text search"
msgid "operation-type"
msgstr ""
-#: models_finds.py:755
+#: models_finds.py:797
msgctxt "key for text search"
msgid "area"
msgstr ""
-#: models_finds.py:759
+#: models_finds.py:801
msgctxt "key for text search"
msgid "site"
msgstr ""
-#: models_finds.py:764
+#: models_finds.py:806 models_finds.py:945
msgctxt "key for text search"
msgid "context-record-site"
msgstr ""
-#: models_finds.py:769
+#: models_finds.py:811 models_finds.py:939
msgctxt "key for text search"
msgid "context-record"
msgstr ""
-#: models_finds.py:773
+#: models_finds.py:815
msgctxt "key for text search"
msgid "operation-relation-type"
msgstr ""
-#: models_finds.py:777
+#: models_finds.py:819
msgctxt "key for text search"
msgid "context-record-relation-type"
msgstr ""
-#: models_finds.py:781
+#: models_finds.py:823
msgctxt "key for text search"
msgid "period"
msgstr ""
-#: models_finds.py:785
+#: models_finds.py:827
msgctxt "key for text search"
msgid "material"
msgstr ""
-#: models_finds.py:789
+#: models_finds.py:831
msgctxt "key for text search"
msgid "object-type"
msgstr ""
-#: models_finds.py:793
+#: models_finds.py:835
msgctxt "key for text search"
msgid "preservation"
msgstr ""
-#: models_finds.py:797
+#: models_finds.py:839
msgctxt "key for text search"
msgid "conservatory"
msgstr ""
-#: models_finds.py:801
+#: models_finds.py:843
msgctxt "key for text search"
msgid "integrity"
msgstr ""
-#: models_finds.py:805
+#: models_finds.py:847
msgctxt "key for text search"
msgid "remarkability"
msgstr ""
-#: models_finds.py:809
+#: models_finds.py:851
msgctxt "key for text search"
msgid "description"
msgstr ""
-#: models_finds.py:813
+#: models_finds.py:855
msgctxt "key for text search"
msgid "batch"
msgstr ""
-#: models_finds.py:817
+#: models_finds.py:859
msgctxt "key for text search"
msgid "checked"
msgstr ""
-#: models_finds.py:821 models_treatments.py:92
+#: models_finds.py:863 models_treatments.py:95
msgctxt "key for text search"
msgid "has-image"
msgstr ""
-#: models_finds.py:825
+#: models_finds.py:867 models_finds.py:942
msgctxt "key for text search"
msgid "location"
msgstr ""
-#: models_finds.py:829
+#: models_finds.py:871
msgctxt "key for text search"
msgid "warehouse"
msgstr ""
-#: models_finds.py:833
+#: models_finds.py:875
msgctxt "key for text search"
msgid "container-index"
msgstr ""
-#: models_finds.py:837
+#: models_finds.py:879
msgctxt "key for text search"
msgid "container-ref"
msgstr ""
-#: models_finds.py:873
+#: models_finds.py:883
+msgctxt "key for text search"
+msgid "basket"
+msgstr ""
+
+#: models_finds.py:887 models_finds.py:936
+msgctxt "key for text search"
+msgid "operation"
+msgstr ""
+
+#: models_finds.py:891
+#| msgid "Last modified by"
+msgctxt "key for text search"
+msgid "last-modified-by"
+msgstr ""
+
+#: models_finds.py:895
+msgctxt "key for text search"
+msgid "modified-since"
+msgstr ""
+
+#: models_finds.py:919
+msgid "Bulk update"
+msgstr ""
+
+#: models_finds.py:930 models_finds.py:1179
+#: templates/ishtar/forms/qa_find_treatment.html:16 views.py:666
+msgid "Packaging"
+msgstr ""
+
+#: models_finds.py:986
msgid "Weight"
msgstr ""
-#: models_finds.py:874
+#: models_finds.py:987
msgid "Weight unit"
msgstr ""
-#: models_finds.py:880 templates/ishtar/sheet_find.html:221
+#: models_finds.py:993 templates/ishtar/sheet_find.html:174
msgid "Upstream treatment"
msgstr ""
-#: models_finds.py:883 templates/ishtar/sheet_find.html:259
+#: models_finds.py:996 templates/ishtar/sheet_find.html:212
msgid "Downstream treatment"
msgstr ""
-#: models_finds.py:918
+#: models_finds.py:1031
msgid "Clutter - long side (cm)"
msgstr ""
-#: models_finds.py:920
+#: models_finds.py:1033
msgid "Clutter - short side (cm)"
msgstr ""
-#: models_finds.py:922
+#: models_finds.py:1035
msgid "Clutter - height (cm)"
msgstr ""
-#: models_finds.py:938
+#: models_finds.py:1051
msgid "Collection"
msgstr ""
-#: models_finds.py:970 models_treatments.py:157 models_treatments.py:599
+#: models_finds.py:1083 models_treatments.py:165 models_treatments.py:613
msgid "Cached name"
msgstr ""
-#: models_finds.py:999
+#: models_finds.py:1105
msgid "FIND"
msgstr ""
-#: models_finds.py:1094 wizards.py:70 wizards.py:207
+#: models_finds.py:1173
+#| msgid "Find basket"
+msgid "Add to basket"
+msgstr ""
+
+#: models_finds.py:1221 wizards.py:74 wizards.py:219
msgid "Operation"
msgstr ""
-#: models_finds.py:1406
+#: models_finds.py:1543
msgid "No container have been set - the localisation cannot be set."
msgstr ""
-#: models_finds.py:1412
+#: models_finds.py:1549
msgid "The division number {} have not been set for the warehouse {}."
msgstr ""
-#: models_finds.py:1582
+#: models_finds.py:1719
msgid "Person"
msgstr ""
-#: models_finds.py:1588
+#: models_finds.py:1725
msgid "Property"
msgstr ""
-#: models_finds.py:1589
+#: models_finds.py:1726
msgid "Properties"
msgstr ""
-#: models_treatments.py:41
+#: models_treatments.py:42
msgid "Treatment state type"
msgstr ""
-#: models_treatments.py:42
+#: models_treatments.py:43
msgid "Treatment state types"
msgstr ""
-#: models_treatments.py:65
+#: models_treatments.py:67
msgid "Downstream find"
msgstr ""
-#: models_treatments.py:76
+#: models_treatments.py:79
msgctxt "key for text search"
msgid "label"
msgstr ""
-#: models_treatments.py:80
+#: models_treatments.py:83
msgctxt "key for text search"
msgid "other-reference"
msgstr ""
-#: models_treatments.py:88 models_treatments.py:544
+#: models_treatments.py:91 models_treatments.py:555
msgctxt "key for text search"
msgid "index"
msgstr ""
-#: models_treatments.py:96 models_treatments.py:548
+#: models_treatments.py:99 models_treatments.py:559
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models_treatments.py:127
+#: models_treatments.py:135
msgid "Location where the treatment is done. Target warehouse for a move."
msgstr ""
-#: models_treatments.py:144
+#: models_treatments.py:152
msgid "Estimated cost"
msgstr ""
-#: models_treatments.py:146
+#: models_treatments.py:154
msgid "Quoted cost"
msgstr ""
-#: models_treatments.py:148
+#: models_treatments.py:156
msgid "Realized cost"
msgstr ""
-#: models_treatments.py:150
+#: models_treatments.py:158
msgid "Insurance cost"
msgstr ""
-#: models_treatments.py:152
+#: models_treatments.py:160
msgid "Target a basket"
msgstr ""
-#: models_treatments.py:163 templates/ishtar/sheet_find.html:218
+#: models_treatments.py:171 templates/ishtar/sheet_find.html:171
#: templates/ishtar/sheet_treatmentfile.html:61
msgid "Treatments"
msgstr ""
-#: models_treatments.py:182
+#: models_treatments.py:190
msgid "TREATMENT"
msgstr ""
-#: models_treatments.py:238 templates/ishtar/sheet_treatment.html:61
+#: models_treatments.py:249 templates/ishtar/sheet_treatment.html:61
msgid "Downstream finds"
msgstr ""
-#: models_treatments.py:353 templates/ishtar/sheet_find.html:230
-#: templates/ishtar/sheet_find.html:268
+#: models_treatments.py:364 templates/ishtar/sheet_find.html:183
+#: templates/ishtar/sheet_find.html:221
msgid "Doer"
msgstr ""
-#: models_treatments.py:354 models_treatments.py:355
+#: models_treatments.py:365 models_treatments.py:366
msgid "Related finds"
msgstr ""
-#: models_treatments.py:497
+#: models_treatments.py:508
msgid "Is upstream"
msgstr ""
-#: models_treatments.py:509
+#: models_treatments.py:520
msgid "Treatment request types"
msgstr ""
-#: models_treatments.py:532
+#: models_treatments.py:543
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models_treatments.py:536
+#: models_treatments.py:547
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models_treatments.py:552
+#: models_treatments.py:563
msgctxt "key for text search"
msgid "in-charge"
msgstr ""
-#: models_treatments.py:556
+#: models_treatments.py:567
msgctxt "key for text search"
msgid "applicant"
msgstr ""
-#: models_treatments.py:560
+#: models_treatments.py:571
msgctxt "key for text search"
msgid "applicant-organisation"
msgstr ""
-#: models_treatments.py:570
+#: models_treatments.py:584
msgid "Internal reference"
msgstr ""
-#: models_treatments.py:579
+#: models_treatments.py:593
msgid "Person in charge"
msgstr ""
-#: models_treatments.py:605
+#: models_treatments.py:619
msgid "Treatment requests"
msgstr ""
-#: templates/ishtar/sheet_find.html:22
-msgid "Find - Administrative ID"
+#: templates/ishtar/forms/qa_find_basket.html:22
+msgid "New"
msgstr ""
-#: templates/ishtar/sheet_find.html:32
-msgid ""
-"This sheet has a downstream treatment: it is related to an old version of "
-"the find."
+#: templates/ishtar/forms/qa_find_basket.html:38
+msgid "Add"
msgstr ""
-#: templates/ishtar/sheet_find.html:36
-msgid "Associated base finds"
+#: templates/ishtar/forms/qa_find_treatment.html:31
+msgid "Associate a treatment"
msgstr ""
-#: templates/ishtar/sheet_find.html:44
+#: templates/ishtar/sheet_basefind.html:6
msgid "Internal ID"
msgstr ""
-#: templates/ishtar/sheet_find.html:58
-msgid "Last modified by"
-msgstr ""
-
-#: templates/ishtar/sheet_find.html:70
+#: templates/ishtar/sheet_basefind.html:21
msgid "Discovery date"
msgstr ""
-#: templates/ishtar/sheet_find.html:73
+#: templates/ishtar/sheet_basefind.html:24
msgid "Discovery year"
msgstr ""
-#: templates/ishtar/sheet_find.html:76
+#: templates/ishtar/sheet_basefind.html:27
msgid "Discovery date (TPQ)"
msgstr ""
-#: templates/ishtar/sheet_find.html:100
+#: templates/ishtar/sheet_basefind.html:52
msgid "X:"
msgstr ""
-#: templates/ishtar/sheet_find.html:101 templates/ishtar/sheet_find.html:103
-#: templates/ishtar/sheet_find.html:105
+#: templates/ishtar/sheet_basefind.html:53
+#: templates/ishtar/sheet_basefind.html:55
+#: templates/ishtar/sheet_basefind.html:57
msgid "error:"
msgstr ""
-#: templates/ishtar/sheet_find.html:102
+#: templates/ishtar/sheet_basefind.html:54
msgid "Y:"
msgstr ""
-#: templates/ishtar/sheet_find.html:104
+#: templates/ishtar/sheet_basefind.html:56
msgid "Z:"
msgstr ""
-#: templates/ishtar/sheet_find.html:108
+#: templates/ishtar/sheet_basefind.html:60
msgid "SRID"
msgstr ""
-#: templates/ishtar/sheet_find.html:128
+#: templates/ishtar/sheet_basefind.html:75
+msgid "Last modified by"
+msgstr ""
+
+#: templates/ishtar/sheet_find.html:14
+msgid ""
+"This sheet has a downstream treatment: it is related to an old version of "
+"the find."
+msgstr ""
+
+#: templates/ishtar/sheet_find.html:29
+msgid "Associated base finds"
+msgstr ""
+
+#: templates/ishtar/sheet_find.html:53
msgid "Administrative index"
msgstr ""
-#: templates/ishtar/sheet_find.html:171
+#: templates/ishtar/sheet_find.html:95
msgid "Checked"
msgstr ""
-#: templates/ishtar/sheet_find.html:207
+#: templates/ishtar/sheet_find.html:160
msgid "Warehouse"
msgstr ""
-#: templates/ishtar/sheet_find.html:225 templates/ishtar/sheet_find.html:263
+#: templates/ishtar/sheet_find.html:178 templates/ishtar/sheet_find.html:216
msgid "Year - index"
msgstr ""
-#: templates/ishtar/sheet_find.html:229 templates/ishtar/sheet_find.html:267
+#: templates/ishtar/sheet_find.html:182 templates/ishtar/sheet_find.html:220
msgid "Related finds (max. 15 displayed)"
msgstr ""
-#: templates/ishtar/sheet_find.html:255
+#: templates/ishtar/sheet_find.html:208
msgid "Export as CSV"
msgstr ""
-#: templates/ishtar/sheet_find.html:255 templates/ishtar/sheet_find.html:294
+#: templates/ishtar/sheet_find.html:208 templates/ishtar/sheet_find.html:247
msgid "CSV"
msgstr ""
-#: templates/ishtar/sheet_find.html:299
+#: templates/ishtar/sheet_find.html:252
msgid "Associated documents"
msgstr ""
-#: templates/ishtar/sheet_findbasket.html:4
-msgid "Find basket"
+#: templates/ishtar/sheet_findbasket.html:19
+#| msgid "Container"
+msgid "Content"
msgstr ""
#: templates/ishtar/sheet_treatment.html:25
@@ -1500,86 +1616,87 @@ msgctxt "Treatment request"
msgid "Active"
msgstr ""
-#: views.py:144
+#: views.py:132
+#| msgid "Last modified by"
+msgid "Basket modify"
+msgstr ""
+
+#: views.py:173
msgid "New find"
msgstr ""
-#: views.py:180
+#: views.py:209
msgid "Find modification"
msgstr ""
-#: views.py:209
+#: views.py:238
msgid "Find deletion"
msgstr ""
-#: views.py:222
+#: views.py:251
msgid "New basket"
msgstr ""
-#: views.py:241
+#: views.py:280
msgid "Manage items in basket"
msgstr ""
-#: views.py:261
-msgid "Manage basket"
-msgstr ""
-
-#: views.py:352
+#: views.py:389
msgid "Delete basket"
msgstr ""
-#: views.py:404
+#: views.py:441
msgid "New treatment"
msgstr ""
-#: views.py:412
+#: views.py:449
msgid "Treatment modification"
msgstr ""
-#: views.py:429
+#: views.py:466
msgid "Treatment deletion"
msgstr ""
-#: views.py:436
+#: views.py:473
msgid "Treatment: search administrative act"
msgstr ""
-#: views.py:445
+#: views.py:482
msgid "Treatment: new administrative act"
msgstr ""
-#: views.py:455
+#: views.py:492
msgid "Treatment: administrative act modification"
msgstr ""
-#: views.py:464
+#: views.py:501
msgid "Treatment: administrative act deletion"
msgstr ""
-#: views.py:497
+#: views.py:534
msgid "New treatment request"
msgstr ""
-#: views.py:504
+#: views.py:541
msgid "Treatment request modification"
msgstr ""
-#: views.py:520
+#: views.py:557
msgid "Treatment request deletion"
msgstr ""
-#: views.py:527
+#: views.py:564
msgid "Treatment request: search administrative act"
msgstr ""
-#: views.py:537
+#: views.py:574
msgid "Treatment request: new administrative act"
msgstr ""
-#: views.py:547
+#: views.py:584
msgid "Treatment request: administrative act modification"
msgstr ""
-#: views.py:556
+#: views.py:593
msgid "Treatment request: administrative act deletion"
msgstr ""
diff --git a/archaeological_finds/migrations/0035_auto_20181017_1642.py b/archaeological_finds/migrations/0035_auto_20181017_1642.py
new file mode 100644
index 000000000..d8515bdb5
--- /dev/null
+++ b/archaeological_finds/migrations/0035_auto_20181017_1642.py
@@ -0,0 +1,72 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['Find', 'BaseFind', 'Property', 'Treatment', 'TreatmentFile',
+ 'Property']
+ reinit_last_modified(
+ apps, 'archaeological_finds', models
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0034_auto_20180814_1133'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='basefind',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='find',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalbasefind',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalfind',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicaltreatment',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicaltreatmentfile',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='property',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='treatment',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='treatmentfile',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/archaeological_finds/migrations/0036_auto_20181017_1854.py b/archaeological_finds/migrations/0036_auto_20181017_1854.py
new file mode 100644
index 000000000..76a0590b9
--- /dev/null
+++ b/archaeological_finds/migrations/0036_auto_20181017_1854.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_finds', '0035_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='basefind',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='find',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='historicalbasefind',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicalfind',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatment',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicaltreatmentfile',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='property',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='treatment',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='treatmentfile',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ ]
diff --git a/archaeological_finds/migrations/0037_auto_20181018_1756.py b/archaeological_finds/migrations/0037_auto_20181018_1756.py
new file mode 100644
index 000000000..0a91b860c
--- /dev/null
+++ b/archaeological_finds/migrations/0037_auto_20181018_1756.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-18 17:56
+from __future__ import unicode_literals
+
+import django.contrib.postgres.search
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0074_auto_20181017_1854'),
+ ('archaeological_finds', '0036_auto_20181017_1854'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='findbasket',
+ options={'permissions': (('view_find', 'Can view all Finds'), ('view_own_find', 'Can view own Find'))},
+ ),
+ migrations.AddField(
+ model_name='findbasket',
+ name='search_vector',
+ field=django.contrib.postgres.search.SearchVectorField(blank=True, help_text='Auto filled at save', null=True, verbose_name='Search vector'),
+ ),
+ migrations.AddField(
+ model_name='findbasket',
+ name='shared_with',
+ field=models.ManyToManyField(blank=True, related_name='shared_findbaskets', to='ishtar_common.IshtarUser', verbose_name='Shared with'),
+ ),
+ migrations.AlterField(
+ model_name='findbasket',
+ name='user',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='findbaskets', to='ishtar_common.IshtarUser', verbose_name='Owner'),
+ ),
+ migrations.AlterUniqueTogether(
+ name='findbasket',
+ unique_together=set([]),
+ ),
+ ]
diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py
index 1ef9d5846..5ded360a8 100644
--- a/archaeological_finds/models_finds.py
+++ b/archaeological_finds/models_finds.py
@@ -39,10 +39,12 @@ from ishtar_common.models import Document, GeneralType, \
HierarchicalType, BaseHistorizedItem, ShortMenuItem, LightHistorizedItem, \
HistoricalRecords, OwnPerms, Person, Basket, post_save_cache, \
ValueGetter, get_current_profile, IshtarSiteProfile, PRIVATE_FIELDS, \
- SpatialReferenceSystem, BulkUpdatedItem, ExternalIdManager
+ SpatialReferenceSystem, BulkUpdatedItem, ExternalIdManager, QuickAction, \
+ MainItem
from archaeological_operations.models import AdministrativeAct, Operation
from archaeological_context_records.models import ContextRecord, Dating
+from archaeological_warehouse.models import Warehouse
class MaterialType(HierarchicalType):
@@ -564,9 +566,34 @@ WEIGHT_UNIT = (('g', _(u"g")),
('kg', _(u"kg")),)
-class FindBasket(Basket):
+class FindBasket(Basket, OwnPerms):
items = models.ManyToManyField('Find', blank=True, related_name='basket')
+ class Meta:
+ permissions = (
+ ("view_find", u"Can view all Finds"),
+ ("view_own_find", u"Can view own Find"),
+ )
+
+ @classmethod
+ def get_query_owns(cls, ishtaruser):
+ return Q(user=ishtaruser)
+
+ def get_extra_actions(self, request):
+ """
+ For sheet template: return "Manage basket" action
+ """
+ # url, base_text, icon, extra_text, extra css class, is a quick action
+
+ # no particular rights: if you can view an itm you can add it to your
+ # own basket
+ actions = [
+ (reverse("select_itemsinbasket", args=[self.pk]),
+ _(u"Manage basket"),
+ "fa fa-shopping-basket", "", "", False),
+ ]
+ return actions
+
class FirstBaseFindView(object):
CREATE_SQL = """
@@ -605,7 +632,7 @@ class FBulkView(object):
class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
- ShortMenuItem):
+ MainItem):
EXTERNAL_ID_KEY = 'find_external_id'
SHOW_URL = 'show-find'
SLUG = 'find'
@@ -678,11 +705,8 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
'cr_relation_types':
'base_finds__context_record__',
}
- RELATIVE_SESSION_NAMES = [
- ('contextrecord', 'base_finds__context_record__pk'),
- ('operation', 'base_finds__context_record__operation__pk'),
- ('file', 'base_finds__context_record__operation__associated_file__pk')
- ]
+
+ DATED_FIELDS = ['last_modified__gte']
BASE_REQUEST = {'downstream_treatment__isnull': True}
EXTRA_REQUEST_KEYS = {
'base_finds__context_record':
@@ -709,7 +733,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
'base_finds__find__description':
'base_finds__find__description__icontains',
'base_finds__batch': 'base_finds__batch',
- 'basket': 'basket',
+ 'basket_id': 'basket__pk',
'denomination': 'denomination',
'cached_label': 'cached_label__icontains',
'documents__image__isnull': 'documents__image__isnull',
@@ -857,7 +881,20 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
),
'basket': (
pgettext_lazy("key for text search", u"basket"),
- 'basket__label__exact'
+ 'basket__label__iexact'
+ ),
+ 'base_finds__context_record__operation__cached_label': (
+ pgettext_lazy("key for text search", u"operation"),
+ 'base_finds__context_record__operation__cached_label__icontains'
+ ),
+ 'history_modifier': (
+ pgettext_lazy("key for text search", u"last-modified-by"),
+ 'history_modifier__ishtaruser__person__cached_label__icontains'
+ ),
+ 'modified_since': (
+ pgettext_lazy("key for text search", u"modified-since"),
+ 'last_modified__gte'
+
),
}
for v in ALT_NAMES.values():
@@ -876,6 +913,45 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
M2M_SEARCH_VECTORS = [
"datings__period__label", "object_types__label", "integrities__label",
"remarkabilities__label", "material_types__label"]
+
+ QA_EDIT = QuickAction(
+ url="find-qa-bulk-update", icon_class="fa fa-pencil",
+ text=_(u"Bulk update"), target="many",
+ rights=['change_find', 'change_own_find'])
+
+ QUICK_ACTIONS = [
+ QA_EDIT,
+ QuickAction(
+ url="find-qa-basket", icon_class="fa fa-shopping-basket",
+ text=_(u"Basket"), target="many",
+ rights=['change_find', 'change_own_find']),
+ QuickAction(
+ url="find-qa-packaging", icon_class="fa fa-gift",
+ text=_(u"Packaging"), target="many",
+ rights=['change_find', 'change_own_find'],
+ module='warehouse'
+ ),
+ ]
+ UP_MODEL_QUERY = {
+ "operation": (pgettext_lazy("key for text search", u"operation"),
+ 'cached_label'),
+ "contextrecord": (
+ pgettext_lazy("key for text search", u"context-record"),
+ 'cached_label'),
+ "warehouse": (
+ pgettext_lazy("key for text search", u"location"),
+ 'name'),
+ "site": (
+ pgettext_lazy("key for text search", u"context-record-site"),
+ 'cached_label'),
+ }
+ RELATIVE_SESSION_NAMES = [
+ ('contextrecord', 'base_finds__context_record__pk'),
+ ('operation', 'base_finds__context_record__operation__pk'),
+ ('file', 'base_finds__context_record__operation__associated_file__pk'),
+ ('warehouse', 'container__location__pk'),
+ ('site', 'base_finds__context_record__archaeological_site__pk')
+ ]
objects = ExternalIdManager()
# fields
@@ -1084,6 +1160,27 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
return "00"
return bf.short_id()
+ def get_extra_actions(self, request):
+ """
+ For sheet template: return "Add to basket" action
+ """
+ # url, base_text, icon, extra_text, extra css class, is a quick action
+
+ # no particular rights: if you can view an itm you can add it to your
+ # own basket
+ actions = [
+ (reverse("find-qa-basket", args=[self.pk]),
+ _(u"Add to basket"),
+ "fa fa-shopping-basket", "", "", True),
+ ]
+ if get_current_profile().warehouse:
+ actions.append(
+ (reverse("find-qa-packaging", args=[self.pk]),
+ _(u"Packaging"),
+ "fa fa-gift", "", "", True)
+ )
+ return actions
+
def _get_base_image_path(self):
bf = None
if self.id:
@@ -1263,6 +1360,12 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
@classmethod
def get_query_owns(cls, ishtaruser):
q = cls._construct_query_own(
+ 'container__location__',
+ Warehouse._get_query_owns_dicts(ishtaruser)
+ ) | cls._construct_query_own(
+ 'container__responsible__',
+ Warehouse._get_query_owns_dicts(ishtaruser)
+ ) | cls._construct_query_own(
'base_finds__context_record__operation__',
Operation._get_query_owns_dicts(ishtaruser)
) | cls._construct_query_own('', [
@@ -1337,6 +1440,12 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
profile = get_current_profile()
+ index = ""
+ if profile.find_use_index:
+ index = """|| '-' ||
+ to_char(find_cached_bulk_update.index, 'fm{zeros}')
+ """.format(zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0")
+
sql = """
UPDATE "archaeological_finds_find" AS f
SET cached_label =
@@ -1359,8 +1468,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
'{main_ope_prefix}' ||
find_cached_bulk_update.main_ope_code
END
- || '-' ||
- to_char(find_cached_bulk_update.index, 'fm{zeros}')
+ {index}
|| '{join}' ||
find_cached_bulk_update.label
@@ -1374,7 +1482,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, OwnPerms,
""".format(main_ope_prefix=profile.operation_prefix,
ope_prefix=profile.default_operation_prefix,
join=settings.JOINT, filters=filters,
- zeros=settings.ISHTAR_FINDS_INDEX_ZERO_LEN * "0")
+ index=index)
with connection.cursor() as c:
c.execute(sql, args)
diff --git a/archaeological_finds/templates/ishtar/forms/qa_find_basket.html b/archaeological_finds/templates/ishtar/forms/qa_find_basket.html
new file mode 100644
index 000000000..77fc2abcd
--- /dev/null
+++ b/archaeological_finds/templates/ishtar/forms/qa_find_basket.html
@@ -0,0 +1,69 @@
+{% extends "ishtar/forms/qa_base.html" %}
+{% load i18n inline_formset table_form %}
+
+{% block main_form %}
+ {% if form.non_field_errors %}
+ <div class="alert alert-danger" role="alert">
+ {{form.non_field_errors}}
+ </div>
+ {% endif %}
+
+ {% for hidden in form.hidden_fields %}
+ {{hidden}}
+ {% if hidden.errors %}<div class="invalid-feedback">
+ {{ hidden.errors }}
+ </div>{% endif %}
+ {% endfor %}
+
+ {% if form.basket %}
+ <div class="form-row">
+ <input type="radio" name="create_or_update" value="create"
+ id="create-choice" checked >
+ &nbsp;<label for="create-choice">{% trans "New" %}</label>
+ </div>
+ {% else %}
+ <input type="hidden" name="create_or_update" value="create">
+ {% endif %}
+ <div id="new-basket">
+ <div class="form-row">
+ {% with form.label as field %}
+ {% include "blocks/bs_field_snippet.html" %}
+ {% endwith %}
+ </div>
+ </div>
+ {% if form.basket %}
+ <div class="form-row">
+ <input type="radio" name="create_or_update" value="update"
+ id="update-choice">
+ &nbsp;<label for="update-choice">{% trans "Add" %}</label>
+ </div>
+ <div id="update-basket">
+ <div class="form-row">
+ {% with form.basket as field %}
+ {% include "blocks/bs_field_snippet.html" %}
+ {% endwith %}
+ </div>
+ </div>
+ {% endif %}
+{% endblock %}
+
+{% block js %}
+var update_form_display = function(){
+ if ($("#update-choice:checked").length){
+ $("#new-basket").hide();
+ $("#update-basket").show();
+ } else {
+ $("#update-basket").hide();
+ $("#new-basket").show();
+ }
+}
+
+$(document).ready(function(){
+ $("#create-choice").click(update_form_display);
+ $("#update-choice").click(update_form_display);
+ update_form_display();
+});
+
+{% endblock %}
+
+
diff --git a/archaeological_finds/templates/ishtar/forms/qa_find_treatment.html b/archaeological_finds/templates/ishtar/forms/qa_find_treatment.html
new file mode 100644
index 000000000..ef3906735
--- /dev/null
+++ b/archaeological_finds/templates/ishtar/forms/qa_find_treatment.html
@@ -0,0 +1,63 @@
+{% extends "ishtar/forms/qa_base.html" %}
+{% load i18n inline_formset table_form %}
+
+{% block main_form %}
+ {% if form.non_field_errors %}
+ <div class="alert alert-danger" role="alert">
+ {{form.non_field_errors}}
+ </div>
+ {% endif %}
+
+ <h4>{% trans "Finds" %}</h4>
+ <ul>{% for item in items %}
+ <li>{{item}}</li>{% endfor %}
+ </ul>
+
+ <h4>{% trans "Packaging" %}</h4>
+ {% for hidden in form.hidden_fields %}
+ {{hidden}}
+ {% if hidden.errors %}<div class="invalid-feedback">
+ {{ hidden.errors }}
+ </div>{% endif %}
+ {% endfor %}
+ <div class="form-row">
+ {% with form.container as field %}
+ {% include "blocks/bs_field_snippet.html" %}
+ {% endwith %}
+ </div>
+
+ <div class="form-row">
+ {{ form.create_treatment }}&nbsp;<label for="{{form.create_treatment.auto_id}}">
+ {% trans "Associate a treatment" %}
+ </label>
+ </div>
+ <div id="new-treatment">
+ {% for field in form %}
+ {% if field.name != 'container' and field.name != 'create_treatment' %}
+ {% if forloop.counter0|divisibleby:2 %}
+ <div class="form-row">{% endif %}
+ {% include "blocks/bs_field_snippet.html" %}
+ {% if not forloop.counter0|divisibleby:2 %}
+ </div>{% endif %}
+ {% endif %}
+ {% endfor %}
+ </div>
+{% endblock %}
+
+{% block js %}
+var update_form_display = function(){
+ if ($("#{{form.create_treatment.auto_id}}:checked").length){
+ $("#new-treatment").show();
+ } else {
+ $("#new-treatment").hide();
+ }
+}
+
+$(document).ready(function(){
+ $("#{{form.create_treatment.auto_id}}").click(update_form_display);
+ update_form_display();
+});
+
+{% endblock %}
+
+
diff --git a/archaeological_finds/templates/ishtar/sheet_find.html b/archaeological_finds/templates/ishtar/sheet_find.html
index 43136e357..021ea5652 100644
--- a/archaeological_finds/templates/ishtar/sheet_find.html
+++ b/archaeological_finds/templates/ishtar/sheet_find.html
@@ -93,12 +93,7 @@
<h3>{% trans "Sheet" %}</h3>
<div class='row'>
{% trans "Checked" as checked_label %}
- {% if item.CHECK_DICT %}
- {% field_flex checked_label item.checked|from_dict:item.CHECK_DICT %}
- {% endif%}
- {% if item.history_object and item.history_object.CHECK_DICT %}
- {% field_flex checked_label item.checked|from_dict:item.history_object.CHECK_DICT %}
- {% endif%}
+ {% field_flex checked_label item.checked_type %}
{% field_flex "Check date" item.check_date %}
{% include "ishtar/blocks/sheet_creation_section.html" %}
</div>
diff --git a/archaeological_finds/templates/ishtar/sheet_findbasket.html b/archaeological_finds/templates/ishtar/sheet_findbasket.html
index b6d4ffd42..3c3ca1d3f 100644
--- a/archaeological_finds/templates/ishtar/sheet_findbasket.html
+++ b/archaeological_finds/templates/ishtar/sheet_findbasket.html
@@ -1,13 +1,24 @@
{% extends "ishtar/sheet.html" %}
{% load i18n window_tables window_header from_dict window_field %}
-{% block head_title %}{% trans "Find basket" %}{% endblock %}
+{% block head_title %}{% trans "Basket" %} - {{item.label}}{% endblock %}
+
+{% block toolbar %}
+{% window_nav item window_id 'show-findbasket' 'find_basket_modify' %}
+{% 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 finds 'finds_for_ope' 'basket' item.pk 'TABLE_COLS_FOR_OPE' output %}
+<div class='row'>
+ {% field_flex "Label" item.label %}
+ {% field_flex_detail "Owned by" item.user.person %}
+ {% field_flex_multiple "Shared_with" item.shared_with %}
+ {% field_flex "Comment" item.comment %}
+</div>
+
+<h3>{% trans "Content" %}</h3>
+
+{% dynamic_table_document finds 'finds' 'basket_id' item.pk 'TABLE_COLS' output %}
+
+
{% endblock %}
diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py
index 353ebbdbb..a55e075b7 100644
--- a/archaeological_finds/tests.py
+++ b/archaeological_finds/tests.py
@@ -20,7 +20,7 @@
import json
from django.conf import settings
-from django.contrib.auth.models import User, Permission
+from django.contrib.auth.models import User, Permission, ContentType
from django.core.files import File
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.urlresolvers import reverse
@@ -683,10 +683,12 @@ class FindPermissionTest(FindInit, TestCase):
def setUp(self):
self.username, self.password, self.user = create_superuser()
self.alt_username, self.alt_password, self.alt_user = create_user()
+ ct_find = ContentType.objects.get(app_label='archaeological_finds',
+ model='find')
self.alt_user.user_permissions.add(Permission.objects.get(
- codename='view_own_find'))
+ codename='view_own_find', content_type=ct_find))
self.alt_user.user_permissions.add(Permission.objects.get(
- codename='change_own_find'))
+ codename='change_own_find', content_type=ct_find))
self.alt_username2, self.alt_password2, self.alt_user2 = create_user(
username='luke', password='iamyourfather'
)
@@ -747,6 +749,64 @@ class FindPermissionTest(FindInit, TestCase):
self.assertEqual(json.loads(response.content)['recordsTotal'], 1)
+class FindQATest(FindInit, TestCase):
+ fixtures = FIND_FIXTURES
+ model = models.Find
+
+ def setUp(self):
+ self.create_finds(data_base={"label": u"Find 1"}, force=True)
+ self.create_finds(data_base={"label": u"Find 2"}, force=True)
+ self.username, self.password, self.user = create_superuser()
+ self.alt_username, self.alt_password, self.alt_user = create_user()
+ self.alt_user.user_permissions.add(Permission.objects.get(
+ codename='change_find'))
+
+ def test_bulk_update(self):
+ c = Client()
+ pks = u"{}-{}".format(self.finds[0].pk, self.finds[1].pk)
+ response = c.get(reverse('find-qa-bulk-update', args=[pks]))
+ self.assertRedirects(response, '/')
+
+ c = Client()
+ c.login(username=self.username, password=self.password)
+ response = c.get(reverse('find-qa-bulk-update', args=[pks]))
+ self.assertEqual(response.status_code, 200)
+
+ c = Client()
+ c.login(username=self.alt_username, password=self.alt_password)
+ response = c.get(reverse('find-qa-bulk-update', args=[pks]))
+ self.assertEqual(response.status_code, 200)
+
+ find_0 = self.finds[0]
+ find_1 = self.finds[1]
+ base_desc_0 = u"Base description 1"
+ find_0.description = base_desc_0
+ find_0.save()
+ base_desc_1 = u"Base description 2"
+ find_1.description = base_desc_1
+ find_1.save()
+
+ period = Period.objects.all()[0].pk
+ self.assertNotIn(period,
+ [dating.period.pk for dating in find_0.datings.all()])
+ self.assertNotIn(period,
+ [dating.period.pk for dating in find_1.datings.all()])
+ extra_desc = u"Extra description"
+ response = c.post(
+ reverse('find-qa-bulk-update-confirm', args=[pks]),
+ {'qa_period': period, 'qa_description': extra_desc}
+ )
+ self.assertRedirects(response, '/success/')
+ self.assertIn(period,
+ [dating.period.pk for dating in find_0.datings.all()])
+ self.assertIn(period,
+ [dating.period.pk for dating in find_1.datings.all()])
+ self.assertEqual(models.Find.objects.get(pk=find_0.pk).description,
+ base_desc_0 + u"\n" + extra_desc)
+ self.assertEqual(models.Find.objects.get(pk=find_1.pk).description,
+ base_desc_1 + u"\n" + extra_desc)
+
+
class PackagingTest(FindInit, TestCase):
fixtures = FIND_FIXTURES
model = models.Find
diff --git a/archaeological_finds/urls.py b/archaeological_finds/urls.py
index 9a71c66d8..588c8d520 100644
--- a/archaeological_finds/urls.py
+++ b/archaeological_finds/urls.py
@@ -43,34 +43,64 @@ urlpatterns = [
views.find_deletion_wizard), name='find_deletion'),
url(r'find_modify/(?P<pk>.+)/$',
views.find_modify, name='find_modify'),
+ url(r'get-findbasket/$', views.get_find_basket,
+ name='get-findbasket'),
+ url(r'find_basket_search/(?P<step>.+)?$',
+ check_rights(['view_find', 'view_own_find'])(
+ views.basket_search_wizard), name='find_basket_search'),
url(r'^find_basket_creation/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.NewFindBasketView.as_view()), name='new_findbasket'),
+ url(r'^find_basket_modification/(?P<step>.+)?$',
+ check_rights(['view_find', 'view_own_find'])(
+ views.basket_modify_wizard),
+ name='find_basket_modification'),
+ url(r'find_basket_modify/(?P<pk>.+)/$',
+ views.find_basket_modify, name='find_basket_modify'),
url(r'^find_basket_modification_add/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.SelectBasketForManagement.as_view()),
name='select_findbasketforadd'),
url(r'^find_basket_modification_add/(?P<pk>[0-9]+)?/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.SelectItemsInBasket.as_view()),
name='select_itemsinbasket'),
url(r'^find_basket_modification_add_item/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.FindBasketAddItemView.as_view()),
name='add_iteminbasket'),
url(r'^find_basket_modification_delete_item/(?P<basket>[0-9]+)?'
r'/(?P<find_pk>[0-9]+)?/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.FindBasketDeleteItemView.as_view()),
name='delete_iteminbasket'),
url(r'^find_basket_list/(?P<pk>[0-9]+)?/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.FindBasketListView.as_view()),
name='list_iteminbasket'),
url(r'^find_basket_deletion/$',
- check_rights(['change_find', 'change_own_find'])(
+ check_rights(['view_find', 'view_own_find'])(
views.DeleteFindBasketView.as_view()), name='delete_findbasket'),
+ url(r'^find-qa-bulk-update/(?P<pks>[0-9-]+)?/$',
+ check_rights(['change_find', 'change_own_find'])(
+ views.QAFindForm.as_view()),
+ name='find-qa-bulk-update'),
+ url(r'^find-qa-bulk-update/(?P<pks>[0-9-]+)?/confirm/$',
+ check_rights(['change_find', 'change_own_find'])(
+ views.QAFindForm.as_view()),
+ name='find-qa-bulk-update-confirm', kwargs={"confirm": True}),
+ url(r'^find-qa-basket/(?P<pks>[0-9-]+)?/$',
+ check_rights(['change_find', 'change_own_find'])(
+ views.QAFindBasketFormView.as_view()),
+ name='find-qa-basket'),
+
+ url(r'^find-qa-packaging/(?P<pks>[0-9-]+)?/$',
+ check_rights(['change_find', 'change_own_find'])(
+ views.QAFindTreatmentFormView.as_view()),
+ name='find-qa-packaging'),
+
+
url(r'^treatment_creation/(?P<step>.+)?$',
check_rights(['change_find', 'change_own_find'])(
views.treatment_creation_wizard), name='treatment_creation'),
@@ -182,7 +212,8 @@ urlpatterns = [
url(r'get-find-shortcut/(?P<type>.+)?$',
views.get_find, name='get-find-shortcut',
kwargs={'full': 'shortcut'}),
- url(r'^show-find/basket-(?P<pk>.+)/(?P<type>.+)?$', views.show_findbasket,
+ url(r'^show-find/basket-(?:(?P<pk>.+)/(?P<type>.+)?)?$',
+ views.show_findbasket,
name='show-findbasket'),
url(r'^display-find/basket-(?P<pk>.+)/$', views.display_findbasket,
name='display-findbasket'),
diff --git a/archaeological_finds/views.py b/archaeological_finds/views.py
index 6c6d9fff9..c340639c5 100644
--- a/archaeological_finds/views.py
+++ b/archaeological_finds/views.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
-# Copyright (C) 2010-2016 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
+# Copyright (C) 2010-2018 É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
@@ -21,7 +21,7 @@ import json
from django.core.urlresolvers import reverse
from django.db.models import Q
-from django.http import HttpResponseRedirect, HttpResponse
+from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import redirect
from django.utils.translation import ugettext_lazy as _
from django.views.generic import TemplateView
@@ -35,7 +35,7 @@ from forms import *
from ishtar_common.forms import FinalForm
from ishtar_common.models import IshtarUser, get_current_profile
from ishtar_common.views import get_autocomplete_generic, IshtarMixin, \
- LoginRequiredMixin
+ LoginRequiredMixin, QAItemEditForm, QAItemForm
from ishtar_common.views_item import display_item, get_item, show_item, \
revert_item, get_autocomplete_item
from wizards import *
@@ -113,6 +113,36 @@ show_findbasket = show_item(models.FindBasket, 'findbasket')
display_findbasket = display_item(models.FindBasket,
show_url='show-find/basket-')
+get_find_basket = get_item(
+ models.FindBasket, 'get_findbasket', 'findbasket',
+)
+
+basket_search_wizard = FindBasketSearch.as_view(
+ [('selec-find_basket_search', FindBasketFormSelection)],
+ label=_(u"Basket search"),
+ url_name='find_basket_search',
+)
+
+basket_modify_wizard = FindBasketEditWizard.as_view(
+ [
+ ('selec-find_basket_modification', FindBasketFormSelection),
+ ('basket-find_basket_modification', FindBasketForm),
+ ('final-find_basket_modification', FinalForm)
+ ],
+ label=_(u"Basket modify"),
+ url_name='find_basket_modification',
+)
+
+
+def find_basket_modify(request, pk):
+ basket_modify_wizard(request)
+ key = 'selec-find_basket_modification'
+ FindBasketEditWizard.session_set_value(
+ request, key, 'pk', pk, reset=True)
+ return redirect(
+ reverse('find_basket_modification',
+ kwargs={'step': 'basket-find_basket_modification'}))
+
def check_preservation_module(self):
return get_current_profile().preservation
@@ -234,6 +264,16 @@ class NewFindBasketView(IshtarMixin, LoginRequiredMixin, CreateView):
return HttpResponseRedirect(self.get_success_url())
+class OwnBasket(object):
+ def get_basket(self, user, pk):
+ try:
+ return models.FindBasket.objects.filter(
+ Q(user=user) | Q(shared_with=user)
+ ).get(pk=pk)
+ except models.FindBasket.DoesNotExist:
+ raise PermissionDenied
+
+
class SelectBasketForManagement(IshtarMixin, LoginRequiredMixin, FormView):
template_name = 'ishtar/form.html'
form_class = SelectFindBasketForm
@@ -255,7 +295,8 @@ class SelectBasketForManagement(IshtarMixin, LoginRequiredMixin, FormView):
form.cleaned_data['basket']))
-class SelectItemsInBasket(IshtarMixin, LoginRequiredMixin, TemplateView):
+class SelectItemsInBasket(OwnBasket, IshtarMixin, LoginRequiredMixin,
+ TemplateView):
template_name = 'ishtar/manage_basket.html'
page_name = _(u"Manage basket")
@@ -263,11 +304,9 @@ class SelectItemsInBasket(IshtarMixin, LoginRequiredMixin, TemplateView):
context = super(SelectItemsInBasket, self).get_context_data(
*args, **kwargs)
self.user = IshtarUser.objects.get(pk=self.request.user.pk)
- try:
- self.basket = models.FindBasket.objects.get(
- pk=self.kwargs['pk'], user=self.user)
- except models.FindBasket.DoesNotExist:
- raise PermissionDenied
+ self.basket = self.get_basket(
+ user=self.user, pk=self.kwargs['pk']
+ )
context['basket'] = self.basket
if get_current_profile().warehouse:
context['form'] = MultipleFindFormSelectionWarehouseModule()
@@ -296,18 +335,17 @@ class FindBasketAddItemView(IshtarMixin, LoginRequiredMixin, FormView):
return HttpResponseRedirect(self.get_success_url(basket))
-class FindBasketListView(IshtarMixin, LoginRequiredMixin, TemplateView):
+class FindBasketListView(OwnBasket, IshtarMixin, LoginRequiredMixin,
+ TemplateView):
template_name = 'ishtar/basket_list.html'
def get_context_data(self, *args, **kwargs):
context = super(FindBasketListView, self).get_context_data(
*args, **kwargs)
self.user = IshtarUser.objects.get(pk=self.request.user.pk)
- try:
- self.basket = models.FindBasket.objects.get(
- pk=self.kwargs['pk'], user=self.user)
- except models.FindBasket.DoesNotExist:
- raise PermissionDenied
+ self.basket = self.get_basket(
+ user=self.user, pk=self.kwargs['pk']
+ )
context['basket'] = self.basket
context['item_url'] = '/'.join(
reverse(models.Find.SHOW_URL, args=[1]).split('/')[:-1])
@@ -316,7 +354,8 @@ class FindBasketListView(IshtarMixin, LoginRequiredMixin, TemplateView):
return context
-class FindBasketDeleteItemView(IshtarMixin, LoginRequiredMixin, TemplateView):
+class FindBasketDeleteItemView(OwnBasket, IshtarMixin, LoginRequiredMixin,
+ TemplateView):
template_name = 'ishtar/simple_form.html'
def get_success_url(self, basket):
@@ -330,14 +369,13 @@ class FindBasketDeleteItemView(IshtarMixin, LoginRequiredMixin, TemplateView):
pk=self.kwargs['find_pk'])
except models.Find.DoesNotExist:
raise PermissionDenied
- try:
- basket = models.FindBasket.objects.get(
- pk=self.kwargs['basket'], user=ishtaruser)
- except models.FindBasket.DoesNotExist:
- raise PermissionDenied
+
+ basket = self.get_basket(
+ user=ishtaruser, pk=self.kwargs['basket']
+ )
if not user.is_superuser and \
- not ishtaruser.has_right('change_find') and \
- not (ishtaruser.has_right('change_own_find')
+ not ishtaruser.has_right('view_find') and \
+ not (ishtaruser.has_right('view_own_find')
and find.is_own(user)):
raise PermissionDenied
basket.items.remove(find)
@@ -594,3 +632,48 @@ def reset_wizards(request):
'treatmentfle_admacttreatmentfle_deletion'),
):
wizard_class.session_reset(request, url_name)
+
+
+class QAFindForm(QAItemEditForm):
+ model = models.Find
+ form_class = QAFindFormMulti
+
+
+class QAFindBasketFormView(QAItemForm):
+ template_name = 'ishtar/forms/qa_find_basket.html'
+ model = models.Find
+ form_class = QAFindBasketForm
+ page_name = _(u"Basket")
+ modal_size = "small"
+
+ def get_quick_action(self):
+ return models.Find.QUICK_ACTIONS[1]
+
+ def get_form_kwargs(self):
+ kwargs = super(QAFindBasketFormView, self).get_form_kwargs()
+ kwargs['user'] = self.request.user
+ return kwargs
+
+ def form_valid(self, form):
+ form.save(self.items)
+ return HttpResponseRedirect(reverse("success"))
+
+
+class QAFindTreatmentFormView(QAItemForm):
+ template_name = 'ishtar/forms/qa_find_treatment.html'
+ model = models.Find
+ form_class = QAFindTreatmentForm
+ page_name = _(u"Packaging")
+
+ def get_quick_action(self):
+ return models.Find.QUICK_ACTIONS[2]
+
+ def get_form_kwargs(self):
+ kwargs = super(QAFindTreatmentFormView, self).get_form_kwargs()
+ kwargs['user'] = self.request.user
+ kwargs['prefix'] = "qa-packaging"
+ return kwargs
+
+ def form_valid(self, form):
+ form.save(self.items, self.request.user)
+ return HttpResponseRedirect(reverse("success"))
diff --git a/archaeological_finds/wizards.py b/archaeological_finds/wizards.py
index 6486e5da1..0e0fe80e1 100644
--- a/archaeological_finds/wizards.py
+++ b/archaeological_finds/wizards.py
@@ -230,3 +230,16 @@ class TreatmentFileEditAdministrativeActWizard(
def get_associated_item(self, dct):
return self.get_current_object().treatment_file
+
+
+class FindBasketSearch(SearchWizard):
+ model = models.FindBasket
+
+
+class FindBasketWizard(Wizard):
+ model = models.FindBasket
+ wizard_done_window = reverse_lazy('show-findbasket')
+
+
+class FindBasketEditWizard(FindBasketWizard):
+ edit = True
diff --git a/archaeological_operations/forms.py b/archaeological_operations/forms.py
index 9a54e0d8c..a8c827757 100644
--- a/archaeological_operations/forms.py
+++ b/archaeological_operations/forms.py
@@ -1244,6 +1244,18 @@ class SiteSelect(TableSelect):
towns = get_town_field()
comment = forms.CharField(label=_(u"Comment"), max_length=200,
required=False)
+ top_operation = forms.IntegerField(
+ label=_(u"Top operation"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-operation'),
+ associated_model=models.Operation),
+ validators=[valid_id(models.Operation)])
+ operation = forms.IntegerField(
+ label=_(u"Operation"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-operation'),
+ associated_model=models.Operation),
+ validators=[valid_id(models.Operation)])
locality_ngi = forms.CharField(
label=_(u"National Geographic Institute locality"), max_length=200,
required=False)
diff --git a/archaeological_operations/locale/django.pot b/archaeological_operations/locale/django.pot
index 4ab3f237f..4e58f2750 100644
--- a/archaeological_operations/locale/django.pot
+++ b/archaeological_operations/locale/django.pot
@@ -9,21 +9,21 @@
msgid ""
msgstr ""
-#: admin.py:91 models.py:738
+#: admin.py:91 models.py:244 models.py:836
msgid "Point"
msgstr ""
-#: admin.py:93 models.py:739
+#: admin.py:93 models.py:245 models.py:837
msgid "Multi polygon"
msgstr ""
-#: forms.py:64 forms.py:1061 forms.py:1077 forms.py:1083 models.py:1786
+#: forms.py:64 forms.py:1061 forms.py:1077 forms.py:1083 models.py:1929
#: templates/ishtar/blocks/window_tables/parcels.html:9
-#: templates/ishtar/sheet_operation.html:235
+#: templates/ishtar/sheet_operation.html:250
msgid "Parcels"
msgstr ""
-#: forms.py:67 forms.py:200 forms.py:1036 models.py:1770
+#: forms.py:67 forms.py:200 forms.py:1036 models.py:1913
#: templates/ishtar/blocks/window_tables/parcels.html:6
#: templates/ishtar/dashboards/dashboard_operation.html:432
#: templates/ishtar/dashboards/dashboard_operation.html:446
@@ -32,22 +32,22 @@ msgstr ""
msgid "Town"
msgstr ""
-#: forms.py:69 forms.py:480 forms.py:763 forms.py:1386 models.py:636
-#: models.py:1565 models.py:1768
+#: forms.py:69 forms.py:480 forms.py:763 forms.py:1399 models.py:734
+#: models.py:1489 models.py:1694 models.py:1911
#: templates/ishtar/blocks/window_tables/parcels.html:7
msgid "Year"
msgstr ""
-#: forms.py:72 models.py:1771
+#: forms.py:72 models.py:1914
#: templates/ishtar/blocks/window_tables/parcels.html:8
msgid "Section"
msgstr ""
-#: forms.py:75 models.py:1773
+#: forms.py:75 models.py:1916
msgid "Parcel number"
msgstr ""
-#: forms.py:77 models.py:1775 models.py:1794 models.py:1848
+#: forms.py:77 models.py:1918 models.py:1937 models.py:1998
msgid "Public domain"
msgstr ""
@@ -83,9 +83,9 @@ msgstr ""
msgid "Relation type"
msgstr ""
-#: forms.py:373 ishtar_menu.py:32 models.py:744 models.py:1273 models.py:1284
-#: models.py:1547 models.py:1767 templates/ishtar/sheet_operation.html:4
-#: wizards.py:320 wizards.py:331
+#: forms.py:373 forms.py:1254 ishtar_menu.py:32 models.py:842 models.py:1394
+#: models.py:1405 models.py:1491 models.py:1676 models.py:1910
+#: templates/ishtar/sheet_operation.html:4 wizards.py:320 wizards.py:331
msgid "Operation"
msgstr ""
@@ -113,7 +113,7 @@ msgstr ""
msgid "Deleted relations"
msgstr ""
-#: forms.py:469 templates/ishtar/sheet_operation.html:154
+#: forms.py:469 templates/ishtar/sheet_operation.html:169
msgid "Relations"
msgstr ""
@@ -121,19 +121,19 @@ msgstr ""
msgid "Operation - 080 - Relations"
msgstr ""
-#: forms.py:478 forms.py:1237 forms.py:1383
+#: forms.py:478 forms.py:1237 forms.py:1396
msgid "Full text search"
msgstr ""
-#: forms.py:481 models.py:637
+#: forms.py:481 models.py:735
msgid "Numeric reference"
msgstr ""
-#: forms.py:488 forms.py:1064 forms.py:1398 models.py:1785 models.py:1990
+#: forms.py:488 forms.py:1064 forms.py:1411 models.py:1928 models.py:2140
msgid "Parcel"
msgstr ""
-#: forms.py:491 forms.py:1401 models.py:1274
+#: forms.py:491 forms.py:1414 models.py:1395
#: templates/ishtar/dashboards/dashboard_operation.html:390
#: templates/ishtar/dashboards/dashboard_operation.html:411
#: templates/ishtar/dashboards/dashboard_operation.html:643
@@ -142,17 +142,17 @@ msgstr ""
msgid "Department"
msgstr ""
-#: forms.py:492 forms.py:1148 forms.py:1241 forms.py:1311 models.py:183
+#: forms.py:492 forms.py:1148 forms.py:1241 forms.py:1325 models.py:213
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:7
-#: templates/ishtar/sheet_operation.html:28
+#: templates/ishtar/sheet_operation.html:29
msgid "Name"
msgstr ""
-#: forms.py:493 forms.py:761 models.py:699
+#: forms.py:493 forms.py:761 models.py:797
msgid "Address / Locality"
msgstr ""
-#: forms.py:494 forms.py:678 forms.py:757 models.py:644
+#: forms.py:494 forms.py:678 forms.py:757 models.py:742
msgid "Operation type"
msgstr ""
@@ -160,26 +160,26 @@ msgstr ""
msgid "Is open?"
msgstr ""
-#: forms.py:503 forms.py:793 models.py:629
+#: forms.py:503 forms.py:793 models.py:727
msgid "In charge"
msgstr ""
-#: forms.py:510 models.py:1541
+#: forms.py:510 models.py:1670
msgid "Scientist in charge"
msgstr ""
-#: forms.py:512 forms.py:680 forms.py:783 models.py:627
+#: forms.py:512 forms.py:680 forms.py:783 models.py:725
msgid "Operator"
msgstr ""
-#: forms.py:521 forms.py:1153 forms.py:1243 forms.py:1316 models.py:187
-#: models.py:646
+#: forms.py:521 forms.py:1153 forms.py:1243 forms.py:1330 models.py:217
+#: models.py:744
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:9
msgid "Remains"
msgstr ""
-#: forms.py:522 forms.py:1131 forms.py:1150 forms.py:1242 forms.py:1313
-#: models.py:185 models.py:652
+#: forms.py:522 forms.py:1131 forms.py:1150 forms.py:1242 forms.py:1327
+#: models.py:215 models.py:750
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:8
msgid "Periods"
msgstr ""
@@ -204,8 +204,8 @@ msgstr ""
msgid "Search within relations"
msgstr ""
-#: forms.py:529 forms.py:841 forms.py:1245 forms.py:1326 models.py:191
-#: models.py:700
+#: forms.py:529 forms.py:841 forms.py:1245 forms.py:1340 models.py:221
+#: models.py:798
msgid "Comment"
msgstr ""
@@ -213,35 +213,35 @@ msgstr ""
msgid "Abstract (full text search)"
msgstr ""
-#: forms.py:532 forms.py:844 models.py:702
+#: forms.py:532 forms.py:844 models.py:800
msgid "Comment about scientific documentation"
msgstr ""
-#: forms.py:533 forms.py:846 models.py:717
+#: forms.py:533 forms.py:846 models.py:815
msgid "Record quality"
msgstr ""
-#: forms.py:534 forms.py:812 models.py:664
+#: forms.py:534 forms.py:812 models.py:762
msgid "Report processing"
msgstr ""
-#: forms.py:536 forms.py:849 models.py:712
+#: forms.py:536 forms.py:849 models.py:810
msgid "Virtual operation"
msgstr ""
-#: forms.py:538 forms.py:1188 forms.py:1192 models.py:220
+#: forms.py:538 forms.py:1188 forms.py:1192 models.py:257
msgid "Archaeological site"
msgstr ""
-#: forms.py:544 forms.py:1405
+#: forms.py:544 forms.py:1418
msgid "Created by"
msgstr ""
-#: forms.py:550 forms.py:1411
+#: forms.py:550 forms.py:1424
msgid "Modified by"
msgstr ""
-#: forms.py:557 forms.py:834 models.py:724
+#: forms.py:557 forms.py:834 models.py:822
msgid "Documentation received"
msgstr ""
@@ -253,7 +253,7 @@ msgstr ""
msgid "Documentation deadline after"
msgstr ""
-#: forms.py:563 forms.py:839 models.py:728
+#: forms.py:563 forms.py:839 models.py:826
msgid "Finds received"
msgstr ""
@@ -265,7 +265,7 @@ msgstr ""
msgid "Finds deadline after"
msgstr ""
-#: forms.py:595 views.py:180
+#: forms.py:595 views.py:182
msgid "Operation search"
msgstr ""
@@ -273,12 +273,12 @@ msgstr ""
msgid "Associated file"
msgstr ""
-#: forms.py:643 forms.py:937 models.py:904 models.py:1283 models.py:1552
-#: wizards.py:83
+#: forms.py:643 forms.py:937 models.py:1023 models.py:1404 models.py:1490
+#: models.py:1681 wizards.py:83
msgid "Archaeological file"
msgstr ""
-#: forms.py:650 forms.py:654 models.py:719
+#: forms.py:650 forms.py:654 models.py:817
msgid "Abstract"
msgstr ""
@@ -294,7 +294,7 @@ msgstr ""
msgid "years"
msgstr ""
-#: forms.py:660 models.py:613
+#: forms.py:660 models.py:711
msgid "Creation date"
msgstr ""
@@ -346,9 +346,9 @@ msgstr ""
msgid "With finds"
msgstr ""
-#: forms.py:737 forms.py:1305 forms.py:1452
+#: forms.py:737 forms.py:1317 forms.py:1465
#: templates/ishtar/sheet_administrativeact.html:23
-#: templates/ishtar/sheet_operation.html:36 templates/ishtar/sheet_site.html:37
+#: templates/ishtar/sheet_operation.html:12 templates/ishtar/sheet_site.html:33
msgid "General"
msgstr ""
@@ -356,11 +356,11 @@ msgstr ""
msgid "Operation - 010 - General"
msgstr ""
-#: forms.py:759 models.py:698
+#: forms.py:759 models.py:796
msgid "Generic name"
msgstr ""
-#: forms.py:768 models.py:666
+#: forms.py:768 models.py:764
msgid "Old code"
msgstr ""
@@ -368,7 +368,7 @@ msgstr ""
msgid "Head scientist"
msgstr ""
-#: forms.py:790 models.py:697
+#: forms.py:790 models.py:795
msgid "Operator reference"
msgstr ""
@@ -376,23 +376,23 @@ msgstr ""
msgid "Total surface (m2)"
msgstr ""
-#: forms.py:807 models.py:56 models.py:616 models.py:1992
+#: forms.py:807 models.py:57 models.py:714 models.py:2142
msgid "Start date"
msgstr ""
-#: forms.py:808 models.py:618
+#: forms.py:808 models.py:716
msgid "Excavation end date"
msgstr ""
-#: forms.py:810 models.py:619
+#: forms.py:810 models.py:717
msgid "Report delivery date"
msgstr ""
-#: forms.py:831 models.py:721
+#: forms.py:831 models.py:819
msgid "Deadline for submission of the documentation"
msgstr ""
-#: forms.py:836 models.py:726
+#: forms.py:836 models.py:824
msgid "Deadline for submission of the finds"
msgstr ""
@@ -416,11 +416,11 @@ msgstr ""
msgid "Bad operation code"
msgstr ""
-#: forms.py:933 models.py:919
+#: forms.py:933 models.py:1038
msgid "Operation code"
msgstr ""
-#: forms.py:968 templates/ishtar/sheet_operation.html:134
+#: forms.py:968 templates/ishtar/sheet_operation.html:149
msgid "Court-ordered seizure"
msgstr ""
@@ -428,19 +428,19 @@ msgstr ""
msgid "Operation - 015 - Court-ordered seizure"
msgstr ""
-#: forms.py:973 models.py:731
+#: forms.py:973 models.py:829
msgid "Seizure name"
msgstr ""
-#: forms.py:976 models.py:732
+#: forms.py:976 models.py:830
msgid "Official report number"
msgstr ""
-#: forms.py:979 models.py:734
+#: forms.py:979 models.py:832
msgid "Name of the protagonist"
msgstr ""
-#: forms.py:984 forms.py:991 models.py:633
+#: forms.py:984 forms.py:991 models.py:731
msgid "Collaborators"
msgstr ""
@@ -456,20 +456,20 @@ msgstr ""
msgid "Operation - 033 - Preventive - Excavation"
msgstr ""
-#: forms.py:1004 models.py:650
+#: forms.py:1004 models.py:748
#: templates/ishtar/dashboards/dashboard_operation.html:701
msgid "Cost (euros)"
msgstr ""
-#: forms.py:1005 models.py:655
+#: forms.py:1005 models.py:753
msgid "Scheduled man-days"
msgstr ""
-#: forms.py:1007 models.py:658
+#: forms.py:1007 models.py:756
msgid "Optional man-days"
msgstr ""
-#: forms.py:1009 models.py:661
+#: forms.py:1009 models.py:759
msgid "Effective man-days"
msgstr ""
@@ -481,20 +481,20 @@ msgstr ""
msgid "Operation - 037 - Preventive - Diagnostic"
msgstr ""
-#: forms.py:1025 models.py:681
+#: forms.py:1025 models.py:779
msgid "Prescription on zoning"
msgstr ""
-#: forms.py:1027 models.py:684
+#: forms.py:1027 models.py:782
msgid "Prescription on large area"
msgstr ""
-#: forms.py:1030 models.py:686
+#: forms.py:1030 models.py:784
msgid "Prescription on geoarchaeological context"
msgstr ""
-#: forms.py:1034 forms.py:1050 forms.py:1055 forms.py:1346 models.py:189
-#: models.py:648 models.py:1575
+#: forms.py:1034 forms.py:1050 forms.py:1055 forms.py:1359 models.py:128
+#: models.py:219 models.py:506 models.py:746 models.py:1704
msgid "Towns"
msgstr ""
@@ -514,7 +514,7 @@ msgstr ""
msgid "Operation - 050 - Parcels (2)"
msgstr ""
-#: forms.py:1115 models.py:46
+#: forms.py:1115 models.py:47
msgid "Remain types"
msgstr ""
@@ -522,7 +522,7 @@ msgstr ""
msgid "Operation - 060 - Remains"
msgstr ""
-#: forms.py:1122 models.py:45
+#: forms.py:1122 models.py:46
msgid "Remain type"
msgstr ""
@@ -530,21 +530,21 @@ msgstr ""
msgid "Operation - 070 - Periods"
msgstr ""
-#: forms.py:1138 templates/ishtar/sheet_operation.html:258
-#: templates/ishtar/sheet_operation.html:295
+#: forms.py:1138 templates/ishtar/sheet_operation.html:273
+#: templates/ishtar/sheet_operation.html:310
msgid "Period"
msgstr ""
-#: forms.py:1147 forms.py:1239 forms.py:1310 models.py:182
+#: forms.py:1147 forms.py:1239 forms.py:1324 models.py:212
msgid "Reference"
msgstr ""
-#: forms.py:1171 forms.py:1340
+#: forms.py:1171 forms.py:1353
msgid "This reference already exists."
msgstr ""
-#: forms.py:1203 models.py:221 models.py:709
-#: templates/ishtar/sheet_operation.html:179
+#: forms.py:1203 models.py:258 models.py:807
+#: templates/ishtar/sheet_operation.html:194
msgid "Archaeological sites"
msgstr ""
@@ -568,119 +568,123 @@ msgstr ""
msgid "Would you like to delete this operation?"
msgstr ""
-#: forms.py:1248 forms.py:1319 models.py:196
+#: forms.py:1248 models.py:223
+msgid "Top operation"
+msgstr ""
+
+#: forms.py:1260 forms.py:1333 models.py:226
msgid "National Geographic Institute locality"
msgstr ""
-#: forms.py:1251 forms.py:1323 models.py:199
+#: forms.py:1263 forms.py:1337 models.py:229
msgid "Cadastral locality"
msgstr ""
-#: forms.py:1254 forms.py:1361 models.py:203
+#: forms.py:1266 forms.py:1374 models.py:233
msgid "Shipwreck name"
msgstr ""
-#: forms.py:1257 forms.py:1369 models.py:205
+#: forms.py:1269 forms.py:1382 models.py:235
msgid "Oceanographic service localisation"
msgstr ""
-#: forms.py:1260 forms.py:1363 models.py:207
+#: forms.py:1272 forms.py:1376 models.py:237
msgid "Shipwreck code"
msgstr ""
-#: forms.py:1262 forms.py:1365 models.py:209
+#: forms.py:1274 forms.py:1378 models.py:239
msgid "Sinking date"
msgstr ""
-#: forms.py:1264 forms.py:1367 models.py:211
+#: forms.py:1276 forms.py:1380 models.py:241
msgid "Discovery area"
msgstr ""
-#: forms.py:1300
+#: forms.py:1312
msgid "You should select an item."
msgstr ""
-#: forms.py:1306
+#: forms.py:1318
msgid "Archaeological site - 010 - General"
msgstr ""
-#: forms.py:1347
+#: forms.py:1360
msgid "Archaeological site - 020 - Towns"
msgstr ""
-#: forms.py:1356 templates/ishtar/sheet_site.html:56
+#: forms.py:1369 templates/ishtar/sheet_site.html:52
msgid "Underwater"
msgstr ""
-#: forms.py:1357
+#: forms.py:1370
msgid "Archaeological site - 030 - Underwater"
msgstr ""
-#: forms.py:1387 forms.py:1521 models.py:1532
+#: forms.py:1400 forms.py:1534 models.py:1661
msgid "Index"
msgstr ""
-#: forms.py:1395 forms.py:1455 models.py:1297 models.py:1526
+#: forms.py:1408 forms.py:1468 models.py:1418 models.py:1655
msgid "Act type"
msgstr ""
-#: forms.py:1396 forms.py:1591
+#: forms.py:1409 forms.py:1604
msgid "Indexed?"
msgstr ""
-#: forms.py:1402 forms.py:1460 models.py:1566
+#: forms.py:1415 forms.py:1473 models.py:1695
#: templates/ishtar/blocks/window_tables/administrativacts.html:9
msgid "Object"
msgstr ""
-#: forms.py:1432 views.py:409
+#: forms.py:1445 views.py:412
msgid "Administrative act search"
msgstr ""
-#: forms.py:1447 forms.py:1549 forms.py:1616
+#: forms.py:1460 forms.py:1562 forms.py:1629
msgid "You should select an administrative act."
msgstr ""
-#: forms.py:1463 models.py:1563
+#: forms.py:1476 models.py:1692
msgid "Signature date"
msgstr ""
-#: forms.py:1475
+#: forms.py:1488
msgid "Operation - Administrative act - General"
msgstr ""
-#: forms.py:1509
+#: forms.py:1522
#, python-format
msgid ""
"This index already exists for year: %(year)d - use a value bigger than "
"%(last_val)d"
msgstr ""
-#: forms.py:1513
+#: forms.py:1526
msgid "Bad index"
msgstr ""
-#: forms.py:1526
+#: forms.py:1539
msgid "Would you like to delete this administrative act?"
msgstr ""
-#: forms.py:1531
+#: forms.py:1544
msgid "Template"
msgstr ""
-#: forms.py:1555 forms.py:1559
+#: forms.py:1568 forms.py:1572
msgid "This document is not intended for this type of act."
msgstr ""
-#: forms.py:1577
+#: forms.py:1590
msgid "Doc generation"
msgstr ""
-#: forms.py:1579
+#: forms.py:1592
msgid "Generate the associated doc?"
msgstr ""
-#: forms.py:1600 ishtar_menu.py:101 views.py:462
+#: forms.py:1613 ishtar_menu.py:101 views.py:465
msgctxt "admin act register"
msgid "Register"
msgstr ""
@@ -701,12 +705,12 @@ msgstr ""
msgid "Deletion"
msgstr ""
-#: ishtar_menu.py:61 models.py:1582
+#: ishtar_menu.py:61 models.py:1711
#: templates/ishtar/sheet_administrativeact.html:4
msgid "Administrative act"
msgstr ""
-#: ishtar_menu.py:87 models.py:214 models.py:704
+#: ishtar_menu.py:87 models.py:249 models.py:802
msgid "Documents"
msgstr ""
@@ -722,693 +726,707 @@ msgstr ""
msgid "General informations"
msgstr ""
-#: ishtar_menu.py:143 models.py:745
+#: ishtar_menu.py:143 models.py:843
#: templates/ishtar/dashboards/dashboard_operation.html:8
-#: templates/ishtar/sheet_site.html:67
+#: templates/ishtar/sheet_site.html:65
msgid "Operations"
msgstr ""
-#: models.py:55 models.py:75 models.py:88 models.py:2470
+#: models.py:56 models.py:76 models.py:94 models.py:2620
msgid "Order"
msgstr ""
-#: models.py:57 models.py:1993
+#: models.py:58 models.py:2143
msgid "End date"
msgstr ""
-#: models.py:58
+#: models.py:59
msgid "Parent period"
msgstr ""
-#: models.py:62
+#: models.py:63
msgid "Type Period"
msgstr ""
-#: models.py:63
+#: models.py:64
msgid "Types Period"
msgstr ""
-#: models.py:78
+#: models.py:79
msgid "Type of report state"
msgstr ""
-#: models.py:79
+#: models.py:80
msgid "Types of report state"
msgstr ""
-#: models.py:91
+#: models.py:97
msgid "Type of record quality"
msgstr ""
-#: models.py:92
+#: models.py:98
msgid "Types of record quality"
msgstr ""
-#: models.py:126
+#: models.py:135
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models.py:130 models.py:485
+#: models.py:139 models.py:569
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models.py:134 models.py:517 tests.py:1594
+#: models.py:143 models.py:601 tests.py:1607
msgctxt "key for text search"
msgid "period"
msgstr ""
-#: models.py:138 models.py:513 tests.py:1625
+#: models.py:147 models.py:597 tests.py:1638
msgctxt "key for text search"
msgid "remain"
msgstr ""
-#: models.py:142 models.py:473 tests.py:1602
+#: models.py:151 models.py:557 tests.py:1615
msgctxt "key for text search"
msgid "town"
msgstr ""
-#: models.py:146 models.py:541
+#: models.py:155 models.py:625
msgctxt "key for text search"
msgid "comment"
msgstr ""
-#: models.py:150
+#: models.py:159
msgctxt "key for text search"
msgid "locality-ngi"
msgstr ""
-#: models.py:154
+#: models.py:163
msgctxt "key for text search"
msgid "locality-cadastral"
msgstr ""
-#: models.py:158
+#: models.py:167
msgctxt "key for text search"
msgid "shipwreck-name"
msgstr ""
-#: models.py:163
+#: models.py:172
msgctxt "key for text search"
msgid "oceanographic-service-localisation"
msgstr ""
-#: models.py:167
+#: models.py:176
msgctxt "key for text search"
msgid "shipwreck-code"
msgstr ""
-#: models.py:171
+#: models.py:180
msgctxt "key for text search"
msgid "sinking-date"
msgstr ""
-#: models.py:175
+#: models.py:184
msgctxt "key for text search"
msgid "discovery-area"
msgstr ""
-#: models.py:193
-msgid "Top operation"
+#: models.py:188 models.py:203
+msgctxt "key for text search"
+msgid "operation"
+msgstr ""
+
+#: models.py:192
+msgctxt "key for text search"
+msgid "top-operation"
msgstr ""
-#: models.py:216 models.py:706 models.py:1781
+#: models.py:251 models.py:804 models.py:1924
msgid "Cached name"
msgstr ""
-#: models.py:274
+#: models.py:280
+msgid "SITE"
+msgstr ""
+
+#: models.py:345
msgid "Unknown"
msgstr ""
-#: models.py:277
+#: models.py:348
msgid "Virtual operation of site: {}"
msgstr ""
-#: models.py:409
+#: models.py:488
msgid "Associated file (label)"
msgstr ""
-#: models.py:410
+#: models.py:489
msgid "Operator name"
msgstr ""
-#: models.py:411
+#: models.py:490
msgid "Scientist (full name)"
msgstr ""
-#: models.py:412
+#: models.py:491
msgid "Associated file (external ID)"
msgstr ""
-#: models.py:413
+#: models.py:492
msgid "Scientist (title)"
msgstr ""
-#: models.py:414
+#: models.py:493
msgid "Scientist (surname)"
msgstr ""
-#: models.py:415
+#: models.py:494
msgid "Scientist (name)"
msgstr ""
-#: models.py:416
+#: models.py:495
msgid "Scientist - Organization (name)"
msgstr ""
-#: models.py:417
+#: models.py:496
msgid "In charge (title)"
msgstr ""
-#: models.py:418
+#: models.py:497
msgid "In charge (surname)"
msgstr ""
-#: models.py:419
+#: models.py:498
msgid "In charge (name)"
msgstr ""
-#: models.py:420
+#: models.py:499
msgid "In charge - Organization (name)"
msgstr ""
-#: models.py:425
+#: models.py:504
msgid "Archaeological sites (reference)"
msgstr ""
-#: models.py:461 models.py:1376 tests.py:1597
+#: models.py:545 models.py:1502 tests.py:1610
msgctxt "key for text search"
msgid "year"
msgstr ""
-#: models.py:465
+#: models.py:549
msgctxt "key for text search"
msgid "operation-code"
msgstr ""
-#: models.py:469 models.py:1388
+#: models.py:553 models.py:1514
msgctxt "key for text search"
msgid "patriarche"
msgstr ""
-#: models.py:477 models.py:1408
+#: models.py:561 models.py:1534
msgctxt "key for text search"
msgid "parcel"
msgstr ""
-#: models.py:481
+#: models.py:565
msgctxt "key for text search"
msgid "department"
msgstr ""
-#: models.py:489
+#: models.py:573
msgctxt "key for text search"
msgid "address"
msgstr ""
-#: models.py:493 models.py:1392
+#: models.py:577 models.py:1518
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models.py:497 tests.py:1630
+#: models.py:581 tests.py:1643
msgctxt "key for text search"
msgid "is-open"
msgstr ""
-#: models.py:501
+#: models.py:585
msgctxt "key for text search"
msgid "in-charge"
msgstr ""
-#: models.py:505
+#: models.py:589
msgctxt "key for text search"
msgid "scientist"
msgstr ""
-#: models.py:509
+#: models.py:593
msgctxt "key for text search"
msgid "operator"
msgstr ""
-#: models.py:521
+#: models.py:605
msgctxt "key for text search"
msgid "start-before"
msgstr ""
-#: models.py:525
+#: models.py:609
msgctxt "key for text search"
msgid "start-after"
msgstr ""
-#: models.py:529
+#: models.py:613
msgctxt "key for text search"
msgid "end-before"
msgstr ""
-#: models.py:533
+#: models.py:617
msgctxt "key for text search"
msgid "end-after"
msgstr ""
-#: models.py:537
+#: models.py:621
msgctxt "key for text search"
msgid "relation-types"
msgstr ""
-#: models.py:545
+#: models.py:629
msgctxt "key for text search"
msgid "abstract"
msgstr ""
-#: models.py:550
+#: models.py:634
msgctxt "key for text search"
msgid "scientific-documentation-comment"
msgstr ""
-#: models.py:554
+#: models.py:638
msgctxt "key for text search"
msgid "record-quality"
msgstr ""
-#: models.py:559
+#: models.py:643
msgctxt "key for text search"
msgid "report-processing"
msgstr ""
-#: models.py:564
-#| msgid "Virtual operation"
+#: models.py:648
msgctxt "key for text search"
msgid "virtual-operation"
msgstr ""
-#: models.py:569
+#: models.py:653 models.py:696
msgctxt "key for text search"
msgid "site"
msgstr ""
-#: models.py:573 models.py:1426
+#: models.py:657 models.py:1552
msgctxt "key for text search"
msgid "created-by"
msgstr ""
-#: models.py:577 models.py:1430
+#: models.py:661 models.py:1556
msgctxt "key for text search"
msgid "modified-by"
msgstr ""
-#: models.py:581
+#: models.py:665
msgctxt "key for text search"
msgid "documentation-received"
msgstr ""
-#: models.py:585
+#: models.py:669
msgctxt "key for text search"
msgid "documentation-deadline-before"
msgstr ""
-#: models.py:589
+#: models.py:673
msgctxt "key for text search"
msgid "documentation-deadline-after"
msgstr ""
-#: models.py:593
+#: models.py:677
msgctxt "key for text search"
msgid "finds-received"
msgstr ""
-#: models.py:597
+#: models.py:681
msgctxt "key for text search"
msgid "finds-deadline-before"
msgstr ""
-#: models.py:601
+#: models.py:685
msgctxt "key for text search"
msgid "finds-deadline-after"
msgstr ""
-#: models.py:615 templates/ishtar/sheet_operation.html:57
+#: models.py:698
+msgctxt "key for text search"
+msgid "file"
+msgstr ""
+
+#: models.py:713 templates/ishtar/sheet_operation.html:60
msgid "Closing date"
msgstr ""
-#: models.py:622
+#: models.py:720
msgid "In charge scientist"
msgstr ""
-#: models.py:641 models.py:1763
+#: models.py:739 models.py:1906
msgid "File"
msgstr ""
-#: models.py:645
+#: models.py:743
msgid "Surface (m2)"
msgstr ""
-#: models.py:714
+#: models.py:812
msgid ""
"If checked, it means that this operation have not been officialy registered."
msgstr ""
-#: models.py:790
+#: models.py:891
msgid "OPE"
msgstr ""
-#: models.py:869
+#: models.py:988
msgid "Intercommunal"
msgstr ""
-#: models.py:905
+#: models.py:1024
msgid "Code patriarche"
msgstr ""
-#: models.py:945
+#: models.py:1066
msgid "This operation code already exists for this year"
msgstr ""
-#: models.py:990
+#: models.py:1111
msgid "Number of parcels"
msgstr ""
-#: models.py:1000
+#: models.py:1121
msgid "Number of administrative acts"
msgstr ""
-#: models.py:1008
+#: models.py:1129
msgid "Number of indexed administrative acts"
msgstr ""
-#: models.py:1016
+#: models.py:1137
msgid "Number of context records"
msgstr ""
-#: models.py:1052
+#: models.py:1173
msgid "Number of finds"
msgstr ""
-#: models.py:1097
+#: models.py:1218
msgid "No type"
msgstr ""
-#: models.py:1128
+#: models.py:1249
msgid "Number of sources"
msgstr ""
-#: models.py:1166 templates/ishtar/dashboards/dashboard_operation.html:309
+#: models.py:1287 templates/ishtar/dashboards/dashboard_operation.html:309
#: templates/ishtar/dashboards/dashboard_operation.html:575
#: templates/ishtar/dashboards/dashboard_operation.html:611
msgid "Mean"
msgstr ""
-#: models.py:1228
+#: models.py:1349
msgid "Operation relation type"
msgstr ""
-#: models.py:1229
+#: models.py:1350
msgid "Operation relation types"
msgstr ""
-#: models.py:1242
+#: models.py:1363
msgid "Operation record relation"
msgstr ""
-#: models.py:1243
+#: models.py:1364
msgid "Operation record relations"
msgstr ""
-#: models.py:1285 models.py:1557
+#: models.py:1406 models.py:1686
msgid "Treatment request"
msgstr ""
-#: models.py:1286 models.py:1562
+#: models.py:1407 models.py:1691
msgid "Treatment"
msgstr ""
-#: models.py:1288
+#: models.py:1409
msgid "Intended to"
msgstr ""
-#: models.py:1290
+#: models.py:1411
msgid "Code"
msgstr ""
-#: models.py:1293
+#: models.py:1414
msgid "Associated template"
msgstr ""
-#: models.py:1294
+#: models.py:1415
msgid "Indexed"
msgstr ""
-#: models.py:1298
+#: models.py:1419
msgid "Act types"
msgstr ""
-#: models.py:1366 models.py:1603
+#: models.py:1489 models.py:1732
#: templates/ishtar/blocks/window_tables/administrativacts.html:6
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:6
msgid "Ref."
msgstr ""
-#: models.py:1380
+#: models.py:1506
msgctxt "key for text search"
msgid "index"
msgstr ""
-#: models.py:1384
+#: models.py:1510
msgctxt "key for text search"
msgid "other-ref"
msgstr ""
-#: models.py:1396
+#: models.py:1522
msgctxt "key for text search"
msgid "indexed"
msgstr ""
-#: models.py:1400
+#: models.py:1526
msgctxt "key for text search"
msgid "operation-town"
msgstr ""
-#: models.py:1404
+#: models.py:1530
msgctxt "key for text search"
msgid "file-town"
msgstr ""
-#: models.py:1414
+#: models.py:1540
msgctxt "key for text search"
msgid "operation-department"
msgstr ""
-#: models.py:1418
+#: models.py:1544
msgctxt "key for text search"
msgid "file-department"
msgstr ""
-#: models.py:1422
+#: models.py:1548
msgctxt "key for text search"
msgid "object"
msgstr ""
-#: models.py:1434
+#: models.py:1560
msgctxt "key for text search"
msgid "signature-before"
msgstr ""
-#: models.py:1438
+#: models.py:1564
msgctxt "key for text search"
msgid "signature-after"
msgstr ""
-#: models.py:1442
+#: models.py:1568
msgctxt "key for text search"
msgid "file-name"
msgstr ""
-#: models.py:1446
+#: models.py:1572
msgctxt "key for text search"
msgid "general-contractor"
msgstr ""
-#: models.py:1451
+#: models.py:1577
msgctxt "key for text search"
msgid "general-contractor-organization"
msgstr ""
-#: models.py:1456
+#: models.py:1582
msgctxt "key for text search"
msgid "file-reference"
msgstr ""
-#: models.py:1460
+#: models.py:1586
msgctxt "key for text search"
msgid "file-year"
msgstr ""
-#: models.py:1464
+#: models.py:1590
msgctxt "key for text search"
msgid "file-other-reference"
msgstr ""
-#: models.py:1468
+#: models.py:1594
msgctxt "key for text search"
msgid "file-in-charge"
msgstr ""
-#: models.py:1472
+#: models.py:1598
msgctxt "key for text search"
msgid "file-permit-reference"
msgstr ""
-#: models.py:1476
+#: models.py:1602
msgctxt "key for text search"
msgid "treatment-name"
msgstr ""
-#: models.py:1480
+#: models.py:1606
msgctxt "key for text search"
msgid "treatment-reference"
msgstr ""
-#: models.py:1484
+#: models.py:1610
msgctxt "key for text search"
msgid "treatment-year"
msgstr ""
-#: models.py:1488
+#: models.py:1614
msgctxt "key for text search"
msgid "treatment-index"
msgstr ""
-#: models.py:1492
+#: models.py:1618
msgctxt "key for text search"
msgid "treatment-type"
msgstr ""
-#: models.py:1496
+#: models.py:1622
msgctxt "key for text search"
msgid "treatment-file-name"
msgstr ""
-#: models.py:1500
+#: models.py:1626
msgctxt "key for text search"
msgid "treatment-file-reference"
msgstr ""
-#: models.py:1504
+#: models.py:1630
msgctxt "key for text search"
msgid "treatment-file-year"
msgstr ""
-#: models.py:1508
+#: models.py:1634
msgctxt "key for text search"
msgid "treatment-file-index"
msgstr ""
-#: models.py:1512
+#: models.py:1638
msgctxt "key for text search"
msgid "treatment-file-type"
msgstr ""
-#: models.py:1530
+#: models.py:1659
msgid "Person in charge of the operation"
msgstr ""
-#: models.py:1536
+#: models.py:1665
msgid "Archaeological preventive operator"
msgstr ""
-#: models.py:1544
+#: models.py:1673
msgid "Signatory"
msgstr ""
-#: models.py:1572
+#: models.py:1701
msgid "Departments"
msgstr ""
-#: models.py:1573
+#: models.py:1702
msgid "Cached values get from associated departments"
msgstr ""
-#: models.py:1576
+#: models.py:1705
msgid "Cached values get from associated towns"
msgstr ""
-#: models.py:1583 templates/ishtar/sheet_operation.html:187
-#: templates/ishtar/sheet_operation.html:229
+#: models.py:1712 templates/ishtar/sheet_operation.html:202
+#: templates/ishtar/sheet_operation.html:244
msgid "Administrative acts"
msgstr ""
-#: models.py:1706
+#: models.py:1835
msgid "This index already exists for this year"
msgstr ""
-#: models.py:1776
+#: models.py:1919
msgid "External ID"
msgstr ""
-#: models.py:1779
+#: models.py:1922
msgid "External ID is set automatically"
msgstr ""
-#: models.py:1780
+#: models.py:1923
msgid "Address - Locality"
msgstr ""
-#: models.py:1988
+#: models.py:2138
msgid "Owner"
msgstr ""
-#: models.py:1996
+#: models.py:2146
msgid "Parcel owner"
msgstr ""
-#: models.py:1997
+#: models.py:2147
msgid "Parcel owners"
msgstr ""
-#: models.py:2031
+#: models.py:2181
msgid "Recorded"
msgstr ""
-#: models.py:2032
+#: models.py:2182
msgid "Effective"
msgstr ""
-#: models.py:2033
+#: models.py:2183
msgid "Active"
msgstr ""
-#: models.py:2034
+#: models.py:2184
msgid "Field completed"
msgstr ""
-#: models.py:2035
+#: models.py:2185
msgid "Associated report"
msgstr ""
-#: models.py:2036
+#: models.py:2186
msgid "Closed"
msgstr ""
-#: models.py:2037
+#: models.py:2187
msgid "Documented and closed"
msgstr ""
-#: models.py:2471
+#: models.py:2621
msgid "Is preventive"
msgstr ""
-#: models.py:2474
+#: models.py:2624
msgid "Operation type old"
msgstr ""
-#: models.py:2475
+#: models.py:2625
msgid "Operation types old"
msgstr ""
#: templates/ishtar/blocks/window_tables/administrativacts.html:7
-#: templates/ishtar/sheet_operation.html:248
-#: templates/ishtar/sheet_operation.html:312
+#: templates/ishtar/sheet_operation.html:263
+#: templates/ishtar/sheet_operation.html:327
msgid "Type"
msgstr ""
@@ -1452,12 +1470,12 @@ msgstr ""
#: templates/ishtar/dashboards/dashboard_operation.html:432
#: templates/ishtar/dashboards/dashboard_operation.html:463
#: templates/ishtar/dashboards/dashboard_operation.html:687
-#: templates/ishtar/sheet_operation.html:248
-#: templates/ishtar/sheet_operation.html:258
-#: templates/ishtar/sheet_operation.html:275
-#: templates/ishtar/sheet_operation.html:285
-#: templates/ishtar/sheet_operation.html:295
-#: templates/ishtar/sheet_operation.html:312
+#: templates/ishtar/sheet_operation.html:263
+#: templates/ishtar/sheet_operation.html:273
+#: templates/ishtar/sheet_operation.html:290
+#: templates/ishtar/sheet_operation.html:300
+#: templates/ishtar/sheet_operation.html:310
+#: templates/ishtar/sheet_operation.html:327
msgid "Number"
msgstr ""
@@ -1483,7 +1501,7 @@ msgstr ""
#: templates/ishtar/dashboards/dashboard_operation.html:479
#: templates/ishtar/dashboards/dashboard_operation.html:499
#: templates/ishtar/dashboards/dashboard_operation.html:623
-#: templates/ishtar/sheet_operation.html:49
+#: templates/ishtar/sheet_operation.html:52
msgid "State"
msgstr ""
@@ -1646,7 +1664,7 @@ msgid "area by organization by realisation year"
msgstr ""
#: templates/ishtar/dashboards/dashboard_operation.html:670
-#: templates/ishtar/sheet_operation.html:74
+#: templates/ishtar/sheet_operation.html:77
msgid "Cost"
msgstr ""
@@ -1659,107 +1677,111 @@ msgid "main towns by cost"
msgstr ""
#: templates/ishtar/sheet_administrativeact.html:40
-#: templates/ishtar/sheet_operation.html:66
+#: templates/ishtar/sheet_operation.html:69
msgid "Surface"
msgstr ""
-#: templates/ishtar/sheet_operation.html:29
+#: templates/ishtar/sheet_operation.html:30
msgid "Address"
msgstr ""
-#: templates/ishtar/sheet_operation.html:41
+#: templates/ishtar/sheet_operation.html:37
msgid "Begining date"
msgstr ""
-#: templates/ishtar/sheet_operation.html:51
+#: templates/ishtar/sheet_operation.html:54
msgid "Active file"
msgstr ""
-#: templates/ishtar/sheet_operation.html:52
+#: templates/ishtar/sheet_operation.html:55
msgid "Closed operation"
msgstr ""
-#: templates/ishtar/sheet_operation.html:59
+#: templates/ishtar/sheet_operation.html:62
msgid "by"
msgstr ""
-#: templates/ishtar/sheet_operation.html:82
+#: templates/ishtar/sheet_operation.html:85
msgid "Duration"
msgstr ""
-#: templates/ishtar/sheet_operation.html:84
+#: templates/ishtar/sheet_operation.html:87
msgid "days"
msgstr ""
-#: templates/ishtar/sheet_operation.html:123
+#: templates/ishtar/sheet_operation.html:129
+msgid "Sheet"
+msgstr ""
+
+#: templates/ishtar/sheet_operation.html:138
msgid "This operation is virtual."
msgstr ""
-#: templates/ishtar/sheet_operation.html:129
+#: templates/ishtar/sheet_operation.html:144
msgid "Patriarche OA code not yet recorded!"
msgstr ""
-#: templates/ishtar/sheet_operation.html:144
-#: templates/ishtar/sheet_site.html:47
+#: templates/ishtar/sheet_operation.html:159
+#: templates/ishtar/sheet_site.html:43
msgid "Localisation"
msgstr ""
-#: templates/ishtar/sheet_operation.html:183
+#: templates/ishtar/sheet_operation.html:198
msgid "Associated parcels"
msgstr ""
-#: templates/ishtar/sheet_operation.html:191
+#: templates/ishtar/sheet_operation.html:206
msgid "Document from this operation"
msgstr ""
-#: templates/ishtar/sheet_operation.html:197
-#: templates/ishtar/sheet_operation.html:240
+#: templates/ishtar/sheet_operation.html:212
+#: templates/ishtar/sheet_operation.html:255
msgid "Context records"
msgstr ""
-#: templates/ishtar/sheet_operation.html:202
+#: templates/ishtar/sheet_operation.html:217
msgid "Context record relations"
msgstr ""
-#: templates/ishtar/sheet_operation.html:207
+#: templates/ishtar/sheet_operation.html:222
msgid "Documents from associated context records"
msgstr ""
-#: templates/ishtar/sheet_operation.html:212
-#: templates/ishtar/sheet_operation.html:267
-#: templates/ishtar/sheet_site.html:72
+#: templates/ishtar/sheet_operation.html:227
+#: templates/ishtar/sheet_operation.html:282
+#: templates/ishtar/sheet_site.html:70
msgid "Finds"
msgstr ""
-#: templates/ishtar/sheet_operation.html:217
+#: templates/ishtar/sheet_operation.html:232
msgid "Documents from associated finds"
msgstr ""
-#: templates/ishtar/sheet_operation.html:222
+#: templates/ishtar/sheet_operation.html:237
msgid "Associated containers"
msgstr ""
-#: templates/ishtar/sheet_operation.html:226
+#: templates/ishtar/sheet_operation.html:241
msgid "Statistics"
msgstr ""
-#: templates/ishtar/sheet_operation.html:227
+#: templates/ishtar/sheet_operation.html:242
msgid "These numbers are updated hourly"
msgstr ""
-#: templates/ishtar/sheet_operation.html:275
+#: templates/ishtar/sheet_operation.html:290
msgid "Material type"
msgstr ""
-#: templates/ishtar/sheet_operation.html:285
+#: templates/ishtar/sheet_operation.html:300
msgid "Object type"
msgstr ""
-#: templates/ishtar/sheet_operation.html:304
+#: templates/ishtar/sheet_operation.html:319
msgid "Sources"
msgstr ""
-#: templates/ishtar/sheet_operation.html:322
+#: templates/ishtar/sheet_operation.html:337
msgid "Finds by context records"
msgstr ""
@@ -1780,42 +1802,48 @@ msgid ""
"The following error(s) has been encountered while parsing the source file:"
msgstr ""
-#: views.py:242
+#: views.py:244
msgid "New operation"
msgstr ""
-#: views.py:291
+#: views.py:293
msgid "Operation modification"
msgstr ""
-#: views.py:302
+#: views.py:304
msgid "You don't have sufficient permissions to do this action."
msgstr ""
-#: views.py:327
+#: views.py:329
msgid "Operation closing"
msgstr ""
-#: views.py:338
+#: views.py:340
msgid "Operation deletion"
msgstr ""
-#: views.py:403
+#: views.py:406
msgid "Site deletion"
msgstr ""
-#: views.py:422
+#: views.py:425
msgid "Operation: new administrative act"
msgstr ""
-#: views.py:432
+#: views.py:435
msgid "Operation: administrative act modification"
msgstr ""
-#: views.py:456
+#: views.py:459
msgid "Operation: administrative act deletion"
msgstr ""
+#: views.py:552
+msgid ""
+"Syntax error on the source template \"{}\" - contact your administrator and "
+"ask him to check the syntax of this document."
+msgstr ""
+
#: widgets.py:59
msgid "Add"
msgstr ""
diff --git a/archaeological_operations/migrations/0038_auto_20181017_1642.py b/archaeological_operations/migrations/0038_auto_20181017_1642.py
new file mode 100644
index 000000000..88a4e4e7f
--- /dev/null
+++ b/archaeological_operations/migrations/0038_auto_20181017_1642.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['AdministrativeAct', 'ArchaeologicalSite', 'Operation',
+ 'Parcel', 'ParcelOwner']
+ reinit_last_modified(
+ apps, 'archaeological_operations', models
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0037_auto_20180903_1015'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='administrativeact',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='archaeologicalsite',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicaladministrativeact',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalarchaeologicalsite',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicaloperation',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='operation',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='parcel',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='parcelowner',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/archaeological_operations/migrations/0039_auto_20181017_1854.py b/archaeological_operations/migrations/0039_auto_20181017_1854.py
new file mode 100644
index 000000000..da08743bc
--- /dev/null
+++ b/archaeological_operations/migrations/0039_auto_20181017_1854.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_operations', '0038_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='administrativeact',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='archaeologicalsite',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='historicaladministrativeact',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicalarchaeologicalsite',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicaloperation',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='operation',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='parcel',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='parcelowner',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ ]
diff --git a/archaeological_operations/models.py b/archaeological_operations/models.py
index a6b6daf71..56af40ba0 100644
--- a/archaeological_operations/models.py
+++ b/archaeological_operations/models.py
@@ -184,13 +184,30 @@ class ArchaeologicalSite(BaseHistorizedItem, OwnPerms, ValueGetter,
pgettext_lazy("key for text search", u"discovery-area"),
'discovery_area__iexact'
),
+ 'operation': (
+ pgettext_lazy("key for text search", u"operation"),
+ 'operations__cached_label__icontains'
+ ),
+ 'top_operation': (
+ pgettext_lazy("key for text search", u"top-operation"),
+ 'top_operation__cached_label__icontains'
+ ),
}
for v in ALT_NAMES.values():
for language_code, language_lbl in settings.LANGUAGES:
activate(language_code)
EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1]
deactivate()
- objects = SiteManager()
+
+ UP_MODEL_QUERY = {
+ "operation": (pgettext_lazy("key for text search", u"operation"),
+ 'cached_label'),
+ }
+ RELATIVE_SESSION_NAMES = [
+ ('operation', 'operations__pk'),
+ ]
+
+ # objects = SiteManager()
reference = models.CharField(_(u"Reference"), max_length=200, unique=True)
name = models.CharField(_(u"Name"), max_length=200,
@@ -258,6 +275,32 @@ class ArchaeologicalSite(BaseHistorizedItem, OwnPerms, ValueGetter,
self.save()
return self.cached_label
+ @property
+ def short_class_name(self):
+ return _(u"SITE")
+
+ @classmethod
+ def get_query_owns(cls, ishtaruser):
+ q = cls._construct_query_own(
+ 'operations__', Operation._get_query_owns_dicts(ishtaruser)
+ ) | cls._construct_query_own('', [
+ {'history_creator': ishtaruser.user_ptr},
+ ])
+ return q
+
+ @classmethod
+ def get_owns(cls, user, menu_filtr=None, limit=None, values=None,
+ get_short_menu_class=None):
+ replace_query = None
+ if menu_filtr and 'operation' in menu_filtr:
+ replace_query = Q(operations=menu_filtr['operation'])
+
+ owns = super(ArchaeologicalSite, cls).get_owns(
+ user, replace_query=replace_query,
+ limit=limit, values=values,
+ get_short_menu_class=get_short_menu_class)
+ return cls._return_get_owns(owns, values, get_short_menu_class)
+
def _generate_cached_label(self):
name = self.reference
if self.name:
@@ -409,7 +452,6 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
'excavation_end_date__gte', 'documentation_deadline__lte',
'documentation_deadline__gte', 'finds_deadline__lte',
'finds_deadline__gte']
- RELATIVE_SESSION_NAMES = [('file', 'associated_file__pk')]
EXTRA_REQUEST_KEYS = {
'common_name': 'common_name__icontains',
'cached_label': 'cached_label__icontains',
@@ -650,6 +692,17 @@ class Operation(ClosedItem, BaseHistorizedItem, OwnPerms, ValueGetter,
EXTRA_REQUEST_KEYS[unicode(v[0])] = v[1]
deactivate()
+ UP_MODEL_QUERY = {
+ "site": (pgettext_lazy("key for text search", u"site"),
+ 'cached_label'),
+ "file": (pgettext_lazy("key for text search", u"file"),
+ 'cached_label'),
+ }
+ RELATIVE_SESSION_NAMES = [
+ ('file', 'associated_file__pk'),
+ ('site', 'archaeological_sites__pk'),
+ ]
+
POST_PROCESS_REQUEST = {
'towns__numero_insee__startswith': '_get_department_code',
}
diff --git a/archaeological_operations/templates/ishtar/sheet_operation.html b/archaeological_operations/templates/ishtar/sheet_operation.html
index 733b0b39a..4db5541e9 100644
--- a/archaeological_operations/templates/ishtar/sheet_operation.html
+++ b/archaeological_operations/templates/ishtar/sheet_operation.html
@@ -210,7 +210,7 @@
{% if item.context_record.count %}
{% trans "Context records" as cr_lab %}
-{% dynamic_table_document cr_lab 'context_records_for_ope' 'operation' item.pk 'TABLE_COLS_FOR_OPE' output %}
+{% dynamic_table_document cr_lab 'context_records_for_ope' 'operation_id' item.pk 'TABLE_COLS_FOR_OPE' output %}
{% endif %}
{% if item.context_record_relations_q.count %}
diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py
index ec1ca3d17..02635a05c 100644
--- a/archaeological_operations/tests.py
+++ b/archaeological_operations/tests.py
@@ -1218,8 +1218,8 @@ class OperationTest(TestCase, OperationInitTest):
content = content_file.read()
# check that all context records have been exported #4078
- for idx in range(15):
- self.assertIn('CR-{}'.format(idx), content)
+ # for idx in range(15):
+ # self.assertIn('CR-{}'.format(idx), content)
def test_json(self):
operation = self.operations[0]
@@ -1540,10 +1540,10 @@ class OperationSearchTest(TestCase, OperationInitTest):
self.assertEqual(result['recordsTotal'], 3)
# query with parenthesis
- response = c.get(reverse('get-operation'),
- {'search_vector': '2010 & (fougere | filicophyta)'})
- result = json.loads(response.content)
- self.assertEqual(result['recordsTotal'], 2)
+ # response = c.get(reverse('get-operation'),
+ # {'search_vector': '2010 & (fougere | filicophyta)'})
+ # result = json.loads(response.content)
+ # self.assertEqual(result['recordsTotal'], 2)
# query with mistmatch parenthesis
response = c.get(reverse('get-operation'),
diff --git a/archaeological_operations/urls.py b/archaeological_operations/urls.py
index d4fcd578a..fe2480940 100644
--- a/archaeological_operations/urls.py
+++ b/archaeological_operations/urls.py
@@ -132,6 +132,9 @@ urlpatterns = [
views.get_site, name='get-site'),
url(r'get-site-full/(?P<type>.+)?$',
views.get_site, name='get-site-full', kwargs={'full': True}),
+ url(r'get-site-shortcut/(?P<type>.+)?$',
+ views.get_site, name='get-site-shortcut',
+ kwargs={'full': 'shortcut'}),
url(r'revert-site/(?P<pk>.+)/(?P<date>.+)$',
views.revert_site, name='revert-site'),
url(r'show-site(?:/(?P<pk>.+))?/(?P<type>.+)?$',
diff --git a/archaeological_warehouse/ishtar_menu.py b/archaeological_warehouse/ishtar_menu.py
index bcbfe881b..20544db2d 100644
--- a/archaeological_warehouse/ishtar_menu.py
+++ b/archaeological_warehouse/ishtar_menu.py
@@ -58,16 +58,20 @@ MENU_SECTIONS = [
childs=[
MenuItem('container_search', _(u"Search"),
model=models.Warehouse,
- access_controls=['change_warehouse',]),
+ access_controls=['view_container',
+ 'view_own_container']),
MenuItem('container_creation', _(u"Creation"),
model=models.Warehouse,
- access_controls=['change_warehouse',]),
+ access_controls=['add_container',
+ 'add_own_container']),
MenuItem('container_modification', _(u"Modification"),
model=models.Warehouse,
- access_controls=['change_warehouse',]),
+ access_controls=['change_container',
+ 'change_own_container']),
MenuItem('container_deletion', _(u"Deletion"),
model=models.Warehouse,
- access_controls=['change_warehouse',]),
+ access_controls=['change_container',
+ 'change_own_container']),
])
]))
]
diff --git a/archaeological_warehouse/locale/django.pot b/archaeological_warehouse/locale/django.pot
index f45ea6e23..139895395 100644
--- a/archaeological_warehouse/locale/django.pot
+++ b/archaeological_warehouse/locale/django.pot
@@ -9,16 +9,16 @@
msgid ""
msgstr ""
-#: forms.py:41 forms.py:113 ishtar_menu.py:40 models.py:88 models.py:230
+#: forms.py:41 forms.py:113 ishtar_menu.py:40 models.py:94 models.py:258
#: templates/ishtar/sheet_warehouse.html:4
msgid "Warehouse"
msgstr ""
-#: forms.py:50 forms.py:55 models.py:576
+#: forms.py:50 forms.py:55 models.py:622
msgid "Division"
msgstr ""
-#: forms.py:57 models.py:256
+#: forms.py:57 models.py:286
msgid "Order"
msgstr ""
@@ -26,7 +26,7 @@ msgstr ""
msgid "There are identical divisions."
msgstr ""
-#: forms.py:76 models.py:77
+#: forms.py:76 models.py:83
msgid "Divisions"
msgstr ""
@@ -38,15 +38,15 @@ msgstr ""
msgid "Full text search"
msgstr ""
-#: forms.py:88 forms.py:119 models.py:69 models.py:227
+#: forms.py:88 forms.py:119 models.py:75 models.py:255
msgid "Name"
msgstr ""
-#: forms.py:89 forms.py:121 models.py:38 models.py:71
+#: forms.py:89 forms.py:121 models.py:39 models.py:77
msgid "Warehouse type"
msgstr ""
-#: forms.py:101 views.py:97
+#: forms.py:101 views.py:108
msgid "Warehouse search"
msgstr ""
@@ -54,11 +54,11 @@ msgstr ""
msgid "Warehouse - 010 - General"
msgstr ""
-#: forms.py:124 models.py:74
+#: forms.py:124 models.py:80
msgid "Person in charge"
msgstr ""
-#: forms.py:130 forms.py:198 models.py:75 models.py:344
+#: forms.py:130 forms.py:198 models.py:81 models.py:381
msgid "Comment"
msgstr ""
@@ -94,7 +94,7 @@ msgstr ""
msgid "Would you like to delete this warehouse?"
msgstr ""
-#: forms.py:172 models.py:358 models.py:573
+#: forms.py:172 models.py:395 models.py:619
#: templates/ishtar/sheet_container.html:4
msgid "Container"
msgstr ""
@@ -103,23 +103,23 @@ msgstr ""
msgid "Container - 010 - General"
msgstr ""
-#: forms.py:179 forms.py:260 models.py:271
+#: forms.py:179 forms.py:261 models.py:301
msgid "Ref."
msgstr ""
-#: forms.py:180 models.py:352
+#: forms.py:180 models.py:389
msgid "Old reference"
msgstr ""
-#: forms.py:182 forms.py:259 models.py:274 models.py:342
+#: forms.py:182 forms.py:260 models.py:304 models.py:379
msgid "Container type"
msgstr ""
-#: forms.py:184 forms.py:257
+#: forms.py:184 forms.py:258
msgid "Current location (warehouse)"
msgstr ""
-#: forms.py:190 forms.py:258 models.py:339
+#: forms.py:190 forms.py:259 models.py:376
msgid "Responsible warehouse"
msgstr ""
@@ -135,43 +135,43 @@ msgstr ""
msgid "This ID already exists for this warehouse."
msgstr ""
-#: forms.py:271 forms.py:277 views.py:139
+#: forms.py:272 forms.py:278 views.py:150
msgid "Container search"
msgstr ""
-#: forms.py:273 forms.py:279
+#: forms.py:274 forms.py:280
msgid "You should select a container."
msgstr ""
-#: forms.py:274
+#: forms.py:275
msgid "Add a new container"
msgstr ""
-#: forms.py:284 ishtar_menu.py:36 views.py:92
+#: forms.py:285 ishtar_menu.py:36 views.py:103
msgid "Packaging"
msgstr ""
-#: forms.py:290
+#: forms.py:291
msgid "Packager"
msgstr ""
-#: forms.py:296
+#: forms.py:297
msgid "Date"
msgstr ""
-#: forms.py:300
+#: forms.py:301
msgid "Packaged finds"
msgstr ""
-#: forms.py:304
+#: forms.py:305
msgid "Container - 020 - Localisation"
msgstr ""
-#: forms.py:306 models.py:345
+#: forms.py:307 models.py:382
msgid "Localisation"
msgstr ""
-#: forms.py:330 forms.py:331
+#: forms.py:331 forms.py:332
msgid "Would you like to delete this container?"
msgstr ""
@@ -183,141 +183,141 @@ msgstr ""
msgid "Search"
msgstr ""
-#: ishtar_menu.py:47 ishtar_menu.py:62
+#: ishtar_menu.py:47 ishtar_menu.py:63
msgid "Creation"
msgstr ""
-#: ishtar_menu.py:50 ishtar_menu.py:65
+#: ishtar_menu.py:50 ishtar_menu.py:67
msgid "Modification"
msgstr ""
-#: ishtar_menu.py:53 ishtar_menu.py:68
+#: ishtar_menu.py:53 ishtar_menu.py:71
msgid "Deletion"
msgstr ""
-#: ishtar_menu.py:57 models.py:359 templates/ishtar/sheet_warehouse.html:37
-#: templates/ishtar/sheet_warehouse.html:68
+#: ishtar_menu.py:57 models.py:396 templates/ishtar/sheet_warehouse.html:42
+#: templates/ishtar/sheet_warehouse.html:87
msgid "Containers"
msgstr ""
-#: models.py:39
+#: models.py:40
msgid "Warehouse types"
msgstr ""
-#: models.py:58
+#: models.py:60
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models.py:62 models.py:323
+#: models.py:64 models.py:356
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models.py:81
+#: models.py:87
msgid "Documents"
msgstr ""
-#: models.py:83 models.py:353
+#: models.py:89 models.py:390
msgid "External ID"
msgstr ""
-#: models.py:85 models.py:355
+#: models.py:91 models.py:392
msgid "External ID is set automatically"
msgstr ""
-#: models.py:89
+#: models.py:95
msgid "Warehouses"
msgstr ""
-#: models.py:229
+#: models.py:257
msgid "Description"
msgstr ""
-#: models.py:234 models.py:235
+#: models.py:262 models.py:263
msgid "Collection"
msgstr ""
-#: models.py:244
+#: models.py:272
msgid "Warehouse division type"
msgstr ""
-#: models.py:245
+#: models.py:273
msgid "Warehouse division types"
msgstr ""
-#: models.py:267
+#: models.py:297
msgid "Length (mm)"
msgstr ""
-#: models.py:268
+#: models.py:298
msgid "Width (mm)"
msgstr ""
-#: models.py:269
+#: models.py:299
msgid "Height (mm)"
msgstr ""
-#: models.py:270
+#: models.py:300
msgid "Volume (l)"
msgstr ""
-#: models.py:275
+#: models.py:305
msgid "Container types"
msgstr ""
-#: models.py:306
+#: models.py:339
msgid "Location - index"
msgstr ""
-#: models.py:307
+#: models.py:340
msgid "Precise localisation"
msgstr ""
-#: models.py:308
+#: models.py:341
msgid "Type"
msgstr ""
-#: models.py:315
+#: models.py:348
msgctxt "key for text search"
msgid "location"
msgstr ""
-#: models.py:319
+#: models.py:352
msgctxt "key for text search"
msgid "responsible-warehouse"
msgstr ""
-#: models.py:327
+#: models.py:360
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models.py:336
+#: models.py:373
msgid "Location (warehouse)"
msgstr ""
-#: models.py:343
+#: models.py:380
msgid "Container ref."
msgstr ""
-#: models.py:347
+#: models.py:384
msgid "Cached location"
msgstr ""
-#: models.py:349
+#: models.py:386
msgid "Cached division"
msgstr ""
-#: models.py:577
+#: models.py:623
msgid "Reference"
msgstr ""
-#: models.py:580
+#: models.py:626
msgid "Container localisation"
msgstr ""
-#: models.py:581
+#: models.py:627
msgid "Container localisations"
msgstr ""
@@ -325,39 +325,44 @@ msgstr ""
msgid "Content"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:42
+#: templates/ishtar/sheet_warehouse.html:47
msgid "Attached containers"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:46
+#: templates/ishtar/sheet_warehouse.html:51
msgid "Statistics"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:47
+#: templates/ishtar/sheet_warehouse.html:52
msgid "These numbers are updated hourly"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:49
+#: templates/ishtar/sheet_warehouse.html:54
msgid "Finds"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:51
+#: templates/ishtar/sheet_warehouse.html:56
msgid "Number of attached finds"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:53
+#: templates/ishtar/sheet_warehouse.html:58
msgid "Number of hosted finds"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:58
+#: templates/ishtar/sheet_warehouse.html:63
msgid "Finds by location in the warehouse"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:70
+#: templates/ishtar/sheet_warehouse.html:71
+#: templates/ishtar/sheet_warehouse.html:102
+msgid "Total"
+msgstr ""
+
+#: templates/ishtar/sheet_warehouse.html:89
msgid "Number of containers"
msgstr ""
-#: templates/ishtar/sheet_warehouse.html:75
+#: templates/ishtar/sheet_warehouse.html:94
msgid "Containers by location in the warehouse"
msgstr ""
@@ -373,26 +378,26 @@ msgid ""
"change divisions."
msgstr ""
-#: views.py:109
+#: views.py:120
msgid "Warehouse creation"
msgstr ""
-#: views.py:118
+#: views.py:129
msgid "Warehouse modification"
msgstr ""
-#: views.py:134
+#: views.py:145
msgid "Warehouse deletion"
msgstr ""
-#: views.py:150
+#: views.py:161
msgid "Container creation"
msgstr ""
-#: views.py:159
+#: views.py:170
msgid "Container modification"
msgstr ""
-#: views.py:174
+#: views.py:185
msgid "Container deletion"
msgstr ""
diff --git a/archaeological_warehouse/migrations/0023_auto_20181017_1642.py b/archaeological_warehouse/migrations/0023_auto_20181017_1642.py
new file mode 100644
index 000000000..340b1911e
--- /dev/null
+++ b/archaeological_warehouse/migrations/0023_auto_20181017_1642.py
@@ -0,0 +1,41 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['Warehouse', 'Container', 'Collection']
+ reinit_last_modified(
+ apps, 'archaeological_warehouse', models
+ )
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_warehouse', '0022_container_cached_division'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='collection',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='container',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='warehouse',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/archaeological_warehouse/migrations/0024_auto_20181017_1854.py b/archaeological_warehouse/migrations/0024_auto_20181017_1854.py
new file mode 100644
index 000000000..e17a4474e
--- /dev/null
+++ b/archaeological_warehouse/migrations/0024_auto_20181017_1854.py
@@ -0,0 +1,30 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('archaeological_warehouse', '0023_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='collection',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='container',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='warehouse',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ ]
diff --git a/archaeological_warehouse/models.py b/archaeological_warehouse/models.py
index b1b6467ae..a40bfd321 100644
--- a/archaeological_warehouse/models.py
+++ b/archaeological_warehouse/models.py
@@ -30,7 +30,7 @@ from django.utils.translation import ugettext_lazy as _, pgettext_lazy, \
from ishtar_common.data_importer import post_importer_action
from ishtar_common.models import Document, GeneralType, get_external_id, \
LightHistorizedItem, OwnPerms, Address, Person, post_save_cache, \
- ImageModel, DashboardFormItem, ExternalIdManager
+ ImageModel, DashboardFormItem, ExternalIdManager, ShortMenuItem
from ishtar_common.utils import cached_label_changed
@@ -45,7 +45,8 @@ post_save.connect(post_save_cache, sender=WarehouseType)
post_delete.connect(post_save_cache, sender=WarehouseType)
-class Warehouse(Address, DashboardFormItem, OwnPerms):
+class Warehouse(Address, DashboardFormItem, OwnPerms,
+ ShortMenuItem):
SLUG = 'warehouse'
SHOW_URL = 'show-warehouse'
TABLE_COLS = ['name', 'warehouse_type']
@@ -124,7 +125,12 @@ class Warehouse(Address, DashboardFormItem, OwnPerms):
@classmethod
def get_query_owns(cls, ishtaruser):
- return Q(person_in_charge__ishtaruser=ishtaruser)
+ return cls._construct_query_own(
+ '', cls._get_query_owns_dicts(ishtaruser))
+
+ @classmethod
+ def _get_query_owns_dicts(cls, ishtaruser):
+ return [{'person_in_charge__ishtaruser': ishtaruser}]
@property
def number_of_finds(self):
@@ -334,7 +340,7 @@ class Container(LightHistorizedItem, ImageModel):
'cached_division': _(u"Precise localisation"),
'container_type__label': _(u"Type")
}
- CACHED_LABELS = ['cached_label', 'cached_location', 'cached_division']
+ CACHED_LABELS = ['cached_division', 'cached_label', 'cached_location', ]
# alternative names of fields for searches
ALT_NAMES = {
@@ -399,8 +405,7 @@ class Container(LightHistorizedItem, ImageModel):
)
def __unicode__(self):
- lbl = u"{} ({})".format(self.reference, self.container_type)
- return lbl
+ return self.cached_label
def natural_key(self):
return (self.external_id, )
@@ -444,7 +449,10 @@ class Container(LightHistorizedItem, ImageModel):
@property
def precise_location(self):
- return self.location.name + u" - " + (self.cached_division or u"")
+ location = self.location.name
+ if self.cached_division:
+ location += u" " + self.cached_division
+ return location
def get_localisations(self):
"""
diff --git a/archaeological_warehouse/urls.py b/archaeological_warehouse/urls.py
index 26fe4698e..fa895b7c4 100644
--- a/archaeological_warehouse/urls.py
+++ b/archaeological_warehouse/urls.py
@@ -43,6 +43,9 @@ urlpatterns = [
name='get-container'),
url(r'get-warehouse/(?P<type>.+)?$', views.get_warehouse,
name='get-warehouse'),
+ url(r'get-warehouse-shortcut/(?P<type>.+)?$',
+ views.get_warehouse, name='get-warehouse-shortcut',
+ kwargs={'full': 'shortcut'}),
url(r'autocomplete-container/?$',
views.autocomplete_container, name='autocomplete-container'),
url(r'^show-container(?:/(?P<pk>.+))?/(?P<type>.+)?$', views.show_container,
@@ -65,19 +68,19 @@ urlpatterns = [
views.warehouse_modify, name='warehouse_modify'),
url(r'^container_search/(?P<step>.+)?$',
- check_rights(['view_container'])(
+ check_rights(['view_container', 'view_own_container'])(
views.container_search_wizard),
name='container_search'),
url(r'^container_creation/(?P<step>.+)?$',
- check_rights(['change_container'])(
+ check_rights(['add_container', 'add_own_container'])(
views.container_creation_wizard),
name='container_creation'),
url(r'^container_modification/(?P<step>.+)?$',
- check_rights(['change_container'])(
+ check_rights(['change_container', 'change_own_container'])(
views.container_modification_wizard),
name='container_modification'),
url(r'^container_deletion/(?P<step>.+)?$',
- check_rights(['change_container'])(
+ check_rights(['change_container', 'change_own_container'])(
views.container_deletion_wizard),
name='container_deletion'),
url(r'container-modify/(?P<pk>.+)/$',
diff --git a/archaeological_warehouse/views.py b/archaeological_warehouse/views.py
index a1b1ffbe2..a867192ab 100644
--- a/archaeological_warehouse/views.py
+++ b/archaeological_warehouse/views.py
@@ -68,19 +68,31 @@ def autocomplete_container(request):
return HttpResponse(content_type='text/plain')
if not request.GET.get('term'):
return HttpResponse(content_type='text/plain')
- q = request.GET.get('term')
+ term = request.GET.get('term')
+ limit = 15
query = Q()
- for q in q.split(' '):
- extra = Q(container_type__label__icontains=q) | \
- Q(container_type__reference__icontains=q) | \
- Q(reference__icontains=q) | \
- Q(location__name=q) | \
- Q(location__town=q)
+ for q in term.split(' '):
+ extra = Q(reference__iexact=q)
query = query & extra
- limit = 15
- containers = models.Container.objects.filter(query)[:limit]
- data = json.dumps([{'id': container.pk, 'value': unicode(container)}
- for container in containers])
+ containers = list(models.Container.objects.filter(
+ query).values('id', 'cached_label')[:limit])
+ limit = 15 - len(containers)
+ if limit > 0:
+ query = Q()
+ for q in term.split(' '):
+ extra = Q(container_type__label__icontains=q) | \
+ Q(container_type__reference__icontains=q) | \
+ Q(reference__icontains=q) | \
+ Q(location__name=q) | \
+ Q(location__town=q)
+ query = query & extra
+ containers += list(
+ models.Container.objects.filter(query).exclude(
+ pk__in=[c['id'] for c in containers]
+ ).values('id', 'cached_label')[:limit])
+ data = json.dumps(
+ [{'id': container['id'], 'value': container['cached_label']}
+ for container in containers])
return HttpResponse(data, content_type='text/plain')
warehouse_packaging_wizard = PackagingWizard.as_view([
diff --git a/bootstrap_datepicker/widgets.py b/bootstrap_datepicker/widgets.py
index 9416ac16b..338319311 100644
--- a/bootstrap_datepicker/widgets.py
+++ b/bootstrap_datepicker/widgets.py
@@ -159,8 +159,8 @@ class DatePicker(DateTimeInput):
html = self.html_template % dict(div_attrs=flatatt(div_attrs),
input_attrs=flatatt(input_attrs),
icon_attrs=flatatt(icon_attrs))
- js = self.js_template % dict(picker_id=picker_id,
- options=json_dumps(self.options or {}))
+ js = self.js_template % dict(
+ picker_id=picker_id, options=json_dumps(self.options or {}))
return mark_safe(force_text(html + js))
diff --git a/docs/fr/source/media-src/graphique_structure_ishtar.dot b/docs/fr/source/media-src/graphique_structure_ishtar.dot
index de319dbff..dcdca0b73 100644
--- a/docs/fr/source/media-src/graphique_structure_ishtar.dot
+++ b/docs/fr/source/media-src/graphique_structure_ishtar.dot
@@ -26,11 +26,13 @@ digraph structure_Ishtar {
DemandeTraitement -> Document;
/* liaisons entre concepts */
+ OA -> OA;
OA -> Parcelle [arrowhead=none];
Parcelle -> UE -> MobOrigine -> Mobilier -> Contenant -> Depot;
OA -> UE;
OA -> EA [dir=both];
UE -> EA;
+ UE -> UE;
Mobilier -> Traitement;
DemandeTraitement -> Traitement;
Traitement -> Mobilier;
diff --git a/drassm_app b/drassm_app
new file mode 160000
+Subproject afd2824264664d7bfecaa3702f495b0fe176fa4
diff --git a/example_project/media/upload/templates/document_reference.odt b/example_project/media/upload/templates/document_reference.odt
index acda588fb..ffd697841 100755..100644
--- a/example_project/media/upload/templates/document_reference.odt
+++ b/example_project/media/upload/templates/document_reference.odt
Binary files differ
diff --git a/install/ishtar-cron-daily b/install/ishtar-cron-daily
new file mode 100644
index 000000000..5629a7071
--- /dev/null
+++ b/install/ishtar-cron-daily
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+ISHTAR_PATH=#ISHTAR_PATH#
+WWW_USER=www-data
+WWW_GROUP=www-data
+
+find $ISHTAR_PATH -type d -name "media" -exec chown -R $WWW_USER:$WWW_GROUP {} \;
+find $ISHTAR_PATH -type d -name "CACHE" -exec chown -R $WWW_USER:$WWW_GROUP {} \;
diff --git a/install/ishtar-install b/install/ishtar-install
index a08407622..49920fc66 100755
--- a/install/ishtar-install
+++ b/install/ishtar-install
@@ -294,6 +294,15 @@ EOF
exit 1
fi
+ echo ""
+ cecho y "Install cron script"
+ echo ""
+
+ sed -s "s|#ISHTAR_PATH#|$full_install_path|g;" \
+ "install/ishtar-cron-daily" > \
+ "/etc/cron.daily/ishtar"
+ chmod u+x "/etc/cron.daily/ishtar"
+
echo "-------------------------------------------------------------------------------";
cecho y "Update debian packages cache";
echo "";
diff --git a/ishtar_common/backend.py b/ishtar_common/backend.py
index 261e4dc6f..d5e092fa5 100644
--- a/ishtar_common/backend.py
+++ b/ishtar_common/backend.py
@@ -55,10 +55,9 @@ class ObjectPermBackend(ModelBackend):
if obj is None:
model_name = perm.split('_')[-1].lower()
model = None
- for app in apps.get_apps():
- for modl in apps.get_models(app):
- if modl.__name__.lower() == model_name:
- model = modl
+ for modl in apps.get_models():
+ if modl.__name__.lower() == model_name:
+ model = modl
if not model:
return False
return not is_ownperm or model.has_item_of(ishtar_user)
diff --git a/ishtar_common/forms.py b/ishtar_common/forms.py
index 3dfcad09e..7fed8b1c2 100644
--- a/ishtar_common/forms.py
+++ b/ishtar_common/forms.py
@@ -26,6 +26,7 @@ import re
import types
from django import forms
+from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from django.core import validators
@@ -455,6 +456,8 @@ class IshtarForm(forms.Form):
if not getattr(profile, profile_key):
for field_key in self.PROFILE_FILTER[profile_key]:
self.fields.pop(field_key)
+ if getattr(self, 'confirm', False):
+ return
for field in self.TYPES:
self._init_type(field)
for k in self.fields:
@@ -510,6 +513,31 @@ class TableSelect(IshtarForm):
return self.fields.keys()
+class HistorySelect(CustomForm, TableSelect):
+ history_modifier = forms.IntegerField(
+ label=_(u"Last modified by"),
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-user'),
+ associated_model=User), required=False
+ )
+ modified_since = forms.DateField(
+ label=_(u"Modified since"), widget=DatePicker,
+ required=False)
+
+ def __init__(self, *args, **kwargs):
+ super(HistorySelect, self).__init__(*args, **kwargs)
+ field_order = self.fields.keys()
+ current_fields = ["history_modifier", "modified_since"]
+ fields = OrderedDict()
+ for k in field_order:
+ if k in current_fields:
+ continue
+ fields[k] = self.fields[k]
+ for k in current_fields:
+ fields[k] = self.fields[k]
+ self.fields = fields
+
+
def get_now():
format = formats.get_format('DATE_INPUT_FORMATS')[0]
value = datetime.datetime.now().strftime(format)
@@ -640,6 +668,80 @@ class ManageOldType(IshtarForm):
self.fields[field.key].help_text = field.get_help()
+class QAForm(CustomForm, ManageOldType):
+ MULTI = False
+ SINGLE_FIELDS = []
+ REPLACE_FIELDS = []
+
+ def __init__(self, *args, **kwargs):
+ self.items = kwargs.pop('items')
+ self.confirm = kwargs.pop('confirm')
+ super(QAForm, self).__init__(*args, **kwargs)
+ for k in self.fields.keys():
+ if self.MULTI and k in self.SINGLE_FIELDS:
+ self.fields.pop(k)
+ continue
+ if self.confirm:
+ if 'data' not in kwargs or not kwargs['data'].get(k, None):
+ self.fields.pop(k)
+ continue
+ if getattr(self.fields[k].widget, 'allow_multiple_selected',
+ None):
+ self.fields[k].widget = forms.MultipleHiddenInput()
+ else:
+ self.fields[k].widget = forms.HiddenInput()
+ if k in kwargs['data'] and kwargs['data'][k]:
+ if hasattr(self, "_get_" + k):
+ self.fields[k].rendered_value = getattr(
+ self, "_get_" + k)(kwargs['data'][k])
+ elif hasattr(self.fields[k], "choices"):
+ values = []
+ for v in kwargs['data'].getlist(k):
+ values.append(
+ dict(self.fields[k].choices)[int(v)])
+ self.fields[k].rendered_value = mark_safe(
+ u" ; ".join(values))
+ if k not in self.REPLACE_FIELDS:
+ self.fields[k].label = unicode(self.fields[k].label) + \
+ unicode(u" - append to existing")
+ else:
+ self.fields[k].label = unicode(self.fields[k].label) + \
+ unicode(u" - replace")
+
+ def _set_value(self, item, base_key):
+ value = self.cleaned_data[base_key]
+ if not value:
+ return
+ key = base_key[len("qa_"):]
+ field = item._meta.get_field(key)
+ if getattr(field, 'related_model', None):
+ if type(value) == list:
+ value = [field.related_model.objects.get(pk=v)
+ for v in value]
+ else:
+ value = field.related_model.objects.get(pk=value)
+ if getattr(field, 'many_to_many', None):
+ if type(value) not in (list, tuple):
+ value = [value]
+ for v in value:
+ getattr(item, key).add(v)
+ else:
+ if base_key not in self.REPLACE_FIELDS:
+ if getattr(item, key):
+ value = getattr(item, key) + u"\n" + value
+ setattr(item, key, value)
+
+ def save(self, items, user):
+ for item in items:
+ for base_key in self.cleaned_data:
+ if hasattr(self, '_set_' + base_key):
+ getattr(self, '_set_' + base_key)(item, user)
+ else:
+ self._set_value(item, base_key)
+ item.history_modifier = user
+ item.save()
+
+
class DocumentGenerationForm(forms.Form):
"""
Form to generate document by choosing the template
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py
index 9be147871..1da4ac35f 100644
--- a/ishtar_common/forms_common.py
+++ b/ishtar_common/forms_common.py
@@ -46,6 +46,10 @@ from forms import FinalForm, FormSet, reverse_lazy, name_validator, \
FormSetWithDeleteSwitches, IshtarForm, get_data_from_formset
from ishtar_common.utils import is_downloadable, clean_session_cache
+from archaeological_operations.models import Operation
+from archaeological_context_records.models import ContextRecord
+from archaeological_finds.models import Find
+
def get_town_field(label=_(u"Town"), required=True):
help_text = _(
@@ -1208,11 +1212,34 @@ class DocumentSelect(TableSelect):
additional_information = forms.CharField(
label=_(u"Additional informations"))
duplicate = forms.NullBooleanField(label=_(u"Has a duplicate"))
+ operation = forms.IntegerField(
+ label=_(u"Operation"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-operation'),
+ associated_model=Operation),
+ validators=[models.valid_id(Operation)])
+ context_record = forms.IntegerField(
+ label=_(u"Context record"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-contextrecord'),
+ associated_model=ContextRecord),
+ validators=[models.valid_id(ContextRecord)])
+ find = forms.IntegerField(
+ label=_(u"Find"), required=False,
+ widget=widgets.JQueryAutoComplete(
+ reverse_lazy('autocomplete-find'),
+ associated_model=Find),
+ validators=[models.valid_id(Find)])
TYPES = [
FieldType('source_type', models.SourceType),
]
+ PROFILE_FILTER = {
+ 'context_record': ['context_record'],
+ 'find': ['find'],
+ }
+
class DocumentFormSelection(forms.Form):
SEARCH_AND_SELECT = True
diff --git a/ishtar_common/locale/django.pot b/ishtar_common/locale/django.pot
index 761c7d2b9..ef5a6610d 100644
--- a/ishtar_common/locale/django.pot
+++ b/ishtar_common/locale/django.pot
@@ -22,115 +22,116 @@ msgstr ""
msgid "Related item"
msgstr ""
-#: admin.py:73
+#: admin.py:74
msgid "CSV file"
msgstr ""
-#: admin.py:74
+#: admin.py:75
msgid "Only unicode encoding is managed - convert your file first"
msgstr ""
-#: admin.py:98
+#: admin.py:99
msgid "Export selected as CSV file"
msgstr ""
-#: admin.py:206 models.py:1588 templates/navbar.html:31
+#: admin.py:207 models.py:1686 templates/navbar.html:31
msgid "Profile"
msgstr ""
-#: admin.py:207 forms_common.py:778 forms_common.py:798 forms_common.py:799
-#: models.py:2783
+#: admin.py:208 forms_common.py:782 forms_common.py:801 forms_common.py:802
+#: models.py:3039
msgid "Profiles"
msgstr ""
-#: admin.py:229 admin.py:248 models.py:801 models.py:3724
-msgid "Parent"
+#: admin.py:293
+#| msgid "The CSV file should at least have a slug/txt_idx column"
+msgid "The CSV file should at least have a {} column"
msgstr ""
-#: admin.py:236
-msgid "Center"
+#: admin.py:360
+#, python-format
+msgid "%d item(s) created."
msgstr ""
-#: admin.py:238 models.py:3604
-msgid "Limit"
+#: admin.py:364
+#, python-format
+msgid "%d item(s) updated."
msgstr ""
-#: admin.py:241 models.py:3614
-msgid "Town children"
+#: admin.py:368
+msgid "These parents are missing: {}"
msgstr ""
-#: admin.py:249
-msgid "Parents"
+#: admin.py:386 admin.py:405 models.py:883 models.py:4138
+msgid "Parent"
msgstr ""
-#: admin.py:397
-msgid "The CSV file should at least have a slug/txt_idx column"
+#: admin.py:393
+msgid "Center"
msgstr ""
-#: admin.py:454
-#, python-format
-msgid "%d item(s) created."
+#: admin.py:395 models.py:4000
+msgid "Limit"
msgstr ""
-#: admin.py:458
-#, python-format
-msgid "%d item(s) updated."
+#: admin.py:398 models.py:4010
+msgid "Town children"
msgstr ""
-#: admin.py:462
-msgid "These parents are missing: {}"
+#: admin.py:406
+msgid "Parents"
msgstr ""
-#: admin.py:559
+#: admin.py:623
msgid "{} importer type(s) duplicated: {}."
msgstr ""
-#: admin.py:570 admin.py:625
+#: admin.py:634 admin.py:689
msgid "Duplicate"
msgstr ""
-#: admin.py:614
+#: admin.py:678
msgid "{} importer column(s) duplicated: {}."
msgstr ""
-#: admin.py:639
+#: admin.py:703
msgid "{} importer column(s) right-shifted."
msgstr ""
-#: admin.py:650
+#: admin.py:714
msgid "Shift right"
msgstr ""
-#: admin.py:675
+#: admin.py:739
msgid "{} importer column(s) left-shifted."
msgstr ""
-#: admin.py:681
+#: admin.py:745
msgid "{} importer column(s) not left-shifted: no place available."
msgstr ""
-#: admin.py:693
+#: admin.py:757
msgid "Shift left"
msgstr ""
-#: admin.py:838
+#: admin.py:903
msgid "Display selected"
msgstr ""
-#: admin.py:839
+#: admin.py:904
msgid "Hide selected"
msgstr ""
-#: admin.py:865 models.py:1861
+#: admin.py:931 models.py:2080
msgid "Form"
msgstr ""
-#: admin.py:867 models.py:1886 models_imports.py:126
+#: admin.py:933 models.py:2105 models_imports.py:127
#: templates/ishtar/dashboards/dashboard_main.html:39
msgid "Users"
msgstr ""
-#: admin.py:887 models.py:1961
+#: admin.py:953 models.py:2180
msgid "Field"
msgstr ""
@@ -224,7 +225,7 @@ msgstr ""
msgid "Too many cols (%(user_col)d) when maximum is %(ref_col)d"
msgstr ""
-#: data_importer.py:730 views.py:1113
+#: data_importer.py:730 views.py:1159
msgid "No data provided"
msgstr ""
@@ -253,7 +254,7 @@ msgid ""
"source file."
msgstr ""
-#: data_importer.py:1236 views.py:1191 views.py:1201
+#: data_importer.py:1236 views.py:1237 views.py:1247
msgid "Not imported"
msgstr ""
@@ -314,45 +315,54 @@ msgstr ""
msgid "\"%(value)s\" not in %(values)s"
msgstr ""
-#: forms.py:79
+#: forms.py:80
msgid "Enter a valid name consisting of letters, spaces and hyphens."
msgstr ""
-#: forms.py:95 forms_common.py:805
+#: forms.py:96 forms_common.py:808 views.py:1950
msgid "Confirm"
msgstr ""
-#: forms.py:100
+#: forms.py:101
msgid "Are you sure you want to delete?"
msgstr ""
-#: forms.py:317
+#: forms.py:347
msgid "There are identical items."
msgstr ""
-#: forms.py:491 forms.py:492
+#: forms.py:518
+msgid "Last modified by"
+msgstr ""
+
+#: forms.py:524
+#| msgid "Modified"
+msgid "Modified since"
+msgstr ""
+
+#: forms.py:548 forms.py:549
msgid "Closing date"
msgstr ""
-#: forms.py:504 forms_common.py:1232
+#: forms.py:561 forms_common.py:1261
msgid "You should select an item."
msgstr ""
-#: forms.py:505
+#: forms.py:562
msgid "Add a new item"
msgstr ""
-#: forms.py:621 models.py:2215
+#: forms.py:752 models.py:2434
msgid "Template"
msgstr ""
-#: forms_common.py:50 forms_common.py:68 forms_common.py:313
-#: forms_common.py:552 models.py:2346 models.py:3621
+#: forms_common.py:54 forms_common.py:72 forms_common.py:317
+#: forms_common.py:556 models.py:2568 models.py:4017
#: templates/blocks/JQueryAdvancedTown.html:19
msgid "Town"
msgstr ""
-#: forms_common.py:52
+#: forms_common.py:56
msgid ""
"<p>Type name, department code of the town you would like to select. The "
"search is insensitive to case.</p>\n"
@@ -362,70 +372,70 @@ msgid ""
"french town Saint-Denis in the Seine-Saint-Denis department.</p>"
msgstr ""
-#: forms_common.py:77 forms_common.py:1253 ishtar_menu.py:48 models.py:2702
-#: models.py:2937 models.py:3047 models.py:3168
+#: forms_common.py:81 forms_common.py:1282 ishtar_menu.py:48 models.py:2952
+#: models.py:3201 models.py:3329 models.py:3492
#: templates/ishtar/sheet_person.html:4
msgid "Person"
msgstr ""
-#: forms_common.py:118
+#: forms_common.py:122
msgid "Associated images (web link to a zip file)"
msgstr ""
-#: forms_common.py:153
+#: forms_common.py:157
msgid ""
"This import type have no unicity type defined. Conservative import is not "
"possible."
msgstr ""
-#: forms_common.py:158
+#: forms_common.py:162
msgid "You put either a file or a download link for images but not both."
msgstr ""
-#: forms_common.py:169
+#: forms_common.py:173
msgid "Invalid link or no file is available for this link."
msgstr ""
-#: forms_common.py:199
+#: forms_common.py:203
msgid "Target"
msgstr ""
-#: forms_common.py:200
+#: forms_common.py:204
msgid "Remember"
msgstr ""
-#: forms_common.py:218
+#: forms_common.py:222
msgid "Set to NULL"
msgstr ""
-#: forms_common.py:225
+#: forms_common.py:229
msgid "this import only"
msgstr ""
-#: forms_common.py:226
+#: forms_common.py:230
msgid "me"
msgstr ""
-#: forms_common.py:232
+#: forms_common.py:236
msgid "the current group: {}"
msgstr ""
-#: forms_common.py:235
+#: forms_common.py:239
msgid "all users"
msgstr ""
-#: forms_common.py:301 forms_common.py:471 forms_common.py:605
-#: ishtar_menu.py:76 models.py:2542 models.py:2644
+#: forms_common.py:305 forms_common.py:475 forms_common.py:609
+#: ishtar_menu.py:76 models.py:2773 models.py:2890 models.py:3289
#: templates/ishtar/sheet_organization.html:4
msgid "Organization"
msgstr ""
-#: forms_common.py:304 forms_common.py:347 forms_common.py:466
-#: forms_common.py:522 forms_common.py:600 forms_common.py:787
-#: forms_common.py:820 models.py:974 models.py:997 models.py:1685
-#: models.py:1860 models.py:2211 models.py:2534 models.py:2686 models.py:2930
-#: models.py:3600 models.py:3833 models_imports.py:97 models_imports.py:122
-#: models_imports.py:431 models_imports.py:523 models_imports.py:812
+#: forms_common.py:308 forms_common.py:351 forms_common.py:470
+#: forms_common.py:526 forms_common.py:604 forms_common.py:790
+#: forms_common.py:823 models.py:1056 models.py:1080 models.py:1879
+#: models.py:2079 models.py:2430 models.py:2765 models.py:2936 models.py:3192
+#: models.py:3996 models.py:4259 models_imports.py:98 models_imports.py:123
+#: models_imports.py:445 models_imports.py:537 models_imports.py:827
#: templates/ishtar/import_step_by_step.html:102
#: templates/ishtar/import_step_by_step.html:270
#: templates/ishtar/import_table.html:27
@@ -433,402 +443,414 @@ msgstr ""
msgid "Name"
msgstr ""
-#: forms_common.py:305 models.py:2499 models_imports.py:616
-#: models_imports.py:617
+#: forms_common.py:309 models.py:2721 models_imports.py:630
+#: models_imports.py:631
msgid "Organization type"
msgstr ""
-#: forms_common.py:307 forms_common.py:546 models.py:2341
-#: templates/ishtar/blocks/sheet_address_section.html:3
+#: forms_common.py:311 forms_common.py:550 models.py:2563
+#: templates/ishtar/blocks/sheet_address_section.html:4
msgid "Address"
msgstr ""
-#: forms_common.py:309 forms_common.py:549 models.py:2342
+#: forms_common.py:313 forms_common.py:553 models.py:2564
msgid "Address complement"
msgstr ""
-#: forms_common.py:311 forms_common.py:550 models.py:2344
+#: forms_common.py:315 forms_common.py:554 models.py:2566
msgid "Postal code"
msgstr ""
-#: forms_common.py:314 forms_common.py:553 models.py:2347
+#: forms_common.py:318 forms_common.py:557 models.py:2569
msgid "Country"
msgstr ""
-#: forms_common.py:316 forms_common.py:468 forms_common.py:526
-#: forms_common.py:602 forms_common.py:727 models.py:2374
+#: forms_common.py:320 forms_common.py:472 forms_common.py:530
+#: forms_common.py:606 forms_common.py:731 models.py:2596
msgid "Email"
msgstr ""
-#: forms_common.py:317 forms_common.py:529 models.py:2359
+#: forms_common.py:321 forms_common.py:533 models.py:2581
#: templates/ishtar/sheet_person.html:27
#: templates/ishtar/wizard/wizard_person.html:33
msgid "Phone"
msgstr ""
-#: forms_common.py:318 forms_common.py:538 models.py:2371
+#: forms_common.py:322 forms_common.py:542 models.py:2593
#: templates/ishtar/sheet_person.html:45
#: templates/ishtar/wizard/wizard_person.html:54
msgid "Mobile phone"
msgstr ""
-#: forms_common.py:344 forms_common.py:463 forms_common.py:596
-#: forms_common.py:1190
+#: forms_common.py:348 forms_common.py:467 forms_common.py:600
+#: forms_common.py:1196
msgid "Full text search"
msgstr ""
-#: forms_common.py:348 forms_common.py:469 forms_common.py:603
-#: forms_common.py:784 models.py:1006 models.py:2536 models.py:3343
-#: models_imports.py:665 templates/ishtar/blocks/window_image_detail.html:24
+#: forms_common.py:352 forms_common.py:473 forms_common.py:607
+#: forms_common.py:788 models.py:1089 models.py:2767 models.py:3735
+#: models_imports.py:680 templates/ishtar/blocks/window_image_detail.html:24
#: templates/ishtar/blocks/window_tables/documents.html:8
#: templates/ishtar/import_table.html:28
#: templates/ishtar/sheet_organization.html:25
msgid "Type"
msgstr ""
-#: forms_common.py:358 views.py:141
+#: forms_common.py:362 views.py:142
msgid "Organization search"
msgstr ""
-#: forms_common.py:382
+#: forms_common.py:386
msgid "At least two items have to be selected."
msgstr ""
-#: forms_common.py:400
+#: forms_common.py:404
msgid "Merge all items into"
msgstr ""
-#: forms_common.py:434
+#: forms_common.py:438
msgid "Organization to merge"
msgstr ""
-#: forms_common.py:467 forms_common.py:520 forms_common.py:601 models.py:2684
+#: forms_common.py:471 forms_common.py:524 forms_common.py:605 models.py:2934
#: templates/ishtar/sheet_organization.html:24
msgid "Surname"
msgstr ""
-#: forms_common.py:484 forms_common.py:581 views.py:106
+#: forms_common.py:488 forms_common.py:585 views.py:107
msgid "Person search"
msgstr ""
-#: forms_common.py:497
+#: forms_common.py:501
msgid "Person to merge"
msgstr ""
-#: forms_common.py:514 templates/ishtar/wizard/wizard_person.html:19
+#: forms_common.py:518 templates/ishtar/wizard/wizard_person.html:19
msgid "Identity"
msgstr ""
-#: forms_common.py:517 forms_common.py:1081 forms_common.py:1200 models.py:2678
-#: models.py:2680 models.py:3334 models_imports.py:618
+#: forms_common.py:521 forms_common.py:1084 forms_common.py:1206 models.py:2928
+#: models.py:2930 models.py:3726 models_imports.py:632
#: templates/ishtar/blocks/window_tables/documents.html:7
msgid "Title"
msgstr ""
-#: forms_common.py:518 models.py:2682
+#: forms_common.py:522 models.py:2932
msgid "Salutation"
msgstr ""
-#: forms_common.py:524 models.py:2688
+#: forms_common.py:528 models.py:2938
msgid "Raw name"
msgstr ""
-#: forms_common.py:527 models.py:2360
+#: forms_common.py:531 models.py:2582
msgid "Phone description"
msgstr ""
-#: forms_common.py:530 models.py:2362 models.py:2364
+#: forms_common.py:534 models.py:2584 models.py:2586
msgid "Phone description 2"
msgstr ""
-#: forms_common.py:532
+#: forms_common.py:536
msgid "Phone 2"
msgstr ""
-#: forms_common.py:534 models.py:2368
+#: forms_common.py:538 models.py:2590
msgid "Phone description 3"
msgstr ""
-#: forms_common.py:536 models.py:2366
+#: forms_common.py:540 models.py:2588
msgid "Phone 3"
msgstr ""
-#: forms_common.py:541
+#: forms_common.py:545
msgid "Current organization"
msgstr ""
-#: forms_common.py:555 models.py:2349
+#: forms_common.py:559 models.py:2571
msgid "Other address: address"
msgstr ""
-#: forms_common.py:558 models.py:2352
+#: forms_common.py:562 models.py:2574
msgid "Other address: address complement"
msgstr ""
-#: forms_common.py:560 models.py:2353
+#: forms_common.py:564 models.py:2575
msgid "Other address: postal code"
msgstr ""
-#: forms_common.py:562 models.py:2355
+#: forms_common.py:566 models.py:2577
msgid "Other address: town"
msgstr ""
-#: forms_common.py:564 models.py:2357
+#: forms_common.py:568 models.py:2579
msgid "Other address: country"
msgstr ""
-#: forms_common.py:576
+#: forms_common.py:580
msgid "Already has an account"
msgstr ""
-#: forms_common.py:599
+#: forms_common.py:603 models.py:3290
msgid "Username"
msgstr ""
-#: forms_common.py:618
+#: forms_common.py:622
msgid "Account search"
msgstr ""
-#: forms_common.py:665 forms_common.py:705 forms_common.py:709 models.py:2596
+#: forms_common.py:669 forms_common.py:709 forms_common.py:713 models.py:2829
msgid "Person type"
msgstr ""
-#: forms_common.py:721 forms_common.py:726 ishtar_menu.py:33
+#: forms_common.py:725 forms_common.py:730 ishtar_menu.py:33
msgid "Account"
msgstr ""
-#: forms_common.py:730 wizards.py:1601
+#: forms_common.py:734 wizards.py:1624
msgid "New password"
msgstr ""
-#: forms_common.py:733
+#: forms_common.py:737
msgid "New password (confirmation)"
msgstr ""
-#: forms_common.py:760
+#: forms_common.py:764
msgid "Your password and confirmation password do not match."
msgstr ""
-#: forms_common.py:765
+#: forms_common.py:769
msgid "You must provide a correct password."
msgstr ""
-#: forms_common.py:773
+#: forms_common.py:777
msgid "This username already exists."
msgstr ""
-#: forms_common.py:786 models.py:2933 models.py:3731
+#: forms_common.py:789 models.py:3195 models.py:4145
msgid "Areas"
msgstr ""
-#: forms_common.py:806
+#: forms_common.py:809
msgid "Send the new password by email?"
msgstr ""
-#: forms_common.py:818 models.py:2935 views.py:905
+#: forms_common.py:821 models.py:3197 views.py:950
msgid "Current profile"
msgstr ""
-#: forms_common.py:821 models.py:2920 models.py:2932
+#: forms_common.py:824 models.py:3175 models.py:3194
msgid "Profile type"
msgstr ""
-#: forms_common.py:824
+#: forms_common.py:827
msgid "Duplicate this profile"
msgstr ""
-#: forms_common.py:826
+#: forms_common.py:829
msgid "Delete this profile"
msgstr ""
-#: forms_common.py:875
+#: forms_common.py:878
msgid "A profile with the same name exists."
msgstr ""
-#: forms_common.py:907
+#: forms_common.py:910
msgid " (duplicate)"
msgstr ""
-#: forms_common.py:918 forms_common.py:932 forms_common.py:933 models.py:3622
-#: models.py:3721
+#: forms_common.py:921 forms_common.py:935 forms_common.py:936 models.py:4018
+#: models.py:4133
msgid "Towns"
msgstr ""
-#: forms_common.py:928
+#: forms_common.py:931
msgid "There are identical towns."
msgstr ""
-#: forms_common.py:1015
+#: forms_common.py:1018
msgid "Only one choice can be checked."
msgstr ""
-#: forms_common.py:1062
+#: forms_common.py:1065
#, python-format
msgid ""
"<p>Heavy images are resized to: %(width)dx%(height)d (ratio is preserved).</"
"p>"
msgstr ""
-#: forms_common.py:1074
+#: forms_common.py:1077
msgid "Documentation"
msgstr ""
-#: forms_common.py:1075
+#: forms_common.py:1078
msgid "Document - General"
msgstr ""
-#: forms_common.py:1084 forms_common.py:1201 models.py:3212
-#: models_imports.py:619
+#: forms_common.py:1087 forms_common.py:1207 models.py:3540
+#: models_imports.py:633
msgid "Source type"
msgstr ""
-#: forms_common.py:1087 forms_common.py:1138 forms_common.py:1293
-#: forms_common.py:1294 models.py:3176 models.py:3353
+#: forms_common.py:1090 forms_common.py:1141 forms_common.py:1322
+#: forms_common.py:1323 models.py:3501 models.py:3609 models.py:3745
#: templates/ishtar/blocks/window_image_detail.html:9
#: templates/ishtar/blocks/window_tables/documents.html:9
msgid "Authors"
msgstr ""
-#: forms_common.py:1091 models.py:3359
+#: forms_common.py:1094 models.py:3751
msgid "Numerical ressource (web address)"
msgstr ""
-#: forms_common.py:1093
+#: forms_common.py:1096
msgid "Image"
msgstr ""
-#: forms_common.py:1096 templates/ishtar/sheet_document.html:28
+#: forms_common.py:1099 templates/ishtar/sheet_document.html:28
msgctxt "Not directory"
msgid "File"
msgstr ""
-#: forms_common.py:1099 forms_common.py:1202
+#: forms_common.py:1102 forms_common.py:1208 models.py:4135
msgid "Reference"
msgstr ""
-#: forms_common.py:1102 forms_common.py:1203
+#: forms_common.py:1105 forms_common.py:1209
msgid "Internal reference"
msgstr ""
-#: forms_common.py:1104 models.py:3361
+#: forms_common.py:1107 models.py:3753
#: templates/ishtar/blocks/window_image_detail.html:150
msgid "Receipt date"
msgstr ""
-#: forms_common.py:1106 models.py:3363 models_imports.py:844
+#: forms_common.py:1109 models.py:3755 models_imports.py:859
#: templates/ishtar/blocks/window_image_detail.html:54
msgid "Creation date"
msgstr ""
-#: forms_common.py:1109 models.py:3366
+#: forms_common.py:1112 models.py:3758
#: templates/ishtar/blocks/window_image_detail.html:160
msgid "Receipt date in documentation"
msgstr ""
-#: forms_common.py:1111 forms_common.py:1205 models.py:435 models.py:2692
-#: models.py:3126 models.py:3369 models_imports.py:469
+#: forms_common.py:1114 forms_common.py:1211 models.py:473 models.py:2942
+#: models.py:3418 models.py:3761 models_imports.py:483
#: templates/ishtar/blocks/window_image_detail.html:170
msgid "Comment"
msgstr ""
-#: forms_common.py:1113 forms_common.py:1204 models.py:1690 models.py:3368
-#: models_imports.py:124 models_imports.py:362 models_imports.py:432
+#: forms_common.py:1116 forms_common.py:1210 models.py:1884 models.py:3760
+#: models_imports.py:125 models_imports.py:372 models_imports.py:446
msgid "Description"
msgstr ""
-#: forms_common.py:1116 models.py:3370
+#: forms_common.py:1119 models.py:3762
#: templates/ishtar/blocks/window_image_detail.html:182
msgid "Additional information"
msgstr ""
-#: forms_common.py:1118 forms_common.py:1208 models.py:3372
+#: forms_common.py:1121 forms_common.py:1214 models.py:3764
#: templates/ishtar/blocks/window_image_detail.html:108
msgid "Has a duplicate"
msgstr ""
-#: forms_common.py:1136 templates/ishtar/organization_person_form.html:9
+#: forms_common.py:1139 templates/ishtar/organization_person_form.html:9
#: templates/ishtar/person_form.html:9
msgid "Identification"
msgstr ""
-#: forms_common.py:1137
+#: forms_common.py:1140
msgid "Content"
msgstr ""
-#: forms_common.py:1139
+#: forms_common.py:1142
msgid "Dates"
msgstr ""
-#: forms_common.py:1140
+#: forms_common.py:1143
msgid "Advanced"
msgstr ""
-#: forms_common.py:1141 templates/ishtar/sheet_document.html:49
+#: forms_common.py:1144 templates/ishtar/sheet_document.html:51
msgid "Related items"
msgstr ""
-#: forms_common.py:1159
+#: forms_common.py:1162
msgid "You should at least fill one of this field: title, url, image or file."
msgstr ""
-#: forms_common.py:1165
+#: forms_common.py:1168
msgid "A document have to attached at least to one item"
msgstr ""
-#: forms_common.py:1197 forms_common.py:1246 forms_common.py:1281
-#: models.py:3175 templates/ishtar/wizard/wizard_person_deletion.html:139
+#: forms_common.py:1203 forms_common.py:1275 forms_common.py:1310
+#: models.py:3500 templates/ishtar/wizard/wizard_person_deletion.html:139
msgid "Author"
msgstr ""
-#: forms_common.py:1207
+#: forms_common.py:1213
msgid "Additional informations"
msgstr ""
-#: forms_common.py:1217
+#: forms_common.py:1216 views.py:253
+msgid "Operation"
+msgstr ""
+
+#: forms_common.py:1222 views.py:257
+msgid "Context record"
+msgstr ""
+
+#: forms_common.py:1228 views.py:261
+msgid "Find"
+msgstr ""
+
+#: forms_common.py:1246
msgid "Document search"
msgstr ""
-#: forms_common.py:1238
+#: forms_common.py:1267
msgid "Would you like to delete this documentation?"
msgstr ""
-#: forms_common.py:1254 models.py:3155 models.py:3170 models_imports.py:620
+#: forms_common.py:1283 models.py:3465 models.py:3494 models_imports.py:634
msgid "Author type"
msgstr ""
-#: forms_common.py:1273
+#: forms_common.py:1302
msgid "Author selection"
msgstr ""
-#: forms_common.py:1288
+#: forms_common.py:1317
msgid "There are identical authors."
msgstr ""
-#: forms_common.py:1299 models.py:1585
+#: forms_common.py:1328 models.py:1683
msgid "Query"
msgstr ""
-#: forms_common.py:1304 models.py:1589
+#: forms_common.py:1333 models.py:1687
msgid "Is an alert"
msgstr ""
-#: forms_common.py:1306
+#: forms_common.py:1335
msgid "Create"
msgstr ""
-#: forms_common.py:1307 templates/ishtar/forms/search_query.html:60
+#: forms_common.py:1336 templates/ishtar/forms/search_query.html:60
msgid "Update"
msgstr ""
-#: forms_common.py:1322
+#: forms_common.py:1351
msgid "A label is required for a new search query."
msgstr ""
-#: forms_common.py:1326
+#: forms_common.py:1355
msgid "Select the search query to update"
msgstr ""
-#: forms_common.py:1332 forms_common.py:1347
+#: forms_common.py:1361 forms_common.py:1376
msgid "Query does not exist."
msgstr ""
@@ -848,7 +870,7 @@ msgstr ""
msgid "Deletion"
msgstr ""
-#: ishtar_menu.py:40 models.py:1990 views.py:929
+#: ishtar_menu.py:40 models.py:2209 views.py:974
msgid "Global variables"
msgstr ""
@@ -868,6 +890,8 @@ msgid "Creation"
msgstr ""
#: ishtar_menu.py:59 ishtar_menu.py:89 ishtar_menu.py:139
+#: templates/ishtar/forms/qa_base.html:29
+#: templates/ishtar/forms/qa_form.html:16
msgid "Modification"
msgstr ""
@@ -879,19 +903,19 @@ msgstr ""
msgid "Manual merge"
msgstr ""
-#: ishtar_menu.py:110 models_imports.py:867
+#: ishtar_menu.py:110 models_imports.py:882
msgid "Imports"
msgstr ""
-#: ishtar_menu.py:113 views.py:937
+#: ishtar_menu.py:113 views.py:982
msgid "New import"
msgstr ""
-#: ishtar_menu.py:117 views.py:956
+#: ishtar_menu.py:117 views.py:1001
msgid "Current imports"
msgstr ""
-#: ishtar_menu.py:121 views.py:1404
+#: ishtar_menu.py:121 views.py:1450
msgid "Old imports"
msgstr ""
@@ -899,39 +923,39 @@ msgstr ""
msgid "Documentation / Images"
msgstr ""
-#: models.py:191
+#: models.py:196
msgid "Not a valid item."
msgstr ""
-#: models.py:206
+#: models.py:211
msgid "A selected item is not a valid item."
msgstr ""
-#: models.py:217
+#: models.py:222
msgid "This item already exists."
msgstr ""
-#: models.py:427 models.py:1584 models.py:1972 models.py:2306 models.py:2322
-#: models.py:3125 models_imports.py:358
+#: models.py:465 models.py:1682 models.py:2191 models.py:2528 models.py:2544
+#: models.py:3417 models_imports.py:368
msgid "Label"
msgstr ""
-#: models.py:429
+#: models.py:467
msgid "Textual ID"
msgstr ""
-#: models.py:432
+#: models.py:470
msgid ""
"The slug is the standardized version of the name. It contains only lowercase "
"letters, numbers and hyphens. Each slug must be unique."
msgstr ""
-#: models.py:436 models.py:1862 models.py:2218 models.py:3128
-#: models_imports.py:138 models_imports.py:528
+#: models.py:474 models.py:2081 models.py:2437 models.py:3422
+#: models_imports.py:139 models_imports.py:542
msgid "Available"
msgstr ""
-#: models.py:816 models.py:1000 models_imports.py:549
+#: models.py:898 models.py:1083 models_imports.py:563
#: templates/ishtar/formset_import_match.html:21
#: templates/ishtar/import_step_by_step.html:171
#: templates/ishtar/import_step_by_step.html:199
@@ -940,52 +964,56 @@ msgstr ""
msgid "Key"
msgstr ""
-#: models.py:822
+#: models.py:904
msgid "Specific key to an import"
msgstr ""
-#: models.py:961
+#: models.py:1043
msgid "Generated relation image (SVG)"
msgstr ""
-#: models.py:975 models.py:1008 models.py:1506 models.py:1974 models.py:3152
-#: models.py:3736 models.py:3818
+#: models.py:1057 models.py:1091 models.py:1604 models.py:2193 models.py:3462
+#: models.py:4162 models.py:4244
msgid "Order"
msgstr ""
-#: models.py:978
+#: models.py:1060
msgid "Json data - Menu"
msgstr ""
-#: models.py:979
+#: models.py:1061
msgid "Json data - Menus"
msgstr ""
-#: models.py:987
+#: models.py:1069
msgid "Text"
msgstr ""
-#: models.py:988
+#: models.py:1070
msgid "Long text"
msgstr ""
-#: models.py:989 models_imports.py:661
+#: models.py:1071 models_imports.py:676
msgid "Integer"
msgstr ""
-#: models.py:990 models_imports.py:662
+#: models.py:1072
+msgid "Boolean"
+msgstr ""
+
+#: models.py:1073 models_imports.py:677
msgid "Float"
msgstr ""
-#: models.py:991 models_imports.py:664
+#: models.py:1074 models_imports.py:679
msgid "Date"
msgstr ""
-#: models.py:992
+#: models.py:1075
msgid "Choices"
msgstr ""
-#: models.py:1001
+#: models.py:1084
msgid ""
"Value of the key in the JSON schema. For hierarchical key use \"__\" to "
"explain it. For instance for the key 'my_subkey' with data such as "
@@ -993,385 +1021,421 @@ msgid ""
"my_key__my_subkey."
msgstr ""
-#: models.py:1005
+#: models.py:1088
msgid "Display"
msgstr ""
-#: models.py:1009
+#: models.py:1092
msgid "Use in search indexes"
msgstr ""
-#: models.py:1016
+#: models.py:1099
msgid "Json data - Field"
msgstr ""
-#: models.py:1017
+#: models.py:1100
msgid "Json data - Fields"
msgstr ""
-#: models.py:1028
+#: models.py:1111
msgid "Content types of the field and of the menu do not match"
msgstr ""
-#: models.py:1088
+#: models.py:1171
msgid "Search vector"
msgstr ""
-#: models.py:1089
+#: models.py:1172
msgid "Auto filled at save"
msgstr ""
-#: models.py:1296
+#: models.py:1392
msgid "Add document/image"
msgstr ""
-#: models.py:1298
+#: models.py:1394
msgid "doc./image"
msgstr ""
-#: models.py:1316
+#: models.py:1413
msgid "Last editor"
msgstr ""
-#: models.py:1319
+#: models.py:1416
msgid "Creator"
msgstr ""
-#: models.py:1499
+#: models.py:1597
msgid "Above"
msgstr ""
-#: models.py:1500
+#: models.py:1598
msgid "Bellow"
msgstr ""
-#: models.py:1501
+#: models.py:1599
msgid "Equal"
msgstr ""
-#: models.py:1507
+#: models.py:1605
msgid "Symmetrical"
msgstr ""
-#: models.py:1508
+#: models.py:1606
msgid "Tiny label"
msgstr ""
-#: models.py:1511
+#: models.py:1609
msgid "Inverse relation"
msgstr ""
-#: models.py:1514
+#: models.py:1612
msgid "Logical relation"
msgstr ""
-#: models.py:1524
+#: models.py:1622
msgid "Cannot have symmetrical and an inverse_relation"
msgstr ""
-#: models.py:1587
+#: models.py:1685
msgid "Content type"
msgstr ""
-#: models.py:1592
+#: models.py:1690
msgid "Search query"
msgstr ""
-#: models.py:1593
+#: models.py:1691
msgid "Search queries"
msgstr ""
-#: models.py:1663
+#: models.py:1855
msgid "Euro"
msgstr ""
-#: models.py:1664
+#: models.py:1856
msgid "US dollar"
msgstr ""
-#: models.py:1665 views.py:679 views.py:740
+#: models.py:1857 views.py:724 views.py:785
msgid "Operations"
msgstr ""
-#: models.py:1666 views.py:681 views.py:744
+#: models.py:1858 views.py:726 views.py:789
msgid "Context records"
msgstr ""
-#: models.py:1667
+#: models.py:1859
msgid "Site"
msgstr ""
-#: models.py:1667
+#: models.py:1859
msgid "Archaeological entity"
msgstr ""
-#: models.py:1671
+#: models.py:1863
msgid "Site search"
msgstr ""
-#: models.py:1672
+#: models.py:1864
msgid "New site"
msgstr ""
-#: models.py:1673
+#: models.py:1865
msgid "Site modification"
msgstr ""
-#: models.py:1676
+#: models.py:1866
+#| msgid "Person deletion"
+msgid "Site deletion"
+msgstr ""
+
+#: models.py:1869
msgid "Archaeological entity search"
msgstr ""
-#: models.py:1677
+#: models.py:1870
msgid "New archaeological entity"
msgstr ""
-#: models.py:1678
+#: models.py:1871
msgid "Archaeological entity modification"
msgstr ""
-#: models.py:1686 models.py:2212 models_imports.py:123
+#: models.py:1872
+#| msgid "Archaeological entity modification"
+msgid "Archaeological entity deletion"
+msgstr ""
+
+#: models.py:1880 models.py:2431 models_imports.py:124
msgid "Slug"
msgstr ""
-#: models.py:1687
+#: models.py:1881
msgid "Current active"
msgstr ""
-#: models.py:1689
+#: models.py:1883
msgid "Activate experimental feature"
msgstr ""
-#: models.py:1691
+#: models.py:1886
+msgid "Alternate configuration"
+msgstr ""
+
+#: models.py:1888
+msgid "Choose an alternate configuration for label, index management"
+msgstr ""
+
+#: models.py:1892
msgid "Files module"
msgstr ""
-#: models.py:1693
+#: models.py:1894
msgid "Archaeological site module"
msgstr ""
-#: models.py:1695
+#: models.py:1896
msgid "Archaeological site type"
msgstr ""
-#: models.py:1699
+#: models.py:1900
msgid "Context records module"
msgstr ""
-#: models.py:1701
+#: models.py:1902
msgid "Finds module"
msgstr ""
-#: models.py:1702
+#: models.py:1903
msgid "Need context records module"
msgstr ""
-#: models.py:1704
+#: models.py:1905
msgid "Find index is based on"
msgstr ""
-#: models.py:1706
+#: models.py:1907
msgid ""
"To prevent irrelevant indexes, change this parameter only if there is no "
"find in the database"
msgstr ""
-#: models.py:1709
+#: models.py:1910
msgid "Warehouses module"
msgstr ""
-#: models.py:1710
+#: models.py:1911
msgid "Need finds module"
msgstr ""
-#: models.py:1711
+#: models.py:1912
msgid "Preservation module"
msgstr ""
-#: models.py:1713
+#: models.py:1914
msgid "Mapping module"
msgstr ""
-#: models.py:1714
+#: models.py:1915
msgid "Underwater module"
msgstr ""
-#: models.py:1716
+#: models.py:1917
msgid "Parcel are mandatory for context records"
msgstr ""
-#: models.py:1718
+#: models.py:1919
msgid "Home page"
msgstr ""
-#: models.py:1719
+#: models.py:1920
#, 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:1723
+#: models.py:1924
+msgid "Main operation code prefix"
+msgstr ""
+
+#: models.py:1928
+#| msgid "Alteration cause type"
+msgid "Default operation code prefix"
+msgstr ""
+
+#: models.py:1932
+#| msgid "Operation type"
+msgid "Operation region code"
+msgstr ""
+
+#: models.py:1936
msgid "File external id"
msgstr ""
-#: models.py:1725
+#: models.py:1938
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:1730
+#: models.py:1943
msgid "Parcel external id"
msgstr ""
-#: models.py:1733
+#: models.py:1946
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:1738
+#: models.py:1951
msgid "Context record external id"
msgstr ""
-#: models.py:1740
+#: models.py:1953
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:1745
+#: models.py:1958
msgid "Base find external id"
msgstr ""
-#: models.py:1747
+#: models.py:1960
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:1752
+#: models.py:1965
msgid "Find external id"
msgstr ""
-#: models.py:1754
+#: models.py:1967
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:1759
+#: models.py:1972
msgid "Container external id"
msgstr ""
-#: models.py:1761
+#: models.py:1974
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:1766
+#: models.py:1979
msgid "Warehouse external id"
msgstr ""
-#: models.py:1768
+#: models.py:1981
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:1773
+#: models.py:1986
msgid "Raw name for person"
msgstr ""
-#: models.py:1775
+#: models.py:1988
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:1779
+#: models.py:1992
+msgid "Use auto index for finds"
+msgstr ""
+
+#: models.py:1994
msgid "Currency"
msgstr ""
-#: models.py:1783
+#: models.py:1998
msgid "Ishtar site profile"
msgstr ""
-#: models.py:1784
+#: models.py:1999
msgid "Ishtar site profiles"
msgstr ""
-#: models.py:1864
+#: models.py:2083
msgid "Enable this form"
msgstr ""
-#: models.py:1865
+#: models.py:2084
msgid ""
"Disable with caution: disabling a form with mandatory fields may lead to "
"database errors."
msgstr ""
-#: models.py:1868
+#: models.py:2087
msgid "Apply to all"
msgstr ""
-#: models.py:1869
+#: models.py:2088
msgid ""
"Apply this form to all users. If set to True, selecting user and user type "
"is useless."
msgstr ""
-#: models.py:1875
+#: models.py:2094
msgid "Custom form"
msgstr ""
-#: models.py:1876
+#: models.py:2095
msgid "Custom forms"
msgstr ""
-#: models.py:1892
+#: models.py:2111
msgid "User types"
msgstr ""
-#: models.py:1964
+#: models.py:2183
msgid "Excluded field"
msgstr ""
-#: models.py:1965
+#: models.py:2184
msgid "Excluded fields"
msgstr ""
-#: models.py:1975 templates/blocks/form_flex_snippet.html:18
+#: models.py:2194 templates/blocks/form_flex_snippet.html:18
#: templates/blocks/table_form_snippet.html:9
msgid "Help"
msgstr ""
-#: models.py:1978
+#: models.py:2197
msgid "Custom form - Json data field"
msgstr ""
-#: models.py:1979
+#: models.py:2198
msgid "Custom form - Json data fields"
msgstr ""
-#: models.py:1983
+#: models.py:2202
msgid "Variable name"
msgstr ""
-#: models.py:1984
+#: models.py:2203
msgid "Description of the variable"
msgstr ""
-#: models.py:1986 models_imports.py:550
+#: models.py:2205 models_imports.py:564
#: templates/ishtar/formset_import_match.html:22
#: templates/ishtar/import_step_by_step.html:172
#: templates/ishtar/import_step_by_step.html:200
@@ -1379,980 +1443,1070 @@ msgstr ""
msgid "Value"
msgstr ""
-#: models.py:1989
+#: models.py:2208
msgid "Global variable"
msgstr ""
-#: models.py:2116 models.py:2146
+#: models.py:2335 models.py:2365
msgid "Total"
msgstr ""
-#: models.py:2123 models.py:2307 models.py:2323
+#: models.py:2342 models.py:2529 models.py:2545
#: templates/ishtar/dashboards/dashboard_main_detail.html:211
#: templates/ishtar/dashboards/dashboard_main_detail_users.html:5
#: templates/ishtar/sheet_person.html:30
msgid "Number"
msgstr ""
-#: models.py:2210
+#: models.py:2429
msgid "Administrative Act"
msgstr ""
-#: models.py:2217
+#: models.py:2436
msgid "Associated object"
msgstr ""
-#: models.py:2222
+#: models.py:2441
msgid "Document template"
msgstr ""
-#: models.py:2223
+#: models.py:2442
msgid "Document templates"
msgstr ""
-#: models.py:2311 models.py:2324 models.py:3856 models_imports.py:838
+#: models.py:2533 models.py:2546 models.py:4282 models_imports.py:853
msgid "State"
msgstr ""
-#: models.py:2329 models.py:3608 templates/blocks/JQueryAdvancedTown.html:12
+#: models.py:2551 models.py:4004 templates/blocks/JQueryAdvancedTown.html:12
msgid "Department"
msgstr ""
-#: models.py:2330
+#: models.py:2552
msgid "Departments"
msgstr ""
-#: models.py:2370
+#: models.py:2592
msgid "Raw phone"
msgstr ""
-#: models.py:2376
+#: models.py:2598
msgid "Alternative address is prefered"
msgstr ""
-#: models.py:2415
+#: models.py:2637
msgid "Tel: "
msgstr ""
-#: models.py:2419
+#: models.py:2641
msgid "Mobile: "
msgstr ""
-#: models.py:2423
+#: models.py:2645
msgid "Email: "
msgstr ""
-#: models.py:2428
+#: models.py:2650
msgid "Merge key"
msgstr ""
-#: models.py:2500
+#: models.py:2722
msgid "Organization types"
msgstr ""
-#: models.py:2522 models.py:2650 models.py:3021
+#: models.py:2749 models.py:2896 models.py:3300
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models.py:2526 models.py:2662 models.py:3033 models.py:3303
+#: models.py:2753 models.py:2908 models.py:3312 models.py:3636
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models.py:2537 models.py:2697 models.py:3171 models.py:3616
+#: models.py:2768 models.py:2947 models.py:3495 models.py:4012
msgid "Cached name"
msgstr ""
-#: models.py:2543
+#: models.py:2774
msgid "Organizations"
msgstr ""
-#: models.py:2571
+#: models.py:2804
msgid "unknown organization"
msgstr ""
-#: models.py:2597
+#: models.py:2830
msgid "Person types"
msgstr ""
-#: models.py:2610 models_imports.py:655
+#: models.py:2843 models_imports.py:670
msgid "Title type"
msgstr ""
-#: models.py:2611
+#: models.py:2844
msgid "Title types"
msgstr ""
-#: models.py:2622
+#: models.py:2868
msgid "Mr"
msgstr ""
-#: models.py:2623
+#: models.py:2869
msgid "Miss"
msgstr ""
-#: models.py:2624
+#: models.py:2870
msgid "Mr and Mrs"
msgstr ""
-#: models.py:2625
+#: models.py:2871
msgid "Mrs"
msgstr ""
-#: models.py:2626
+#: models.py:2872
msgid "Doctor"
msgstr ""
-#: models.py:2654 models.py:3025
+#: models.py:2900 models.py:3304
msgctxt "key for text search"
msgid "surname"
msgstr ""
-#: models.py:2658 models.py:3029
+#: models.py:2904 models.py:3308
msgctxt "key for text search"
msgid "email"
msgstr ""
-#: models.py:2666 models.py:3037
+#: models.py:2912 models.py:3316
msgctxt "key for text search"
msgid "organization"
msgstr ""
-#: models.py:2670
+#: models.py:2916
msgctxt "key for text search"
msgid "has-account"
msgstr ""
-#: models.py:2690
+#: models.py:2940
msgid "Contact type"
msgstr ""
-#: models.py:2693 models.py:2777
+#: models.py:2943 models.py:3033
msgid "Types"
msgstr ""
-#: models.py:2696
+#: models.py:2946
msgid "Is attached to"
msgstr ""
-#: models.py:2703
+#: models.py:2953
msgid "Persons"
msgstr ""
-#: models.py:2916
+#: models.py:3171
msgid "Groups"
msgstr ""
-#: models.py:2921
+#: models.py:3176
msgid "Profile types"
msgstr ""
-#: models.py:2940
+#: models.py:3187
+#| msgid "Profile types"
+msgid "Profile type summary"
+msgstr ""
+
+#: models.py:3188
+#| msgid "Profile types"
+msgid "Profile types summary"
+msgstr ""
+
+#: models.py:3199
+#| msgid "Export field name"
+msgid "Show field number"
+msgstr ""
+
+#: models.py:3204
msgid "User profile"
msgstr ""
-#: models.py:2941
+#: models.py:3205
msgid "User profiles"
msgstr ""
-#: models.py:2976
+#: models.py:3240
msgid " - duplicate"
msgstr ""
-#: models.py:3017
+#: models.py:3296
msgctxt "key for text search"
msgid "username"
msgstr ""
-#: models.py:3050
+#: models.py:3332
msgid "Advanced shortcut menu"
msgstr ""
-#: models.py:3053
+#: models.py:3335
msgid "Ishtar user"
msgstr ""
-#: models.py:3054
+#: models.py:3336
msgid "Ishtar users"
msgstr ""
-#: models.py:3156
+#: models.py:3421
+msgid "Owner"
+msgstr ""
+
+#: models.py:3424
+msgid "Shared with"
+msgstr ""
+
+#: models.py:3466
msgid "Author types"
msgstr ""
-#: models.py:3213
+#: models.py:3541
msgid "Source types"
msgstr ""
-#: models.py:3223 models_imports.py:654
+#: models.py:3551 models_imports.py:669
msgid "Support type"
msgstr ""
-#: models.py:3224
+#: models.py:3552
msgid "Support types"
msgstr ""
-#: models.py:3233
+#: models.py:3561
msgid "Format type"
msgstr ""
-#: models.py:3234
+#: models.py:3562
msgid "Format types"
msgstr ""
-#: models.py:3243
+#: models.py:3571
msgid "URL"
msgstr ""
-#: models.py:3246
+#: models.py:3574
msgid "License type"
msgstr ""
-#: models.py:3247
+#: models.py:3575
msgid "License types"
msgstr ""
-#: models.py:3295
+#: models.py:3628
msgctxt "key for text search"
msgid "author"
msgstr ""
-#: models.py:3299
+#: models.py:3632
msgctxt "key for text search"
msgid "title"
msgstr ""
-#: models.py:3307
+#: models.py:3640
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models.py:3311
+#: models.py:3644
msgctxt "key for text search"
msgid "internal-reference"
msgstr ""
-#: models.py:3315
+#: models.py:3648
msgctxt "key for text search"
msgid "description"
msgstr ""
-#: models.py:3319
+#: models.py:3652
msgctxt "key for text search"
msgid "comment"
msgstr ""
-#: models.py:3323
+#: models.py:3656
msgctxt "key for text search"
msgid "additional-information"
msgstr ""
-#: models.py:3327
+#: models.py:3660
msgctxt "key for text search"
msgid "has-duplicate"
msgstr ""
-#: models.py:3337
+#: models.py:3664 models.py:3711
+#| msgid "Operation"
+msgctxt "key for text search"
+msgid "operation"
+msgstr ""
+
+#: models.py:3668 models.py:3714
+#| msgid "Context record"
+msgctxt "key for text search"
+msgid "context-record"
+msgstr ""
+
+#: models.py:3672 models.py:3716
+msgctxt "key for text search"
+msgid "find"
+msgstr ""
+
+#: models.py:3676 models.py:3715
+#| msgid "Profile"
+msgctxt "key for text search"
+msgid "file"
+msgstr ""
+
+#: models.py:3680 models.py:3717
+#| msgid "New site"
+msgctxt "key for text search"
+msgid "site"
+msgstr ""
+
+#: models.py:3684 models.py:3718
+#| msgid "Warehouse type"
+msgctxt "key for text search"
+msgid "warehouse"
+msgstr ""
+
+#: models.py:3720
+#| msgid "Treatment"
+msgctxt "key for text search"
+msgid "treatment"
+msgstr ""
+
+#: models.py:3723
+#| msgid "Treatment"
+msgctxt "key for text search"
+msgid "treatment-file"
+msgstr ""
+
+#: models.py:3729
msgid "Index"
msgstr ""
-#: models.py:3339
+#: models.py:3731
msgid "External ID"
msgstr ""
-#: models.py:3340 templates/ishtar/blocks/window_image_detail.html:34
+#: models.py:3732 templates/ishtar/blocks/window_image_detail.html:34
msgid "Ref."
msgstr ""
-#: models.py:3341 templates/ishtar/blocks/window_image_detail.html:44
+#: models.py:3733 templates/ishtar/blocks/window_image_detail.html:44
msgid "Internal ref."
msgstr ""
-#: models.py:3345
+#: models.py:3737
msgid "License"
msgstr ""
-#: models.py:3347 templates/ishtar/blocks/window_image_detail.html:78
+#: models.py:3739 templates/ishtar/blocks/window_image_detail.html:78
msgid "Support"
msgstr ""
-#: models.py:3349 models_imports.py:621
+#: models.py:3741 models_imports.py:635
#: templates/ishtar/blocks/window_image_detail.html:88
msgid "Format"
msgstr ""
-#: models.py:3351 templates/ishtar/blocks/window_image_detail.html:98
+#: models.py:3743 templates/ishtar/blocks/window_image_detail.html:98
msgid "Scale"
msgstr ""
-#: models.py:3355
+#: models.py:3747
msgid "Authors (raw)"
msgstr ""
-#: models.py:3367 templates/ishtar/blocks/window_image_detail.html:118
+#: models.py:3759 templates/ishtar/blocks/window_image_detail.html:118
msgid "Number of items"
msgstr ""
-#: models.py:3373
+#: models.py:3766
msgid "Symbolic links"
msgstr ""
-#: models.py:3376
+#: models.py:3769
msgid "Related"
msgstr ""
-#: models.py:3377
+#: models.py:3770
msgid "Cached value - do not edit"
msgstr ""
-#: models.py:3380 templates/ishtar/sheet_document.html:4
+#: models.py:3773 templates/ishtar/sheet_document.html:4
msgid "Document"
msgstr ""
-#: models.py:3381 templates/ishtar/sheet_person.html:107
+#: models.py:3774 templates/ishtar/sheet_person.html:113
msgid "Documents"
msgstr ""
-#: models.py:3385
+#: models.py:3778
msgid "Can view all Documents"
msgstr ""
-#: models.py:3387
+#: models.py:3780
msgid "Can view own Document"
msgstr ""
-#: models.py:3389
+#: models.py:3782
msgid "Can add own Document"
msgstr ""
-#: models.py:3391
+#: models.py:3784
msgid "Can change own Document"
msgstr ""
-#: models.py:3393
+#: models.py:3786
msgid "Can delete own Document"
msgstr ""
-#: models.py:3601
+#: models.py:3997
msgid "Surface (m2)"
msgstr ""
-#: models.py:3602
+#: models.py:3998
msgid "Localisation"
msgstr ""
-#: models.py:3610
+#: models.py:4006
msgid "Year of creation"
msgstr ""
-#: models.py:3611
+#: models.py:4007
msgid "Filling this field is relevant to distinguish old towns from new towns."
msgstr ""
-#: models.py:3725
+#: models.py:4139
msgid "Only four level of parent are managed."
msgstr ""
-#: models.py:3730
+#: models.py:4144
msgid "Area"
msgstr ""
-#: models.py:3737
+#: models.py:4163
msgid "Is preventive"
msgstr ""
-#: models.py:3738
+#: models.py:4164
msgid "Is judiciary"
msgstr ""
-#: models.py:3741 models_imports.py:622
+#: models.py:4167 models_imports.py:636
msgid "Operation type"
msgstr ""
-#: models.py:3742
+#: models.py:4168
msgid "Operation types"
msgstr ""
-#: models.py:3781
+#: models.py:4207
msgid "Judiciary"
msgstr ""
-#: models.py:3783
+#: models.py:4209
msgid "Preventive"
msgstr ""
-#: models.py:3785
+#: models.py:4211
msgid "Research"
msgstr ""
-#: models.py:3820
+#: models.py:4246
msgid "Authority name"
msgstr ""
-#: models.py:3821
+#: models.py:4247
msgid "Authority SRID"
msgstr ""
-#: models.py:3824 models_imports.py:653
+#: models.py:4250 models_imports.py:668
msgid "Spatial reference system"
msgstr ""
-#: models.py:3825
+#: models.py:4251
msgid "Spatial reference systems"
msgstr ""
-#: models.py:3832
+#: models.py:4258
msgid "Filename"
msgstr ""
-#: models.py:3837
+#: models.py:4263
msgid "Administration script"
msgstr ""
-#: models.py:3838
+#: models.py:4264
msgid "Administration scripts"
msgstr ""
-#: models.py:3845
+#: models.py:4271
msgid "Scheduled"
msgstr ""
-#: models.py:3846
+#: models.py:4272
msgid "In progress"
msgstr ""
-#: models.py:3847 models_imports.py:777
+#: models.py:4273 models_imports.py:792
msgid "Finished with errors"
msgstr ""
-#: models.py:3848 models_imports.py:778
+#: models.py:4274 models_imports.py:793
msgid "Finished"
msgstr ""
-#: models.py:3861
+#: models.py:4287
msgid "Result"
msgstr ""
-#: models.py:3864
+#: models.py:4290
msgid "Administration task"
msgstr ""
-#: models.py:3865
+#: models.py:4291
msgid "Administration tasks"
msgstr ""
-#: models.py:3869
+#: models.py:4295
msgid "Unknown"
msgstr ""
-#: models.py:3884
+#: models.py:4310
msgid ""
"ISHTAR_SCRIPT_DIR is not set in your local_settings. Contact your "
"administrator."
msgstr ""
-#: models.py:3893
+#: models.py:4319
msgid ""
"Your ISHTAR_SCRIPT_DIR is containing dots \"..\". As it can refer to "
"relative paths, it can be a security issue and this is not allowed. Only put "
"a full path."
msgstr ""
-#: models.py:3904
+#: models.py:4330
msgid "Your ISHTAR_SCRIPT_DIR: \"{}\" is not a valid directory."
msgstr ""
-#: models.py:3920
+#: models.py:4346
msgid ""
"Script \"{}\" is not available in your script directory. Check your "
"configuration."
msgstr ""
-#: models_imports.py:98
+#: models_imports.py:99
msgid "Class name"
msgstr ""
-#: models_imports.py:102
+#: models_imports.py:103
msgid "Importer - Model"
msgstr ""
-#: models_imports.py:103
+#: models_imports.py:104
msgid "Importer - Models"
msgstr ""
-#: models_imports.py:129
+#: models_imports.py:130
msgid "Associated model"
msgstr ""
-#: models_imports.py:132
+#: models_imports.py:133
msgid "Models that can accept new items"
msgstr ""
-#: models_imports.py:133
+#: models_imports.py:134
msgid "Leave blank for no restrictions"
msgstr ""
-#: models_imports.py:135
+#: models_imports.py:136
msgid "Is template"
msgstr ""
-#: models_imports.py:136
+#: models_imports.py:137
msgid "Unicity keys (separator \";\")"
msgstr ""
-#: models_imports.py:142
+#: models_imports.py:143
msgid "Importer - Type"
msgstr ""
-#: models_imports.py:143
+#: models_imports.py:144
msgid "Importer - Types"
msgstr ""
-#: models_imports.py:265
+#: models_imports.py:247
+msgid ""
+"Importer configuration error: \"{}\" is not available for \"{}\". Check your "
+"default and column configuration"
+msgstr ""
+
+#: models_imports.py:275
msgid "Importer - Default"
msgstr ""
-#: models_imports.py:266
+#: models_imports.py:276
msgid "Importer - Defaults"
msgstr ""
-#: models_imports.py:311
+#: models_imports.py:321
msgid "Importer - Default value"
msgstr ""
-#: models_imports.py:312
+#: models_imports.py:322
msgid "Importer - Default values"
msgstr ""
-#: models_imports.py:361 templates/ishtar/import_step_by_step.html:101
+#: models_imports.py:371 templates/ishtar/import_step_by_step.html:101
#: templates/ishtar/import_step_by_step.html:269
msgid "Column number"
msgstr ""
-#: models_imports.py:364
+#: models_imports.py:374
msgid "Required"
msgstr ""
-#: models_imports.py:366
+#: models_imports.py:376
msgid "Export field name"
msgstr ""
-#: models_imports.py:367
+#: models_imports.py:377
msgid ""
"Fill this field if the field name is ambiguous for export. For instance: "
"concatenated fields."
msgstr ""
-#: models_imports.py:373
+#: models_imports.py:383
msgid "Importer - Column"
msgstr ""
-#: models_imports.py:374
+#: models_imports.py:384
msgid "Importer - Columns"
msgstr ""
-#: models_imports.py:404
+#: models_imports.py:418
msgid "Field name"
msgstr ""
-#: models_imports.py:406 models_imports.py:463
+#: models_imports.py:420 models_imports.py:477
msgid "Force creation of new items"
msgstr ""
-#: models_imports.py:408 models_imports.py:465
+#: models_imports.py:422 models_imports.py:479
msgid "Concatenate with existing"
msgstr ""
-#: models_imports.py:410 models_imports.py:467
+#: models_imports.py:424 models_imports.py:481
msgid "Concatenate character"
msgstr ""
-#: models_imports.py:415
+#: models_imports.py:429
msgid "Importer - Duplicate field"
msgstr ""
-#: models_imports.py:416
+#: models_imports.py:430
msgid "Importer - Duplicate fields"
msgstr ""
-#: models_imports.py:434
+#: models_imports.py:448
msgid "Regular expression"
msgstr ""
-#: models_imports.py:438
+#: models_imports.py:452
msgid "Importer - Regular expression"
msgstr ""
-#: models_imports.py:439
+#: models_imports.py:453
msgid "Importer - Regular expressions"
msgstr ""
-#: models_imports.py:473
+#: models_imports.py:487
msgid "Importer - Target"
msgstr ""
-#: models_imports.py:474
+#: models_imports.py:488
msgid "Importer - Targets"
msgstr ""
-#: models_imports.py:511 views_item.py:740
+#: models_imports.py:525 views_item.py:830
msgid "True"
msgstr ""
-#: models_imports.py:512 views_item.py:742
+#: models_imports.py:526 views_item.py:832
msgid "False"
msgstr ""
-#: models_imports.py:524
+#: models_imports.py:538
msgid "All users can use it"
msgstr ""
-#: models_imports.py:526
+#: models_imports.py:540
msgid "All users can modify it"
msgstr ""
-#: models_imports.py:531
+#: models_imports.py:545
msgid "Importer - Target key group"
msgstr ""
-#: models_imports.py:532
+#: models_imports.py:546
msgid "Importer - Target key groups"
msgstr ""
-#: models_imports.py:551
+#: models_imports.py:565
msgid "Is set"
msgstr ""
-#: models_imports.py:559
+#: models_imports.py:573
msgid "Importer - Target key"
msgstr ""
-#: models_imports.py:560
+#: models_imports.py:574
msgid "Importer - Targets keys"
msgstr ""
-#: models_imports.py:623
+#: models_imports.py:637
msgid "Period"
msgstr ""
-#: models_imports.py:624
+#: models_imports.py:638
msgid "Report state"
msgstr ""
-#: models_imports.py:625
+#: models_imports.py:639
msgid "Remain type"
msgstr ""
-#: models_imports.py:626
+#: models_imports.py:640
msgid "Unit"
msgstr ""
-#: models_imports.py:628
+#: models_imports.py:642
msgid "Activity type"
msgstr ""
-#: models_imports.py:630
+#: models_imports.py:644
msgid "Documentation type"
msgstr ""
-#: models_imports.py:631
+#: models_imports.py:645
msgid "Material"
msgstr ""
-#: models_imports.py:633
+#: models_imports.py:647
msgid "Conservatory state"
msgstr ""
-#: models_imports.py:634
+#: models_imports.py:648
msgid "Container type"
msgstr ""
-#: models_imports.py:636
+#: models_imports.py:650
msgid "Warehouse division"
msgstr ""
-#: models_imports.py:637
+#: models_imports.py:651
msgid "Warehouse type"
msgstr ""
-#: models_imports.py:638
+#: models_imports.py:652
msgid "Treatment type"
msgstr ""
-#: models_imports.py:640
+#: models_imports.py:654
msgid "Treatment emergency type"
msgstr ""
-#: models_imports.py:641
+#: models_imports.py:655
msgid "Object type"
msgstr ""
-#: models_imports.py:642
+#: models_imports.py:656
msgid "Integrity type"
msgstr ""
-#: models_imports.py:644
+#: models_imports.py:658
msgid "Remarkability type"
msgstr ""
-#: models_imports.py:645
+#: models_imports.py:659
msgid "Alteration type"
msgstr ""
-#: models_imports.py:647
+#: models_imports.py:661
msgid "Alteration cause type"
msgstr ""
-#: models_imports.py:648
+#: models_imports.py:662
msgid "Batch type"
msgstr ""
-#: models_imports.py:650
+#: models_imports.py:663
+#| msgid "Phone type"
+msgid "Checked type"
+msgstr ""
+
+#: models_imports.py:665
msgid "Identification type"
msgstr ""
-#: models_imports.py:652
+#: models_imports.py:667
msgid "Context record relation type"
msgstr ""
-#: models_imports.py:663
+#: models_imports.py:678
msgid "String"
msgstr ""
-#: models_imports.py:666
+#: models_imports.py:681
#: templates/ishtar/dashboards/dashboard_main_detail.html:196
msgid "Year"
msgstr ""
-#: models_imports.py:667
+#: models_imports.py:682
msgid "INSEE code"
msgstr ""
-#: models_imports.py:668
+#: models_imports.py:683
msgid "String to boolean"
msgstr ""
-#: models_imports.py:669
+#: models_imports.py:684
msgctxt "filesystem"
msgid "File"
msgstr ""
-#: models_imports.py:670
+#: models_imports.py:685
msgid "Unknow type"
msgstr ""
-#: models_imports.py:687
+#: models_imports.py:702
msgid "4 digit year. e.g.: \"2015\""
msgstr ""
-#: models_imports.py:688
+#: models_imports.py:703
msgid "4 digit year/month/day. e.g.: \"2015/02/04\""
msgstr ""
-#: models_imports.py:689
+#: models_imports.py:704
msgid "Day/month/4 digit year. e.g.: \"04/02/2015\""
msgstr ""
-#: models_imports.py:705
+#: models_imports.py:720
msgid "Options"
msgstr ""
-#: models_imports.py:707
+#: models_imports.py:722
msgid "Split character(s)"
msgstr ""
-#: models_imports.py:712
+#: models_imports.py:727
msgid "Importer - Formater type"
msgstr ""
-#: models_imports.py:713
+#: models_imports.py:728
msgid "Importer - Formater types"
msgstr ""
-#: models_imports.py:769
+#: models_imports.py:784
#: templates/ishtar/dashboards/dashboard_main_detail.html:132
msgid "Created"
msgstr ""
-#: models_imports.py:770
+#: models_imports.py:785
msgid "Analyse in progress"
msgstr ""
-#: models_imports.py:771
+#: models_imports.py:786
msgid "Analysed"
msgstr ""
-#: models_imports.py:772
+#: models_imports.py:787
msgid "Check modified in queue"
msgstr ""
-#: models_imports.py:773
+#: models_imports.py:788
msgid "Import in queue"
msgstr ""
-#: models_imports.py:774
+#: models_imports.py:789
msgid "Check modified in progress"
msgstr ""
-#: models_imports.py:775
+#: models_imports.py:790
msgid "Import in progress"
msgstr ""
-#: models_imports.py:776
+#: models_imports.py:791
msgid "Partially imported"
msgstr ""
-#: models_imports.py:779
+#: models_imports.py:794
msgid "Archived"
msgstr ""
-#: models_imports.py:815
+#: models_imports.py:830
msgid "Imported file"
msgstr ""
-#: models_imports.py:817
+#: models_imports.py:832
msgid "Associated images (zip file)"
msgstr ""
-#: models_imports.py:821
+#: models_imports.py:836
msgid "If a group is selected, target key saved in this group will be used."
msgstr ""
-#: models_imports.py:824
+#: models_imports.py:839
msgid "Encoding"
msgstr ""
-#: models_imports.py:827
+#: models_imports.py:842
msgid "Skip lines"
msgstr ""
-#: models_imports.py:828
+#: models_imports.py:843
msgid "Number of header lines in your file (can be 0)."
msgstr ""
-#: models_imports.py:829
+#: models_imports.py:844
msgid "Error file"
msgstr ""
-#: models_imports.py:832
+#: models_imports.py:847
msgid "Result file"
msgstr ""
-#: models_imports.py:835
+#: models_imports.py:850
msgid "Match file"
msgstr ""
-#: models_imports.py:841
+#: models_imports.py:856
msgid "Conservative import"
msgstr ""
-#: models_imports.py:842
+#: models_imports.py:857
msgid "If set to true, do not overload existing values."
msgstr ""
-#: models_imports.py:845
+#: models_imports.py:860
msgid "End date"
msgstr ""
-#: models_imports.py:848
+#: models_imports.py:863
msgid "Remaining seconds"
msgstr ""
-#: models_imports.py:850
+#: models_imports.py:865
msgid "Current line"
msgstr ""
-#: models_imports.py:852
+#: models_imports.py:867
msgid "Number of line"
msgstr ""
-#: models_imports.py:855
+#: models_imports.py:870
msgid "Imported line numbers"
msgstr ""
-#: models_imports.py:858
+#: models_imports.py:873
msgid "Changed have been checked"
msgstr ""
-#: models_imports.py:861
+#: models_imports.py:876
msgid "Changed line numbers"
msgstr ""
-#: models_imports.py:866
+#: models_imports.py:881
msgid "Import"
msgstr ""
-#: models_imports.py:955
+#: models_imports.py:970
msgid "Analyse"
msgstr ""
-#: models_imports.py:957 models_imports.py:966
+#: models_imports.py:972 models_imports.py:981
msgid "Re-analyse"
msgstr ""
-#: models_imports.py:958
+#: models_imports.py:973
msgid "Launch import"
msgstr ""
-#: models_imports.py:961
+#: models_imports.py:976
msgid "Step by step import"
msgstr ""
-#: models_imports.py:962 models_imports.py:971
+#: models_imports.py:977 models_imports.py:986
msgid "Re-check for changes"
msgstr ""
-#: models_imports.py:964 models_imports.py:973
+#: models_imports.py:979 models_imports.py:988
msgid "Check for changes"
msgstr ""
-#: models_imports.py:967
+#: models_imports.py:982
msgid "Re-import"
msgstr ""
-#: models_imports.py:970
+#: models_imports.py:985
msgid "Step by step re-import"
msgstr ""
-#: models_imports.py:974
+#: models_imports.py:989
msgid "Archive"
msgstr ""
-#: models_imports.py:976
+#: models_imports.py:991
msgid "Unarchive"
msgstr ""
-#: models_imports.py:977 templates/ishtar/form_delete.html:11 widgets.py:371
-#: widgets.py:403
+#: models_imports.py:992 templates/ishtar/form_delete.html:11 views.py:1829
+#: widgets.py:371 widgets.py:403
msgid "Delete"
msgstr ""
-#: models_imports.py:1046
+#: models_imports.py:1042
+#| msgid "Error file"
+msgid "Error in the CSV file."
+msgstr ""
+
+#: models_imports.py:1070
msgid "Modification check {} added to the queue"
msgstr ""
-#: models_imports.py:1116
+#: models_imports.py:1140
msgid "Import {} added to the queue"
msgstr ""
-#: models_imports.py:1134
+#: models_imports.py:1158
msgid "Error on imported file: {}"
msgstr ""
-#: models_imports.py:1169
+#: models_imports.py:1193
msgid "Import {} finished with errors"
msgstr ""
-#: models_imports.py:1178
+#: models_imports.py:1202
msgid "Import {} finished with no errors"
msgstr ""
-#: templates/404.html:14
+#: templates/404.html:3
msgid "Page not found"
msgstr ""
-#: templates/404.html:15
+#: templates/500.html:22
+msgid "An error has occured. The support team has been warned."
+msgstr ""
+
+#: templates/500.html:24
msgid "Back to main page"
msgstr ""
@@ -2392,12 +2546,12 @@ msgid "View on site"
msgstr ""
#: templates/admin/change_form.html:24 templates/admin/change_form.html:27
-#: views.py:1167 views.py:1172
+#: views.py:1213 views.py:1218
msgid "Previous"
msgstr ""
#: templates/admin/change_form.html:32 templates/admin/change_form.html:35
-#: views.py:1175 views.py:1178
+#: views.py:1221 views.py:1224
msgid "Next"
msgstr ""
@@ -2410,124 +2564,132 @@ msgstr ""
msgid "Import from CSV"
msgstr ""
-#: templates/base.html:40
-msgid "Searches in the shortcut menu deal with all items."
+#: templates/admin/profiletype_summary_change_list.html:4
+#| msgid "Profile type"
+msgid "Profile type Summary"
msgstr ""
#: templates/base.html:41
-msgid "Searches in the shortcut menu deal with only your items."
+msgid "Searches in the shortcut menu deal with all items."
msgstr ""
#: templates/base.html:42
-msgid "yes"
+msgid "Searches in the shortcut menu deal with only your items."
msgstr ""
#: templates/base.html:43
-msgid "no"
+#| msgid "%d item(s) created."
+msgid " items added."
msgstr ""
#: templates/base.html:44
-msgid "Autorefresh start. The form is disabled."
+msgid "yes"
msgstr ""
#: templates/base.html:45
+msgid "no"
+msgstr ""
+
+#: templates/base.html:46
+msgid "Autorefresh start. The form is disabled."
+msgstr ""
+
+#: templates/base.html:47
msgid "Autorefresh end. The form is re-enabled."
msgstr ""
-#: templates/base.html:68
+#: templates/base.html:73
msgid "Current items"
msgstr ""
-#: templates/base.html:70 templates/ishtar/manage_basket.html:4
+#: templates/base.html:75 templates/ishtar/forms/qa_base.html:34
+#: templates/ishtar/forms/qa_form.html:21 templates/ishtar/manage_basket.html:4
#: templates/welcome.html:11 templates/welcome.html:12
#: templates/welcome.html:13 templates/welcome.html:14 wizards.py:423
msgid ":"
msgstr ""
-#: templates/base.html:83
+#: templates/base.html:88
msgid "Sheets"
msgstr ""
-#: templates/base.html:133
+#: templates/base.html:138
msgid "Processing..."
msgstr ""
-#: templates/base.html:135
+#: templates/base.html:140
msgid "This can be long."
msgstr ""
-#: templates/base.html:137
+#: templates/base.html:142
msgid "Time to take a coffee?"
msgstr ""
-#: templates/base.html:139
+#: templates/base.html:144
msgid "Time to take another coffee?"
msgstr ""
-#: templates/blocks/DataTables.html:15 templates/blocks/JQueryJqGrid.html:16
-msgid "Pinned search:"
-msgstr ""
-
-#: templates/blocks/DataTables.html:53
+#: templates/blocks/DataTables.html:47
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:39
msgid "Expand table"
msgstr ""
-#: templates/blocks/DataTables.html:59 templates/blocks/JQueryJqGrid.html:26
+#: templates/blocks/DataTables.html:53 templates/blocks/JQueryJqGrid.html:26
+#: templates/ishtar/blocks/window_nav.html:59
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:45
msgid "Export"
msgstr ""
-#: templates/blocks/DataTables.html:62 templates/blocks/DataTables.html:65
+#: templates/blocks/DataTables.html:56 templates/blocks/DataTables.html:59
#: templates/blocks/JQueryJqGrid.html:29 templates/blocks/JQueryJqGrid.html:32
msgid "Export as CSV - "
msgstr ""
-#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:29
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:6
+#: templates/blocks/DataTables.html:56 templates/blocks/JQueryJqGrid.html:29
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:7
msgid "simple"
msgstr ""
-#: templates/blocks/DataTables.html:62
+#: templates/blocks/DataTables.html:56
msgid "Simple CSV"
msgstr ""
-#: templates/blocks/DataTables.html:63 templates/blocks/JQueryJqGrid.html:30
+#: templates/blocks/DataTables.html:57 templates/blocks/JQueryJqGrid.html:30
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:48
msgid "Export as CSV - full"
msgstr ""
-#: templates/blocks/DataTables.html:63 templates/blocks/JQueryJqGrid.html:30
+#: templates/blocks/DataTables.html:57 templates/blocks/JQueryJqGrid.html:30
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:48
msgid "CSV full"
msgstr ""
-#: templates/blocks/DataTables.html:68 templates/blocks/JQueryJqGrid.html:35
+#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:35
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:47
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:50
msgid "Export as CSV"
msgstr ""
-#: templates/blocks/DataTables.html:68 templates/blocks/JQueryJqGrid.html:29
+#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:29
#: templates/blocks/JQueryJqGrid.html:35
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:47
msgid "CSV"
msgstr ""
-#: templates/blocks/DataTables.html:75 templates/blocks/JQueryJqGrid.html:42
-#: templates/blocks/bs_form_snippet.html:59
-#: templates/blocks/bs_form_snippet.html:98
-#: templates/ishtar/manage_basket.html:13 templates/window.html:39
+#: templates/blocks/DataTables.html:69 templates/blocks/JQueryJqGrid.html:42
+#: templates/blocks/bs_form_snippet.html:88
+#: templates/ishtar/manage_basket.html:14 templates/window.html:39
msgid "Add"
msgstr ""
-#: templates/blocks/DataTables.html:171
+#: templates/blocks/DataTables.html:177
msgid "Select all items"
msgstr ""
-#: templates/blocks/DataTables.html:172
-msgid "Select none"
+#: templates/blocks/DataTables.html:182
+#| msgid "Hide selected"
+msgid "Deselect"
msgstr ""
#: templates/blocks/JQueryAdvancedTown.html:3
@@ -2543,27 +2705,29 @@ msgstr ""
msgid "Search and select an item"
msgstr ""
+#: templates/blocks/JQueryJqGrid.html:16
+msgid "Pinned search:"
+msgstr ""
+
#: templates/blocks/JQueryJqGrid.html:116
msgid "An error as occured during search. Check your query fields."
msgstr ""
-#: templates/blocks/bs_form_snippet.html:25
+#: templates/blocks/bs_form_snippet.html:26
msgid "help"
msgstr ""
-#: templates/blocks/bs_form_snippet.html:47
+#: templates/blocks/bs_form_snippet.html:48
msgid "Criteria search"
msgstr ""
-#: templates/blocks/bs_form_snippet.html:62
-#: templates/blocks/bs_form_snippet.html:101
+#: templates/blocks/bs_form_snippet.html:91
#: templates/widgets/search_input.html:17
msgid "Clear"
msgstr ""
-#: templates/blocks/bs_form_snippet.html:64
-#: templates/blocks/bs_form_snippet.html:103
-#: templates/ishtar/manage_basket.html:24 templates/ishtar/sheet.html:49
+#: templates/blocks/bs_form_snippet.html:93
+#: templates/ishtar/manage_basket.html:28 templates/ishtar/sheet.html:49
msgid "Close"
msgstr ""
@@ -2583,34 +2747,39 @@ msgstr ""
msgid "Show / hide advanced search"
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:11
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:20
msgid ""
"Simple menu limited to your own items. Be careful only the last 100 items "
"are displayed."
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
-#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:8
+#: templates/ishtar/blocks/shortcut_menu.html:8
msgid "Advanced menu"
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
-#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:8
+#: templates/ishtar/blocks/shortcut_menu.html:8
msgid "advanced"
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:11
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:12
msgid "Search within my items"
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:16
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:17
msgid "Search within all items"
msgstr ""
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:42
-#: templates/ishtar/blocks/shortcut_menu.html:30
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:31
+#: templates/ishtar/blocks/shortcut_menu.html:13
+msgid "Refresh current page"
+msgstr ""
+
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:51
+#: templates/ishtar/blocks/shortcut_menu.html:39
msgid "Unpin"
msgstr ""
@@ -2638,7 +2807,8 @@ msgstr ""
#: templates/ishtar/blocks/modify_toolbar.html:1
#: templates/ishtar/blocks/window_image.html:11
-#: templates/ishtar/blocks/window_nav.html:44
+#: templates/ishtar/blocks/window_nav.html:47
+#: templates/ishtar/forms/qa_base.html:57
#: templates/ishtar/organization_form.html:37
#: templates/ishtar/organization_person_form.html:32
#: templates/ishtar/person_form.html:43
@@ -2668,7 +2838,8 @@ msgid "Licenses"
msgstr ""
#: templates/ishtar/blocks/window_image_detail.html:111
-#: templates/ishtar/import_delete.html:20 views_item.py:458 wizards.py:393
+#: templates/ishtar/import_delete.html:20 templatetags/window_field.py:17
+#: views_item.py:473 wizards.py:393
msgid "Yes"
msgstr ""
@@ -2691,27 +2862,28 @@ msgstr ""
msgid "Restore this version"
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:34
-msgid "Actions"
+#: templates/ishtar/blocks/window_nav.html:36
+#: templates/ishtar/blocks/window_nav.html:38
+msgid "Pin"
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:37
+#: templates/ishtar/blocks/window_nav.html:38
msgid "Item pined in your shortcut menu."
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:37
-msgid "Pin"
+#: templates/ishtar/blocks/window_nav.html:43
+msgid "Actions"
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:55
+#: templates/ishtar/blocks/window_nav.html:61
msgid "Export as OpenOffice.org file"
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:58
+#: templates/ishtar/blocks/window_nav.html:64
msgid "Export as PDF file"
msgstr ""
-#: templates/ishtar/blocks/window_nav.html:66
+#: templates/ishtar/blocks/window_nav.html:72
msgid "Relation between items are not historized."
msgstr ""
@@ -2819,6 +2991,27 @@ msgstr ""
msgid "Validate"
msgstr ""
+#: templates/ishtar/forms/bookmark_delete.html:5
+#| msgid "Are you sure you want to delete?"
+msgid "Are you sure you want to delete: "
+msgstr ""
+
+#: templates/ishtar/forms/qa_base.html:25
+#: templates/ishtar/forms/qa_form.html:12
+#| msgid "Modified"
+msgid "Modified items"
+msgstr ""
+
+#: templates/ishtar/forms/qa_base.html:62
+#: templates/ishtar/import_step_by_step.html:126
+#: templates/ishtar/import_step_by_step.html:305
+#: templates/ishtar/organization_form.html:40
+#: templates/ishtar/organization_person_form.html:35
+#: templates/ishtar/person_form.html:46
+#: templates/ishtar/wizard/validation_bar.html:20
+msgid "Cancel"
+msgstr ""
+
#: templates/ishtar/forms/search_query.html:5
#: templates/widgets/search_input.html:26
msgid "Bookmark this search"
@@ -2832,7 +3025,8 @@ msgid "New"
msgstr ""
#: templates/ishtar/forms/success.html:20
-msgid "Form successfully submited"
+#| msgid "Password reset successfully"
+msgid "Changes made successfully."
msgstr ""
#: templates/ishtar/formset_import_match.html:5
@@ -2891,7 +3085,7 @@ msgstr ""
msgid "Go"
msgstr ""
-#: templates/ishtar/import_step_by_step.html:63 views.py:1017
+#: templates/ishtar/import_step_by_step.html:63 views.py:1063
msgid "Import step by step"
msgstr ""
@@ -2937,15 +3131,6 @@ msgstr ""
msgid "Update source file"
msgstr ""
-#: templates/ishtar/import_step_by_step.html:126
-#: templates/ishtar/import_step_by_step.html:305
-#: templates/ishtar/organization_form.html:40
-#: templates/ishtar/organization_person_form.html:35
-#: templates/ishtar/person_form.html:46
-#: templates/ishtar/wizard/validation_bar.html:20
-msgid "Cancel"
-msgstr ""
-
#: templates/ishtar/import_step_by_step.html:148
msgid "No change for this item."
msgstr ""
@@ -3045,11 +3230,11 @@ msgctxt "not a directory"
msgid "File"
msgstr ""
-#: templates/ishtar/manage_basket.html:8
+#: templates/ishtar/manage_basket.html:9
msgid "Checking \"Select all\" only selects the current page."
msgstr ""
-#: templates/ishtar/manage_basket.html:16
+#: templates/ishtar/manage_basket.html:19
msgid "Basket content"
msgstr ""
@@ -3138,21 +3323,26 @@ msgstr ""
msgid "Associated operations as scientist"
msgstr ""
-#: templates/ishtar/sheet_person.html:86
+#: templates/ishtar/sheet_person.html:87
msgid "Associated operations as responsible"
msgstr ""
-#: templates/ishtar/sheet_person.html:91
+#: templates/ishtar/sheet_person.html:92
+#| msgid "Associated operations as scientist"
+msgid "Associated operations as collaborator"
+msgstr ""
+
+#: templates/ishtar/sheet_person.html:97
#: templates/ishtar/wizard/wizard_person_deletion.html:6
msgid "In charge of archaeological files"
msgstr ""
-#: templates/ishtar/sheet_person.html:96
+#: templates/ishtar/sheet_person.html:102
#: templates/ishtar/wizard/wizard_person_deletion.html:15
msgid "General contractor of archaeological files"
msgstr ""
-#: templates/ishtar/sheet_person.html:101
+#: templates/ishtar/sheet_person.html:107
#: templates/ishtar/wizard/wizard_person_deletion.html:24
msgid "Responsible for planning service of archaeological files"
msgstr ""
@@ -3457,11 +3647,15 @@ msgstr ""
msgid "Bookmarks"
msgstr ""
-#: templatetags/window_tables.py:88 widgets.py:1039
+#: templatetags/window_field.py:22 wizards.py:395
+msgid "No"
+msgstr ""
+
+#: templatetags/window_tables.py:88 widgets.py:1061
msgid "No results"
msgstr ""
-#: templatetags/window_tables.py:89 widgets.py:1040
+#: templatetags/window_tables.py:89 widgets.py:1062
msgid "Loading..."
msgstr ""
@@ -3469,159 +3663,162 @@ msgstr ""
msgid "You don't have sufficient permissions to do this action."
msgstr ""
-#: utils.py:265
+#: utils.py:338
msgid " (...)"
msgstr ""
-#: utils.py:338
+#: utils.py:418
msgid "Information"
msgstr ""
-#: utils.py:339
+#: utils.py:419
msgid "Load another random image?"
msgstr ""
-#: views.py:82
+#: views.py:83
msgid ""
"PROJECT_SLUG is set to \"default\". Change it in your local_settings (or ask "
"your admin to do it)."
msgstr ""
-#: views.py:87
+#: views.py:88
msgid ""
"The slug of your current profile is set to \"default\". Change it on the "
"administration page (or ask your admin to do it)."
msgstr ""
-#: views.py:113
+#: views.py:114
msgid "New person"
msgstr ""
-#: views.py:121
+#: views.py:122
msgid "Person modification"
msgstr ""
-#: views.py:136
+#: views.py:137
msgid "Person deletion"
msgstr ""
-#: views.py:147
+#: views.py:148
msgid "New organization"
msgstr ""
-#: views.py:154
+#: views.py:155
msgid "Organization modification"
msgstr ""
-#: views.py:170
+#: views.py:171
msgid "Organization deletion"
msgstr ""
-#: views.py:181
+#: views.py:182
msgid "Account management"
msgstr ""
-#: views.py:187
+#: views.py:188
msgid "Account deletion"
msgstr ""
-#: views.py:251
-msgid "Archaeological file"
-msgstr ""
-
#: views.py:252
-msgid "Operation"
-msgstr ""
-
-#: views.py:254
-msgid "Context record"
+msgid "Archaeological file"
msgstr ""
-#: views.py:256
-msgid "Find"
+#: views.py:259
+#| msgid "Warehouse type"
+msgid "Warehouse"
msgstr ""
-#: views.py:258
+#: views.py:263
msgid "Treatment request"
msgstr ""
-#: views.py:259
+#: views.py:264
msgid "Treatment"
msgstr ""
-#: views.py:661 views_item.py:91
+#: views.py:706 views_item.py:95
msgid "Operation not permitted."
msgstr ""
-#: views.py:678 views.py:736
+#: views.py:723 views.py:781
msgid "Archaeological files"
msgstr ""
-#: views.py:683 views.py:747
+#: views.py:728 views.py:792
msgid "Finds"
msgstr ""
-#: views.py:685 views.py:752
+#: views.py:730 views.py:797
msgid "Treatment requests"
msgstr ""
-#: views.py:686 views.py:758
+#: views.py:731 views.py:803
msgid "Treatments"
msgstr ""
-#: views.py:1359
+#: views.py:1405
msgid "Col. "
msgstr ""
-#: views.py:1365 views.py:1377
+#: views.py:1411 views.py:1423
msgid "* empty *"
msgstr ""
-#: views.py:1418
+#: views.py:1464
msgid "Link unmatched items"
msgstr ""
-#: views.py:1439
+#: views.py:1485
msgid "Delete import"
msgstr ""
-#: views.py:1478
+#: views.py:1524
msgid "Merge persons"
msgstr ""
-#: views.py:1502
+#: views.py:1548
msgid "Select the main person"
msgstr ""
-#: views.py:1511
+#: views.py:1557
msgid "Merge organization"
msgstr ""
-#: views.py:1521
+#: views.py:1567
msgid "Select the main organization"
msgstr ""
-#: views.py:1561 views.py:1577
+#: views.py:1607 views.py:1623
msgid "Corporation manager"
msgstr ""
-#: views.py:1598
+#: views.py:1644
msgid "Document: search"
msgstr ""
-#: views.py:1613
+#: views.py:1659
msgid "Document creation"
msgstr ""
-#: views.py:1646
+#: views.py:1692
msgid "Document modification"
msgstr ""
-#: views.py:1676
+#: views.py:1722
msgid "Document deletion"
msgstr ""
-#: views_item.py:93
+#: views.py:1805
+#| msgid "Delete import"
+msgid "Delete bookmark"
+msgstr ""
+
+#: views.py:1828
+#| msgid "Bookmarks"
+msgid "Bookmark - Delete"
+msgstr ""
+
+#: views_item.py:97
#, python-format
msgid "New %s"
msgstr ""
@@ -3630,31 +3827,27 @@ msgstr ""
msgid "The character \" is not accepted."
msgstr ""
-#: widgets.py:509
+#: widgets.py:513
msgid "{} is not a valid key for {}"
msgstr ""
-#: widgets.py:610 widgets.py:744 widgets.py:859
+#: widgets.py:614 widgets.py:748 widgets.py:863
msgid "Search..."
msgstr ""
-#: widgets.py:679
+#: widgets.py:683
msgid "Previous value:"
msgstr ""
-#: widgets.py:1041
+#: widgets.py:1063
msgid "Remove"
msgstr ""
-#: wizards.py:395
-msgid "No"
-msgstr ""
-
#: wizards.py:431
msgid "Deleted"
msgstr ""
-#: wizards.py:1717
+#: wizards.py:1742
#, python-format
msgid "[%(app_name)s] Account creation/modification"
msgstr ""
diff --git a/ishtar_common/management/commands/generate_rights.py b/ishtar_common/management/commands/generate_rights.py
deleted file mode 100644
index 75b1cf807..000000000
--- a/ishtar_common/management/commands/generate_rights.py
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# Copyright (C) 2011 Étienne Loks <etienne.loks_AT_peacefrogsDOTnet>
-
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-# See the file COPYING for details.
-
-import sys
-
-from django.core.management.base import BaseCommand, CommandError
-from django.core.exceptions import ObjectDoesNotExist
-
-import ishtar_base.forms_main as ishtar_forms
-import ishtar_base.models as models
-
-class Command(BaseCommand):
- args = ''
- help = 'Regenerate rights for current forms'
-
- def handle(self, *args, **options):
- wizards = []
- wizard_steps = {}
- for attr in dir(ishtar_forms):
- if not attr.endswith('_wizard'):
- continue
- wizard = getattr(ishtar_forms, attr)
- url_name = wizard.url_name
- try:
- wizard_obj = models.Wizard.objects.get(url_name=url_name)
- except ObjectDoesNotExist:
- wizard_obj = models.Wizard.objects.create(url_name=url_name)
- wizard_obj.save()
- #self.stdout.write('* Wizard "%s" added\n' % url_name)
- sys.stdout.write('* Wizard "%s" added\n' % url_name)
- wizard_steps[url_name] = []
- for idx, step_url_name in enumerate(wizard.form_list.keys()):
- form = wizard.form_list[step_url_name]
- if issubclass(form, ishtar_forms.FinalForm):
- break # don't reference the final form
- step_values = {'name':unicode(form.form_label),
- 'order':idx}
- try:
- step_obj = models.WizardStep.objects.get(wizard=wizard_obj,
- url_name=step_url_name)
- for k in step_values:
- setattr(step_obj, k, step_values[k])
- step_obj.save()
- except ObjectDoesNotExist:
- step_values.update({'wizard':wizard_obj,
- 'url_name':step_url_name})
- step_obj = models.WizardStep.objects.create(**step_values)
- step_obj.save()
- #self.stdout.write('* Wizard step "%s" added\n' \
- # % unicode(form.form_label))
- sys.stdout.write('* Wizard step "%s" added\n' \
- % unicode(form.form_label))
- wizard_steps[url_name].append(step_url_name)
- #self.stdout.write('Successfully regeneration of wizard rights\n')
- sys.stdout.write('Successfully regeneration of wizard rights\n')
diff --git a/ishtar_common/management/commands/reassociate_similar_images.py b/ishtar_common/management/commands/reassociate_similar_images.py
new file mode 100644
index 000000000..f6d432327
--- /dev/null
+++ b/ishtar_common/management/commands/reassociate_similar_images.py
@@ -0,0 +1,234 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import csv
+import datetime
+import hashlib
+import sys
+
+from django.core.management.base import BaseCommand
+
+from ishtar_common.models import Document
+
+BLOCKSIZE = 65536
+
+
+def get_hexdigest(filename):
+ m = hashlib.sha256()
+ with open(filename, 'rb') as afile:
+ buf = afile.read(BLOCKSIZE)
+ while len(buf) > 0:
+ m.update(buf)
+ buf = afile.read(BLOCKSIZE)
+ return m.hexdigest()
+
+
+class Command(BaseCommand):
+ help = 'Re-associate similar images in the database'
+
+ def add_arguments(self, parser):
+ parser.add_argument(
+ '--merge-title', type=str, default='', dest='merged-title',
+ help='If specified when title differs the given title will be '
+ 'used.')
+ parser.add_argument(
+ '--output-path', type=str, default='', dest='output-path',
+ help='Output path for results CSV files. Default to current path.')
+ parser.add_argument(
+ '--ignore-reference', dest='ignore-reference', action='store_true',
+ help='Ignore the reference on diff between models.')
+ parser.add_argument(
+ '--delete-missing', dest='delete-missing', action='store_true',
+ default=False, help='Delete document with missing images.')
+ parser.add_argument(
+ '--quiet', dest='quiet', action='store_true',
+ help='Quiet output.')
+
+ def handle(self, *args, **options):
+ quiet = options['quiet']
+ ignore_ref = options['ignore-reference']
+ delete_missing = options['delete-missing']
+ merged_title = options['merged-title']
+ output_path = options['output-path']
+
+ q = Document.objects.filter(image__isnull=False).exclude(
+ image='')
+ hashes = {}
+ missing_images = []
+ count = q.count()
+ out = sys.stdout
+ if not quiet:
+ out.write("* {} images\n".format(count))
+ for idx, doc in enumerate(q.all()):
+ if not quiet:
+ out.write("\r* hashes calculation: {} %".format(
+ int(float(idx + 1) / count * 100)))
+ out.flush()
+ path = doc.image.path
+ try:
+ hexdigest = get_hexdigest(path)
+ except IOError:
+ missing_images.append(doc.pk)
+ continue
+ if hexdigest not in hashes:
+ hashes[hexdigest] = []
+ hashes[hexdigest].append(doc.pk)
+ nb_missing_images = len(missing_images)
+ if not quiet:
+ out.write("\n* {} missing images\n".format(nb_missing_images))
+
+ if missing_images and delete_missing:
+ for nb, idx in enumerate(missing_images):
+ if not quiet:
+ out.write(
+ "\r* delete document with missing images: {} %".format(
+ int(float(nb + 1) / nb_missing_images * 100)))
+ out.flush()
+ doc = Document.objects.get(pk=idx)
+ doc.delete()
+ if not quiet:
+ out.write("\n")
+
+ attributes = [
+ 'title', 'associated_file', 'internal_reference', 'source_type',
+ 'support_type', 'format_type', 'scale',
+ 'authors_raw', 'associated_url', 'receipt_date', 'creation_date',
+ 'receipt_date_in_documentation', 'item_number', 'description',
+ 'comment', 'additional_information', 'duplicate'
+ ]
+ if not ignore_ref:
+ attributes.append('reference')
+
+ m2ms = ['authors', 'licenses']
+
+ nb_conflicted_items = 0
+ nb_merged_items = 0
+ distinct_image = 0
+ conflicts = []
+ merged = []
+
+ count = len(hashes)
+
+ for idx, hash in enumerate(hashes):
+ if not quiet:
+ out.write("\r* merge similar images: {} %".format(
+ int(float(idx + 1) / count * 100)))
+ out.flush()
+ if len(hashes[hash]) < 2:
+ distinct_image += 1
+ continue
+ items = [Document.objects.get(pk=pk) for pk in hashes[hash]]
+ ref_item = items[0]
+ other_items = items[1:]
+
+ for item in other_items:
+ ref_item = Document.objects.get(pk=ref_item.pk)
+ conflicted_values = []
+ for attr in attributes:
+ ref_value = getattr(ref_item, attr)
+ other_value = getattr(item, attr)
+ if ref_value:
+ if not other_value:
+ continue
+ if other_value != ref_value:
+ if attr == 'title' and merged_title:
+ setattr(ref_item, 'title', merged_title)
+ else:
+ conflicted_values.append(
+ (attr, ref_value, other_value)
+ )
+ else:
+ if not other_value:
+ continue
+ setattr(ref_item, attr, other_value)
+
+ base_csv = [
+ ref_item.pk,
+ ref_item.reference.encode('utf-8') if
+ ref_item.reference else "",
+ ref_item.cache_related_label.encode('utf-8') if
+ ref_item.cache_related_label else "",
+ ref_item.image.name.encode('utf-8'),
+ item.pk,
+ item.reference.encode('utf-8') if
+ item.reference else "",
+ item.cache_related_label.encode('utf-8') if
+ item.cache_related_label else "",
+ item.image.name.encode('utf-8'),
+ ]
+ if conflicted_values:
+ nb_conflicted_items += 1
+ for attr, ref_value, other_value in conflicted_values:
+ conflicts.append(base_csv + [
+ attr, unicode(ref_value).encode('utf-8'),
+ unicode(other_value).encode('utf-8')
+ ])
+ continue
+
+ merged.append(base_csv)
+
+ for m2m in m2ms:
+ for m2 in getattr(item, m2m).all():
+ if m2 not in getattr(ref_item, m2m):
+ getattr(ref_item, m2m).add(m2)
+
+ for rel_attr in Document.RELATED_MODELS:
+ ref_rel_items = [
+ r.pk for r in getattr(ref_item, rel_attr).all()]
+ for rel_item in getattr(item, rel_attr).all():
+ if rel_item.pk not in ref_rel_items:
+ getattr(ref_item, rel_attr).add(rel_item)
+
+ ref_item.skip_history_when_saving = True
+ ref_item.save()
+ item.delete()
+ nb_merged_items += 1
+ if not quiet:
+ out.write(u"\n")
+
+ n = datetime.datetime.now().isoformat().split('.')[0].replace(':', '-')
+ if conflicts:
+ filename = output_path + u"{}-conflict.csv".format(n)
+ with open(filename, 'w') as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(
+ ["Document 1 - pk", "Document 1 - Ref",
+ "Document 1 - related", "Document 1 - image path",
+ "Document 2 - pk", "Document 2 - Ref",
+ "Document 2 - related", "Document 2 - image path",
+ "Attribute", "Document 1 - value", "Document 2 - value"
+ ]
+ )
+ for conflict in conflicts:
+ writer.writerow(conflict)
+ if not quiet:
+ out.write(u"* {} conflicted items ({})\n".format(
+ nb_conflicted_items, filename))
+ if merged:
+ filename = output_path + u"{}-merged.csv".format(n)
+ with open(filename, 'w') as csvfile:
+ writer = csv.writer(csvfile)
+ writer.writerow(
+ ["Document 1 - pk", "Document 1 - Ref",
+ "Document 1 - related", "Document 1 - image path",
+ "Document 2 - pk", "Document 2 - Ref",
+ "Document 2 - related", "Document 2 - image path",
+ ]
+ )
+ for merge in merged:
+ writer.writerow(merge)
+ if not quiet:
+ out.write(u"* {} merged items ({})\n".format(nb_merged_items,
+ filename))
+ if not quiet:
+ out.write("* {} distinct images\n".format(distinct_image))
+
+
+
+
+
+
+
+
+
+
diff --git a/ishtar_common/migrations/0072_auto_20181008_1117.py b/ishtar_common/migrations/0072_auto_20181008_1117.py
new file mode 100644
index 000000000..203d56abb
--- /dev/null
+++ b/ishtar_common/migrations/0072_auto_20181008_1117.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-08 11:17
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0071_auto_20180926_1023'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='area',
+ options={'ordering': ('label',), 'verbose_name': 'Area', 'verbose_name_plural': 'Areas'},
+ ),
+ migrations.AddField(
+ model_name='ishtarsiteprofile',
+ name='find_use_index',
+ field=models.BooleanField(default=True, verbose_name='Use auto index for finds'),
+ ),
+ ]
diff --git a/ishtar_common/migrations/0073_auto_20181017_1642.py b/ishtar_common/migrations/0073_auto_20181017_1642.py
new file mode 100644
index 000000000..42e905b2c
--- /dev/null
+++ b/ishtar_common/migrations/0073_auto_20181017_1642.py
@@ -0,0 +1,44 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 16:42
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import virtualtime
+
+from ishtar_common.utils_migrations import reinit_last_modified
+
+
+def migrate_codes(apps, schema_editor):
+ models = ['Person', 'Organization']
+ reinit_last_modified(apps, 'ishtar_common', models)
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0072_auto_20181008_1117'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='historicalorganization',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='historicalperson',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='organization',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.AddField(
+ model_name='person',
+ name='last_modified',
+ field=models.DateTimeField(default=virtualtime.virtual_datetime.now),
+ ),
+ migrations.RunPython(migrate_codes)
+ ]
diff --git a/ishtar_common/migrations/0074_auto_20181017_1854.py b/ishtar_common/migrations/0074_auto_20181017_1854.py
new file mode 100644
index 000000000..bfb3910fa
--- /dev/null
+++ b/ishtar_common/migrations/0074_auto_20181017_1854.py
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.10 on 2018-10-17 18:54
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0073_auto_20181017_1642'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='historicalorganization',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='historicalperson',
+ name='last_modified',
+ field=models.DateTimeField(blank=True, editable=False),
+ ),
+ migrations.AlterField(
+ model_name='organization',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ migrations.AlterField(
+ model_name='person',
+ name='last_modified',
+ field=models.DateTimeField(auto_now=True),
+ ),
+ ]
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 5c2875fc5..82c754fa0 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -294,11 +294,13 @@ class OwnPerms(object):
sorted(owns, key=lambda x: x[0][label_key]))
@classmethod
- def get_owns(cls, user, replace_query={}, limit=None, values=None,
- get_short_menu_class=False):
+ def get_owns(cls, user, replace_query=None, limit=None, values=None,
+ get_short_menu_class=False, menu_filtr=None):
"""
Get Own items
"""
+ if not replace_query:
+ replace_query = {}
if hasattr(user, 'is_authenticated') and not user.is_authenticated():
returned = cls.objects.filter(pk__isnull=True)
if values:
@@ -653,19 +655,24 @@ class GeneralType(Cached, models.Model):
if not cache_key:
return cls._get_types(base_dct, instances, exclude=exclude,
default=default)
- vals = [v for v in cls._get_types(
- base_dct, instances, exclude=exclude,
- default=default)]
+ vals = [
+ v for v in cls._get_types(base_dct, instances, exclude=exclude,
+ default=default)
+ ]
cache.set(cache_key, vals, settings.CACHE_TIMEOUT)
return vals
@classmethod
- def _get_types(cls, dct={}, instances=False, exclude=[], default=None):
+ def _get_types(cls, dct=None, instances=False, exclude=None, default=None):
+ if not dct:
+ dct = {}
+ if not exclude:
+ exclude = []
dct['available'] = True
if default:
try:
default = cls.objects.get(txt_idx=default)
- yield(default.pk, _(unicode(default)))
+ yield (default.pk, _(unicode(default)))
except cls.DoesNotExist:
pass
items = cls.objects.filter(**dct)
@@ -684,6 +691,34 @@ class GeneralType(Cached, models.Model):
yield (item.pk, _(unicode(item))
if item and unicode(item) else '')
+ @classmethod
+ def _get_childs_list(cls, dct=None, exclude=None, instances=False):
+ if not dct:
+ dct = {}
+ if not exclude:
+ exclude = []
+ if 'parent' in dct:
+ dct.pop('parent')
+ childs = cls.objects.filter(**dct)
+ if exclude:
+ childs = childs.exclude(txt_idx__in=exclude)
+ if hasattr(cls, 'order'):
+ childs = childs.order_by('order')
+ res = {}
+ if instances:
+ for item in childs.all():
+ parent_id = item.parent_id or 0
+ if parent_id not in res:
+ res[parent_id] = []
+ res[parent_id].append(item)
+ else:
+ for item in childs.values("id", "parent_id", "label").all():
+ parent_id = item["parent_id"] or 0
+ if parent_id not in res:
+ res[parent_id] = []
+ res[parent_id].append((item["id"], item["label"]))
+ return res
+
PREFIX = "&#x2502; "
PREFIX_EMPTY = "&nbsp; "
PREFIX_MEDIUM = "&#x251C; "
@@ -691,19 +726,19 @@ class GeneralType(Cached, models.Model):
PREFIX_CODES = [u"\u2502", u"\u251C", u"\u2514"]
@classmethod
- def _get_childs(cls, item, dct, prefix=0, instances=False, exclude=[],
- is_last=False, last_of=[]):
+ def _get_childs(cls, item, child_list, prefix=0, instances=False,
+ is_last=False, last_of=None):
+ if not last_of:
+ last_of = []
+
prefix += 1
- dct['parent'] = item
- childs = cls.objects.filter(**dct)
- if exclude:
- childs = childs.exclude(txt_idx__in=exclude)
- if hasattr(cls, 'order'):
- childs = childs.order_by('order')
+ current_child_lst = []
+ if item in child_list:
+ current_child_lst = child_list[item]
+
lst = []
- child_lst = childs.all()
- total = len(child_lst)
- for idx, child in enumerate(child_lst):
+ total = len(current_child_lst)
+ for idx, child in enumerate(current_child_lst):
mylast_of = last_of[:]
if instances:
child.rank = prefix
@@ -730,16 +765,21 @@ class GeneralType(Cached, models.Model):
else:
p += cls.PREFIX
lst.append((
- child.pk, SafeUnicode(p + unicode(_(unicode(child))))
+ child[0], SafeUnicode(p + unicode(_(child[1])))
))
clast_of = last_of[:]
clast_of.append(idx + 1 == total)
+ if instances:
+ child_id = child.id
+ else:
+ child_id = child[0]
for sub_child in cls._get_childs(
- child, dct, prefix, instances, exclude=exclude,
+ child_id, child_list, prefix, instances,
is_last=((idx + 1) == total), last_of=clast_of):
lst.append(sub_child)
return lst
+
@classmethod
def _get_parent_types(cls, dct={}, instances=False, exclude=[],
default=None):
@@ -750,15 +790,21 @@ class GeneralType(Cached, models.Model):
items = items.exclude(txt_idx__in=exclude)
if hasattr(cls, 'order'):
items = items.order_by('order')
- for item in items.all():
- if instances:
- item.rank = 0
- yield item
- else:
- yield (item.pk, unicode(item))
- for child in cls._get_childs(item, dct, instances,
- exclude=exclude):
- yield child
+
+ child_list = cls._get_childs_list(dct, exclude, instances)
+
+ if 0 in child_list:
+ for item in child_list[0]:
+ if instances:
+ item.rank = 0
+ item_id = item.pk
+ yield item
+ else:
+ item_id = item[0]
+ yield item
+ for child in cls._get_childs(
+ item_id, child_list, instances=instances):
+ yield child
def save(self, *args, **kwargs):
if not self.id and not self.label:
@@ -1218,16 +1264,15 @@ class FullSearch(models.Model):
if self.BASE_SEARCH_VECTORS:
# query "simple" fields
- q = base_q.annotate(
- search=SearchVector(
- *self.BASE_SEARCH_VECTORS,
- config=settings.ISHTAR_SEARCH_LANGUAGE
- )).values('search')
- search_vectors.append(
- unidecode(
- q.all()[0]['search'].decode('utf-8')
- )
- )
+ q = base_q.values(*self.BASE_SEARCH_VECTORS)
+ res = q.all()[0]
+ for base_search_vector in self.BASE_SEARCH_VECTORS:
+ data = res[base_search_vector]
+ data = unidecode(unicode(data))
+ with connection.cursor() as cursor:
+ cursor.execute("SELECT to_tsvector(%s)", [data])
+ row = cursor.fetchone()
+ search_vectors.append(row[0])
if self.PROPERTY_SEARCH_VECTORS:
for attr in self.PROPERTY_SEARCH_VECTORS:
@@ -1327,7 +1372,7 @@ class DocumentItem(object):
"""
For sheet template: return "Add document / image" action
"""
- # url, base_text, icon, extra_text, extra css class
+ # url, base_text, icon, extra_text, extra css class, is a quick action
actions = []
if not hasattr(self, 'SLUG'):
@@ -1347,7 +1392,8 @@ class DocumentItem(object):
_(u"Add document/image"),
"fa fa-plus",
_(u"doc./image"),
- ""
+ "",
+ False
)
]
return actions
@@ -1368,6 +1414,7 @@ class BaseHistorizedItem(DocumentItem, FullSearch, Imported, JsonData,
history_creator = models.ForeignKey(
User, related_name='+', on_delete=models.SET_NULL,
verbose_name=_(u"Creator"), blank=True, null=True)
+ last_modified = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
@@ -1649,10 +1696,87 @@ class SearchQuery(models.Model):
class ShortMenuItem(object):
+ """
+ Item available in the short menu
+ """
+ UP_MODEL_QUERY = {}
+
@classmethod
def get_short_menu_class(cls, pk):
return ''
+ @property
+ def short_class_name(self):
+ return ""
+
+
+class QuickAction(object):
+ """
+ Quick action available from tables
+ """
+ def __init__(self, url, icon_class='', text='', target=None, rights=None,
+ module=None):
+ self.url = url
+ self.icon_class = icon_class
+ self.text = text
+ self.rights = rights
+ self.target = target
+ self.module = module
+ assert self.target in ('one', 'many', None)
+
+ def is_available(self, user, session=None, obj=None):
+ if self.module and not getattr(get_current_profile(), self.module):
+ return False
+ if not self.rights: # no restriction
+ return True
+ if not user or not hasattr(user, 'ishtaruser') or not user.ishtaruser:
+ return False
+ user = user.ishtaruser
+
+ for right in self.rights:
+ if user.has_perm(right, session=session, obj=obj):
+ return True
+ return False
+
+ @property
+ def rendered_icon(self):
+ if not self.icon_class:
+ return ""
+ return u"<i class='{}' aria-hidden='true'></i>".format(self.icon_class)
+
+ @property
+ def base_url(self):
+ if self.target is None:
+ url = reverse(self.url)
+ else:
+ # put arbitrary pk for the target
+ url = reverse(self.url, args=[0])
+ url = url[:-2] # all quick action url have to finish with the
+ # pk of the selected item and a "/"
+ return url
+
+
+class MainItem(ShortMenuItem):
+ """
+ Item with quick actions available from tables
+ """
+ QUICK_ACTIONS = []
+
+ @classmethod
+ def get_quick_actions(cls, user, session=None, obj=None):
+ """
+ Get a list of (url, title, icon, target) actions for an user
+ """
+ qas = []
+ for action in cls.QUICK_ACTIONS:
+ if not action.is_available(user, session=session, obj=obj):
+ continue
+ qas.append([action.base_url,
+ mark_safe(action.text),
+ mark_safe(action.rendered_icon),
+ action.target or ""])
+ return qas
+
class LightHistorizedItem(BaseHistorizedItem):
history_date = models.DateTimeField(default=datetime.datetime.now)
@@ -1865,6 +1989,8 @@ class IshtarSiteProfile(models.Model, Cached):
u"Change this with care. With incorrect formula, the "
u"application might be unusable and import of external "
u"data can be destructive."))
+ find_use_index = models.BooleanField(_(u"Use auto index for finds"),
+ default=True)
currency = models.CharField(_(u"Currency"), default=u"€",
choices=CURRENCY, max_length=5)
@@ -3282,7 +3408,7 @@ class IshtarUser(FullSearch):
return self.person.full_label()
-class Basket(models.Model):
+class Basket(FullSearch):
"""
Abstract class for a basket
Subclass must be defined with an "items" ManyToManyField
@@ -3290,8 +3416,19 @@ class Basket(models.Model):
IS_BASKET = True
label = models.CharField(_(u"Label"), max_length=1000)
comment = models.TextField(_(u"Comment"), blank=True, null=True)
- user = models.ForeignKey(IshtarUser, blank=True, null=True)
+ user = models.ForeignKey(
+ IshtarUser, blank=True, null=True, related_name='%(class)ss',
+ verbose_name=_(u"Owner"))
available = models.BooleanField(_(u"Available"), default=True)
+ shared_with = models.ManyToManyField(
+ IshtarUser, verbose_name=_(u"Shared with"), blank=True,
+ related_name='shared_%(class)ss'
+ )
+
+ TABLE_COLS = ['label', 'user']
+
+ BASE_SEARCH_VECTORS = ['label', 'comment']
+ M2M_SEARCH_VECTORS = ['items']
class Meta:
abstract = True
@@ -3300,6 +3437,13 @@ class Basket(models.Model):
def __unicode__(self):
return self.label
+ @classmethod
+ def BASE_REQUEST(cls, request):
+ if not request.user or not getattr(request.user, 'ishtaruser', None):
+ return Q(pk=None)
+ ishtaruser = request.user.ishtaruser
+ return Q(user=ishtaruser) | Q(shared_with=ishtaruser)
+
@property
def cached_label(self):
return unicode(self)
@@ -3516,6 +3660,30 @@ class Document(OwnPerms, ImageModel, FullSearch, Imported):
pgettext_lazy("key for text search", u"has-duplicate"),
'duplicate'
),
+ 'operation': (
+ pgettext_lazy("key for text search", u"operation"),
+ 'operations__cached_label__iexact'
+ ),
+ 'context_record': (
+ pgettext_lazy("key for text search", u"context-record"),
+ 'context_records__cached_label__iexact'
+ ),
+ 'find': (
+ pgettext_lazy("key for text search", u"find"),
+ 'finds__cached_label__iexact'
+ ),
+ 'file': (
+ pgettext_lazy("key for text search", u"file"),
+ 'files__cached_label__iexact'
+ ),
+ 'site': (
+ pgettext_lazy("key for text search", u"site"),
+ 'sites__cached_label__iexact'
+ ),
+ 'warehouse': (
+ pgettext_lazy("key for text search", u"warehouse"),
+ 'warehouses__name__iexact'
+ ),
}
for v in ALT_NAMES.values():
for language_code, language_lbl in settings.LANGUAGES:
@@ -3524,6 +3692,37 @@ class Document(OwnPerms, ImageModel, FullSearch, Imported):
deactivate()
objects = ExternalIdManager()
+ RELATED_MODELS_ALT = [
+ 'finds', 'context_records', 'operations', 'sites', 'files',
+ 'warehouses', 'treatments', 'treatment_files',
+ ]
+ RELATIVE_SESSION_NAMES = [
+ ('find', 'finds__pk'),
+ ('contextrecord', 'context_records__pk'),
+ ('operation', 'operations__pk'),
+ ('site', 'sites__pk'),
+ ('file', 'files__pk'),
+ ('warehouse', 'warehouses__pk'),
+ ('treatment', 'treatments__pk'),
+ ('treatmentfile', 'treatment_files__pk'),
+ ]
+
+ UP_MODEL_QUERY = {
+ "operation": (pgettext_lazy("key for text search", u"operation"),
+ 'cached_label'),
+ "contextrecord": (pgettext_lazy("key for text search",
+ u"context-record"), 'cached_label'),
+ "file": (pgettext_lazy("key for text search", u"file"), 'cached_label'),
+ "find": (pgettext_lazy("key for text search", u"find"), 'cached_label'),
+ "site": (pgettext_lazy("key for text search", u"site"), 'cached_label'),
+ "warehouse": (pgettext_lazy("key for text search", u"warehouse"),
+ 'cached_label'),
+ "treatment": (pgettext_lazy("key for text search", u"treatment"),
+ 'cached_label'),
+ "treatmentfile": (pgettext_lazy("key for text search",
+ u"treatment-file"), 'cached_label'),
+ }
+
title = models.TextField(_(u"Title"), blank=True, default='')
associated_file = models.FileField(
upload_to=get_image_path, blank=True, null=True, max_length=255)
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index 2dec39c84..9aae1d52d 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -238,9 +238,18 @@ def get_associated_model(parent_model, keys):
OBJECT_CLS = import_class(parent_model)
else:
OBJECT_CLS = parent_model
+ fields = get_model_fields(OBJECT_CLS)
for idx, item in enumerate(keys):
if not idx:
- field = get_model_fields(OBJECT_CLS)[item]
+ if item not in fields:
+ raise ImporterError(
+ unicode(
+ _(u"Importer configuration error: "
+ u"\"{}\" is not available for \"{}\"."
+ u" Check your default and column "
+ u"configuration")).format(
+ item, OBJECT_CLS.__name__))
+ field = fields[item]
if hasattr(field, 'rel') and hasattr(field.rel, 'to'):
model = field.rel.to
if type(field) == ModelBase:
@@ -390,7 +399,7 @@ class ImporterColumn(models.Model):
return u', '.join([target.target for target in self.targets.all()])
def duplicate_fields_lbl(self):
- return u', '.join([dp.field_name
+ return u', '.join([dp.field_name or u""
for dp in self.duplicate_fields.all()])
@@ -1058,8 +1067,8 @@ class Import(models.Model):
put_session_message(
session_key,
unicode(
- _(u"Modification check {} added to the queue")).format(
- self.name),
+ _(u"Modification check {} added to the queue")
+ ).format(self.name),
"info")
self.state = 'HQ'
self.end_date = datetime.datetime.now()
diff --git a/ishtar_common/static/bootstrap/bootstrap.css b/ishtar_common/static/bootstrap/bootstrap.css
index 81e3750bd..ead2941d9 100644
--- a/ishtar_common/static/bootstrap/bootstrap.css
+++ b/ishtar_common/static/bootstrap/bootstrap.css
@@ -3,4 +3,4 @@
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#6f3b93;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#542c6f;text-decoration:none}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace, monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:rgba(0,0,0,0)}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,0.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{background-color:#71dd8a}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{background-color:#34ce57}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label::before,.custom-file-input.is-valid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,0.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{background-color:#efa2a9}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{background-color:#e4606d}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label::before,.custom-file-input.is-invalid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-link{font-weight:400;color:#6f3b93;background-color:transparent}.btn-link:hover{color:#542c6f;text-decoration:none;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:none;border-color:transparent;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;transition:opacity 0.15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height 0.35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file:focus{z-index:3}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(128,189,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#6f3b93;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#542c6f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:hover,.badge-info[href]:focus{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:hover,.badge-light[href]:focus{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width 0.6s ease}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover,.close:focus{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -25%)}.modal.show .modal-dialog{transform:translate(0, 0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:.5rem .5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:.5rem .5rem .5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 .5rem .5rem .5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:.5rem 0 .5rem .5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;align-items:center;width:100%;transition:transform 0.6s ease;backface-visibility:hidden;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translateX(0)}@supports (transform-style: preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translate3d(0, 0, 0)}}.carousel-item-next,.active.carousel-item-right{transform:translateX(100%)}@supports (transform-style: preserve-3d){.carousel-item-next,.active.carousel-item-right{transform:translate3d(100%, 0, 0)}}.carousel-item-prev,.active.carousel-item-left{transform:translateX(-100%)}@supports (transform-style: preserve-3d){.carousel-item-prev,.active.carousel-item-left{transform:translate3d(-100%, 0, 0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{transform:translateX(0)}@supports (transform-style: preserve-3d){.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{transform:translate3d(0, 0, 0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0062cc !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#545b62 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#1e7e34 !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#117a8b !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#d39e00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#bd2130 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#1d2124 !important}.text-muted{color:#6c757d !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}.switch{font-size:1rem;position:relative}.switch input{position:absolute;height:1px;width:1px;background:none;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;padding:0}.switch input+label{position:relative;min-width:calc(calc(2.375rem * .8) * 2);border-radius:calc(2.375rem * .8);height:calc(2.375rem * .8);line-height:calc(2.375rem * .8);display:inline-block;cursor:pointer;outline:none;user-select:none;vertical-align:middle;text-indent:calc(calc(calc(2.375rem * .8) * 2) + .5rem)}.switch input+label::before,.switch input+label::after{content:'';position:absolute;top:0;left:0;width:calc(calc(2.375rem * .8) * 2);bottom:0;display:block}.switch input+label::before{right:0;background-color:#dee2e6;border-radius:calc(2.375rem * .8);transition:0.2s all}.switch input+label::after{top:2px;left:2px;width:calc(calc(2.375rem * .8) - calc(2px * 2));height:calc(calc(2.375rem * .8) - calc(2px * 2));border-radius:50%;background-color:#fff;transition:0.2s all}.switch input:checked+label::before{background-color:#08d}.switch input:checked+label::after{margin-left:calc(2.375rem * .8)}.switch input:focus+label::before{outline:none;box-shadow:0 0 0 .2rem rgba(0,136,221,0.25)}.switch input:disabled+label{color:#868e96;cursor:not-allowed}.switch input:disabled+label::before{background-color:#e9ecef}.switch.switch-sm{font-size:.875rem}.switch.switch-sm input+label{min-width:calc(calc(1.9375rem * .8) * 2);height:calc(1.9375rem * .8);line-height:calc(1.9375rem * .8);text-indent:calc(calc(calc(1.9375rem * .8) * 2) + .5rem)}.switch.switch-sm input+label::before{width:calc(calc(1.9375rem * .8) * 2)}.switch.switch-sm input+label::after{width:calc(calc(1.9375rem * .8) - calc(2px * 2));height:calc(calc(1.9375rem * .8) - calc(2px * 2))}.switch.switch-sm input:checked+label::after{margin-left:calc(1.9375rem * .8)}.switch.switch-lg{font-size:1.25rem}.switch.switch-lg input+label{min-width:calc(calc(3rem * .8) * 2);height:calc(3rem * .8);line-height:calc(3rem * .8);text-indent:calc(calc(calc(3rem * .8) * 2) + .5rem)}.switch.switch-lg input+label::before{width:calc(calc(3rem * .8) * 2)}.switch.switch-lg input+label::after{width:calc(calc(3rem * .8) - calc(2px * 2));height:calc(calc(3rem * .8) - calc(2px * 2))}.switch.switch-lg input:checked+label::after{margin-left:calc(3rem * .8)}.switch+.switch{margin-left:1rem}.switch.danger input:checked+label::before{background-color:#dc3545}.switch.danger input:focus+label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}html{font-size:0.8em;background-color:#f8f9fa}body{background-color:transparent;position:relative}label{margin-bottom:.2rem;min-height:1.5rem}.form-group span label{display:inline-block}.form-group label{display:block}.form-group li label{display:inline-block}.form-group li .form-control{width:auto}.form-group li input[type="radio"].form-control,.form-group li input[type="checkbox"].form-control{display:inline}pre{white-space:pre-wrap}.raw-description{white-space:pre-line}.form-control.small-input,.input-group>.form-control.small-input{width:110px;flex:none}.input-group>input[type=checkbox]{margin:0.5em 1em}.form-row.odd{background-color:#e9ecef}.form-row-modal{padding:0.5rem 2rem}.field-tip{position:absolute;right:10px;top:5px;opacity:0.7}.form-group .select2-container--default .select2-selection--multiple{border:1px solid #ced4da}.page-link.imported-page{color:#aa8fda}.page-link.imported-page.current-page,.page-link.current-page{color:black;font-weight:bold}.modal-dialog.full{width:98%;height:98%;max-width:none;padding:1%}.modal-dialog.full .display.dataTable{width:100% !important}.modal-dialog.full .modal-content{height:auto;min-height:100%;border-radius:0}.table{background-color:white}.input-progress.form-control:focus,.input-progress{background-color:#dee2e6}.card-header,.input-progress,.table-striped tbody tr:nth-of-type(2n+1),.dt-bootstrap4 table.dataTable.stripe tbody tr.odd,.dt-bootstrap4 table.dataTable.display tbody tr.odd{background-color:#e9ecef}.dropdown-item:hover,.dropdown-item:focus,.dt-bootstrap4 table.dataTable.hover tbody tr:hover,.dt-bootstrap4 table.dataTable.display tbody tr:hover{background-color:#f6f6f6;background-color:#dee2e6}table.dataTable{font-size:0.8em}.table-modal-lg table.dataTable{font-size:1em}div.dt-buttons{float:right}.dt-button{color:#fff;background-color:#007bff;border-color:#007bff;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;border:1px solid transparent;color:#fff;background-color:#6c757d;border-color:#6c757d;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.dt-button:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.dt-button:focus,.dt-button.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.dt-button.disabled,.dt-button:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.dt-button:not(:disabled):not(.disabled):active,.dt-button:not(:disabled):not(.disabled).active,.show>.dt-button.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.dt-button:not(:disabled):not(.disabled):active:focus,.dt-button:not(:disabled):not(.disabled).active:focus,.show>.dt-button.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.dt-button.disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#adb5bd}.small-button{padding:0.1em 0.2em}.previous-value{margin:0.4em 0;display:block}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.1rem}textarea{height:90px}.sheet h4{color:#6c757d}#window-fixed-menu{background-color:#e9ecef;position:fixed;right:0;margin-top:100px;z-index:50;width:200px}#window-fixed-menu-list li{padding-bottom:0.5em}#window-fixed-menu-list li a.nav-link{background-color:white}#window-fixed-menu-list li a.nav-link.active{background-color:#007bff}#window-menu-title{font-size:1.3em}#window-menu-control{font-size:0.6em;padding-top:0.2em}#window-fixed-menu.hidden{transform:rotate(270deg);transform-origin:right bottom 0}#window-fixed-menu.hidden i.fa-times{transform:rotate(45deg);transform-origin:10px 10px 0;padding-left:0.1em}.form h4,.form h3,.collapse-form .card-header,#window h3{background-color:#ced4da}.collapse-form .card,.collapse-form .card-header{border-radius:0;border:0 solid}.collapse-form .card-header{padding:0;text-align:center}.collapse-form .card-header h4{margin-bottom:0}.collapse-form .card-header .btn.btn-link{color:#212529;width:100%}.collapse-form .card-body{border:1px solid #ced4da}.collapse-form .fa-expand,.collapse-form .collapsed .fa-compress{display:none}.collapse-form .collapsed .fa-expand,.collapse-form .fa-compress{display:inline-block}.clean-table h4,.form h4,.form h3,.collapse-form .card-header h4 .btn,.sheet h4,.sheet h3,.sheet h2{text-align:center;text-shadow:2px 2px 2px rgba(150,150,150,0.7)}.sheet .subsection{background-color:#e9ecef}.sheet .row.toolbar{padding:0.5em 0.75em}.sheet .row{padding:0 0.75em}.clean-table h4{margin-top:1em}.container{margin-top:1em;margin-bottom:8em}.bg-dark{background-color:#432776 !important}.navbar{padding:0 0.5rem}.navbar-dark .navbar-nav.action-menu .nav-link{color:#ffe484;border:1px solid #ffe484;border-radius:4px;margin:0.2em;padding:0.3em 0.6em}.navbar-dark .navbar-nav.action-menu .d-none .nav-link{border:0px solid transparent}.navbar-dark .navbar-nav.action-menu .d-none .nav-link:hover{background-color:transparent;color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link:hover{background-color:#ffe484;color:#343a40}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle::after{color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle:hover::after{color:#343a40}#context-menu,#reminder,.confirm-message,div#validation-bar{background-color:#6f42c1;color:rgba(255,255,255,0.8)}#reminder{padding:0.6em 1em 0.1em 1em}#alert-list a{font-size:1.1rem}.confirm-message{text-align:center;margin:0;padding:0.5rem;font-weight:bold}.is-invalid input{border-color:#f99}.errorlist{color:#900}#shortcut-menu{width:700px;padding:1em}#context-menu a.nav-link{color:rgba(255,255,255,0.8);padding:0.8rem 0.5rem 0.7rem 0.5rem}#context-menu .breadcrumb{margin-bottom:0;background-color:transparent}#current_items{width:100%}div#foot{background-color:#432776;color:rgba(255,255,255,0.5)}div#foot a{color:#ddd}div#foot a:hover{color:#fff}.breadcrumb button{border:0 transparent;background-color:transparent}.breadcrumb a:hover{text-decoration:none}.breadcrumb button:hover{cursor:pointer;color:#0062cc}.input-group.date input{border:1px solid #dee2e6;border-radius:.25rem;padding:.375rem .75rem;font-size:1rem;line-height:1.5}.input-group.date .input-group-text:hover{cursor:pointer}.input-group>ul{padding:0.5em;border:1px solid #dee2e6;border-radius:.25rem;margin:0;list-style:none}.help-text{max-height:250px;overflow:auto}.input-link{color:#6c757d}.input-link.disabled{color:#adb5bd}.input-link:hover{color:#343a40;cursor:pointer}.input-link.disabled:hover{color:#adb5bd;cursor:not-allowed}.input-sep{background-color:#fff;padding:0.3rem}.search_button{display:none}.lightgallery-captions{display:none}.lightgallery-subimage{display:inline-block;width:80px;padding:0.2em}.lightgallery-subimage img{width:100%}.lg .lg-sub-html{text-align:left}.lg .lg-sub-html .close{color:#fff}.lg .lg-sub-html .close:hover{opacity:0.9}.ui-widget-content{border:1px solid #dee2e6;background-color:#fff}.ui-menu-item{padding:0.2em 0.4em;border:1px solid #fff}.ui-menu-item:hover{color:#6f3b93;border:1px solid #6f3b93;cursor:pointer}.ui-autocomplete{font-size:0.7em;z-index:10000 !important;width:350px;border:5px solid #dee2e6;outline:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}
+ */:root{--blue: #007bff;--indigo: #6610f2;--purple: #6f42c1;--pink: #e83e8c;--red: #dc3545;--orange: #fd7e14;--yellow: #ffc107;--green: #28a745;--teal: #20c997;--cyan: #17a2b8;--white: #fff;--gray: #6c757d;--gray-dark: #343a40;--primary: #007bff;--secondary: #6c757d;--success: #28a745;--info: #17a2b8;--warning: #ffc107;--danger: #dc3545;--light: #f8f9fa;--dark: #343a40;--breakpoint-xs: 0;--breakpoint-sm: 576px;--breakpoint-md: 768px;--breakpoint-lg: 992px;--breakpoint-xl: 1200px;--font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0 !important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[title],abbr[data-original-title]{text-decoration:underline;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#6f3b93;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#542c6f;text-decoration:none}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):hover,a:not([href]):not([tabindex]):focus{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}pre,code,kbd,samp{font-family:monospace, monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{padding:0;border-style:none}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:none}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none !important}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}h1,.h1{font-size:2.5rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.75rem}h4,.h4{font-size:1.5rem}h5,.h5{font-size:1.25rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.2}.display-2{font-size:5.5rem;font-weight:300;line-height:1.2}.display-3{font-size:4.5rem;font-weight:300;line-height:1.2}.display-4{font-size:3.5rem;font-weight:300;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,0.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width: 576px){.container{max-width:540px}}@media (min-width: 768px){.container{max-width:720px}}@media (min-width: 992px){.container{max-width:960px}}@media (min-width: 1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*="col-"]{padding-right:0;padding-left:0}.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col,.col-auto,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm,.col-sm-auto,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md,.col-md-auto,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg,.col-lg-auto,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:none}.col-1{flex:0 0 8.33333%;max-width:8.33333%}.col-2{flex:0 0 16.66667%;max-width:16.66667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333%;max-width:33.33333%}.col-5{flex:0 0 41.66667%;max-width:41.66667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333%;max-width:58.33333%}.col-8{flex:0 0 66.66667%;max-width:66.66667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333%;max-width:83.33333%}.col-11{flex:0 0 91.66667%;max-width:91.66667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:none}.col-sm-1{flex:0 0 8.33333%;max-width:8.33333%}.col-sm-2{flex:0 0 16.66667%;max-width:16.66667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333%;max-width:33.33333%}.col-sm-5{flex:0 0 41.66667%;max-width:41.66667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333%;max-width:58.33333%}.col-sm-8{flex:0 0 66.66667%;max-width:66.66667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333%;max-width:83.33333%}.col-sm-11{flex:0 0 91.66667%;max-width:91.66667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:none}.col-md-1{flex:0 0 8.33333%;max-width:8.33333%}.col-md-2{flex:0 0 16.66667%;max-width:16.66667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333%;max-width:33.33333%}.col-md-5{flex:0 0 41.66667%;max-width:41.66667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333%;max-width:58.33333%}.col-md-8{flex:0 0 66.66667%;max-width:66.66667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333%;max-width:83.33333%}.col-md-11{flex:0 0 91.66667%;max-width:91.66667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:none}.col-lg-1{flex:0 0 8.33333%;max-width:8.33333%}.col-lg-2{flex:0 0 16.66667%;max-width:16.66667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333%;max-width:33.33333%}.col-lg-5{flex:0 0 41.66667%;max-width:41.66667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333%;max-width:58.33333%}.col-lg-8{flex:0 0 66.66667%;max-width:66.66667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333%;max-width:83.33333%}.col-lg-11{flex:0 0 91.66667%;max-width:91.66667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:none}.col-xl-1{flex:0 0 8.33333%;max-width:8.33333%}.col-xl-2{flex:0 0 16.66667%;max-width:16.66667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333%;max-width:33.33333%}.col-xl-5{flex:0 0 41.66667%;max-width:41.66667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333%;max-width:58.33333%}.col-xl-8{flex:0 0 66.66667%;max-width:66.66667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333%;max-width:83.33333%}.col-xl-11{flex:0 0 91.66667%;max-width:91.66667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:rgba(0,0,0,0)}.table th,.table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm th,.table-sm td{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered th,.table-bordered td{border:1px solid #dee2e6}.table-bordered thead th,.table-bordered thead td{border-bottom-width:2px}.table-borderless th,.table-borderless td,.table-borderless thead th,.table-borderless tbody+tbody{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,0.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,0.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>th,.table-success>td{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>th,.table-info>td{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>th,.table-warning>td{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>th,.table-danger>td{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>th,.table-light>td{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>th,.table-dark>td{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,0.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,0.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark th,.table-dark td,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,0.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,0.075)}@media (max-width: 575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width: 767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width: 991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width: 1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.form-control-plaintext.form-control-lg,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-prepend>.input-group-text,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-append>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}select.form-control-sm:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-prepend>.input-group-text,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-append>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}select.form-control-lg:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*="col-"]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled ~ .form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,0.8);border-radius:.2rem}.was-validated .form-control:valid,.form-control.is-valid,.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#28a745}.was-validated .form-control:valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .form-control:valid ~ .valid-feedback,.was-validated .form-control:valid ~ .valid-tooltip,.form-control.is-valid ~ .valid-feedback,.form-control.is-valid ~ .valid-tooltip,.was-validated .custom-select:valid ~ .valid-feedback,.was-validated .custom-select:valid ~ .valid-tooltip,.custom-select.is-valid ~ .valid-feedback,.custom-select.is-valid ~ .valid-tooltip{display:block}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#28a745}.was-validated .form-check-input:valid ~ .valid-feedback,.was-validated .form-check-input:valid ~ .valid-tooltip,.form-check-input.is-valid ~ .valid-feedback,.form-check-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid ~ .custom-control-label,.custom-control-input.is-valid ~ .custom-control-label{color:#28a745}.was-validated .custom-control-input:valid ~ .custom-control-label::before,.custom-control-input.is-valid ~ .custom-control-label::before{background-color:#71dd8a}.was-validated .custom-control-input:valid ~ .valid-feedback,.was-validated .custom-control-input:valid ~ .valid-tooltip,.custom-control-input.is-valid ~ .valid-feedback,.custom-control-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,.custom-control-input.is-valid:checked ~ .custom-control-label::before{background-color:#34ce57}.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,.custom-control-input.is-valid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,0.25)}.was-validated .custom-file-input:valid ~ .custom-file-label,.custom-file-input.is-valid ~ .custom-file-label{border-color:#28a745}.was-validated .custom-file-input:valid ~ .custom-file-label::before,.custom-file-input.is-valid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:valid ~ .valid-feedback,.was-validated .custom-file-input:valid ~ .valid-tooltip,.custom-file-input.is-valid ~ .valid-feedback,.custom-file-input.is-valid ~ .valid-tooltip{display:block}.was-validated .custom-file-input:valid:focus ~ .custom-file-label,.custom-file-input.is-valid:focus ~ .custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,0.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,0.8);border-radius:.2rem}.was-validated .form-control:invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#dc3545}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .form-control:invalid ~ .invalid-feedback,.was-validated .form-control:invalid ~ .invalid-tooltip,.form-control.is-invalid ~ .invalid-feedback,.form-control.is-invalid ~ .invalid-tooltip,.was-validated .custom-select:invalid ~ .invalid-feedback,.was-validated .custom-select:invalid ~ .invalid-tooltip,.custom-select.is-invalid ~ .invalid-feedback,.custom-select.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#dc3545}.was-validated .form-check-input:invalid ~ .invalid-feedback,.was-validated .form-check-input:invalid ~ .invalid-tooltip,.form-check-input.is-invalid ~ .invalid-feedback,.form-check-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid ~ .custom-control-label,.custom-control-input.is-invalid ~ .custom-control-label{color:#dc3545}.was-validated .custom-control-input:invalid ~ .custom-control-label::before,.custom-control-input.is-invalid ~ .custom-control-label::before{background-color:#efa2a9}.was-validated .custom-control-input:invalid ~ .invalid-feedback,.was-validated .custom-control-input:invalid ~ .invalid-tooltip,.custom-control-input.is-invalid ~ .invalid-feedback,.custom-control-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,.custom-control-input.is-invalid:checked ~ .custom-control-label::before{background-color:#e4606d}.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,.custom-control-input.is-invalid:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,0.25)}.was-validated .custom-file-input:invalid ~ .custom-file-label,.custom-file-input.is-invalid ~ .custom-file-label{border-color:#dc3545}.was-validated .custom-file-input:invalid ~ .custom-file-label::before,.custom-file-input.is-invalid ~ .custom-file-label::before{border-color:inherit}.was-validated .custom-file-input:invalid ~ .invalid-feedback,.was-validated .custom-file-input:invalid ~ .invalid-tooltip,.custom-file-input.is-invalid ~ .invalid-feedback,.custom-file-input.is-invalid ~ .invalid-tooltip{display:block}.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,.custom-file-input.is-invalid:focus ~ .custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media (min-width: 576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:0 0 auto;flex-flow:row wrap;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group,.form-inline .custom-select{width:auto}.form-inline .form-check{display:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.btn:hover,.btn:focus{text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary:focus,.btn-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success:focus,.btn-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info:focus,.btn-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning:focus,.btn-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger:focus,.btn-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light:focus,.btn-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark:focus,.btn-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled):active,.btn-outline-primary:not(:disabled):not(.disabled).active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,0.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled):active,.btn-outline-secondary:not(:disabled):not(.disabled).active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled):active,.btn-outline-success:not(:disabled):not(.disabled).active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled):active:focus,.btn-outline-success:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled):active:focus,.btn-outline-info:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,0.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,0.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled):active,.btn-outline-danger:not(:disabled):not(.disabled).active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,0.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled):active:focus,.btn-outline-light:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,0.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled):active,.btn-outline-dark:not(:disabled):not(.disabled).active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,0.5)}.btn-link{font-weight:400;color:#6f3b93;background-color:transparent}.btn-link:hover{color:#542c6f;text-decoration:none;background-color:transparent;border-color:transparent}.btn-link:focus,.btn-link.focus{text-decoration:none;border-color:transparent;box-shadow:none}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;transition:opacity 0.15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height 0.35s ease}.dropup,.dropdown{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:0 1 auto}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover{z-index:1}.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type="radio"],.btn-group-toggle>.btn input[type="checkbox"],.btn-group-toggle>.btn-group>.btn input[type="radio"],.btn-group-toggle>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.form-control:focus,.input-group>.custom-select:focus,.input-group>.custom-file:focus{z-index:3}.input-group>.form-control+.form-control,.input-group>.form-control+.custom-select,.input-group>.form-control+.custom-file,.input-group>.custom-select+.form-control,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.custom-file,.input-group>.custom-file+.form-control,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.custom-file{margin-left:-1px}.input-group>.form-control:not(:last-child),.input-group>.custom-select:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.form-control:not(:first-child),.input-group>.custom-select:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:flex;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-prepend,.input-group-append{display:flex}.input-group-prepend .btn,.input-group-append .btn{position:relative;z-index:2}.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.input-group-text,.input-group-append .input-group-text+.btn{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type="radio"],.input-group-text input[type="checkbox"]{margin-top:0}.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text,.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked ~ .custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus ~ .custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,0.25)}.custom-control-input:active ~ .custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled ~ .custom-control-label{color:#6c757d}.custom-control-input:disabled ~ .custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked ~ .custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked ~ .custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before{background-color:rgba(0,123,255,0.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,0.075),0 0 5px rgba(128,189,255,0.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus ~ .custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.custom-file-input:focus ~ .custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en) ~ .custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:hover,.navbar-toggler:focus{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width: 575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width: 1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width: 1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.5);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,0.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,0.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.5);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:flex;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width: 576px){.card-deck{flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:flex;flex:1 0 0%;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:flex;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width: 576px){.card-group{flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-img-top,.card-group>.card:first-child .card-header{border-top-right-radius:0}.card-group>.card:first-child .card-img-bottom,.card-group>.card:first-child .card-footer{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-img-top,.card-group>.card:last-child .card-header{border-top-left-radius:0}.card-group>.card:last-child .card-img-bottom,.card-group>.card:last-child .card-footer{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-img-top,.card-group>.card:only-child .card-header{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-img-bottom,.card-group>.card:only-child .card-footer{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width: 576px){.card-columns{column-count:3;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#6f3b93;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#542c6f;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,0.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:hover,.badge-primary[href]:focus{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:hover,.badge-secondary[href]:focus{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:hover,.badge-success[href]:focus{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:hover,.badge-info[href]:focus{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:hover,.badge-warning[href]:focus{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:hover,.badge-danger[href]:focus{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:hover,.badge-light[href]:focus{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:hover,.badge-dark[href]:focus{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width: 576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width 0.6s ease}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}.media{display:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:hover,.list-group-item:focus{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover,.close:focus{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.3s ease-out;transform:translate(0, -25%)}.modal.show .modal-dialog{transform:translate(0, 0)}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;align-items:center;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .arrow,.bs-tooltip-auto[x-placement^="top"] .arrow{bottom:0}.bs-tooltip-top .arrow::before,.bs-tooltip-auto[x-placement^="top"] .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^="right"]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^="right"] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^="right"] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .arrow,.bs-tooltip-auto[x-placement^="bottom"] .arrow{top:0}.bs-tooltip-bottom .arrow::before,.bs-tooltip-auto[x-placement^="bottom"] .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^="left"]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^="left"] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^="left"] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::before,.popover .arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top,.bs-popover-auto[x-placement^="top"]{margin-bottom:.5rem}.bs-popover-top .arrow,.bs-popover-auto[x-placement^="top"] .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{border-width:.5rem .5rem 0}.bs-popover-top .arrow::before,.bs-popover-auto[x-placement^="top"] .arrow::before{bottom:0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top .arrow::after,.bs-popover-auto[x-placement^="top"] .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^="right"]{margin-left:.5rem}.bs-popover-right .arrow,.bs-popover-auto[x-placement^="right"] .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{border-width:.5rem .5rem .5rem 0}.bs-popover-right .arrow::before,.bs-popover-auto[x-placement^="right"] .arrow::before{left:0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-right .arrow::after,.bs-popover-auto[x-placement^="right"] .arrow::after{left:1px;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^="bottom"]{margin-top:.5rem}.bs-popover-bottom .arrow,.bs-popover-auto[x-placement^="bottom"] .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{border-width:0 .5rem .5rem .5rem}.bs-popover-bottom .arrow::before,.bs-popover-auto[x-placement^="bottom"] .arrow::before{top:0;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom .arrow::after,.bs-popover-auto[x-placement^="bottom"] .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[x-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^="left"]{margin-right:.5rem}.bs-popover-left .arrow,.bs-popover-auto[x-placement^="left"] .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{border-width:.5rem 0 .5rem .5rem}.bs-popover-left .arrow::before,.bs-popover-auto[x-placement^="left"] .arrow::before{right:0;border-left-color:rgba(0,0,0,0.25)}.bs-popover-left .arrow::after,.bs-popover-auto[x-placement^="left"] .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;align-items:center;width:100%;transition:transform 0.6s ease;backface-visibility:hidden;perspective:1000px}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translateX(0)}@supports (transform-style: preserve-3d){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{transform:translate3d(0, 0, 0)}}.carousel-item-next,.active.carousel-item-right{transform:translateX(100%)}@supports (transform-style: preserve-3d){.carousel-item-next,.active.carousel-item-right{transform:translate3d(100%, 0, 0)}}.carousel-item-prev,.active.carousel-item-left{transform:translateX(-100%)}@supports (transform-style: preserve-3d){.carousel-item-prev,.active.carousel-item-left{transform:translate3d(-100%, 0, 0)}}.carousel-fade .carousel-item{opacity:0;transition-duration:.6s;transition-property:opacity}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{transform:translateX(0)}@supports (transform-style: preserve-3d){.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active,.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev{transform:translate3d(0, 0, 0)}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,0.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline !important}.align-top{vertical-align:top !important}.align-middle{vertical-align:middle !important}.align-bottom{vertical-align:bottom !important}.align-text-bottom{vertical-align:text-bottom !important}.align-text-top{vertical-align:text-top !important}.bg-primary{background-color:#007bff !important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#0062cc !important}.bg-secondary{background-color:#6c757d !important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#545b62 !important}.bg-success{background-color:#28a745 !important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#1e7e34 !important}.bg-info{background-color:#17a2b8 !important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#117a8b !important}.bg-warning{background-color:#ffc107 !important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#d39e00 !important}.bg-danger{background-color:#dc3545 !important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#bd2130 !important}.bg-light{background-color:#f8f9fa !important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#dae0e5 !important}.bg-dark{background-color:#343a40 !important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#1d2124 !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:transparent !important}.border{border:1px solid #dee2e6 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-right{border-right:1px solid #dee2e6 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-left{border-left:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.border-primary{border-color:#007bff !important}.border-secondary{border-color:#6c757d !important}.border-success{border-color:#28a745 !important}.border-info{border-color:#17a2b8 !important}.border-warning{border-color:#ffc107 !important}.border-danger{border-color:#dc3545 !important}.border-light{border-color:#f8f9fa !important}.border-dark{border-color:#343a40 !important}.border-white{border-color:#fff !important}.rounded{border-radius:.25rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-right{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-left{border-top-left-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-circle{border-radius:50% !important}.rounded-0{border-radius:0 !important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-block{display:block !important}.d-table{display:table !important}.d-table-row{display:table-row !important}.d-table-cell{display:table-cell !important}.d-flex{display:flex !important}.d-inline-flex{display:inline-flex !important}@media (min-width: 576px){.d-sm-none{display:none !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-block{display:block !important}.d-sm-table{display:table !important}.d-sm-table-row{display:table-row !important}.d-sm-table-cell{display:table-cell !important}.d-sm-flex{display:flex !important}.d-sm-inline-flex{display:inline-flex !important}}@media (min-width: 768px){.d-md-none{display:none !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-block{display:block !important}.d-md-table{display:table !important}.d-md-table-row{display:table-row !important}.d-md-table-cell{display:table-cell !important}.d-md-flex{display:flex !important}.d-md-inline-flex{display:inline-flex !important}}@media (min-width: 992px){.d-lg-none{display:none !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-block{display:block !important}.d-lg-table{display:table !important}.d-lg-table-row{display:table-row !important}.d-lg-table-cell{display:table-cell !important}.d-lg-flex{display:flex !important}.d-lg-inline-flex{display:inline-flex !important}}@media (min-width: 1200px){.d-xl-none{display:none !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-block{display:block !important}.d-xl-table{display:table !important}.d-xl-table-row{display:table-row !important}.d-xl-table-cell{display:table-cell !important}.d-xl-flex{display:flex !important}.d-xl-inline-flex{display:inline-flex !important}}@media print{.d-print-none{display:none !important}.d-print-inline{display:inline !important}.d-print-inline-block{display:inline-block !important}.d-print-block{display:block !important}.d-print-table{display:table !important}.d-print-table-row{display:table-row !important}.d-print-table-cell{display:table-cell !important}.d-print-flex{display:flex !important}.d-print-inline-flex{display:inline-flex !important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.85714%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row !important}.flex-column{flex-direction:column !important}.flex-row-reverse{flex-direction:row-reverse !important}.flex-column-reverse{flex-direction:column-reverse !important}.flex-wrap{flex-wrap:wrap !important}.flex-nowrap{flex-wrap:nowrap !important}.flex-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-fill{flex:1 1 auto !important}.justify-content-start{justify-content:flex-start !important}.justify-content-end{justify-content:flex-end !important}.justify-content-center{justify-content:center !important}.justify-content-between{justify-content:space-between !important}.justify-content-around{justify-content:space-around !important}.align-items-start{align-items:flex-start !important}.align-items-end{align-items:flex-end !important}.align-items-center{align-items:center !important}.align-items-baseline{align-items:baseline !important}.align-items-stretch{align-items:stretch !important}.align-content-start{align-content:flex-start !important}.align-content-end{align-content:flex-end !important}.align-content-center{align-content:center !important}.align-content-between{align-content:space-between !important}.align-content-around{align-content:space-around !important}.align-content-stretch{align-content:stretch !important}.align-self-auto{align-self:auto !important}.align-self-start{align-self:flex-start !important}.align-self-end{align-self:flex-end !important}.align-self-center{align-self:center !important}.align-self-baseline{align-self:baseline !important}.align-self-stretch{align-self:stretch !important}@media (min-width: 576px){.flex-sm-row{flex-direction:row !important}.flex-sm-column{flex-direction:column !important}.flex-sm-row-reverse{flex-direction:row-reverse !important}.flex-sm-column-reverse{flex-direction:column-reverse !important}.flex-sm-wrap{flex-wrap:wrap !important}.flex-sm-nowrap{flex-wrap:nowrap !important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-sm-fill{flex:1 1 auto !important}.justify-content-sm-start{justify-content:flex-start !important}.justify-content-sm-end{justify-content:flex-end !important}.justify-content-sm-center{justify-content:center !important}.justify-content-sm-between{justify-content:space-between !important}.justify-content-sm-around{justify-content:space-around !important}.align-items-sm-start{align-items:flex-start !important}.align-items-sm-end{align-items:flex-end !important}.align-items-sm-center{align-items:center !important}.align-items-sm-baseline{align-items:baseline !important}.align-items-sm-stretch{align-items:stretch !important}.align-content-sm-start{align-content:flex-start !important}.align-content-sm-end{align-content:flex-end !important}.align-content-sm-center{align-content:center !important}.align-content-sm-between{align-content:space-between !important}.align-content-sm-around{align-content:space-around !important}.align-content-sm-stretch{align-content:stretch !important}.align-self-sm-auto{align-self:auto !important}.align-self-sm-start{align-self:flex-start !important}.align-self-sm-end{align-self:flex-end !important}.align-self-sm-center{align-self:center !important}.align-self-sm-baseline{align-self:baseline !important}.align-self-sm-stretch{align-self:stretch !important}}@media (min-width: 768px){.flex-md-row{flex-direction:row !important}.flex-md-column{flex-direction:column !important}.flex-md-row-reverse{flex-direction:row-reverse !important}.flex-md-column-reverse{flex-direction:column-reverse !important}.flex-md-wrap{flex-wrap:wrap !important}.flex-md-nowrap{flex-wrap:nowrap !important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-md-fill{flex:1 1 auto !important}.justify-content-md-start{justify-content:flex-start !important}.justify-content-md-end{justify-content:flex-end !important}.justify-content-md-center{justify-content:center !important}.justify-content-md-between{justify-content:space-between !important}.justify-content-md-around{justify-content:space-around !important}.align-items-md-start{align-items:flex-start !important}.align-items-md-end{align-items:flex-end !important}.align-items-md-center{align-items:center !important}.align-items-md-baseline{align-items:baseline !important}.align-items-md-stretch{align-items:stretch !important}.align-content-md-start{align-content:flex-start !important}.align-content-md-end{align-content:flex-end !important}.align-content-md-center{align-content:center !important}.align-content-md-between{align-content:space-between !important}.align-content-md-around{align-content:space-around !important}.align-content-md-stretch{align-content:stretch !important}.align-self-md-auto{align-self:auto !important}.align-self-md-start{align-self:flex-start !important}.align-self-md-end{align-self:flex-end !important}.align-self-md-center{align-self:center !important}.align-self-md-baseline{align-self:baseline !important}.align-self-md-stretch{align-self:stretch !important}}@media (min-width: 992px){.flex-lg-row{flex-direction:row !important}.flex-lg-column{flex-direction:column !important}.flex-lg-row-reverse{flex-direction:row-reverse !important}.flex-lg-column-reverse{flex-direction:column-reverse !important}.flex-lg-wrap{flex-wrap:wrap !important}.flex-lg-nowrap{flex-wrap:nowrap !important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-lg-fill{flex:1 1 auto !important}.justify-content-lg-start{justify-content:flex-start !important}.justify-content-lg-end{justify-content:flex-end !important}.justify-content-lg-center{justify-content:center !important}.justify-content-lg-between{justify-content:space-between !important}.justify-content-lg-around{justify-content:space-around !important}.align-items-lg-start{align-items:flex-start !important}.align-items-lg-end{align-items:flex-end !important}.align-items-lg-center{align-items:center !important}.align-items-lg-baseline{align-items:baseline !important}.align-items-lg-stretch{align-items:stretch !important}.align-content-lg-start{align-content:flex-start !important}.align-content-lg-end{align-content:flex-end !important}.align-content-lg-center{align-content:center !important}.align-content-lg-between{align-content:space-between !important}.align-content-lg-around{align-content:space-around !important}.align-content-lg-stretch{align-content:stretch !important}.align-self-lg-auto{align-self:auto !important}.align-self-lg-start{align-self:flex-start !important}.align-self-lg-end{align-self:flex-end !important}.align-self-lg-center{align-self:center !important}.align-self-lg-baseline{align-self:baseline !important}.align-self-lg-stretch{align-self:stretch !important}}@media (min-width: 1200px){.flex-xl-row{flex-direction:row !important}.flex-xl-column{flex-direction:column !important}.flex-xl-row-reverse{flex-direction:row-reverse !important}.flex-xl-column-reverse{flex-direction:column-reverse !important}.flex-xl-wrap{flex-wrap:wrap !important}.flex-xl-nowrap{flex-wrap:nowrap !important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse !important}.flex-xl-fill{flex:1 1 auto !important}.justify-content-xl-start{justify-content:flex-start !important}.justify-content-xl-end{justify-content:flex-end !important}.justify-content-xl-center{justify-content:center !important}.justify-content-xl-between{justify-content:space-between !important}.justify-content-xl-around{justify-content:space-around !important}.align-items-xl-start{align-items:flex-start !important}.align-items-xl-end{align-items:flex-end !important}.align-items-xl-center{align-items:center !important}.align-items-xl-baseline{align-items:baseline !important}.align-items-xl-stretch{align-items:stretch !important}.align-content-xl-start{align-content:flex-start !important}.align-content-xl-end{align-content:flex-end !important}.align-content-xl-center{align-content:center !important}.align-content-xl-between{align-content:space-between !important}.align-content-xl-around{align-content:space-around !important}.align-content-xl-stretch{align-content:stretch !important}.align-self-xl-auto{align-self:auto !important}.align-self-xl-start{align-self:flex-start !important}.align-self-xl-end{align-self:flex-end !important}.align-self-xl-center{align-self:center !important}.align-self-xl-baseline{align-self:baseline !important}.align-self-xl-stretch{align-self:stretch !important}}.float-left{float:left !important}.float-right{float:right !important}.float-none{float:none !important}@media (min-width: 576px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 992px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1200px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{position:sticky !important}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports (position: sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;clip-path:none}.w-25{width:25% !important}.w-50{width:50% !important}.w-75{width:75% !important}.w-100{width:100% !important}.w-auto{width:auto !important}.h-25{height:25% !important}.h-50{height:50% !important}.h-75{height:75% !important}.h-100{height:100% !important}.h-auto{height:auto !important}.mw-100{max-width:100% !important}.mh-100{max-height:100% !important}.m-0{margin:0 !important}.mt-0,.my-0{margin-top:0 !important}.mr-0,.mx-0{margin-right:0 !important}.mb-0,.my-0{margin-bottom:0 !important}.ml-0,.mx-0{margin-left:0 !important}.m-1{margin:.25rem !important}.mt-1,.my-1{margin-top:.25rem !important}.mr-1,.mx-1{margin-right:.25rem !important}.mb-1,.my-1{margin-bottom:.25rem !important}.ml-1,.mx-1{margin-left:.25rem !important}.m-2{margin:.5rem !important}.mt-2,.my-2{margin-top:.5rem !important}.mr-2,.mx-2{margin-right:.5rem !important}.mb-2,.my-2{margin-bottom:.5rem !important}.ml-2,.mx-2{margin-left:.5rem !important}.m-3{margin:1rem !important}.mt-3,.my-3{margin-top:1rem !important}.mr-3,.mx-3{margin-right:1rem !important}.mb-3,.my-3{margin-bottom:1rem !important}.ml-3,.mx-3{margin-left:1rem !important}.m-4{margin:1.5rem !important}.mt-4,.my-4{margin-top:1.5rem !important}.mr-4,.mx-4{margin-right:1.5rem !important}.mb-4,.my-4{margin-bottom:1.5rem !important}.ml-4,.mx-4{margin-left:1.5rem !important}.m-5{margin:3rem !important}.mt-5,.my-5{margin-top:3rem !important}.mr-5,.mx-5{margin-right:3rem !important}.mb-5,.my-5{margin-bottom:3rem !important}.ml-5,.mx-5{margin-left:3rem !important}.p-0{padding:0 !important}.pt-0,.py-0{padding-top:0 !important}.pr-0,.px-0{padding-right:0 !important}.pb-0,.py-0{padding-bottom:0 !important}.pl-0,.px-0{padding-left:0 !important}.p-1{padding:.25rem !important}.pt-1,.py-1{padding-top:.25rem !important}.pr-1,.px-1{padding-right:.25rem !important}.pb-1,.py-1{padding-bottom:.25rem !important}.pl-1,.px-1{padding-left:.25rem !important}.p-2{padding:.5rem !important}.pt-2,.py-2{padding-top:.5rem !important}.pr-2,.px-2{padding-right:.5rem !important}.pb-2,.py-2{padding-bottom:.5rem !important}.pl-2,.px-2{padding-left:.5rem !important}.p-3{padding:1rem !important}.pt-3,.py-3{padding-top:1rem !important}.pr-3,.px-3{padding-right:1rem !important}.pb-3,.py-3{padding-bottom:1rem !important}.pl-3,.px-3{padding-left:1rem !important}.p-4{padding:1.5rem !important}.pt-4,.py-4{padding-top:1.5rem !important}.pr-4,.px-4{padding-right:1.5rem !important}.pb-4,.py-4{padding-bottom:1.5rem !important}.pl-4,.px-4{padding-left:1.5rem !important}.p-5{padding:3rem !important}.pt-5,.py-5{padding-top:3rem !important}.pr-5,.px-5{padding-right:3rem !important}.pb-5,.py-5{padding-bottom:3rem !important}.pl-5,.px-5{padding-left:3rem !important}.m-auto{margin:auto !important}.mt-auto,.my-auto{margin-top:auto !important}.mr-auto,.mx-auto{margin-right:auto !important}.mb-auto,.my-auto{margin-bottom:auto !important}.ml-auto,.mx-auto{margin-left:auto !important}@media (min-width: 576px){.m-sm-0{margin:0 !important}.mt-sm-0,.my-sm-0{margin-top:0 !important}.mr-sm-0,.mx-sm-0{margin-right:0 !important}.mb-sm-0,.my-sm-0{margin-bottom:0 !important}.ml-sm-0,.mx-sm-0{margin-left:0 !important}.m-sm-1{margin:.25rem !important}.mt-sm-1,.my-sm-1{margin-top:.25rem !important}.mr-sm-1,.mx-sm-1{margin-right:.25rem !important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem !important}.ml-sm-1,.mx-sm-1{margin-left:.25rem !important}.m-sm-2{margin:.5rem !important}.mt-sm-2,.my-sm-2{margin-top:.5rem !important}.mr-sm-2,.mx-sm-2{margin-right:.5rem !important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem !important}.ml-sm-2,.mx-sm-2{margin-left:.5rem !important}.m-sm-3{margin:1rem !important}.mt-sm-3,.my-sm-3{margin-top:1rem !important}.mr-sm-3,.mx-sm-3{margin-right:1rem !important}.mb-sm-3,.my-sm-3{margin-bottom:1rem !important}.ml-sm-3,.mx-sm-3{margin-left:1rem !important}.m-sm-4{margin:1.5rem !important}.mt-sm-4,.my-sm-4{margin-top:1.5rem !important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem !important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem !important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem !important}.m-sm-5{margin:3rem !important}.mt-sm-5,.my-sm-5{margin-top:3rem !important}.mr-sm-5,.mx-sm-5{margin-right:3rem !important}.mb-sm-5,.my-sm-5{margin-bottom:3rem !important}.ml-sm-5,.mx-sm-5{margin-left:3rem !important}.p-sm-0{padding:0 !important}.pt-sm-0,.py-sm-0{padding-top:0 !important}.pr-sm-0,.px-sm-0{padding-right:0 !important}.pb-sm-0,.py-sm-0{padding-bottom:0 !important}.pl-sm-0,.px-sm-0{padding-left:0 !important}.p-sm-1{padding:.25rem !important}.pt-sm-1,.py-sm-1{padding-top:.25rem !important}.pr-sm-1,.px-sm-1{padding-right:.25rem !important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem !important}.pl-sm-1,.px-sm-1{padding-left:.25rem !important}.p-sm-2{padding:.5rem !important}.pt-sm-2,.py-sm-2{padding-top:.5rem !important}.pr-sm-2,.px-sm-2{padding-right:.5rem !important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem !important}.pl-sm-2,.px-sm-2{padding-left:.5rem !important}.p-sm-3{padding:1rem !important}.pt-sm-3,.py-sm-3{padding-top:1rem !important}.pr-sm-3,.px-sm-3{padding-right:1rem !important}.pb-sm-3,.py-sm-3{padding-bottom:1rem !important}.pl-sm-3,.px-sm-3{padding-left:1rem !important}.p-sm-4{padding:1.5rem !important}.pt-sm-4,.py-sm-4{padding-top:1.5rem !important}.pr-sm-4,.px-sm-4{padding-right:1.5rem !important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem !important}.pl-sm-4,.px-sm-4{padding-left:1.5rem !important}.p-sm-5{padding:3rem !important}.pt-sm-5,.py-sm-5{padding-top:3rem !important}.pr-sm-5,.px-sm-5{padding-right:3rem !important}.pb-sm-5,.py-sm-5{padding-bottom:3rem !important}.pl-sm-5,.px-sm-5{padding-left:3rem !important}.m-sm-auto{margin:auto !important}.mt-sm-auto,.my-sm-auto{margin-top:auto !important}.mr-sm-auto,.mx-sm-auto{margin-right:auto !important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto !important}.ml-sm-auto,.mx-sm-auto{margin-left:auto !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0,.my-md-0{margin-top:0 !important}.mr-md-0,.mx-md-0{margin-right:0 !important}.mb-md-0,.my-md-0{margin-bottom:0 !important}.ml-md-0,.mx-md-0{margin-left:0 !important}.m-md-1{margin:.25rem !important}.mt-md-1,.my-md-1{margin-top:.25rem !important}.mr-md-1,.mx-md-1{margin-right:.25rem !important}.mb-md-1,.my-md-1{margin-bottom:.25rem !important}.ml-md-1,.mx-md-1{margin-left:.25rem !important}.m-md-2{margin:.5rem !important}.mt-md-2,.my-md-2{margin-top:.5rem !important}.mr-md-2,.mx-md-2{margin-right:.5rem !important}.mb-md-2,.my-md-2{margin-bottom:.5rem !important}.ml-md-2,.mx-md-2{margin-left:.5rem !important}.m-md-3{margin:1rem !important}.mt-md-3,.my-md-3{margin-top:1rem !important}.mr-md-3,.mx-md-3{margin-right:1rem !important}.mb-md-3,.my-md-3{margin-bottom:1rem !important}.ml-md-3,.mx-md-3{margin-left:1rem !important}.m-md-4{margin:1.5rem !important}.mt-md-4,.my-md-4{margin-top:1.5rem !important}.mr-md-4,.mx-md-4{margin-right:1.5rem !important}.mb-md-4,.my-md-4{margin-bottom:1.5rem !important}.ml-md-4,.mx-md-4{margin-left:1.5rem !important}.m-md-5{margin:3rem !important}.mt-md-5,.my-md-5{margin-top:3rem !important}.mr-md-5,.mx-md-5{margin-right:3rem !important}.mb-md-5,.my-md-5{margin-bottom:3rem !important}.ml-md-5,.mx-md-5{margin-left:3rem !important}.p-md-0{padding:0 !important}.pt-md-0,.py-md-0{padding-top:0 !important}.pr-md-0,.px-md-0{padding-right:0 !important}.pb-md-0,.py-md-0{padding-bottom:0 !important}.pl-md-0,.px-md-0{padding-left:0 !important}.p-md-1{padding:.25rem !important}.pt-md-1,.py-md-1{padding-top:.25rem !important}.pr-md-1,.px-md-1{padding-right:.25rem !important}.pb-md-1,.py-md-1{padding-bottom:.25rem !important}.pl-md-1,.px-md-1{padding-left:.25rem !important}.p-md-2{padding:.5rem !important}.pt-md-2,.py-md-2{padding-top:.5rem !important}.pr-md-2,.px-md-2{padding-right:.5rem !important}.pb-md-2,.py-md-2{padding-bottom:.5rem !important}.pl-md-2,.px-md-2{padding-left:.5rem !important}.p-md-3{padding:1rem !important}.pt-md-3,.py-md-3{padding-top:1rem !important}.pr-md-3,.px-md-3{padding-right:1rem !important}.pb-md-3,.py-md-3{padding-bottom:1rem !important}.pl-md-3,.px-md-3{padding-left:1rem !important}.p-md-4{padding:1.5rem !important}.pt-md-4,.py-md-4{padding-top:1.5rem !important}.pr-md-4,.px-md-4{padding-right:1.5rem !important}.pb-md-4,.py-md-4{padding-bottom:1.5rem !important}.pl-md-4,.px-md-4{padding-left:1.5rem !important}.p-md-5{padding:3rem !important}.pt-md-5,.py-md-5{padding-top:3rem !important}.pr-md-5,.px-md-5{padding-right:3rem !important}.pb-md-5,.py-md-5{padding-bottom:3rem !important}.pl-md-5,.px-md-5{padding-left:3rem !important}.m-md-auto{margin:auto !important}.mt-md-auto,.my-md-auto{margin-top:auto !important}.mr-md-auto,.mx-md-auto{margin-right:auto !important}.mb-md-auto,.my-md-auto{margin-bottom:auto !important}.ml-md-auto,.mx-md-auto{margin-left:auto !important}}@media (min-width: 992px){.m-lg-0{margin:0 !important}.mt-lg-0,.my-lg-0{margin-top:0 !important}.mr-lg-0,.mx-lg-0{margin-right:0 !important}.mb-lg-0,.my-lg-0{margin-bottom:0 !important}.ml-lg-0,.mx-lg-0{margin-left:0 !important}.m-lg-1{margin:.25rem !important}.mt-lg-1,.my-lg-1{margin-top:.25rem !important}.mr-lg-1,.mx-lg-1{margin-right:.25rem !important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem !important}.ml-lg-1,.mx-lg-1{margin-left:.25rem !important}.m-lg-2{margin:.5rem !important}.mt-lg-2,.my-lg-2{margin-top:.5rem !important}.mr-lg-2,.mx-lg-2{margin-right:.5rem !important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem !important}.ml-lg-2,.mx-lg-2{margin-left:.5rem !important}.m-lg-3{margin:1rem !important}.mt-lg-3,.my-lg-3{margin-top:1rem !important}.mr-lg-3,.mx-lg-3{margin-right:1rem !important}.mb-lg-3,.my-lg-3{margin-bottom:1rem !important}.ml-lg-3,.mx-lg-3{margin-left:1rem !important}.m-lg-4{margin:1.5rem !important}.mt-lg-4,.my-lg-4{margin-top:1.5rem !important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem !important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem !important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem !important}.m-lg-5{margin:3rem !important}.mt-lg-5,.my-lg-5{margin-top:3rem !important}.mr-lg-5,.mx-lg-5{margin-right:3rem !important}.mb-lg-5,.my-lg-5{margin-bottom:3rem !important}.ml-lg-5,.mx-lg-5{margin-left:3rem !important}.p-lg-0{padding:0 !important}.pt-lg-0,.py-lg-0{padding-top:0 !important}.pr-lg-0,.px-lg-0{padding-right:0 !important}.pb-lg-0,.py-lg-0{padding-bottom:0 !important}.pl-lg-0,.px-lg-0{padding-left:0 !important}.p-lg-1{padding:.25rem !important}.pt-lg-1,.py-lg-1{padding-top:.25rem !important}.pr-lg-1,.px-lg-1{padding-right:.25rem !important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem !important}.pl-lg-1,.px-lg-1{padding-left:.25rem !important}.p-lg-2{padding:.5rem !important}.pt-lg-2,.py-lg-2{padding-top:.5rem !important}.pr-lg-2,.px-lg-2{padding-right:.5rem !important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem !important}.pl-lg-2,.px-lg-2{padding-left:.5rem !important}.p-lg-3{padding:1rem !important}.pt-lg-3,.py-lg-3{padding-top:1rem !important}.pr-lg-3,.px-lg-3{padding-right:1rem !important}.pb-lg-3,.py-lg-3{padding-bottom:1rem !important}.pl-lg-3,.px-lg-3{padding-left:1rem !important}.p-lg-4{padding:1.5rem !important}.pt-lg-4,.py-lg-4{padding-top:1.5rem !important}.pr-lg-4,.px-lg-4{padding-right:1.5rem !important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem !important}.pl-lg-4,.px-lg-4{padding-left:1.5rem !important}.p-lg-5{padding:3rem !important}.pt-lg-5,.py-lg-5{padding-top:3rem !important}.pr-lg-5,.px-lg-5{padding-right:3rem !important}.pb-lg-5,.py-lg-5{padding-bottom:3rem !important}.pl-lg-5,.px-lg-5{padding-left:3rem !important}.m-lg-auto{margin:auto !important}.mt-lg-auto,.my-lg-auto{margin-top:auto !important}.mr-lg-auto,.mx-lg-auto{margin-right:auto !important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto !important}.ml-lg-auto,.mx-lg-auto{margin-left:auto !important}}@media (min-width: 1200px){.m-xl-0{margin:0 !important}.mt-xl-0,.my-xl-0{margin-top:0 !important}.mr-xl-0,.mx-xl-0{margin-right:0 !important}.mb-xl-0,.my-xl-0{margin-bottom:0 !important}.ml-xl-0,.mx-xl-0{margin-left:0 !important}.m-xl-1{margin:.25rem !important}.mt-xl-1,.my-xl-1{margin-top:.25rem !important}.mr-xl-1,.mx-xl-1{margin-right:.25rem !important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem !important}.ml-xl-1,.mx-xl-1{margin-left:.25rem !important}.m-xl-2{margin:.5rem !important}.mt-xl-2,.my-xl-2{margin-top:.5rem !important}.mr-xl-2,.mx-xl-2{margin-right:.5rem !important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem !important}.ml-xl-2,.mx-xl-2{margin-left:.5rem !important}.m-xl-3{margin:1rem !important}.mt-xl-3,.my-xl-3{margin-top:1rem !important}.mr-xl-3,.mx-xl-3{margin-right:1rem !important}.mb-xl-3,.my-xl-3{margin-bottom:1rem !important}.ml-xl-3,.mx-xl-3{margin-left:1rem !important}.m-xl-4{margin:1.5rem !important}.mt-xl-4,.my-xl-4{margin-top:1.5rem !important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem !important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem !important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem !important}.m-xl-5{margin:3rem !important}.mt-xl-5,.my-xl-5{margin-top:3rem !important}.mr-xl-5,.mx-xl-5{margin-right:3rem !important}.mb-xl-5,.my-xl-5{margin-bottom:3rem !important}.ml-xl-5,.mx-xl-5{margin-left:3rem !important}.p-xl-0{padding:0 !important}.pt-xl-0,.py-xl-0{padding-top:0 !important}.pr-xl-0,.px-xl-0{padding-right:0 !important}.pb-xl-0,.py-xl-0{padding-bottom:0 !important}.pl-xl-0,.px-xl-0{padding-left:0 !important}.p-xl-1{padding:.25rem !important}.pt-xl-1,.py-xl-1{padding-top:.25rem !important}.pr-xl-1,.px-xl-1{padding-right:.25rem !important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem !important}.pl-xl-1,.px-xl-1{padding-left:.25rem !important}.p-xl-2{padding:.5rem !important}.pt-xl-2,.py-xl-2{padding-top:.5rem !important}.pr-xl-2,.px-xl-2{padding-right:.5rem !important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem !important}.pl-xl-2,.px-xl-2{padding-left:.5rem !important}.p-xl-3{padding:1rem !important}.pt-xl-3,.py-xl-3{padding-top:1rem !important}.pr-xl-3,.px-xl-3{padding-right:1rem !important}.pb-xl-3,.py-xl-3{padding-bottom:1rem !important}.pl-xl-3,.px-xl-3{padding-left:1rem !important}.p-xl-4{padding:1.5rem !important}.pt-xl-4,.py-xl-4{padding-top:1.5rem !important}.pr-xl-4,.px-xl-4{padding-right:1.5rem !important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem !important}.pl-xl-4,.px-xl-4{padding-left:1.5rem !important}.p-xl-5{padding:3rem !important}.pt-xl-5,.py-xl-5{padding-top:3rem !important}.pr-xl-5,.px-xl-5{padding-right:3rem !important}.pb-xl-5,.py-xl-5{padding-bottom:3rem !important}.pl-xl-5,.px-xl-5{padding-left:3rem !important}.m-xl-auto{margin:auto !important}.mt-xl-auto,.my-xl-auto{margin-top:auto !important}.mr-xl-auto,.mx-xl-auto{margin-right:auto !important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto !important}.ml-xl-auto,.mx-xl-auto{margin-left:auto !important}}.text-justify{text-align:justify !important}.text-nowrap{white-space:nowrap !important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}@media (min-width: 576px){.text-sm-left{text-align:left !important}.text-sm-right{text-align:right !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-left{text-align:left !important}.text-md-right{text-align:right !important}.text-md-center{text-align:center !important}}@media (min-width: 992px){.text-lg-left{text-align:left !important}.text-lg-right{text-align:right !important}.text-lg-center{text-align:center !important}}@media (min-width: 1200px){.text-xl-left{text-align:left !important}.text-xl-right{text-align:right !important}.text-xl-center{text-align:center !important}}.text-lowercase{text-transform:lowercase !important}.text-uppercase{text-transform:uppercase !important}.text-capitalize{text-transform:capitalize !important}.font-weight-light{font-weight:300 !important}.font-weight-normal{font-weight:400 !important}.font-weight-bold{font-weight:700 !important}.font-italic{font-style:italic !important}.text-white{color:#fff !important}.text-primary{color:#007bff !important}a.text-primary:hover,a.text-primary:focus{color:#0062cc !important}.text-secondary{color:#6c757d !important}a.text-secondary:hover,a.text-secondary:focus{color:#545b62 !important}.text-success{color:#28a745 !important}a.text-success:hover,a.text-success:focus{color:#1e7e34 !important}.text-info{color:#17a2b8 !important}a.text-info:hover,a.text-info:focus{color:#117a8b !important}.text-warning{color:#ffc107 !important}a.text-warning:hover,a.text-warning:focus{color:#d39e00 !important}.text-danger{color:#dc3545 !important}a.text-danger:hover,a.text-danger:focus{color:#bd2130 !important}.text-light{color:#f8f9fa !important}a.text-light:hover,a.text-light:focus{color:#dae0e5 !important}.text-dark{color:#343a40 !important}a.text-dark:hover,a.text-dark:focus{color:#1d2124 !important}.text-muted{color:#6c757d !important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media print{*,*::before,*::after{text-shadow:none !important;box-shadow:none !important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap !important}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px !important}.container{min-width:992px !important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}.switch{font-size:1rem;position:relative}.switch input{position:absolute;height:1px;width:1px;background:none;border:0;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden;padding:0}.switch input+label{position:relative;min-width:calc(calc(2.375rem * .8) * 2);border-radius:calc(2.375rem * .8);height:calc(2.375rem * .8);line-height:calc(2.375rem * .8);display:inline-block;cursor:pointer;outline:none;user-select:none;vertical-align:middle;text-indent:calc(calc(calc(2.375rem * .8) * 2) + .5rem)}.switch input+label::before,.switch input+label::after{content:'';position:absolute;top:0;left:0;width:calc(calc(2.375rem * .8) * 2);bottom:0;display:block}.switch input+label::before{right:0;background-color:#dee2e6;border-radius:calc(2.375rem * .8);transition:0.2s all}.switch input+label::after{top:2px;left:2px;width:calc(calc(2.375rem * .8) - calc(2px * 2));height:calc(calc(2.375rem * .8) - calc(2px * 2));border-radius:50%;background-color:#fff;transition:0.2s all}.switch input:checked+label::before{background-color:#08d}.switch input:checked+label::after{margin-left:calc(2.375rem * .8)}.switch input:focus+label::before{outline:none;box-shadow:0 0 0 .2rem rgba(0,136,221,0.25)}.switch input:disabled+label{color:#868e96;cursor:not-allowed}.switch input:disabled+label::before{background-color:#e9ecef}.switch.switch-sm{font-size:.875rem}.switch.switch-sm input+label{min-width:calc(calc(1.9375rem * .8) * 2);height:calc(1.9375rem * .8);line-height:calc(1.9375rem * .8);text-indent:calc(calc(calc(1.9375rem * .8) * 2) + .5rem)}.switch.switch-sm input+label::before{width:calc(calc(1.9375rem * .8) * 2)}.switch.switch-sm input+label::after{width:calc(calc(1.9375rem * .8) - calc(2px * 2));height:calc(calc(1.9375rem * .8) - calc(2px * 2))}.switch.switch-sm input:checked+label::after{margin-left:calc(1.9375rem * .8)}.switch.switch-lg{font-size:1.25rem}.switch.switch-lg input+label{min-width:calc(calc(3rem * .8) * 2);height:calc(3rem * .8);line-height:calc(3rem * .8);text-indent:calc(calc(calc(3rem * .8) * 2) + .5rem)}.switch.switch-lg input+label::before{width:calc(calc(3rem * .8) * 2)}.switch.switch-lg input+label::after{width:calc(calc(3rem * .8) - calc(2px * 2));height:calc(calc(3rem * .8) - calc(2px * 2))}.switch.switch-lg input:checked+label::after{margin-left:calc(3rem * .8)}.switch+.switch{margin-left:1rem}.switch.danger input:checked+label::before{background-color:#dc3545}.switch.danger input:focus+label::before{box-shadow:0 0 0 .2rem rgba(220,53,69,0.25)}html{font-size:0.8em;background-color:#f8f9fa}body{background-color:transparent;position:relative}label{margin-bottom:.2rem;min-height:1.5rem}.form-group span label{display:inline-block}.form-group label{display:block}.form-group li label{display:inline-block}.form-group li .form-control{width:auto}.form-group li input[type="radio"].form-control,.form-group li input[type="checkbox"].form-control{display:inline}pre{white-space:pre-wrap}.raw-description{white-space:pre-line}.form-control.small-input,.input-group>.form-control.small-input{width:110px;flex:none}.input-group>input[type=checkbox]{margin:0.5em 1em}.form-row.odd{background-color:#e9ecef}.form-row-modal{padding:0.5rem 2rem}.field-tip{position:absolute;right:10px;top:5px;opacity:0.7}.form-group .select2-container--default .select2-selection--multiple{border:1px solid #ced4da}.page-link.imported-page{color:#aa8fda}.page-link.imported-page.current-page,.page-link.current-page{color:black;font-weight:bold}#modal-advanced-search .modal-header{flex-wrap:wrap;padding-bottom:0}#modal-advanced-search .modal-header .alert-secondary{background-color:#fff}.modal-header,.modal-footer{background-color:#e9ecef}.modal-body.body-scroll{max-height:calc(100vh - 200px);overflow-y:auto}.modal-dialog.full{width:98%;height:98%;max-width:none;padding:1%}.modal-dialog.full .display.dataTable{width:100% !important}.modal-dialog.full .modal-content{height:auto;min-height:100%;border-radius:0}.table{background-color:white}.input-progress.form-control:focus,.input-progress{background-color:#dee2e6}.card-header,.input-progress,.table-striped tbody tr:nth-of-type(2n+1),.dt-bootstrap4 table.dataTable.stripe tbody tr.odd,.dt-bootstrap4 table.dataTable.display tbody tr.odd{background-color:#e9ecef}.dropdown-item:hover,.dropdown-item:focus,.dt-bootstrap4 table.dataTable.hover tbody tr:hover,.dt-bootstrap4 table.dataTable.display tbody tr:hover{background-color:#f6f6f6;background-color:#dee2e6}table.dataTable{font-size:0.8em}.table-modal-lg table.dataTable{font-size:1em}div.dt-buttons{float:right}.dt-button{color:#fff;background-color:#007bff;border-color:#007bff;display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;border:1px solid transparent;color:#fff;background-color:#6c757d;border-color:#6c757d;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out}.dt-button:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.dt-button:focus,.dt-button.focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.dt-button.disabled,.dt-button:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.dt-button:not(:disabled):not(.disabled):active,.dt-button:not(:disabled):not(.disabled).active,.show>.dt-button.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.dt-button:not(:disabled):not(.disabled):active:focus,.dt-button:not(:disabled):not(.disabled).active:focus,.show>.dt-button.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,0.5)}.dt-button.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.dt-button.btn-success:focus,.dt-button.btn-success.focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.dt-button.btn-success.disabled,.dt-button.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.dt-button.btn-success:not(:disabled):not(.disabled):active,.dt-button.btn-success:not(:disabled):not(.disabled).active,.show>.dt-button.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.dt-button.btn-success:not(:disabled):not(.disabled):active:focus,.dt-button.btn-success:not(:disabled):not(.disabled).active:focus,.show>.dt-button.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,0.5)}.dt-button.disabled{background-color:#f8f9fa;border-color:#f8f9fa;color:#adb5bd;cursor:not-allowed}.small-button{padding:0.1em 0.2em}.previous-value{margin:0.4em 0;display:block}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.1rem}textarea{height:90px}.sheet h4{color:#6c757d}#bookmark-list .input-link{width:100%;padding-right:5px}#window-fixed-menu{background-color:#e9ecef;position:fixed;right:0;margin-top:100px;z-index:50;width:200px}#window-fixed-menu-list li{padding-bottom:0.5em}#window-fixed-menu-list li a.nav-link{background-color:white}#window-fixed-menu-list li a.nav-link.active{background-color:#007bff}#window-menu-title{font-size:1.3em}#window-menu-control{font-size:0.6em;padding-top:0.2em}#window-fixed-menu.hidden{transform:rotate(270deg);transform-origin:right bottom 0}#window-fixed-menu.hidden i.fa-times{transform:rotate(45deg);transform-origin:10px 10px 0;padding-left:0.1em}.form h4,.form h3,.collapse-form .card-header,#window h3{background-color:#ced4da}.collapse-form .card,.collapse-form .card-header{border-radius:0;border:0 solid}.collapse-form .card-header{padding:0;text-align:center}.collapse-form .card-header h4{margin-bottom:0}.collapse-form .card-header .btn.btn-link{color:#212529;width:100%}.collapse-form .card-body{border:1px solid #ced4da}.collapse-form .fa-expand,.collapse-form .collapsed .fa-compress{display:none}.collapse-form .collapsed .fa-expand,.collapse-form .fa-compress{display:inline-block}.clean-table h4,.form h4,.form h3,.collapse-form .card-header h4 .btn,.sheet h4,.sheet h3,.sheet h2{text-align:center;text-shadow:2px 2px 2px rgba(150,150,150,0.7)}.sheet .subsection{background-color:#e9ecef}.sheet .row.toolbar{padding:0.5em 0.75em}.sheet .row{padding:0 0.75em;margin:0}.clean-table h4{margin-top:1em}.container{margin-top:1em;margin-bottom:8em}.bg-dark{background-color:#432776 !important}.navbar{padding:0 0.5rem}.navbar-dark .navbar-nav.action-menu .nav-link{color:#ffe484;border:1px solid #ffe484;border-radius:4px;margin:0.2em;padding:0.3em 0.6em}.navbar-dark .navbar-nav.action-menu .d-none .nav-link{border:0px solid transparent}.navbar-dark .navbar-nav.action-menu .d-none .nav-link:hover{background-color:transparent;color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link:hover{background-color:#ffe484;color:#343a40}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle::after{color:#ffe484}.navbar-dark .navbar-nav.action-menu .nav-link.dropdown-toggle:hover::after{color:#343a40}#context-menu,#reminder,.confirm-message,div#validation-bar{background-color:#6f42c1;color:rgba(255,255,255,0.8)}#reminder{padding:0.6em 1em 0.1em 1em}#alert-list a{font-size:1.1rem}.confirm-message{text-align:center;margin:0;padding:0.5rem;font-weight:bold}.is-invalid input{border-color:#f99}.errorlist{color:#900}#shortcut-menu{width:700px;padding:1em}#context-menu a.nav-link{color:rgba(255,255,255,0.8);padding:0.8rem 0.5rem 0.7rem 0.5rem}#context-menu .breadcrumb{margin-bottom:0;background-color:transparent}#current_items{width:100%}div#foot{background-color:#432776;color:rgba(255,255,255,0.5)}div#foot a{color:#ddd}div#foot a:hover{color:#fff}.breadcrumb button{border:0 transparent;background-color:transparent}.breadcrumb a:hover{text-decoration:none}.breadcrumb button:hover{cursor:pointer;color:#0062cc}.input-group.date input{border:1px solid #dee2e6;border-radius:.25rem;padding:.375rem .75rem;font-size:1rem;line-height:1.5}.input-group.date .input-group-text:hover{cursor:pointer}.input-group>ul{padding:0.5em;border:1px solid #dee2e6;border-radius:.25rem;margin:0;list-style:none}.help-text{max-height:250px;overflow:auto}.input-link{color:#6c757d}.input-link.disabled{color:#adb5bd}.input-link:hover{color:#343a40;cursor:pointer}.input-link.disabled:hover{color:#adb5bd;cursor:not-allowed}.input-sep{background-color:#fff;padding:0.3rem}.search_button{display:none}.lightgallery-captions{display:none}.lightgallery-subimage{display:inline-block;width:80px;padding:0.2em}.lightgallery-subimage img{width:100%}.lg .lg-sub-html{text-align:left}.lg .lg-sub-html .close{color:#fff}.lg .lg-sub-html .close:hover{opacity:0.9}#basket-manage #foot_pk{display:none}#basket-manage #grid_pk_meta_wrapper{width:50%;float:left;padding-bottom:80px}#basket-add-button{width:8%;float:left;margin:20vh 1% 0 1%}#basket-content-wrapper{width:40%;float:left}#basket-content{text-align:left;overflow:auto;max-height:60vh}.ui-widget-content{border:1px solid #dee2e6;background-color:#fff}.ui-menu-item{padding:0.2em 0.4em;border:1px solid #fff}.ui-menu-item:hover{color:#6f3b93;border:1px solid #6f3b93;cursor:pointer}.ui-autocomplete{font-size:0.7em;z-index:10000 !important;width:350px;border:5px solid #dee2e6;outline:none}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}
diff --git a/ishtar_common/static/js/ishtar.js b/ishtar_common/static/js/ishtar.js
index f05eb5a1b..9846b4f1a 100644
--- a/ishtar_common/static/js/ishtar.js
+++ b/ishtar_common/static/js/ishtar.js
@@ -53,14 +53,22 @@ var datatables_default = {
"scrollX": true,
"scrollY": true,
"searching": false,
- "scrollCollapse": true
+ "scrollCollapse": true,
+ "pageLength": 10,
+ "lengthMenu": [ 5, 10, 25, 50, 100 ]
};
var datatables_static_default = {
"searching": false,
- "scrollCollapse": true
+ "scrollCollapse": true,
+ "pageLength": 10,
+ "lengthMenu": [ 5, 10, 25, 50, 100 ]
};
+var activate_all_search_msg = "Searches in the shortcut menu deals with all items.";
+var activate_own_search_msg = "Searches in the shortcut menu deals with only your items.";
+var added_message = " items added.";
+
var advanced_menu = false;
var shortcut_menu_hide = false;
var activate_all_search_url = '/activate-all-search/';
@@ -128,6 +136,12 @@ function init_shortcut_fields(){
load_opened_shortcut_menu
);
});
+ $("#current_site").change(function(){
+ $.post('/' + url_path + 'update-current-item/',
+ {item:'site', value:$("#current_site").val()},
+ load_opened_shortcut_menu
+ );
+ });
$("#current_contextrecord").change(function(){
$.post('/' + url_path + 'update-current-item/',
{item:'contextrecord', value:$("#current_contextrecord").val()},
@@ -140,6 +154,12 @@ function init_shortcut_fields(){
load_opened_shortcut_menu
);
});
+ $("#current_warehouse").change(function(){
+ $.post('/' + url_path + 'update-current-item/',
+ {item:'warehouse', value:$("#current_warehouse").val()},
+ load_opened_shortcut_menu
+ );
+ });
$("#current_treatment").change(function(){
$.post('/' + url_path + 'update-current-item/',
{item:'treatment', value:$("#current_treatment").val()},
@@ -171,6 +191,14 @@ function init_advanced_shortcut_fields(){
load_opened_shortcut_menu
);
});
+ $('#id_site-shortcut').change(function(){
+ $("#id_select_site-shortcut").attr(
+ 'title', $('#id_select_site-shortcut').val());
+ $.post('/' + url_path + 'update-current-item/',
+ {item: "site", value:$("#id_site-shortcut").val()},
+ load_opened_shortcut_menu
+ );
+ });
$('#id_contextrecord-shortcut').change(function(){
$("#id_select_contextrecord-shortcut").attr(
'title', $('#id_select_contextrecord-shortcut').val());
@@ -187,6 +215,30 @@ function init_advanced_shortcut_fields(){
load_opened_shortcut_menu
);
});
+ $('#id_warehouse-shortcut').change(function(){
+ $("#id_select_warehouse-shortcut").attr(
+ 'title', $('#id_select_warehouse-shortcut').val());
+ $.post('/' + url_path + 'update-current-item/',
+ {item: "warehouse", value:$("#id_warehouse-shortcut").val()},
+ load_opened_shortcut_menu
+ );
+ });
+ $('#id_treatment-shortcut').change(function(){
+ $("#id_select_treatment-shortcut").attr(
+ 'title', $('#id_select_treatment-shortcut').val());
+ $.post('/' + url_path + 'update-current-item/',
+ {item: "treatment", value:$("#id_treatment-shortcut").val()},
+ load_opened_shortcut_menu
+ );
+ });
+ $('#id_treatmentfile-shortcut').change(function(){
+ $("#id_select_treatmentfile-shortcut").attr(
+ 'title', $('#id_select_treatmentfile-shortcut').val());
+ $.post('/' + url_path + 'update-current-item/',
+ {item: "treatmentfile", value:$("#id_treatmentfile-shortcut").val()},
+ load_opened_shortcut_menu
+ );
+ });
}
function display_info(msg){
@@ -330,6 +382,7 @@ $(document).on("click", '#to_top_arrow', function(){
});
var bookmark_url = "";
+var bookmark_delete_url = "/bookmark/delete/";
var load_bookmark_list = function(){
if (!bookmark_url) return;
@@ -337,9 +390,13 @@ var load_bookmark_list = function(){
var bookmark_list = "";
for (idx in data['bookmarks']){
var bookmark = data['bookmarks'][idx];
- bookmark_list += '<span class="dropdown-item input-link" ' +
- 'data-query="' + bookmark['query'].replace(/"/g, "''") +
- '" href="#">' + bookmark['label'] + '</span>';
+ bookmark_list += '<span class="dropdown-item d-flex">' +
+ '<a data-query="' + bookmark['query'].replace(/"/g, "''") +
+ '" href="#" class="flex-grow-1 input-link">' + bookmark['label'] +
+ '</a>' +
+ '<a class="close" href="#" data-id="' + bookmark['id'] + '">' +
+ '<i class="fa fa-times text-danger" aria-hidden="true"></i>' +
+ '</a></span>';
}
$('#bookmark-list').html(bookmark_list);
if (!bookmark_list){
@@ -347,11 +404,17 @@ var load_bookmark_list = function(){
} else {
$('#load-bookmark').removeClass('disabled');
}
- $("#bookmark-list span").click(function(){
+ $("#bookmark-list span a.input-link").click(function(){
$("#id_search_vector").val(
$(this).attr('data-query').replace(/''/g, '"'));
enable_save();
$(".search_button").click();
+ return false;
+ });
+ $("#bookmark-list span a.close").click(function(){
+ var id = $(this).attr('data-id');
+ dt_qa_open(bookmark_delete_url + id + '/');
+ return false;
});
}, 'json');
}
@@ -413,7 +476,23 @@ $(document).on("click", '#progress-content', function(){
$('.modal-progress').hide();
});
-function long_wait(){
+
+var closed_wait = true;
+
+function short_wait(check_wait){
+ if (check_wait && closed_wait){
+ return
+ }
+ closed_wait = false;
+ $('.modal-progress').modal('show');
+ $('.progress-1').show('slow');
+}
+
+function long_wait(check_wait){
+ if (check_wait && closed_wait){
+ return
+ }
+ closed_wait = false;
$('.modal-progress').modal('show');
$('.progress-1').show('slow');
setTimeout(function(){
@@ -430,11 +509,12 @@ function long_wait(){
}, 180000);
setTimeout(function(){
$('.progress-4').hide('slow');
- long_wait();
+ long_wait(true);
}, 240000);
}
function close_wait(){
+ closed_wait = true;
$('.modal-progress').modal('hide');
if (current_modal){
$('body').addClass('modal-open');
@@ -586,9 +666,6 @@ function show_hide_flex(id){
}
}
-var activate_all_search_msg = "Searches in the shortcut menu deals with all items.";
-var activate_own_search_msg = "Searches in the shortcut menu deals with only your items.";
-
function activate_all_search(){
$('.activate_all_search').removeClass('disabled');
$('.activate_own_search').addClass('disabled');
@@ -630,6 +707,23 @@ function clear_search_field(){
enable_save();
}
+function _clear_search_criteria_fields(query){
+ var datatables_length = $(".dataTables_length select").val();
+ document.getElementById('wizard-form').reset();
+ // hidden input are not cleared
+ $("#modal-advanced-search input[type='hidden']").each(
+ function(){
+ if($(this).attr("name") != 'csrfmiddlewaretoken'){
+ $(this).val("")
+ }
+ }
+ );
+ $(".dataTables_length select").val(datatables_length);
+ $('.dataTables_length select option[value="' + datatables_length + '"]'
+ ).prop('selected', true);
+ if(query) $("#id_search_vector").val(query);
+}
+
function update_search_field(){
var query = $("#id_search_vector").val();
if (!query){
@@ -677,14 +771,11 @@ function update_search_field(){
});
}
);
- document.getElementById('wizard-form').reset();
- // some input seems to be not cleared...
- $('#wizard-form input').each(function(){$(this).val("")});
- $("#id_search_vector").val(query);
+ _clear_search_criteria_fields(query);
if (query){
- add_message(query, 'info', "#advanced-search-info", true, false);
+ add_message(query, 'secondary', "#advanced-search-info", true, false);
} else {
- add_message("-", 'info', "#advanced-search-info", true, false);
+ add_message("-", 'secondary', "#advanced-search-info", true, false);
}
enable_save();
}
@@ -713,11 +804,18 @@ function toggle_window_menu(){
return false;
}
+var register_qa_on_sheet = function(){
+ $(".btn-qa").click(function(){
+ var target = $(this).attr('data-target');
+ dt_qa_open(target);
+ });
+};
+
function register_advanced_search(){
$(".advanced-search-reset").click(
function(){
- document.getElementById('wizard-form').reset();
+ _clear_search_criteria_fields();
}
);
$('#modal-advanced-search input').keypress(function(e) {
@@ -733,9 +831,7 @@ function register_advanced_search(){
$('#modal-advanced-search').on('hidden.bs.modal', function (e) {
var base_query = $("#id_search_vector").val();
// reset all criteria
- document.getElementById('wizard-form').reset();
- // restore main input
- $("#id_search_vector").val(base_query);
+ _clear_search_criteria_fields(base_query);
$(".search_button").click();
setTimeout(function(){
$("#id_search_vector").focus();
@@ -747,17 +843,89 @@ function register_advanced_search(){
}
+var _pinned_search_init = false;
+
function manage_pinned_search(name, data){
$('#pinned_search_content_' + name).html('');
for (idx in data){
if (idx == 'pinned-search' && data[idx] != ''){
- $('#pinned_search_content_' + name).html(data[idx]);
+ $("#id_search_vector").val(data[idx]);
+ if(!_pinned_search_init){
+ update_search_field();
+ _pinned_search_init = true;
+ }
}
}
- if ($('#pinned_search_content_' + name).html()){
- $('#pinned_search_' + name).show();
- } else {
- $('#pinned_search_' + name).hide();
- }
}
+var dt_generate_qa_url = function (table, url){
+ var data = table.rows( { selected: true } ).data();
+ var value = "";
+ for (k in data){
+ if (!data[k]['id']) continue;
+ if (k > 0) value += "-";
+ value += data[k]['id'];
+ }
+ url += value + "/";
+ return url;
+};
+
+var dt_qa_open = function (url){
+ short_wait();
+ $.ajax({
+ url: url,
+ cache: false,
+ success: function(data, textStatus, jqXHR) {
+ close_wait();
+ var text = jqXHR.responseText;
+ $('#modal-dynamic-form').html(text);
+ var response = $(text);
+ var responseScript = response.find("script");
+ $.each(responseScript, function(idx, val){
+ eval(val.text);
+ }
+ );
+ $('#modal-dynamic-form').modal("show");
+ },
+ error: function() {
+ close_wait();
+ }
+ });
+ return false;
+};
+
+var ajax_post = function(url, data, target, callback){
+ $.ajax({
+ url : url,
+ type : "POST",
+ data : data,
+ success : function(data) {
+ close_wait();
+ $(target).html(data);
+ if(callback) callback();
+ },
+ error : function(xhr,errmsg,err) {
+ close_wait();
+ $(target).html("<div class='alert-box alert'>Oops! We have encountered an error: "
+ + errmsg + "</div>");
+ console.log(xhr.status + ": " + xhr.responseText);
+ if(callback) callback();
+ }
+ });
+
+};
+
+var qa_action_register = function(url) {
+
+ $('#qa-action').on('submit', function(event){
+ event.preventDefault();
+ $('#modal-dynamic-form').modal("hide");
+ short_wait();
+ ajax_post(
+ url, $(this).serialize(), "#modal-dynamic-form",
+ function(){
+ $('#modal-dynamic-form').modal("show");
+ }
+ );
+ });
+};
diff --git a/ishtar_common/templates/base.html b/ishtar_common/templates/base.html
index b9270d910..ef3060a5f 100644
--- a/ishtar_common/templates/base.html
+++ b/ishtar_common/templates/base.html
@@ -40,6 +40,7 @@
var activate_own_search_url = '{% url "activate-own-search" %}';
var activate_all_search_msg = "{% trans 'Searches in the shortcut menu deal with all items.' %}";
var activate_own_search_msg = "{% trans 'Searches in the shortcut menu deal with only your items.' %}";
+ var added_message = "{% trans " items added." %}";
var YES = "{% trans 'yes' %}";
var NO = "{% trans 'no' %}";
var autorefresh_message_start = "{% trans 'Autorefresh start. The form is disabled.' %}";
@@ -141,7 +142,8 @@
{% trans "Time to take a coffee?" %} <i class="fa fa-coffee" aria-hidden="true"></i></span>
<span class='progress-detail progress-4'>
{% trans "Time to take another coffee?" %} <i class="fa fa-coffee" aria-hidden="true"></i></span>
- <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"
+ onclick="closed_wait = true;return true;">
<span aria-hidden="true">&times;</span>
</button>
</div>
diff --git a/ishtar_common/templates/blocks/DataTables.html b/ishtar_common/templates/blocks/DataTables.html
index 70d47cb8d..b5f669963 100644
--- a/ishtar_common/templates/blocks/DataTables.html
+++ b/ishtar_common/templates/blocks/DataTables.html
@@ -10,12 +10,6 @@
<p><a href="#" onclick="open_window('{{url_new}}');">{{new_message}}</a></p>
{% endif %}
-<div class="alert alert-info" role="alert" id="pinned_search_{{name}}">
- <i class="fa fa-thumb-tack"></i> &nbsp;
- <strong>{% trans "Pinned search:" %}</strong>
- <em><span id="pinned_search_content_{{name}}"></span></em>
-</div>
-
<div class="modal fade table-modal-lg" tabindex="-1" role="dialog"
aria-hidden="true" id="modal_grid_{{name}}">
<div class="modal-dialog full modal-lg">
@@ -140,8 +134,6 @@ datatable_submit_search = function(){
return false;
};
-
-
jQuery(document).ready(function(){
jQuery("#search_{{name}}").click(datatable_submit_search);
@@ -162,16 +154,35 @@ jQuery(document).ready(function(){
"select": {
"style": {% if multiple_select %}'multi'{% else %}'single'{% endif %}
},
- {% if multiple_select %}"buttons": [
- 'selectAll',
- 'selectNone'
- ],
- "language": {
- buttons: {
- selectAll: "{% trans 'Select all items' %}",
- selectNone: "{% trans 'Select none' %}"
+ {% if multiple_select or quick_actions %}"buttons": [
+ {% for url, title, icon, target in quick_actions %}
+ {
+ {% if target == 'one' %}extend: 'selectedSingle',
+ {% elif target == 'many' %}extend: 'selected',
+ {% endif %}
+ className: "btn btn-success",
+ text: "{{icon}}",
+ titleAttr: "{{title}}",
+ action: function (e, dt, node, config) {
+ var url = dt_generate_qa_url(dt, "{{url}}");
+ dt_qa_open(url);
+ return false;
+ }
+ },
+ {% if not forloop.last %},{% endif %}
+ {% endfor %}{% if multiple_select %}{% if quick_actions%},{% endif %}
+ {
+ extend: 'selectAll',
+ text: '<i class="fa fa-check-circle-o"></i>',
+ titleAttr: "{% trans 'Select all items' %}"
+ },
+ {
+ extend: 'selectNone',
+ text: '<i class="fa fa-times"></i>',
+ titleAttr: "{% trans 'Deselect' %}"
}
- },
+ {% endif %}
+ ],
"dom": 'lBtip',
{% else %}
"dom": 'ltip',
@@ -190,49 +201,6 @@ jQuery(document).ready(function(){
if (datatables_i18n) datatable_options['language'] = datatables_i18n;
datatable_{{sname}} = jQuery("#grid_{{name}}").DataTable(datatable_options);
-{% comment %}
-
- jQuery("#grid_{{name}}").jqGrid({
- url:'{{source}}',
- datatype: "json",
- mtype: 'GET',
- colNames:['id', '', {{col_names|safe}}],
- colModel:[
- {name:'id', index:'id', hidden:true},
- {name:'link', index:'link', width:30},
- {{extra_cols|safe}}
- ],
- height: 300,
- sortname: '__default__',
- viewrecords: true,
- sortorder: "asc",
- emptyrecords: "{{no_result}}",
- loadtext: "{{loading}}",
- pager: '#pager_{{name}}',
- width: null,
- shrinkToFit: false,
- rowNum:20,
- {% if multiple_select %}multiselect: true,{% endif %}
- jsonReader : {repeatitems: false},
- loadError: function (jqXHR, textStatus, errorThrown) {
- alert("{% trans "An error as occured during search. Check your query fields." %}");
- },
- beforeProcessing: function(data, status, xhr){
- $('#pinned_search_content_{{name}}').html('');
- for (idx in data){
- if (idx == 'pinned-search' && data[idx] != ''){
- $('#pinned_search_content_{{name}}').html(data[idx]);
- }
- }
- if ($('#pinned_search_content_{{name}}').html()){
- $('#pinned_search_{{name}}').show();
- } else {
- $('#pinned_search_{{name}}').hide();
- }
- }
- });
-{% endcomment %}
-
{% if multiple %}
jQuery("#add_button_{{name}}").click(function (){
var mygrid = jQuery("#grid_{{name}}");
@@ -273,8 +241,10 @@ jQuery(document).ready(function(){
{% if multiple_select %}
var value = "";
for (k in data){
- if (k > 0) value += ",";
- value += data[k]['id'];
+ if (typeof data[k]['id'] != "undefined") {
+ if (value) value += ",";
+ value += data[k]['id'];
+ }
}
{% else %}
var value = data[0]['id'];
diff --git a/ishtar_common/templates/blocks/bs_form_snippet.html b/ishtar_common/templates/blocks/bs_form_snippet.html
index 95b8ac086..0f5f9d83d 100644
--- a/ishtar_common/templates/blocks/bs_form_snippet.html
+++ b/ishtar_common/templates/blocks/bs_form_snippet.html
@@ -12,6 +12,7 @@
</div>{% endif %}
{% endfor %}
+{% csrf_token %}
{% for field in form.visible_fields %}
{% if form.SEARCH_AND_SELECT %}
{{field}}
@@ -48,22 +49,9 @@
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
+ <div class="form-group col-12" id="advanced-search-info"></div>
</div>
- <div class="modal-body form-row">
- <div class="form-group col-12" id="advanced-search-info">
- </div>
- <div class="form-group col-12">
- <p class="text-center">
- <button type="button"
- class="btn btn-primary advanced-search-valid">
- {% trans "Add" %}</button>
- <button type="button"
- class="btn btn-secondary advanced-search-clear">
- {% trans 'Clear' %}</button>
- <button type="button" class="btn btn-secondary"
- data-dismiss="modal">{% trans 'Close' %}</button>
- </p>
- </div>
+ <div class="modal-body body-scroll">
<hr>
{% endif %}
{% if field.name in form.HEADERS %}
@@ -91,6 +79,8 @@
{% if search and forloop.counter0 >= 1 %}
</div>
+ </div>
+ <div class="modal-footer">
<div class="form-group col-12">
<p class="text-center">
<button type="button"
diff --git a/ishtar_common/templates/ishtar/blocks/advanced_shortcut_menu.html b/ishtar_common/templates/ishtar/blocks/advanced_shortcut_menu.html
index 953b0ef40..e1dc852d9 100644
--- a/ishtar_common/templates/ishtar/blocks/advanced_shortcut_menu.html
+++ b/ishtar_common/templates/ishtar/blocks/advanced_shortcut_menu.html
@@ -1,27 +1,36 @@
{% extends "ishtar/blocks/base_shortcut_menu.html" %}
{% load i18n %}
{% block short_content %}
-<div class="short-menu-buttons btn-group" role="group">
- <button type="button" class="btn btn-secondary"
- id='short-menu-simple' title="{% trans 'Simple menu limited to your own items. Be careful only the last 100 items are displayed.' %}">{% trans "simple" %}</button>
- <button type="button" class="btn btn-secondary active" id='short-menu-advanced' title="{% trans 'Advanced menu' %}">{% trans "advanced" %}</button>
-</div>
-<div id='action_current_items' class="btn-group" role="group">
- <button type="button" onclick='return activate_own_search();'
- title="{% trans 'Search within my items' %}"
- class='btn btn-secondary activate_own_search{% if SHORTCUT_SEARCH == "own" %} active{% endif %}'>
- <i class="icon fa fa-user" aria-hidden="true"></i>
- </button>
- <button type="button" onclick='return activate_all_search();'
- title="{% trans 'Search within all items' %}"
- class='btn btn-secondary activate_all_search{% if SHORTCUT_SEARCH == "all" %} active{% endif %}'>
- <i class="icon fa fa-users" aria-hidden="true"></i>
- </button>
- {% comment %}
- <p>
- <a href='' onclick='return load_shortcut_menu();' class='disabled'><i class="icon fa fa-2x fa-refresh" aria-hidden="true" title="{% trans 'Refresh menu' %}"></i></a>
- </p>
- {% endcomment %}
+<div class="d-flex">
+ <div class="short-menu-buttons btn-group p-2" role="group">
+ <button type="button" class="btn btn-secondary"
+ id='short-menu-simple' title="{% trans 'Simple menu limited to your own items. Be careful only the last 100 items are displayed.' %}">{% trans "simple" %}</button>
+ <button type="button" class="btn btn-secondary active" id='short-menu-advanced' title="{% trans 'Advanced menu' %}">{% trans "advanced" %}</button>
+ </div>
+ <div id='action_current_items' class="btn-group p-2" role="group">
+ <button type="button" onclick='return activate_own_search();'
+ title="{% trans 'Search within my items' %}"
+ class='btn btn-secondary activate_own_search{% if SHORTCUT_SEARCH == "own" %} active{% endif %}'>
+ <i class="icon fa fa-user" aria-hidden="true"></i>
+ </button>
+ <button type="button" onclick='return activate_all_search();'
+ title="{% trans 'Search within all items' %}"
+ class='btn btn-secondary activate_all_search{% if SHORTCUT_SEARCH == "all" %} active{% endif %}'>
+ <i class="icon fa fa-users" aria-hidden="true"></i>
+ </button>
+ {% comment %}
+ <p>
+ <a href='' onclick='return load_shortcut_menu();' class='disabled'><i class="icon fa fa-2x fa-refresh" aria-hidden="true" title="{% trans 'Refresh menu' %}"></i></a>
+ </p>
+ {% endcomment %}
+ </div>
+ <div class="short-menu-buttons btn-group ml-auto p-2" role="group">
+ <button type="button" class="btn btn-secondary active"
+ id='short-menu-refresh' onclick="location.reload();"
+ title="{% trans 'Refresh current page' %}">
+ <i class="icon fa fa-refresh" aria-hidden="true"></i>
+ </button>
+ </div>
</div>
<p id='current_items'>
{% for lbl, model_name, current, widget in menu %}
diff --git a/ishtar_common/templates/ishtar/blocks/shortcut_menu.html b/ishtar_common/templates/ishtar/blocks/shortcut_menu.html
index 10113aa59..447deb573 100644
--- a/ishtar_common/templates/ishtar/blocks/shortcut_menu.html
+++ b/ishtar_common/templates/ishtar/blocks/shortcut_menu.html
@@ -1,10 +1,19 @@
{% extends "ishtar/blocks/base_shortcut_menu.html" %}
{% load i18n %}
{% block short_content %}
-<div class="short-menu-buttons btn-group" role="group">
- <button type="button" class="btn btn-secondary active"
- id='short-menu-simple' title="{% trans 'Simple menu limited to your own items. Be careful only the last 100 items are displayed.' %}">{% trans "simple" %}</button>
- <button type="button" class="btn btn-secondary" id='short-menu-advanced' title="{% trans 'Advanced menu' %}">{% trans "advanced" %}</button>
+<div class="d-flex">
+ <div class="short-menu-buttons btn-group p-2" role="group">
+ <button type="button" class="btn btn-secondary active"
+ id='short-menu-simple' title="{% trans 'Simple menu limited to your own items. Be careful only the last 100 items are displayed.' %}">{% trans "simple" %}</button>
+ <button type="button" class="btn btn-secondary" id='short-menu-advanced' title="{% trans 'Advanced menu' %}">{% trans "advanced" %}</button>
+ </div>
+ <div class="short-menu-buttons btn-group ml-auto p-2" role="group">
+ <button type="button" class="btn btn-secondary active"
+ id='short-menu-refresh' onclick="location.reload();"
+ title="{% trans 'Refresh current page' %}">
+ <i class="icon fa fa-refresh" aria-hidden="true"></i>
+ </button>
+ </div>
</div>
<div>
<p class="alert alert-info mt-2">
diff --git a/ishtar_common/templates/ishtar/blocks/window_image_detail.html b/ishtar_common/templates/ishtar/blocks/window_image_detail.html
index b095c8b04..5be68eeef 100644
--- a/ishtar_common/templates/ishtar/blocks/window_image_detail.html
+++ b/ishtar_common/templates/ishtar/blocks/window_image_detail.html
@@ -112,7 +112,7 @@
</div>
</div>
{% endif %}
-{% if image.item_number %}
+{% if image.item_number and image.item_number != 1 %}
<div class="row">
<div class="col-2">
<strong>{% trans "Number of items" %}</strong>
diff --git a/ishtar_common/templates/ishtar/blocks/window_nav.html b/ishtar_common/templates/ishtar/blocks/window_nav.html
index 764797ce2..6cd4bff40 100644
--- a/ishtar_common/templates/ishtar/blocks/window_nav.html
+++ b/ishtar_common/templates/ishtar/blocks/window_nav.html
@@ -31,26 +31,32 @@
{% else %}
<div class='offset-md-8 col-md-4 text-right'>
{% endif %}
- <div class="btn-group btn-group-sm" role="group" aria-label="{% trans 'Actions' %}">
- {% if pin_action and item.SLUG %}
- <a class="btn btn-secondary" href="#" class='pin-action'
+ {% if pin_action and item.SLUG %}
+ <div class="btn-group btn-group-sm" role="group"
+ aria-label="{% trans 'Pin' %}">
+ <a class="btn btn-secondary pin-action" href="#"
onclick='$.get("{% url "pin" item.SLUG item.pk %}", function(){load_shortcut_menu(); display_info("{% trans 'Item pined in your shortcut menu.' %}")});' title="{% trans 'Pin' %}">
- <i class="fa fa-thumb-tack"></i>
+ <i class="fa fa-thumb-tack"></i>
</a>
- {% endif %}
+ </div>
+ {% endif %}
+ <div class="btn-group btn-group-sm" role="group" aria-label="{% trans 'Actions' %}">
{% block extra_actions %}{% endblock %}
{% if modify_url %}
- <a class="btn btn-secondary" href='{% url modify_url item.pk %}'
+ <a class="btn btn-success" href='{% url modify_url item.pk %}'
title="{% trans 'Modify' %}">
<i class="fa fa-pencil"></i>
</a>
{% endif %}
- {% for url, base_text, icon, extra_text, css_class in extra_actions %}
- <a class="btn btn-secondary{% if css_class %} {{css_class}}{% endif %}"
- href='{{url}}' title="{{base_text}}">
+ {% for url, base_text, icon, extra_text, css_class, is_qa in extra_actions %}
+ <a class="{% if is_qa %}btn-qa {% endif %}btn btn-success{% if css_class %} {{css_class}}{% endif %}"
+ {% if is_qa %}href="#" data-target="{{url}}"{% else %}href='{{url}}'{% endif %} title="{{base_text}}">
<i class="{{icon}}"></i> {{extra_text}}
</a>
{% endfor %}
+ </div>
+ <div class="btn-group btn-group-sm" role="group"
+ aria-label="{% trans 'Export' %}">
<a class="btn btn-secondary" href='{% url show_url item.pk "odt" %}'
title='{% trans "Export as OpenOffice.org file"%}'>
ODT <i class="fa fa-file-word-o" aria-hidden="true"></i>
@@ -66,3 +72,8 @@
{% trans "Relation between items are not historized." %}
</div>
{% endif %}
+<script type="text/javascript">
+$(document).ready(function(){
+ register_qa_on_sheet();
+});
+</script> \ No newline at end of file
diff --git a/ishtar_common/templates/ishtar/forms/bookmark_delete.html b/ishtar_common/templates/ishtar/forms/bookmark_delete.html
new file mode 100644
index 000000000..4a0b907ff
--- /dev/null
+++ b/ishtar_common/templates/ishtar/forms/bookmark_delete.html
@@ -0,0 +1,7 @@
+{% extends "ishtar/forms/qa_base.html" %}
+{% load i18n inline_formset table_form %}
+
+{% block main_form %}
+ <p>{% trans "Are you sure you want to delete: " %} {{item}}</p>
+{% endblock %}
+
diff --git a/ishtar_common/templates/ishtar/forms/qa_base.html b/ishtar_common/templates/ishtar/forms/qa_base.html
new file mode 100644
index 000000000..70fe70e65
--- /dev/null
+++ b/ishtar_common/templates/ishtar/forms/qa_base.html
@@ -0,0 +1,77 @@
+{% load i18n inline_formset table_form %}
+
+<div
+ class="modal-dialog {% if modal_size == 'large' %}modal-lg {% elif modal_size == 'small'%}modal-sm {% endif%}modal-dialog-centered">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h2>{{page_name|safe}}</h2>
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+ <span aria-hidden="true">&times;</span>
+ </button>
+ </div>
+ <form enctype="multipart/form-data" action="{{url}}" method="post"
+ id="qa-action">{% csrf_token %}
+ <div class="modal-body body-scroll">
+ <div class='form'>
+ {% block main_form %}
+
+ {% for error in form.non_field_errors %}
+ <p>{{ error }}</p>
+ {% endfor %}
+ {% bs_form form %}
+
+ {% if confirm %}
+ <input type="hidden" name="confirm" value="1"/>
+ <h4>{% trans "Modified items" %}</h4>
+ <ul>{% for item in items %}
+ <li>{{item}}</li>{% endfor %}
+ </ul>
+ <h4>{% trans "Modification" %}</h4>
+ <table>
+ {% for field in form %}
+ {% if field.value %}
+ <tr>
+ <th>{{field.label}}{% trans ":" %}&nbsp;</th>
+ <td>{% if field.field.rendered_value %}
+ {{ field.field.rendered_value }}
+ {% else %}
+ {{ field.value }}
+ {% endif %}
+ </td>
+ </tr>
+ {% endif %}
+ {% endfor %}
+ </table>
+ {% endif %}
+
+ {% endblock %}
+ </div>
+ </div>
+ <div class="modal-footer">
+ {% block footer %}
+ <button type="submit" id="submit_form" name='validate'
+ value="validate" class="btn btn-success">
+ {% if action_name %}
+ {{ action_name }}
+ {% else %}
+ {% trans "Modify" %}
+ {% endif %}
+ </button>
+ <button type="button" data-dismiss="modal"
+ aria-label="Close" class="btn btn-secondary">
+ {% trans "Cancel" %}
+ </button>
+ {% endblock %}
+ </div>
+ </form>
+ </div>
+</div>
+<script type="text/javascript">
+ {% block js %}
+ {% endblock %}
+ $(document).ready(function(){
+ qa_action_register("{{url}}");
+ });
+</script>
+
+
diff --git a/ishtar_common/templates/ishtar/forms/qa_form.html b/ishtar_common/templates/ishtar/forms/qa_form.html
new file mode 100644
index 000000000..c843dbd2d
--- /dev/null
+++ b/ishtar_common/templates/ishtar/forms/qa_form.html
@@ -0,0 +1,33 @@
+{% extends "ishtar/forms/qa_base.html" %}
+{% load i18n inline_formset table_form %}
+
+{% block main_form %}
+ {% for error in form.non_field_errors %}
+ <p>{{ error }}</p>
+ {% endfor %}
+ {% bs_form form %}
+
+ {% if confirm %}
+ <input type="hidden" name="confirm" value="1"/>
+ <h4>{% trans "Modified items" %}</h4>
+ <ul>{% for item in items %}
+ <li>{{item}}</li>{% endfor %}
+ </ul>
+ <h4>{% trans "Modification" %}</h4>
+ <table>
+ {% for field in form %}
+ {% if field.value %}
+ <tr>
+ <th>{{field.label}}{% trans ":" %}&nbsp;</th>
+ <td>{% if field.field.rendered_value %}
+ {{ field.field.rendered_value }}
+ {% else %}
+ {{ field.value }}
+ {% endif %}
+ </td>
+ </tr>
+ {% endif %}
+ {% endfor %}
+ </table>
+ {% endif %}
+{% endblock %}
diff --git a/ishtar_common/templates/ishtar/forms/success.html b/ishtar_common/templates/ishtar/forms/success.html
index 77fa260d1..3b28ac1d8 100644
--- a/ishtar_common/templates/ishtar/forms/success.html
+++ b/ishtar_common/templates/ishtar/forms/success.html
@@ -9,7 +9,7 @@ $(document).ready(function(){
});
</script>
-<div class="modal-dialog modal-sm" id="form-result-div">
+<div class="modal-dialog modal-sm modal-dialog-centered" id="form-result-div">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
@@ -17,7 +17,7 @@ $(document).ready(function(){
</button>
</div>
<div class="modal-body form-row">
- {% trans "Form successfully submited" %}
+ {% trans "Changes made successfully." %}
</div>
</div>
</div>
diff --git a/ishtar_common/templates/ishtar/manage_basket.html b/ishtar_common/templates/ishtar/manage_basket.html
index 26dd75c4c..28d713e9a 100644
--- a/ishtar_common/templates/ishtar/manage_basket.html
+++ b/ishtar_common/templates/ishtar/manage_basket.html
@@ -2,20 +2,24 @@
{% load i18n inline_formset %}
{% block content %}
<h2>{{page_name}}{% trans ":"%} {{basket}}</h2>
-<form enctype="multipart/form-data" action="." method="post">{% csrf_token %}
-<div class='form'>
+<form enctype="multipart/form-data" action="." method="post"
+ id="wizard-form">{% csrf_token %}
+<div class='form' id="basket-manage">
<div class="alert alert-warning" role="alert">
{% trans 'Checking "Select all" only selects the current page.' %}
</div>
{{form}}
- <div class="text-center">
+ <div class="text-center" id="basket-add-button">
<button class="btn btn-primary" type="button" id='add_to'>
- {% trans "Add" %}
+ <span class="d-none d-lg-block">{% trans "Add" %}</span>
+ <span class="d-block d-lg-none">&gt;</span>
</button>
</div>
-<h3>{% trans "Basket content" %}</h3>
-<div id='basket-content' style='text-align:left'>
-</div>
+ <div id="basket-content-wrapper">
+ <h3>{% trans "Basket content" %}</h3>
+ <div id='basket-content'>
+ </div>
+ </div>
{% block "footer" %}
<div id="footer">
<div id='validation-bar'>
@@ -30,10 +34,14 @@
</form>
<script type='text/javascript' language='javascript'>
+var current_item_number = 0;
+
function load_list(data, last){
$('#basket-content').html(data);
- if (last){
+ if (last == true){
close_wait();
+ var added = $("#basket-content li").length - current_item_number;
+ display_info(added + added_message);
}
}
@@ -41,6 +49,7 @@ $('#add_to').click(function(){
var selected_items = datatable_pk.rows( { selected: true } ).data();
if(!selected_items) return false;
$('.modal-progress').modal('show');
+ current_item_number = $("#basket-content li").length;
for (i = 0, n = selected_items.length; i < n; i++) {
var selected_item = selected_items[i]['id'];
last = i == n - 1;
diff --git a/ishtar_common/templates/ishtar/sheet_document.html b/ishtar_common/templates/ishtar/sheet_document.html
index 3b178c29e..af94f8fbe 100644
--- a/ishtar_common/templates/ishtar/sheet_document.html
+++ b/ishtar_common/templates/ishtar/sheet_document.html
@@ -31,7 +31,7 @@
{% field_flex "Scale" item.scale %}
{% trans "Web link" as weblink_label %}
{% field_flex_url weblink_label item.associated_url %}
- {% field_flex "Item number" item.item_number %}
+ {% if item.item_number != 1 %}{% field_flex "Item number" item.item_number %}{% endif %}
{% field_flex "Ref." item.reference %}
{% field_flex "Internal ref." item.internal_reference %}
{% field_flex "Creation date" item.creation_date %}
diff --git a/ishtar_common/templates/widgets/search_input.html b/ishtar_common/templates/widgets/search_input.html
index 0cdf74cc5..e63d067a9 100644
--- a/ishtar_common/templates/widgets/search_input.html
+++ b/ishtar_common/templates/widgets/search_input.html
@@ -2,7 +2,7 @@
<input type="{{ widget.type }}" name="{{ widget.name }}"
{% if widget.value != None %} value="{{ widget.value|stringformat:'s' }}"{% endif %}{% include "django/forms/widgets/attrs.html" %} />
<span class="input-group-append">
- <span class="input-group-text input-link"
+ <span class="input-group-text input-link bg-primary text-white"
title="{% trans 'Search' %}"
id="submit-search">
<i class="fa fa-search" aria-hidden="true"></i>
diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py
index 90a9d10ad..65a5a7593 100644
--- a/ishtar_common/tests.py
+++ b/ishtar_common/tests.py
@@ -45,7 +45,7 @@ from django.test.runner import DiscoverRunner
from ishtar_common import models
from ishtar_common import views
from ishtar_common.apps import admin_site
-from ishtar_common.utils import post_save_point
+from ishtar_common.utils import post_save_point, update_data, move_dict_data
COMMON_FIXTURES = [
@@ -93,6 +93,67 @@ class TestCase(BaseTestCase):
pass
+class UtilsTest(TestCase):
+ def test_update_data(self):
+ data_1 = {
+ 'old':
+ {'youpi':
+ {'plouf': u'tralalalère'}}
+ }
+ data_2 = {
+ 'tsoin_tsoin': 'hop',
+ 'old':
+ {'hoppy': 'hop'}
+ }
+ expected = {
+ 'tsoin_tsoin': 'hop',
+ 'old':
+ {'youpi':
+ {'plouf': u'tralalalère'},
+ 'hoppy': 'hop'}
+ }
+ res = update_data(data_1, data_2)
+ self.assertEqual(res, expected)
+
+ def test_move_dict_data(self):
+ data = {
+ 'old': {u'daté': "value"}
+ }
+ expected = {
+ 'old': {'date': "value"}
+ }
+ res = move_dict_data(
+ data, u'data__old__daté', u"data__old__date")
+ self.assertEqual(res, expected)
+ data = {
+ '': {'hop': "value"}
+ }
+ expected = {
+ 'hop': "value",
+ '': {}
+ }
+ res = move_dict_data(data, u'data____hop', u"data__hop")
+ self.assertEqual(res, expected)
+ data = {
+ 'old': {
+ 'traitement': {
+ u'constat_état': 'aaa'
+ }
+ }
+ }
+ expected = {
+ 'old': {
+ 'traitement': {
+ 'constat_etat': 'aaa'
+ }
+ }
+ }
+ res = move_dict_data(data,
+ u'data__old__traitement__constat_état',
+ u'data__old__traitement__constat_etat')
+ self.assertEqual(res, expected)
+
+
class CommandsTestCase(TestCase):
fixtures = [settings.ROOT_PATH +
'../ishtar_common/fixtures/test_towns.json']
diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py
index ee1b3805e..57241dd57 100644
--- a/ishtar_common/urls.py
+++ b/ishtar_common/urls.py
@@ -131,6 +131,8 @@ urlpatterns = [
views.BookmarkList.as_view(), name='bookmark-list'),
url(r'^bookmark/(?P<pk>[0-9]+)/$',
views.get_bookmark, name='bookmark'),
+ url(r'^bookmark/delete/(?P<pk>[0-9]+)/$',
+ views.SearchQueryDelete.as_view(), name='bookmark-delete'),
url(r'^alerts/$', views.AlertList.as_view(), name='alert-list'),
url(r'^success(?:/(?P<context>[a-z-]+))?/$',
TemplateView.as_view(template_name="ishtar/forms/success.html"),
@@ -168,6 +170,8 @@ urlpatterns += [
url(r'new-person-noorga/'
r'(?:(?P<parent_name>[^/]+)/)?(?:(?P<limits>[^/]+)/)?$',
views.new_person_noorga, name='new-person-noorga'),
+ url(r'autocomplete-user/$',
+ views.autocomplete_user, name='autocomplete-user'),
url(r'autocomplete-person(?:/([0-9_]+))?(?:/([0-9_]*))?/(user)?$',
views.autocomplete_person, name='autocomplete-person'),
url(r'autocomplete-person-permissive(?:/([0-9_]+))?(?:/([0-9_]*))?'
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index e60fc0913..4f968af31 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -145,6 +145,77 @@ def check_model_access_control(request, model, available_perms=None):
return allowed, own
+def update_data(data_1, data_2):
+ """
+ Update a data directory taking account of key detail
+ """
+ res = {}
+ if not isinstance(data_1, dict) or not isinstance(data_2, dict):
+ return data_1
+ for k in data_1:
+ if k not in data_2:
+ res[k] = data_1[k]
+ else:
+ res[k] = update_data(data_1[k], data_2[k])
+ for k in data_2:
+ if k not in data_1:
+ res[k] = data_2[k]
+ return res
+
+
+def move_dict_data(data, key1, key2):
+ """
+ Move key1 value to key2 value in a data dict
+ :param data: data dict (with subdicts)
+ :param key1: key to move (with __ notation for hierarchy - begining with
+ "data__")
+ :param key2: target key (with __ notation for hierarchy - begining with
+ "data__")
+ :return: result data
+ """
+ keys1 = key1.split('__')
+ keys2 = key2.split('__')
+ value = data
+ for idx, key in enumerate(keys1):
+ if not idx:
+ if key != 'data':
+ return data
+ continue
+ if key not in value:
+ return data
+ if idx == (len(keys1) - 1): # last
+ value = value.pop(key) # remove from data
+ else:
+ value = value[key]
+
+ new_value = data
+ for idx, key in enumerate(keys2):
+ if not idx:
+ if key != 'data':
+ return data
+ continue
+ if idx == (len(keys2) - 1): # last
+ new_value[key] = value
+ else:
+ if key not in new_value:
+ new_value[key] = {}
+ new_value = new_value[key]
+ return data
+
+
+def clean_empty_data(data):
+ """
+ Clean empty branches of a data dict
+ """
+ for key in data.keys():
+ if data[key] in [{}, None, u""]:
+ data.pop(key)
+ continue
+ if isinstance(data[key], dict):
+ data[key] = clean_empty_data(data[key])
+ return data
+
+
class MultiValueDict(BaseMultiValueDict):
def get(self, *args, **kwargs):
v = super(MultiValueDict, self).getlist(*args, **kwargs)
diff --git a/ishtar_common/utils_migrations.py b/ishtar_common/utils_migrations.py
index 48e9e4f9b..40cdcb5cd 100644
--- a/ishtar_common/utils_migrations.py
+++ b/ishtar_common/utils_migrations.py
@@ -75,3 +75,25 @@ def migrate_sources(apps, base_model, source_model, item_attr):
doc.authors.add(author)
item = base_model.objects.get(pk=getattr(source, item_attr).pk)
item.documents.add(doc)
+
+
+def reinit_last_modified(apps, app_name, models):
+ for model_name in models:
+ model = apps.get_model(app_name, model_name)
+ try:
+ historical_model = apps.get_model(
+ app_name, 'Historical' + model_name)
+ except:
+ continue
+ for item in model.objects.all():
+ q = historical_model.objects.filter(
+ id=item.pk).order_by('-history_date')
+ if not q.count():
+ return
+ edit_date = q.all()[0].history_date
+ if not edit_date:
+ return
+ item.last_modified = edit_date
+ item.skip_history_when_saving = True
+ item.save()
+
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index eed175753..e4b55cae2 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -52,7 +52,8 @@ from archaeological_finds.forms import DashboardTreatmentForm, \
DashboardTreatmentFileForm
from archaeological_finds.models import Find, Treatment, TreatmentFile
from archaeological_operations.forms import DashboardForm as DashboardFormOpe
-from archaeological_operations.models import Operation
+from archaeological_operations.models import Operation, ArchaeologicalSite
+from archaeological_warehouse.models import Warehouse
from ishtar_common import forms_common as forms
from ishtar_common import wizards
from ishtar_common.forms import FinalForm, FinalDeleteForm
@@ -62,8 +63,8 @@ from ishtar_common.utils import clean_session_cache, CSV_OPTIONS, \
get_field_labels_from_path, get_random_item_image_link, shortify
from ishtar_common.widgets import JQueryAutoComplete
-from views_item import CURRENT_ITEM_KEYS, check_permission, display_item, \
- get_item, new_item, show_item
+from views_item import CURRENT_ITEM_KEYS, CURRENT_ITEM_KEYS_DICT, \
+ check_permission, display_item, get_item, new_item, show_item
logger = logging.getLogger(__name__)
@@ -250,8 +251,12 @@ def shortcut_menu(request):
if profile.files:
CURRENT_ITEMS.append((_(u"Archaeological file"), File))
CURRENT_ITEMS.append((_(u"Operation"), Operation))
+ if profile.archaeological_site:
+ CURRENT_ITEMS.append((profile.get_site_label(), ArchaeologicalSite))
if profile.context_record:
CURRENT_ITEMS.append((_(u"Context record"), ContextRecord))
+ if profile.warehouse:
+ CURRENT_ITEMS.append((_(u"Warehouse"), Warehouse))
if profile.find:
CURRENT_ITEMS.append((_(u"Find"), Find))
if profile.warehouse:
@@ -323,7 +328,7 @@ def shortcut_menu(request):
continue
current_items.append(pk)
selected = pk == current
- item_label = shortify(item['cached_label'], 60)
+ item_label = shortify(item[lbl_key], 60)
if selected:
cls = shortmenu_class
new_selected_item = pk
@@ -365,8 +370,7 @@ def get_current_items(request):
def unpin(request, item_type):
- if item_type not in ('find', 'contextrecord', 'operation', 'file',
- 'treatment', 'treatmentfile'):
+ if item_type not in CURRENT_ITEM_KEYS_DICT.keys():
logger.warning("unpin unknow type: {}".format(item_type))
return HttpResponse('nok')
request.session['treatment'] = ''
@@ -378,9 +382,15 @@ def unpin(request, item_type):
request.session['find'] = ''
if item_type == 'find':
return HttpResponse('ok')
+ request.session['warehouse'] = ''
+ if item_type == 'warehouse':
+ return HttpResponse('ok')
request.session['contextrecord'] = ''
if item_type == 'contextrecord':
return HttpResponse('ok')
+ request.session['site'] = ''
+ if item_type == 'site':
+ return HttpResponse('ok')
request.session['operation'] = ''
if item_type == 'operation':
return HttpResponse('ok')
@@ -401,16 +411,19 @@ def update_current_item(request, item_type=None, pk=None):
request.session['SHORTCUT_SEARCH'] = 'all'
currents = get_current_items(request)
+
# re-init when descending item are not relevant
if item_type == 'file' and currents['file'] and currents['operation'] and \
currents['operation'].associated_file != currents['file']:
request.session["operation"] = ''
currents['operation'] = None
+
if item_type in ('operation', 'file') and currents['contextrecord'] and \
(not request.session.get("operation", None) or
currents['contextrecord'].operation != currents['operation']):
request.session["contextrecord"] = ''
currents['contextrecord'] = None
+
from archaeological_finds.models import Find
if item_type in ('contextrecord', 'operation', 'file') and \
currents['find'] and \
@@ -472,6 +485,30 @@ def autocomplete_person_permissive(request, person_types=None,
is_ishtar_user=is_ishtar_user, permissive=True)
+def autocomplete_user(request):
+ if not request.user.has_perm('ishtar_common.view_person', models.Person):
+ return HttpResponse('[]', content_type='text/plain')
+ q = request.GET.get('term')
+ limit = request.GET.get('limit', 20)
+ try:
+ limit = int(limit)
+ except ValueError:
+ return HttpResponseBadRequest()
+ query = Q()
+ for q in q.split(' '):
+ qu = (Q(ishtaruser__person__name__icontains=q) |
+ Q(ishtaruser__person__surname__icontains=q) |
+ Q(first_name__icontains=q) |
+ Q(last_name__icontains=q))
+ query = query & qu
+ users = models.User.objects.filter(query)[:limit]
+ data = json.dumps([
+ {'id': user.pk,
+ 'value': unicode(user.ishtaruser)}
+ for user in users if user and user.ishtaruser])
+ return HttpResponse(data, content_type='text/plain')
+
+
def autocomplete_person(request, person_types=None, attached_to=None,
is_ishtar_user=None, permissive=False):
all_items = request.user.has_perm('ishtar_common.view_person',
@@ -1757,10 +1794,47 @@ class BookmarkList(SearchQueryMixin, JSONResponseMixin, LoginRequiredMixin,
)
return {
'bookmarks': [
- {'label': sq.label, 'query': sq.query} for sq in q.all()]
+ {'label': sq.label, 'query': sq.query,
+ 'id': sq.id} for sq in q.all()]
}
+class SearchQueryDelete(LoginRequiredMixin, DeleteView):
+ model = models.SearchQuery
+ template_name = 'ishtar/forms/bookmark_delete.html'
+ page_name = _(u"Delete bookmark")
+
+ def dispatch(self, request, *args, **kwargs):
+ if not request.user.pk:
+ raise Http404()
+ try:
+ self.profile = models.UserProfile.objects.get(
+ current=True, person__ishtaruser__user_ptr=request.user)
+ except models.UserProfile.DoesNotExist:
+ # no current profile
+ raise Http404()
+ try:
+ self.search_query = models.SearchQuery.objects.get(
+ profile=self.profile,
+ pk=kwargs['pk']
+ )
+ except models.SearchQuery.DoesNotExist:
+ raise Http404()
+ return super(SearchQueryDelete, self).dispatch(request, *args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ data = super(SearchQueryDelete, self).get_context_data(**kwargs)
+ data['modal_size'] = "small"
+ data['page_name'] = _(u"Bookmark - Delete")
+ data['action_name'] = _(u"Delete")
+ data['item'] = self.search_query.label
+ data['url'] = reverse('bookmark-delete', args=[self.search_query.pk])
+ return data
+
+ def get_success_url(self):
+ return reverse('success', args=['bookmark'])
+
+
class AlertList(JSONResponseMixin, LoginRequiredMixin,
TemplateView):
def dispatch(self, request, *args, **kwargs):
@@ -1795,3 +1869,94 @@ class AlertList(JSONResponseMixin, LoginRequiredMixin,
'number': nb}
)
return {'alerts': alerts}
+
+
+class QAItemForm(IshtarMixin, LoginRequiredMixin, FormView):
+ template_name = 'ishtar/forms/qa_form.html'
+ model = None
+ form_class = None
+ page_name = u""
+ success_url = "/success/"
+ modal_size = None # large, small or None (medium)
+
+ def get_quick_action(self):
+ raise NotImplementedError()
+
+ def dispatch(self, request, *args, **kwargs):
+ assert self.model
+ pks = [int(pk) for pk in kwargs.get('pks').split('-')]
+ self.items = list(self.model.objects.filter(pk__in=pks))
+ if not self.items:
+ raise Http404()
+
+ # check availability
+ quick_action = self.get_quick_action()
+ if not quick_action.is_available(
+ user=request.user, session=request.session):
+ for item in self.items:
+ if not quick_action.is_available(
+ user=request.user, session=request.session, obj=item):
+ raise Http404()
+
+ self.url = request.get_full_path()
+ return super(QAItemForm, self).dispatch(request, *args, **kwargs)
+
+ def get_form_kwargs(self):
+ kwargs = super(QAItemForm, self).get_form_kwargs()
+ kwargs['items'] = self.items
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ data = super(QAItemForm, self).get_context_data(**kwargs)
+ data['url'] = self.url
+ data['items'] = self.items
+ data['modal_size'] = self.modal_size
+ data['page_name'] = u"{} &ndash; {}".format(
+ self.model._meta.verbose_name, self.page_name)
+ return data
+
+
+class QAItemEditForm(QAItemForm):
+ form_class_multi = None
+ modal_size = "large"
+
+ def get_quick_action(self):
+ return self.model.QA_EDIT
+
+ def dispatch(self, request, *args, **kwargs):
+ self.confirm = kwargs.get('confirm', False) and True
+ returned = super(QAItemEditForm, self).dispatch(request, *args,
+ **kwargs)
+ return returned
+
+ def get_form_class(self):
+ if len(self.items) > 1 and self.form_class_multi:
+ return self.form_class_multi
+ return self.form_class
+
+ def get_form_kwargs(self):
+ kwargs = super(QAItemEditForm, self).get_form_kwargs()
+ kwargs['confirm'] = self.confirm
+ return kwargs
+
+ def get_context_data(self, **kwargs):
+ data = super(QAItemEditForm, self).get_context_data(**kwargs)
+ data['page_name'] = u"{} &ndash; {}".format(
+ self.model._meta.verbose_name, self.model.QA_EDIT.text)
+ if self.confirm:
+ if 'confirm' not in self.url:
+ data['url'] = self.url.split('?')[0] + "confirm/"
+ data['confirm'] = True
+ data['action_name'] = _(u"Confirm")
+ return data
+
+ def form_valid(self, form):
+ if not self.confirm:
+ self.confirm = True
+ return self.render_to_response(
+ self.get_context_data(form=self.get_form()))
+ return self.form_save(form)
+
+ def form_save(self, form):
+ form.save(self.items, self.request.user)
+ return HttpResponseRedirect(reverse("success"))
diff --git a/ishtar_common/views_item.py b/ishtar_common/views_item.py
index cfb7a42c3..7c6cbc24a 100644
--- a/ishtar_common/views_item.py
+++ b/ishtar_common/views_item.py
@@ -35,10 +35,11 @@ from menus import Menu
import models
from archaeological_files.models import File
-from archaeological_operations.models import Operation
+from archaeological_operations.models import Operation, ArchaeologicalSite
from archaeological_context_records.models import ContextRecord
from archaeological_finds.models import Find, FindBasket, Treatment, \
TreatmentFile
+from archaeological_warehouse.models import Warehouse
logger = logging.getLogger(__name__)
@@ -46,7 +47,9 @@ ENCODING = settings.ENCODING or 'utf-8'
CURRENT_ITEM_KEYS = (('file', File),
('operation', Operation),
+ ('site', ArchaeologicalSite),
('contextrecord', ContextRecord),
+ ('warehouse', Warehouse),
('find', Find),
('treatmentfile', TreatmentFile),
('treatment', Treatment))
@@ -132,7 +135,7 @@ def show_item(model, name, extra_dct=None):
return HttpResponse('NOK')
query_own = model.get_query_owns(request.user.ishtaruser)
if query_own:
- q = q.filter(query_own)
+ q = q.filter(query_own).distinct()
try:
item = q.get(pk=pk)
except ObjectDoesNotExist:
@@ -440,12 +443,16 @@ def _search_manage_search_vector(model, dct, exc_dct, request_keys):
if 'search_vector' not in dct:
return dct, exc_dct
- parentheses_groups = _parse_parentheses(dct['search_vector'].strip())
+ search_vector = dct['search_vector']
+ parentheses_groups = _parse_parentheses(search_vector)
search_query, extra_dct, extra_exc_dct = _parse_parentheses_groups(
parentheses_groups, request_keys)
dct.update(extra_dct)
exc_dct.update(extra_exc_dct)
if search_query:
+ # remove inside parenthesis
+ search_query = \
+ search_query.replace(u'(', u'').replace(u')', u'').strip()
dct['extras'].append(
{'where': [model._meta.db_table +
".search_vector @@ (to_tsquery(%s, %s)) = true"],
@@ -757,6 +764,64 @@ def _construct_query(relation_types, dct, or_reqs, and_reqs):
return query
+def _manage_default_search(dct, request, model, default_name, my_base_request,
+ my_relative_session_names):
+ # an item is selected in the default menu
+ pinned_search = ""
+ if default_name in request.session and \
+ request.session[default_name]:
+ value = request.session[default_name]
+ if 'basket-' in value:
+ try:
+ dct = {"basket__pk":
+ request.session[default_name].split('-')[-1]}
+ pinned_search = unicode(FindBasket.objects.get(
+ pk=dct["basket__pk"]))
+ except FindBasket.DoesNotExist:
+ pass
+ else:
+ try:
+ dct = {"pk": request.session[default_name]}
+ pinned_search = u'"{}"'.format(
+ model.objects.get(pk=dct["pk"])
+ )
+ except model.DoesNotExist:
+ pass
+ elif dct == (my_base_request or {}):
+ if not hasattr(model, 'UP_MODEL_QUERY'):
+ logger.warning(
+ "**WARN get_item**: - UP_MODEL_QUERY not defined for "
+ "'{}'".format(model))
+ else:
+ # a parent item may be selected in the default menu
+ for name, key in my_relative_session_names:
+ if name in request.session and request.session[name] \
+ and 'basket-' not in request.session[name] \
+ and name in CURRENT_ITEM_KEYS_DICT:
+ up_model = CURRENT_ITEM_KEYS_DICT[name]
+ try:
+ dct.update({key: request.session[name]})
+ up_item = up_model.objects.get(pk=dct[key])
+ if up_item.SLUG not in model.UP_MODEL_QUERY:
+ logger.warning(
+ "**WARN get_item**: - {} not in "
+ "UP_MODEL_QUERY for {}'".format(
+ up_item.SLUG,
+ model))
+ else:
+ req_key, up_attr = model.UP_MODEL_QUERY[
+ up_item.SLUG]
+ pinned_search = u'{}="{}"'.format(
+ req_key,
+ getattr(up_item, up_attr)
+ )
+ break
+ except up_model.DoesNotExist:
+ pass
+
+ return dct, pinned_search
+
+
def _format_val(val):
if val is None:
return u""
@@ -837,7 +902,10 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
else:
my_extra_request_keys = copy(extra_request_keys)
if base_request is None and hasattr(model, 'BASE_REQUEST'):
- my_base_request = copy(model.BASE_REQUEST)
+ if callable(model.BASE_REQUEST):
+ my_base_request = model.BASE_REQUEST(request)
+ else:
+ my_base_request = copy(model.BASE_REQUEST)
elif base_request is not None:
my_base_request = copy(base_request)
else:
@@ -922,13 +990,22 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
request_items = dct_request_items
- dct = my_base_request
+ base_query = None
+ if isinstance(my_base_request, Q):
+ base_query = my_base_request
+ dct = {}
+ else:
+ dct = my_base_request
excluded_dct = {}
and_reqs, or_reqs = [], []
exc_and_reqs, exc_or_reqs = [], []
if full == 'shortcut':
- dct['cached_label__icontains'] = request.GET.get('term', None)
+ if model.SLUG == "warehouse":
+ key = 'name__icontains'
+ else:
+ key = 'cached_label__icontains'
+ dct[key] = request.GET.get('term', None)
try:
old = 'old' in request_items and int(request_items['old'])
@@ -952,45 +1029,13 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
pinned_search = ""
if 'submited' not in request_items and full != 'shortcut':
- # default search
- # an item is selected in the default menu
- if default_name in request.session and \
- request.session[default_name]:
- value = request.session[default_name]
- if 'basket-' in value:
- try:
- dct = {"basket__pk":
- request.session[default_name].split('-')[-1]}
- pinned_search = unicode(FindBasket.objects.get(
- pk=dct["basket__pk"]))
- except FindBasket.DoesNotExist:
- pass
- else:
- try:
- dct = {"pk": request.session[default_name]}
- pinned_search = unicode(model._meta.verbose_name) \
- + u" - " + unicode(
- model.objects.get(pk=dct["pk"]))
- except model.DoesNotExist:
- pass
- elif dct == (my_base_request or {}):
- # a parent item may be selected in the default menu
- for name, key in my_relative_session_names:
- if name in request.session and request.session[name] \
- and 'basket-' not in request.session[name] \
- and name in CURRENT_ITEM_KEYS_DICT:
- up_model = CURRENT_ITEM_KEYS_DICT[name]
- try:
- dct.update({key: request.session[name]})
- pinned_search = unicode(up_model._meta.verbose_name) \
- + u" - " + unicode(
- up_model.objects.get(pk=dct[key]))
- break
- except up_model.DoesNotExist:
- pass
- if (not dct or data_type == 'csv') \
- and func_name in request.session:
+ if data_type == 'csv' and func_name in request.session:
dct = request.session[func_name]
+ else:
+ # default search
+ dct, pinned_search = _manage_default_search(
+ dct, request, model, default_name, my_base_request,
+ my_relative_session_names)
else:
request.session[func_name] = dct
@@ -1062,6 +1107,8 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
# print(query)
items = model.objects.filter(query)
+ if base_query:
+ items = items.filter(base_query)
if exc_query:
items = items.exclude(exc_query)
@@ -1072,7 +1119,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
if count:
return items.count()
- # print(items.query)
+ # print(unicode(items.query).encode('utf-8'))
if search_vector: # for serialization
dct['search_vector'] = search_vector
@@ -1110,8 +1157,12 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
query_table_cols[idx] = \
model.CONTEXTUAL_TABLE_COLS[contxt][col]
if full == 'shortcut':
- query_table_cols = ['cached_label']
- table_cols = ['cached_label']
+ if model.SLUG == "warehouse":
+ query_table_cols = ['name']
+ table_cols = ['name']
+ else:
+ query_table_cols = ['cached_label']
+ table_cols = ['cached_label']
# manage sort tables
manual_sort_key = None
@@ -1308,8 +1359,11 @@ def get_item(model, func_name, default_name, extra_request_keys=[],
if hasattr(model, 'COL_LINK') and k in model.COL_LINK:
value = link_ext_template.format(value, value)
res[k] = value
- if full == 'shortcut' and 'cached_label' in res:
- res['value'] = res.pop('cached_label')
+ if full == 'shortcut':
+ if 'cached_label' in res:
+ res['value'] = res.pop('cached_label')
+ elif 'name' in res:
+ res['value'] = res.pop('name')
rows.append(res)
if full == 'shortcut':
data = json.dumps(rows)
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py
index fc8926364..6292db202 100644
--- a/ishtar_common/widgets.py
+++ b/ishtar_common/widgets.py
@@ -476,6 +476,10 @@ if settings.SURFACE_UNIT == 'square-metre':
AreaWidget = SquareMeterWidget
+class CheckboxInput(forms.CheckboxInput):
+ NO_FORM_CONTROL = True
+
+
class SearchWidget(forms.TextInput):
template_name = 'widgets/search_input.html'
@@ -1033,6 +1037,7 @@ class DataTable(Select2Media, forms.RadioSelect):
# dct['source_full'] = unicode(self.source_full)
dct['extra_sources'] = []
+ dct['quick_actions'] = []
if self.associated_model:
model_name = "{}.{}".format(
self.associated_model.__module__,
@@ -1043,6 +1048,10 @@ class DataTable(Select2Media, forms.RadioSelect):
dct['extra_sources'].append((
imp.slug, imp.name,
reverse('get-by-importer', args=[imp.slug])))
+ if hasattr(self.associated_model, "QUICK_ACTIONS"):
+ dct['quick_actions'] = \
+ self.associated_model.get_quick_actions(user=self.user)
+ self.multiple_select = True
source = unicode(self.source)
dct.update({'name': name,
'col_names': col_names,
diff --git a/scripts/restore_find_data.py b/scripts/restore_find_data.py
new file mode 100644
index 000000000..df5c38069
--- /dev/null
+++ b/scripts/restore_find_data.py
@@ -0,0 +1,25 @@
+"""
+Restore find data on destructive import
+"""
+
+import sys
+
+from ishtar_common.utils import update_data
+from archaeological_finds.models import Find
+
+ln = Find.objects.count()
+
+sys.stdout.write("\n")
+for idx, item in enumerate(Find.objects.all()):
+ sys.stdout.write("\r* processing {}/{} ({}%)".format(
+ idx + 1, ln, (idx + 1)*100.0 / ln))
+ sys.stdout.flush()
+ data = item.data
+ for h in item.history.order_by('-history_modifier_id', '-history_date',
+ '-history_id').all():
+ data = update_data(data, h.data)
+ item.data = data
+ item.skip_history_when_saving = True
+ item.save()
+sys.stdout.write("\n")
+
diff --git a/scss/custom.scss b/scss/custom.scss
index 2406a1d98..77f17c6e0 100644
--- a/scss/custom.scss
+++ b/scss/custom.scss
@@ -97,6 +97,24 @@ pre {
font-weight: bold;
}
+#modal-advanced-search .modal-header{
+ flex-wrap: wrap;
+ padding-bottom: 0;
+}
+
+#modal-advanced-search .modal-header .alert-secondary{
+ background-color: $white;
+}
+
+.modal-header, .modal-footer{
+ background-color: $gray-200;
+}
+
+.modal-body.body-scroll{
+ max-height: calc(100vh - 200px);
+ overflow-y: auto;
+}
+
.modal-dialog.full {
width: 98%;
height: 98%;
@@ -168,10 +186,15 @@ div.dt-buttons{
@include transition($btn-transition);
}
+.dt-button.btn-success {
+ @include button-variant($success, $success);
+}
+
.dt-button.disabled{
background-color: #f8f9fa;
border-color: #f8f9fa;
color: $gray-500;
+ cursor: not-allowed;
}
.small-button{
@@ -199,6 +222,11 @@ textarea {
.sheet h4 { color: $text-muted; }
+#bookmark-list .input-link{
+ width: 100%;
+ padding-right: 5px;
+}
+
#window-fixed-menu{
background-color: $gray-200;
position: fixed;
@@ -296,6 +324,7 @@ textarea {
.sheet .row{
padding: 0 0.75em;
+ margin: 0;
}
.clean-table h4{
@@ -507,6 +536,34 @@ div#foot a:hover {
}
+#basket-manage #foot_pk{
+ display: none;
+}
+
+#basket-manage
+#grid_pk_meta_wrapper{
+ width: 50%;
+ float: left;
+ padding-bottom: 80px;
+}
+
+#basket-add-button{
+ width: 8%;
+ float: left;
+ margin: 20vh 1% 0 1%;
+}
+
+#basket-content-wrapper{
+ width: 40%;
+ float: left;
+}
+
+#basket-content{
+ text-align: left;
+ overflow: auto;
+ max-height: 60vh;
+}
+
/* ui-autocomplete - start */
.ui-widget-content {
diff --git a/translations/fr/archaeological_context_records.po b/translations/fr/archaeological_context_records.po
index 52a6e82ac..372a6e3df 100644
--- a/translations/fr/archaeological_context_records.po
+++ b/translations/fr/archaeological_context_records.po
@@ -8,13 +8,15 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:51+0100\n"
"PO-Revision-Date: 2018-08-15 03:28+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
@@ -22,11 +24,11 @@ msgstr ""
msgid "Point"
msgstr "Point"
-#: admin.py:51 models.py:377
+#: admin.py:51 models.py:410
msgid "Multi polygon"
msgstr "Polygones multi-parties"
-#: forms.py:47 forms.py:53 models.py:319 wizards.py:77
+#: forms.py:47 forms.py:53 models.py:352 wizards.py:81
msgid "Operation"
msgstr "Opération"
@@ -42,7 +44,7 @@ msgstr "Unité d'enregistrement - 001 - Recherche"
msgid "Full text search"
msgstr "Recherche en texte intégral"
-#: forms.py:69 forms.py:155 models.py:324 models.py:696
+#: forms.py:69 forms.py:155 models.py:357 models.py:737
msgid "ID"
msgstr "Identifiant"
@@ -58,7 +60,7 @@ msgstr "Année de l'opération"
msgid "Operation's number (index by year)"
msgstr "Numéro de l'opération (index par année)"
-#: forms.py:80 models.py:322
+#: forms.py:80 models.py:355
msgid "Archaeological site"
msgstr "Entité archéologique"
@@ -66,7 +68,7 @@ msgstr "Entité archéologique"
msgid "Search within related operations"
msgstr "Rechercher parmi les opérations liées"
-#: forms.py:87 forms.py:288 models.py:65
+#: forms.py:87 forms.py:288 models.py:66
msgid "Period"
msgstr "Période"
@@ -74,7 +76,8 @@ msgstr "Période"
msgid "Unit type"
msgstr "Type d'unité"
-#: forms.py:89 forms.py:148 models.py:230 models.py:314 models.py:698
+#: forms.py:89 forms.py:148 models.py:231 models.py:232 models.py:347
+#: models.py:739
msgid "Parcel"
msgstr "Parcelle"
@@ -82,7 +85,7 @@ msgstr "Parcelle"
msgid "Search within relations"
msgstr "Rechercher parmi les relations"
-#: forms.py:115 views.py:96
+#: forms.py:115 views.py:95
msgid "Context record search"
msgstr "Rechercher une Unité d'Enregistrement"
@@ -98,7 +101,7 @@ msgstr "Général"
msgid "Context record - 020 - General"
msgstr "Unité d'enregistrement - 020 - Général"
-#: forms.py:149 models.py:227 models.py:228 models.py:317
+#: forms.py:149 models.py:228 models.py:229 models.py:350
msgid "Town"
msgstr "Commune"
@@ -106,52 +109,52 @@ msgstr "Commune"
msgid "Only the items associated to the operation can be selected."
msgstr "Seuls les éléments associés à l'opération peuvent être sélectionnés."
-#: forms.py:157 models.py:325 models.py:699
+#: forms.py:157 models.py:358 models.py:740
#: templates/ishtar/sheet_contextrecord.html:45
msgid "Description"
msgstr "Description"
-#: forms.py:159 models.py:326
+#: forms.py:159 models.py:359
msgid "General comment"
msgstr "Commentaire général"
-#: forms.py:162 models.py:372
+#: forms.py:162 models.py:405
msgid "Excavation technique"
msgstr "Méthode de fouille"
-#: forms.py:163 models.py:330
+#: forms.py:163 models.py:363
msgid "Length (m)"
msgstr "Taille (m)"
-#: forms.py:164 models.py:331
+#: forms.py:164 models.py:364
msgid "Width (m)"
msgstr "Largeur (m)"
-#: forms.py:165 models.py:332
+#: forms.py:165 models.py:365
msgid "Thickness (m)"
msgstr "Épaisseur (m)"
-#: forms.py:166 models.py:334
+#: forms.py:166 models.py:367
msgid "Diameter (m)"
msgstr "Diamètre (m)"
-#: forms.py:167 models.py:335
+#: forms.py:167 models.py:368
msgid "Depth (m)"
msgstr "Profondeur (m)"
-#: forms.py:169 models.py:337
+#: forms.py:169 models.py:370
msgid "Depth of appearance (m)"
msgstr "Profondeur d'apparition (m)"
-#: forms.py:170 models.py:346 models.py:697
+#: forms.py:170 models.py:379 models.py:738
msgid "Context record type"
msgstr "Type d'Unité d'Enregistrement"
-#: forms.py:172 models.py:327
+#: forms.py:172 models.py:360
msgid "Opening date"
msgstr "Date d'ouverture"
-#: forms.py:174 models.py:329 templates/ishtar/sheet_contextrecord.html:128
+#: forms.py:174 models.py:362 templates/ishtar/sheet_contextrecord.html:140
msgid "Closing date"
msgstr "Date de clôture"
@@ -159,7 +162,7 @@ msgstr "Date de clôture"
msgid "Documentation"
msgstr "Documentation"
-#: forms.py:180 models.py:339
+#: forms.py:180 models.py:372
msgid "Location"
msgstr "Localisation"
@@ -171,23 +174,23 @@ msgstr "Cet identifiant existe déjà pour cette opération."
msgid "You have to choose a town or a parcel."
msgstr "Vous devez choisir une commune ou une parcelle."
-#: forms.py:283 forms.py:304 models.py:76
+#: forms.py:283 forms.py:304 models.py:77
msgid "Dating"
msgstr "Datation"
-#: forms.py:289 models.py:66
+#: forms.py:289 models.py:67
msgid "Start date"
msgstr "Date de début"
-#: forms.py:290 models.py:67
+#: forms.py:290 models.py:68
msgid "End date"
msgstr "Date de fin"
-#: forms.py:291 models.py:70
+#: forms.py:291 models.py:71
msgid "Quality"
msgstr "Qualité"
-#: forms.py:292 models.py:44 models.py:68
+#: forms.py:292 models.py:45 models.py:69
msgid "Dating type"
msgstr "Type de datation"
@@ -195,7 +198,7 @@ msgstr "Type de datation"
msgid "Context record - 030 - Dating"
msgstr "Unité d'enregistrement - 030 - Datation"
-#: forms.py:315 ishtar_menu.py:29 models.py:90
+#: forms.py:315 ishtar_menu.py:29 models.py:91
msgid "Context record"
msgstr "Unité d'Enregistrement"
@@ -207,8 +210,8 @@ msgstr "Relations"
msgid "Context record - 050 - Relations"
msgstr "Unité d'enregistrement - 050 - Relations"
-#: forms.py:337 forms.py:348 models.py:349
-#: templates/ishtar/sheet_contextrecord.html:59
+#: forms.py:337 forms.py:348 models.py:382
+#: templates/ishtar/sheet_contextrecord.html:64
msgid "Interpretation"
msgstr "Interprétation"
@@ -220,31 +223,31 @@ msgstr "Unité d'enregistrement - 040 - Interprétation"
msgid "Comments on dating"
msgstr "Commentaire relatif à la datation"
-#: forms.py:346 models.py:348
+#: forms.py:346 models.py:381
msgid "Filling"
msgstr "Remplissage"
-#: forms.py:350 models.py:369
+#: forms.py:350 models.py:402
msgid "Activity"
msgstr "Activité"
-#: forms.py:352 models.py:367
+#: forms.py:352 models.py:400
msgid "Identification"
msgstr "Identification"
-#: forms.py:354 models.py:352
+#: forms.py:354 models.py:385
msgid "TAQ"
msgstr "TAQ"
-#: forms.py:355 models.py:356
+#: forms.py:355 models.py:389
msgid "Estimated TAQ"
msgstr "TAQ estimé"
-#: forms.py:357 models.py:359
+#: forms.py:357 models.py:392
msgid "TPQ"
msgstr "TPQ"
-#: forms.py:358 models.py:363
+#: forms.py:358 models.py:396
msgid "Estimated TPQ"
msgstr "TPQ estimé"
@@ -276,178 +279,183 @@ msgstr "Modification"
msgid "Deletion"
msgstr "Suppression"
-#: models.py:45
+#: models.py:46
msgid "Dating types"
msgstr "Types de datation"
-#: models.py:55
+#: models.py:56
msgid "Dating quality type"
msgstr "Type de qualité de datation"
-#: models.py:56
+#: models.py:57
msgid "Dating quality types"
msgstr "Types de qualité de datation"
-#: models.py:72
+#: models.py:73
msgid "Precise dating"
msgstr "Datation précise"
-#: models.py:77
+#: models.py:78
msgid "Datings"
msgstr "Datations"
-#: models.py:97
+#: models.py:98
msgid "Find"
msgstr "Mobilier"
-#: models.py:116 models.py:135 models.py:151
+#: models.py:117 models.py:136 models.py:152
msgid "Order"
msgstr "Ordre"
-#: models.py:118
+#: models.py:119
msgid "Parent context record type"
msgstr "Type d'UE parent"
-#: models.py:122
+#: models.py:123
msgid "Context record Type"
msgstr "Type d'Unité d'Enregistrement"
-#: models.py:123
+#: models.py:124
msgid "Context record Types"
msgstr "Types d'Unité d'Enregistrement"
-#: models.py:138
+#: models.py:139
msgid "Activity Type"
msgstr "Type d'activité"
-#: models.py:139
+#: models.py:140
msgid "Activity Types"
msgstr "Types d'activité"
-#: models.py:154
+#: models.py:155
msgid "Identification Type"
msgstr "Type d'identification"
-#: models.py:155
+#: models.py:156
msgid "Identification Types"
msgstr "Types d'identification"
-#: models.py:168
+#: models.py:169
msgid "Excavation technique type"
msgstr "Type de méthode de fouille"
-#: models.py:169
+#: models.py:170
msgid "Excavation technique types"
msgstr "Types de méthode de fouille"
-#: models.py:179
+#: models.py:180
msgid "Documentation type"
msgstr "Type de documentation"
-#: models.py:180
+#: models.py:181
msgid "Documentation types"
msgstr "Types de documentation"
-#: models.py:221 models.py:700
+#: models.py:222 models.py:741
msgid "Periods"
msgstr "Périodes"
-#: models.py:222
+#: models.py:223
msgid "Datings (period)"
msgstr "Datations (période)"
-#: models.py:223
+#: models.py:224
msgid "Related context records"
msgstr "Unités d'Enregistrement liées"
-#: models.py:224
+#: models.py:225
msgid "Operation (Patriarche code)"
msgstr "Opération (code Patriarche)"
-#: models.py:225
+#: models.py:226
msgid "Operation (name)"
msgstr "Opération (nom)"
-#: models.py:226
+#: models.py:227
msgid "Parcel (external ID)"
msgstr "Parcelle (identifiant)"
-#: models.py:229
+#: models.py:230
msgid "Parcel (year)"
msgstr "Parcelle (année)"
-#: models.py:262
+#: models.py:265
msgctxt "key for text search"
msgid "id"
msgstr "id"
-#: models.py:266
+#: models.py:269
msgctxt "key for text search"
msgid "town"
msgstr "commune"
-#: models.py:270
+#: models.py:273
msgctxt "key for text search"
msgid "operation-year"
msgstr "operation-annee"
-#: models.py:274
+#: models.py:277
msgctxt "key for text search"
msgid "patriarche"
msgstr "patriarche"
-#: models.py:278
+#: models.py:281
msgctxt "key for text search"
msgid "operation-code"
msgstr "operation-code"
-#: models.py:282
+#: models.py:285 models.py:327
+msgctxt "key for text search"
+msgid "operation"
+msgstr "operation"
+
+#: models.py:289 models.py:330
msgctxt "key for text search"
msgid "site"
msgstr "site"
-#: models.py:286
+#: models.py:293
msgctxt "key for text search"
msgid "operation-relation-type"
msgstr "operation-type-relation"
-#: models.py:290
+#: models.py:297
msgctxt "key for text search"
msgid "period"
msgstr "periode"
-#: models.py:294
+#: models.py:301
msgctxt "key for text search"
msgid "unit-type"
msgstr "type"
-#: models.py:298
+#: models.py:305
msgctxt "key for text search"
msgid "parcel"
msgstr "parcelle"
-#: models.py:302
+#: models.py:309
msgctxt "key for text search"
msgid "record-relation-type"
msgstr "ue-type-relation"
-#: models.py:310
+#: models.py:343
msgid "External ID"
msgstr "Identifiant"
-#: models.py:312
+#: models.py:345
msgid "External ID is set automatically"
msgstr "L'identifiant est attribué automatiquement"
-#: models.py:340
+#: models.py:373
msgid "A short description of the location of the context record"
msgstr "Une courte description de la localisation de l'Unité d'Enregistrement"
-#: models.py:344
+#: models.py:377
msgid "Comment on datings"
msgstr "Commentaire relatif aux datations"
-#: models.py:353
+#: models.py:386
msgid ""
"\"Terminus Ante Quem\" the context record can't have been created after this "
"date"
@@ -455,11 +463,11 @@ msgstr ""
"« Terminus Ante Quem ». L'Unité d'Enregistrement ne peut avoir été créée "
"après cette date."
-#: models.py:357
+#: models.py:390
msgid "Estimation of a \"Terminus Ante Quem\""
msgstr "Estimation d'un « Terminus Ante Quem »."
-#: models.py:360
+#: models.py:393
msgid ""
"\"Terminus Post Quem\" the context record can't have been created before "
"this date"
@@ -467,168 +475,172 @@ msgstr ""
"« Terminus Post Quem ». L'Unité d'Enregistrement ne peut avoir été créée "
"avant cette date."
-#: models.py:364
+#: models.py:397
msgid "Estimation of a \"Terminus Post Quem\""
msgstr "Estimation d'un « Terminus Post Quem »."
-#: models.py:375
+#: models.py:408
msgid "Point (2D)"
msgstr "Point (2D)"
-#: models.py:376
+#: models.py:409
msgid "Point (3D)"
msgstr "Point (3D)"
-#: models.py:380
+#: models.py:413
msgid "Documents"
msgstr "Documents"
-#: models.py:382
+#: models.py:415
msgid "Cached name"
msgstr "Nom en cache"
-#: models.py:393 models.py:394 templates/ishtar/sheet_contextrecord.html:4
+#: models.py:419 models.py:420 templates/ishtar/sheet_contextrecord.html:4
msgid "Context Record"
msgstr "Unité d'Enregistrement"
-#: models.py:410
+#: models.py:439
msgctxt "short"
msgid "Context record"
msgstr "UE"
-#: models.py:627 models.py:650 models.py:695
+#: models.py:668 models.py:691 models.py:736
msgid "Relation type"
msgstr "Type de relation"
-#: models.py:628
+#: models.py:669
msgid "Relation types"
msgstr "Types de relation"
-#: models.py:645
+#: models.py:686
msgid "ID (left)"
msgstr "Identifiant (gauche)"
-#: models.py:646
+#: models.py:687
msgid "Context record type (left)"
msgstr "Type d'UE (gauche)"
-#: models.py:647
+#: models.py:688
msgid "Parcel (left)"
msgstr "Parcelle (gauche)"
-#: models.py:648
+#: models.py:689
msgid "Description (left)"
msgstr "Description (gauche)"
-#: models.py:649
+#: models.py:690
msgid "Periods (left)"
msgstr "Périodes (gauche)"
-#: models.py:651
+#: models.py:692
msgid "ID (right)"
msgstr "Identifiant (droit)"
-#: models.py:652
+#: models.py:693
msgid "Context record type (right)"
msgstr "Type d'UE (droite)"
-#: models.py:653
+#: models.py:694
msgid "Parcel (right)"
msgstr "Parcelle (droite)"
-#: models.py:654
+#: models.py:695
msgid "Description (right)"
msgstr "Description (droite)"
-#: models.py:655
+#: models.py:696
msgid "Periods (right)"
msgstr "Périodes (droite)"
-#: models.py:664
+#: models.py:705
msgid "Record relation"
msgstr "Relation entre Unités d'Enregistrement"
-#: models.py:665
+#: models.py:706
msgid "Record relations"
msgstr "Relations entre Unités d'Enregistrement"
-#: templates/ishtar/sheet_contextrecord.html:70
+#: templates/ishtar/sheet_contextrecord.html:75
msgid "Datations"
msgstr "Datations"
-#: templates/ishtar/sheet_contextrecord.html:79
+#: templates/ishtar/sheet_contextrecord.html:84
+msgid "Sheet"
+msgstr "Fiche"
+
+#: templates/ishtar/sheet_contextrecord.html:91
msgid "Context record relations"
msgstr "Relations entre Unités d'Enregistrement"
-#: templates/ishtar/sheet_contextrecord.html:97
+#: templates/ishtar/sheet_contextrecord.html:109
msgid "Re-generate image"
msgstr "Re-générer l'image"
-#: templates/ishtar/sheet_contextrecord.html:99
+#: templates/ishtar/sheet_contextrecord.html:111
msgid "Generate image"
msgstr "Générer l'image"
-#: templates/ishtar/sheet_contextrecord.html:108
+#: templates/ishtar/sheet_contextrecord.html:120
msgid "Operation summary"
msgstr "Résumé de l'opération"
-#: templates/ishtar/sheet_contextrecord.html:111
+#: templates/ishtar/sheet_contextrecord.html:123
msgid "Patriarche OA code not yet recorded!"
msgstr "Code d'opération Patriarche non renseigné !"
-#: templates/ishtar/sheet_contextrecord.html:116
+#: templates/ishtar/sheet_contextrecord.html:128
msgid "Numerical reference"
msgstr "Référence numérique"
-#: templates/ishtar/sheet_contextrecord.html:122
+#: templates/ishtar/sheet_contextrecord.html:134
msgid "State"
msgstr "État"
-#: templates/ishtar/sheet_contextrecord.html:123
+#: templates/ishtar/sheet_contextrecord.html:135
msgid "Active file"
msgstr "Dossier actif"
-#: templates/ishtar/sheet_contextrecord.html:123
+#: templates/ishtar/sheet_contextrecord.html:135
msgid "Closed operation"
msgstr "Opération close"
-#: templates/ishtar/sheet_contextrecord.html:130
+#: templates/ishtar/sheet_contextrecord.html:142
msgid "by"
msgstr "par"
-#: templates/ishtar/sheet_contextrecord.html:140
+#: templates/ishtar/sheet_contextrecord.html:152
msgid "Localisation"
msgstr "Lieu"
-#: templates/ishtar/sheet_contextrecord.html:149
+#: templates/ishtar/sheet_contextrecord.html:161
msgid "No operation linked to this context record!"
msgstr "Pas d'opération liée à cette unité d'enregistrement !"
-#: templates/ishtar/sheet_contextrecord.html:161
+#: templates/ishtar/sheet_contextrecord.html:173
msgid "Document from this context record"
msgstr "Document associé à cette Unité d'Enregistrement"
-#: templates/ishtar/sheet_contextrecord.html:166
+#: templates/ishtar/sheet_contextrecord.html:178
msgid "Finds"
msgstr "Mobilier"
-#: templates/ishtar/sheet_contextrecord.html:171
+#: templates/ishtar/sheet_contextrecord.html:183
msgid "Documents from associated finds"
msgstr "Documents du mobilier associé"
-#: views.py:110
+#: views.py:109
msgid "New context record"
msgstr "Ajouter une Unité d'Enregistrement"
-#: views.py:126
+#: views.py:125
msgid "Context record modification"
msgstr "Modifier une Unité d'Enregistrement"
-#: views.py:137
+#: views.py:136
msgid "You don't have sufficient permissions to do this action."
msgstr ""
"Vous n'avez pas les permissions suffisantes pour effectuer cette action."
-#: views.py:150
+#: views.py:149
msgid "Context record deletion"
msgstr "Supprimer une Unité d'Enregistrement"
diff --git a/translations/fr/archaeological_files.po b/translations/fr/archaeological_files.po
index b7b8d3c5d..22832c4fa 100644
--- a/translations/fr/archaeological_files.po
+++ b/translations/fr/archaeological_files.po
@@ -9,13 +9,15 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:51+0100\n"
"PO-Revision-Date: 2018-08-15 03:30+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
@@ -24,11 +26,11 @@ msgid "Full text search"
msgstr "Recherche en texte intégral"
#: forms.py:56 forms.py:212 forms.py:257 forms.py:411 forms.py:444
-#: models.py:208 templates/ishtar/sheet_file.html:190
+#: models.py:221 templates/ishtar/sheet_file.html:191
msgid "Year"
msgstr "Année"
-#: forms.py:57 forms.py:217 forms.py:259 models.py:210
+#: forms.py:57 forms.py:217 forms.py:259 models.py:223
msgid "Numeric reference"
msgstr "Référence numérique"
@@ -40,7 +42,7 @@ msgstr "Autre référence"
msgid "Parcel"
msgstr "Parcelle"
-#: forms.py:64 forms.py:422 forms.py:455 models.py:696
+#: forms.py:64 forms.py:422 forms.py:455 models.py:717
msgid "Department"
msgstr "Département"
@@ -48,7 +50,7 @@ msgstr "Département"
msgid "File name"
msgstr "Nom du dossier"
-#: forms.py:66 forms.py:156 forms.py:223 models.py:218
+#: forms.py:66 forms.py:156 forms.py:223 models.py:231
msgid "File type"
msgstr "Type de dossier"
@@ -60,23 +62,23 @@ msgstr "Est actif ?"
msgid "Saisine type"
msgstr "Type de saisine"
-#: forms.py:69 forms.py:313 models.py:63 models.py:249
+#: forms.py:69 forms.py:313 models.py:64 models.py:262
msgid "Permit type"
msgstr "Type de permis"
-#: forms.py:71 forms.py:316 models.py:250
+#: forms.py:71 forms.py:316 models.py:263
msgid "Permit reference"
msgstr "Référence du permis"
-#: forms.py:72 forms.py:229 forms.py:373 models.py:279
+#: forms.py:72 forms.py:229 forms.py:373 models.py:292
msgid "Comment"
msgstr "Commentaire"
-#: forms.py:74 templates/ishtar/sheet_file.html:166
+#: forms.py:74 templates/ishtar/sheet_file.html:167
msgid "In charge"
msgstr "Responsable"
-#: forms.py:81 forms.py:290 forms.py:466 models.py:225
+#: forms.py:81 forms.py:290 forms.py:466 models.py:238
msgid "General contractor"
msgstr "Aménageur"
@@ -100,11 +102,11 @@ msgstr "Rechercher un dossier archéologique"
msgid "You should select a file."
msgstr "Vous devez sélectionner un dossier archéologique."
-#: forms.py:144 forms.py:221 models.py:258
+#: forms.py:144 forms.py:221 models.py:271
msgid "Creation date"
msgstr "Date de création"
-#: forms.py:145 forms.py:326 models.py:260
+#: forms.py:145 forms.py:326 models.py:273
msgid "Reception date"
msgstr "Date de réception"
@@ -132,23 +134,23 @@ msgstr "Date avant"
msgid "General"
msgstr "Général"
-#: forms.py:204 models.py:220
+#: forms.py:204 models.py:233
msgid "Person in charge"
msgstr "Responsable"
-#: forms.py:220 models.py:217
+#: forms.py:220 models.py:230
msgid "Name"
msgstr "Nom"
-#: forms.py:225 models.py:262
+#: forms.py:225 models.py:275
msgid "Related file"
msgstr "Dossier associé"
-#: forms.py:233 models.py:270
+#: forms.py:233 models.py:283
msgid "Total surface (m2)"
msgstr "Surface totale (m2)"
-#: forms.py:236 models.py:276
+#: forms.py:236 models.py:289
msgid "Main address"
msgstr "Adresse des terrains"
@@ -177,16 +179,16 @@ msgstr "Dossier archéologique - 020 - Parcelles"
msgid "Preventive informations"
msgstr "Information archéologie préventive"
-#: forms.py:302 models.py:237
+#: forms.py:302 models.py:250
msgid "Responsible for planning service"
msgstr "Responsable pour le service instructeur"
-#: forms.py:319 models.py:273
+#: forms.py:319 models.py:286
msgid "Total developed surface (m2)"
msgstr "Surface totale aménagée (m2)"
#: forms.py:342 templates/ishtar/dashboards/dashboard_file.html:53
-#: templates/ishtar/sheet_file.html:121
+#: templates/ishtar/sheet_file.html:122
msgid "Research archaeology"
msgstr "Archéologie programmée"
@@ -194,15 +196,15 @@ msgstr "Archéologie programmée"
msgid "Archaeological file - 045 - Research - General"
msgstr "Dossier archéologique - 045 - Recherche - Général"
-#: forms.py:351 models.py:282
+#: forms.py:351 models.py:295
msgid "Departments"
msgstr "Départements"
-#: forms.py:360 models.py:291
+#: forms.py:360 models.py:304
msgid "Scientist in charge"
msgstr "Responsable scientifique"
-#: forms.py:362 models.py:285
+#: forms.py:362 models.py:298
msgid "Requested operation type"
msgstr "Type d'opération demandée"
@@ -210,11 +212,11 @@ msgstr "Type d'opération demandée"
msgid "Lead organization"
msgstr "Organisation porteuse du projet"
-#: forms.py:380 models.py:295
+#: forms.py:380 models.py:308
msgid "Classified area"
msgstr "Au sein d'un site classé"
-#: forms.py:382 models.py:297
+#: forms.py:382 models.py:310
msgid "Protected area"
msgstr "Au sein d'un secteur sauvegardé"
@@ -278,8 +280,8 @@ msgstr "Dossier : réf. du permis"
msgid "Archaeological file - Administrative act - General"
msgstr "Dossier archéologique - Acte administratif - Général"
-#: ishtar_menu.py:33 models.py:320 templates/ishtar/sheet_file.html:4
-#: wizards.py:152 wizards.py:162
+#: ishtar_menu.py:33 models.py:338 templates/ishtar/sheet_file.html:4
+#: wizards.py:156 wizards.py:166
msgid "Archaeological file"
msgstr "Dossier"
@@ -307,7 +309,7 @@ msgstr "Suppression"
msgid "Administrative act"
msgstr "Acte administratif"
-#: ishtar_menu.py:77
+#: ishtar_menu.py:77 models.py:321
msgid "Documents"
msgstr "Documents"
@@ -319,206 +321,206 @@ msgstr "Tableau de bord"
msgid "General informations"
msgstr "Informations générales"
-#: ishtar_menu.py:89 models.py:321
+#: ishtar_menu.py:89 models.py:339
#: templates/ishtar/dashboards/dashboard_file.html:7
msgid "Archaeological files"
msgstr "Dossiers archéologiques"
-#: models.py:43
+#: models.py:44
msgid "Archaeological file type"
msgstr "Type de dossier archéologique"
-#: models.py:44
+#: models.py:45
msgid "Archaeological file types"
msgstr "Types de dossier archéologique"
-#: models.py:64
+#: models.py:65
msgid "Permit types"
msgstr "Types de permis"
-#: models.py:74
+#: models.py:75
msgid "Delay (in days)"
msgstr "Délai (en jours)"
-#: models.py:127
+#: models.py:131 models.py:268
+msgid "Towns"
+msgstr "Communes"
+
+#: models.py:137
msgctxt "key for text search"
msgid "year"
msgstr "annee"
-#: models.py:131
+#: models.py:141
msgctxt "key for text search"
msgid "reference"
msgstr "reference"
-#: models.py:135
+#: models.py:145
msgctxt "key for text search"
msgid "other-reference"
msgstr "autre-reference"
-#: models.py:139
+#: models.py:149
msgctxt "key for text search"
msgid "town"
msgstr "commune"
-#: models.py:143
+#: models.py:153
msgctxt "key for text search"
msgid "parcel"
msgstr "parcelle"
-#: models.py:147
+#: models.py:157
msgctxt "key for text search"
msgid "department"
msgstr "departement"
-#: models.py:151
+#: models.py:161
msgctxt "key for text search"
msgid "name"
msgstr "nom"
-#: models.py:155
+#: models.py:165
msgctxt "key for text search"
msgid "type"
msgstr "type"
-#: models.py:159
+#: models.py:169
msgctxt "key for text search"
msgid "active"
msgstr "actif"
-#: models.py:163
+#: models.py:173
msgctxt "key for text search"
msgid "saisine-type"
msgstr "type-saisine"
-#: models.py:167
+#: models.py:177
msgctxt "key for text search"
msgid "permit-type"
msgstr "type-permit"
-#: models.py:171
+#: models.py:181
msgctxt "key for text search"
msgid "permit-reference"
msgstr "reference-permis"
-#: models.py:175
+#: models.py:185
msgctxt "key for text search"
msgid "comment"
msgstr "commentaire"
-#: models.py:179
+#: models.py:189
msgctxt "key for text search"
msgid "in-charge"
msgstr "responsable"
-#: models.py:183
+#: models.py:193
msgctxt "key for text search"
msgid "general-contractor"
msgstr "amenageur"
-#: models.py:188
+#: models.py:198
msgctxt "key for text search"
msgid "general-contractor-organization"
msgstr "amenageur-organisation"
-#: models.py:192
+#: models.py:202
msgctxt "key for text search"
msgid "created-by"
msgstr "cree-par"
-#: models.py:196
+#: models.py:206
msgctxt "key for text search"
msgid "modified-by"
msgstr "modifie-par"
-#: models.py:211
+#: models.py:224
msgid "Internal reference"
msgstr "Référence interne"
-#: models.py:213
+#: models.py:226
msgid "External ID"
msgstr "Identifiant"
-#: models.py:216
+#: models.py:229
msgid "External ID is set automatically"
msgstr "L'identifiant est attribué automatiquement"
-#: models.py:228
+#: models.py:241
msgid "General contractor (raw)"
msgstr "Aménageur (brut)"
-#: models.py:232
+#: models.py:245
msgid "General contractor organization"
msgstr "Organisation de l'aménageur"
-#: models.py:240
+#: models.py:253
msgid "Planning service (raw)"
msgstr "Service instructeur (brut)"
-#: models.py:246
+#: models.py:259
msgid "Planning service organization"
msgstr "Service instructeur"
-#: models.py:252 templates/ishtar/sheet_file.html:55
+#: models.py:265 templates/ishtar/sheet_file.html:55
msgid "Closing date"
msgstr "Date de clôture"
-#: models.py:253
+#: models.py:266
msgid "Main town"
msgstr "Commune principale"
-#: models.py:255
-msgid "Towns"
-msgstr "Communes"
-
-#: models.py:268
+#: models.py:281
msgid "Instruction deadline"
msgstr "Date limite d'instruction"
-#: models.py:274
+#: models.py:287
msgid "Locality"
msgstr "Lieu-dit"
-#: models.py:277
+#: models.py:290
msgid "Main address - postal code"
msgstr "Adresse des terrains - code postal"
-#: models.py:287
+#: models.py:300
msgid "Organization"
msgstr "Organisation"
-#: models.py:292
+#: models.py:305
msgid "Research archaeology comment"
msgstr "Commentaire relatif à l'archéologie programmée"
-#: models.py:306
+#: models.py:324
msgid "Cached name"
msgstr "Nom en cache"
-#: models.py:308
+#: models.py:326
msgid "Imported line"
msgstr "Ligne importée"
-#: models.py:343
+#: models.py:364
msgid "FILE"
msgstr "DOSSIER"
-#: models.py:525
+#: models.py:546
msgid "Multi-town"
msgstr "Intercommunal"
-#: models.py:531
+#: models.py:552
msgid "No town"
msgstr "Pas de commune"
-#: models.py:695
+#: models.py:716
msgid "File"
msgstr "Dossier"
-#: templates/ishtar/administrativeact_document.html:17
+#: templates/ishtar/administrativeact_document.html:18
msgid "Document generation"
msgstr "Génération de document"
-#: templates/ishtar/administrativeact_document.html:35
+#: templates/ishtar/administrativeact_document.html:36
msgid "Generate"
msgstr "Générer"
@@ -622,63 +624,63 @@ msgstr "Dossier clos"
msgid "by"
msgstr "par"
-#: templates/ishtar/sheet_file.html:67
+#: templates/ishtar/sheet_file.html:68
msgid "Localisation"
msgstr "Localisation"
-#: templates/ishtar/sheet_file.html:76
+#: templates/ishtar/sheet_file.html:77
msgid "Surface"
msgstr "Surface"
-#: templates/ishtar/sheet_file.html:86
+#: templates/ishtar/sheet_file.html:87
msgid "Preventive archaeological file"
msgstr "Dossier d'archéologie préventive"
-#: templates/ishtar/sheet_file.html:91
+#: templates/ishtar/sheet_file.html:92
msgid "Developed surface"
msgstr "Surface aménagée"
-#: templates/ishtar/sheet_file.html:154
+#: templates/ishtar/sheet_file.html:155
msgid "Associated parcels"
msgstr "Parcelles associées"
-#: templates/ishtar/sheet_file.html:157
+#: templates/ishtar/sheet_file.html:158
msgid "Administrative acts"
msgstr "Actes administratifs"
-#: templates/ishtar/sheet_file.html:160 wizards.py:123
+#: templates/ishtar/sheet_file.html:161 wizards.py:127
msgid "Associated operations"
msgstr "Opérations associées"
-#: templates/ishtar/sheet_file.html:163 templates/ishtar/sheet_file.html:191
+#: templates/ishtar/sheet_file.html:164 templates/ishtar/sheet_file.html:192
msgid "Ref."
msgstr "Réf."
-#: templates/ishtar/sheet_file.html:165 templates/ishtar/sheet_file.html:192
+#: templates/ishtar/sheet_file.html:166 templates/ishtar/sheet_file.html:193
msgid "Type"
msgstr "Type"
-#: templates/ishtar/sheet_file.html:167
+#: templates/ishtar/sheet_file.html:168
msgid "Start date"
msgstr "Date de début"
-#: templates/ishtar/sheet_file.html:168
+#: templates/ishtar/sheet_file.html:169
msgid "Excavation end date"
msgstr "Date de fin de chantier"
-#: templates/ishtar/sheet_file.html:183
+#: templates/ishtar/sheet_file.html:184
msgid "No operation associated to this archaeological file"
msgstr "Pas d'opération associée à ce dossier archéologique"
-#: templates/ishtar/sheet_file.html:187
+#: templates/ishtar/sheet_file.html:188
msgid "Admninistrative acts linked to associated operations"
msgstr "Actes administratifs associés à ces opérations"
-#: templates/ishtar/sheet_file.html:193
+#: templates/ishtar/sheet_file.html:194
msgid "Date"
msgstr "Date"
-#: templates/ishtar/sheet_file.html:203
+#: templates/ishtar/sheet_file.html:204
msgid "No administrative act linked to operations"
msgstr "Pas d'acte administratif associé à ces opérations"
diff --git a/translations/fr/archaeological_files_pdl.po b/translations/fr/archaeological_files_pdl.po
index 817c6babd..8149b70a4 100644
--- a/translations/fr/archaeological_files_pdl.po
+++ b/translations/fr/archaeological_files_pdl.po
@@ -6,13 +6,15 @@
# Valérie-Emma Leroux <emma@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:52+0100\n"
"PO-Revision-Date: 2018-02-08 05:22+0000\n"
"Last-Translator: Valérie-Emma Leroux <emma@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1)\n"
"X-Generator: Zanata 4.6.0\n"
diff --git a/translations/fr/archaeological_finds.po b/translations/fr/archaeological_finds.po
index 4d39c8ccd..bf9f35492 100644
--- a/translations/fr/archaeological_finds.po
+++ b/translations/fr/archaeological_finds.po
@@ -8,250 +8,254 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:51+0100\n"
"PO-Revision-Date: 2018-08-15 03:36+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
-#: admin.py:39 models_finds.py:285
+#: admin.py:39 models_finds.py:288
msgid "Point (2D)"
msgstr "Point (2D)"
-#: admin.py:41 models_finds.py:287
+#: admin.py:41 models_finds.py:290
msgid "Line"
msgstr "Ligne"
-#: admin.py:43 models_finds.py:288
+#: admin.py:43 models_finds.py:291
msgid "Multi polygon"
msgstr "Polygones multi-parties"
-#: forms.py:88 forms.py:94 forms.py:451 models_finds.py:619
-#: models_finds.py:1085 wizards.py:71
+#: forms.py:91 forms.py:97 forms.py:340 forms.py:353 forms.py:631
+#: models_finds.py:660 models_finds.py:1212 wizards.py:75
msgid "Context record"
msgstr "Unité d'Enregistrement"
-#: forms.py:89
+#: forms.py:92
msgid "Find - 010 - Context record choice"
msgstr "Mobilier - 010 - Choix de l'unité d'enregistrement"
-#: forms.py:123 ishtar_menu.py:32 models_finds.py:986 models_finds.py:1579
-#: models_treatments.py:338 templates/ishtar/sheet_find.html:4
+#: forms.py:126 ishtar_menu.py:32 models_finds.py:1089 models_finds.py:1716
+#: models_treatments.py:349 templates/ishtar/sheet_find.html:4
msgid "Find"
msgstr "Mobilier"
-#: forms.py:124
+#: forms.py:127
msgid "Find - 020 - General"
msgstr "Mobilier - 020 - Général"
-#: forms.py:139 templates/ishtar/sheet_find.html:119
+#: forms.py:142 forms.py:341 templates/ishtar/sheet_find.html:40
msgid "Identification"
msgstr "Identification"
-#: forms.py:142 forms.py:420 forms.py:702 models_finds.py:250
-#: models_finds.py:855 templates/ishtar/sheet_find.html:19
+#: forms.py:145 forms.py:360 forms.py:600 forms.py:889 models_finds.py:253
+#: models_finds.py:968
msgid "Free ID"
msgstr "Identifiant libre"
-#: forms.py:144 forms.py:421 models_finds.py:856
-#: templates/ishtar/sheet_find.html:18
+#: forms.py:147 forms.py:362 forms.py:601 forms.py:932 models_finds.py:969
msgid "Denomination"
msgstr "Dénomination"
-#: forms.py:145 models_finds.py:929
+#: forms.py:148 forms.py:363 models_finds.py:1042
msgid "Previous ID"
msgstr "Identifiant précédent"
-#: forms.py:147 models_finds.py:254
+#: forms.py:150 forms.py:365 models_finds.py:257
msgid "Excavation ID"
msgstr "Identifiant fouille"
-#: forms.py:148 models_finds.py:857
+#: forms.py:151 forms.py:366 models_finds.py:970
msgid "Museum ID"
msgstr "Identifiant musée"
-#: forms.py:149 models_finds.py:852
+#: forms.py:152 forms.py:367 models_finds.py:965
msgid "Seal number"
msgstr "Numéro de scellé"
-#: forms.py:150 models_finds.py:925
+#: forms.py:153 forms.py:368 models_finds.py:1038
msgid "Mark"
msgstr "Marquage"
-#: forms.py:152 forms.py:153 forms.py:471 forms_treatments.py:139
-#: models_finds.py:255 models_finds.py:858 models_treatments.py:138
-#: templates/ishtar/sheet_find.html:134
+#: forms.py:155 forms.py:156 forms.py:342 forms.py:371 forms.py:652
+#: forms_treatments.py:139 models_finds.py:258 models_finds.py:971
+#: models_treatments.py:146 templates/ishtar/sheet_find.html:58
msgid "Description"
msgstr "Description"
-#: forms.py:156 models_finds.py:262
+#: forms.py:159 models_finds.py:265
msgid "Discovery date (exact or TPQ)"
msgstr "Date de découverte (exacte ou TPQ)"
-#: forms.py:159 models_finds.py:264 templates/ishtar/sheet_find.html:78
+#: forms.py:162 models_finds.py:267 templates/ishtar/sheet_basefind.html:29
msgid "Discovery date (TAQ)"
msgstr "Date de découverte (TAQ)"
-#: forms.py:161 forms.py:473 models_finds.py:266
+#: forms.py:164 forms.py:654 models_finds.py:269
msgid "Batch/object"
msgstr "Lot/objet"
-#: forms.py:163 models_finds.py:890
+#: forms.py:166 models_finds.py:1003
msgid "Is complete?"
msgstr "Est complet ?"
-#: forms.py:166 models_finds.py:54 models_finds.py:642 models_finds.py:864
+#: forms.py:169 forms.py:373 models_finds.py:57 models_finds.py:685
+#: models_finds.py:977
msgid "Material types"
msgstr "Types de matériau"
-#: forms.py:169 models_finds.py:869
+#: forms.py:172 models_finds.py:982
msgid "Material type quality"
msgstr "Qualité du type de matériaux"
-#: forms.py:171 models_finds.py:149 models_finds.py:643 models_finds.py:893
+#: forms.py:174 forms.py:376 models_finds.py:152 models_finds.py:686
+#: models_finds.py:1006
msgid "Object types"
msgstr "Types d'objet"
-#: forms.py:174 models_finds.py:898
+#: forms.py:177 models_finds.py:1011
msgid "Object type quality"
msgstr "Qualité du type d'objet"
-#: forms.py:175 forms.py:709 models_finds.py:876
+#: forms.py:178 forms.py:896 models_finds.py:989
msgid "Find number"
msgstr "Mobilier (en nombre)"
-#: forms.py:177 models_finds.py:911
+#: forms.py:180 models_finds.py:1024
msgid "Minimum number of individuals (MNI)"
msgstr "Nombre minimum d'individus (NMI)"
-#: forms.py:179 models_finds.py:859
+#: forms.py:182 models_finds.py:972
msgid "Decoration"
msgstr "Décor"
-#: forms.py:181 models_finds.py:860
+#: forms.py:184 models_finds.py:973
msgid "Inscription"
msgstr "Inscription"
-#: forms.py:184 models_finds.py:862
+#: forms.py:187 forms.py:379 models_finds.py:975
msgid "Manufacturing place"
msgstr "Lieu de fabrication"
-#: forms.py:186 models_finds.py:908
+#: forms.py:189 forms.py:381 models_finds.py:1021
msgid "Communicability"
msgstr "Communicabilité"
-#: forms.py:188 forms_treatments.py:141 forms_treatments.py:491
-#: models_finds.py:256 models_finds.py:926 models_treatments.py:137
-#: models_treatments.py:595
+#: forms.py:191 forms.py:384 forms.py:955 forms_treatments.py:141
+#: forms_treatments.py:577 models_finds.py:259 models_finds.py:1039
+#: models_treatments.py:145 models_treatments.py:609
msgid "Comment"
msgstr "Commentaire général"
-#: forms.py:191 models_finds.py:927
+#: forms.py:194 forms.py:394 models_finds.py:1040
msgid "Comment on dating"
msgstr "Commentaire relatif aux datations"
-#: forms.py:193 templates/ishtar/sheet_find.html:152
+#: forms.py:196 templates/ishtar/sheet_find.html:76
msgid "Dimensions"
msgstr "Dimensions"
-#: forms.py:194 models_finds.py:912
+#: forms.py:197 models_finds.py:1025
msgid "Length (cm)"
msgstr "Longueur (cm)"
-#: forms.py:195 models_finds.py:913
+#: forms.py:198 models_finds.py:1026
msgid "Width (cm)"
msgstr "Largeur (cm)"
-#: forms.py:196 models_finds.py:914
+#: forms.py:199 models_finds.py:1027
msgid "Height (cm)"
msgstr "Hauteur (cm)"
-#: forms.py:197 models_finds.py:915
+#: forms.py:200 models_finds.py:1028
msgid "Diameter (cm)"
msgstr "Diamètre (cm)"
-#: forms.py:198 models_finds.py:916
+#: forms.py:201 models_finds.py:1029
msgid "Thickness (cm)"
msgstr "Épaisseur (cm)"
-#: forms.py:199 forms.py:707 models_finds.py:872
+#: forms.py:202 forms.py:894 models_finds.py:985
msgid "Volume (l)"
msgstr "Volume (l)"
-#: forms.py:200 forms.py:708 templates/ishtar/sheet_find.html:160
+#: forms.py:203 forms.py:895 templates/ishtar/sheet_find.html:84
msgid "Weight (g)"
msgstr "Poids (g)"
-#: forms.py:202
+#: forms.py:205
msgid "Clutter long side (cm)"
msgstr "Encombrement grand côté (cm)"
-#: forms.py:204
+#: forms.py:207
msgid "Clutter short side (cm)"
msgstr "Encombrement petit côté (cm)"
-#: forms.py:206
+#: forms.py:209
msgid "Clutter height (cm)"
msgstr "Encombrement hauteur (cm)"
-#: forms.py:208 models_finds.py:923
+#: forms.py:211 models_finds.py:1036
msgid "Dimensions comment"
msgstr "Commentaire relatif aux dimensions"
-#: forms.py:211 templates/ishtar/sheet_find.html:94
-#: templates/ishtar/sheet_find.html:98
+#: forms.py:214 templates/ishtar/sheet_basefind.html:46
+#: templates/ishtar/sheet_basefind.html:50
msgid "Coordinates"
msgstr "Coordonnées"
-#: forms.py:213 models_finds.py:271
-msgid "Point of topographic reference"
-msgstr "Point topographique"
-
-#: forms.py:216 models_finds.py:273
+#: forms.py:215 models_finds.py:276
msgid "X"
msgstr "X"
-#: forms.py:217 models_finds.py:274
+#: forms.py:217 models_finds.py:279
+msgid "Estimated error for X"
+msgstr "Erreur estimée pour X"
+
+#: forms.py:218 models_finds.py:277
msgid "Y"
msgstr "Y"
-#: forms.py:218 models_finds.py:275
+#: forms.py:220 models_finds.py:281
+msgid "Estimated error for Y"
+msgstr "Erreur estimée pour Y"
+
+#: forms.py:221 models_finds.py:278
msgid "Z"
msgstr "Z"
-#: forms.py:220 models_finds.py:283
+#: forms.py:223 models_finds.py:283
+msgid "Estimated error for Z"
+msgstr "Erreur estimée pour Z"
+
+#: forms.py:225 models_finds.py:286
msgid "Spatial Reference System"
msgstr "Système de référence spatiale"
-#: forms.py:223 models_finds.py:276
-msgid "Estimated error for X"
-msgstr "Erreur estimée pour X"
-
-#: forms.py:225 models_finds.py:278
-msgid "Estimated error for Y"
-msgstr "Erreur estimée pour Y"
-
-#: forms.py:227 models_finds.py:280
-msgid "Estimated error for Z"
-msgstr "Erreur estimée pour Z"
+#: forms.py:228 models_finds.py:274
+msgid "Point of topographic reference"
+msgstr "Point topographique"
-#: forms.py:229 templates/ishtar/sheet_find.html:169
+#: forms.py:232 forms.py:343 templates/ishtar/sheet_basefind.html:66
+#: templates/ishtar/sheet_find.html:93
msgid "Sheet"
msgstr "Fiche"
-#: forms.py:230 forms.py:474 models_finds.py:931
+#: forms.py:233 forms.py:387 forms.py:655 models_finds.py:1044
msgid "Check"
msgstr "Vérification"
-#: forms.py:232 models_finds.py:933
+#: forms.py:235 forms.py:389 models_finds.py:1046
msgid "Check date"
msgstr "Date de vérification"
-#: forms.py:271
+#: forms.py:274
msgid ""
"Discovery date: if a TAQ date is provided a TPQ date has to be informed. If "
"you have a precise date fill only the TPQ - discovery date field."
@@ -260,274 +264,326 @@ msgstr ""
"renseignée. Si vous avez une date précise, remplissez seulement le champ « "
"date de découverte (exacte ou TPQ) »."
-#: forms.py:277
+#: forms.py:280
msgid "Discovery date: TAQ date must be older than TPQ date."
msgstr "Date de découverte : la date TAQ doit être postérieure à la date TPQ."
-#: forms.py:287
+#: forms.py:290
msgid "Clutter: short side cannot be bigger than the long side."
msgstr ""
"Encombrement : le petit côté court ne peut pas être plus grand que le grand "
"côté."
-#: forms.py:304
-msgid ""
-"You should at least provide X, Y and the spatial reference system used."
+#: forms.py:307
+msgid "You should at least provide X, Y and the spatial reference system used."
msgstr ""
"Vous devez au minimum fournir X, Y et le système de référence spatiale "
"utilisé."
-#: forms.py:313
-msgid ""
-"Coordinates are not relevant for the spatial reference system used: {}."
+#: forms.py:316
+msgid "Coordinates are not relevant for the spatial reference system used: {}."
msgstr ""
"Les coordonnées ne sont pas pertinentes pour le système de référence "
"spatiale utilisé : {}."
-#: forms.py:319 templates/ishtar/sheet_find.html:182
+#: forms.py:322
+msgid "Find - Quick action - Modify"
+msgstr "Mobilier - Raccourci - Modification"
+
+#: forms.py:344
+msgid "Datation"
+msgstr "Datation"
+
+#: forms.py:392 forms.py:565 forms.py:641 templates/ishtar/sheet_find.html:123
+msgid "Period"
+msgstr "Période"
+
+#: forms.py:436
+msgid "Find - Quick action - Modify single"
+msgstr "Mobilier - Raccourci - Modification simple"
+
+#: forms.py:449
+msgid "Create"
+msgstr "Créer"
+
+#: forms.py:450
+msgid "Update"
+msgstr "Mise à jour"
+
+#: forms.py:452 forms.py:636 forms.py:982 forms.py:986 forms_treatments.py:180
+#: ishtar_menu.py:57 models_finds.py:926
+#: templates/ishtar/sheet_findbasket.html:4 views.py:646
+msgid "Basket"
+msgstr "Panier"
+
+#: forms.py:474
+msgid "On update, you have to select a basket."
+msgstr ""
+
+#: forms.py:478
+msgid "A label is required."
+msgstr "Un libellé est nécessaire."
+
+#: forms.py:481
+msgid "A basket with this label already exists."
+msgstr "Un panier avec ce libellé existe déja."
+
+#: forms.py:498 templates/ishtar/sheet_find.html:102
msgid "Preservation"
msgstr "Conservation"
-#: forms.py:320
+#: forms.py:499
msgid "Find - 030 - Preservation"
msgstr "Mobilier - 030 - Conservation"
-#: forms.py:333 forms.py:467 models_finds.py:902
+#: forms.py:513 forms.py:648 models_finds.py:1015
msgid "Integrity / interest"
msgstr "Intégrité / intérêt"
-#: forms.py:336 forms.py:469 models_finds.py:905
+#: forms.py:516 forms.py:650 models_finds.py:1018
msgid "Remarkability"
msgstr "Remarquabilité"
-#: forms.py:338 forms.py:465 models_finds.py:77 models_finds.py:943
+#: forms.py:518 forms.py:646 models_finds.py:80 models_finds.py:1056
msgid "Conservatory state"
msgstr "État sanitaire"
-#: forms.py:341 models_finds.py:952
+#: forms.py:521 models_finds.py:1065
msgid "Alteration"
msgstr "Altération"
-#: forms.py:344 models_finds.py:956
+#: forms.py:524 models_finds.py:1069
msgid "Alteration cause"
msgstr "Cause d'altération"
-#: forms.py:347 models_finds.py:949
+#: forms.py:527 models_finds.py:1062
msgid "Recommended treatments"
msgstr "Traitements recommandés"
-#: forms.py:349 models_finds.py:960
+#: forms.py:529 models_finds.py:1073
msgid "Treatment emergency"
msgstr "Urgence du traitement"
-#: forms.py:351 models_finds.py:935
+#: forms.py:531 models_finds.py:1048
msgid "Estimated value"
msgstr "Valeur estimée"
-#: forms.py:352 models_finds.py:963
+#: forms.py:532 models_finds.py:1076
msgid "Insurance value"
msgstr "Valeur d'assurance"
-#: forms.py:354 models_finds.py:965
+#: forms.py:534 models_finds.py:1078
msgid "Appraisal date"
msgstr "Date d'évaluation"
-#: forms.py:356 models_finds.py:945
+#: forms.py:536 models_finds.py:1058
msgid "Conservatory comment"
msgstr "Commentaire relatif à la conservation"
-#: forms.py:380 forms.py:404 models_finds.py:884
-#: templates/ishtar/sheet_find.html:199
+#: forms.py:560 forms.py:584 models_finds.py:997
+#: templates/ishtar/sheet_find.html:119
msgid "Dating"
msgstr "Datation"
-#: forms.py:385 forms.py:460
-msgid "Period"
-msgstr "Période"
-
-#: forms.py:386 forms_treatments.py:143 forms_treatments.py:284
-#: forms_treatments.py:493 models_finds.py:1584 models_treatments.py:140
-#: models_treatments.py:349 templates/ishtar/sheet_find.html:232
-#: templates/ishtar/sheet_find.html:270
+#: forms.py:566 forms_treatments.py:143 forms_treatments.py:370
+#: forms_treatments.py:579 models_finds.py:1721 models_treatments.py:148
+#: models_treatments.py:360 templates/ishtar/sheet_find.html:124
+#: templates/ishtar/sheet_find.html:185 templates/ishtar/sheet_find.html:223
msgid "Start date"
msgstr "Date de début"
-#: forms.py:388 models_finds.py:1585 models_treatments.py:350
-#: templates/ishtar/sheet_find.html:233 templates/ishtar/sheet_find.html:271
+#: forms.py:568 models_finds.py:1722 models_treatments.py:361
+#: templates/ishtar/sheet_find.html:125 templates/ishtar/sheet_find.html:186
+#: templates/ishtar/sheet_find.html:224
msgid "End date"
msgstr "Date de fin"
-#: forms.py:389
+#: forms.py:569 templates/ishtar/sheet_find.html:127
msgid "Quality"
msgstr "Qualité"
-#: forms.py:391
+#: forms.py:571 templates/ishtar/sheet_find.html:126
msgid "Dating type"
msgstr "Type de datation"
-#: forms.py:393
+#: forms.py:573 templates/ishtar/sheet_find.html:128
msgid "Precise dating"
msgstr "Datation précise"
-#: forms.py:405
+#: forms.py:585
msgid "Find - 040 - Dating"
msgstr "Mobilier - 040 - Datation"
-#: forms.py:412
+#: forms.py:592
msgid "Find - 001 - Search"
msgstr "Mobilier - 001 - Recherche"
-#: forms.py:415 forms_treatments.py:50 forms_treatments.py:333
-#: forms_treatments.py:406 forms_treatments.py:598
+#: forms.py:595 forms.py:928 forms_treatments.py:50 forms_treatments.py:419
+#: forms_treatments.py:492 forms_treatments.py:685
msgid "Full text search"
msgstr "Recherche en texte intégral"
-#: forms.py:418 models_finds.py:291
+#: forms.py:598 models_finds.py:294
msgid "Short ID"
msgstr "Identifiant court"
-#: forms.py:419 models_finds.py:294
+#: forms.py:599 models_finds.py:297
msgid "Complete ID"
msgstr "Identifiant complet"
-#: forms.py:424 forms_treatments.py:56 forms_treatments.py:101
-#: forms_treatments.py:336 forms_treatments.py:411 forms_treatments.py:463
-#: forms_treatments.py:601 models_treatments.py:114 models_treatments.py:568
+#: forms.py:604 forms_treatments.py:56 forms_treatments.py:101
+#: forms_treatments.py:295 forms_treatments.py:422 forms_treatments.py:497
+#: forms_treatments.py:549 forms_treatments.py:688 models_treatments.py:122
+#: models_treatments.py:582
msgid "Year"
msgstr "Année"
-#: forms.py:426
+#: forms.py:606
msgid "Operation's number (index by year)"
msgstr "Numéro de l'opération (index par année)"
-#: forms.py:429
+#: forms.py:609
msgid "Code PATRIARCHE"
msgstr "Code PATRIARCHE"
-#: forms.py:433
+#: forms.py:613
msgid "Operation type"
msgstr "Type d'opération"
-#: forms.py:436
+#: forms.py:616
msgid "Areas"
msgstr "Zones"
-#: forms.py:439
+#: forms.py:619
msgid "Archaeological site (attached to the operation)"
msgstr "Site archéologique (attaché à l'opération)"
-#: forms.py:445
+#: forms.py:625
msgid "Archaeological site (attached to the context record)"
msgstr "Site archéologique (attaché à l'UE)"
-#: forms.py:457
+#: forms.py:638
msgid "Search within related operations"
msgstr "Rechercher parmi les opérations liées"
-#: forms.py:459
+#: forms.py:640
msgid "Search within related context records"
msgstr "Recherche parmi les Unités d'Enregistrement associées"
-#: forms.py:461 forms.py:706 models_finds.py:53
+#: forms.py:642 forms.py:893 models_finds.py:56
msgid "Material type"
msgstr "Type de matériau"
-#: forms.py:462 models_finds.py:148
+#: forms.py:643 models_finds.py:151
msgid "Object type"
msgstr "Type d'objet"
-#: forms.py:464
+#: forms.py:645
msgid "Preservation type"
msgstr "Type de conservation"
-#: forms.py:475 forms_treatments.py:59
+#: forms.py:656 forms_treatments.py:59
msgid "Has an image?"
msgstr "Dispose d'une image ?"
-#: forms.py:516
+#: forms.py:703
msgid "Warehouse (location)"
msgstr "Lieu de conservation (localisation)"
-#: forms.py:522
+#: forms.py:709
msgid "Warehouse (responsible)"
msgstr "Lieu de conservation (responsable)"
-#: forms.py:527
+#: forms.py:714
msgid "Container ID"
msgstr "Identifiant du contenant"
-#: forms.py:528
+#: forms.py:715
msgid "Container ref."
msgstr "Réf. contenant"
-#: forms.py:533 forms.py:557 views.py:156
+#: forms.py:720 forms.py:744 views.py:185
msgid "Find search"
msgstr "Rechercher un mobilier"
-#: forms.py:582 models_treatments.py:247
+#: forms.py:769 models_treatments.py:258
#: templates/ishtar/sheet_treatment.html:56
msgid "Upstream finds"
msgstr "Mobilier amont"
-#: forms.py:584 models_finds.py:987
+#: forms.py:771 models_finds.py:1090
+#: templates/ishtar/forms/qa_find_treatment.html:11
msgid "Finds"
msgstr "Mobilier"
-#: forms.py:596
+#: forms.py:783
msgid "You should at least select one archaeological find."
msgstr "Vous devez sélectionner au moins un mobilier archéologique."
-#: forms.py:699
+#: forms.py:886
msgid "Resulting find"
msgstr "Mobilier résultant"
-#: forms.py:704
+#: forms.py:891
msgid "Precise description"
msgstr "Description précise"
-#: forms.py:718
+#: forms.py:905
msgid "Resulting finds"
msgstr "Mobiliers résultants"
-#: forms.py:723
+#: forms.py:910
msgid "Would you like to delete this find?"
msgstr "Voulez-vous supprimer ce mobilier ?"
-#: forms.py:727 models_treatments.py:66
+#: forms.py:914 models_treatments.py:68
msgid "Upstream find"
msgstr "Mobilier amont"
-#: forms.py:748
-msgid "Another basket already exists with this name."
-msgstr "Un autre panier existant utilise déjà ce nom."
+#: forms.py:925
+#, fuzzy
+#| msgid "Find - 001 - Search"
+msgid "Find basket - 001 - Search"
+msgstr "Mobilier - 001 - Recherche"
-#: forms.py:758 forms.py:762 forms_treatments.py:180 ishtar_menu.py:57
-msgid "Basket"
-msgstr "Panier"
+#: forms.py:937 views.py:122
+#, fuzzy
+#| msgid "Treatment search"
+msgid "Basket search"
+msgstr "Rechercher un traitement"
-#: forms_treatments.py:54 forms_treatments.py:97 models_treatments.py:110
-#: templates/ishtar/sheet_find.html:226 templates/ishtar/sheet_find.html:264
+#: forms.py:951
+msgid "Find basket"
+msgstr "Panier de mobilier"
+
+#: forms.py:953 forms_treatments.py:54 forms_treatments.py:97
+#: models_treatments.py:118 templates/ishtar/sheet_find.html:179
+#: templates/ishtar/sheet_find.html:217
msgid "Label"
msgstr "Dénomination"
-#: forms_treatments.py:55 forms_treatments.py:100 models_treatments.py:112
+#: forms.py:972
+msgid "Another basket already exists with this name."
+msgstr "Un autre panier existant utilise déjà ce nom."
+
+#: forms_treatments.py:55 forms_treatments.py:100 models_treatments.py:120
msgid "Other ref."
msgstr "Autre réf."
-#: forms_treatments.py:57 forms_treatments.py:232 forms_treatments.py:337
-#: forms_treatments.py:399 forms_treatments.py:412 forms_treatments.py:516
-#: forms_treatments.py:602 forms_treatments.py:669 models_treatments.py:115
-#: models_treatments.py:569
+#: forms_treatments.py:57 forms_treatments.py:232 forms_treatments.py:423
+#: forms_treatments.py:485 forms_treatments.py:498 forms_treatments.py:602
+#: forms_treatments.py:689 forms_treatments.py:756 models_treatments.py:123
+#: models_treatments.py:583
msgid "Index"
msgstr "Index"
-#: forms_treatments.py:58 forms_treatments.py:106 forms_treatments.py:292
-#: forms_treatments.py:353 models_finds.py:103 models_treatments.py:120
-#: models_treatments.py:348
+#: forms_treatments.py:58 forms_treatments.py:106 forms_treatments.py:378
+#: forms_treatments.py:439 models_finds.py:106 models_treatments.py:128
+#: models_treatments.py:359
msgid "Treatment type"
msgstr "Type de traitement"
-#: forms_treatments.py:71 views.py:383
+#: forms_treatments.py:71 views.py:420
msgid "Treatment search"
msgstr "Rechercher un traitement"
@@ -539,8 +595,8 @@ msgstr "Traitement de base"
msgid "Treatment - 020 - General"
msgstr "Traitement - 020 - Général"
-#: forms_treatments.py:108 models_treatments.py:68 models_treatments.py:122
-#: templates/ishtar/sheet_find.html:228 templates/ishtar/sheet_find.html:266
+#: forms_treatments.py:108 models_treatments.py:70 models_treatments.py:130
+#: templates/ishtar/sheet_find.html:181 templates/ishtar/sheet_find.html:219
msgid "State"
msgstr "État"
@@ -548,15 +604,16 @@ msgstr "État"
msgid "Target"
msgstr "Destination"
-#: forms_treatments.py:112 forms_treatments.py:474 models_treatments.py:130
+#: forms_treatments.py:112 forms_treatments.py:301 forms_treatments.py:560
+#: models_treatments.py:71 models_treatments.py:138
msgid "Responsible"
msgstr "Responsable"
-#: forms_treatments.py:118 models_treatments.py:133
+#: forms_treatments.py:118 forms_treatments.py:307 models_treatments.py:141
msgid "Organization"
msgstr "Organisation"
-#: forms_treatments.py:124 models_treatments.py:125 models_treatments.py:351
+#: forms_treatments.py:124 models_treatments.py:133 models_treatments.py:362
msgid "Location"
msgstr "Localisation"
@@ -564,16 +621,16 @@ msgstr "Localisation"
msgid "Container (relevant for packaging)"
msgstr "Contenant (pertinent dans le cadre du conditionnement)"
-#: forms_treatments.py:136 forms_treatments.py:470
+#: forms_treatments.py:136 forms_treatments.py:556
msgid "External ref."
msgstr "Référence"
-#: forms_treatments.py:137 models_treatments.py:139
+#: forms_treatments.py:137 models_treatments.py:147
msgid "Goal"
msgstr "But"
-#: forms_treatments.py:145 forms_treatments.py:284 forms_treatments.py:499
-#: forms_treatments.py:551 models_treatments.py:141 models_treatments.py:589
+#: forms_treatments.py:145 forms_treatments.py:370 forms_treatments.py:585
+#: forms_treatments.py:638 models_treatments.py:149 models_treatments.py:603
msgid "Closing date"
msgstr "Date de clôture"
@@ -622,7 +679,7 @@ msgstr "Un responsable ou une organisation doit être défini."
msgid "Another treatment with this index exists for {}."
msgstr "Un autre traitement avec cet index existe pour {}."
-#: forms_treatments.py:262 models_treatments.py:118
+#: forms_treatments.py:262 models_treatments.py:126
msgid "Associated request"
msgstr "Demande associée"
@@ -630,9 +687,9 @@ msgstr "Demande associée"
msgid "Treatment - 010 - Request choice"
msgstr "Traitement - 010 - Choix de la demande de traitement"
-#: forms_treatments.py:268 forms_treatments.py:454 ishtar_menu.py:84
-#: models_treatments.py:604 models_treatments.py:632
-#: templates/ishtar/sheet_treatmentfile.html:4 wizards.py:195
+#: forms_treatments.py:268 forms_treatments.py:540 ishtar_menu.py:95
+#: models_treatments.py:618 models_treatments.py:646
+#: templates/ishtar/sheet_treatmentfile.html:4 wizards.py:207
msgid "Treatment request"
msgstr "Demande de traitement"
@@ -649,863 +706,926 @@ msgstr ""
msgid "Would you like to delete this treatment?"
msgstr "Voulez-vous supprimer ce traitement ?"
-#: forms_treatments.py:283
+#: forms_treatments.py:285 models_finds.py:683 models_finds.py:1000
+#: models_treatments.py:150 models_treatments.py:363
+#: templates/ishtar/sheet_find.html:184 templates/ishtar/sheet_find.html:222
+msgid "Container"
+msgstr "Contenant"
+
+#: forms_treatments.py:291
+msgid "Create a treatment"
+msgstr "Créer un traitement"
+
+#: forms_treatments.py:298
+msgid "Precise date"
+msgstr "Datation précise"
+
+#: forms_treatments.py:340
+msgid "At least a year is required."
+msgstr "Au moins une année est requise."
+
+#: forms_treatments.py:369
msgid "months"
msgstr "mois"
-#: forms_treatments.py:283
+#: forms_treatments.py:369
msgid "years"
msgstr "années"
-#: forms_treatments.py:288 forms_treatments.py:555
+#: forms_treatments.py:374 forms_treatments.py:642
msgid "Slicing"
msgstr "Découpage"
-#: forms_treatments.py:291 forms_treatments.py:558
+#: forms_treatments.py:377 forms_treatments.py:645
msgid "Date get from"
msgstr "Date utilisée"
-#: forms_treatments.py:294 forms_treatments.py:561
+#: forms_treatments.py:380 forms_treatments.py:648
msgid "Date after"
msgstr "Date après"
-#: forms_treatments.py:296 forms_treatments.py:563
+#: forms_treatments.py:382 forms_treatments.py:650
msgid "Date before"
msgstr "Date avant"
-#: forms_treatments.py:338 forms_treatments.py:388 forms_treatments.py:603
-#: forms_treatments.py:658
+#: forms_treatments.py:424 forms_treatments.py:474 forms_treatments.py:690
+#: forms_treatments.py:745
msgid "Act type"
msgstr "Type d'acte"
-#: forms_treatments.py:339 forms_treatments.py:604
+#: forms_treatments.py:425 forms_treatments.py:691
msgid "Indexed?"
msgstr "Indexé ?"
-#: forms_treatments.py:340 forms_treatments.py:605
+#: forms_treatments.py:426 forms_treatments.py:692
msgid "Object"
msgstr "Objet"
-#: forms_treatments.py:344 forms_treatments.py:609
+#: forms_treatments.py:430 forms_treatments.py:696
msgid "Signature date after"
msgstr "Date de signature après"
-#: forms_treatments.py:346 forms_treatments.py:611
+#: forms_treatments.py:432 forms_treatments.py:698
msgid "Signature date before"
msgstr "Date de signature avant"
-#: forms_treatments.py:348
+#: forms_treatments.py:434
msgid "Treatment name"
msgstr "Nom du traitement"
-#: forms_treatments.py:349
+#: forms_treatments.py:435
msgid "Treatment year"
msgstr "Année du traitement"
-#: forms_treatments.py:350
+#: forms_treatments.py:436
msgid "Treatment index"
msgstr "Index du traitement"
-#: forms_treatments.py:352
+#: forms_treatments.py:438
msgid "Treatment internal reference"
msgstr "Référence interne du traitement"
-#: forms_treatments.py:356 forms_treatments.py:625
+#: forms_treatments.py:442 forms_treatments.py:712
msgid "Modified by"
msgstr "Modifié par"
-#: forms_treatments.py:386
+#: forms_treatments.py:472
msgid "Treatment - Administrative act - General"
msgstr "Traitement - Acte administratif - Général"
-#: forms_treatments.py:409 forms_treatments.py:461 models_treatments.py:574
+#: forms_treatments.py:495 forms_treatments.py:547 models_treatments.py:588
msgid "Name"
msgstr "Nom"
-#: forms_treatments.py:410 forms_treatments.py:468
+#: forms_treatments.py:496 forms_treatments.py:554
msgid "Internal ref."
msgstr "Réf. interne"
-#: forms_treatments.py:413 forms_treatments.py:472 models_treatments.py:67
-#: templates/ishtar/sheet_find.html:227 templates/ishtar/sheet_find.html:265
+#: forms_treatments.py:499 forms_treatments.py:558 models_treatments.py:69
+#: templates/ishtar/sheet_find.html:180 templates/ishtar/sheet_find.html:218
msgid "Type"
msgstr "Type"
-#: forms_treatments.py:416
+#: forms_treatments.py:502
msgid "In charge"
msgstr "Responsable"
-#: forms_treatments.py:422 forms_treatments.py:480 models_treatments.py:583
+#: forms_treatments.py:508 forms_treatments.py:566 models_treatments.py:597
#: templates/ishtar/sheet_treatmentfile.html:45
msgid "Applicant"
msgstr "Demandeur"
-#: forms_treatments.py:428 forms_treatments.py:486 models_treatments.py:587
+#: forms_treatments.py:514 forms_treatments.py:572 models_treatments.py:601
#: templates/ishtar/sheet_treatmentfile.html:53
msgid "Applicant organisation"
msgstr "Organisation du demandeur"
-#: forms_treatments.py:442 views.py:487
+#: forms_treatments.py:528 views.py:524
msgid "Treatment request search"
msgstr "Rechercher une demande de traitement"
-#: forms_treatments.py:497 forms_treatments.py:550 models_treatments.py:593
+#: forms_treatments.py:583 forms_treatments.py:637 models_treatments.py:607
msgid "Reception date"
msgstr "Date de réception"
-#: forms_treatments.py:539
+#: forms_treatments.py:625
msgid "Another treatment request with this index exists for {}."
msgstr "Une autre demande de traitement avec cet index existe pour {}."
-#: forms_treatments.py:545
+#: forms_treatments.py:631
msgid "Are you sure you want to delete this treatment request?"
msgstr "Êtes-vous sûr de vouloir supprimer cette demande de traitement ? "
-#: forms_treatments.py:546
+#: forms_treatments.py:632
msgid "Would you like to delete this treatment request?"
msgstr "Voulez-vous supprimer cette demande de traitement ?"
-#: forms_treatments.py:549 models_treatments.py:591
+#: forms_treatments.py:636 models_treatments.py:605
msgid "Creation date"
msgstr "Date de création"
-#: forms_treatments.py:559 forms_treatments.py:622 models_treatments.py:508
-#: models_treatments.py:576
+#: forms_treatments.py:646 forms_treatments.py:709 models_treatments.py:519
+#: models_treatments.py:590
msgid "Treatment request type"
msgstr "Type de demande de traitement"
-#: forms_treatments.py:614
+#: forms_treatments.py:701
msgid "Treatment request name"
msgstr "Nom du dossier de traitement"
-#: forms_treatments.py:616
+#: forms_treatments.py:703
msgid "Treatment request year"
msgstr "Année du dossier de traitement"
-#: forms_treatments.py:618
+#: forms_treatments.py:705
msgid "Treatment request index"
msgstr "Index de la demande de traitement"
-#: forms_treatments.py:620
+#: forms_treatments.py:707
msgid "Treatment request internal reference"
msgstr "Référence interne de la demande de traitement"
-#: forms_treatments.py:656
+#: forms_treatments.py:743
msgid "Treatment request - Administrative act - General"
msgstr "Demande de traitement - Acte administratif - Général"
-#: ishtar_menu.py:37 ishtar_menu.py:89 ishtar_menu.py:112 ishtar_menu.py:144
-#: ishtar_menu.py:168
+#: ishtar_menu.py:37 ishtar_menu.py:60 ishtar_menu.py:100 ishtar_menu.py:123
+#: ishtar_menu.py:155 ishtar_menu.py:179
msgid "Search"
msgstr "Recherche"
-#: ishtar_menu.py:42 ishtar_menu.py:60 ishtar_menu.py:94 ishtar_menu.py:116
-#: ishtar_menu.py:149 ishtar_menu.py:172
+#: ishtar_menu.py:42 ishtar_menu.py:65 ishtar_menu.py:105 ishtar_menu.py:127
+#: ishtar_menu.py:160 ishtar_menu.py:183
msgid "Creation"
msgstr "Ajout"
-#: ishtar_menu.py:47 ishtar_menu.py:99 ishtar_menu.py:120 ishtar_menu.py:154
-#: ishtar_menu.py:177
+#: ishtar_menu.py:47 ishtar_menu.py:70 ishtar_menu.py:110 ishtar_menu.py:131
+#: ishtar_menu.py:165 ishtar_menu.py:188
msgid "Modification"
msgstr "Modification"
-#: ishtar_menu.py:52 ishtar_menu.py:71 ishtar_menu.py:104 ishtar_menu.py:123
-#: ishtar_menu.py:159 ishtar_menu.py:180
+#: ishtar_menu.py:52 ishtar_menu.py:82 ishtar_menu.py:115 ishtar_menu.py:134
+#: ishtar_menu.py:170 ishtar_menu.py:191
msgid "Deletion"
msgstr "Suppression"
-#: ishtar_menu.py:65
+#: ishtar_menu.py:76
msgid "Manage items"
msgstr "Gestion des éléments"
-#: ishtar_menu.py:109 ishtar_menu.py:165 models_finds.py:1581
+#: ishtar_menu.py:120 ishtar_menu.py:176 models_finds.py:1718
msgid "Administrative act"
msgstr "Acte administratif"
-#: ishtar_menu.py:127 ishtar_menu.py:184 models_finds.py:968
-#: models_treatments.py:155 models_treatments.py:597
+#: ishtar_menu.py:138 ishtar_menu.py:195 models_finds.py:1081
+#: models_treatments.py:163 models_treatments.py:611
msgid "Documents"
msgstr "Documents"
-#: ishtar_menu.py:136 models_treatments.py:162 models_treatments.py:340
+#: ishtar_menu.py:147 models_treatments.py:170 models_treatments.py:351
#: templates/ishtar/sheet_treatment.html:4
msgid "Treatment"
msgstr "Traitement"
-#: ishtar_menu.py:141
+#: ishtar_menu.py:152
msgid "Simple treatments"
msgstr "Traitements simples"
-#: models_finds.py:48
+#: models_finds.py:51
msgid "Code"
msgstr "Code"
-#: models_finds.py:49
+#: models_finds.py:52
msgid "Recommendation"
msgstr "Recommandation"
-#: models_finds.py:63 models_finds.py:87 models_finds.py:135
-#: models_finds.py:158 models_finds.py:215 models_finds.py:854
-#: models_treatments.py:344
+#: models_finds.py:66 models_finds.py:90 models_finds.py:138
+#: models_finds.py:161 models_finds.py:218 models_finds.py:967
+#: models_treatments.py:355
msgid "Order"
msgstr "Ordre"
-#: models_finds.py:66
+#: models_finds.py:69
msgid "Material type quality type"
msgstr "Type de qualité du type de matériaux"
-#: models_finds.py:67
+#: models_finds.py:70
msgid "Material type quality types"
msgstr "Types de qualité du type de matériaux"
-#: models_finds.py:78
+#: models_finds.py:81
msgid "Conservatory states"
msgstr "États sanitaires"
-#: models_finds.py:88
+#: models_finds.py:91
msgid "Parent type"
msgstr "Type parent"
-#: models_finds.py:90
+#: models_finds.py:93
msgid "Virtual"
msgstr "Virtuel"
-#: models_finds.py:92
+#: models_finds.py:95
msgid "Upstream is many"
msgstr "Les éléments amont sont multiples"
-#: models_finds.py:94
+#: models_finds.py:97
msgid "Check this if for this treatment from many finds you'll get one."
msgstr ""
"Cochez cela si, pour ce traitement, à partir de plusieurs éléments vous en "
"obtenez un seul."
-#: models_finds.py:97
+#: models_finds.py:100
msgid "Downstream is many"
msgstr "Les éléments aval sont multiples"
-#: models_finds.py:99
+#: models_finds.py:102
msgid "Check this if for this treatment from one find you'll get many."
msgstr ""
"Cochez cela si, pour ce traitement, à partir d'un seul élément vous en "
"obtenez plusieurs."
-#: models_finds.py:104 models_treatments.py:229
+#: models_finds.py:107 models_treatments.py:240
msgid "Treatment types"
msgstr "Types de traitement"
-#: models_finds.py:114
+#: models_finds.py:117
msgid "Integrity / interest type"
msgstr "Type d'intégrité / intérêt"
-#: models_finds.py:115
+#: models_finds.py:118
msgid "Integrity / interest types"
msgstr "Types d'intégrité / intérêt"
-#: models_finds.py:125
+#: models_finds.py:128
msgid "Remarkability type"
msgstr "Type de remarquabilité"
-#: models_finds.py:126
+#: models_finds.py:129
msgid "Remarkability types"
msgstr "Types de remarquabilité"
-#: models_finds.py:137
+#: models_finds.py:140
msgid "Batch type"
msgstr "Type de lot"
-#: models_finds.py:138
+#: models_finds.py:141
msgid "Batch types"
msgstr "Types de lot"
-#: models_finds.py:161
+#: models_finds.py:164
msgid "Object type quality type"
msgstr "Type de qualité du type d'objet"
-#: models_finds.py:162
+#: models_finds.py:165
msgid "Object type quality types"
msgstr "Types de qualité du type d'objet"
-#: models_finds.py:172
+#: models_finds.py:175
msgid "Alteration type"
msgstr "Type d'altération"
-#: models_finds.py:173
+#: models_finds.py:176
msgid "Alteration types"
msgstr "Types d'altération"
-#: models_finds.py:183
+#: models_finds.py:186
msgid "Alteration cause type"
msgstr "Type de cause d'altération"
-#: models_finds.py:184
+#: models_finds.py:187
msgid "Alteration cause types"
msgstr "Types de cause d'altération"
-#: models_finds.py:194
+#: models_finds.py:197
msgid "Treatment emergency type"
msgstr "Type d'urgence du traitement"
-#: models_finds.py:195
+#: models_finds.py:198
msgid "Treatment emergency types"
msgstr "Types d'urgence du traitement"
-#: models_finds.py:205
+#: models_finds.py:208
msgid "Communicability type"
msgstr "Type de communicabilité"
-#: models_finds.py:206
+#: models_finds.py:209
msgid "Communicability types"
msgstr "Types de communicabilité"
-#: models_finds.py:218
+#: models_finds.py:221
msgid "Checked type"
msgstr "Type de vérification"
-#: models_finds.py:219
+#: models_finds.py:222
msgid "Checked types"
msgstr "Types de vérification"
-#: models_finds.py:251 models_finds.py:847 models_treatments.py:135
-#: models_treatments.py:572
+#: models_finds.py:254 models_finds.py:960 models_treatments.py:143
+#: models_treatments.py:586
msgid "External ID"
msgstr "Identifiant"
-#: models_finds.py:253 models_finds.py:849
+#: models_finds.py:256 models_finds.py:962
msgid "External ID is set automatically"
msgstr "L'identifiant est attribué automatiquement"
-#: models_finds.py:257
+#: models_finds.py:260
msgid "Special interest"
msgstr "Intérêt spécifique"
-#: models_finds.py:261
+#: models_finds.py:264
msgid "Context Record"
msgstr "Unité d'Enregistrement"
-#: models_finds.py:269
+#: models_finds.py:272
msgid "Material index"
msgstr "Index matériel"
-#: models_finds.py:286
+#: models_finds.py:289
msgid "Point (3D)"
msgstr "Point (3D)"
-#: models_finds.py:292 models_finds.py:295
+#: models_finds.py:295 models_finds.py:298
msgid "Cached value - do not edit"
msgstr "Valeur en cache - ne pas éditer"
-#: models_finds.py:304 models_finds.py:845
+#: models_finds.py:308 models_finds.py:958
msgid "Base find"
msgstr "Mobilier d'origine"
-#: models_finds.py:305
+#: models_finds.py:309
msgid "Base finds"
msgstr "Mobilier d'origine"
-#: models_finds.py:549
+#: models_finds.py:565
msgid "g"
msgstr "g"
-#: models_finds.py:550
+#: models_finds.py:566
msgid "kg"
msgstr "kg"
-#: models_finds.py:620 templates/ishtar/sheet_find.html:21
+#: models_finds.py:592 views.py:301
+msgid "Manage basket"
+msgstr "Gérer un panier"
+
+#: models_finds.py:661
msgid "Base find - Short ID"
msgstr "Mobilier d'origine - ID court"
-#: models_finds.py:621 templates/ishtar/sheet_find.html:20
+#: models_finds.py:662
msgid "Base find - Complete ID"
msgstr "Mobilier d'origine - ID complet"
-#: models_finds.py:623
+#: models_finds.py:664
msgid "Operation (code)"
msgstr "Opération (code)"
-#: models_finds.py:625
+#: models_finds.py:666
msgid "Town"
msgstr "Ville"
-#: models_finds.py:627
+#: models_finds.py:668
msgid "Operation (name)"
msgstr "Opération (nom)"
-#: models_finds.py:629
+#: models_finds.py:672
msgid "Parcel"
msgstr "Parcelle"
-#: models_finds.py:630
+#: models_finds.py:673
msgid "Batch"
msgstr "Lot"
-#: models_finds.py:631
+#: models_finds.py:674
msgid "Base find - Comment"
msgstr "Mobilier d'origine - Commentaires"
-#: models_finds.py:632
+#: models_finds.py:675
msgid "Base find - Description"
msgstr "Mobilier d'origine - Description"
-#: models_finds.py:633
+#: models_finds.py:676
msgid "Base find - Topographic localisation"
msgstr "Mobilier d'origine - Localisation topographique"
-#: models_finds.py:635
+#: models_finds.py:678
msgid "Base find - Special interest"
msgstr "Mobilier d'origine - Intérêt spécifique"
-#: models_finds.py:637
+#: models_finds.py:680
msgid "Base find - Discovery date (exact or TPQ)"
msgstr "Mobilier d'origine - Date de découverte (exacte ou TPQ)"
-#: models_finds.py:639
+#: models_finds.py:682
msgid "Base find - Discovery date (TAQ)"
msgstr "Mobilier d'origine - Date de découverte (TAQ)"
-#: models_finds.py:640 models_finds.py:887 models_treatments.py:142
-#: models_treatments.py:352 templates/ishtar/sheet_find.html:231
-#: templates/ishtar/sheet_find.html:269
-msgid "Container"
-msgstr "Contenant"
-
-#: models_finds.py:641
+#: models_finds.py:684
msgid "Periods"
msgstr "Périodes"
-#: models_finds.py:718
+#: models_finds.py:760
msgctxt "key for text search"
msgid "short-id"
msgstr "id-court"
-#: models_finds.py:722
+#: models_finds.py:764
msgctxt "key for text search"
msgid "complete-id"
msgstr "id-complet"
-#: models_finds.py:726
+#: models_finds.py:768
msgctxt "key for text search"
msgid "free-id"
msgstr "id-libre"
-#: models_finds.py:730
+#: models_finds.py:772
msgctxt "key for text search"
msgid "denomination"
msgstr "denomination"
-#: models_finds.py:734
+#: models_finds.py:776
msgctxt "key for text search"
msgid "town"
msgstr "commune"
-#: models_finds.py:738 models_treatments.py:84 models_treatments.py:540
+#: models_finds.py:780 models_treatments.py:87 models_treatments.py:551
msgctxt "key for text search"
msgid "year"
msgstr "annee"
-#: models_finds.py:742
+#: models_finds.py:784
msgctxt "key for text search"
msgid "operation-code"
msgstr "operation-code"
-#: models_finds.py:746
+#: models_finds.py:788
msgctxt "key for text search"
msgid "code-patriarche"
msgstr "code-patriarche"
-#: models_finds.py:750
+#: models_finds.py:792
msgctxt "key for text search"
msgid "operation-type"
msgstr "operation-type"
-#: models_finds.py:755
+#: models_finds.py:797
msgctxt "key for text search"
msgid "area"
msgstr "zone"
-#: models_finds.py:759
+#: models_finds.py:801
msgctxt "key for text search"
msgid "site"
msgstr "site"
-#: models_finds.py:764
+#: models_finds.py:806 models_finds.py:945
msgctxt "key for text search"
msgid "context-record-site"
msgstr "ue-site"
-#: models_finds.py:769
+#: models_finds.py:811 models_finds.py:939
msgctxt "key for text search"
msgid "context-record"
msgstr "ue"
-#: models_finds.py:773
+#: models_finds.py:815
msgctxt "key for text search"
msgid "operation-relation-type"
msgstr "operation-type-relation"
-#: models_finds.py:777
+#: models_finds.py:819
msgctxt "key for text search"
msgid "context-record-relation-type"
msgstr "ue-type-relation"
-#: models_finds.py:781
+#: models_finds.py:823
msgctxt "key for text search"
msgid "period"
msgstr "periode"
-#: models_finds.py:785
+#: models_finds.py:827
msgctxt "key for text search"
msgid "material"
msgstr "materiau"
-#: models_finds.py:789
+#: models_finds.py:831
msgctxt "key for text search"
msgid "object-type"
msgstr "type-objet"
-#: models_finds.py:793
+#: models_finds.py:835
msgctxt "key for text search"
msgid "preservation"
msgstr "preservation"
-#: models_finds.py:797
+#: models_finds.py:839
msgctxt "key for text search"
msgid "conservatory"
msgstr "conservation"
-#: models_finds.py:801
+#: models_finds.py:843
msgctxt "key for text search"
msgid "integrity"
msgstr "integrite"
-#: models_finds.py:805
+#: models_finds.py:847
msgctxt "key for text search"
msgid "remarkability"
msgstr "remarquabilite"
-#: models_finds.py:809
+#: models_finds.py:851
msgctxt "key for text search"
msgid "description"
msgstr "description"
-#: models_finds.py:813
+#: models_finds.py:855
msgctxt "key for text search"
msgid "batch"
msgstr "lot"
-#: models_finds.py:817
+#: models_finds.py:859
msgctxt "key for text search"
msgid "checked"
msgstr "verifie"
-#: models_finds.py:821 models_treatments.py:92
+#: models_finds.py:863 models_treatments.py:95
msgctxt "key for text search"
msgid "has-image"
msgstr "a-une-image"
-#: models_finds.py:825
+#: models_finds.py:867 models_finds.py:942
msgctxt "key for text search"
msgid "location"
msgstr "localisation"
-#: models_finds.py:829
+#: models_finds.py:871
msgctxt "key for text search"
msgid "warehouse"
msgstr "depot"
-#: models_finds.py:833
+#: models_finds.py:875
msgctxt "key for text search"
msgid "container-index"
msgstr "contenant-index"
-#: models_finds.py:837
+#: models_finds.py:879
msgctxt "key for text search"
msgid "container-ref"
msgstr "contenant-ref"
-#: models_finds.py:873
+#: models_finds.py:883
+msgctxt "key for text search"
+msgid "basket"
+msgstr "panier"
+
+#: models_finds.py:887 models_finds.py:936
+msgctxt "key for text search"
+msgid "operation"
+msgstr "operation"
+
+#: models_finds.py:891
+#, fuzzy
+#| msgid "Last modified by"
+msgctxt "key for text search"
+msgid "last-modified-by"
+msgstr "Modifié en dernier par"
+
+#: models_finds.py:895
+msgctxt "key for text search"
+msgid "modified-since"
+msgstr ""
+
+#: models_finds.py:919
+msgid "Bulk update"
+msgstr "Mise à jour en masse"
+
+#: models_finds.py:930 models_finds.py:1179
+#: templates/ishtar/forms/qa_find_treatment.html:16 views.py:666
+msgid "Packaging"
+msgstr "Empaquetage"
+
+#: models_finds.py:986
msgid "Weight"
msgstr "Poids"
-#: models_finds.py:874
+#: models_finds.py:987
msgid "Weight unit"
msgstr "Unité de poids"
-#: models_finds.py:880 templates/ishtar/sheet_find.html:221
+#: models_finds.py:993 templates/ishtar/sheet_find.html:174
msgid "Upstream treatment"
msgstr "Traitement amont"
-#: models_finds.py:883 templates/ishtar/sheet_find.html:259
+#: models_finds.py:996 templates/ishtar/sheet_find.html:212
msgid "Downstream treatment"
msgstr "Traitement aval"
-#: models_finds.py:918
+#: models_finds.py:1031
msgid "Clutter - long side (cm)"
msgstr "Encombrement - grand côté (cm)"
-#: models_finds.py:920
+#: models_finds.py:1033
msgid "Clutter - short side (cm)"
msgstr "Encombrement - petit côté (cm)"
-#: models_finds.py:922
+#: models_finds.py:1035
msgid "Clutter - height (cm)"
msgstr "Encombrement - hauteur (cm)"
-#: models_finds.py:938
+#: models_finds.py:1051
msgid "Collection"
msgstr "Collection"
-#: models_finds.py:970 models_treatments.py:157 models_treatments.py:599
+#: models_finds.py:1083 models_treatments.py:165 models_treatments.py:613
msgid "Cached name"
msgstr "Nom en cache"
-#: models_finds.py:999
+#: models_finds.py:1105
msgid "FIND"
msgstr "MOBILIER"
-#: models_finds.py:1094 wizards.py:70 wizards.py:207
+#: models_finds.py:1173
+#, fuzzy
+#| msgid "Find basket"
+msgid "Add to basket"
+msgstr "Panier de mobilier"
+
+#: models_finds.py:1221 wizards.py:74 wizards.py:219
msgid "Operation"
msgstr "Opération (OA)"
-#: models_finds.py:1406
+#: models_finds.py:1543
msgid "No container have been set - the localisation cannot be set."
-msgstr ""
-"Aucun contenant n'a été défini - la localisation ne peut être définie."
+msgstr "Aucun contenant n'a été défini - la localisation ne peut être définie."
-#: models_finds.py:1412
+#: models_finds.py:1549
msgid "The division number {} have not been set for the warehouse {}."
msgstr ""
"La division numéro {} n'a pas été définie pour le lieu de conservation {}."
-#: models_finds.py:1582
+#: models_finds.py:1719
msgid "Person"
msgstr "Individu"
-#: models_finds.py:1588
+#: models_finds.py:1725
msgid "Property"
msgstr "Propriété"
-#: models_finds.py:1589
+#: models_finds.py:1726
msgid "Properties"
msgstr "Propriétés"
-#: models_treatments.py:41
+#: models_treatments.py:42
msgid "Treatment state type"
msgstr "Type d'état de traitement"
-#: models_treatments.py:42
+#: models_treatments.py:43
msgid "Treatment state types"
msgstr "Types d'état de traitement"
-#: models_treatments.py:65
+#: models_treatments.py:67
msgid "Downstream find"
msgstr "Mobilier aval"
-#: models_treatments.py:76
+#: models_treatments.py:79
msgctxt "key for text search"
msgid "label"
msgstr "libelle"
-#: models_treatments.py:80
+#: models_treatments.py:83
msgctxt "key for text search"
msgid "other-reference"
msgstr "autre-reference"
-#: models_treatments.py:88 models_treatments.py:544
+#: models_treatments.py:91 models_treatments.py:555
msgctxt "key for text search"
msgid "index"
msgstr "index"
-#: models_treatments.py:96 models_treatments.py:548
+#: models_treatments.py:99 models_treatments.py:559
msgctxt "key for text search"
msgid "type"
msgstr "type"
-#: models_treatments.py:127
+#: models_treatments.py:135
msgid "Location where the treatment is done. Target warehouse for a move."
msgstr ""
"Endroit où le traitement est réalisé. Renseignez le lieu de conservation de "
"destination pour un déplacement."
-#: models_treatments.py:144
+#: models_treatments.py:152
msgid "Estimated cost"
msgstr "Coût estimé"
-#: models_treatments.py:146
+#: models_treatments.py:154
msgid "Quoted cost"
msgstr "Coût devisé"
-#: models_treatments.py:148
+#: models_treatments.py:156
msgid "Realized cost"
msgstr "Coût réalisé"
-#: models_treatments.py:150
+#: models_treatments.py:158
msgid "Insurance cost"
msgstr "Coût d'assurance"
-#: models_treatments.py:152
+#: models_treatments.py:160
msgid "Target a basket"
msgstr "Appliquer à un panier"
-#: models_treatments.py:163 templates/ishtar/sheet_find.html:218
+#: models_treatments.py:171 templates/ishtar/sheet_find.html:171
#: templates/ishtar/sheet_treatmentfile.html:61
msgid "Treatments"
msgstr "Traitements"
-#: models_treatments.py:182
+#: models_treatments.py:190
msgid "TREATMENT"
msgstr "TRAITEMENT"
-#: models_treatments.py:238 templates/ishtar/sheet_treatment.html:61
+#: models_treatments.py:249 templates/ishtar/sheet_treatment.html:61
msgid "Downstream finds"
msgstr "Mobilier aval"
-#: models_treatments.py:353 templates/ishtar/sheet_find.html:230
-#: templates/ishtar/sheet_find.html:268
+#: models_treatments.py:364 templates/ishtar/sheet_find.html:183
+#: templates/ishtar/sheet_find.html:221
msgid "Doer"
msgstr "Opérateur"
-#: models_treatments.py:354 models_treatments.py:355
+#: models_treatments.py:365 models_treatments.py:366
msgid "Related finds"
msgstr "Mobilier associé"
-#: models_treatments.py:497
+#: models_treatments.py:508
msgid "Is upstream"
msgstr "Est en amont"
-#: models_treatments.py:509
+#: models_treatments.py:520
msgid "Treatment request types"
msgstr "Types de demande de traitement"
-#: models_treatments.py:532
+#: models_treatments.py:543
msgctxt "key for text search"
msgid "name"
msgstr "nom"
-#: models_treatments.py:536
+#: models_treatments.py:547
msgctxt "key for text search"
msgid "reference"
msgstr "reference"
-#: models_treatments.py:552
+#: models_treatments.py:563
msgctxt "key for text search"
msgid "in-charge"
msgstr "responsable"
-#: models_treatments.py:556
+#: models_treatments.py:567
msgctxt "key for text search"
msgid "applicant"
msgstr "demandeur"
-#: models_treatments.py:560
+#: models_treatments.py:571
msgctxt "key for text search"
msgid "applicant-organisation"
msgstr "demandeur-organisation"
-#: models_treatments.py:570
+#: models_treatments.py:584
msgid "Internal reference"
msgstr "Référence interne"
-#: models_treatments.py:579
+#: models_treatments.py:593
msgid "Person in charge"
msgstr "Personne responsable"
-#: models_treatments.py:605
+#: models_treatments.py:619
msgid "Treatment requests"
msgstr "Demandes de traitement"
-#: templates/ishtar/sheet_find.html:22
-msgid "Find - Administrative ID"
-msgstr "Mobilier - Index administratif"
+#: templates/ishtar/forms/qa_find_basket.html:22
+msgid "New"
+msgstr "Nouveau"
-#: templates/ishtar/sheet_find.html:32
-msgid ""
-"This sheet has a downstream treatment: it is related to an old version of "
-"the find."
-msgstr ""
-"Cette fiche a un traitement aval associé, elle concerne une vieille version "
-"de ce mobilier."
+#: templates/ishtar/forms/qa_find_basket.html:38
+msgid "Add"
+msgstr "Ajout"
-#: templates/ishtar/sheet_find.html:36
-msgid "Associated base finds"
-msgstr "Mobilier d'origine associé"
+#: templates/ishtar/forms/qa_find_treatment.html:31
+msgid "Associate a treatment"
+msgstr "Associer un traitement"
-#: templates/ishtar/sheet_find.html:44
+#: templates/ishtar/sheet_basefind.html:6
msgid "Internal ID"
msgstr "ID interne"
-#: templates/ishtar/sheet_find.html:58
-msgid "Last modified by"
-msgstr "Modifié en dernier par"
-
-#: templates/ishtar/sheet_find.html:70
+#: templates/ishtar/sheet_basefind.html:21
msgid "Discovery date"
msgstr "Date de découverte"
-#: templates/ishtar/sheet_find.html:73
+#: templates/ishtar/sheet_basefind.html:24
msgid "Discovery year"
msgstr "Date de découverte"
-#: templates/ishtar/sheet_find.html:76
+#: templates/ishtar/sheet_basefind.html:27
msgid "Discovery date (TPQ)"
msgstr "Date de découverte (TPQ)"
-#: templates/ishtar/sheet_find.html:100
+#: templates/ishtar/sheet_basefind.html:52
msgid "X:"
msgstr "X :"
-#: templates/ishtar/sheet_find.html:101 templates/ishtar/sheet_find.html:103
-#: templates/ishtar/sheet_find.html:105
+#: templates/ishtar/sheet_basefind.html:53
+#: templates/ishtar/sheet_basefind.html:55
+#: templates/ishtar/sheet_basefind.html:57
msgid "error:"
msgstr "erreur :"
-#: templates/ishtar/sheet_find.html:102
+#: templates/ishtar/sheet_basefind.html:54
msgid "Y:"
msgstr "Y :"
-#: templates/ishtar/sheet_find.html:104
+#: templates/ishtar/sheet_basefind.html:56
msgid "Z:"
msgstr "Z :"
-#: templates/ishtar/sheet_find.html:108
+#: templates/ishtar/sheet_basefind.html:60
msgid "SRID"
msgstr "SRID"
-#: templates/ishtar/sheet_find.html:128
+#: templates/ishtar/sheet_basefind.html:75
+msgid "Last modified by"
+msgstr "Modifié en dernier par"
+
+#: templates/ishtar/sheet_find.html:14
+msgid ""
+"This sheet has a downstream treatment: it is related to an old version of "
+"the find."
+msgstr ""
+"Cette fiche a un traitement aval associé, elle concerne une vieille version "
+"de ce mobilier."
+
+#: templates/ishtar/sheet_find.html:29
+msgid "Associated base finds"
+msgstr "Mobilier d'origine associé"
+
+#: templates/ishtar/sheet_find.html:53
msgid "Administrative index"
msgstr "Index administratif"
-#: templates/ishtar/sheet_find.html:171
+#: templates/ishtar/sheet_find.html:95
msgid "Checked"
msgstr "Vérifié"
-#: templates/ishtar/sheet_find.html:207
+#: templates/ishtar/sheet_find.html:160
msgid "Warehouse"
msgstr "Lieu de conservation"
-#: templates/ishtar/sheet_find.html:225 templates/ishtar/sheet_find.html:263
+#: templates/ishtar/sheet_find.html:178 templates/ishtar/sheet_find.html:216
msgid "Year - index"
msgstr "Année - index"
-#: templates/ishtar/sheet_find.html:229 templates/ishtar/sheet_find.html:267
+#: templates/ishtar/sheet_find.html:182 templates/ishtar/sheet_find.html:220
msgid "Related finds (max. 15 displayed)"
msgstr "Mobilier associé (max. 15 affichés)"
-#: templates/ishtar/sheet_find.html:255
+#: templates/ishtar/sheet_find.html:208
msgid "Export as CSV"
msgstr "Export en CSV"
-#: templates/ishtar/sheet_find.html:255 templates/ishtar/sheet_find.html:294
+#: templates/ishtar/sheet_find.html:208 templates/ishtar/sheet_find.html:247
msgid "CSV"
msgstr "CSV"
-#: templates/ishtar/sheet_find.html:299
+#: templates/ishtar/sheet_find.html:252
msgid "Associated documents"
msgstr "Documents associés"
-#: templates/ishtar/sheet_findbasket.html:4
-msgid "Find basket"
-msgstr "Panier de mobilier"
+#: templates/ishtar/sheet_findbasket.html:19
+#, fuzzy
+#| msgid "Container"
+msgid "Content"
+msgstr "Contenant"
#: templates/ishtar/sheet_treatment.html:25
msgctxt "Treatment"
@@ -1536,86 +1656,91 @@ msgctxt "Treatment request"
msgid "Active"
msgstr "Active"
-#: views.py:144
+#: views.py:132
+#, fuzzy
+#| msgid "Last modified by"
+msgid "Basket modify"
+msgstr "Modifié en dernier par"
+
+#: views.py:173
msgid "New find"
msgstr "Ajouter un mobilier"
-#: views.py:180
+#: views.py:209
msgid "Find modification"
msgstr "Modifier un mobilier"
-#: views.py:209
+#: views.py:238
msgid "Find deletion"
msgstr "Supprimer un mobilier"
-#: views.py:222
+#: views.py:251
msgid "New basket"
msgstr "Ajouter un panier"
-#: views.py:241
+#: views.py:280
msgid "Manage items in basket"
msgstr "Gérer les éléments dans un panier"
-#: views.py:261
-msgid "Manage basket"
-msgstr "Gérer un panier"
-
-#: views.py:352
+#: views.py:389
msgid "Delete basket"
msgstr "Supprimer un panier"
-#: views.py:404
+#: views.py:441
msgid "New treatment"
msgstr "Ajouter un traitement"
-#: views.py:412
+#: views.py:449
msgid "Treatment modification"
msgstr "Modifier un traitement"
-#: views.py:429
+#: views.py:466
msgid "Treatment deletion"
msgstr "Supprimer un traitement"
-#: views.py:436
+#: views.py:473
msgid "Treatment: search administrative act"
msgstr "Traitement : rechercher un acte administratif"
-#: views.py:445
+#: views.py:482
msgid "Treatment: new administrative act"
msgstr "Traitement : ajouter un acte administratif"
-#: views.py:455
+#: views.py:492
msgid "Treatment: administrative act modification"
msgstr "Traitement : modifier un acte administratif"
-#: views.py:464
+#: views.py:501
msgid "Treatment: administrative act deletion"
msgstr "Traitement : supprimer un acte administratif"
-#: views.py:497
+#: views.py:534
msgid "New treatment request"
msgstr "Ajouter une demande de traitement"
-#: views.py:504
+#: views.py:541
msgid "Treatment request modification"
msgstr "Modifier une demande de traitement"
-#: views.py:520
+#: views.py:557
msgid "Treatment request deletion"
msgstr "Supprimer une demande de traitement"
-#: views.py:527
+#: views.py:564
msgid "Treatment request: search administrative act"
msgstr "Demande de traitement : rechercher un acte administratif"
-#: views.py:537
+#: views.py:574
msgid "Treatment request: new administrative act"
msgstr "Demande de traitement : ajouter un acte administratif"
-#: views.py:547
+#: views.py:584
msgid "Treatment request: administrative act modification"
msgstr "Demande de traitement : modifier un acte administratif"
-#: views.py:556
+#: views.py:593
msgid "Treatment request: administrative act deletion"
msgstr "Demande de traitement : supprimer un acte administratif"
+
+#~ msgid "Find - Administrative ID"
+#~ msgstr "Mobilier - Index administratif"
diff --git a/translations/fr/archaeological_operations.po b/translations/fr/archaeological_operations.po
index 9f69d99bf..271cd0f96 100644
--- a/translations/fr/archaeological_operations.po
+++ b/translations/fr/archaeological_operations.po
@@ -8,31 +8,33 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:51+0100\n"
"PO-Revision-Date: 2018-08-15 03:38+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
-#: admin.py:91 models.py:738
+#: admin.py:91 models.py:244 models.py:836
msgid "Point"
msgstr "Point"
-#: admin.py:93 models.py:739
+#: admin.py:93 models.py:245 models.py:837
msgid "Multi polygon"
msgstr "Polygones multi-parties"
-#: forms.py:64 forms.py:1061 forms.py:1077 forms.py:1083 models.py:1786
+#: forms.py:64 forms.py:1061 forms.py:1077 forms.py:1083 models.py:1929
#: templates/ishtar/blocks/window_tables/parcels.html:9
-#: templates/ishtar/sheet_operation.html:235
+#: templates/ishtar/sheet_operation.html:250
msgid "Parcels"
msgstr "Parcelles"
-#: forms.py:67 forms.py:200 forms.py:1036 models.py:1770
+#: forms.py:67 forms.py:200 forms.py:1036 models.py:1913
#: templates/ishtar/blocks/window_tables/parcels.html:6
#: templates/ishtar/dashboards/dashboard_operation.html:432
#: templates/ishtar/dashboards/dashboard_operation.html:446
@@ -41,22 +43,22 @@ msgstr "Parcelles"
msgid "Town"
msgstr "Commune"
-#: forms.py:69 forms.py:480 forms.py:763 forms.py:1386 models.py:636
-#: models.py:1565 models.py:1768
+#: forms.py:69 forms.py:480 forms.py:763 forms.py:1399 models.py:734
+#: models.py:1489 models.py:1694 models.py:1911
#: templates/ishtar/blocks/window_tables/parcels.html:7
msgid "Year"
msgstr "Année"
-#: forms.py:72 models.py:1771
+#: forms.py:72 models.py:1914
#: templates/ishtar/blocks/window_tables/parcels.html:8
msgid "Section"
msgstr "Section"
-#: forms.py:75 models.py:1773
+#: forms.py:75 models.py:1916
msgid "Parcel number"
msgstr "Numéro de parcelle"
-#: forms.py:77 models.py:1775 models.py:1794 models.py:1848
+#: forms.py:77 models.py:1918 models.py:1937 models.py:1998
msgid "Public domain"
msgstr "Domaine public"
@@ -92,9 +94,9 @@ msgstr "Il y a des parcelles identiques."
msgid "Relation type"
msgstr "Type de relation"
-#: forms.py:373 ishtar_menu.py:32 models.py:744 models.py:1273 models.py:1284
-#: models.py:1547 models.py:1767 templates/ishtar/sheet_operation.html:4
-#: wizards.py:320 wizards.py:331
+#: forms.py:373 forms.py:1254 ishtar_menu.py:32 models.py:842 models.py:1394
+#: models.py:1405 models.py:1491 models.py:1676 models.py:1910
+#: templates/ishtar/sheet_operation.html:4 wizards.py:320 wizards.py:331
msgid "Operation"
msgstr "Opération (OA)"
@@ -122,7 +124,7 @@ msgstr "Relations actuelles"
msgid "Deleted relations"
msgstr "Relations supprimées"
-#: forms.py:469 templates/ishtar/sheet_operation.html:154
+#: forms.py:469 templates/ishtar/sheet_operation.html:169
msgid "Relations"
msgstr "Relations"
@@ -130,19 +132,19 @@ msgstr "Relations"
msgid "Operation - 080 - Relations"
msgstr "Opération - 080 - Relations"
-#: forms.py:478 forms.py:1237 forms.py:1383
+#: forms.py:478 forms.py:1237 forms.py:1396
msgid "Full text search"
msgstr "Recherche en texte intégral"
-#: forms.py:481 models.py:637
+#: forms.py:481 models.py:735
msgid "Numeric reference"
msgstr "Identifiant numérique"
-#: forms.py:488 forms.py:1064 forms.py:1398 models.py:1785 models.py:1990
+#: forms.py:488 forms.py:1064 forms.py:1411 models.py:1928 models.py:2140
msgid "Parcel"
msgstr "Parcelle"
-#: forms.py:491 forms.py:1401 models.py:1274
+#: forms.py:491 forms.py:1414 models.py:1395
#: templates/ishtar/dashboards/dashboard_operation.html:390
#: templates/ishtar/dashboards/dashboard_operation.html:411
#: templates/ishtar/dashboards/dashboard_operation.html:643
@@ -151,17 +153,17 @@ msgstr "Parcelle"
msgid "Department"
msgstr "Département"
-#: forms.py:492 forms.py:1148 forms.py:1241 forms.py:1311 models.py:183
+#: forms.py:492 forms.py:1148 forms.py:1241 forms.py:1325 models.py:213
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:7
-#: templates/ishtar/sheet_operation.html:28
+#: templates/ishtar/sheet_operation.html:29
msgid "Name"
msgstr "Nom"
-#: forms.py:493 forms.py:761 models.py:699
+#: forms.py:493 forms.py:761 models.py:797
msgid "Address / Locality"
msgstr "Adresse / Lieu-dit"
-#: forms.py:494 forms.py:678 forms.py:757 models.py:644
+#: forms.py:494 forms.py:678 forms.py:757 models.py:742
msgid "Operation type"
msgstr "Type d'opération"
@@ -169,26 +171,26 @@ msgstr "Type d'opération"
msgid "Is open?"
msgstr "Est ouvert ?"
-#: forms.py:503 forms.py:793 models.py:629
+#: forms.py:503 forms.py:793 models.py:727
msgid "In charge"
msgstr "Responsable du suivi scientifique"
-#: forms.py:510 models.py:1541
+#: forms.py:510 models.py:1670
msgid "Scientist in charge"
msgstr "Responsable scientifique"
-#: forms.py:512 forms.py:680 forms.py:783 models.py:627
+#: forms.py:512 forms.py:680 forms.py:783 models.py:725
msgid "Operator"
msgstr "Opérateur"
-#: forms.py:521 forms.py:1153 forms.py:1243 forms.py:1316 models.py:187
-#: models.py:646
+#: forms.py:521 forms.py:1153 forms.py:1243 forms.py:1330 models.py:217
+#: models.py:744
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:9
msgid "Remains"
msgstr "Vestiges"
-#: forms.py:522 forms.py:1131 forms.py:1150 forms.py:1242 forms.py:1313
-#: models.py:185 models.py:652
+#: forms.py:522 forms.py:1131 forms.py:1150 forms.py:1242 forms.py:1327
+#: models.py:215 models.py:750
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:8
msgid "Periods"
msgstr "Périodes"
@@ -213,8 +215,8 @@ msgstr "Terminé après"
msgid "Search within relations"
msgstr "Rechercher parmi les relations"
-#: forms.py:529 forms.py:841 forms.py:1245 forms.py:1326 models.py:191
-#: models.py:700
+#: forms.py:529 forms.py:841 forms.py:1245 forms.py:1340 models.py:221
+#: models.py:798
msgid "Comment"
msgstr "Commentaire"
@@ -222,35 +224,35 @@ msgstr "Commentaire"
msgid "Abstract (full text search)"
msgstr "Résumé (recherche en texte intégral)"
-#: forms.py:532 forms.py:844 models.py:702
+#: forms.py:532 forms.py:844 models.py:800
msgid "Comment about scientific documentation"
msgstr "Commentaire relatif à la documentation scientifique"
-#: forms.py:533 forms.py:846 models.py:717
+#: forms.py:533 forms.py:846 models.py:815
msgid "Record quality"
msgstr "Qualité d'enregistrement"
-#: forms.py:534 forms.py:812 models.py:664
+#: forms.py:534 forms.py:812 models.py:762
msgid "Report processing"
msgstr "Traitement du rapport"
-#: forms.py:536 forms.py:849 models.py:712
+#: forms.py:536 forms.py:849 models.py:810
msgid "Virtual operation"
msgstr "Opération virtuelle"
-#: forms.py:538 forms.py:1188 forms.py:1192 models.py:220
+#: forms.py:538 forms.py:1188 forms.py:1192 models.py:257
msgid "Archaeological site"
msgstr "Entité (EA)"
-#: forms.py:544 forms.py:1405
+#: forms.py:544 forms.py:1418
msgid "Created by"
msgstr "Créé par"
-#: forms.py:550 forms.py:1411
+#: forms.py:550 forms.py:1424
msgid "Modified by"
msgstr "Modifié par"
-#: forms.py:557 forms.py:834 models.py:724
+#: forms.py:557 forms.py:834 models.py:822
msgid "Documentation received"
msgstr "Documentation reçue"
@@ -262,7 +264,7 @@ msgstr "Date limite de versement de la documentation avant"
msgid "Documentation deadline after"
msgstr "Date limite de versement de la documentation après"
-#: forms.py:563 forms.py:839 models.py:728
+#: forms.py:563 forms.py:839 models.py:826
msgid "Finds received"
msgstr "Mobilier reçu"
@@ -274,7 +276,7 @@ msgstr "Date limite de versement du mobilier avant"
msgid "Finds deadline after"
msgstr "Date limite de versement du mobilier après"
-#: forms.py:595 views.py:180
+#: forms.py:595 views.py:182
msgid "Operation search"
msgstr "Rechercher une opération"
@@ -282,12 +284,12 @@ msgstr "Rechercher une opération"
msgid "Associated file"
msgstr "Dossier associé"
-#: forms.py:643 forms.py:937 models.py:904 models.py:1283 models.py:1552
-#: wizards.py:83
+#: forms.py:643 forms.py:937 models.py:1023 models.py:1404 models.py:1490
+#: models.py:1681 wizards.py:83
msgid "Archaeological file"
msgstr "Dossier archéologique"
-#: forms.py:650 forms.py:654 models.py:719
+#: forms.py:650 forms.py:654 models.py:817
msgid "Abstract"
msgstr "Résumé"
@@ -303,7 +305,7 @@ msgstr "mois"
msgid "years"
msgstr "années"
-#: forms.py:660 models.py:613
+#: forms.py:660 models.py:711
msgid "Creation date"
msgstr "Date de création"
@@ -355,9 +357,9 @@ msgstr "Avec un rapport"
msgid "With finds"
msgstr "Avec du mobilier"
-#: forms.py:737 forms.py:1305 forms.py:1452
+#: forms.py:737 forms.py:1317 forms.py:1465
#: templates/ishtar/sheet_administrativeact.html:23
-#: templates/ishtar/sheet_operation.html:36 templates/ishtar/sheet_site.html:37
+#: templates/ishtar/sheet_operation.html:12 templates/ishtar/sheet_site.html:33
msgid "General"
msgstr "Général"
@@ -365,11 +367,11 @@ msgstr "Général"
msgid "Operation - 010 - General"
msgstr "Opération - 010 - Général"
-#: forms.py:759 models.py:698
+#: forms.py:759 models.py:796
msgid "Generic name"
msgstr "Nom générique"
-#: forms.py:768 models.py:666
+#: forms.py:768 models.py:764
msgid "Old code"
msgstr "Ancien code"
@@ -377,7 +379,7 @@ msgstr "Ancien code"
msgid "Head scientist"
msgstr "Responsable scientifique"
-#: forms.py:790 models.py:697
+#: forms.py:790 models.py:795
msgid "Operator reference"
msgstr "Référence de l'opérateur"
@@ -385,23 +387,23 @@ msgstr "Référence de l'opérateur"
msgid "Total surface (m2)"
msgstr "Surface totale (m2)"
-#: forms.py:807 models.py:56 models.py:616 models.py:1992
+#: forms.py:807 models.py:57 models.py:714 models.py:2142
msgid "Start date"
msgstr "Date de début"
-#: forms.py:808 models.py:618
+#: forms.py:808 models.py:716
msgid "Excavation end date"
msgstr "Date de fin de chantier"
-#: forms.py:810 models.py:619
+#: forms.py:810 models.py:717
msgid "Report delivery date"
msgstr "Date de livraison du rapport"
-#: forms.py:831 models.py:721
+#: forms.py:831 models.py:819
msgid "Deadline for submission of the documentation"
msgstr "Date limite de versement de la documentation"
-#: forms.py:836 models.py:726
+#: forms.py:836 models.py:824
msgid "Deadline for submission of the finds"
msgstr "Date limite de versement du mobilier"
@@ -414,8 +416,7 @@ msgstr ""
#: forms.py:893
msgid "The excavation end date cannot be before the start date."
-msgstr ""
-"La date de fin de chantier ne peut être antérieure à la date de début."
+msgstr "La date de fin de chantier ne peut être antérieure à la date de début."
#: forms.py:923
#, python-format
@@ -430,11 +431,11 @@ msgstr ""
msgid "Bad operation code"
msgstr "Mauvais code d'opération"
-#: forms.py:933 models.py:919
+#: forms.py:933 models.py:1038
msgid "Operation code"
msgstr "Code de l'opération"
-#: forms.py:968 templates/ishtar/sheet_operation.html:134
+#: forms.py:968 templates/ishtar/sheet_operation.html:149
msgid "Court-ordered seizure"
msgstr "Saisie judiciaire"
@@ -442,19 +443,19 @@ msgstr "Saisie judiciaire"
msgid "Operation - 015 - Court-ordered seizure"
msgstr "Opération - 015 - Saisie judiciaire"
-#: forms.py:973 models.py:731
+#: forms.py:973 models.py:829
msgid "Seizure name"
msgstr "Nom de la saisie"
-#: forms.py:976 models.py:732
+#: forms.py:976 models.py:830
msgid "Official report number"
msgstr "Numéro de procès-verbal"
-#: forms.py:979 models.py:734
+#: forms.py:979 models.py:832
msgid "Name of the protagonist"
msgstr "Nom du protagoniste"
-#: forms.py:984 forms.py:991 models.py:633
+#: forms.py:984 forms.py:991 models.py:731
msgid "Collaborators"
msgstr "Collaborateurs"
@@ -470,20 +471,20 @@ msgstr "Information archéologie préventive - fouille"
msgid "Operation - 033 - Preventive - Excavation"
msgstr "Opération - 033 - Préventif - Fouille"
-#: forms.py:1004 models.py:650
+#: forms.py:1004 models.py:748
#: templates/ishtar/dashboards/dashboard_operation.html:701
msgid "Cost (euros)"
msgstr "Coût (euros)"
-#: forms.py:1005 models.py:655
+#: forms.py:1005 models.py:753
msgid "Scheduled man-days"
msgstr "Jours-hommes prévus"
-#: forms.py:1007 models.py:658
+#: forms.py:1007 models.py:756
msgid "Optional man-days"
msgstr "Jours-hommes optionnels"
-#: forms.py:1009 models.py:661
+#: forms.py:1009 models.py:759
msgid "Effective man-days"
msgstr "Jours-hommes effectifs"
@@ -495,20 +496,20 @@ msgstr "Information archéologie préventive - diagnostic"
msgid "Operation - 037 - Preventive - Diagnostic"
msgstr "Opération - 037 - Préventif - Diagnostic"
-#: forms.py:1025 models.py:681
+#: forms.py:1025 models.py:779
msgid "Prescription on zoning"
msgstr "Prescription sur zonage"
-#: forms.py:1027 models.py:684
+#: forms.py:1027 models.py:782
msgid "Prescription on large area"
msgstr "Prescription sur une vaste surface"
-#: forms.py:1030 models.py:686
+#: forms.py:1030 models.py:784
msgid "Prescription on geoarchaeological context"
msgstr "Prescription sur un contexte géoarchéologique"
-#: forms.py:1034 forms.py:1050 forms.py:1055 forms.py:1346 models.py:189
-#: models.py:648 models.py:1575
+#: forms.py:1034 forms.py:1050 forms.py:1055 forms.py:1359 models.py:128
+#: models.py:219 models.py:506 models.py:746 models.py:1704
msgid "Towns"
msgstr "Communes"
@@ -528,7 +529,7 @@ msgstr "Opération - 050 - Parcelles"
msgid "Operation - 050 - Parcels (2)"
msgstr "Opération - 050 - Parcelles (2)"
-#: forms.py:1115 models.py:46
+#: forms.py:1115 models.py:47
msgid "Remain types"
msgstr "Types de vestige"
@@ -536,7 +537,7 @@ msgstr "Types de vestige"
msgid "Operation - 060 - Remains"
msgstr "Opération - 060 - Vestiges"
-#: forms.py:1122 models.py:45
+#: forms.py:1122 models.py:46
msgid "Remain type"
msgstr "Type de vestige"
@@ -544,21 +545,21 @@ msgstr "Type de vestige"
msgid "Operation - 070 - Periods"
msgstr "Opération - 070 - Périodes"
-#: forms.py:1138 templates/ishtar/sheet_operation.html:258
-#: templates/ishtar/sheet_operation.html:295
+#: forms.py:1138 templates/ishtar/sheet_operation.html:273
+#: templates/ishtar/sheet_operation.html:310
msgid "Period"
msgstr "Période"
-#: forms.py:1147 forms.py:1239 forms.py:1310 models.py:182
+#: forms.py:1147 forms.py:1239 forms.py:1324 models.py:212
msgid "Reference"
msgstr "Référence"
-#: forms.py:1171 forms.py:1340
+#: forms.py:1171 forms.py:1353
msgid "This reference already exists."
msgstr "Cette référence existe déjà."
-#: forms.py:1203 models.py:221 models.py:709
-#: templates/ishtar/sheet_operation.html:179
+#: forms.py:1203 models.py:258 models.py:807
+#: templates/ishtar/sheet_operation.html:194
msgid "Archaeological sites"
msgstr "Entités archéologiques"
@@ -582,88 +583,92 @@ msgstr "Voulez-vous clore cette opération ?"
msgid "Would you like to delete this operation?"
msgstr "Voulez-vous supprimer cette opération ?"
-#: forms.py:1248 forms.py:1319 models.py:196
+#: forms.py:1248 models.py:223
+msgid "Top operation"
+msgstr "Opération chapeau"
+
+#: forms.py:1260 forms.py:1333 models.py:226
msgid "National Geographic Institute locality"
msgstr "Lieu-dit IGN"
-#: forms.py:1251 forms.py:1323 models.py:199
+#: forms.py:1263 forms.py:1337 models.py:229
msgid "Cadastral locality"
msgstr "Lieu-dit cadastre"
-#: forms.py:1254 forms.py:1361 models.py:203
+#: forms.py:1266 forms.py:1374 models.py:233
msgid "Shipwreck name"
msgstr "Nom de l'épave"
-#: forms.py:1257 forms.py:1369 models.py:205
+#: forms.py:1269 forms.py:1382 models.py:235
msgid "Oceanographic service localisation"
msgstr "Localisation SHOM"
-#: forms.py:1260 forms.py:1363 models.py:207
+#: forms.py:1272 forms.py:1376 models.py:237
msgid "Shipwreck code"
msgstr "Code épave"
-#: forms.py:1262 forms.py:1365 models.py:209
+#: forms.py:1274 forms.py:1378 models.py:239
msgid "Sinking date"
msgstr "Date de naufrage"
-#: forms.py:1264 forms.py:1367 models.py:211
+#: forms.py:1276 forms.py:1380 models.py:241
msgid "Discovery area"
msgstr "Zone de découverte"
-#: forms.py:1300
+#: forms.py:1312
msgid "You should select an item."
msgstr "Vous devez sélectionner un élément."
-#: forms.py:1306
+#: forms.py:1318
msgid "Archaeological site - 010 - General"
msgstr "Site archéologique - 010 - Général"
-#: forms.py:1347
+#: forms.py:1360
msgid "Archaeological site - 020 - Towns"
msgstr "Site archéologique - 020 - Villes"
-#: forms.py:1356 templates/ishtar/sheet_site.html:56
+#: forms.py:1369 templates/ishtar/sheet_site.html:52
msgid "Underwater"
msgstr "Sous-marin / subaquatique"
-#: forms.py:1357
+#: forms.py:1370
msgid "Archaeological site - 030 - Underwater"
msgstr "Site archéologique - 030 - Sous-marin / subaquatique"
-#: forms.py:1387 forms.py:1521 models.py:1532
+#: forms.py:1400 forms.py:1534 models.py:1661
msgid "Index"
msgstr "Index"
-#: forms.py:1395 forms.py:1455 models.py:1297 models.py:1526
+#: forms.py:1408 forms.py:1468 models.py:1418 models.py:1655
msgid "Act type"
msgstr "Type d'acte"
-#: forms.py:1396 forms.py:1591
+#: forms.py:1409 forms.py:1604
msgid "Indexed?"
msgstr "Indexé ?"
-#: forms.py:1402 forms.py:1460 models.py:1566
+#: forms.py:1415 forms.py:1473 models.py:1695
#: templates/ishtar/blocks/window_tables/administrativacts.html:9
msgid "Object"
msgstr "Objet"
-#: forms.py:1432 views.py:409
+#: forms.py:1445 views.py:412
msgid "Administrative act search"
msgstr "Rechercher un acte administratif"
-#: forms.py:1447 forms.py:1549 forms.py:1616
+#: forms.py:1460 forms.py:1562 forms.py:1629
msgid "You should select an administrative act."
msgstr "Vous devez sélectionner un acte administratif."
-#: forms.py:1463 models.py:1563
+#: forms.py:1476 models.py:1692
msgid "Signature date"
msgstr "Date de signature"
-#: forms.py:1475
+#: forms.py:1488
msgid "Operation - Administrative act - General"
msgstr "Opération - Acte administratif - Général"
-#: forms.py:1509
+#: forms.py:1522
#, python-format
msgid ""
"This index already exists for year: %(year)d - use a value bigger than "
@@ -672,31 +677,31 @@ msgstr ""
"Cet index existe déjà pour l'année : %(year)d, utilisez une valeur plus "
"grande que %(last_val)d"
-#: forms.py:1513
+#: forms.py:1526
msgid "Bad index"
msgstr "Mauvais index"
-#: forms.py:1526
+#: forms.py:1539
msgid "Would you like to delete this administrative act?"
msgstr "Voulez-vous supprimer cet acte administratif ?"
-#: forms.py:1531
+#: forms.py:1544
msgid "Template"
msgstr "Patron"
-#: forms.py:1555 forms.py:1559
+#: forms.py:1568 forms.py:1572
msgid "This document is not intended for this type of act."
msgstr "Ce document n'est pas destiné à ce type d'acte."
-#: forms.py:1577
+#: forms.py:1590
msgid "Doc generation"
msgstr "Génération de document"
-#: forms.py:1579
+#: forms.py:1592
msgid "Generate the associated doc?"
msgstr "Générer le document associé ?"
-#: forms.py:1600 ishtar_menu.py:101 views.py:462
+#: forms.py:1613 ishtar_menu.py:101 views.py:465
msgctxt "admin act register"
msgid "Register"
msgstr "Registre"
@@ -717,12 +722,12 @@ msgstr "Clôture"
msgid "Deletion"
msgstr "Suppression"
-#: ishtar_menu.py:61 models.py:1582
+#: ishtar_menu.py:61 models.py:1711
#: templates/ishtar/sheet_administrativeact.html:4
msgid "Administrative act"
msgstr "Acte administratif"
-#: ishtar_menu.py:87 models.py:214 models.py:704
+#: ishtar_menu.py:87 models.py:249 models.py:802
msgid "Documents"
msgstr "Documents"
@@ -738,694 +743,709 @@ msgstr "Tableau de bord"
msgid "General informations"
msgstr "Informations générales"
-#: ishtar_menu.py:143 models.py:745
+#: ishtar_menu.py:143 models.py:843
#: templates/ishtar/dashboards/dashboard_operation.html:8
-#: templates/ishtar/sheet_site.html:67
+#: templates/ishtar/sheet_site.html:65
msgid "Operations"
msgstr "Opérations"
-#: models.py:55 models.py:75 models.py:88 models.py:2470
+#: models.py:56 models.py:76 models.py:94 models.py:2620
msgid "Order"
msgstr "Ordre"
-#: models.py:57 models.py:1993
+#: models.py:58 models.py:2143
msgid "End date"
msgstr "Date de fin"
-#: models.py:58
+#: models.py:59
msgid "Parent period"
msgstr "Période parente"
-#: models.py:62
+#: models.py:63
msgid "Type Period"
msgstr "Type de période"
-#: models.py:63
+#: models.py:64
msgid "Types Period"
msgstr "Types de période"
-#: models.py:78
+#: models.py:79
msgid "Type of report state"
msgstr "Type d'état de rapport"
-#: models.py:79
+#: models.py:80
msgid "Types of report state"
msgstr "Types d'état de rapport"
-#: models.py:91
+#: models.py:97
msgid "Type of record quality"
msgstr "Type de qualité d'enregistrement"
-#: models.py:92
+#: models.py:98
msgid "Types of record quality"
msgstr "Types de qualité d'enregistrement"
-#: models.py:126
+#: models.py:135
msgctxt "key for text search"
msgid "reference"
msgstr "reference"
-#: models.py:130 models.py:485
+#: models.py:139 models.py:569
msgctxt "key for text search"
msgid "name"
msgstr "nom"
-#: models.py:134 models.py:517 tests.py:1594
+#: models.py:143 models.py:601 tests.py:1607
msgctxt "key for text search"
msgid "period"
msgstr "periode"
-#: models.py:138 models.py:513 tests.py:1625
+#: models.py:147 models.py:597 tests.py:1638
msgctxt "key for text search"
msgid "remain"
msgstr "vestige"
-#: models.py:142 models.py:473 tests.py:1602
+#: models.py:151 models.py:557 tests.py:1615
msgctxt "key for text search"
msgid "town"
msgstr "commune"
-#: models.py:146 models.py:541
+#: models.py:155 models.py:625
msgctxt "key for text search"
msgid "comment"
msgstr "commentaire"
-#: models.py:150
+#: models.py:159
msgctxt "key for text search"
msgid "locality-ngi"
msgstr "lieu-dit-ign"
-#: models.py:154
+#: models.py:163
msgctxt "key for text search"
msgid "locality-cadastral"
msgstr "lieu-dit-cadastre"
-#: models.py:158
+#: models.py:167
msgctxt "key for text search"
msgid "shipwreck-name"
msgstr "nom-epave"
-#: models.py:163
+#: models.py:172
msgctxt "key for text search"
msgid "oceanographic-service-localisation"
msgstr "localisation-shom"
-#: models.py:167
+#: models.py:176
msgctxt "key for text search"
msgid "shipwreck-code"
msgstr "code-epave"
-#: models.py:171
+#: models.py:180
msgctxt "key for text search"
msgid "sinking-date"
msgstr "date-naufrage"
-#: models.py:175
+#: models.py:184
msgctxt "key for text search"
msgid "discovery-area"
msgstr "zone-decouverte"
-#: models.py:193
-msgid "Top operation"
-msgstr "Opération chapeau"
+#: models.py:188 models.py:203
+msgctxt "key for text search"
+msgid "operation"
+msgstr "operation"
-#: models.py:216 models.py:706 models.py:1781
+#: models.py:192
+msgctxt "key for text search"
+msgid "top-operation"
+msgstr "operation-chapeau"
+
+#: models.py:251 models.py:804 models.py:1924
msgid "Cached name"
msgstr "Nom en cache"
-#: models.py:274
+#: models.py:280
+msgid "SITE"
+msgstr "SITE"
+
+#: models.py:345
msgid "Unknown"
msgstr "Inconnu"
-#: models.py:277
+#: models.py:348
msgid "Virtual operation of site: {}"
msgstr "Opération virtuelle du site : {}"
-#: models.py:409
+#: models.py:488
msgid "Associated file (label)"
msgstr "Dossier associé (nom)"
-#: models.py:410
+#: models.py:489
msgid "Operator name"
msgstr "Nom de l'opérateur"
-#: models.py:411
+#: models.py:490
msgid "Scientist (full name)"
msgstr "Responsable scientifique (nom complet)"
-#: models.py:412
+#: models.py:491
msgid "Associated file (external ID)"
msgstr "Dossier associé (identifiant)"
-#: models.py:413
+#: models.py:492
msgid "Scientist (title)"
msgstr "Responsable scientifique (titre)"
-#: models.py:414
+#: models.py:493
msgid "Scientist (surname)"
msgstr "Responsable scientifique (nom)"
-#: models.py:415
+#: models.py:494
msgid "Scientist (name)"
msgstr "Scientifique (nom)"
-#: models.py:416
+#: models.py:495
msgid "Scientist - Organization (name)"
msgstr "Scientifique - Organisation (nom)"
-#: models.py:417
+#: models.py:496
msgid "In charge (title)"
msgstr "Responsable du suivi scientifique (titre)"
-#: models.py:418
+#: models.py:497
msgid "In charge (surname)"
msgstr "Responsable du suivi scientifique (prénom)"
-#: models.py:419
+#: models.py:498
msgid "In charge (name)"
msgstr "Responsable du suivi scientifique (nom)"
-#: models.py:420
+#: models.py:499
msgid "In charge - Organization (name)"
msgstr "Responsable du suivi scientifique - Organisation (nom)"
-#: models.py:425
+#: models.py:504
msgid "Archaeological sites (reference)"
msgstr "Entités archéologiques (référence)"
-#: models.py:461 models.py:1376 tests.py:1597
+#: models.py:545 models.py:1502 tests.py:1610
msgctxt "key for text search"
msgid "year"
msgstr "annee"
-#: models.py:465
+#: models.py:549
msgctxt "key for text search"
msgid "operation-code"
msgstr "code-operation"
-#: models.py:469 models.py:1388
+#: models.py:553 models.py:1514
msgctxt "key for text search"
msgid "patriarche"
msgstr "patriarche"
-#: models.py:477 models.py:1408
+#: models.py:561 models.py:1534
msgctxt "key for text search"
msgid "parcel"
msgstr "parcelle"
-#: models.py:481
+#: models.py:565
msgctxt "key for text search"
msgid "department"
msgstr "departement"
-#: models.py:489
+#: models.py:573
msgctxt "key for text search"
msgid "address"
msgstr "adresse"
-#: models.py:493 models.py:1392
+#: models.py:577 models.py:1518
msgctxt "key for text search"
msgid "type"
msgstr "type"
-#: models.py:497 tests.py:1630
+#: models.py:581 tests.py:1643
msgctxt "key for text search"
msgid "is-open"
msgstr "est-ouvert"
-#: models.py:501
+#: models.py:585
msgctxt "key for text search"
msgid "in-charge"
msgstr "responsable-suivi"
-#: models.py:505
+#: models.py:589
msgctxt "key for text search"
msgid "scientist"
msgstr "scientifique"
-#: models.py:509
+#: models.py:593
msgctxt "key for text search"
msgid "operator"
msgstr "operateur"
-#: models.py:521
+#: models.py:605
msgctxt "key for text search"
msgid "start-before"
msgstr "commence-avant"
-#: models.py:525
+#: models.py:609
msgctxt "key for text search"
msgid "start-after"
msgstr "commence-apres"
-#: models.py:529
+#: models.py:613
msgctxt "key for text search"
msgid "end-before"
msgstr "fini-apres"
-#: models.py:533
+#: models.py:617
msgctxt "key for text search"
msgid "end-after"
msgstr "fini-avant"
-#: models.py:537
+#: models.py:621
msgctxt "key for text search"
msgid "relation-types"
msgstr "type-relation"
-#: models.py:545
+#: models.py:629
msgctxt "key for text search"
msgid "abstract"
msgstr "resume"
-#: models.py:550
+#: models.py:634
msgctxt "key for text search"
msgid "scientific-documentation-comment"
msgstr "commentaire-documentation-scientifique"
-#: models.py:554
+#: models.py:638
msgctxt "key for text search"
msgid "record-quality"
msgstr "qualite-enregistrement"
-#: models.py:559
+#: models.py:643
msgctxt "key for text search"
msgid "report-processing"
msgstr "traitement-rapport"
-#: models.py:564
+#: models.py:648
msgctxt "key for text search"
msgid "virtual-operation"
msgstr "operation-virtuelle"
-#: models.py:569
+#: models.py:653 models.py:696
msgctxt "key for text search"
msgid "site"
msgstr "site"
-#: models.py:573 models.py:1426
+#: models.py:657 models.py:1552
msgctxt "key for text search"
msgid "created-by"
msgstr "cree-par"
-#: models.py:577 models.py:1430
+#: models.py:661 models.py:1556
msgctxt "key for text search"
msgid "modified-by"
msgstr "modifie-par"
-#: models.py:581
+#: models.py:665
msgctxt "key for text search"
msgid "documentation-received"
msgstr "documentation-recue"
-#: models.py:585
+#: models.py:669
msgctxt "key for text search"
msgid "documentation-deadline-before"
msgstr "documentation-date-limite-avant"
-#: models.py:589
+#: models.py:673
msgctxt "key for text search"
msgid "documentation-deadline-after"
msgstr "documentation-date-limite-après"
-#: models.py:593
+#: models.py:677
msgctxt "key for text search"
msgid "finds-received"
msgstr "mobilier-recu"
-#: models.py:597
+#: models.py:681
msgctxt "key for text search"
msgid "finds-deadline-before"
msgstr "mobilier-date-limite-avant"
-#: models.py:601
+#: models.py:685
msgctxt "key for text search"
msgid "finds-deadline-after"
msgstr "mobilier-date-limite-apres"
-#: models.py:615 templates/ishtar/sheet_operation.html:57
+#: models.py:698
+msgctxt "key for text search"
+msgid "file"
+msgstr "dossier"
+
+#: models.py:713 templates/ishtar/sheet_operation.html:60
msgid "Closing date"
msgstr "Date de clôture"
-#: models.py:622
+#: models.py:720
msgid "In charge scientist"
msgstr "Responsable du suivi scientifique"
-#: models.py:641 models.py:1763
+#: models.py:739 models.py:1906
msgid "File"
msgstr "Dossier"
-#: models.py:645
+#: models.py:743
msgid "Surface (m2)"
msgstr "Surface (m2)"
-#: models.py:714
+#: models.py:812
msgid ""
"If checked, it means that this operation have not been officialy registered."
msgstr ""
"Si coché, cela signifie que cette opération n'a pas été officiellement "
"enregistrée."
-#: models.py:790
+#: models.py:891
msgid "OPE"
msgstr "OPE"
-#: models.py:869
+#: models.py:988
msgid "Intercommunal"
msgstr "Intercommunal"
-#: models.py:905
+#: models.py:1024
msgid "Code patriarche"
msgstr "Code patriarche"
-#: models.py:945
+#: models.py:1066
msgid "This operation code already exists for this year"
msgstr "Ce code d'opération existe déjà pour cette année."
-#: models.py:990
+#: models.py:1111
msgid "Number of parcels"
msgstr "Nombre de parcelles"
-#: models.py:1000
+#: models.py:1121
msgid "Number of administrative acts"
msgstr "Nombre d'actes administratifs"
-#: models.py:1008
+#: models.py:1129
msgid "Number of indexed administrative acts"
msgstr "Nombre d'actes administratifs indexés"
-#: models.py:1016
+#: models.py:1137
msgid "Number of context records"
msgstr "Nombre d'Unités d'Enregistrement"
-#: models.py:1052
+#: models.py:1173
msgid "Number of finds"
msgstr "Nombre d'éléments de mobilier"
-#: models.py:1097
+#: models.py:1218
msgid "No type"
msgstr "Pas de type"
-#: models.py:1128
+#: models.py:1249
msgid "Number of sources"
msgstr "Nombre de documents"
-#: models.py:1166 templates/ishtar/dashboards/dashboard_operation.html:309
+#: models.py:1287 templates/ishtar/dashboards/dashboard_operation.html:309
#: templates/ishtar/dashboards/dashboard_operation.html:575
#: templates/ishtar/dashboards/dashboard_operation.html:611
msgid "Mean"
msgstr "Moyenne"
-#: models.py:1228
+#: models.py:1349
msgid "Operation relation type"
msgstr "Type de relation entre opérations"
-#: models.py:1229
+#: models.py:1350
msgid "Operation relation types"
msgstr "Types de relation entre opérations"
-#: models.py:1242
+#: models.py:1363
msgid "Operation record relation"
msgstr "Relation entre opérations"
-#: models.py:1243
+#: models.py:1364
msgid "Operation record relations"
msgstr "Relations entre opérations"
-#: models.py:1285 models.py:1557
+#: models.py:1406 models.py:1686
msgid "Treatment request"
msgstr "Demande de traitement"
-#: models.py:1286 models.py:1562
+#: models.py:1407 models.py:1691
msgid "Treatment"
msgstr "Traitement"
-#: models.py:1288
+#: models.py:1409
msgid "Intended to"
msgstr "Destiné à"
-#: models.py:1290
+#: models.py:1411
msgid "Code"
msgstr "Code"
-#: models.py:1293
+#: models.py:1414
msgid "Associated template"
msgstr "Patron associé"
-#: models.py:1294
+#: models.py:1415
msgid "Indexed"
msgstr "Indexé"
-#: models.py:1298
+#: models.py:1419
msgid "Act types"
msgstr "Types d'acte"
-#: models.py:1366 models.py:1603
+#: models.py:1489 models.py:1732
#: templates/ishtar/blocks/window_tables/administrativacts.html:6
#: templates/ishtar/blocks/window_tables/archaeologicalsites.html:6
msgid "Ref."
msgstr "Réf."
-#: models.py:1380
+#: models.py:1506
msgctxt "key for text search"
msgid "index"
msgstr "index"
-#: models.py:1384
+#: models.py:1510
msgctxt "key for text search"
msgid "other-ref"
msgstr "autre-ref"
-#: models.py:1396
+#: models.py:1522
msgctxt "key for text search"
msgid "indexed"
msgstr "indexe"
-#: models.py:1400
+#: models.py:1526
msgctxt "key for text search"
msgid "operation-town"
msgstr "operation-commune"
-#: models.py:1404
+#: models.py:1530
msgctxt "key for text search"
msgid "file-town"
msgstr "dossier-commune"
-#: models.py:1414
+#: models.py:1540
msgctxt "key for text search"
msgid "operation-department"
msgstr "operation-departement"
-#: models.py:1418
+#: models.py:1544
msgctxt "key for text search"
msgid "file-department"
msgstr "dossier-departement"
-#: models.py:1422
+#: models.py:1548
msgctxt "key for text search"
msgid "object"
msgstr "objet"
-#: models.py:1434
+#: models.py:1560
msgctxt "key for text search"
msgid "signature-before"
msgstr "signature-avant"
-#: models.py:1438
+#: models.py:1564
msgctxt "key for text search"
msgid "signature-after"
msgstr "signature-apres"
-#: models.py:1442
+#: models.py:1568
msgctxt "key for text search"
msgid "file-name"
msgstr "dossier-nom"
-#: models.py:1446
+#: models.py:1572
msgctxt "key for text search"
msgid "general-contractor"
msgstr "amenageur"
-#: models.py:1451
+#: models.py:1577
msgctxt "key for text search"
msgid "general-contractor-organization"
msgstr "amenageur-organisation"
-#: models.py:1456
+#: models.py:1582
msgctxt "key for text search"
msgid "file-reference"
msgstr "dossier-reference"
-#: models.py:1460
+#: models.py:1586
msgctxt "key for text search"
msgid "file-year"
msgstr "dossier-annee"
-#: models.py:1464
+#: models.py:1590
msgctxt "key for text search"
msgid "file-other-reference"
msgstr "dossier-autre-reference"
-#: models.py:1468
+#: models.py:1594
msgctxt "key for text search"
msgid "file-in-charge"
msgstr "dossier-responsable"
-#: models.py:1472
+#: models.py:1598
msgctxt "key for text search"
msgid "file-permit-reference"
msgstr "dossier-ref-permis"
-#: models.py:1476
+#: models.py:1602
msgctxt "key for text search"
msgid "treatment-name"
msgstr "traitement-nom"
-#: models.py:1480
+#: models.py:1606
msgctxt "key for text search"
msgid "treatment-reference"
msgstr "traitement-reference"
-#: models.py:1484
+#: models.py:1610
msgctxt "key for text search"
msgid "treatment-year"
msgstr "traitement-annee"
-#: models.py:1488
+#: models.py:1614
msgctxt "key for text search"
msgid "treatment-index"
msgstr "traitement-index"
-#: models.py:1492
+#: models.py:1618
msgctxt "key for text search"
msgid "treatment-type"
msgstr "traitement-type"
-#: models.py:1496
+#: models.py:1622
msgctxt "key for text search"
msgid "treatment-file-name"
msgstr "dossier-traitement-nom"
-#: models.py:1500
+#: models.py:1626
msgctxt "key for text search"
msgid "treatment-file-reference"
msgstr "dossier-traitement-reference"
-#: models.py:1504
+#: models.py:1630
msgctxt "key for text search"
msgid "treatment-file-year"
msgstr "dossier-traitement-annee"
-#: models.py:1508
+#: models.py:1634
msgctxt "key for text search"
msgid "treatment-file-index"
msgstr "dossier-traitement-index"
-#: models.py:1512
+#: models.py:1638
msgctxt "key for text search"
msgid "treatment-file-type"
msgstr "dossier-traitement-type"
-#: models.py:1530
+#: models.py:1659
msgid "Person in charge of the operation"
msgstr "Responsable d'opération"
-#: models.py:1536
+#: models.py:1665
msgid "Archaeological preventive operator"
msgstr "Opérateur d'archéologie préventive"
-#: models.py:1544
+#: models.py:1673
msgid "Signatory"
msgstr "Signataire"
-#: models.py:1572
+#: models.py:1701
msgid "Departments"
msgstr "Départements"
-#: models.py:1573
+#: models.py:1702
msgid "Cached values get from associated departments"
msgstr "Valeur en cache des départements associés"
-#: models.py:1576
+#: models.py:1705
msgid "Cached values get from associated towns"
msgstr "Valeur en cache des communes associées"
-#: models.py:1583 templates/ishtar/sheet_operation.html:187
-#: templates/ishtar/sheet_operation.html:229
+#: models.py:1712 templates/ishtar/sheet_operation.html:202
+#: templates/ishtar/sheet_operation.html:244
msgid "Administrative acts"
msgstr "Actes administratifs"
-#: models.py:1706
+#: models.py:1835
msgid "This index already exists for this year"
msgstr "Cet index existe déjà pour cette année."
-#: models.py:1776
+#: models.py:1919
msgid "External ID"
msgstr "Identifiant"
-#: models.py:1779
+#: models.py:1922
msgid "External ID is set automatically"
msgstr "L'identifiant est attribué automatiquement"
-#: models.py:1780
+#: models.py:1923
msgid "Address - Locality"
msgstr "Adresse - Lieu-dit"
-#: models.py:1988
+#: models.py:2138
msgid "Owner"
msgstr "Propriétaire"
-#: models.py:1996
+#: models.py:2146
msgid "Parcel owner"
msgstr "Propriétaire de parcelle"
-#: models.py:1997
+#: models.py:2147
msgid "Parcel owners"
msgstr "Propriétaires de parcelle"
-#: models.py:2031
+#: models.py:2181
msgid "Recorded"
msgstr "Enregistré"
-#: models.py:2032
+#: models.py:2182
msgid "Effective"
msgstr "Effectif"
-#: models.py:2033
+#: models.py:2183
msgid "Active"
msgstr "Actif"
-#: models.py:2034
+#: models.py:2184
msgid "Field completed"
msgstr "Terrain achevé"
-#: models.py:2035
+#: models.py:2185
msgid "Associated report"
msgstr "Rapport associé"
-#: models.py:2036
+#: models.py:2186
msgid "Closed"
msgstr "Clos"
-#: models.py:2037
+#: models.py:2187
msgid "Documented and closed"
msgstr "Documenté et clos"
-#: models.py:2471
+#: models.py:2621
msgid "Is preventive"
msgstr "Préventif"
-#: models.py:2474
+#: models.py:2624
msgid "Operation type old"
msgstr "Type d'opération - ancien"
-#: models.py:2475
+#: models.py:2625
msgid "Operation types old"
msgstr "Types d'opération - ancien"
#: templates/ishtar/blocks/window_tables/administrativacts.html:7
-#: templates/ishtar/sheet_operation.html:248
-#: templates/ishtar/sheet_operation.html:312
+#: templates/ishtar/sheet_operation.html:263
+#: templates/ishtar/sheet_operation.html:327
msgid "Type"
msgstr "Type"
@@ -1469,12 +1489,12 @@ msgstr "État"
#: templates/ishtar/dashboards/dashboard_operation.html:432
#: templates/ishtar/dashboards/dashboard_operation.html:463
#: templates/ishtar/dashboards/dashboard_operation.html:687
-#: templates/ishtar/sheet_operation.html:248
-#: templates/ishtar/sheet_operation.html:258
-#: templates/ishtar/sheet_operation.html:275
-#: templates/ishtar/sheet_operation.html:285
-#: templates/ishtar/sheet_operation.html:295
-#: templates/ishtar/sheet_operation.html:312
+#: templates/ishtar/sheet_operation.html:263
+#: templates/ishtar/sheet_operation.html:273
+#: templates/ishtar/sheet_operation.html:290
+#: templates/ishtar/sheet_operation.html:300
+#: templates/ishtar/sheet_operation.html:310
+#: templates/ishtar/sheet_operation.html:327
msgid "Number"
msgstr "Nombre"
@@ -1500,7 +1520,7 @@ msgstr "par types"
#: templates/ishtar/dashboards/dashboard_operation.html:479
#: templates/ishtar/dashboards/dashboard_operation.html:499
#: templates/ishtar/dashboards/dashboard_operation.html:623
-#: templates/ishtar/sheet_operation.html:49
+#: templates/ishtar/sheet_operation.html:52
msgid "State"
msgstr "État"
@@ -1665,7 +1685,7 @@ msgid "area by organization by realisation year"
msgstr "surface par organisation et par année de réalisation"
#: templates/ishtar/dashboards/dashboard_operation.html:670
-#: templates/ishtar/sheet_operation.html:74
+#: templates/ishtar/sheet_operation.html:77
msgid "Cost"
msgstr "Coût"
@@ -1678,107 +1698,111 @@ msgid "main towns by cost"
msgstr "communes principales par coût"
#: templates/ishtar/sheet_administrativeact.html:40
-#: templates/ishtar/sheet_operation.html:66
+#: templates/ishtar/sheet_operation.html:69
msgid "Surface"
msgstr "Surface"
-#: templates/ishtar/sheet_operation.html:29
+#: templates/ishtar/sheet_operation.html:30
msgid "Address"
msgstr "Adresse"
-#: templates/ishtar/sheet_operation.html:41
+#: templates/ishtar/sheet_operation.html:37
msgid "Begining date"
msgstr "Date de début"
-#: templates/ishtar/sheet_operation.html:51
+#: templates/ishtar/sheet_operation.html:54
msgid "Active file"
msgstr "Dossier actif"
-#: templates/ishtar/sheet_operation.html:52
+#: templates/ishtar/sheet_operation.html:55
msgid "Closed operation"
msgstr "Opération close"
-#: templates/ishtar/sheet_operation.html:59
+#: templates/ishtar/sheet_operation.html:62
msgid "by"
msgstr "par"
-#: templates/ishtar/sheet_operation.html:82
+#: templates/ishtar/sheet_operation.html:85
msgid "Duration"
msgstr "Durée"
-#: templates/ishtar/sheet_operation.html:84
+#: templates/ishtar/sheet_operation.html:87
msgid "days"
msgstr "jours"
-#: templates/ishtar/sheet_operation.html:123
+#: templates/ishtar/sheet_operation.html:129
+msgid "Sheet"
+msgstr "Fiche"
+
+#: templates/ishtar/sheet_operation.html:138
msgid "This operation is virtual."
msgstr "Cette opération est virtuelle."
-#: templates/ishtar/sheet_operation.html:129
+#: templates/ishtar/sheet_operation.html:144
msgid "Patriarche OA code not yet recorded!"
msgstr "Code d'opération Patriarche non renseigné !"
-#: templates/ishtar/sheet_operation.html:144
-#: templates/ishtar/sheet_site.html:47
+#: templates/ishtar/sheet_operation.html:159
+#: templates/ishtar/sheet_site.html:43
msgid "Localisation"
msgstr "Localisation"
-#: templates/ishtar/sheet_operation.html:183
+#: templates/ishtar/sheet_operation.html:198
msgid "Associated parcels"
msgstr "Parcelles associées"
-#: templates/ishtar/sheet_operation.html:191
+#: templates/ishtar/sheet_operation.html:206
msgid "Document from this operation"
msgstr "Documents de cette opération"
-#: templates/ishtar/sheet_operation.html:197
-#: templates/ishtar/sheet_operation.html:240
+#: templates/ishtar/sheet_operation.html:212
+#: templates/ishtar/sheet_operation.html:255
msgid "Context records"
msgstr "Unités d'Enregistrement"
-#: templates/ishtar/sheet_operation.html:202
+#: templates/ishtar/sheet_operation.html:217
msgid "Context record relations"
msgstr "Relations entre Unités d'Enregistrement"
-#: templates/ishtar/sheet_operation.html:207
+#: templates/ishtar/sheet_operation.html:222
msgid "Documents from associated context records"
msgstr "Documents des Unités d'Enregistrement associées"
-#: templates/ishtar/sheet_operation.html:212
-#: templates/ishtar/sheet_operation.html:267
-#: templates/ishtar/sheet_site.html:72
+#: templates/ishtar/sheet_operation.html:227
+#: templates/ishtar/sheet_operation.html:282
+#: templates/ishtar/sheet_site.html:70
msgid "Finds"
msgstr "Mobilier"
-#: templates/ishtar/sheet_operation.html:217
+#: templates/ishtar/sheet_operation.html:232
msgid "Documents from associated finds"
msgstr "Documents du mobilier associé"
-#: templates/ishtar/sheet_operation.html:222
+#: templates/ishtar/sheet_operation.html:237
msgid "Associated containers"
msgstr "Contenants associés"
-#: templates/ishtar/sheet_operation.html:226
+#: templates/ishtar/sheet_operation.html:241
msgid "Statistics"
msgstr "Statistiques"
-#: templates/ishtar/sheet_operation.html:227
+#: templates/ishtar/sheet_operation.html:242
msgid "These numbers are updated hourly"
msgstr "Ces chiffres sont mis à jour toutes les heures"
-#: templates/ishtar/sheet_operation.html:275
+#: templates/ishtar/sheet_operation.html:290
msgid "Material type"
msgstr "Type de matériau"
-#: templates/ishtar/sheet_operation.html:285
+#: templates/ishtar/sheet_operation.html:300
msgid "Object type"
msgstr "Type d'objet"
-#: templates/ishtar/sheet_operation.html:304
+#: templates/ishtar/sheet_operation.html:319
msgid "Sources"
msgstr "Documents"
-#: templates/ishtar/sheet_operation.html:322
+#: templates/ishtar/sheet_operation.html:337
msgid "Finds by context records"
msgstr "Mobilier par Unités d'Enregistrement"
@@ -1801,43 +1825,51 @@ msgstr ""
"Le(s) erreur(s) suivante(s) ont été rencontrées lors de l'analyse du fichier "
"source :"
-#: views.py:242
+#: views.py:244
msgid "New operation"
msgstr "Ajouter une opération"
-#: views.py:291
+#: views.py:293
msgid "Operation modification"
msgstr "Modifier une opération"
-#: views.py:302
+#: views.py:304
msgid "You don't have sufficient permissions to do this action."
msgstr ""
"Vous n'avez pas les permissions suffisantes pour effectuer cette action."
-#: views.py:327
+#: views.py:329
msgid "Operation closing"
msgstr "Clôturer une opération"
-#: views.py:338
+#: views.py:340
msgid "Operation deletion"
msgstr "Supprimer une opération"
-#: views.py:403
+#: views.py:406
msgid "Site deletion"
msgstr "Suppression du site"
-#: views.py:422
+#: views.py:425
msgid "Operation: new administrative act"
msgstr "Opération : ajouter un acte administratif"
-#: views.py:432
+#: views.py:435
msgid "Operation: administrative act modification"
msgstr "Opération : modification d'un acte administratif"
-#: views.py:456
+#: views.py:459
msgid "Operation: administrative act deletion"
msgstr "Opération : supprimer un acte administratif"
+#: views.py:552
+msgid ""
+"Syntax error on the source template \"{}\" - contact your administrator and "
+"ask him to check the syntax of this document."
+msgstr ""
+"Erreur de syntaxe sur le patron source \"{}\" - contacter votre "
+"administrateur et demandez lui de vérifier la syntaxe de ce document."
+
#: widgets.py:59
msgid "Add"
msgstr "Ajouter"
diff --git a/translations/fr/archaeological_warehouse.po b/translations/fr/archaeological_warehouse.po
index 187347a0d..ed0e73683 100644
--- a/translations/fr/archaeological_warehouse.po
+++ b/translations/fr/archaeological_warehouse.po
@@ -8,26 +8,28 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:52+0100\n"
"PO-Revision-Date: 2018-08-15 03:31+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
-#: forms.py:41 forms.py:113 ishtar_menu.py:40 models.py:88 models.py:230
+#: forms.py:41 forms.py:113 ishtar_menu.py:40 models.py:94 models.py:258
#: templates/ishtar/sheet_warehouse.html:4
msgid "Warehouse"
msgstr "Lieu de conservation"
-#: forms.py:50 forms.py:55 models.py:576
+#: forms.py:50 forms.py:55 models.py:622
msgid "Division"
msgstr "Division"
-#: forms.py:57 models.py:256
+#: forms.py:57 models.py:286
msgid "Order"
msgstr "Ordre"
@@ -35,7 +37,7 @@ msgstr "Ordre"
msgid "There are identical divisions."
msgstr "Il y a des divisions identiques"
-#: forms.py:76 models.py:77
+#: forms.py:76 models.py:83
msgid "Divisions"
msgstr "Divisions"
@@ -47,15 +49,15 @@ msgstr "Lieu de conservation - 020 - Divisions"
msgid "Full text search"
msgstr "Recherche en texte intégral"
-#: forms.py:88 forms.py:119 models.py:69 models.py:227
+#: forms.py:88 forms.py:119 models.py:75 models.py:255
msgid "Name"
msgstr "Nom"
-#: forms.py:89 forms.py:121 models.py:38 models.py:71
+#: forms.py:89 forms.py:121 models.py:39 models.py:77
msgid "Warehouse type"
msgstr "Type de lieu de conservation"
-#: forms.py:101 views.py:97
+#: forms.py:101 views.py:108
msgid "Warehouse search"
msgstr "Rechercher un lieu de conservation"
@@ -63,11 +65,11 @@ msgstr "Rechercher un lieu de conservation"
msgid "Warehouse - 010 - General"
msgstr "Lieu de conservation - 010 - Général"
-#: forms.py:124 models.py:74
+#: forms.py:124 models.py:80
msgid "Person in charge"
msgstr "Responsable"
-#: forms.py:130 forms.py:198 models.py:75 models.py:344
+#: forms.py:130 forms.py:198 models.py:81 models.py:381
msgid "Comment"
msgstr "Commentaire"
@@ -103,7 +105,7 @@ msgstr "Téléphone mobile"
msgid "Would you like to delete this warehouse?"
msgstr "Voulez-vous supprimer ce lieu de conservation?"
-#: forms.py:172 models.py:358 models.py:573
+#: forms.py:172 models.py:395 models.py:619
#: templates/ishtar/sheet_container.html:4
msgid "Container"
msgstr "Contenant"
@@ -112,23 +114,23 @@ msgstr "Contenant"
msgid "Container - 010 - General"
msgstr "Contenant - 010 - Général"
-#: forms.py:179 forms.py:260 models.py:271
+#: forms.py:179 forms.py:261 models.py:301
msgid "Ref."
msgstr "Réf."
-#: forms.py:180 models.py:352
+#: forms.py:180 models.py:389
msgid "Old reference"
msgstr "Ancienne référence"
-#: forms.py:182 forms.py:259 models.py:274 models.py:342
+#: forms.py:182 forms.py:260 models.py:304 models.py:379
msgid "Container type"
msgstr "Type de contenant"
-#: forms.py:184 forms.py:257
+#: forms.py:184 forms.py:258
msgid "Current location (warehouse)"
msgstr "Localisation actuelle (lieu de conservation)"
-#: forms.py:190 forms.py:258 models.py:339
+#: forms.py:190 forms.py:259 models.py:376
msgid "Responsible warehouse"
msgstr "Lieu de conservation responsable"
@@ -144,43 +146,43 @@ msgstr "Identifiant"
msgid "This ID already exists for this warehouse."
msgstr "Cet identifiant existe déjà pour ce lieu de conservation."
-#: forms.py:271 forms.py:277 views.py:139
+#: forms.py:272 forms.py:278 views.py:150
msgid "Container search"
msgstr "Rechercher un contenant"
-#: forms.py:273 forms.py:279
+#: forms.py:274 forms.py:280
msgid "You should select a container."
msgstr "Vous devez sélectionner un contenant."
-#: forms.py:274
+#: forms.py:275
msgid "Add a new container"
msgstr "Ajouter un nouveau contenant"
-#: forms.py:284 ishtar_menu.py:36 views.py:92
+#: forms.py:285 ishtar_menu.py:36 views.py:103
msgid "Packaging"
msgstr "Conditionnement"
-#: forms.py:290
+#: forms.py:291
msgid "Packager"
msgstr "Personne assurant le conditionnement"
-#: forms.py:296
+#: forms.py:297
msgid "Date"
msgstr "Date"
-#: forms.py:300
+#: forms.py:301
msgid "Packaged finds"
msgstr "Mobilier conditionné"
-#: forms.py:304
+#: forms.py:305
msgid "Container - 020 - Localisation"
msgstr "Contenant - 020 - Localisation"
-#: forms.py:306 models.py:345
+#: forms.py:307 models.py:382
msgid "Localisation"
msgstr "Localisation"
-#: forms.py:330 forms.py:331
+#: forms.py:331 forms.py:332
msgid "Would you like to delete this container?"
msgstr "Voulez-vous supprimer ce contenant ?"
@@ -192,141 +194,141 @@ msgstr "Traitement"
msgid "Search"
msgstr "Recherche"
-#: ishtar_menu.py:47 ishtar_menu.py:62
+#: ishtar_menu.py:47 ishtar_menu.py:63
msgid "Creation"
msgstr "Ajout"
-#: ishtar_menu.py:50 ishtar_menu.py:65
+#: ishtar_menu.py:50 ishtar_menu.py:67
msgid "Modification"
msgstr "Modification"
-#: ishtar_menu.py:53 ishtar_menu.py:68
+#: ishtar_menu.py:53 ishtar_menu.py:71
msgid "Deletion"
msgstr "Suppression"
-#: ishtar_menu.py:57 models.py:359 templates/ishtar/sheet_warehouse.html:37
-#: templates/ishtar/sheet_warehouse.html:68
+#: ishtar_menu.py:57 models.py:396 templates/ishtar/sheet_warehouse.html:42
+#: templates/ishtar/sheet_warehouse.html:87
msgid "Containers"
msgstr "Contenants"
-#: models.py:39
+#: models.py:40
msgid "Warehouse types"
msgstr "Types de lieu de conservation"
-#: models.py:58
+#: models.py:60
msgctxt "key for text search"
msgid "name"
msgstr "nom"
-#: models.py:62 models.py:323
+#: models.py:64 models.py:356
msgctxt "key for text search"
msgid "type"
msgstr "type"
-#: models.py:81
+#: models.py:87
msgid "Documents"
msgstr "Documents"
-#: models.py:83 models.py:353
+#: models.py:89 models.py:390
msgid "External ID"
msgstr "Identifiant"
-#: models.py:85 models.py:355
+#: models.py:91 models.py:392
msgid "External ID is set automatically"
msgstr "L'identifiant est attribué automatiquement"
-#: models.py:89
+#: models.py:95
msgid "Warehouses"
msgstr "Lieux de conservation"
-#: models.py:229
+#: models.py:257
msgid "Description"
msgstr "Description"
-#: models.py:234 models.py:235
+#: models.py:262 models.py:263
msgid "Collection"
msgstr "Collection"
-#: models.py:244
+#: models.py:272
msgid "Warehouse division type"
msgstr "Type de division de lieu de conservation"
-#: models.py:245
+#: models.py:273
msgid "Warehouse division types"
msgstr "Types de division de lieu de conservation"
-#: models.py:267
+#: models.py:297
msgid "Length (mm)"
msgstr "Longueur (mm)"
-#: models.py:268
+#: models.py:298
msgid "Width (mm)"
msgstr "Largeur (mm)"
-#: models.py:269
+#: models.py:299
msgid "Height (mm)"
msgstr "Hauteur (mm)"
-#: models.py:270
+#: models.py:300
msgid "Volume (l)"
msgstr "Volume (l)"
-#: models.py:275
+#: models.py:305
msgid "Container types"
msgstr "Types de contenant"
-#: models.py:306
+#: models.py:339
msgid "Location - index"
msgstr "Localisation - index"
-#: models.py:307
+#: models.py:340
msgid "Precise localisation"
msgstr "Localisation précise"
-#: models.py:308
+#: models.py:341
msgid "Type"
msgstr "Type"
-#: models.py:315
+#: models.py:348
msgctxt "key for text search"
msgid "location"
msgstr "localisation"
-#: models.py:319
+#: models.py:352
msgctxt "key for text search"
msgid "responsible-warehouse"
msgstr "depot"
-#: models.py:327
+#: models.py:360
msgctxt "key for text search"
msgid "reference"
msgstr "reference"
-#: models.py:336
+#: models.py:373
msgid "Location (warehouse)"
msgstr "Localisation (lieu de conservation)"
-#: models.py:343
+#: models.py:380
msgid "Container ref."
msgstr "Réf. du contenant"
-#: models.py:347
+#: models.py:384
msgid "Cached location"
msgstr "Localisation - en cache"
-#: models.py:349
+#: models.py:386
msgid "Cached division"
msgstr "Division mise en cache"
-#: models.py:577
+#: models.py:623
msgid "Reference"
msgstr "Référence"
-#: models.py:580
+#: models.py:626
msgid "Container localisation"
msgstr "Localisation de contenant"
-#: models.py:581
+#: models.py:627
msgid "Container localisations"
msgstr "Localisations de contenant"
@@ -334,39 +336,44 @@ msgstr "Localisations de contenant"
msgid "Content"
msgstr "Contenu"
-#: templates/ishtar/sheet_warehouse.html:42
+#: templates/ishtar/sheet_warehouse.html:47
msgid "Attached containers"
msgstr "Contenants associés"
-#: templates/ishtar/sheet_warehouse.html:46
+#: templates/ishtar/sheet_warehouse.html:51
msgid "Statistics"
msgstr "Statistiques"
-#: templates/ishtar/sheet_warehouse.html:47
+#: templates/ishtar/sheet_warehouse.html:52
msgid "These numbers are updated hourly"
msgstr "Ces chiffres sont mis à jour toutes les heures"
-#: templates/ishtar/sheet_warehouse.html:49
+#: templates/ishtar/sheet_warehouse.html:54
msgid "Finds"
msgstr "Mobilier"
-#: templates/ishtar/sheet_warehouse.html:51
+#: templates/ishtar/sheet_warehouse.html:56
msgid "Number of attached finds"
msgstr "Nombre de mobilier rattaché"
-#: templates/ishtar/sheet_warehouse.html:53
+#: templates/ishtar/sheet_warehouse.html:58
msgid "Number of hosted finds"
msgstr "Nombre de mobilier accueilli"
-#: templates/ishtar/sheet_warehouse.html:58
+#: templates/ishtar/sheet_warehouse.html:63
msgid "Finds by location in the warehouse"
msgstr "Mobilier par localisation dans le lieu de conservation"
-#: templates/ishtar/sheet_warehouse.html:70
+#: templates/ishtar/sheet_warehouse.html:71
+#: templates/ishtar/sheet_warehouse.html:102
+msgid "Total"
+msgstr "Total"
+
+#: templates/ishtar/sheet_warehouse.html:89
msgid "Number of containers"
msgstr "Nombre de contenants"
-#: templates/ishtar/sheet_warehouse.html:75
+#: templates/ishtar/sheet_warehouse.html:94
msgid "Containers by location in the warehouse"
msgstr "Contenants par localisation dans le lieu de conservation"
@@ -386,26 +393,26 @@ msgstr ""
"Des contenants localisés sont associés à ce lieu de conservation. Vous ne "
"pouvez pas modifier les divisions."
-#: views.py:109
+#: views.py:120
msgid "Warehouse creation"
msgstr "Ajouter un lieu de conservation"
-#: views.py:118
+#: views.py:129
msgid "Warehouse modification"
msgstr "Modifier un lieu de conservation"
-#: views.py:134
+#: views.py:145
msgid "Warehouse deletion"
msgstr "Supprimer un lieu de conservation"
-#: views.py:150
+#: views.py:161
msgid "Container creation"
msgstr "Ajouter un contenant"
-#: views.py:159
+#: views.py:170
msgid "Container modification"
msgstr "Modifier un contenant"
-#: views.py:174
+#: views.py:185
msgid "Container deletion"
msgstr "Supprimer un contenant"
diff --git a/translations/fr/ishtar_common.po b/translations/fr/ishtar_common.po
index 15d532bfe..15fbe66e9 100644
--- a/translations/fr/ishtar_common.po
+++ b/translations/fr/ishtar_common.po
@@ -9,13 +9,15 @@
# Étienne Loks <etienne.loks@iggdrasil.net>, 2018. #zanata
msgid ""
msgstr ""
-"MIME-Version: 1.0\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2018-10-31 21:51+0100\n"
"PO-Revision-Date: 2018-08-15 02:15+0000\n"
"Last-Translator: Étienne Loks <etienne.loks@iggdrasil.net>\n"
"Language-Team: \n"
"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n>1;\n"
"X-Generator: Zanata 4.6.0\n"
@@ -31,116 +33,118 @@ msgstr "courriel"
msgid "Related item"
msgstr "Élément associé"
-#: admin.py:73
+#: admin.py:74
msgid "CSV file"
msgstr "Fichier CSV"
-#: admin.py:74
+#: admin.py:75
msgid "Only unicode encoding is managed - convert your file first"
msgstr "Seul l'unicode est géré - convertissez votre fichier d'abord"
-#: admin.py:98
+#: admin.py:99
msgid "Export selected as CSV file"
msgstr "Exporter la sélection en fichier CSV"
-#: admin.py:206 models.py:1588 templates/navbar.html:31
+#: admin.py:207 models.py:1686 templates/navbar.html:31
msgid "Profile"
msgstr "Profil"
-#: admin.py:207 forms_common.py:778 forms_common.py:798 forms_common.py:799
-#: models.py:2783
+#: admin.py:208 forms_common.py:782 forms_common.py:801 forms_common.py:802
+#: models.py:3039
msgid "Profiles"
msgstr "Profils"
-#: admin.py:229 admin.py:248 models.py:801 models.py:3724
+#: admin.py:293
+#, fuzzy
+#| msgid "The CSV file should at least have a slug/txt_idx column"
+msgid "The CSV file should at least have a {} column"
+msgstr "Le fichier CSV doit avoir au minimum une colonne slug/txt_idx"
+
+#: admin.py:360
+#, python-format
+msgid "%d item(s) created."
+msgstr "%d élément(s) créés."
+
+#: admin.py:364
+#, python-format
+msgid "%d item(s) updated."
+msgstr "%d élément(s) mis à jour."
+
+#: admin.py:368
+msgid "These parents are missing: {}"
+msgstr "Ces parents sont manquants : {}"
+
+#: admin.py:386 admin.py:405 models.py:883 models.py:4138
msgid "Parent"
msgstr "Parent"
-#: admin.py:236
+#: admin.py:393
msgid "Center"
msgstr "Centre"
-#: admin.py:238 models.py:3604
+#: admin.py:395 models.py:4000
msgid "Limit"
msgstr "Limite"
-#: admin.py:241 models.py:3614
+#: admin.py:398 models.py:4010
msgid "Town children"
msgstr "Communes enfants"
-#: admin.py:249
+#: admin.py:406
msgid "Parents"
msgstr "Parents"
-#: admin.py:397
-msgid "The CSV file should at least have a slug/txt_idx column"
-msgstr "Le fichier CSV doit avoir au minimum une colonne slug/txt_idx"
-
-#: admin.py:454
-#, python-format
-msgid "%d item(s) created."
-msgstr "%d élément(s) créés."
-
-#: admin.py:458
-#, python-format
-msgid "%d item(s) updated."
-msgstr "%d élément(s) mis à jour."
-
-#: admin.py:462
-msgid "These parents are missing: {}"
-msgstr "Ces parents sont manquants : {}"
-
-#: admin.py:559
+#: admin.py:623
msgid "{} importer type(s) duplicated: {}."
msgstr "{} type(s) d''importeur dupliqué(s) : {}."
-#: admin.py:570 admin.py:625
+#: admin.py:634 admin.py:689
msgid "Duplicate"
msgstr "Dupliquer"
-#: admin.py:614
+#: admin.py:678
msgid "{} importer column(s) duplicated: {}."
msgstr "{} colonne(s) dupliquée(s) : {}."
-#: admin.py:639
+#: admin.py:703
msgid "{} importer column(s) right-shifted."
msgstr "{} colonne(s) décalée(s) à droite."
-#: admin.py:650
+#: admin.py:714
msgid "Shift right"
msgstr "Décaler à droite"
-#: admin.py:675
+#: admin.py:739
msgid "{} importer column(s) left-shifted."
msgstr "{} colonne(s) décalée(s) à gauche."
-#: admin.py:681
+#: admin.py:745
msgid "{} importer column(s) not left-shifted: no place available."
msgstr ""
"{} colonne(s) n''ont pas été décalée(s) à gauche : pas de place disponible."
-#: admin.py:693
+#: admin.py:757
msgid "Shift left"
msgstr "Décaler à gauche"
-#: admin.py:838
+#: admin.py:903
msgid "Display selected"
msgstr "Afficher les éléments sélectionnés"
-#: admin.py:839
+#: admin.py:904
msgid "Hide selected"
msgstr "Cacher les éléments sélectionnés"
-#: admin.py:865 models.py:1861
+#: admin.py:931 models.py:2080
msgid "Form"
msgstr "Formulaire"
-#: admin.py:867 models.py:1886 models_imports.py:126
+#: admin.py:933 models.py:2105 models_imports.py:127
#: templates/ishtar/dashboards/dashboard_main.html:39
msgid "Users"
msgstr "Utilisateurs"
-#: admin.py:887 models.py:1961
+#: admin.py:953 models.py:2180
msgid "Field"
msgstr "Champ"
@@ -239,7 +243,7 @@ msgstr ""
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:730 views.py:1113
+#: data_importer.py:730 views.py:1159
msgid "No data provided"
msgstr "Aucune donnée fournie"
@@ -272,7 +276,7 @@ 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:1236 views.py:1191 views.py:1201
+#: data_importer.py:1236 views.py:1237 views.py:1247
msgid "Not imported"
msgstr "Non importé"
@@ -335,45 +339,55 @@ msgstr "résultat"
msgid "\"%(value)s\" not in %(values)s"
msgstr "\"%(value)s\" n'est pas dans %(values)s"
-#: forms.py:79
+#: forms.py:80
msgid "Enter a valid name consisting of letters, spaces and hyphens."
msgstr "Entrez un nom correct composé de lettres, espaces et tirets."
-#: forms.py:95 forms_common.py:805
+#: forms.py:96 forms_common.py:808 views.py:1950
msgid "Confirm"
msgstr "Confirmer"
-#: forms.py:100
+#: forms.py:101
msgid "Are you sure you want to delete?"
msgstr "Êtes-vous sûr de vouloir supprimer ?"
-#: forms.py:317
+#: forms.py:347
msgid "There are identical items."
msgstr "Il y a des éléments identiques."
-#: forms.py:491 forms.py:492
+#: forms.py:518
+msgid "Last modified by"
+msgstr ""
+
+#: forms.py:524
+#, fuzzy
+#| msgid "Modified"
+msgid "Modified since"
+msgstr "Modifié"
+
+#: forms.py:548 forms.py:549
msgid "Closing date"
msgstr "Date de clôture"
-#: forms.py:504 forms_common.py:1232
+#: forms.py:561 forms_common.py:1261
msgid "You should select an item."
msgstr "Vous devez sélectionner un élément."
-#: forms.py:505
+#: forms.py:562
msgid "Add a new item"
msgstr "Ajouter un nouvel élément"
-#: forms.py:621 models.py:2215
+#: forms.py:752 models.py:2434
msgid "Template"
msgstr "Patron"
-#: forms_common.py:50 forms_common.py:68 forms_common.py:313
-#: forms_common.py:552 models.py:2346 models.py:3621
+#: forms_common.py:54 forms_common.py:72 forms_common.py:317
+#: forms_common.py:556 models.py:2568 models.py:4017
#: templates/blocks/JQueryAdvancedTown.html:19
msgid "Town"
msgstr "Commune"
-#: forms_common.py:52
+#: forms_common.py:56
msgid ""
"<p>Type name, department code of the town you would like to select. The "
"search is insensitive to case.</p>\n"
@@ -390,17 +404,17 @@ 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:77 forms_common.py:1253 ishtar_menu.py:48 models.py:2702
-#: models.py:2937 models.py:3047 models.py:3168
+#: forms_common.py:81 forms_common.py:1282 ishtar_menu.py:48 models.py:2952
+#: models.py:3201 models.py:3329 models.py:3492
#: templates/ishtar/sheet_person.html:4
msgid "Person"
msgstr "Personne"
-#: forms_common.py:118
+#: forms_common.py:122
msgid "Associated images (web link to a zip file)"
msgstr "Images associées (lien web vers un fichier zip)"
-#: forms_common.py:153
+#: forms_common.py:157
msgid ""
"This import type have no unicity type defined. Conservative import is not "
"possible."
@@ -408,56 +422,56 @@ msgstr ""
"Cet import n'a pas de clé d'unicité paramétrée. L'import conservateur n'est "
"pas possible."
-#: forms_common.py:158
+#: forms_common.py:162
msgid "You put either a file or a download link for images but not both."
msgstr ""
"Vous devez soit déposer un fichier soit renseigner un lien pour les images "
"mais pas les deux."
-#: forms_common.py:169
+#: forms_common.py:173
msgid "Invalid link or no file is available for this link."
msgstr "Lien invalide ou aucun fichier n'est disponible sur ce lien."
-#: forms_common.py:199
+#: forms_common.py:203
msgid "Target"
msgstr "Cible"
-#: forms_common.py:200
+#: forms_common.py:204
msgid "Remember"
msgstr "Enregistrer"
-#: forms_common.py:218
+#: forms_common.py:222
msgid "Set to NULL"
msgstr "Mettre à la valeur NULL"
-#: forms_common.py:225
+#: forms_common.py:229
msgid "this import only"
msgstr "cet import seulement"
-#: forms_common.py:226
+#: forms_common.py:230
msgid "me"
msgstr "moi"
-#: forms_common.py:232
+#: forms_common.py:236
msgid "the current group: {}"
msgstr "le groupe actuel {}"
-#: forms_common.py:235
+#: forms_common.py:239
msgid "all users"
msgstr "tous les utilisateurs"
-#: forms_common.py:301 forms_common.py:471 forms_common.py:605
-#: ishtar_menu.py:76 models.py:2542 models.py:2644
+#: forms_common.py:305 forms_common.py:475 forms_common.py:609
+#: ishtar_menu.py:76 models.py:2773 models.py:2890 models.py:3289
#: templates/ishtar/sheet_organization.html:4
msgid "Organization"
msgstr "Organisation"
-#: forms_common.py:304 forms_common.py:347 forms_common.py:466
-#: forms_common.py:522 forms_common.py:600 forms_common.py:787
-#: forms_common.py:820 models.py:974 models.py:997 models.py:1685
-#: models.py:1860 models.py:2211 models.py:2534 models.py:2686 models.py:2930
-#: models.py:3600 models.py:3833 models_imports.py:97 models_imports.py:122
-#: models_imports.py:431 models_imports.py:523 models_imports.py:812
+#: forms_common.py:308 forms_common.py:351 forms_common.py:470
+#: forms_common.py:526 forms_common.py:604 forms_common.py:790
+#: forms_common.py:823 models.py:1056 models.py:1080 models.py:1879
+#: models.py:2079 models.py:2430 models.py:2765 models.py:2936 models.py:3192
+#: models.py:3996 models.py:4259 models_imports.py:98 models_imports.py:123
+#: models_imports.py:445 models_imports.py:537 models_imports.py:827
#: templates/ishtar/import_step_by_step.html:102
#: templates/ishtar/import_step_by_step.html:270
#: templates/ishtar/import_table.html:27
@@ -465,236 +479,236 @@ msgstr "Organisation"
msgid "Name"
msgstr "Nom"
-#: forms_common.py:305 models.py:2499 models_imports.py:616
-#: models_imports.py:617
+#: forms_common.py:309 models.py:2721 models_imports.py:630
+#: models_imports.py:631
msgid "Organization type"
msgstr "Type d'organisation"
-#: forms_common.py:307 forms_common.py:546 models.py:2341
-#: templates/ishtar/blocks/sheet_address_section.html:3
+#: forms_common.py:311 forms_common.py:550 models.py:2563
+#: templates/ishtar/blocks/sheet_address_section.html:4
msgid "Address"
msgstr "Adresse"
-#: forms_common.py:309 forms_common.py:549 models.py:2342
+#: forms_common.py:313 forms_common.py:553 models.py:2564
msgid "Address complement"
msgstr "Complément d'adresse"
-#: forms_common.py:311 forms_common.py:550 models.py:2344
+#: forms_common.py:315 forms_common.py:554 models.py:2566
msgid "Postal code"
msgstr "Code postal"
-#: forms_common.py:314 forms_common.py:553 models.py:2347
+#: forms_common.py:318 forms_common.py:557 models.py:2569
msgid "Country"
msgstr "Pays"
-#: forms_common.py:316 forms_common.py:468 forms_common.py:526
-#: forms_common.py:602 forms_common.py:727 models.py:2374
+#: forms_common.py:320 forms_common.py:472 forms_common.py:530
+#: forms_common.py:606 forms_common.py:731 models.py:2596
msgid "Email"
msgstr "Courriel"
-#: forms_common.py:317 forms_common.py:529 models.py:2359
+#: forms_common.py:321 forms_common.py:533 models.py:2581
#: templates/ishtar/sheet_person.html:27
#: templates/ishtar/wizard/wizard_person.html:33
msgid "Phone"
msgstr "Téléphone"
-#: forms_common.py:318 forms_common.py:538 models.py:2371
+#: forms_common.py:322 forms_common.py:542 models.py:2593
#: templates/ishtar/sheet_person.html:45
#: templates/ishtar/wizard/wizard_person.html:54
msgid "Mobile phone"
msgstr "Téléphone portable"
-#: forms_common.py:344 forms_common.py:463 forms_common.py:596
-#: forms_common.py:1190
+#: forms_common.py:348 forms_common.py:467 forms_common.py:600
+#: forms_common.py:1196
msgid "Full text search"
msgstr "Recherche en texte intégral"
-#: forms_common.py:348 forms_common.py:469 forms_common.py:603
-#: forms_common.py:784 models.py:1006 models.py:2536 models.py:3343
-#: models_imports.py:665 templates/ishtar/blocks/window_image_detail.html:24
+#: forms_common.py:352 forms_common.py:473 forms_common.py:607
+#: forms_common.py:788 models.py:1089 models.py:2767 models.py:3735
+#: models_imports.py:680 templates/ishtar/blocks/window_image_detail.html:24
#: templates/ishtar/blocks/window_tables/documents.html:8
#: templates/ishtar/import_table.html:28
#: templates/ishtar/sheet_organization.html:25
msgid "Type"
msgstr "Type"
-#: forms_common.py:358 views.py:141
+#: forms_common.py:362 views.py:142
msgid "Organization search"
msgstr "Rechercher une organisation"
-#: forms_common.py:382
+#: forms_common.py:386
msgid "At least two items have to be selected."
msgstr "Au moins deux éléments doivent être sélectionnés."
-#: forms_common.py:400
+#: forms_common.py:404
msgid "Merge all items into"
msgstr "Fusionner tous les éléments dans"
-#: forms_common.py:434
+#: forms_common.py:438
msgid "Organization to merge"
msgstr "Organisation à fusionner"
-#: forms_common.py:467 forms_common.py:520 forms_common.py:601 models.py:2684
+#: forms_common.py:471 forms_common.py:524 forms_common.py:605 models.py:2934
#: templates/ishtar/sheet_organization.html:24
msgid "Surname"
msgstr "Prénom"
-#: forms_common.py:484 forms_common.py:581 views.py:106
+#: forms_common.py:488 forms_common.py:585 views.py:107
msgid "Person search"
msgstr "Rechercher une personne"
-#: forms_common.py:497
+#: forms_common.py:501
msgid "Person to merge"
msgstr "Personne à fusionner"
-#: forms_common.py:514 templates/ishtar/wizard/wizard_person.html:19
+#: forms_common.py:518 templates/ishtar/wizard/wizard_person.html:19
msgid "Identity"
msgstr "Identité"
-#: forms_common.py:517 forms_common.py:1081 forms_common.py:1200 models.py:2678
-#: models.py:2680 models.py:3334 models_imports.py:618
+#: forms_common.py:521 forms_common.py:1084 forms_common.py:1206 models.py:2928
+#: models.py:2930 models.py:3726 models_imports.py:632
#: templates/ishtar/blocks/window_tables/documents.html:7
msgid "Title"
msgstr "Titre"
-#: forms_common.py:518 models.py:2682
+#: forms_common.py:522 models.py:2932
msgid "Salutation"
msgstr "Formule d'appel"
-#: forms_common.py:524 models.py:2688
+#: forms_common.py:528 models.py:2938
msgid "Raw name"
msgstr "Nom brut"
-#: forms_common.py:527 models.py:2360
+#: forms_common.py:531 models.py:2582
msgid "Phone description"
msgstr "Type de téléphone"
-#: forms_common.py:530 models.py:2362 models.py:2364
+#: forms_common.py:534 models.py:2584 models.py:2586
msgid "Phone description 2"
msgstr "Type de téléphone 2"
-#: forms_common.py:532
+#: forms_common.py:536
msgid "Phone 2"
msgstr "Téléphone 2"
-#: forms_common.py:534 models.py:2368
+#: forms_common.py:538 models.py:2590
msgid "Phone description 3"
msgstr "Type de téléphone 3"
-#: forms_common.py:536 models.py:2366
+#: forms_common.py:540 models.py:2588
msgid "Phone 3"
msgstr "Téléphone 3"
-#: forms_common.py:541
+#: forms_common.py:545
msgid "Current organization"
msgstr "Organisation actuelle"
-#: forms_common.py:555 models.py:2349
+#: forms_common.py:559 models.py:2571
msgid "Other address: address"
msgstr "Autre adresse : adresse"
-#: forms_common.py:558 models.py:2352
+#: forms_common.py:562 models.py:2574
msgid "Other address: address complement"
msgstr "Autre adresse : complément d'adresse"
-#: forms_common.py:560 models.py:2353
+#: forms_common.py:564 models.py:2575
msgid "Other address: postal code"
msgstr "Autre adresse : code postal"
-#: forms_common.py:562 models.py:2355
+#: forms_common.py:566 models.py:2577
msgid "Other address: town"
msgstr "Autre adresse : ville"
-#: forms_common.py:564 models.py:2357
+#: forms_common.py:568 models.py:2579
msgid "Other address: country"
msgstr "Autre adresse : pays"
-#: forms_common.py:576
+#: forms_common.py:580
msgid "Already has an account"
msgstr "A déjà un compte"
-#: forms_common.py:599
+#: forms_common.py:603 models.py:3290
msgid "Username"
msgstr "Nom d'utilisateur"
-#: forms_common.py:618
+#: forms_common.py:622
msgid "Account search"
msgstr "Rechercher un compte"
-#: forms_common.py:665 forms_common.py:705 forms_common.py:709 models.py:2596
+#: forms_common.py:669 forms_common.py:709 forms_common.py:713 models.py:2829
msgid "Person type"
msgstr "Type de personne"
-#: forms_common.py:721 forms_common.py:726 ishtar_menu.py:33
+#: forms_common.py:725 forms_common.py:730 ishtar_menu.py:33
msgid "Account"
msgstr "Compte"
-#: forms_common.py:730 wizards.py:1601
+#: forms_common.py:734 wizards.py:1624
msgid "New password"
msgstr "Nouveau mot de passe"
-#: forms_common.py:733
+#: forms_common.py:737
msgid "New password (confirmation)"
msgstr "Nouveau mot de passe (confirmation)"
-#: forms_common.py:760
+#: forms_common.py:764
msgid "Your password and confirmation password do not match."
msgstr "La vérification du mot de passe a échoué."
-#: forms_common.py:765
+#: forms_common.py:769
msgid "You must provide a correct password."
msgstr "Vous devez fournir un mot de passe correct."
-#: forms_common.py:773
+#: forms_common.py:777
msgid "This username already exists."
msgstr "Ce nom d'utilisateur existe déjà."
-#: forms_common.py:786 models.py:2933 models.py:3731
+#: forms_common.py:789 models.py:3195 models.py:4145
msgid "Areas"
msgstr "Zones"
-#: forms_common.py:806
+#: forms_common.py:809
msgid "Send the new password by email?"
msgstr "Envoyer le nouveau mot de passe par courriel ?"
-#: forms_common.py:818 models.py:2935 views.py:905
+#: forms_common.py:821 models.py:3197 views.py:950
msgid "Current profile"
msgstr "Profil actuel"
-#: forms_common.py:821 models.py:2920 models.py:2932
+#: forms_common.py:824 models.py:3175 models.py:3194
msgid "Profile type"
msgstr "Type de profil"
-#: forms_common.py:824
+#: forms_common.py:827
msgid "Duplicate this profile"
msgstr "Dupliquer ce profil"
-#: forms_common.py:826
+#: forms_common.py:829
msgid "Delete this profile"
msgstr "Supprimer ce profil"
-#: forms_common.py:875
+#: forms_common.py:878
msgid "A profile with the same name exists."
msgstr "Un profil avec un nom identique existe"
-#: forms_common.py:907
+#: forms_common.py:910
msgid " (duplicate)"
msgstr "(copie)"
-#: forms_common.py:918 forms_common.py:932 forms_common.py:933 models.py:3622
-#: models.py:3721
+#: forms_common.py:921 forms_common.py:935 forms_common.py:936 models.py:4018
+#: models.py:4133
msgid "Towns"
msgstr "Communes"
-#: forms_common.py:928
+#: forms_common.py:931
msgid "There are identical towns."
msgstr "Il y a des communes identiques."
-#: forms_common.py:1015
+#: forms_common.py:1018
msgid "Only one choice can be checked."
msgstr "Seul un choix peut être coché."
-#: forms_common.py:1062
+#: forms_common.py:1065
#, python-format
msgid ""
"<p>Heavy images are resized to: %(width)dx%(height)d (ratio is preserved).</"
@@ -703,168 +717,180 @@ msgstr ""
"<p>Les images trop grandes sont retaillées en : %(width)dx%(height)d (le "
"ratio est conservé).</p>"
-#: forms_common.py:1074
+#: forms_common.py:1077
msgid "Documentation"
msgstr "Documentation"
-#: forms_common.py:1075
+#: forms_common.py:1078
msgid "Document - General"
msgstr "Document - Général"
-#: forms_common.py:1084 forms_common.py:1201 models.py:3212
-#: models_imports.py:619
+#: forms_common.py:1087 forms_common.py:1207 models.py:3540
+#: models_imports.py:633
msgid "Source type"
msgstr "Type de document"
-#: forms_common.py:1087 forms_common.py:1138 forms_common.py:1293
-#: forms_common.py:1294 models.py:3176 models.py:3353
+#: forms_common.py:1090 forms_common.py:1141 forms_common.py:1322
+#: forms_common.py:1323 models.py:3501 models.py:3609 models.py:3745
#: templates/ishtar/blocks/window_image_detail.html:9
#: templates/ishtar/blocks/window_tables/documents.html:9
msgid "Authors"
msgstr "Auteurs"
-#: forms_common.py:1091 models.py:3359
+#: forms_common.py:1094 models.py:3751
msgid "Numerical ressource (web address)"
msgstr "Ressource numérique (adresse web)"
-#: forms_common.py:1093
+#: forms_common.py:1096
msgid "Image"
msgstr "Image"
-#: forms_common.py:1096 templates/ishtar/sheet_document.html:28
+#: forms_common.py:1099 templates/ishtar/sheet_document.html:28
msgctxt "Not directory"
msgid "File"
msgstr "Fichier"
-#: forms_common.py:1099 forms_common.py:1202
+#: forms_common.py:1102 forms_common.py:1208 models.py:4135
msgid "Reference"
msgstr "Référence"
-#: forms_common.py:1102 forms_common.py:1203
+#: forms_common.py:1105 forms_common.py:1209
msgid "Internal reference"
msgstr "Référence interne"
-#: forms_common.py:1104 models.py:3361
+#: forms_common.py:1107 models.py:3753
#: templates/ishtar/blocks/window_image_detail.html:150
msgid "Receipt date"
msgstr "Date de réception"
-#: forms_common.py:1106 models.py:3363 models_imports.py:844
+#: forms_common.py:1109 models.py:3755 models_imports.py:859
#: templates/ishtar/blocks/window_image_detail.html:54
msgid "Creation date"
msgstr "Date de création"
-#: forms_common.py:1109 models.py:3366
+#: forms_common.py:1112 models.py:3758
#: templates/ishtar/blocks/window_image_detail.html:160
msgid "Receipt date in documentation"
msgstr "Date de réception en documentation"
-#: forms_common.py:1111 forms_common.py:1205 models.py:435 models.py:2692
-#: models.py:3126 models.py:3369 models_imports.py:469
+#: forms_common.py:1114 forms_common.py:1211 models.py:473 models.py:2942
+#: models.py:3418 models.py:3761 models_imports.py:483
#: templates/ishtar/blocks/window_image_detail.html:170
msgid "Comment"
msgstr "Commentaire"
-#: forms_common.py:1113 forms_common.py:1204 models.py:1690 models.py:3368
-#: models_imports.py:124 models_imports.py:362 models_imports.py:432
+#: forms_common.py:1116 forms_common.py:1210 models.py:1884 models.py:3760
+#: models_imports.py:125 models_imports.py:372 models_imports.py:446
msgid "Description"
msgstr "Description"
-#: forms_common.py:1116 models.py:3370
+#: forms_common.py:1119 models.py:3762
#: templates/ishtar/blocks/window_image_detail.html:182
msgid "Additional information"
msgstr "Information supplémentaire"
-#: forms_common.py:1118 forms_common.py:1208 models.py:3372
+#: forms_common.py:1121 forms_common.py:1214 models.py:3764
#: templates/ishtar/blocks/window_image_detail.html:108
msgid "Has a duplicate"
msgstr "Existe en doublon"
-#: forms_common.py:1136 templates/ishtar/organization_person_form.html:9
+#: forms_common.py:1139 templates/ishtar/organization_person_form.html:9
#: templates/ishtar/person_form.html:9
msgid "Identification"
msgstr "Identification"
-#: forms_common.py:1137
+#: forms_common.py:1140
msgid "Content"
msgstr "Contenu"
-#: forms_common.py:1139
+#: forms_common.py:1142
msgid "Dates"
msgstr "Dates"
-#: forms_common.py:1140
+#: forms_common.py:1143
msgid "Advanced"
msgstr "Avancé"
-#: forms_common.py:1141 templates/ishtar/sheet_document.html:49
+#: forms_common.py:1144 templates/ishtar/sheet_document.html:51
msgid "Related items"
msgstr "Éléments reliés"
-#: forms_common.py:1159
+#: forms_common.py:1162
msgid "You should at least fill one of this field: title, url, image or file."
msgstr ""
"Vous devez au minimum remplir un de ces champs : titres, url, image ou "
"fichier"
-#: forms_common.py:1165
+#: forms_common.py:1168
msgid "A document have to attached at least to one item"
msgstr "Un document doit être rattaché au minimum à un élément"
-#: forms_common.py:1197 forms_common.py:1246 forms_common.py:1281
-#: models.py:3175 templates/ishtar/wizard/wizard_person_deletion.html:139
+#: forms_common.py:1203 forms_common.py:1275 forms_common.py:1310
+#: models.py:3500 templates/ishtar/wizard/wizard_person_deletion.html:139
msgid "Author"
msgstr "Auteur"
-#: forms_common.py:1207
+#: forms_common.py:1213
msgid "Additional informations"
msgstr "Informations supplémentaires"
-#: forms_common.py:1217
+#: forms_common.py:1216 views.py:253
+msgid "Operation"
+msgstr "Opération"
+
+#: forms_common.py:1222 views.py:257
+msgid "Context record"
+msgstr "Unité d'Enregistrement"
+
+#: forms_common.py:1228 views.py:261
+msgid "Find"
+msgstr "Mobilier"
+
+#: forms_common.py:1246
msgid "Document search"
msgstr "Recherche document"
-#: forms_common.py:1238
+#: forms_common.py:1267
msgid "Would you like to delete this documentation?"
msgstr "Voulez-vous supprimer ce document ?"
-#: forms_common.py:1254 models.py:3155 models.py:3170 models_imports.py:620
+#: forms_common.py:1283 models.py:3465 models.py:3494 models_imports.py:634
msgid "Author type"
msgstr "Type d'auteur"
-#: forms_common.py:1273
+#: forms_common.py:1302
msgid "Author selection"
msgstr "Sélection d'auteur"
-#: forms_common.py:1288
+#: forms_common.py:1317
msgid "There are identical authors."
msgstr "Il y a des auteurs identiques."
-#: forms_common.py:1299 models.py:1585
+#: forms_common.py:1328 models.py:1683
msgid "Query"
msgstr "Requête"
-#: forms_common.py:1304 models.py:1589
+#: forms_common.py:1333 models.py:1687
msgid "Is an alert"
msgstr "Est une alerte"
-#: forms_common.py:1306
+#: forms_common.py:1335
msgid "Create"
msgstr "Créer"
-#: forms_common.py:1307 templates/ishtar/forms/search_query.html:60
+#: forms_common.py:1336 templates/ishtar/forms/search_query.html:60
msgid "Update"
msgstr "Mettre à jour"
-#: forms_common.py:1322
+#: forms_common.py:1351
msgid "A label is required for a new search query."
msgstr "Un libellé est nécessaire pour une nouvelle requête de recherche."
-#: forms_common.py:1326
+#: forms_common.py:1355
msgid "Select the search query to update"
msgstr "Sélectionnez la requête de recherche à mettre à jour"
-#: forms_common.py:1332 forms_common.py:1347
+#: forms_common.py:1361 forms_common.py:1376
msgid "Query does not exist."
msgstr "Cette requête n'existe pas."
@@ -884,7 +910,7 @@ msgstr "Ajout/modification"
msgid "Deletion"
msgstr "Suppression"
-#: ishtar_menu.py:40 models.py:1990 views.py:929
+#: ishtar_menu.py:40 models.py:2209 views.py:974
msgid "Global variables"
msgstr "Variables globales"
@@ -904,6 +930,8 @@ msgid "Creation"
msgstr "Ajout"
#: ishtar_menu.py:59 ishtar_menu.py:89 ishtar_menu.py:139
+#: templates/ishtar/forms/qa_base.html:29
+#: templates/ishtar/forms/qa_form.html:16
msgid "Modification"
msgstr "Modification"
@@ -915,19 +943,19 @@ msgstr "Fusion automatique"
msgid "Manual merge"
msgstr "Fusion manuelle"
-#: ishtar_menu.py:110 models_imports.py:867
+#: ishtar_menu.py:110 models_imports.py:882
msgid "Imports"
msgstr "Imports"
-#: ishtar_menu.py:113 views.py:937
+#: ishtar_menu.py:113 views.py:982
msgid "New import"
msgstr "Nouvel import"
-#: ishtar_menu.py:117 views.py:956
+#: ishtar_menu.py:117 views.py:1001
msgid "Current imports"
msgstr "Imports en cours"
-#: ishtar_menu.py:121 views.py:1404
+#: ishtar_menu.py:121 views.py:1450
msgid "Old imports"
msgstr "Anciens imports"
@@ -935,28 +963,28 @@ msgstr "Anciens imports"
msgid "Documentation / Images"
msgstr "Documentation / Images"
-#: models.py:191
+#: models.py:196
msgid "Not a valid item."
msgstr "Élément invalide."
-#: models.py:206
+#: models.py:211
msgid "A selected item is not a valid item."
msgstr "Un élément sélectionné n'est pas valide."
-#: models.py:217
+#: models.py:222
msgid "This item already exists."
msgstr "Cet élément existe déjà."
-#: models.py:427 models.py:1584 models.py:1972 models.py:2306 models.py:2322
-#: models.py:3125 models_imports.py:358
+#: models.py:465 models.py:1682 models.py:2191 models.py:2528 models.py:2544
+#: models.py:3417 models_imports.py:368
msgid "Label"
msgstr "Dénomination"
-#: models.py:429
+#: models.py:467
msgid "Textual ID"
msgstr "Identifiant textuel"
-#: models.py:432
+#: models.py:470
msgid ""
"The slug is the standardized version of the name. It contains only lowercase "
"letters, numbers and hyphens. Each slug must be unique."
@@ -965,12 +993,12 @@ msgstr ""
"lettres en minuscule, des nombres et des tirets (-). Chaque \"slug\" doit "
"être unique dans la typologie."
-#: models.py:436 models.py:1862 models.py:2218 models.py:3128
-#: models_imports.py:138 models_imports.py:528
+#: models.py:474 models.py:2081 models.py:2437 models.py:3422
+#: models_imports.py:139 models_imports.py:542
msgid "Available"
msgstr "Disponible"
-#: models.py:816 models.py:1000 models_imports.py:549
+#: models.py:898 models.py:1083 models_imports.py:563
#: templates/ishtar/formset_import_match.html:21
#: templates/ishtar/import_step_by_step.html:171
#: templates/ishtar/import_step_by_step.html:199
@@ -979,239 +1007,264 @@ msgstr "Disponible"
msgid "Key"
msgstr "Clé"
-#: models.py:822
+#: models.py:904
msgid "Specific key to an import"
msgstr "Clé spécifique à un import"
-#: models.py:961
+#: models.py:1043
msgid "Generated relation image (SVG)"
msgstr "Image des relations (SVG généré)"
-#: models.py:975 models.py:1008 models.py:1506 models.py:1974 models.py:3152
-#: models.py:3736 models.py:3818
+#: models.py:1057 models.py:1091 models.py:1604 models.py:2193 models.py:3462
+#: models.py:4162 models.py:4244
msgid "Order"
msgstr "Ordre"
-#: models.py:978
+#: models.py:1060
msgid "Json data - Menu"
msgstr "Données JSON - Menu"
-#: models.py:979
+#: models.py:1061
msgid "Json data - Menus"
msgstr "Données JSON - Menus"
-#: models.py:987
+#: models.py:1069
msgid "Text"
msgstr "Texte"
-#: models.py:988
+#: models.py:1070
msgid "Long text"
msgstr "Texte long"
-#: models.py:989 models_imports.py:661
+#: models.py:1071 models_imports.py:676
msgid "Integer"
msgstr "Entier"
-#: models.py:990 models_imports.py:662
+#: models.py:1072
+msgid "Boolean"
+msgstr ""
+
+#: models.py:1073 models_imports.py:677
msgid "Float"
msgstr "Nombre à virgule"
-#: models.py:991 models_imports.py:664
+#: models.py:1074 models_imports.py:679
msgid "Date"
msgstr "Date"
-#: models.py:992
+#: models.py:1075
msgid "Choices"
msgstr "Choix"
-#: models.py:1001
+#: models.py:1084
msgid ""
"Value of the key in the JSON schema. For hierarchical key use \"__\" to "
-"explain it. For instance for the key 'my_subkey' with data such as {'my_key':"
-" {'my_subkey': 'value'}}, its value will be reached with my_key__my_subkey."
+"explain it. For instance for the key 'my_subkey' with data such as "
+"{'my_key': {'my_subkey': 'value'}}, its value will be reached with "
+"my_key__my_subkey."
msgstr ""
"Valeur de la clé dans le format JSON. Pour les clés hiérarchiques utiliser « "
"__ ». Par exemple pour la clé 'ma_sousclef' avec des données telles que "
"{'ma_clef': {'ma_sousclef': 'valeur'}}, sa valeur sera atteinte avec : "
"ma_clef__ma_sousclef."
-#: models.py:1005
+#: models.py:1088
msgid "Display"
msgstr "Afficher"
-#: models.py:1009
+#: models.py:1092
msgid "Use in search indexes"
msgstr "Utiliser dans les index de recherche"
-#: models.py:1016
+#: models.py:1099
msgid "Json data - Field"
msgstr "Donnée JSON - Champ"
-#: models.py:1017
+#: models.py:1100
msgid "Json data - Fields"
msgstr "Donnée JSON - Champs"
-#: models.py:1028
+#: models.py:1111
msgid "Content types of the field and of the menu do not match"
msgstr "Les types de contenu du champ et du menu ne correspondent pas"
-#: models.py:1088
+#: models.py:1171
msgid "Search vector"
msgstr "Vecteur de recherche"
-#: models.py:1089
+#: models.py:1172
msgid "Auto filled at save"
msgstr "Auto-rempli à la sauvegarde"
-#: models.py:1296
+#: models.py:1392
msgid "Add document/image"
msgstr "Ajouter un document / une image"
-#: models.py:1298
+#: models.py:1394
msgid "doc./image"
msgstr "doc./image"
-#: models.py:1316
+#: models.py:1413
msgid "Last editor"
msgstr "Dernier éditeur"
-#: models.py:1319
+#: models.py:1416
msgid "Creator"
msgstr "Créateur"
-#: models.py:1499
+#: models.py:1597
msgid "Above"
msgstr "Au-dessus"
-#: models.py:1500
+#: models.py:1598
msgid "Bellow"
msgstr "En dessous"
-#: models.py:1501
+#: models.py:1599
msgid "Equal"
msgstr "Égal"
-#: models.py:1507
+#: models.py:1605
msgid "Symmetrical"
msgstr "Symétrique"
-#: models.py:1508
+#: models.py:1606
msgid "Tiny label"
msgstr "Dénomination courte"
-#: models.py:1511
+#: models.py:1609
msgid "Inverse relation"
msgstr "Relation inverse"
-#: models.py:1514
+#: models.py:1612
msgid "Logical relation"
msgstr "Relation logique"
-#: models.py:1524
+#: models.py:1622
msgid "Cannot have symmetrical and an inverse_relation"
msgstr "Ne peut pas être symétrique et avoir une relation inverse"
-#: models.py:1587
+#: models.py:1685
msgid "Content type"
msgstr "Type de contenu"
-#: models.py:1592
+#: models.py:1690
msgid "Search query"
msgstr "Requête de recherche"
-#: models.py:1593
+#: models.py:1691
msgid "Search queries"
msgstr "Requêtes de recherche"
-#: models.py:1663
+#: models.py:1855
msgid "Euro"
msgstr "Euro"
-#: models.py:1664
+#: models.py:1856
msgid "US dollar"
msgstr "Dollar US"
-#: models.py:1665 views.py:679 views.py:740
+#: models.py:1857 views.py:724 views.py:785
msgid "Operations"
msgstr "Opérations"
-#: models.py:1666 views.py:681 views.py:744
+#: models.py:1858 views.py:726 views.py:789
msgid "Context records"
msgstr "Unités d'Enregistrement"
-#: models.py:1667
+#: models.py:1859
msgid "Site"
msgstr "Site"
-#: models.py:1667
+#: models.py:1859
msgid "Archaeological entity"
msgstr "Entité (EA)"
-#: models.py:1671
+#: models.py:1863
msgid "Site search"
msgstr "Rechercher un site"
-#: models.py:1672
+#: models.py:1864
msgid "New site"
msgstr "Ajouter un site"
-#: models.py:1673
+#: models.py:1865
msgid "Site modification"
msgstr "Modifier un site"
-#: models.py:1676
+#: models.py:1866
+#, fuzzy
+#| msgid "Person deletion"
+msgid "Site deletion"
+msgstr "Supprimer une personne"
+
+#: models.py:1869
msgid "Archaeological entity search"
msgstr "Rechercher une entité archéologique"
-#: models.py:1677
+#: models.py:1870
msgid "New archaeological entity"
msgstr "Nouvelle entité archéologique"
-#: models.py:1678
+#: models.py:1871
msgid "Archaeological entity modification"
msgstr "Modifier une entité archéologique"
-#: models.py:1686 models.py:2212 models_imports.py:123
+#: models.py:1872
+#, fuzzy
+#| msgid "Archaeological entity modification"
+msgid "Archaeological entity deletion"
+msgstr "Modifier une entité archéologique"
+
+#: models.py:1880 models.py:2431 models_imports.py:124
msgid "Slug"
msgstr "Identifiant texte"
-#: models.py:1687
+#: models.py:1881
msgid "Current active"
msgstr "Actuellement utilisé"
-#: models.py:1689
+#: models.py:1883
msgid "Activate experimental feature"
msgstr "Activer les fonctionnalités expérimentales"
-#: models.py:1691
+#: models.py:1886
+msgid "Alternate configuration"
+msgstr ""
+
+#: models.py:1888
+msgid "Choose an alternate configuration for label, index management"
+msgstr ""
+
+#: models.py:1892
msgid "Files module"
msgstr "Module Dossiers"
-#: models.py:1693
+#: models.py:1894
msgid "Archaeological site module"
msgstr "Module Site archéologique"
-#: models.py:1695
+#: models.py:1896
msgid "Archaeological site type"
msgstr "Type de site archéologique"
-#: models.py:1699
+#: models.py:1900
msgid "Context records module"
msgstr "Module Unités d'Enregistrement"
-#: models.py:1701
+#: models.py:1902
msgid "Finds module"
msgstr "Module Mobilier"
-#: models.py:1702
+#: models.py:1903
msgid "Need context records module"
msgstr "Nécessite le module Unités d'Enregistrement"
-#: models.py:1704
+#: models.py:1905
msgid "Find index is based on"
msgstr "Index mobilier basé sur"
-#: models.py:1706
+#: models.py:1907
msgid ""
"To prevent irrelevant indexes, change this parameter only if there is no "
"find in the database"
@@ -1219,35 +1272,35 @@ msgstr ""
"Pour éviter des index non pertinents, ne changer ce paramètre que s'il n'y a "
"pas encore de mobilier dans cette base de données"
-#: models.py:1709
+#: models.py:1910
msgid "Warehouses module"
msgstr "Module Lieu de conservation"
-#: models.py:1710
+#: models.py:1911
msgid "Need finds module"
msgstr "Nécessite le module mobilier"
-#: models.py:1711
+#: models.py:1912
msgid "Preservation module"
msgstr "Module de conservation"
-#: models.py:1713
+#: models.py:1914
msgid "Mapping module"
msgstr "Module cartographique"
-#: models.py:1714
+#: models.py:1915
msgid "Underwater module"
msgstr "Module sous-marin / subaquatique"
-#: models.py:1716
+#: models.py:1917
msgid "Parcel are mandatory for context records"
msgstr "Parcelles cadastrales obligatoires pour les Unités d'Enregistrement"
-#: models.py:1718
+#: models.py:1919
msgid "Home page"
msgstr "Page d'accueil"
-#: models.py:1719
+#: models.py:1920
#, python-brace-format
msgid ""
"Homepage of Ishtar - if not defined a default homepage will appear. Use the "
@@ -1257,25 +1310,41 @@ msgstr ""
"défaut apparaît. Utiliser la syntaxe Markdown. {random_image} peut être "
"utilisé pour afficher une image au hasard."
-#: models.py:1723
+#: models.py:1924
+msgid "Main operation code prefix"
+msgstr ""
+
+#: models.py:1928
+#, fuzzy
+#| msgid "Alteration cause type"
+msgid "Default operation code prefix"
+msgstr "Type de cause d'altération"
+
+#: models.py:1932
+#, fuzzy
+#| msgid "Operation type"
+msgid "Operation region code"
+msgstr "Type d'opération"
+
+#: models.py:1936
msgid "File external id"
msgstr "Identifiant de fichier"
-#: models.py:1725
+#: models.py:1938
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 ""
-"Formule pour gérer les identifiants de dossiers. À manipuler avec précaution."
-" Une formule incorrecte peut rendre l'application inutilisable et l'import "
-"de données externes peut alors être destructif."
+"Formule pour gérer les identifiants de dossiers. À 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:1730
+#: models.py:1943
msgid "Parcel external id"
msgstr "Identifiant de parcelle"
-#: models.py:1733
+#: models.py:1946
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 "
@@ -1285,11 +1354,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:1738
+#: models.py:1951
msgid "Context record external id"
msgstr "Identifiant d'unité d'enregistrement"
-#: models.py:1740
+#: models.py:1953
msgid ""
"Formula to manage context record external ID. Change this with care. With "
"incorrect formula, the application might be unusable and import of external "
@@ -1299,11 +1368,11 @@ msgstr ""
"avec précaution. Une formule incorrecte peut rendre l'application "
"inutilisable et l'import de données externes peut alors être destructif."
-#: models.py:1745
+#: models.py:1958
msgid "Base find external id"
msgstr "Identifiant de mobilier d'origine"
-#: models.py:1747
+#: models.py:1960
msgid ""
"Formula to manage base find external ID. Change this with care. With "
"incorrect formula, the application might be unusable and import of external "
@@ -1313,25 +1382,25 @@ msgstr ""
"précaution. Une formule incorrecte peut rendre l'application inutilisable et "
"l'import de données externes peut alors être destructif."
-#: models.py:1752
+#: models.py:1965
msgid "Find external id"
msgstr "Identifiant de mobilier"
-#: models.py:1754
+#: models.py:1967
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 ""
-"Formule pour gérer les identifiants de mobilier. À manipuler avec précaution."
-" Une formule incorrecte peut rendre l'application inutilisable et l'import "
-"de données externes peut alors être destructif."
+"Formule pour gérer les identifiants de mobilier. À 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:1759
+#: models.py:1972
msgid "Container external id"
msgstr "ID du contenant"
-#: models.py:1761
+#: models.py:1974
msgid ""
"Formula to manage container external ID. Change this with care. With "
"incorrect formula, the application might be unusable and import of external "
@@ -1341,11 +1410,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:1766
+#: models.py:1979
msgid "Warehouse external id"
msgstr "Identifiant du lieu de conservation"
-#: models.py:1768
+#: models.py:1981
msgid ""
"Formula to manage warehouse external ID. Change this with care. With "
"incorrect formula, the application might be unusable and import of external "
@@ -1355,11 +1424,11 @@ msgstr ""
"avec précaution. Une formule incorrecte peut rendre l'application "
"inutilisable et l'import de données externes peut alors être destructif."
-#: models.py:1773
+#: models.py:1986
msgid "Raw name for person"
msgstr "Nom brut pour une personne"
-#: models.py:1775
+#: models.py:1988
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 "
@@ -1369,23 +1438,27 @@ msgstr ""
"Une formule incorrecte peut rendre l'application inutilisable et l'import de "
"données externes peut alors être destructif."
-#: models.py:1779
+#: models.py:1992
+msgid "Use auto index for finds"
+msgstr ""
+
+#: models.py:1994
msgid "Currency"
msgstr "Devise"
-#: models.py:1783
+#: models.py:1998
msgid "Ishtar site profile"
msgstr "Profil d'instance Ishtar"
-#: models.py:1784
+#: models.py:1999
msgid "Ishtar site profiles"
msgstr "Profils d'instance Ishtar"
-#: models.py:1864
+#: models.py:2083
msgid "Enable this form"
msgstr "Activer ce formulaire"
-#: models.py:1865
+#: models.py:2084
msgid ""
"Disable with caution: disabling a form with mandatory fields may lead to "
"database errors."
@@ -1393,11 +1466,11 @@ msgstr ""
"Désactiver avec précaution : désactiver un formulaire avec des champs "
"obligatoires peut entraîner des erreurs dans la base de données."
-#: models.py:1868
+#: models.py:2087
msgid "Apply to all"
msgstr "S'applique à tous"
-#: models.py:1869
+#: models.py:2088
msgid ""
"Apply this form to all users. If set to True, selecting user and user type "
"is useless."
@@ -1405,48 +1478,48 @@ msgstr ""
"Activer ce formulaire pour tous les utilisateurs. Si mis à Vrai, "
"sélectionner des utilisateurs ou des types d'utilisateurs est inutile."
-#: models.py:1875
+#: models.py:2094
msgid "Custom form"
msgstr "Formulaire personnalisé"
-#: models.py:1876
+#: models.py:2095
msgid "Custom forms"
msgstr "Formulaires personnalisés"
-#: models.py:1892
+#: models.py:2111
msgid "User types"
msgstr "Types d'utilisateur"
-#: models.py:1964
+#: models.py:2183
msgid "Excluded field"
msgstr "Champ exclus"
-#: models.py:1965
+#: models.py:2184
msgid "Excluded fields"
msgstr "Champs exclus"
-#: models.py:1975 templates/blocks/form_flex_snippet.html:18
+#: models.py:2194 templates/blocks/form_flex_snippet.html:18
#: templates/blocks/table_form_snippet.html:9
msgid "Help"
msgstr "Aide"
-#: models.py:1978
+#: models.py:2197
msgid "Custom form - Json data field"
msgstr "Formulaire personnalisé - Champ de donnée Json"
-#: models.py:1979
+#: models.py:2198
msgid "Custom form - Json data fields"
msgstr "Formulaire personnalisé - Champs de donnée Json"
-#: models.py:1983
+#: models.py:2202
msgid "Variable name"
msgstr "Nom de la variable"
-#: models.py:1984
+#: models.py:2203
msgid "Description of the variable"
msgstr "Description de la variable"
-#: models.py:1986 models_imports.py:550
+#: models.py:2205 models_imports.py:564
#: templates/ishtar/formset_import_match.html:22
#: templates/ishtar/import_step_by_step.html:172
#: templates/ishtar/import_step_by_step.html:200
@@ -1454,477 +1527,556 @@ msgstr "Description de la variable"
msgid "Value"
msgstr "Valeur"
-#: models.py:1989
+#: models.py:2208
msgid "Global variable"
msgstr "Variable globale"
-#: models.py:2116 models.py:2146
+#: models.py:2335 models.py:2365
msgid "Total"
msgstr "Total"
-#: models.py:2123 models.py:2307 models.py:2323
+#: models.py:2342 models.py:2529 models.py:2545
#: templates/ishtar/dashboards/dashboard_main_detail.html:211
#: templates/ishtar/dashboards/dashboard_main_detail_users.html:5
#: templates/ishtar/sheet_person.html:30
msgid "Number"
msgstr "Nombre"
-#: models.py:2210
+#: models.py:2429
msgid "Administrative Act"
msgstr "Acte administratif"
-#: models.py:2217
+#: models.py:2436
msgid "Associated object"
msgstr "Objet associé"
-#: models.py:2222
+#: models.py:2441
msgid "Document template"
msgstr "Patron de document"
-#: models.py:2223
+#: models.py:2442
msgid "Document templates"
msgstr "Patrons de document"
-#: models.py:2311 models.py:2324 models.py:3856 models_imports.py:838
+#: models.py:2533 models.py:2546 models.py:4282 models_imports.py:853
msgid "State"
msgstr "État"
-#: models.py:2329 models.py:3608 templates/blocks/JQueryAdvancedTown.html:12
+#: models.py:2551 models.py:4004 templates/blocks/JQueryAdvancedTown.html:12
msgid "Department"
msgstr "Département"
-#: models.py:2330
+#: models.py:2552
msgid "Departments"
msgstr "Départements"
-#: models.py:2370
+#: models.py:2592
msgid "Raw phone"
msgstr "Téléphone brut"
-#: models.py:2376
+#: models.py:2598
msgid "Alternative address is prefered"
msgstr "L'adresse alternative est préférée"
-#: models.py:2415
+#: models.py:2637
msgid "Tel: "
msgstr "Tél :"
-#: models.py:2419
+#: models.py:2641
msgid "Mobile: "
msgstr "Mobile :"
-#: models.py:2423
+#: models.py:2645
msgid "Email: "
msgstr "Courriel :"
-#: models.py:2428
+#: models.py:2650
msgid "Merge key"
msgstr "Clé de fusion"
-#: models.py:2500
+#: models.py:2722
msgid "Organization types"
msgstr "Types d'organisation"
-#: models.py:2522 models.py:2650 models.py:3021
+#: models.py:2749 models.py:2896 models.py:3300
msgctxt "key for text search"
msgid "name"
msgstr ""
-#: models.py:2526 models.py:2662 models.py:3033 models.py:3303
+#: models.py:2753 models.py:2908 models.py:3312 models.py:3636
msgctxt "key for text search"
msgid "type"
msgstr ""
-#: models.py:2537 models.py:2697 models.py:3171 models.py:3616
+#: models.py:2768 models.py:2947 models.py:3495 models.py:4012
msgid "Cached name"
msgstr "Nom en cache"
-#: models.py:2543
+#: models.py:2774
msgid "Organizations"
msgstr "Organisations"
-#: models.py:2571
+#: models.py:2804
msgid "unknown organization"
msgstr "organisation inconnue"
-#: models.py:2597
+#: models.py:2830
msgid "Person types"
msgstr "Types de personne"
-#: models.py:2610 models_imports.py:655
+#: models.py:2843 models_imports.py:670
msgid "Title type"
msgstr "Type de titre"
-#: models.py:2611
+#: models.py:2844
msgid "Title types"
msgstr "Types de titre"
-#: models.py:2622
+#: models.py:2868
msgid "Mr"
msgstr "M."
-#: models.py:2623
+#: models.py:2869
msgid "Miss"
msgstr "Mlle"
-#: models.py:2624
+#: models.py:2870
msgid "Mr and Mrs"
msgstr "M. et Mme"
-#: models.py:2625
+#: models.py:2871
msgid "Mrs"
msgstr "Mme"
-#: models.py:2626
+#: models.py:2872
msgid "Doctor"
msgstr "Dr."
-#: models.py:2654 models.py:3025
+#: models.py:2900 models.py:3304
msgctxt "key for text search"
msgid "surname"
msgstr ""
-#: models.py:2658 models.py:3029
+#: models.py:2904 models.py:3308
msgctxt "key for text search"
msgid "email"
msgstr ""
-#: models.py:2666 models.py:3037
+#: models.py:2912 models.py:3316
msgctxt "key for text search"
msgid "organization"
msgstr ""
-#: models.py:2670
+#: models.py:2916
msgctxt "key for text search"
msgid "has-account"
msgstr ""
-#: models.py:2690
+#: models.py:2940
msgid "Contact type"
msgstr "Type de contact"
-#: models.py:2693 models.py:2777
+#: models.py:2943 models.py:3033
msgid "Types"
msgstr "Types"
-#: models.py:2696
+#: models.py:2946
msgid "Is attached to"
msgstr "Est rattaché à"
-#: models.py:2703
+#: models.py:2953
msgid "Persons"
msgstr "Personnes"
-#: models.py:2916
+#: models.py:3171
msgid "Groups"
msgstr "Groupes"
-#: models.py:2921
+#: models.py:3176
msgid "Profile types"
msgstr "Types de profil"
-#: models.py:2940
+#: models.py:3187
+#, fuzzy
+#| msgid "Profile types"
+msgid "Profile type summary"
+msgstr "Types de profil"
+
+#: models.py:3188
+#, fuzzy
+#| msgid "Profile types"
+msgid "Profile types summary"
+msgstr "Types de profil"
+
+#: models.py:3199
+#, fuzzy
+#| msgid "Export field name"
+msgid "Show field number"
+msgstr "Nom du champ à exporter"
+
+#: models.py:3204
msgid "User profile"
msgstr "Profil d'utilisateur"
-#: models.py:2941
+#: models.py:3205
msgid "User profiles"
msgstr "Profils d'utilisateurs"
-#: models.py:2976
+#: models.py:3240
msgid " - duplicate"
msgstr "- copie"
-#: models.py:3017
+#: models.py:3296
msgctxt "key for text search"
msgid "username"
msgstr ""
-#: models.py:3050
+#: models.py:3332
msgid "Advanced shortcut menu"
msgstr "Menu de raccourci (avancé)"
-#: models.py:3053
+#: models.py:3335
msgid "Ishtar user"
msgstr "Utilisateur d'Ishtar"
-#: models.py:3054
+#: models.py:3336
msgid "Ishtar users"
msgstr "Utilisateurs d'Ishtar"
-#: models.py:3156
+#: models.py:3421
+msgid "Owner"
+msgstr ""
+
+#: models.py:3424
+msgid "Shared with"
+msgstr ""
+
+#: models.py:3466
msgid "Author types"
msgstr "Types d'auteur"
-#: models.py:3213
+#: models.py:3541
msgid "Source types"
msgstr "Types de document"
-#: models.py:3223 models_imports.py:654
+#: models.py:3551 models_imports.py:669
msgid "Support type"
msgstr "Type de support"
-#: models.py:3224
+#: models.py:3552
msgid "Support types"
msgstr "Types de support"
-#: models.py:3233
+#: models.py:3561
msgid "Format type"
msgstr "Type de format"
-#: models.py:3234
+#: models.py:3562
msgid "Format types"
msgstr "Types de format"
-#: models.py:3243
+#: models.py:3571
msgid "URL"
msgstr "URL"
-#: models.py:3246
+#: models.py:3574
msgid "License type"
msgstr "Type de licence"
-#: models.py:3247
+#: models.py:3575
msgid "License types"
msgstr "Types de licence"
-#: models.py:3295
+#: models.py:3628
msgctxt "key for text search"
msgid "author"
msgstr ""
-#: models.py:3299
+#: models.py:3632
msgctxt "key for text search"
msgid "title"
msgstr ""
-#: models.py:3307
+#: models.py:3640
msgctxt "key for text search"
msgid "reference"
msgstr ""
-#: models.py:3311
+#: models.py:3644
msgctxt "key for text search"
msgid "internal-reference"
msgstr ""
-#: models.py:3315
+#: models.py:3648
msgctxt "key for text search"
msgid "description"
msgstr ""
-#: models.py:3319
+#: models.py:3652
msgctxt "key for text search"
msgid "comment"
msgstr ""
-#: models.py:3323
+#: models.py:3656
msgctxt "key for text search"
msgid "additional-information"
msgstr ""
-#: models.py:3327
+#: models.py:3660
msgctxt "key for text search"
msgid "has-duplicate"
msgstr ""
-#: models.py:3337
+#: models.py:3664 models.py:3711
+#, fuzzy
+#| msgid "Operation"
+msgctxt "key for text search"
+msgid "operation"
+msgstr "Opération"
+
+#: models.py:3668 models.py:3714
+#, fuzzy
+#| msgid "Context record"
+msgctxt "key for text search"
+msgid "context-record"
+msgstr "Unité d'Enregistrement"
+
+#: models.py:3672 models.py:3716
+msgctxt "key for text search"
+msgid "find"
+msgstr ""
+
+#: models.py:3676 models.py:3715
+#, fuzzy
+#| msgid "Profile"
+msgctxt "key for text search"
+msgid "file"
+msgstr "Profil"
+
+#: models.py:3680 models.py:3717
+#, fuzzy
+#| msgid "New site"
+msgctxt "key for text search"
+msgid "site"
+msgstr "Ajouter un site"
+
+#: models.py:3684 models.py:3718
+#, fuzzy
+#| msgid "Warehouse type"
+msgctxt "key for text search"
+msgid "warehouse"
+msgstr "Type de lieu de conservation"
+
+#: models.py:3720
+#, fuzzy
+#| msgid "Treatment"
+msgctxt "key for text search"
+msgid "treatment"
+msgstr "Traitement"
+
+#: models.py:3723
+#, fuzzy
+#| msgid "Treatment"
+msgctxt "key for text search"
+msgid "treatment-file"
+msgstr "Traitement"
+
+#: models.py:3729
msgid "Index"
msgstr "Index"
-#: models.py:3339
+#: models.py:3731
msgid "External ID"
msgstr "Identifiant"
-#: models.py:3340 templates/ishtar/blocks/window_image_detail.html:34
+#: models.py:3732 templates/ishtar/blocks/window_image_detail.html:34
msgid "Ref."
msgstr "Réf."
-#: models.py:3341 templates/ishtar/blocks/window_image_detail.html:44
+#: models.py:3733 templates/ishtar/blocks/window_image_detail.html:44
msgid "Internal ref."
msgstr "Réf. interne"
-#: models.py:3345
+#: models.py:3737
msgid "License"
msgstr "Licence"
-#: models.py:3347 templates/ishtar/blocks/window_image_detail.html:78
+#: models.py:3739 templates/ishtar/blocks/window_image_detail.html:78
msgid "Support"
msgstr "Support"
-#: models.py:3349 models_imports.py:621
+#: models.py:3741 models_imports.py:635
#: templates/ishtar/blocks/window_image_detail.html:88
msgid "Format"
msgstr "Format"
-#: models.py:3351 templates/ishtar/blocks/window_image_detail.html:98
+#: models.py:3743 templates/ishtar/blocks/window_image_detail.html:98
msgid "Scale"
msgstr "Échelle"
-#: models.py:3355
+#: models.py:3747
msgid "Authors (raw)"
msgstr "Auteurs (brut)"
-#: models.py:3367 templates/ishtar/blocks/window_image_detail.html:118
+#: models.py:3759 templates/ishtar/blocks/window_image_detail.html:118
msgid "Number of items"
msgstr "Nombre d'éléments"
-#: models.py:3373
+#: models.py:3766
msgid "Symbolic links"
msgstr "Liens symboliques"
-#: models.py:3376
+#: models.py:3769
msgid "Related"
msgstr "Lié"
-#: models.py:3377
+#: models.py:3770
msgid "Cached value - do not edit"
msgstr "Valeur en cache - ne pas éditer"
-#: models.py:3380 templates/ishtar/sheet_document.html:4
+#: models.py:3773 templates/ishtar/sheet_document.html:4
msgid "Document"
msgstr "Document"
-#: models.py:3381 templates/ishtar/sheet_person.html:107
+#: models.py:3774 templates/ishtar/sheet_person.html:113
msgid "Documents"
msgstr "Documents"
-#: models.py:3385
+#: models.py:3778
msgid "Can view all Documents"
msgstr "Peut voir tous les Documents"
-#: models.py:3387
+#: models.py:3780
msgid "Can view own Document"
msgstr "Peut voir ses propres Documents"
-#: models.py:3389
+#: models.py:3782
msgid "Can add own Document"
msgstr "Peut ajouter son propre Document"
-#: models.py:3391
+#: models.py:3784
msgid "Can change own Document"
msgstr "Peut modifier ses propres documents"
-#: models.py:3393
+#: models.py:3786
msgid "Can delete own Document"
msgstr "Peut supprimer ses propres Documents"
-#: models.py:3601
+#: models.py:3997
msgid "Surface (m2)"
msgstr "Surface (m2)"
-#: models.py:3602
+#: models.py:3998
msgid "Localisation"
msgstr "Localisation"
-#: models.py:3610
+#: models.py:4006
msgid "Year of creation"
msgstr "Année de création"
-#: models.py:3611
-msgid ""
-"Filling this field is relevant to distinguish old towns from new towns."
+#: models.py:4007
+msgid "Filling this field is relevant to distinguish old towns from new towns."
msgstr ""
"Remplir ce champ est nécessaire pour distinguer les anciennes communes des "
"nouvelles communes."
-#: models.py:3725
+#: models.py:4139
msgid "Only four level of parent are managed."
msgstr "Seulement quatre niveaux de parents sont gérés."
-#: models.py:3730
+#: models.py:4144
msgid "Area"
msgstr "Zone"
-#: models.py:3737
+#: models.py:4163
msgid "Is preventive"
msgstr "Est du préventif"
-#: models.py:3738
+#: models.py:4164
msgid "Is judiciary"
msgstr "Est judiciaire"
-#: models.py:3741 models_imports.py:622
+#: models.py:4167 models_imports.py:636
msgid "Operation type"
msgstr "Type d'opération"
-#: models.py:3742
+#: models.py:4168
msgid "Operation types"
msgstr "Types d'opération"
-#: models.py:3781
+#: models.py:4207
msgid "Judiciary"
msgstr "Judiciaire"
-#: models.py:3783
+#: models.py:4209
msgid "Preventive"
msgstr "Préventif"
-#: models.py:3785
+#: models.py:4211
msgid "Research"
msgstr "Programmé"
-#: models.py:3820
+#: models.py:4246
msgid "Authority name"
msgstr "Registre"
-#: models.py:3821
+#: models.py:4247
msgid "Authority SRID"
msgstr "SRID"
-#: models.py:3824 models_imports.py:653
+#: models.py:4250 models_imports.py:668
msgid "Spatial reference system"
msgstr "Système de référence spatiale"
-#: models.py:3825
+#: models.py:4251
msgid "Spatial reference systems"
msgstr "Systèmes de référence spatiale"
-#: models.py:3832
+#: models.py:4258
msgid "Filename"
msgstr "Nom de fichier"
-#: models.py:3837
+#: models.py:4263
msgid "Administration script"
msgstr "Script d'administration"
-#: models.py:3838
+#: models.py:4264
msgid "Administration scripts"
msgstr "Scripts d'administration"
-#: models.py:3845
+#: models.py:4271
msgid "Scheduled"
msgstr "Planifié"
-#: models.py:3846
+#: models.py:4272
msgid "In progress"
msgstr "En cours"
-#: models.py:3847 models_imports.py:777
+#: models.py:4273 models_imports.py:792
msgid "Finished with errors"
msgstr "Terminé avec des erreurs"
-#: models.py:3848 models_imports.py:778
+#: models.py:4274 models_imports.py:793
msgid "Finished"
msgstr "Terminé"
-#: models.py:3861
+#: models.py:4287
msgid "Result"
msgstr "Résultat"
-#: models.py:3864
+#: models.py:4290
msgid "Administration task"
msgstr "Tâche d'administration"
-#: models.py:3865
+#: models.py:4291
msgid "Administration tasks"
msgstr "Tâches d'administration"
-#: models.py:3869
+#: models.py:4295
msgid "Unknown"
msgstr "Inconnu"
-#: models.py:3884
+#: models.py:4310
msgid ""
"ISHTAR_SCRIPT_DIR is not set in your local_settings. Contact your "
"administrator."
@@ -1932,7 +2084,7 @@ msgstr ""
"ISHTAR_SCRIPT_DIR n'est pas défini dans votre fichier local_settings. "
"Contactez l'administrateur."
-#: models.py:3893
+#: models.py:4319
msgid ""
"Your ISHTAR_SCRIPT_DIR is containing dots \"..\". As it can refer to "
"relative paths, it can be a security issue and this is not allowed. Only put "
@@ -1943,11 +2095,11 @@ msgstr ""
"problème de sécurité et cela n'est pas permis. Seul un chemin complet est "
"permis."
-#: models.py:3904
+#: models.py:4330
msgid "Your ISHTAR_SCRIPT_DIR: \"{}\" is not a valid directory."
msgstr "ISHTAR_SCRIPT_DIR: « {} » n'est pas un répertoire valable."
-#: models.py:3920
+#: models.py:4346
msgid ""
"Script \"{}\" is not available in your script directory. Check your "
"configuration."
@@ -1955,76 +2107,82 @@ msgstr ""
"Le script « {} »n'est pas un fichier valable de votre répertoire de script. "
"Vérifiez la configuration."
-#: models_imports.py:98
+#: models_imports.py:99
msgid "Class name"
msgstr "Nom de la classe"
-#: models_imports.py:102
+#: models_imports.py:103
msgid "Importer - Model"
msgstr "Importeur - Modèle"
-#: models_imports.py:103
+#: models_imports.py:104
msgid "Importer - Models"
msgstr "Importeur - Modèles"
-#: models_imports.py:129
+#: models_imports.py:130
msgid "Associated model"
msgstr "Modèle associé"
-#: models_imports.py:132
+#: models_imports.py:133
msgid "Models that can accept new items"
msgstr "Modèles qui peuvent accepter de nouveaux éléments"
-#: models_imports.py:133
+#: models_imports.py:134
msgid "Leave blank for no restrictions"
msgstr "Laissez vide pour aucune restriction"
-#: models_imports.py:135
+#: models_imports.py:136
msgid "Is template"
msgstr "Est un patron"
-#: models_imports.py:136
+#: models_imports.py:137
msgid "Unicity keys (separator \";\")"
msgstr "Clés d'unicité (séparateur « ; »)"
-#: models_imports.py:142
+#: models_imports.py:143
msgid "Importer - Type"
msgstr "Importeur - Type"
-#: models_imports.py:143
+#: models_imports.py:144
msgid "Importer - Types"
msgstr "Importeur - Types"
-#: models_imports.py:265
+#: models_imports.py:247
+msgid ""
+"Importer configuration error: \"{}\" is not available for \"{}\". Check your "
+"default and column configuration"
+msgstr ""
+
+#: models_imports.py:275
msgid "Importer - Default"
msgstr "Importeur - Par défaut"
-#: models_imports.py:266
+#: models_imports.py:276
msgid "Importer - Defaults"
msgstr "Importeur - Par défaut"
-#: models_imports.py:311
+#: models_imports.py:321
msgid "Importer - Default value"
msgstr "Importeur - Valeur par défaut"
-#: models_imports.py:312
+#: models_imports.py:322
msgid "Importer - Default values"
msgstr "Importeur - Valeurs par défaut"
-#: models_imports.py:361 templates/ishtar/import_step_by_step.html:101
+#: models_imports.py:371 templates/ishtar/import_step_by_step.html:101
#: templates/ishtar/import_step_by_step.html:269
msgid "Column number"
msgstr "Numéro de colonne"
-#: models_imports.py:364
+#: models_imports.py:374
msgid "Required"
msgstr "Requis"
-#: models_imports.py:366
+#: models_imports.py:376
msgid "Export field name"
msgstr "Nom du champ à exporter"
-#: models_imports.py:367
+#: models_imports.py:377
msgid ""
"Fill this field if the field name is ambiguous for export. For instance: "
"concatenated fields."
@@ -2032,417 +2190,433 @@ msgstr ""
"Remplir ce champ si le nom du champ est ambigu pour l'export, par exemple "
"dans le cas de champs concaténés."
-#: models_imports.py:373
+#: models_imports.py:383
msgid "Importer - Column"
msgstr "Importeur - Colonne"
-#: models_imports.py:374
+#: models_imports.py:384
msgid "Importer - Columns"
msgstr "Importeur - Colonnes"
-#: models_imports.py:404
+#: models_imports.py:418
msgid "Field name"
msgstr "Nom du champ"
-#: models_imports.py:406 models_imports.py:463
+#: models_imports.py:420 models_imports.py:477
msgid "Force creation of new items"
msgstr "Forcer la création de nouveaux éléments"
-#: models_imports.py:408 models_imports.py:465
+#: models_imports.py:422 models_imports.py:479
msgid "Concatenate with existing"
msgstr "Concaténer avec l'existant"
-#: models_imports.py:410 models_imports.py:467
+#: models_imports.py:424 models_imports.py:481
msgid "Concatenate character"
msgstr "Caractère de concaténation"
-#: models_imports.py:415
+#: models_imports.py:429
msgid "Importer - Duplicate field"
msgstr "Importeur - Champ dupliqué"
-#: models_imports.py:416
+#: models_imports.py:430
msgid "Importer - Duplicate fields"
msgstr "Importeur - Champs dupliqués"
-#: models_imports.py:434
+#: models_imports.py:448
msgid "Regular expression"
msgstr "Expression régulière"
-#: models_imports.py:438
+#: models_imports.py:452
msgid "Importer - Regular expression"
msgstr "Importeur - Expression régulière"
-#: models_imports.py:439
+#: models_imports.py:453
msgid "Importer - Regular expressions"
msgstr "Importeur - Expressions régulières"
-#: models_imports.py:473
+#: models_imports.py:487
msgid "Importer - Target"
msgstr "Importeur - Cible"
-#: models_imports.py:474
+#: models_imports.py:488
msgid "Importer - Targets"
msgstr "Importeur - Cibles"
-#: models_imports.py:511 views_item.py:740
+#: models_imports.py:525 views_item.py:830
msgid "True"
msgstr "Oui"
-#: models_imports.py:512 views_item.py:742
+#: models_imports.py:526 views_item.py:832
msgid "False"
msgstr "Non"
-#: models_imports.py:524
+#: models_imports.py:538
msgid "All users can use it"
msgstr "Tous les utilisateurs peuvent l'utiliser"
-#: models_imports.py:526
+#: models_imports.py:540
msgid "All users can modify it"
msgstr "Tous les utilisateurs peuvent le modifier"
-#: models_imports.py:531
+#: models_imports.py:545
msgid "Importer - Target key group"
msgstr "Importeur - Groupe de clé de rapprochement"
-#: models_imports.py:532
+#: models_imports.py:546
msgid "Importer - Target key groups"
msgstr "Importeur - Groupes de clé de rapprochement"
-#: models_imports.py:551
+#: models_imports.py:565
msgid "Is set"
msgstr "Est défini"
-#: models_imports.py:559
+#: models_imports.py:573
msgid "Importer - Target key"
msgstr "Importeur - Clé de rapprochement"
-#: models_imports.py:560
+#: models_imports.py:574
msgid "Importer - Targets keys"
msgstr "Importeur - Clés de rapprochement"
-#: models_imports.py:623
+#: models_imports.py:637
msgid "Period"
msgstr "Période"
-#: models_imports.py:624
+#: models_imports.py:638
msgid "Report state"
msgstr "État de rapport"
-#: models_imports.py:625
+#: models_imports.py:639
msgid "Remain type"
msgstr "Type de vestige"
-#: models_imports.py:626
+#: models_imports.py:640
msgid "Unit"
msgstr "Unité"
-#: models_imports.py:628
+#: models_imports.py:642
msgid "Activity type"
msgstr "Type d'activité"
-#: models_imports.py:630
+#: models_imports.py:644
msgid "Documentation type"
msgstr "Type de documentation"
-#: models_imports.py:631
+#: models_imports.py:645
msgid "Material"
msgstr "Matériau"
-#: models_imports.py:633
+#: models_imports.py:647
msgid "Conservatory state"
msgstr "État de conservation"
-#: models_imports.py:634
+#: models_imports.py:648
msgid "Container type"
msgstr "Type de contenant"
-#: models_imports.py:636
+#: models_imports.py:650
msgid "Warehouse division"
msgstr "Division de lieu de conservation"
-#: models_imports.py:637
+#: models_imports.py:651
msgid "Warehouse type"
msgstr "Type de lieu de conservation"
-#: models_imports.py:638
+#: models_imports.py:652
msgid "Treatment type"
msgstr "Type de traitement"
-#: models_imports.py:640
+#: models_imports.py:654
msgid "Treatment emergency type"
msgstr "Type d'urgence de traitement"
-#: models_imports.py:641
+#: models_imports.py:655
msgid "Object type"
msgstr "Type d'objet"
-#: models_imports.py:642
+#: models_imports.py:656
msgid "Integrity type"
msgstr "Type d'intégrité"
-#: models_imports.py:644
+#: models_imports.py:658
msgid "Remarkability type"
msgstr "Type de remarquabilité"
-#: models_imports.py:645
+#: models_imports.py:659
msgid "Alteration type"
msgstr "Type d'altération"
-#: models_imports.py:647
+#: models_imports.py:661
msgid "Alteration cause type"
msgstr "Type de cause d'altération"
-#: models_imports.py:648
+#: models_imports.py:662
msgid "Batch type"
msgstr "Type de lot"
-#: models_imports.py:650
+#: models_imports.py:663
+#, fuzzy
+#| msgid "Phone type"
+msgid "Checked type"
+msgstr "Type de téléphone"
+
+#: models_imports.py:665
msgid "Identification type"
msgstr "Type d'identification"
-#: models_imports.py:652
+#: models_imports.py:667
msgid "Context record relation type"
msgstr "Type de relations entre Unités d'Enregistrement"
-#: models_imports.py:663
+#: models_imports.py:678
msgid "String"
msgstr "Chaîne de caractères"
-#: models_imports.py:666
+#: models_imports.py:681
#: templates/ishtar/dashboards/dashboard_main_detail.html:196
msgid "Year"
msgstr "Année"
-#: models_imports.py:667
+#: models_imports.py:682
msgid "INSEE code"
msgstr "Code INSEE"
-#: models_imports.py:668
+#: models_imports.py:683
msgid "String to boolean"
msgstr "Chaîne de caractères vers booléen"
-#: models_imports.py:669
+#: models_imports.py:684
msgctxt "filesystem"
msgid "File"
msgstr "Fichier"
-#: models_imports.py:670
+#: models_imports.py:685
msgid "Unknow type"
msgstr "Type inconnu"
-#: models_imports.py:687
+#: models_imports.py:702
msgid "4 digit year. e.g.: \"2015\""
msgstr "Année sur 4 chiffres. Exemple : « 2015 »"
-#: models_imports.py:688
+#: models_imports.py:703
msgid "4 digit year/month/day. e.g.: \"2015/02/04\""
msgstr "Année sur 4 chiffres/mois/jour. Exemple : « 2015/02/04 »"
-#: models_imports.py:689
+#: models_imports.py:704
msgid "Day/month/4 digit year. e.g.: \"04/02/2015\""
msgstr "Jour/mois/année sur 4 chiffres. Exemple : « 04/02/2015 »"
-#: models_imports.py:705
+#: models_imports.py:720
msgid "Options"
msgstr "Options"
-#: models_imports.py:707
+#: models_imports.py:722
msgid "Split character(s)"
msgstr "Caractère(s) de séparation"
-#: models_imports.py:712
+#: models_imports.py:727
msgid "Importer - Formater type"
msgstr "Importeur - Type de mise en forme"
-#: models_imports.py:713
+#: models_imports.py:728
msgid "Importer - Formater types"
msgstr "Importeur - Types de mise en forme"
-#: models_imports.py:769
+#: models_imports.py:784
#: templates/ishtar/dashboards/dashboard_main_detail.html:132
msgid "Created"
msgstr "Créé"
-#: models_imports.py:770
+#: models_imports.py:785
msgid "Analyse in progress"
msgstr "Analyse en cours"
-#: models_imports.py:771
+#: models_imports.py:786
msgid "Analysed"
msgstr "Analysé"
-#: models_imports.py:772
+#: models_imports.py:787
msgid "Check modified in queue"
msgstr "Vérification des modifications dans la file"
-#: models_imports.py:773
+#: models_imports.py:788
msgid "Import in queue"
msgstr "Import en file d'attente"
-#: models_imports.py:774
+#: models_imports.py:789
msgid "Check modified in progress"
msgstr "Vérification des modifications en cours"
-#: models_imports.py:775
+#: models_imports.py:790
msgid "Import in progress"
msgstr "Import en cours"
-#: models_imports.py:776
+#: models_imports.py:791
msgid "Partially imported"
msgstr "Importé partiellement"
-#: models_imports.py:779
+#: models_imports.py:794
msgid "Archived"
msgstr "Archivé"
-#: models_imports.py:815
+#: models_imports.py:830
msgid "Imported file"
msgstr "Fichier importé"
-#: models_imports.py:817
+#: models_imports.py:832
msgid "Associated images (zip file)"
msgstr "Images associées (fichier zip)"
-#: models_imports.py:821
+#: models_imports.py:836
msgid "If a group is selected, target key saved in this group will be used."
msgstr ""
"Si un groupe est sélectionné, les clés de rapprochement enregistrées dans ce "
"groupe sont utilisées."
-#: models_imports.py:824
+#: models_imports.py:839
msgid "Encoding"
msgstr "Codage"
-#: models_imports.py:827
+#: models_imports.py:842
msgid "Skip lines"
msgstr "Nombre de lignes d'entête"
-#: models_imports.py:828
+#: models_imports.py:843
msgid "Number of header lines in your file (can be 0)."
msgstr "Nombre de ligne d'entête dans votre fichier (peut être égal à zéro)"
-#: models_imports.py:829
+#: models_imports.py:844
msgid "Error file"
msgstr "Fichier erreur"
-#: models_imports.py:832
+#: models_imports.py:847
msgid "Result file"
msgstr "Fichier résultant"
-#: models_imports.py:835
+#: models_imports.py:850
msgid "Match file"
msgstr "Fichier de correspondance"
-#: models_imports.py:841
+#: models_imports.py:856
msgid "Conservative import"
msgstr "Import conservateur"
-#: models_imports.py:842
+#: models_imports.py:857
msgid "If set to true, do not overload existing values."
msgstr "Si coché, ne surchargera pas les valeurs existantes."
-#: models_imports.py:845
+#: models_imports.py:860
msgid "End date"
msgstr "Date de fin"
-#: models_imports.py:848
+#: models_imports.py:863
msgid "Remaining seconds"
msgstr "Secondes restantes"
-#: models_imports.py:850
+#: models_imports.py:865
msgid "Current line"
msgstr "Ligne actuelle"
-#: models_imports.py:852
+#: models_imports.py:867
msgid "Number of line"
msgstr "Nombre de lignes"
-#: models_imports.py:855
+#: models_imports.py:870
msgid "Imported line numbers"
msgstr "Numéros des lignes importées"
-#: models_imports.py:858
+#: models_imports.py:873
msgid "Changed have been checked"
msgstr "Les changements ont été vérifiés"
-#: models_imports.py:861
+#: models_imports.py:876
msgid "Changed line numbers"
msgstr "Numéro des lignes modifiées"
-#: models_imports.py:866
+#: models_imports.py:881
msgid "Import"
msgstr "Import"
-#: models_imports.py:955
+#: models_imports.py:970
msgid "Analyse"
msgstr "Analyser"
-#: models_imports.py:957 models_imports.py:966
+#: models_imports.py:972 models_imports.py:981
msgid "Re-analyse"
msgstr "Analyser de nouveau "
-#: models_imports.py:958
+#: models_imports.py:973
msgid "Launch import"
msgstr "Lancer l'import"
-#: models_imports.py:961
+#: models_imports.py:976
msgid "Step by step import"
msgstr "Import pas à pas"
-#: models_imports.py:962 models_imports.py:971
+#: models_imports.py:977 models_imports.py:986
msgid "Re-check for changes"
msgstr "Re-vérifier les changements"
-#: models_imports.py:964 models_imports.py:973
+#: models_imports.py:979 models_imports.py:988
msgid "Check for changes"
msgstr "Vérifier les changements"
-#: models_imports.py:967
+#: models_imports.py:982
msgid "Re-import"
msgstr "Ré-importer"
-#: models_imports.py:970
+#: models_imports.py:985
msgid "Step by step re-import"
msgstr "Ré-import pas à pas"
-#: models_imports.py:974
+#: models_imports.py:989
msgid "Archive"
msgstr "Archiver"
-#: models_imports.py:976
+#: models_imports.py:991
msgid "Unarchive"
msgstr "Désarchiver"
-#: models_imports.py:977 templates/ishtar/form_delete.html:11 widgets.py:371
-#: widgets.py:403
+#: models_imports.py:992 templates/ishtar/form_delete.html:11 views.py:1829
+#: widgets.py:371 widgets.py:403
msgid "Delete"
msgstr "Supprimer"
-#: models_imports.py:1046
+#: models_imports.py:1042
+#, fuzzy
+#| msgid "Error file"
+msgid "Error in the CSV file."
+msgstr "Fichier erreur"
+
+#: models_imports.py:1070
msgid "Modification check {} added to the queue"
msgstr "Vérification des changements {} ajoutée à la file d'attente"
-#: models_imports.py:1116
+#: models_imports.py:1140
msgid "Import {} added to the queue"
msgstr "Import {} ajouté à la file d'attente"
-#: models_imports.py:1134
+#: models_imports.py:1158
msgid "Error on imported file: {}"
msgstr "Erreur sur le fichier d'import : {}"
-#: models_imports.py:1169
+#: models_imports.py:1193
msgid "Import {} finished with errors"
msgstr "Import {} fini avec des erreurs"
-#: models_imports.py:1178
+#: models_imports.py:1202
msgid "Import {} finished with no errors"
msgstr "Import {} fini avec aucune erreur"
-#: templates/404.html:14
+#: templates/404.html:3
msgid "Page not found"
msgstr "Page non trouvée"
-#: templates/404.html:15
+#: templates/500.html:22
+msgid "An error has occured. The support team has been warned."
+msgstr ""
+
+#: templates/500.html:24
msgid "Back to main page"
msgstr "Retour à la page principale"
@@ -2482,12 +2656,12 @@ msgid "View on site"
msgstr "Voir sur le site"
#: templates/admin/change_form.html:24 templates/admin/change_form.html:27
-#: views.py:1167 views.py:1172
+#: views.py:1213 views.py:1218
msgid "Previous"
msgstr "Précédent"
#: templates/admin/change_form.html:32 templates/admin/change_form.html:35
-#: views.py:1175 views.py:1178
+#: views.py:1221 views.py:1224
msgid "Next"
msgstr "Suivant"
@@ -2500,127 +2674,137 @@ msgstr "Ajouter %(name)s"
msgid "Import from CSV"
msgstr "Import depuis un CSV"
-#: templates/base.html:40
-msgid "Searches in the shortcut menu deal with all items."
-msgstr ""
-"Les recherches dans le menu de raccourci concernent tous les éléments."
+#: templates/admin/profiletype_summary_change_list.html:4
+#, fuzzy
+#| msgid "Profile type"
+msgid "Profile type Summary"
+msgstr "Type de profil"
#: templates/base.html:41
+msgid "Searches in the shortcut menu deal with all items."
+msgstr "Les recherches dans le menu de raccourci concernent tous les éléments."
+
+#: templates/base.html:42
msgid "Searches in the shortcut menu deal with only your items."
msgstr ""
"Les recherches dans le menu de raccourci ne concernent que vos éléments."
-#: templates/base.html:42
+#: templates/base.html:43
+#, fuzzy
+#| msgid "%d item(s) created."
+msgid " items added."
+msgstr "%d élément(s) créés."
+
+#: templates/base.html:44
msgid "yes"
msgstr "oui"
-#: templates/base.html:43
+#: templates/base.html:45
msgid "no"
msgstr "non"
-#: templates/base.html:44
+#: templates/base.html:46
msgid "Autorefresh start. The form is disabled."
msgstr "Rafraîchissement automatique activé. Le formulaire est désactivé."
-#: templates/base.html:45
+#: templates/base.html:47
msgid "Autorefresh end. The form is re-enabled."
msgstr "Rafraîchissement automatique désactivé. Le formulaire est ré-activé."
-#: templates/base.html:68
+#: templates/base.html:73
msgid "Current items"
msgstr "Éléments courants"
-#: templates/base.html:70 templates/ishtar/manage_basket.html:4
+#: templates/base.html:75 templates/ishtar/forms/qa_base.html:34
+#: templates/ishtar/forms/qa_form.html:21 templates/ishtar/manage_basket.html:4
#: templates/welcome.html:11 templates/welcome.html:12
#: templates/welcome.html:13 templates/welcome.html:14 wizards.py:423
msgid ":"
msgstr " :"
-#: templates/base.html:83
+#: templates/base.html:88
msgid "Sheets"
msgstr "Fiches"
-#: templates/base.html:133
+#: templates/base.html:138
msgid "Processing..."
msgstr "En traitement..."
-#: templates/base.html:135
+#: templates/base.html:140
msgid "This can be long."
msgstr "Cela peut être long."
-#: templates/base.html:137
+#: templates/base.html:142
msgid "Time to take a coffee?"
msgstr "Il est peut-être temps de prendre un café ?"
-#: templates/base.html:139
+#: templates/base.html:144
msgid "Time to take another coffee?"
msgstr "Pourquoi pas un autre café ?"
-#: templates/blocks/DataTables.html:15 templates/blocks/JQueryJqGrid.html:16
-msgid "Pinned search:"
-msgstr "Recherche épinglée :"
-
-#: templates/blocks/DataTables.html:53
+#: templates/blocks/DataTables.html:47
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:39
msgid "Expand table"
msgstr "Agrandir le tableau"
-#: templates/blocks/DataTables.html:59 templates/blocks/JQueryJqGrid.html:26
+#: templates/blocks/DataTables.html:53 templates/blocks/JQueryJqGrid.html:26
+#: templates/ishtar/blocks/window_nav.html:59
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:45
msgid "Export"
msgstr "Exporter"
-#: templates/blocks/DataTables.html:62 templates/blocks/DataTables.html:65
+#: templates/blocks/DataTables.html:56 templates/blocks/DataTables.html:59
#: templates/blocks/JQueryJqGrid.html:29 templates/blocks/JQueryJqGrid.html:32
msgid "Export as CSV - "
msgstr "Export en CSV - "
-#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:29
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:6
+#: templates/blocks/DataTables.html:56 templates/blocks/JQueryJqGrid.html:29
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:7
msgid "simple"
msgstr "simple"
-#: templates/blocks/DataTables.html:62
+#: templates/blocks/DataTables.html:56
msgid "Simple CSV"
msgstr "CSV simple"
-#: templates/blocks/DataTables.html:63 templates/blocks/JQueryJqGrid.html:30
+#: templates/blocks/DataTables.html:57 templates/blocks/JQueryJqGrid.html:30
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:48
msgid "Export as CSV - full"
msgstr "Export en CSV - complet"
-#: templates/blocks/DataTables.html:63 templates/blocks/JQueryJqGrid.html:30
+#: templates/blocks/DataTables.html:57 templates/blocks/JQueryJqGrid.html:30
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:48
msgid "CSV full"
msgstr "CSV complet"
-#: templates/blocks/DataTables.html:68 templates/blocks/JQueryJqGrid.html:35
+#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:35
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:47
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:50
msgid "Export as CSV"
msgstr "Export en CSV"
-#: templates/blocks/DataTables.html:68 templates/blocks/JQueryJqGrid.html:29
+#: templates/blocks/DataTables.html:62 templates/blocks/JQueryJqGrid.html:29
#: templates/blocks/JQueryJqGrid.html:35
#: templates/ishtar/blocks/window_tables/dynamic_documents.html:47
msgid "CSV"
msgstr "CSV"
-#: templates/blocks/DataTables.html:75 templates/blocks/JQueryJqGrid.html:42
-#: templates/blocks/bs_form_snippet.html:59
-#: templates/blocks/bs_form_snippet.html:98
-#: templates/ishtar/manage_basket.html:13 templates/window.html:39
+#: templates/blocks/DataTables.html:69 templates/blocks/JQueryJqGrid.html:42
+#: templates/blocks/bs_form_snippet.html:88
+#: templates/ishtar/manage_basket.html:14 templates/window.html:39
msgid "Add"
msgstr "Ajouter"
-#: templates/blocks/DataTables.html:171
+#: templates/blocks/DataTables.html:177
msgid "Select all items"
msgstr "Sélectionner tous les éléments"
-#: templates/blocks/DataTables.html:172
-msgid "Select none"
-msgstr "Ne sélectionner aucun élément"
+#: templates/blocks/DataTables.html:182
+#, fuzzy
+#| msgid "Hide selected"
+msgid "Deselect"
+msgstr "Cacher les éléments sélectionnés"
#: templates/blocks/JQueryAdvancedTown.html:3
msgctxt "Region"
@@ -2635,29 +2819,31 @@ msgstr "Choisissez une région"
msgid "Search and select an item"
msgstr "Rechercher puis sélectionner un élément"
+#: templates/blocks/JQueryJqGrid.html:16
+msgid "Pinned search:"
+msgstr "Recherche épinglée :"
+
#: templates/blocks/JQueryJqGrid.html:116
msgid "An error as occured during search. Check your query fields."
msgstr ""
"Une erreur est intervenue sur cette recherche. Vérifiez la pertinence de vos "
"critères de recherche."
-#: templates/blocks/bs_form_snippet.html:25
+#: templates/blocks/bs_form_snippet.html:26
msgid "help"
msgstr "aide"
-#: templates/blocks/bs_form_snippet.html:47
+#: templates/blocks/bs_form_snippet.html:48
msgid "Criteria search"
msgstr "Recherche par critère"
-#: templates/blocks/bs_form_snippet.html:62
-#: templates/blocks/bs_form_snippet.html:101
+#: templates/blocks/bs_form_snippet.html:91
#: templates/widgets/search_input.html:17
msgid "Clear"
msgstr "Effacer"
-#: templates/blocks/bs_form_snippet.html:64
-#: templates/blocks/bs_form_snippet.html:103
-#: templates/ishtar/manage_basket.html:24 templates/ishtar/sheet.html:49
+#: templates/blocks/bs_form_snippet.html:93
+#: templates/ishtar/manage_basket.html:28 templates/ishtar/sheet.html:49
msgid "Close"
msgstr "Fermer"
@@ -2677,9 +2863,9 @@ msgstr "."
msgid "Show / hide advanced search"
msgstr "Afficher/cacher la recherche avancée"
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:6
-#: templates/ishtar/blocks/shortcut_menu.html:11
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/shortcut_menu.html:20
msgid ""
"Simple menu limited to your own items. Be careful only the last 100 items "
"are displayed."
@@ -2687,26 +2873,31 @@ msgstr ""
"Menu simple limité à vos propres éléments. Attention seuls les 100 derniers "
"éléments sont affichés."
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
-#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:8
+#: templates/ishtar/blocks/shortcut_menu.html:8
msgid "Advanced menu"
msgstr "Menu avancé"
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:7
-#: templates/ishtar/blocks/shortcut_menu.html:7
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:8
+#: templates/ishtar/blocks/shortcut_menu.html:8
msgid "advanced"
msgstr "avancé"
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:11
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:12
msgid "Search within my items"
msgstr "Rechercher parmi mes éléments"
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:16
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:17
msgid "Search within all items"
msgstr "Rechercher parmi tous les éléments"
-#: templates/ishtar/blocks/advanced_shortcut_menu.html:42
-#: templates/ishtar/blocks/shortcut_menu.html:30
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:31
+#: templates/ishtar/blocks/shortcut_menu.html:13
+msgid "Refresh current page"
+msgstr ""
+
+#: templates/ishtar/blocks/advanced_shortcut_menu.html:51
+#: templates/ishtar/blocks/shortcut_menu.html:39
msgid "Unpin"
msgstr "Désépingler"
@@ -2734,12 +2925,13 @@ msgid ""
"Powered by <a href=\"https://ishtar-archeo.net/\">Ishtar</a> v%(VERSION)s - "
"a free software under AGPL v3 license."
msgstr ""
-"Propulsé par <a href=\"https://ishtar-archeo.net/\">Ishtar</a> v%(VERSION)s -"
-" logiciel libre sous licence AGPL v3."
+"Propulsé par <a href=\"https://ishtar-archeo.net/\">Ishtar</a> v%(VERSION)s "
+"- logiciel libre sous licence AGPL v3."
#: templates/ishtar/blocks/modify_toolbar.html:1
#: templates/ishtar/blocks/window_image.html:11
-#: templates/ishtar/blocks/window_nav.html:44
+#: templates/ishtar/blocks/window_nav.html:47
+#: templates/ishtar/forms/qa_base.html:57
#: templates/ishtar/organization_form.html:37
#: templates/ishtar/organization_person_form.html:32
#: templates/ishtar/person_form.html:43
@@ -2769,7 +2961,8 @@ msgid "Licenses"
msgstr "Licences"
#: templates/ishtar/blocks/window_image_detail.html:111
-#: templates/ishtar/import_delete.html:20 views_item.py:458 wizards.py:393
+#: templates/ishtar/import_delete.html:20 templatetags/window_field.py:17
+#: views_item.py:473 wizards.py:393
msgid "Yes"
msgstr "Oui"
@@ -2794,27 +2987,28 @@ msgstr ""
msgid "Restore this version"
msgstr "Restaurer cette version"
-#: templates/ishtar/blocks/window_nav.html:34
-msgid "Actions"
-msgstr "Actions"
+#: templates/ishtar/blocks/window_nav.html:36
+#: templates/ishtar/blocks/window_nav.html:38
+msgid "Pin"
+msgstr "Épingler"
-#: templates/ishtar/blocks/window_nav.html:37
+#: templates/ishtar/blocks/window_nav.html:38
msgid "Item pined in your shortcut menu."
msgstr "Cet élément a été épinglé dans votre menu de raccourcis."
-#: templates/ishtar/blocks/window_nav.html:37
-msgid "Pin"
-msgstr "Épingler"
+#: templates/ishtar/blocks/window_nav.html:43
+msgid "Actions"
+msgstr "Actions"
-#: templates/ishtar/blocks/window_nav.html:55
+#: templates/ishtar/blocks/window_nav.html:61
msgid "Export as OpenOffice.org file"
msgstr "Exporter en fichier OpenOffice.org"
-#: templates/ishtar/blocks/window_nav.html:58
+#: templates/ishtar/blocks/window_nav.html:64
msgid "Export as PDF file"
msgstr "Exporter en fichier PDF"
-#: templates/ishtar/blocks/window_nav.html:66
+#: templates/ishtar/blocks/window_nav.html:72
msgid "Relation between items are not historized."
msgstr "Les relations entre éléments ne sont pas historisées."
@@ -2924,6 +3118,29 @@ msgstr "Rechercher et sélectionner un élément dans le tableau"
msgid "Validate"
msgstr "Valider"
+#: templates/ishtar/forms/bookmark_delete.html:5
+#, fuzzy
+#| msgid "Are you sure you want to delete?"
+msgid "Are you sure you want to delete: "
+msgstr "Êtes-vous sûr de vouloir supprimer ?"
+
+#: templates/ishtar/forms/qa_base.html:25
+#: templates/ishtar/forms/qa_form.html:12
+#, fuzzy
+#| msgid "Modified"
+msgid "Modified items"
+msgstr "Modifié"
+
+#: templates/ishtar/forms/qa_base.html:62
+#: templates/ishtar/import_step_by_step.html:126
+#: templates/ishtar/import_step_by_step.html:305
+#: templates/ishtar/organization_form.html:40
+#: templates/ishtar/organization_person_form.html:35
+#: templates/ishtar/person_form.html:46
+#: templates/ishtar/wizard/validation_bar.html:20
+msgid "Cancel"
+msgstr "Annuler"
+
#: templates/ishtar/forms/search_query.html:5
#: templates/widgets/search_input.html:26
msgid "Bookmark this search"
@@ -2937,8 +3154,10 @@ msgid "New"
msgstr "Nouveau"
#: templates/ishtar/forms/success.html:20
-msgid "Form successfully submited"
-msgstr "Formulaire soumis avec succès"
+#, fuzzy
+#| msgid "Password reset successfully"
+msgid "Changes made successfully."
+msgstr "Mot de passe réinitialisé"
#: templates/ishtar/formset_import_match.html:5
#: templates/ishtar/formset_import_match.html:54
@@ -2998,7 +3217,7 @@ msgstr "Ligne"
msgid "Go"
msgstr "Aller"
-#: templates/ishtar/import_step_by_step.html:63 views.py:1017
+#: templates/ishtar/import_step_by_step.html:63 views.py:1063
msgid "Import step by step"
msgstr "Import pas à pas"
@@ -3046,15 +3265,6 @@ msgstr "Nouvelle valeur"
msgid "Update source file"
msgstr "Mettre à jour le fichier source"
-#: templates/ishtar/import_step_by_step.html:126
-#: templates/ishtar/import_step_by_step.html:305
-#: templates/ishtar/organization_form.html:40
-#: templates/ishtar/organization_person_form.html:35
-#: templates/ishtar/person_form.html:46
-#: templates/ishtar/wizard/validation_bar.html:20
-msgid "Cancel"
-msgstr "Annuler"
-
#: templates/ishtar/import_step_by_step.html:148
msgid "No change for this item."
msgstr "Pas de changement pour cet élément."
@@ -3156,11 +3366,11 @@ msgctxt "not a directory"
msgid "File"
msgstr "Fichier"
-#: templates/ishtar/manage_basket.html:8
+#: templates/ishtar/manage_basket.html:9
msgid "Checking \"Select all\" only selects the current page."
msgstr "Cocher « Tout sélectionner » sélectionne seulement la page courante."
-#: templates/ishtar/manage_basket.html:16
+#: templates/ishtar/manage_basket.html:19
msgid "Basket content"
msgstr "Contenu du panier"
@@ -3249,21 +3459,27 @@ msgstr "Organisation associée"
msgid "Associated operations as scientist"
msgstr "Opérations associées en tant que responsable scientifique"
-#: templates/ishtar/sheet_person.html:86
+#: templates/ishtar/sheet_person.html:87
msgid "Associated operations as responsible"
msgstr "Opérations associées en tant que responsable"
-#: templates/ishtar/sheet_person.html:91
+#: templates/ishtar/sheet_person.html:92
+#, fuzzy
+#| msgid "Associated operations as scientist"
+msgid "Associated operations as collaborator"
+msgstr "Opérations associées en tant que responsable scientifique"
+
+#: templates/ishtar/sheet_person.html:97
#: templates/ishtar/wizard/wizard_person_deletion.html:6
msgid "In charge of archaeological files"
msgstr "Responsable des dossiers"
-#: templates/ishtar/sheet_person.html:96
+#: templates/ishtar/sheet_person.html:102
#: templates/ishtar/wizard/wizard_person_deletion.html:15
msgid "General contractor of archaeological files"
msgstr "Aménageur des dossiers"
-#: templates/ishtar/sheet_person.html:101
+#: templates/ishtar/sheet_person.html:107
#: templates/ishtar/wizard/wizard_person_deletion.html:24
msgid "Responsible for planning service of archaeological files"
msgstr "Responsable pour le service instructeur des dossiers"
@@ -3582,11 +3798,15 @@ msgstr "Critère"
msgid "Bookmarks"
msgstr "Marque-pages"
-#: templatetags/window_tables.py:88 widgets.py:1039
+#: templatetags/window_field.py:22 wizards.py:395
+msgid "No"
+msgstr "Non"
+
+#: templatetags/window_tables.py:88 widgets.py:1061
msgid "No results"
msgstr "Pas de résultats"
-#: templatetags/window_tables.py:89 widgets.py:1040
+#: templatetags/window_tables.py:89 widgets.py:1062
msgid "Loading..."
msgstr "Chargement..."
@@ -3595,19 +3815,19 @@ msgid "You don't have sufficient permissions to do this action."
msgstr ""
"Vous n'avez pas les permissions suffisantes pour effectuer cette action."
-#: utils.py:265
+#: utils.py:338
msgid " (...)"
msgstr " (...)"
-#: utils.py:338
+#: utils.py:418
msgid "Information"
msgstr "Information"
-#: utils.py:339
+#: utils.py:419
msgid "Load another random image?"
msgstr "Charger une autre image au hasard ?"
-#: views.py:82
+#: views.py:83
msgid ""
"PROJECT_SLUG is set to \"default\". Change it in your local_settings (or ask "
"your admin to do it)."
@@ -3616,7 +3836,7 @@ msgstr ""
"default ». Changez-le sur la page d'administration (ou demandez à un "
"administrateur de le faire)."
-#: views.py:87
+#: views.py:88
msgid ""
"The slug of your current profile is set to \"default\". Change it on the "
"administration page (or ask your admin to do it)."
@@ -3624,135 +3844,141 @@ msgstr ""
"PROJECT_SLUG a été laissé à la valeur « default ». Changez-le dans le "
"fichier local_settings (ou demandez à un administrateur de le faire)."
-#: views.py:113
+#: views.py:114
msgid "New person"
msgstr "Ajouter une personne"
-#: views.py:121
+#: views.py:122
msgid "Person modification"
msgstr "Modifier une personne"
-#: views.py:136
+#: views.py:137
msgid "Person deletion"
msgstr "Supprimer une personne"
-#: views.py:147
+#: views.py:148
msgid "New organization"
msgstr "Ajouter une organisation"
-#: views.py:154
+#: views.py:155
msgid "Organization modification"
msgstr "Modifier une organisation"
-#: views.py:170
+#: views.py:171
msgid "Organization deletion"
msgstr "Supprimer une organisation"
-#: views.py:181
+#: views.py:182
msgid "Account management"
msgstr "Gérer les comptes"
-#: views.py:187
+#: views.py:188
msgid "Account deletion"
msgstr "Supprimer un compte"
-#: views.py:251
+#: views.py:252
msgid "Archaeological file"
msgstr "Dossier"
-#: views.py:252
-msgid "Operation"
-msgstr "Opération"
-
-#: views.py:254
-msgid "Context record"
-msgstr "Unité d'Enregistrement"
-
-#: views.py:256
-msgid "Find"
-msgstr "Mobilier"
+#: views.py:259
+#, fuzzy
+#| msgid "Warehouse type"
+msgid "Warehouse"
+msgstr "Type de lieu de conservation"
-#: views.py:258
+#: views.py:263
msgid "Treatment request"
msgstr "Demande de traitement"
-#: views.py:259
+#: views.py:264
msgid "Treatment"
msgstr "Traitement"
-#: views.py:661 views_item.py:91
+#: views.py:706 views_item.py:95
msgid "Operation not permitted."
msgstr "Opération non permise."
-#: views.py:678 views.py:736
+#: views.py:723 views.py:781
msgid "Archaeological files"
msgstr "Dossiers"
-#: views.py:683 views.py:747
+#: views.py:728 views.py:792
msgid "Finds"
msgstr "Mobilier"
-#: views.py:685 views.py:752
+#: views.py:730 views.py:797
msgid "Treatment requests"
msgstr "Demandes de traitement"
-#: views.py:686 views.py:758
+#: views.py:731 views.py:803
msgid "Treatments"
msgstr "Traitements"
-#: views.py:1359
+#: views.py:1405
msgid "Col. "
msgstr "Col."
-#: views.py:1365 views.py:1377
+#: views.py:1411 views.py:1423
msgid "* empty *"
msgstr "* vide *"
-#: views.py:1418
+#: views.py:1464
msgid "Link unmatched items"
msgstr "Associer les éléments non rapprochés"
-#: views.py:1439
+#: views.py:1485
msgid "Delete import"
msgstr "Supprimer un import"
-#: views.py:1478
+#: views.py:1524
msgid "Merge persons"
msgstr "Fusionner des personnes"
-#: views.py:1502
+#: views.py:1548
msgid "Select the main person"
msgstr "Choisir la personne principale"
-#: views.py:1511
+#: views.py:1557
msgid "Merge organization"
msgstr "Fusionner des organisations"
-#: views.py:1521
+#: views.py:1567
msgid "Select the main organization"
msgstr "Sélectionner l'organisation principale"
-#: views.py:1561 views.py:1577
+#: views.py:1607 views.py:1623
msgid "Corporation manager"
msgstr "Représentant de la personne morale"
-#: views.py:1598
+#: views.py:1644
msgid "Document: search"
msgstr "Document : recherche"
-#: views.py:1613
+#: views.py:1659
msgid "Document creation"
msgstr "Document : création"
-#: views.py:1646
+#: views.py:1692
msgid "Document modification"
msgstr "Document : modification"
-#: views.py:1676
+#: views.py:1722
msgid "Document deletion"
msgstr "Document : suppression"
-#: views_item.py:93
+#: views.py:1805
+#, fuzzy
+#| msgid "Delete import"
+msgid "Delete bookmark"
+msgstr "Supprimer un import"
+
+#: views.py:1828
+#, fuzzy
+#| msgid "Bookmarks"
+msgid "Bookmark - Delete"
+msgstr "Marque-pages"
+
+#: views_item.py:97
#, python-format
msgid "New %s"
msgstr "Nouveau %s"
@@ -3761,31 +3987,33 @@ msgstr "Nouveau %s"
msgid "The character \" is not accepted."
msgstr "Le caractère \" n'est pas accepté"
-#: widgets.py:509
+#: widgets.py:513
msgid "{} is not a valid key for {}"
msgstr "{} n’est pas une valeur valide pour {}"
-#: widgets.py:610 widgets.py:744 widgets.py:859
+#: widgets.py:614 widgets.py:748 widgets.py:863
msgid "Search..."
msgstr "Recherche..."
-#: widgets.py:679
+#: widgets.py:683
msgid "Previous value:"
msgstr "Valeur précédente :"
-#: widgets.py:1041
+#: widgets.py:1063
msgid "Remove"
msgstr "Enlever"
-#: wizards.py:395
-msgid "No"
-msgstr "Non"
-
#: wizards.py:431
msgid "Deleted"
msgstr "Supprimé"
-#: wizards.py:1717
+#: wizards.py:1742
#, python-format
msgid "[%(app_name)s] Account creation/modification"
msgstr "[%(app_name)s] Création/modification du compte"
+
+#~ msgid "Select none"
+#~ msgstr "Ne sélectionner aucun élément"
+
+#~ msgid "Form successfully submited"
+#~ msgstr "Formulaire soumis avec succès"
diff --git a/version.py b/version.py
index 0f47065bd..0b8249431 100644
--- a/version.py
+++ b/version.py
@@ -1,5 +1,5 @@
-# 2.1.master.11
-VERSION = (2, 1, 'master', 11)
+# 2.1.dev.15
+VERSION = (2, 1, 'dev', 15)
def get_version():
diff --git a/zanata.xml b/zanata.xml
index 3adbba1f6..2c34f6147 100644
--- a/zanata.xml
+++ b/zanata.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config xmlns="http://zanata.org/namespace/config/">
- <url>https://translate.zanata.org/zanata/</url>
+ <url>https://translate.zanata.org/</url>
<project>ishtar</project>
<project-type>gettext</project-type>
<src-dir>pot</src-dir>