summaryrefslogtreecommitdiff
path: root/ishtar_common
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/admin.py8
-rw-r--r--ishtar_common/context_processors.py14
-rw-r--r--ishtar_common/fixtures/groups_person_types-SRA-fr.json22
-rw-r--r--ishtar_common/locale/django.pot525
-rw-r--r--ishtar_common/management/commands/update_specific_importers.py7
-rw-r--r--ishtar_common/menu_base.py31
-rw-r--r--ishtar_common/migrations/0048_auto__add_ishtarsiteprofile.py374
-rw-r--r--ishtar_common/models.py174
-rw-r--r--ishtar_common/static/media/style.css2
-rw-r--r--ishtar_common/templates/blocks/comma_list.html1
-rw-r--r--ishtar_common/templates/ishtar/blocks/window_tables/static_documents.html11
-rw-r--r--ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html2
-rw-r--r--ishtar_common/templates/ishtar/sheet_person.html6
-rw-r--r--ishtar_common/templates/sheet_ope.html6
-rw-r--r--ishtar_common/templatetags/window_tables.py54
-rw-r--r--ishtar_common/tests.py156
-rw-r--r--ishtar_common/utils.py3
-rw-r--r--ishtar_common/views.py39
-rw-r--r--ishtar_common/widgets.py18
19 files changed, 1051 insertions, 402 deletions
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index f8cc34208..b7ad530b7 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -93,6 +93,14 @@ admin.site.unregister(Group)
admin.site.register(Group, MyGroupAdmin)
+class IshtarSiteProfileAdmin(admin.ModelAdmin):
+ list_display = ('label', 'slug', 'active', 'files', 'context_record',
+ 'find', 'warehouse')
+ model = models.IshtarSiteProfile
+
+admin.site.register(models.IshtarSiteProfile, IshtarSiteProfileAdmin)
+
+
class DepartmentAdmin(admin.ModelAdmin):
list_display = ('number', 'label',)
model = models.Department
diff --git a/ishtar_common/context_processors.py b/ishtar_common/context_processors.py
index ce303c344..03ba9bc36 100644
--- a/ishtar_common/context_processors.py
+++ b/ishtar_common/context_processors.py
@@ -25,18 +25,20 @@ from ishtar_common.utils import shortify
from menus import Menu
+from ishtar_common.models import get_current_profile
from archaeological_operations.models import Operation
+from archaeological_files.models import File
+from archaeological_context_records.models import ContextRecord
+from archaeological_finds.models import Find
+profile = get_current_profile()
CURRENT_ITEMS = []
-if 'archaeological_files' in settings.INSTALLED_APPS:
- from archaeological_files.models import File
+if profile.files:
CURRENT_ITEMS.append((_(u"Archaeological file"), File))
CURRENT_ITEMS.append((_(u"Operation"), Operation))
-if 'archaeological_context_records' in settings.INSTALLED_APPS:
- from archaeological_context_records.models import ContextRecord
+if profile.context_record:
CURRENT_ITEMS.append((_(u"Context record"), ContextRecord))
-if 'archaeological_finds' in settings.INSTALLED_APPS:
- from archaeological_finds.models import Find
+if profile.find:
CURRENT_ITEMS.append((_(u"Find"), Find))
diff --git a/ishtar_common/fixtures/groups_person_types-SRA-fr.json b/ishtar_common/fixtures/groups_person_types-SRA-fr.json
index 6a3044cdd..92fabaccd 100644
--- a/ishtar_common/fixtures/groups_person_types-SRA-fr.json
+++ b/ishtar_common/fixtures/groups_person_types-SRA-fr.json
@@ -112,7 +112,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_contextrecord",
- "name": "Can view all Context Record",
+ "name": "Can view all Context Records",
"content_type": 50
}
},
@@ -382,7 +382,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_file",
- "name": "Can view all Archaelogical file",
+ "name": "Can view all Archaelogical files",
"content_type": 29
}
},
@@ -589,7 +589,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_basefind",
- "name": "Can view all Base find",
+ "name": "Can view all Base finds",
"content_type": 58
}
},
@@ -688,7 +688,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_find",
- "name": "Can view all Find",
+ "name": "Can view all Finds",
"content_type": 60
}
},
@@ -931,7 +931,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_treatment",
- "name": "Can view all Treatment",
+ "name": "Can view all Treatments",
"content_type": 64
}
},
@@ -1075,7 +1075,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_administrativeact",
- "name": "Can view all Administrative act",
+ "name": "Can view all Administrative acts",
"content_type": 40
}
},
@@ -1147,7 +1147,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_archaeologicalsite",
- "name": "Can view all Archaeological site",
+ "name": "Can view all Archaeological sites",
"content_type": 69
}
},
@@ -1282,7 +1282,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_operation",
- "name": "Can view all Operation",
+ "name": "Can view all Operations",
"content_type": 35
}
},
@@ -1381,7 +1381,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_operationsource",
- "name": "Can view all Operation source",
+ "name": "Can view all Operation sources",
"content_type": 37
}
},
@@ -1624,7 +1624,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_warehouse",
- "name": "Can view all Warehouse",
+ "name": "Can view all Warehouses",
"content_type": 53
}
},
@@ -2038,7 +2038,7 @@
"model": "auth.permission",
"fields": {
"codename": "view_organization",
- "name": "Can view all Organization",
+ "name": "Can view all Organizations",
"content_type": 15
}
},
diff --git a/ishtar_common/locale/django.pot b/ishtar_common/locale/django.pot
index bb230179f..6f2d58879 100644
--- a/ishtar_common/locale/django.pot
+++ b/ishtar_common/locale/django.pot
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the Ishtar package.
# Étienne Loks <etienne.loks at peacefrogs net>, 2010-2015.
# Étienne Loks <etienne.loks@iggdrasil.net>, 2015. #zanata
+# Valérie-Emma Leroux <emma@iggdrasil.net>, 2016. #zanata
# Étienne Loks <etienne.loks@iggdrasil.net>, 2016. #zanata
msgid ""
msgstr ""
@@ -19,19 +20,19 @@ msgstr ""
msgid "Related item"
msgstr ""
-#: context_processors.py:33
+#: context_processors.py:37
msgid "Archaeological file"
msgstr ""
-#: context_processors.py:34 models.py:1178
+#: context_processors.py:38 models.py:1251
msgid "Operation"
msgstr ""
-#: context_processors.py:37
+#: context_processors.py:40
msgid "Context record"
msgstr ""
-#: context_processors.py:40
+#: context_processors.py:42
msgid "Find"
msgstr ""
@@ -170,12 +171,12 @@ msgstr ""
msgid "Add a new item"
msgstr ""
-#: forms.py:171 models.py:993
+#: forms.py:171 models.py:1058
msgid "Template"
msgstr ""
#: forms_common.py:39 forms_common.py:57 forms_common.py:169
-#: forms_common.py:269 forms_common.py:274 models.py:1059 models.py:2274
+#: forms_common.py:269 forms_common.py:274 models.py:1124 models.py:2340
#: templates/blocks/JQueryAdvancedTown.html:19
#: templates/ishtar/sheet_organization.html:17
msgid "Town"
@@ -191,64 +192,64 @@ msgid ""
"french town Saint-Denis in the Seine-Saint-Denis department.</p>"
msgstr ""
-#: forms_common.py:66 forms_common.py:648 ishtar_menu.py:42 models.py:1973
-#: models.py:2102 models.py:2156 templates/ishtar/sheet_person.html:6
+#: forms_common.py:66 forms_common.py:648 ishtar_menu.py:42 models.py:2039
+#: models.py:2168 models.py:2222 templates/ishtar/sheet_person.html:6
msgid "Person"
msgstr ""
-#: forms_common.py:157 forms_common.py:231 ishtar_menu.py:66 models.py:1895
+#: forms_common.py:157 forms_common.py:231 ishtar_menu.py:66 models.py:1961
#: templates/ishtar/sheet_organization.html:6
msgid "Organization"
msgstr ""
#: forms_common.py:160 forms_common.py:196 forms_common.py:226
-#: forms_common.py:259 models.py:992 models.py:1228 models.py:1445
-#: models.py:1889 models.py:1963 models.py:2260
+#: forms_common.py:259 models.py:775 models.py:1057 models.py:1293
+#: models.py:1511 models.py:1955 models.py:2029 models.py:2326
#: templates/ishtar/sheet_organization.html:12
#: templates/ishtar/sheet_organization.html:25
msgid "Name"
msgstr ""
-#: forms_common.py:161 models.py:1173 models.py:1576
+#: forms_common.py:161 models.py:1238 models.py:1642
msgid "Organization type"
msgstr ""
-#: forms_common.py:163 forms_common.py:263 models.py:1054
+#: forms_common.py:163 forms_common.py:263 models.py:1119
#: templates/ishtar/sheet_organization.html:14
msgid "Address"
msgstr ""
-#: forms_common.py:165 forms_common.py:265 models.py:1055
+#: forms_common.py:165 forms_common.py:265 models.py:1120
#: templates/ishtar/sheet_organization.html:15
msgid "Address complement"
msgstr ""
-#: forms_common.py:167 forms_common.py:267 models.py:1057
+#: forms_common.py:167 forms_common.py:267 models.py:1122
#: templates/ishtar/sheet_organization.html:16
msgid "Postal code"
msgstr ""
-#: forms_common.py:170 forms_common.py:270 models.py:1060
+#: forms_common.py:170 forms_common.py:270 models.py:1125
msgid "Country"
msgstr ""
#: forms_common.py:172 forms_common.py:228 forms_common.py:272
-#: forms_common.py:376 models.py:1066
+#: forms_common.py:376 models.py:1131
msgid "Email"
msgstr ""
-#: forms_common.py:173 forms_common.py:273 models.py:1062
+#: forms_common.py:173 forms_common.py:273 models.py:1127
#: templates/ishtar/sheet_organization.html:18
msgid "Phone"
msgstr ""
-#: forms_common.py:174 models.py:1063
+#: forms_common.py:174 models.py:1128
#: templates/ishtar/sheet_organization.html:19
msgid "Mobile phone"
msgstr ""
-#: forms_common.py:197 forms_common.py:229 models.py:1600 models.py:1891
-#: models.py:2197 templates/sheet_ope.html:85 templates/sheet_ope.html.py:105
+#: forms_common.py:197 forms_common.py:229 models.py:1666 models.py:1957
+#: models.py:2263 templates/sheet_ope.html:85 templates/sheet_ope.html.py:105
#: templates/sheet_ope.html:126 templates/ishtar/import_list.html:13
#: templates/ishtar/sheet_organization.html:27
#: templates/ishtar/sheet_person.html:56
@@ -256,16 +257,16 @@ msgstr ""
msgid "Type"
msgstr ""
-#: forms_common.py:206 views.py:109
+#: forms_common.py:206 views.py:114
msgid "Organization search"
msgstr ""
-#: forms_common.py:227 forms_common.py:257 models.py:1961
+#: forms_common.py:227 forms_common.py:257 models.py:2027
#: templates/ishtar/sheet_organization.html:26
msgid "Surname"
msgstr ""
-#: forms_common.py:243 views.py:83
+#: forms_common.py:243 views.py:88
msgid "Person search"
msgstr ""
@@ -273,14 +274,14 @@ msgstr ""
msgid "Identity"
msgstr ""
-#: forms_common.py:256 forms_common.py:574 forms_common.py:615 models.py:1959
-#: models.py:2194 templates/sheet_ope.html:104
+#: forms_common.py:256 forms_common.py:574 forms_common.py:615 models.py:2025
+#: models.py:2260 templates/sheet_ope.html:104
#: templates/ishtar/sheet_person.html:55
#: templates/ishtar/blocks/window_tables/documents.html:5
msgid "Title"
msgstr ""
-#: forms_common.py:261 models.py:1965
+#: forms_common.py:261 models.py:2031
msgid "Raw name"
msgstr ""
@@ -288,7 +289,7 @@ msgstr ""
msgid "Current organization"
msgstr ""
-#: forms_common.py:325 forms_common.py:355 forms_common.py:359 models.py:1943
+#: forms_common.py:325 forms_common.py:355 forms_common.py:359 models.py:2009
msgid "Person type"
msgstr ""
@@ -296,7 +297,7 @@ msgstr ""
msgid "Account"
msgstr ""
-#: forms_common.py:379 wizards.py:1146
+#: forms_common.py:379 wizards.py:1154
msgid "New password"
msgstr ""
@@ -320,7 +321,7 @@ msgstr ""
msgid "Send the new password by email?"
msgstr ""
-#: forms_common.py:430 forms_common.py:443 models.py:2275
+#: forms_common.py:430 forms_common.py:443 models.py:2341
msgid "Towns"
msgstr ""
@@ -336,7 +337,7 @@ msgstr ""
msgid "Documentation informations"
msgstr ""
-#: forms_common.py:576 forms_common.py:616 models.py:1577 models.py:2177
+#: forms_common.py:576 forms_common.py:616 models.py:1643 models.py:2243
msgid "Source type"
msgstr ""
@@ -348,41 +349,41 @@ msgstr ""
msgid "Internal reference"
msgstr ""
-#: forms_common.py:584 models.py:2208
+#: forms_common.py:584 models.py:2274
msgid "Numerical ressource (web address)"
msgstr ""
-#: forms_common.py:585 models.py:2210
+#: forms_common.py:585 models.py:2276
msgid "Receipt date"
msgstr ""
-#: forms_common.py:587 models.py:1727 models.py:2212
+#: forms_common.py:587 models.py:1793 models.py:2278
msgid "Creation date"
msgstr ""
-#: forms_common.py:590 models.py:2215
+#: forms_common.py:590 models.py:2281
msgid "Receipt date in documentation"
msgstr ""
-#: forms_common.py:592 forms_common.py:620 models.py:260 models.py:1472
-#: models.py:2222
+#: forms_common.py:592 forms_common.py:620 models.py:277 models.py:1538
+#: models.py:2288
msgid "Comment"
msgstr ""
-#: forms_common.py:594 forms_common.py:619 models.py:1232 models.py:1404
-#: models.py:1446 models.py:2221 templates/sheet_ope.html:128
+#: forms_common.py:594 forms_common.py:619 models.py:777 models.py:1297
+#: models.py:1470 models.py:1512 models.py:2287 templates/sheet_ope.html:128
msgid "Description"
msgstr ""
-#: forms_common.py:597 models.py:2223
+#: forms_common.py:597 models.py:2289
msgid "Additional information"
msgstr ""
-#: forms_common.py:599 forms_common.py:623 models.py:2225
+#: forms_common.py:599 forms_common.py:623 models.py:2291
msgid "Has a duplicate"
msgstr ""
-#: forms_common.py:612 forms_common.py:641 forms_common.py:674 models.py:2161
+#: forms_common.py:612 forms_common.py:641 forms_common.py:674 models.py:2227
#: templates/ishtar/wizard/wizard_person_deletion.html:124
msgid "Author"
msgstr ""
@@ -395,7 +396,7 @@ msgstr ""
msgid "Would you like to delete this documentation?"
msgstr ""
-#: forms_common.py:649 models.py:1578 models.py:2151 models.py:2158
+#: forms_common.py:649 models.py:1644 models.py:2217 models.py:2224
msgid "Author type"
msgstr ""
@@ -407,7 +408,7 @@ msgstr ""
msgid "There are identical authors."
msgstr ""
-#: forms_common.py:685 models.py:2162 models.py:2204
+#: forms_common.py:685 models.py:2228 models.py:2270
#: templates/sheet_ope.html:106
#: templates/ishtar/blocks/window_tables/documents.html:7
msgid "Authors"
@@ -417,11 +418,11 @@ msgstr ""
msgid "Administration"
msgstr ""
-#: ishtar_menu.py:31 views.py:135
+#: ishtar_menu.py:31 views.py:140
msgid "Account management"
msgstr ""
-#: ishtar_menu.py:34 models.py:776 views.py:1116
+#: ishtar_menu.py:34 models.py:853 views.py:1115
msgid "Global variables"
msgstr ""
@@ -445,19 +446,19 @@ msgstr ""
msgid "Merge"
msgstr ""
-#: ishtar_menu.py:61 ishtar_menu.py:88 models.py:1764 widgets.py:110
+#: ishtar_menu.py:61 ishtar_menu.py:88 models.py:1830 widgets.py:110
msgid "Delete"
msgstr ""
-#: ishtar_menu.py:96 models.py:1738
+#: ishtar_menu.py:96 models.py:1804
msgid "Imports"
msgstr ""
-#: ishtar_menu.py:99 views.py:1124
+#: ishtar_menu.py:99 views.py:1123
msgid "New import"
msgstr ""
-#: ishtar_menu.py:103 views.py:1138
+#: ishtar_menu.py:103 views.py:1137
msgid "Current imports"
msgstr ""
@@ -470,690 +471,726 @@ msgid "Not a valid item."
msgstr ""
#: models.py:191
-msgid "An item selected is not a valid item."
+msgid "A selected item is not a valid item."
msgstr ""
#: models.py:202
-msgid "This item already exist."
+msgid "This item already exists."
msgstr ""
-#: models.py:256 models.py:1027 models.py:1039
+#: models.py:273 models.py:1092 models.py:1104
msgid "Label"
msgstr ""
-#: models.py:258
+#: models.py:275
msgid "Textual ID"
msgstr ""
-#: models.py:261 models.py:996
+#: models.py:278 models.py:1061
msgid "Available"
msgstr ""
-#: models.py:474 models.py:1518
+#: models.py:479 models.py:1584
msgid "Key"
msgstr ""
-#: models.py:480
-msgid "Key specific to an import"
+#: models.py:485
+msgid "Specific key to an import"
msgstr ""
-#: models.py:551
+#: models.py:556
msgid "Last editor"
msgstr ""
-#: models.py:554
+#: models.py:559
msgid "Creator"
msgstr ""
-#: models.py:687 models.py:2286
+#: models.py:692 models.py:2352
msgid "Order"
msgstr ""
-#: models.py:688
+#: models.py:693
msgid "Symmetrical"
msgstr ""
-#: models.py:701
+#: models.py:706
msgid "Cannot have symmetrical and an inverse_relation"
msgstr ""
-#: models.py:769
+#: models.py:776 models.py:1295
+msgid "Slug"
+msgstr ""
+
+#: models.py:778
+msgid "Files module"
+msgstr ""
+
+#: models.py:779
+msgid "Context records module"
+msgstr ""
+
+#: models.py:781
+msgid "Finds module"
+msgstr ""
+
+#: models.py:782
+msgid "Need context records module"
+msgstr ""
+
+#: models.py:784
+msgid "Warehouses module"
+msgstr ""
+
+#: models.py:785
+msgid "Need finds module"
+msgstr ""
+
+#: models.py:786
+msgid "Current active"
+msgstr ""
+
+#: models.py:789
+msgid "Ishtar site profile"
+msgstr ""
+
+#: models.py:790
+msgid "Ishtar site profiles"
+msgstr ""
+
+#: models.py:846
msgid "Variable name"
msgstr ""
-#: models.py:770
+#: models.py:847
msgid "Description of the variable"
msgstr ""
-#: models.py:772 models.py:1519
+#: models.py:849 models.py:1585
msgid "Value"
msgstr ""
-#: models.py:775
+#: models.py:852
msgid "Global variable"
msgstr ""
-#: models.py:897 models.py:927
+#: models.py:962 models.py:992
msgid "Total"
msgstr ""
-#: models.py:904 models.py:1028 models.py:1040
+#: models.py:969 models.py:1093 models.py:1105
#: templates/ishtar/dashboards/dashboard_main_detail.html:135
#: templates/ishtar/dashboards/dashboard_main_detail_users.html:26
msgid "Number"
msgstr ""
-#: models.py:991
+#: models.py:1056
msgid "Administrative Act"
msgstr ""
-#: models.py:995
+#: models.py:1060
msgid "Associated object"
msgstr ""
-#: models.py:999
+#: models.py:1064
msgid "Document template"
msgstr ""
-#: models.py:1000
+#: models.py:1065
msgid "Document templates"
msgstr ""
-#: models.py:1031 models.py:1041 models.py:1722
+#: models.py:1096 models.py:1106 models.py:1788
msgid "State"
msgstr ""
-#: models.py:1045 templates/blocks/JQueryAdvancedTown.html:12
+#: models.py:1110 templates/blocks/JQueryAdvancedTown.html:12
msgid "Department"
msgstr ""
-#: models.py:1046
+#: models.py:1111
msgid "Departments"
msgstr ""
-#: models.py:1100
+#: models.py:1165
msgid "Tel: "
msgstr ""
-#: models.py:1104
+#: models.py:1169
msgid "Mobile: "
msgstr ""
-#: models.py:1108
+#: models.py:1173
msgid "Email: "
msgstr ""
-#: models.py:1113
+#: models.py:1178
msgid "Merge key"
msgstr ""
-#: models.py:1174
+#: models.py:1239
msgid "Organization types"
msgstr ""
-#: models.py:1180
+#: models.py:1253
msgid "Archaeological site"
msgstr ""
-#: models.py:1181
+#: models.py:1254
msgid "Parcels"
msgstr ""
-#: models.py:1183
+#: models.py:1256
msgid "Operation source"
msgstr ""
-#: models.py:1189 views.py:931 views.py:988
+#: models.py:1259 views.py:940 views.py:991
msgid "Archaeological files"
msgstr ""
-#: models.py:1196 views.py:934 views.py:998
+#: models.py:1261 views.py:943 views.py:999
msgid "Context records"
msgstr ""
-#: models.py:1199 views.py:936 views.py:1003
+#: models.py:1263 views.py:945 views.py:1002
msgid "Finds"
msgstr ""
-#: models.py:1230
-msgid "Slug"
-msgstr ""
-
-#: models.py:1234 templates/ishtar/dashboards/dashboard_main.html:26
+#: models.py:1299 templates/ishtar/dashboards/dashboard_main.html:26
msgid "Users"
msgstr ""
-#: models.py:1236
+#: models.py:1301
msgid "Associated model"
msgstr ""
-#: models.py:1238
+#: models.py:1304
msgid "Is template"
msgstr ""
-#: models.py:1239
+#: models.py:1305
msgid "Unicity keys (separator \";\")"
msgstr ""
-#: models.py:1243
+#: models.py:1309
msgid "Importer - Type"
msgstr ""
-#: models.py:1244
+#: models.py:1310
msgid "Importer - Types"
msgstr ""
-#: models.py:1334
+#: models.py:1400
msgid "Importer - Default"
msgstr ""
-#: models.py:1335
+#: models.py:1401
msgid "Importer - Defaults"
msgstr ""
-#: models.py:1370
+#: models.py:1436
msgid "Importer - Default value"
msgstr ""
-#: models.py:1371
+#: models.py:1437
msgid "Importer - Default values"
msgstr ""
-#: models.py:1403
+#: models.py:1469
msgid "Column number"
msgstr ""
-#: models.py:1406
+#: models.py:1472
msgid "Required"
msgstr ""
-#: models.py:1409
+#: models.py:1475
msgid "Importer - Column"
msgstr ""
-#: models.py:1410
+#: models.py:1476
msgid "Importer - Columns"
msgstr ""
-#: models.py:1430
+#: models.py:1496
msgid "Field name"
msgstr ""
-#: models.py:1432 models.py:1466
-msgid "Force creation of new item"
+#: models.py:1498 models.py:1532
+msgid "Force creation of new items"
msgstr ""
-#: models.py:1434 models.py:1468
+#: models.py:1500 models.py:1534
msgid "Concatenate with existing"
msgstr ""
-#: models.py:1436 models.py:1470
+#: models.py:1502 models.py:1536
msgid "Concatenate character"
msgstr ""
-#: models.py:1440
+#: models.py:1506
msgid "Importer - Duplicate field"
msgstr ""
-#: models.py:1441
+#: models.py:1507
msgid "Importer - Duplicate fields"
msgstr ""
-#: models.py:1448
+#: models.py:1514
msgid "Regular expression"
msgstr ""
-#: models.py:1451
+#: models.py:1517
msgid "Importer - Regular expression"
msgstr ""
-#: models.py:1452
+#: models.py:1518
msgid "Importer - Regular expressions"
msgstr ""
-#: models.py:1475
+#: models.py:1541
msgid "Importer - Target"
msgstr ""
-#: models.py:1476
+#: models.py:1542
msgid "Importer - Targets"
msgstr ""
-#: models.py:1500 views.py:306
+#: models.py:1566 views.py:311
msgid "True"
msgstr ""
-#: models.py:1501 views.py:308
+#: models.py:1567 views.py:313
msgid "False"
msgstr ""
-#: models.py:1520
+#: models.py:1586
msgid "Is set"
msgstr ""
-#: models.py:1527
+#: models.py:1593
msgid "Importer - Target key"
msgstr ""
-#: models.py:1528
+#: models.py:1594
msgid "Importer - Targets keys"
msgstr ""
-#: models.py:1579 models.py:2189 models.py:2200
+#: models.py:1645 models.py:2255 models.py:2266
msgid "Format"
msgstr ""
-#: models.py:1580 models.py:2290
+#: models.py:1646 models.py:2356
msgid "Operation type"
msgstr ""
-#: models.py:1581
+#: models.py:1647
msgid "Period"
msgstr ""
-#: models.py:1582
+#: models.py:1648
msgid "Unit"
msgstr ""
-#: models.py:1583
+#: models.py:1649
msgid "Material"
msgstr ""
-#: models.py:1585
+#: models.py:1651
msgid "Conservatory state"
msgstr ""
-#: models.py:1586
+#: models.py:1652
msgid "Preservation type"
msgstr ""
-#: models.py:1587
+#: models.py:1653
msgid "Object type"
msgstr ""
-#: models.py:1589
+#: models.py:1655
msgid "Identification type"
msgstr ""
-#: models.py:1590 models.py:2183
+#: models.py:1656 models.py:2249
msgid "Support type"
msgstr ""
-#: models.py:1596
+#: models.py:1662
msgid "Integer"
msgstr ""
-#: models.py:1597
+#: models.py:1663
msgid "Float"
msgstr ""
-#: models.py:1598
+#: models.py:1664
msgid "String"
msgstr ""
-#: models.py:1599 templates/sheet_ope.html:86
+#: models.py:1665 templates/sheet_ope.html:86
msgid "Date"
msgstr ""
-#: models.py:1601 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83
+#: models.py:1667 templates/sheet_ope.html:61 templates/sheet_ope.html.py:83
#: templates/ishtar/sheet_person.html:54
#: templates/ishtar/dashboards/dashboard_main_detail.html:120
msgid "Year"
msgstr ""
-#: models.py:1602
+#: models.py:1668
msgid "String to boolean"
msgstr ""
-#: models.py:1603
+#: models.py:1669
msgctxt "filesystem"
msgid "File"
msgstr ""
-#: models.py:1604
+#: models.py:1670
msgid "Unknow type"
msgstr ""
-#: models.py:1620
+#: models.py:1686
msgid "4 digit year. e.g.: \"2015\""
msgstr ""
-#: models.py:1621
+#: models.py:1687
msgid "4 digit year/month/day. e.g.: \"2015/02/04\""
msgstr ""
-#: models.py:1622
+#: models.py:1688
msgid "Day/month/4 digit year. e.g.: \"04/02/2015\""
msgstr ""
-#: models.py:1632
+#: models.py:1698
msgid "Options"
msgstr ""
-#: models.py:1634
+#: models.py:1700
msgid "Split character(s)"
msgstr ""
-#: models.py:1638
+#: models.py:1704
msgid "Importer - Formater type"
msgstr ""
-#: models.py:1639
+#: models.py:1705
msgid "Importer - Formater types"
msgstr ""
-#: models.py:1686 templates/ishtar/dashboards/dashboard_main_detail.html:61
+#: models.py:1752 templates/ishtar/dashboards/dashboard_main_detail.html:61
msgid "Created"
msgstr ""
-#: models.py:1687
+#: models.py:1753
msgid "Analyse in progress"
msgstr ""
-#: models.py:1688
+#: models.py:1754
msgid "Analysed"
msgstr ""
-#: models.py:1689
+#: models.py:1755
msgid "Import pending"
msgstr ""
-#: models.py:1690
+#: models.py:1756
msgid "Import in progress"
msgstr ""
-#: models.py:1691
+#: models.py:1757
msgid "Finished with errors"
msgstr ""
-#: models.py:1692
+#: models.py:1758
msgid "Finished"
msgstr ""
-#: models.py:1693
+#: models.py:1759
msgid "Archived"
msgstr ""
-#: models.py:1705
+#: models.py:1771
msgid "Imported file"
msgstr ""
-#: models.py:1708
+#: models.py:1774
msgid "Associated images (zip file)"
msgstr ""
-#: models.py:1710
+#: models.py:1776
msgid "Encoding"
msgstr ""
-#: models.py:1712
+#: models.py:1778
msgid "Skip lines"
msgstr ""
-#: models.py:1713 templates/ishtar/import_list.html:47
+#: models.py:1779 templates/ishtar/import_list.html:47
msgid "Error file"
msgstr ""
-#: models.py:1716
+#: models.py:1782
msgid "Result file"
msgstr ""
-#: models.py:1719 templates/ishtar/import_list.html:53
+#: models.py:1785 templates/ishtar/import_list.html:53
msgid "Match file"
msgstr ""
-#: models.py:1725
+#: models.py:1791
msgid "Conservative import"
msgstr ""
-#: models.py:1730
+#: models.py:1796
msgid "End date"
msgstr ""
-#: models.py:1732
-msgid "Seconds remaining"
+#: models.py:1798
+msgid "Remaining seconds"
msgstr ""
-#: models.py:1737
+#: models.py:1803
msgid "Import"
msgstr ""
-#: models.py:1754
+#: models.py:1820
msgid "Analyse"
msgstr ""
-#: models.py:1756 models.py:1759
+#: models.py:1822 models.py:1825
msgid "Re-analyse"
msgstr ""
-#: models.py:1757
+#: models.py:1823
msgid "Launch import"
msgstr ""
-#: models.py:1760
+#: models.py:1826
msgid "Re-import"
msgstr ""
-#: models.py:1761
+#: models.py:1827
msgid "Archive"
msgstr ""
-#: models.py:1763
+#: models.py:1829
msgid "Unarchive"
msgstr ""
-#: models.py:1896
+#: models.py:1962
msgid "Organizations"
msgstr ""
-#: models.py:1898
-msgid "Can view all Organization"
+#: models.py:1964
+msgid "Can view all Organizations"
msgstr ""
-#: models.py:1899
+#: models.py:1965
msgid "Can view own Organization"
msgstr ""
-#: models.py:1900
+#: models.py:1966
msgid "Can add own Organization"
msgstr ""
-#: models.py:1902
+#: models.py:1968
msgid "Can change own Organization"
msgstr ""
-#: models.py:1904
+#: models.py:1970
msgid "Can delete own Organization"
msgstr ""
-#: models.py:1939
+#: models.py:2005
msgid "Groups"
msgstr ""
-#: models.py:1944
+#: models.py:2010
msgid "Person types"
msgstr ""
-#: models.py:1951
+#: models.py:2017
msgid "Mr"
msgstr ""
-#: models.py:1952
+#: models.py:2018
msgid "Miss"
msgstr ""
-#: models.py:1953
-msgid "Mr and Miss"
+#: models.py:2019
+msgid "Mr and Mrs"
msgstr ""
-#: models.py:1954
+#: models.py:2020
msgid "Mrs"
msgstr ""
-#: models.py:1955
+#: models.py:2021
msgid "Doctor"
msgstr ""
-#: models.py:1967 models.py:2014
+#: models.py:2033 models.py:2080
msgid "Types"
msgstr ""
-#: models.py:1970
+#: models.py:2036
msgid "Is attached to"
msgstr ""
-#: models.py:1974
+#: models.py:2040
msgid "Persons"
msgstr ""
-#: models.py:1976
-msgid "Can view all Person"
+#: models.py:2042
+msgid "Can view all Persons"
msgstr ""
-#: models.py:1977
+#: models.py:2043
msgid "Can view own Person"
msgstr ""
-#: models.py:1978
+#: models.py:2044
msgid "Can add own Person"
msgstr ""
-#: models.py:1979
+#: models.py:2045
msgid "Can change own Person"
msgstr ""
-#: models.py:1980
+#: models.py:2046
msgid "Can delete own Person"
msgstr ""
-#: models.py:2106
+#: models.py:2172
msgid "Ishtar user"
msgstr ""
-#: models.py:2107
+#: models.py:2173
msgid "Ishtar users"
msgstr ""
-#: models.py:2152
+#: models.py:2218
msgid "Author types"
msgstr ""
-#: models.py:2178
+#: models.py:2244
msgid "Source types"
msgstr ""
-#: models.py:2184
+#: models.py:2250
msgid "Support types"
msgstr ""
-#: models.py:2190
+#: models.py:2256
msgid "Formats"
msgstr ""
-#: models.py:2195
+#: models.py:2261
msgid "External ID"
msgstr ""
-#: models.py:2198
+#: models.py:2264
msgid "Support"
msgstr ""
-#: models.py:2202
+#: models.py:2268
msgid "Scale"
msgstr ""
-#: models.py:2216
+#: models.py:2282
msgid "Item number"
msgstr ""
-#: models.py:2217
+#: models.py:2283
msgid "Ref."
msgstr ""
-#: models.py:2220
+#: models.py:2286
msgid "Internal ref."
msgstr ""
-#: models.py:2261
+#: models.py:2327
msgid "Surface (m2)"
msgstr ""
-#: models.py:2262 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107
+#: models.py:2328 templates/sheet_ope.html:46 templates/sheet_ope.html.py:107
msgid "Localisation"
msgstr ""
-#: models.py:2287
+#: models.py:2353
msgid "Is preventive"
msgstr ""
-#: models.py:2291
+#: models.py:2357
msgid "Operation types"
msgstr ""
-#: models.py:2317
+#: models.py:2383
msgid "Preventive"
msgstr ""
-#: models.py:2318
+#: models.py:2384
msgid "Research"
msgstr ""
-#: utils.py:50
+#: utils.py:51
msgid " (...)"
msgstr ""
-#: views.py:90
+#: views.py:95
msgid "New person"
msgstr ""
-#: views.py:98
+#: views.py:103
msgid "Person modification"
msgstr ""
-#: views.py:104
+#: views.py:109
msgid "Person deletion"
msgstr ""
-#: views.py:115
+#: views.py:120
msgid "New organization"
msgstr ""
-#: views.py:122
+#: views.py:127
msgid "Organization modification"
msgstr ""
-#: views.py:128
+#: views.py:133
msgid "Organization deletion"
msgstr ""
-#: views.py:632 templates/base.html:80
+#: views.py:637 templates/base.html:80
#: templates/ishtar/sheet_organization.html:35
#: templatetags/link_to_window.py:16
msgid "Details"
msgstr ""
-#: views.py:860 views.py:914
+#: views.py:868 views.py:922
msgid "Operation not permitted."
msgstr ""
-#: views.py:862
+#: views.py:870
#, python-format
msgid "New %s"
msgstr ""
-#: views.py:932 views.py:992
+#: views.py:941 views.py:995
msgid "Operations"
msgstr ""
-#: views.py:1185 templates/ishtar/import_list.html:43
+#: views.py:1184 templates/ishtar/import_list.html:43
msgid "Link unmatched items"
msgstr ""
-#: views.py:1200
+#: views.py:1199
msgid "Delete import"
msgstr ""
-#: views.py:1259 views.py:1275
+#: views.py:1258 views.py:1274
msgid "Corporation manager"
msgstr ""
@@ -1161,27 +1198,27 @@ msgstr ""
msgid "Search..."
msgstr ""
-#: widgets.py:596 templatetags/window_tables.py:72
+#: widgets.py:602 templatetags/window_tables.py:80
msgid "No results"
msgstr ""
-#: widgets.py:597 templatetags/window_tables.py:73
+#: widgets.py:603 templatetags/window_tables.py:81
msgid "Loading..."
msgstr ""
-#: widgets.py:598
+#: widgets.py:604
msgid "Remove"
msgstr ""
-#: wizards.py:317 templates/ishtar/import_delete.html:20
+#: wizards.py:318 templates/ishtar/import_delete.html:20
msgid "Yes"
msgstr ""
-#: wizards.py:319
+#: wizards.py:320
msgid "No"
msgstr ""
-#: wizards.py:1203
+#: wizards.py:1211
#, python-format
msgid "[%(app_name)s] Account creation/modification"
msgstr ""
@@ -1465,7 +1502,7 @@ msgid "No document associated to this operation"
msgstr ""
#: templates/sheet_ope.html:121 templates/sheet_ope.html.py:123
-msgid "Recording Units"
+msgid "Context Records"
msgstr ""
#: templates/sheet_ope.html:125
@@ -1477,7 +1514,7 @@ msgid "Chronology"
msgstr ""
#: templates/sheet_ope.html:142
-msgid "No recording unit associated to this operation"
+msgid "No context record associated to this operation"
msgstr ""
#: templates/window.html:38 templates/blocks/JQueryJqGrid.html:25
@@ -1522,6 +1559,18 @@ msgstr ""
msgid "An error as occured during search. Check your query fields."
msgstr ""
+#: templates/blocks/comma_list.html:1
+msgid "and"
+msgstr ""
+
+#: templates/blocks/comma_list.html:1
+msgid ", "
+msgstr ""
+
+#: templates/blocks/comma_list.html:1
+msgid "."
+msgstr ""
+
#: templates/blocks/form_flex_snippet.html:10
#: templates/blocks/form_snippet.html:9
msgid "Help"
@@ -1776,7 +1825,7 @@ msgid "Modified"
msgstr ""
#: templates/ishtar/dashboards/dashboard_main_detail.html:108
-msgid "No data for theses criteria."
+msgid "No data for these criteria."
msgstr ""
#: templates/ishtar/dashboards/dashboard_main_detail.html:126
diff --git a/ishtar_common/management/commands/update_specific_importers.py b/ishtar_common/management/commands/update_specific_importers.py
index c5445eb0b..9a13e3f3e 100644
--- a/ishtar_common/management/commands/update_specific_importers.py
+++ b/ishtar_common/management/commands/update_specific_importers.py
@@ -4,14 +4,11 @@
from optparse import make_option
from django.core.management.base import BaseCommand
-from django.conf import settings
IMPORTERS = []
-
-if 'archaeological_files' in settings.INSTALLED_APPS:
- from archaeological_files.data_importer import FileImporterSraPdL
- IMPORTERS.append(FileImporterSraPdL)
+from archaeological_files.data_importer import FileImporterSraPdL
+IMPORTERS.append(FileImporterSraPdL)
class Command(BaseCommand):
diff --git a/ishtar_common/menu_base.py b/ishtar_common/menu_base.py
index ab0a43d41..eb08d8c78 100644
--- a/ishtar_common/menu_base.py
+++ b/ishtar_common/menu_base.py
@@ -17,16 +17,28 @@
# See the file COPYING for details.
+from ishtar_common.models import get_current_profile
+
class SectionItem:
- def __init__(self, idx, label, childs=[]):
+ def __init__(self, idx, label, childs=[], profile_restriction=None):
self.idx = idx
self.label = label
self.childs = childs
self.available = False
self.items = {}
+ self.profile_restriction = profile_restriction
+
+ def check_profile_restriction(self):
+ if self.profile_restriction:
+ profile = get_current_profile()
+ if not getattr(profile, self.profile_restriction):
+ return False
+ return True
def can_be_available(self, user, session=None):
+ if not self.check_profile_restriction():
+ return False
for child in self.childs:
if child.can_be_available(user, session=session):
return True
@@ -50,14 +62,27 @@ class SectionItem:
class MenuItem:
- def __init__(self, idx, label, model=None, access_controls=[]):
+ def __init__(self, idx, label, model=None, access_controls=[],
+ profile_restriction=None):
self.idx = idx
self.label = label
self.model = model
self.access_controls = access_controls
self.available = False
+ self.profile_restriction = profile_restriction
+ if not self.check_profile_restriction():
+ return False
+
+ def check_profile_restriction(self):
+ if self.profile_restriction:
+ profile = get_current_profile()
+ if not getattr(profile, self.profile_restriction):
+ return False
+ return True
def can_be_available(self, user, session=None):
+ if not self.check_profile_restriction():
+ return False
if not self.access_controls:
return True
prefix = (self.model._meta.app_label + '.') if self.model else ''
@@ -75,6 +100,8 @@ class MenuItem:
return False
def is_available(self, user, obj=None, session=None):
+ if not self.check_profile_restriction():
+ return False
if not self.access_controls:
return True
prefix = (self.model._meta.app_label + '.') if self.model else ''
diff --git a/ishtar_common/migrations/0048_auto__add_ishtarsiteprofile.py b/ishtar_common/migrations/0048_auto__add_ishtarsiteprofile.py
new file mode 100644
index 000000000..5a2c21bf1
--- /dev/null
+++ b/ishtar_common/migrations/0048_auto__add_ishtarsiteprofile.py
@@ -0,0 +1,374 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding model 'IshtarSiteProfile'
+ db.create_table('ishtar_common_ishtarsiteprofile', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('label', self.gf('django.db.models.fields.TextField')()),
+ ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50)),
+ ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
+ ('files', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('context_record', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('find', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('warehouse', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ('active', self.gf('django.db.models.fields.BooleanField')(default=False)),
+ ))
+ db.send_create_signal('ishtar_common', ['IshtarSiteProfile'])
+
+
+ def backwards(self, orm):
+ # Deleting model 'IshtarSiteProfile'
+ db.delete_table('ishtar_common_ishtarsiteprofile')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'ishtar_common.arrondissement': {
+ 'Meta': {'object_name': 'Arrondissement'},
+ 'department': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '30'})
+ },
+ 'ishtar_common.author': {
+ 'Meta': {'object_name': 'Author'},
+ 'author_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.AuthorType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'author'", 'to': "orm['ishtar_common.Person']"})
+ },
+ 'ishtar_common.authortype': {
+ 'Meta': {'object_name': 'AuthorType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.canton': {
+ 'Meta': {'object_name': 'Canton'},
+ 'arrondissement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Arrondissement']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '30'})
+ },
+ 'ishtar_common.department': {
+ 'Meta': {'ordering': "['number']", 'object_name': 'Department'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'}),
+ 'state': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.State']", 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.documenttemplate': {
+ 'Meta': {'ordering': "['associated_object_name', 'name']", 'object_name': 'DocumentTemplate'},
+ 'associated_object_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'template': ('django.db.models.fields.files.FileField', [], {'max_length': '100'})
+ },
+ 'ishtar_common.format': {
+ 'Meta': {'object_name': 'Format'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.formatertype': {
+ 'Meta': {'ordering': "('formater_type', 'options')", 'unique_together': "(('formater_type', 'options', 'many_split'),)", 'object_name': 'FormaterType'},
+ 'formater_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'many_split': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'options': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.globalvar': {
+ 'Meta': {'ordering': "['slug']", 'object_name': 'GlobalVar'},
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+ 'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.historicalorganization': {
+ 'Meta': {'ordering': "('-history_date', '-history_id')", 'object_name': 'HistoricalOrganization'},
+ 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+ 'exclude_from_merge': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
+ 'history_creator_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+ 'history_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'history_id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'history_modifier_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+ 'history_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+ 'history_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'blank': 'True'}),
+ 'merge_key': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}),
+ 'organization_type_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
+ 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.import': {
+ 'Meta': {'object_name': 'Import'},
+ 'conservative_import': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'creation_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}),
+ 'encoding': ('django.db.models.fields.CharField', [], {'default': "'utf-8'", 'max_length': '15'}),
+ 'end_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'error_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'imported_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
+ 'imported_images': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.ImporterType']"}),
+ 'match_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'result_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'seconds_remaining': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'skip_lines': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'state': ('django.db.models.fields.CharField', [], {'default': "'C'", 'max_length': '2'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']"})
+ },
+ 'ishtar_common.importercolumn': {
+ 'Meta': {'ordering': "('importer_type', 'col_number')", 'unique_together': "(('importer_type', 'col_number'),)", 'object_name': 'ImporterColumn'},
+ 'col_number': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'columns'", 'to': "orm['ishtar_common.ImporterType']"}),
+ 'regexp_pre_filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Regexp']", 'null': 'True', 'blank': 'True'}),
+ 'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'ishtar_common.importerdefault': {
+ 'Meta': {'object_name': 'ImporterDefault'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'importer_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'defaults'", 'to': "orm['ishtar_common.ImporterType']"}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '500'})
+ },
+ 'ishtar_common.importerdefaultvalues': {
+ 'Meta': {'object_name': 'ImporterDefaultValues'},
+ 'default_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'default_values'", 'to': "orm['ishtar_common.ImporterDefault']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '500'})
+ },
+ 'ishtar_common.importerduplicatefield': {
+ 'Meta': {'object_name': 'ImporterDuplicateField'},
+ 'column': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'duplicate_fields'", 'to': "orm['ishtar_common.ImporterColumn']"}),
+ 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
+ 'field_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+ 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'ishtar_common.importertype': {
+ 'Meta': {'object_name': 'ImporterType'},
+ 'associated_models': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_template': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '100', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+ 'unicity_keys': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'users': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.importtarget': {
+ 'Meta': {'object_name': 'ImportTarget'},
+ 'column': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'targets'", 'to': "orm['ishtar_common.ImporterColumn']"}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'concat': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'concat_str': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
+ 'force_new': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'formater_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.FormaterType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'regexp_filter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Regexp']", 'null': 'True', 'blank': 'True'}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '500'})
+ },
+ 'ishtar_common.ishtarsiteprofile': {
+ 'Meta': {'ordering': "['label']", 'object_name': 'IshtarSiteProfile'},
+ 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'context_record': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'files': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'find': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.TextField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
+ 'warehouse': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'ishtar_common.ishtaruser': {
+ 'Meta': {'object_name': 'IshtarUser', '_ormbases': ['auth.User']},
+ 'person': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ishtaruser'", 'unique': 'True', 'to': "orm['ishtar_common.Person']"}),
+ 'user_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True', 'primary_key': 'True'})
+ },
+ 'ishtar_common.itemkey': {
+ 'Meta': {'object_name': 'ItemKey'},
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'importer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}),
+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'object_id': ('django.db.models.fields.PositiveIntegerField', [], {})
+ },
+ 'ishtar_common.operationtype': {
+ 'Meta': {'ordering': "['-preventive', 'order', 'label']", 'object_name': 'OperationType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
+ 'preventive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.organization': {
+ 'Meta': {'object_name': 'Organization'},
+ 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+ 'exclude_from_merge': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
+ 'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+ 'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_organization'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}),
+ 'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}),
+ 'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Organization']"}),
+ 'merge_key': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '300'}),
+ 'organization_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.OrganizationType']"}),
+ 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.organizationtype': {
+ 'Meta': {'ordering': "('label',)", 'object_name': 'OrganizationType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.person': {
+ 'Meta': {'object_name': 'Person'},
+ 'address': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'address_complement': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'attached_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'members'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['ishtar_common.Organization']"}),
+ 'country': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+ 'exclude_from_merge': ('django.db.models.fields.NullBooleanField', [], {'default': 'False', 'null': 'True', 'blank': 'True'}),
+ 'history_creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+ 'history_modifier': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'+'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'imports': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'imported_ishtar_common_person'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['ishtar_common.Import']"}),
+ 'merge_candidate': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_candidate_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}),
+ 'merge_exclusion': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'merge_exclusion_rel_+'", 'null': 'True', 'to': "orm['ishtar_common.Person']"}),
+ 'merge_key': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'mobile_phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
+ 'person_types': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['ishtar_common.PersonType']", 'symmetrical': 'False'}),
+ 'phone': ('django.db.models.fields.CharField', [], {'max_length': '18', 'null': 'True', 'blank': 'True'}),
+ 'postal_code': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+ 'raw_name': ('django.db.models.fields.CharField', [], {'max_length': '300', 'null': 'True', 'blank': 'True'}),
+ 'surname': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True', 'blank': 'True'}),
+ 'title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
+ 'town': ('django.db.models.fields.CharField', [], {'max_length': '70', 'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.persontype': {
+ 'Meta': {'ordering': "('label',)", 'object_name': 'PersonType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.regexp': {
+ 'Meta': {'object_name': 'Regexp'},
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'regexp': ('django.db.models.fields.CharField', [], {'max_length': '500'})
+ },
+ 'ishtar_common.sourcetype': {
+ 'Meta': {'object_name': 'SourceType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.state': {
+ 'Meta': {'ordering': "['number']", 'object_name': 'State'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
+ 'number': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '3'})
+ },
+ 'ishtar_common.supporttype': {
+ 'Meta': {'object_name': 'SupportType'},
+ 'available': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'txt_idx': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100'})
+ },
+ 'ishtar_common.targetkey': {
+ 'Meta': {'unique_together': "(('target', 'key', 'associated_user', 'associated_import'),)", 'object_name': 'TargetKey'},
+ 'associated_import': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Import']", 'null': 'True', 'blank': 'True'}),
+ 'associated_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.IshtarUser']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_set': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'key': ('django.db.models.fields.TextField', [], {}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'keys'", 'to': "orm['ishtar_common.ImportTarget']"}),
+ 'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'ishtar_common.town': {
+ 'Meta': {'ordering': "['numero_insee']", 'object_name': 'Town'},
+ 'canton': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Canton']", 'null': 'True', 'blank': 'True'}),
+ 'center': ('django.contrib.gis.db.models.fields.PointField', [], {'srid': '27572', 'null': 'True', 'blank': 'True'}),
+ 'departement': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['ishtar_common.Department']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'numero_insee': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '6'}),
+ 'surface': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['ishtar_common'] \ No newline at end of file
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index d7e63856b..2a12edc02 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -42,7 +42,7 @@ from django.core.urlresolvers import reverse, NoReverseMatch
from django.db.utils import DatabaseError
from django.db.models import Q, Max, Count
from django.db.models.base import ModelBase
-from django.db.models.signals import post_save, pre_delete
+from django.db.models.signals import post_save, pre_delete, post_delete
from django.utils.translation import ugettext_lazy as _, ugettext, \
pgettext_lazy
@@ -188,7 +188,7 @@ def valid_ids(cls):
cls.objects.get(pk=v)
except ObjectDoesNotExist:
raise ValidationError(
- _(u"An item selected is not a valid item."))
+ _(u"A selected item is not a valid item."))
return func
@@ -199,7 +199,7 @@ def is_unique(cls, field):
try:
assert cls.objects.filter(**query).count() == 0
except AssertionError:
- raise ValidationError(_(u"This item already exist."))
+ raise ValidationError(_(u"This item already exists."))
return func
@@ -249,7 +249,24 @@ class OwnPerms:
return cls.objects.filter(query).order_by(*cls._meta.ordering)
-class GeneralType(models.Model):
+class Cached(object):
+ slug_field = 'txt_idx'
+
+ @classmethod
+ def get_cache(cls, slug):
+ cache_key, value = get_cache(cls, slug)
+ if value:
+ return value
+ try:
+ k = {cls.slug_field: slug}
+ obj = cls.objects.get(**k)
+ cache.set(cache_key, obj, settings.CACHE_TIMEOUT)
+ return obj
+ except cls.DoesNotExist:
+ return None
+
+
+class GeneralType(models.Model, Cached):
"""
Abstract class for "types"
"""
@@ -457,18 +474,6 @@ class GeneralType(models.Model):
for item in cls.objects.all():
item.generate_key()
- @classmethod
- def get_cache(cls, slug):
- cache_key, value = get_cache(cls, slug)
- if value:
- return value
- try:
- obj = cls.objects.get(txt_idx=slug)
- cache.set(cache_key, obj, settings.CACHE_TIMEOUT)
- return obj
- except cls.DoesNotExist:
- return None
-
class ItemKey(models.Model):
key = models.CharField(_(u"Key"), max_length=100)
@@ -477,7 +482,7 @@ class ItemKey(models.Model):
content_object = generic.GenericForeignKey('content_type', 'object_id')
importer = models.ForeignKey(
'Import', null=True, blank=True,
- help_text=_(u"Key specific to an import"))
+ help_text=_(u"Specific key to an import"))
def __unicode__(self):
return self.key
@@ -765,7 +770,79 @@ class LightHistorizedItem(BaseHistorizedItem):
return True
-class GlobalVar(models.Model):
+class IshtarSiteProfile(models.Model, Cached):
+ slug_field = 'slug'
+ label = models.TextField(_(u"Name"))
+ slug = models.SlugField(_(u"Slug"), unique=True)
+ description = models.TextField(_(u"Description"), null=True, blank=True)
+ files = models.BooleanField(_(u"Files module"), default=False)
+ context_record = models.BooleanField(_(u"Context records module"),
+ default=False)
+ find = models.BooleanField(_(u"Finds module"), default=False,
+ help_text=_(u"Need context records module"))
+ warehouse = models.BooleanField(
+ _(u"Warehouses module"), default=False,
+ help_text=_(u"Need finds module"))
+ active = models.BooleanField(_(u"Current active"), default=False)
+
+ class Meta:
+ verbose_name = _(u"Ishtar site profile")
+ verbose_name_plural = _(u"Ishtar site profiles")
+ ordering = ['label']
+
+ def __unicode__(self):
+ return unicode(self.label)
+
+ def save(self, *args, **kwargs):
+ raw = False
+ if 'raw' in kwargs:
+ raw = kwargs.pop('raw')
+ super(IshtarSiteProfile, self).save(*args, **kwargs)
+ obj = self
+ if raw:
+ return obj
+ q = self.__class__.objects.filter(active=True).exclude(slug=self.slug)
+ if obj.active and q.count():
+ for profile in q.all():
+ profile.active = False
+ profile.save(raw=True)
+ changed = False
+ if not obj.active and not q.count():
+ obj.active = True
+ changed = True
+ if obj.warehouse and not obj.find:
+ obj.find = True
+ changed = True
+ if obj.find and not obj.context_record:
+ obj.context_record = True
+ changed = True
+ if changed:
+ obj = obj.save(raw=True)
+ return obj
+
+
+def get_current_profile(force=False):
+ cache_key, value = get_cache(IshtarSiteProfile, ['is-current-profile'])
+ if value and not force:
+ return value
+ q = IshtarSiteProfile.objects.filter(active=True)
+ if not q.count():
+ obj = IshtarSiteProfile.objects.create(
+ label="Default profile", slug='default', active=True)
+ else:
+ obj = q.all()[0]
+ cache.set(cache_key, obj, settings.CACHE_TIMEOUT)
+ return obj
+
+
+def cached_site_changed(sender, **kwargs):
+ get_current_profile(force=True)
+
+post_save.connect(cached_site_changed, sender=IshtarSiteProfile)
+post_delete.connect(cached_site_changed, sender=IshtarSiteProfile)
+
+
+class GlobalVar(models.Model, Cached):
slug = models.SlugField(_(u"Variable name"), unique=True)
description = models.TextField(_(u"Description of the variable"),
null=True, blank=True)
@@ -779,18 +856,6 @@ class GlobalVar(models.Model):
def __unicode__(self):
return unicode(self.slug)
- @classmethod
- def get_cache(cls, slug):
- cache_key, value = get_cache(cls, slug)
- if value:
- return value
- try:
- obj = cls.objects.get(slug=slug)
- cache.set(cache_key, obj.value, settings.CACHE_TIMEOUT)
- return obj.value
- except cls.DoesNotExist:
- return None
-
def cached_globalvar_changed(sender, **kwargs):
if not kwargs['instance']:
@@ -1174,29 +1239,29 @@ class OrganizationType(GeneralType):
verbose_name_plural = _(u"Organization types")
ordering = ('label',)
-MODELS = [
- ('archaeological_operations.models.Operation', _(u"Operation")),
- ('archaeological_operations.models.ArchaeologicalSite',
- _(u"Archaeological site")),
- ('archaeological_operations.models.Parcel', _(u"Parcels")),
- ('archaeological_operations.models.OperationSource',
- _(u"Operation source")),
-]
-
IMPORTER_CLASSES = {}
-if 'archaeological_files' in settings.INSTALLED_APPS:
- MODELS = [('archaeological_files.models.File', _(u"Archaeological files"))]\
- + MODELS
- IMPORTER_CLASSES.update({
- 'sra-pdl-files':
- 'archaeological_files.data_importer.FileImporterSraPdL'})
-if 'archaeological_context_records' in settings.INSTALLED_APPS:
+IMPORTER_CLASSES.update({
+ 'sra-pdl-files':
+ 'archaeological_files.data_importer.FileImporterSraPdL'})
+
+
+def get_importer_models():
+ MODELS = [
+ ('archaeological_operations.models.Operation', _(u"Operation")),
+ ('archaeological_operations.models.ArchaeologicalSite',
+ _(u"Archaeological site")),
+ ('archaeological_operations.models.Parcel', _(u"Parcels")),
+ ('archaeological_operations.models.OperationSource',
+ _(u"Operation source")),
+ ]
+ MODELS = [('archaeological_files.models.File',
+ _(u"Archaeological files"))] + MODELS
MODELS = [('archaeological_context_records.models.ContextRecord',
_(u"Context records")), ] + MODELS
-if 'archaeological_finds' in settings.INSTALLED_APPS:
MODELS = [('archaeological_finds.models.BaseFind',
_(u"Finds")), ] + MODELS
+ return MODELS
def get_model_fields(model):
@@ -1234,7 +1299,8 @@ class ImporterType(models.Model):
users = models.ManyToManyField('IshtarUser', verbose_name=_(u"Users"),
blank=True, null=True)
associated_models = models.CharField(_(u"Associated model"),
- max_length=200, choices=MODELS)
+ max_length=200,
+ choices=get_importer_models())
is_template = models.BooleanField(_(u"Is template"), default=False)
unicity_keys = models.CharField(_(u"Unicity keys (separator \";\")"),
blank=True, null=True, max_length=500)
@@ -1429,7 +1495,7 @@ class ImporterDuplicateField(models.Model):
column = models.ForeignKey(ImporterColumn, related_name='duplicate_fields')
field_name = models.CharField(_(u"Field name"), blank=True, null=True,
max_length=200)
- force_new = models.BooleanField(_(u"Force creation of new item"),
+ force_new = models.BooleanField(_(u"Force creation of new items"),
default=False)
concat = models.BooleanField(_(u"Concatenate with existing"),
default=False)
@@ -1463,7 +1529,7 @@ class ImportTarget(models.Model):
target = models.CharField(u"Target", max_length=500)
regexp_filter = models.ForeignKey("Regexp", blank=True, null=True)
formater_type = models.ForeignKey("FormaterType")
- force_new = models.BooleanField(_(u"Force creation of new item"),
+ force_new = models.BooleanField(_(u"Force creation of new items"),
default=False)
concat = models.BooleanField(_(u"Concatenate with existing"),
default=False)
@@ -1729,7 +1795,7 @@ class Import(models.Model):
null=True)
end_date = models.DateTimeField(_(u"End date"), blank=True,
null=True, editable=False)
- seconds_remaining = models.IntegerField(_(u"Seconds remaining"),
+ seconds_remaining = models.IntegerField(_(u"Remaining seconds"),
blank=True, null=True,
editable=False)
@@ -1895,7 +1961,7 @@ class Organization(Address, Merge, OwnPerms, ValueGetter):
verbose_name = _(u"Organization")
verbose_name_plural = _(u"Organizations")
permissions = (
- ("view_organization", ugettext(u"Can view all Organization")),
+ ("view_organization", ugettext(u"Can view all Organizations")),
("view_own_organization", ugettext(u"Can view own Organization")),
("add_own_organization", ugettext(u"Can add own Organization")),
("change_own_organization",
@@ -1950,7 +2016,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter):
TYPE = (
('Mr', _(u'Mr')),
('Ms', _(u'Miss')),
- ('Mr and Miss', _(u'Mr and Miss')),
+ ('Mr and Miss', _(u'Mr and Mrs')),
('Md', _(u'Mrs')),
('Dr', _(u'Doctor')),
)
@@ -1973,7 +2039,7 @@ class Person(Address, Merge, OwnPerms, ValueGetter):
verbose_name = _(u"Person")
verbose_name_plural = _(u"Persons")
permissions = (
- ("view_person", ugettext(u"Can view all Person")),
+ ("view_person", ugettext(u"Can view all Persons")),
("view_own_person", ugettext(u"Can view own Person")),
("add_own_person", ugettext(u"Can add own Person")),
("change_own_person", ugettext(u"Can change own Person")),
diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css
index a4c62739b..2a0079706 100644
--- a/ishtar_common/static/media/style.css
+++ b/ishtar_common/static/media/style.css
@@ -371,7 +371,7 @@ div#main_menu > ul > li{
-webkit-border-radius:0;
}
-#section-file_management, #section-administration,
+#section-file_management,
#section-administrativact_management{
background-color:#ddffdd;
}
diff --git a/ishtar_common/templates/blocks/comma_list.html b/ishtar_common/templates/blocks/comma_list.html
new file mode 100644
index 000000000..12fcd2b41
--- /dev/null
+++ b/ishtar_common/templates/blocks/comma_list.html
@@ -0,0 +1 @@
+{% load i18n %}{% if not forloop.last %}{% ifequal forloop.revcounter 2 %} {% trans "and" %} {% else %}{% trans ", "%}{% endifequal %}{% else %}{% trans "." %}{% endif %}
diff --git a/ishtar_common/templates/ishtar/blocks/window_tables/static_documents.html b/ishtar_common/templates/ishtar/blocks/window_tables/static_documents.html
new file mode 100644
index 000000000..d6686b553
--- /dev/null
+++ b/ishtar_common/templates/ishtar/blocks/window_tables/static_documents.html
@@ -0,0 +1,11 @@
+{% load i18n %}
+
+<table class='simple'>
+ <caption>{{caption}}</caption>
+ <tr>{% for col in col_names %}
+ <th>{% trans col %}</th>{% endfor %}
+ </tr>{% for item in data %}
+ <tr>{% for value in item %}
+ <td>{{value}}</td>{%endfor%}
+ </tr>{% endfor %}
+</table>
diff --git a/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html b/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html
index 87ce5c528..d7ea16d90 100644
--- a/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html
+++ b/ishtar_common/templates/ishtar/dashboards/dashboard_main_detail.html
@@ -105,7 +105,7 @@ if (typeof values_1_{{unique_id}} === 'undefined'
|| values_1_{{unique_id}}.length == 0){
$('#chart_img_{{unique_id}}').hide();
-$('#chart_{{unique_id}}').html("<p class='alert'>{% trans 'No data for theses criteria.' %}</p>");
+$('#chart_{{unique_id}}').html("<p class='alert'>{% trans 'No data for these criteria.' %}</p>");
} else {
var showmarker = false;
diff --git a/ishtar_common/templates/ishtar/sheet_person.html b/ishtar_common/templates/ishtar/sheet_person.html
index 2dfc4bbea..796fe2c4a 100644
--- a/ishtar_common/templates/ishtar/sheet_person.html
+++ b/ishtar_common/templates/ishtar/sheet_person.html
@@ -35,17 +35,17 @@
{% trans "Associated operations as scientist" as ao %}
{% if item.operation_scientist_responsability.count %}
-{% dynamic_table_document ao 'operations' 'scientist' item.pk %}
+{% dynamic_table_document ao 'operations' 'scientist' item.pk '' output %}
{% endif %}
{% trans "Associated operations as responsible" as ao %}
{% if item.operation_responsability.count %}
-{% dynamic_table_document ao 'operations' 'in_charge' item.pk %}
+{% dynamic_table_document ao 'operations' 'in_charge' item.pk '' output %}
{% endif %}
{% trans "Associated archaelogical files" as af %}
{% if item.file_responsability.count %}
-{% dynamic_table_document af 'files' 'in_charge' item.pk %}
+{% dynamic_table_document af 'files' 'in_charge' item.pk '' output %}
{% endif %}
<table>
diff --git a/ishtar_common/templates/sheet_ope.html b/ishtar_common/templates/sheet_ope.html
index dbe3297b3..28390af45 100644
--- a/ishtar_common/templates/sheet_ope.html
+++ b/ishtar_common/templates/sheet_ope.html
@@ -118,9 +118,9 @@
{% endfor %}
</table>
-<h3>{% trans "Recording Units"%}</h3>
+<h3>{% trans "Context Records"%}</h3>
<table>
- <caption>{%trans "Recording Units"%}</caption>
+ <caption>{%trans "Context Records"%}</caption>
<tr>
<th>{% trans "ID" %}</th>
<th>{% trans "Type" %}</th>
@@ -139,7 +139,7 @@
<td class='link'><a href="#{#{%url show-record_unit record_unit.pk%}#}">{% trans "Details" %}</a></td>
</tr>
{% empty %}
- <tr><td colspan="6" class='no_items'>{% trans "No recording unit associated to this operation" %}</td></tr>
+ <tr><td colspan="6" class='no_items'>{% trans "No context record associated to this operation" %}</td></tr>
{% endfor %}
</table>
diff --git a/ishtar_common/templatetags/window_tables.py b/ishtar_common/templatetags/window_tables.py
index a1aa735a7..687b2cf49 100644
--- a/ishtar_common/templatetags/window_tables.py
+++ b/ishtar_common/templatetags/window_tables.py
@@ -1,8 +1,11 @@
+import json
import time
from django import template
from django.conf import settings
+from django.core.urlresolvers import resolve
from django.template.defaultfilters import slugify
+from django.template.loader import get_template
from django.utils.translation import ugettext_lazy as _
from ishtar_common.forms import reverse_lazy
@@ -52,16 +55,21 @@ except:
pass
-@register.inclusion_tag('ishtar/blocks/window_tables/dynamic_documents.html')
-def dynamic_table_document(caption, associated_model, key, value,
- table_cols='TABLE_COLS'):
+@register.simple_tag(takes_context=True)
+def dynamic_table_document(context, caption, associated_model, key, value,
+ table_cols='TABLE_COLS', output='html'):
+ if not table_cols:
+ table_cols = 'TABLE_COLS'
model, url, url_full = ASSOCIATED_MODELS[associated_model]
grid = JQueryJqGrid(None, None, model, table_cols=table_cols)
source = unicode(reverse_lazy(url))
source_full = unicode(reverse_lazy(url_full)) if url_full else ''
source_attrs = '?{}={}'.format(key, value)
- col_names, extra_cols = grid.get_cols()
- return {'caption': caption,
+ if output == 'html':
+ col_names, extra_cols = grid.get_cols()
+ t = get_template('ishtar/blocks/window_tables/dynamic_documents.html')
+ context = template.Context({
+ 'caption': caption,
'name': slugify(caption) + '{}'.format(int(time.time())),
'source': source + source_attrs,
'source_full': source_full,
@@ -72,4 +80,38 @@ def dynamic_table_document(caption, associated_model, key, value,
'no_result': unicode(_("No results")),
'loading': unicode(_("Loading...")),
'encoding': settings.ENCODING or 'utf-8',
- }
+ })
+ return t.render(context)
+ else:
+ col_names, extra_cols = grid.get_cols(python=True)
+ view, args, kwargs = resolve(source)
+ request = context['request']
+ if source_attrs and source_attrs.startswith('?'):
+ source_attrs = source_attrs[1:]
+ dct = {}
+ for attr in source_attrs.split('&'):
+ if '=' in attr:
+ key, val = attr.split('=')
+ dct[key] = val
+ request.GET = dct
+ kwargs['request'] = request
+ page = view(*args, **kwargs)
+ data = []
+ if page.content:
+ res = json.loads(page.content)
+ if "rows" in res:
+ for r in res["rows"]:
+ d = []
+ for col in extra_cols:
+ if col in r:
+ d.append(r[col])
+ else:
+ d.append('')
+ data.append(d)
+ t = get_template('ishtar/blocks/window_tables/static_documents.html')
+ context = template.Context({
+ 'caption': caption,
+ 'col_names': col_names,
+ 'data': data
+ })
+ return t.render(context)
diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py
index 621b05242..82ab009e0 100644
--- a/ishtar_common/tests.py
+++ b/ishtar_common/tests.py
@@ -17,18 +17,22 @@
# See the file COPYING for details.
-import tempfile, datetime
-from zipfile import ZipFile, ZIP_DEFLATED
-
from django.conf import settings
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
+from django.core.cache import cache
+from django.core.urlresolvers import reverse
from django.template.defaultfilters import slugify
from django.test import TestCase
+from django.test.client import Client
from ishtar_common import models
"""
+from django.conf import settings
+import tempfile, datetime
+from zipfile import ZipFile, ZIP_DEFLATED
+
from oook_replace.oook_replace import oook_replace
class OOOGenerationTest(TestCase):
@@ -53,34 +57,36 @@ class OOOGenerationTest(TestCase):
class MergeTest(TestCase):
def setUp(self):
self.user, created = User.objects.get_or_create(username='username')
- self.organisation_types = models.OrganizationType.create_default_for_test()
+ self.organisation_types = \
+ models.OrganizationType.create_default_for_test()
self.person_types = [models.PersonType.objects.create(label='Admin'),
models.PersonType.objects.create(label='User')]
self.author_types = [models.AuthorType.objects.create(label='1'),
- models.AuthorType.objects.create(label='2'),]
+ models.AuthorType.objects.create(label='2')]
self.company_1 = models.Organization.objects.create(
- history_modifier=self.user, name='Franquin Comp.',
- organization_type=self.organisation_types[0])
- self.person_1 = models.Person.objects.create(name='Boule',
- surname=' ',
- history_modifier=self.user, attached_to=self.company_1)
+ history_modifier=self.user, name='Franquin Comp.',
+ organization_type=self.organisation_types[0])
+ self.person_1 = models.Person.objects.create(
+ name='Boule', surname=' ', history_modifier=self.user,
+ attached_to=self.company_1)
self.person_1.person_types.add(self.person_types[0])
- self.author_1_pk = models.Author.objects.create(person=self.person_1,
- author_type=self.author_types[0]).pk
+ self.author_1_pk = models.Author.objects.create(
+ person=self.person_1, author_type=self.author_types[0]).pk
self.company_2 = models.Organization.objects.create(
- history_modifier=self.user, name='Goscinny Corp.',
- organization_type=self.organisation_types[1])
- self.person_2 = models.Person.objects.create(name='Bill',
- history_modifier=self.user, surname='Peyo', title='Mr',
- attached_to=self.company_2)
+ history_modifier=self.user, name='Goscinny Corp.',
+ organization_type=self.organisation_types[1])
+ self.person_2 = models.Person.objects.create(
+ name='Bill', history_modifier=self.user, surname='Peyo',
+ title='Mr', attached_to=self.company_2)
self.person_2.person_types.add(self.person_types[1])
- self.author_2_pk = models.Author.objects.create(person=self.person_2,
- author_type=self.author_types[1]).pk
- self.person_3 = models.Person.objects.create(name='George',
- history_modifier=self.user, attached_to=self.company_1)
+ self.author_2_pk = models.Author.objects.create(
+ person=self.person_2, author_type=self.author_types[1]).pk
+ self.person_3 = models.Person.objects.create(
+ name='George', history_modifier=self.user,
+ attached_to=self.company_1)
def testPersonMerge(self):
self.person_1.merge(self.person_2)
@@ -93,9 +99,11 @@ class MergeTest(TestCase):
# preserve existing foreign key
self.assertEqual(self.person_1.attached_to, self.company_1)
# preserve existing many to many
- self.assertTrue(self.person_types[0] in self.person_1.person_types.all())
+ self.assertTrue(self.person_types[0]
+ in self.person_1.person_types.all())
# add new many to many
- self.assertTrue(self.person_types[1] in self.person_1.person_types.all())
+ self.assertTrue(self.person_types[1]
+ in self.person_1.person_types.all())
# update reverse foreign key association and dont break the existing
self.assertEqual(models.Author.objects.get(pk=self.author_1_pk).person,
self.person_1)
@@ -104,32 +112,37 @@ class MergeTest(TestCase):
self.person_3.merge(self.person_1)
# manage well empty many to many fields
- self.assertTrue(self.person_types[1] in self.person_3.person_types.all())
+ self.assertTrue(self.person_types[1]
+ in self.person_3.person_types.all())
+
class ImportKeyTest(TestCase):
def testKeys(self):
- content_type = ContentType.objects.get_for_model(models.OrganizationType)
+ content_type = ContentType.objects.get_for_model(
+ models.OrganizationType)
# creation
label = u"Ploufé"
ot = models.OrganizationType.objects.create(label=label)
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot.pk,
- key=slugify(label),
- content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot.pk, key=slugify(label),
+ content_type=content_type).count(), 1)
label_2 = u"Plif"
ot_2 = models.OrganizationType.objects.create(label=label_2)
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot_2.pk,
- key=slugify(label_2),
- content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot_2.pk, key=slugify(label_2),
+ content_type=content_type).count(), 1)
# replace key
ot_2.add_key(slugify(label), force=True)
# one key point to only one item
- self.assertEqual(models.ItemKey.objects.filter(key=slugify(label),
- content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ key=slugify(label),
+ content_type=content_type).count(), 1)
# this key point to the right item
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot_2.pk,
- key=slugify(label), content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot_2.pk, key=slugify(label),
+ content_type=content_type).count(), 1)
# modification
label_3 = "Yop"
@@ -137,14 +150,67 @@ class ImportKeyTest(TestCase):
ot_2.txt_idx = slugify(label_3)
ot_2.save()
# old label not referenced anymore
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot_2.pk,
- key=slugify(label_2), content_type=content_type).count(), 0)
- # forced key association is always here
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot_2.pk,
- key=slugify(label), content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot_2.pk, key=slugify(label_2),
+ content_type=content_type).count(), 0)
+ # # forced key association is always here
# new key is here
- self.assertEqual(models.ItemKey.objects.filter(object_id=ot_2.pk,
- key=slugify(label_3), content_type=content_type).count(), 1)
-
-
-
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot_2.pk, key=slugify(label),
+ content_type=content_type).count(), 1)
+ self.assertEqual(models.ItemKey.objects.filter(
+ object_id=ot_2.pk, key=slugify(label_3),
+ content_type=content_type).count(), 1)
+
+
+class IshtarSiteProfileTest(TestCase):
+ def testRelevance(self):
+ cache.set('default-ishtarsiteprofile-is-current-profile', None,
+ settings.CACHE_TIMEOUT)
+ profile = models.get_current_profile()
+ default_slug = profile.slug
+ profile2 = models.IshtarSiteProfile.objects.create(
+ label="Test profile 2", slug='test-profile-2')
+ profile2.save()
+ # when no profile is the current, activate by default the first created
+ self.assertTrue(profile.active and not profile2.active)
+ profile2.active = True
+ profile2 = profile2.save()
+ # only one profile active at a time
+ profile = models.IshtarSiteProfile.objects.get(slug=default_slug)
+ self.assertTrue(profile2.active and not profile.active)
+ # activate find active automatically context records
+ self.assertFalse(profile.context_record)
+ profile.find = True
+ profile = profile.save()
+ self.assertTrue(profile.context_record)
+ # activate warehouse active automatically context records and finds
+ self.assertFalse(profile2.context_record or profile2.find)
+ profile2.warehouse = True
+ profile2 = profile2.save()
+ self.assertTrue(profile2.context_record and profile2.find)
+
+ def testDefaultProfile(self):
+ cache.set('default-ishtarsiteprofile-is-current-profile', None,
+ settings.CACHE_TIMEOUT)
+ self.assertFalse(models.IshtarSiteProfile.objects.count())
+ profile = models.get_current_profile()
+ self.assertTrue(profile)
+ self.assertTrue(models.IshtarSiteProfile.objects.count())
+
+ def testMenuFiltering(self):
+ cache.set('default-ishtarsiteprofile-is-current-profile', None,
+ settings.CACHE_TIMEOUT)
+ username = 'username4277'
+ password = 'dcbqj756456!@%'
+ User.objects.create_superuser(username, "nomail@nomail.com",
+ password)
+ c = Client()
+ c.login(username=username, password=password)
+ response = c.get(reverse('start'))
+ self.assertFalse("section-file_management" in response.content)
+ profile = models.get_current_profile()
+ profile.files = True
+ profile.save()
+ response = c.get(reverse('start'))
+ self.assertTrue("section-file_management" in response.content)
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 65bd1ee15..25ae6ddf5 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -17,13 +17,14 @@
# See the file COPYING for details.
+from django.conf import settings
from django.core.cache import cache
from django.utils.translation import ugettext
from django.template.defaultfilters import slugify
def get_cache(cls, extra_args=[]):
- cache_key = cls.__name__
+ cache_key = u"{}-{}".format(settings.PROJECT_SLUG, cls.__name__)
for arg in extra_args:
if not arg:
cache_key += '-0'
diff --git a/ishtar_common/views.py b/ishtar_common/views.py
index 6f95e070a..5ea53374d 100644
--- a/ishtar_common/views.py
+++ b/ishtar_common/views.py
@@ -51,7 +51,12 @@ from xhtml2odt import xhtml2odt
from menus import menu
+from archaeological_files.models import File
+from archaeological_context_records.models import ContextRecord
+from archaeological_finds.models import Find
+
from archaeological_operations.forms import DashboardForm as DashboardFormOpe
+from archaeological_files.forms import DashboardForm as DashboardFormFile
from ishtar_common.forms import FinalForm, FinalDeleteForm
from ishtar_common import forms_common as forms
@@ -724,6 +729,7 @@ def show_item(model, name, extra_dct=None):
dct.update(extra_dct(request, item))
context_instance = RequestContext(request)
context_instance.update(dct)
+ context_instance['output'] = 'html'
filename = ""
if hasattr(item, 'history_object'):
filename = item.history_object.associated_filename
@@ -731,6 +737,7 @@ def show_item(model, name, extra_dct=None):
filename = item.associated_filename
if doc_type == "odt" and settings.ODT_TEMPLATE:
tpl = loader.get_template('ishtar/sheet_%s.html' % name)
+ context_instance['output'] = 'ODT'
content = tpl.render(context_instance)
try:
tidy_options = {'output-xhtml': 1, 'indent': 1,
@@ -770,6 +777,7 @@ def show_item(model, name, extra_dct=None):
return response
elif doc_type == 'pdf':
tpl = loader.get_template('ishtar/sheet_%s_pdf.html' % name)
+ context_instance['output'] = 'PDF'
content = tpl.render(context_instance)
result = StringIO.StringIO()
html = content.encode('utf-8')
@@ -927,22 +935,20 @@ def dashboard_main(request, dct, obj_id=None, *args, **kwargs):
Main dashboard
"""
app_list = []
- if 'archaeological_files' in settings.INSTALLED_APPS:
+ profile = models.get_current_profile()
+ if profile.files:
app_list.append((_(u"Archaeological files"), 'files'))
app_list.append((_(u"Operations"), 'operations'))
- if 'archaeological_context_records' in settings.INSTALLED_APPS:
+ if profile.context_record:
app_list.append((_(u"Context records"), 'contextrecords'))
- if 'archaeological_finds' in settings.INSTALLED_APPS:
+ if profile.find:
app_list.append((_(u"Finds"), 'finds'))
dct = {'app_list': app_list}
return render_to_response('ishtar/dashboards/dashboard_main.html', dct,
context_instance=RequestContext(request))
DASHBOARD_FORMS = {}
-if 'archaeological_files' in settings.INSTALLED_APPS:
- from archaeological_files.forms import DashboardForm as DashboardFormFile
- DASHBOARD_FORMS['files'] = DashboardFormFile
-
+DASHBOARD_FORMS['files'] = DashboardFormFile
DASHBOARD_FORMS['operations'] = DashboardFormOpe
@@ -957,8 +963,8 @@ def dashboard_main_detail(request, item_name):
dct, context_instance=RequestContext(request))
form = None
slicing, date_source, fltr, show_detail = 'year', None, {}, False
- if (item_name == 'files' and
- 'archaeological_files' in settings.INSTALLED_APPS) \
+ profile = models.get_current_profile()
+ if (item_name == 'files' and profile.files) \
or item_name == 'operations':
slicing = 'month'
if item_name in DASHBOARD_FORMS:
@@ -974,32 +980,25 @@ def dashboard_main_detail(request, item_name):
else:
form = DASHBOARD_FORMS[item_name]()
lbl, dashboard = None, None
- if (item_name == 'files' and
- 'archaeological_files' in settings.INSTALLED_APPS) \
+ if (item_name == 'files' and profile.files) \
or item_name == 'operations':
dashboard_kwargs = {'slice': slicing, 'fltr': fltr,
'show_detail': show_detail}
# date_source is only relevant when the form has set one
if date_source:
dashboard_kwargs['date_source'] = date_source
- if item_name == 'files' and \
- 'archaeological_files' in settings.INSTALLED_APPS:
- from archaeological_files.models import File
+ if item_name == 'files' and profile.files:
lbl, dashboard = (_(u"Archaeological files"),
models.Dashboard(File, **dashboard_kwargs))
if item_name == 'operations':
from archaeological_operations.models import Operation
lbl, dashboard = (_(u"Operations"),
models.Dashboard(Operation, **dashboard_kwargs))
- if item_name == 'contextrecords' and \
- 'archaeological_context_records' in settings.INSTALLED_APPS:
- from archaeological_context_records.models import ContextRecord
+ if item_name == 'contextrecords' and profile.context_record:
lbl, dashboard = (
_(u"Context records"),
models.Dashboard(ContextRecord, slice=slicing, fltr=fltr))
- if item_name == 'finds' and \
- 'archaeological_finds' in settings.INSTALLED_APPS:
- from archaeological_finds.models import Find
+ if item_name == 'finds' and profile.find:
lbl, dashboard = (_(u"Finds"), models.Dashboard(Find,
slice=slicing,
fltr=fltr))
diff --git a/ishtar_common/widgets.py b/ishtar_common/widgets.py
index 688648e10..57aa8cf69 100644
--- a/ishtar_common/widgets.py
+++ b/ishtar_common/widgets.py
@@ -524,7 +524,7 @@ class JQueryJqGrid(forms.RadioSelect):
self.new, self.new_message = new, new_message
self.source_full = source_full
- def get_cols(self):
+ def get_cols(self, python=False):
jq_col_names, extra_cols = [], []
col_labels = {}
if hasattr(self.associated_model, self.table_cols + '_LBL'):
@@ -557,13 +557,19 @@ class JQueryJqGrid(forms.RadioSelect):
field_name += f_name
field_verbose_names.append(unicode(field_verbose_name))
if field_name in col_labels:
- jq_col_names.append(u'"%s"' % unicode(col_labels[field_name]))
+ jq_col_names.append(unicode(col_labels[field_name]))
else:
- jq_col_names.append(u'"%s"' % settings.JOINT.join(
+ jq_col_names.append(settings.JOINT.join(
[f for f in field_verbose_names if f]))
- extra_cols.append(self.COL_TPL % {'idx': field_name})
- jq_col_names = jq_col_names and ", ".join(jq_col_names) or ""
- extra_cols = extra_cols and ", ".join(extra_cols) or ""
+ if not python:
+ jq_col_names[-1] = u'"%s"' % jq_col_names[-1]
+ if python:
+ extra_cols.append(field_name)
+ else:
+ extra_cols.append(self.COL_TPL % {'idx': field_name})
+ if not python:
+ jq_col_names = jq_col_names and ", ".join(jq_col_names) or ""
+ extra_cols = extra_cols and ", ".join(extra_cols) or ""
return jq_col_names, extra_cols
def render(self, name, value=None, attrs=None):