diff options
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 > +         <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"> +         <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 }} <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 Binary files differindex acda588fb..ffd697841 100755..100644 --- a/example_project/media/upload/templates/document_reference.odt +++ b/example_project/media/upload/templates/document_reference.odt 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 = "│ "      PREFIX_EMPTY = "  "      PREFIX_MEDIUM = "├ " @@ -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">×</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>   -    <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">×</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">×</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 ":" %} </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 ":" %} </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">></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"{} – {}".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"{} – {}".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>  | 
