summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2021-09-09 11:07:01 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2022-12-12 12:20:58 +0100
commitdc37c72d10b5358ef692e73f671c15c083693c05 (patch)
tree206966ec7684d85811f7a8686fd781d3ab9d9fd4
parente046ed00e790fbb82b43de9404d8ca3955c8de2f (diff)
downloadIshtar-dc37c72d10b5358ef692e73f671c15c083693c05.tar.bz2
Ishtar-dc37c72d10b5358ef692e73f671c15c083693c05.zip
Migration to Django 2.2 - fixes
- remove django-ajax-select - fix migrations
-rw-r--r--archaeological_context_records/admin.py22
-rw-r--r--archaeological_context_records/lookups.py22
-rw-r--r--archaeological_context_records/migrations/0101_squashed.py2
-rw-r--r--archaeological_files/admin.py35
-rw-r--r--archaeological_files/lookups.py21
-rw-r--r--archaeological_files/migrations/0101_squashed.py2
-rw-r--r--archaeological_finds/admin.py99
-rw-r--r--archaeological_finds/lookups.py89
-rw-r--r--archaeological_finds/migrations/0101_squashed.py8
-rw-r--r--archaeological_operations/admin.py73
-rw-r--r--archaeological_operations/lookups.py82
-rw-r--r--archaeological_operations/migrations/0101_squashed.py6
-rw-r--r--archaeological_warehouse/admin.py26
-rw-r--r--archaeological_warehouse/lookups.py47
-rw-r--r--archaeological_warehouse/migrations/0101_squashed.py4
-rw-r--r--archaeological_warehouse/migrations/0111_auto_20210225_1039.py2
-rw-r--r--example_project/settings.py1
-rw-r--r--example_project/urls.py2
-rw-r--r--fixtures/initial_data-auth-fr.json33
-rw-r--r--ishtar_common/admin.py81
-rw-r--r--ishtar_common/apps.py4
-rw-r--r--ishtar_common/lookups.py167
-rw-r--r--ishtar_common/migrations/0201_squashed.py8
-rw-r--r--ishtar_common/static/ajax_select/css/ajax_select.css49
-rw-r--r--ishtar_common/static/ajax_select/js/bootstrap.js30
-rw-r--r--ishtar_common/templates/admin/change_form.html2
-rw-r--r--ishtar_common/templatetags/window_tables.py2
-rw-r--r--requirements.txt2
28 files changed, 152 insertions, 769 deletions
diff --git a/archaeological_context_records/admin.py b/archaeological_context_records/admin.py
index 0c21484e5..7d6d85e08 100644
--- a/archaeological_context_records/admin.py
+++ b/archaeological_context_records/admin.py
@@ -17,9 +17,6 @@
# See the file COPYING for details.
-from ajax_select import make_ajax_form
-from ajax_select.fields import AutoCompleteSelectField
-
from django import forms
from django.contrib import admin
from django.contrib.gis.forms import PointField, MultiPolygonField, OSMWidget
@@ -55,22 +52,19 @@ class AdminContextRecordForm(forms.ModelForm):
multi_polygon = MultiPolygonField(
label=_("Multi polygon"), required=False, widget=OSMWidget
)
- operation = AutoCompleteSelectField("operation")
- parcel = AutoCompleteSelectField("parcel", required=False)
- town = AutoCompleteSelectField("town", required=False)
- archaeological_site = AutoCompleteSelectField("archaeological_site", required=False)
- lock_user = AutoCompleteSelectField("user", required=False)
class ContextRecordAdmin(HistorizedObjectAdmin):
list_display = ("label", "operation", "parcel")
list_filter = ("unit",)
search_fields = (
- "label",
- "parcel__operation__cached_label",
+ "cached_label",
+ "town",
"parcel__section",
"parcel__parcel_number",
)
+ autocomplete_fields = ["operation", "parcel", "town", "archaeological_site",
+ "lock_user"]
model = models.ContextRecord
form = AdminContextRecordForm
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
@@ -87,13 +81,7 @@ class RecordRelationsAdmin(admin.ModelAdmin):
list_display = ("left_record", "relation_type", "right_record")
list_filter = ("relation_type",)
model = models.RecordRelations
- form = make_ajax_form(
- model,
- {
- "left_record": "context_record",
- "right_record": "context_record",
- },
- )
+ autocomplete_fields = ["left_record", "right_record"]
admin_site.register(models.RecordRelations, RecordRelationsAdmin)
diff --git a/archaeological_context_records/lookups.py b/archaeological_context_records/lookups.py
deleted file mode 100644
index 3131127d8..000000000
--- a/archaeological_context_records/lookups.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from ajax_select import register
-
-from ishtar_common.lookups import LookupChannel
-
-from django.db.models import Q
-
-from archaeological_context_records import models
-
-
-@register("context_record")
-class ContextRecordLookup(LookupChannel):
- model = models.ContextRecord
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term) | Q(town__name__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
diff --git a/archaeological_context_records/migrations/0101_squashed.py b/archaeological_context_records/migrations/0101_squashed.py
index d8b56641a..c61955270 100644
--- a/archaeological_context_records/migrations/0101_squashed.py
+++ b/archaeological_context_records/migrations/0101_squashed.py
@@ -111,7 +111,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Context Record',
'verbose_name_plural': 'Context Record',
'ordering': ('cached_label',),
- 'permissions': (('view_contextrecord', 'Can view all Context Records'), ('view_own_contextrecord', 'Can view own Context Record'), ('add_own_contextrecord', 'Can add own Context Record'), ('change_own_contextrecord', 'Can change own Context Record'), ('delete_own_contextrecord', 'Can delete own Context Record')),
+ 'permissions': (('view_own_contextrecord', 'Can view own Context Record'), ('add_own_contextrecord', 'Can add own Context Record'), ('change_own_contextrecord', 'Can change own Context Record'), ('delete_own_contextrecord', 'Can delete own Context Record')),
},
bases=(ishtar_common.models.BulkUpdatedItem,
ishtar_common.models.DocumentItem,
diff --git a/archaeological_files/admin.py b/archaeological_files/admin.py
index 937293681..903e90568 100644
--- a/archaeological_files/admin.py
+++ b/archaeological_files/admin.py
@@ -17,14 +17,11 @@
# See the file COPYING for details.
-from ajax_select import make_ajax_form
-
-from django import forms
from django.conf import settings
from django.conf.urls import url
-from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
+from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from ishtar_common.apps import admin_site
@@ -46,23 +43,19 @@ class FileAdmin(HistorizedObjectAdmin):
list_filter = ["file_type", "year"]
if settings.COUNTRY == "fr":
list_filter += ["saisine_type"]
- search_fields = ("name", "towns__name", "permit_reference")
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update(
- {
- "in_charge": "person",
- "general_contractor": "person",
- "corporation_general_contractor": "organization",
- "responsible_town_planning_service": "person",
- "planning_service": "organization",
- "organization": "organization",
- "scientist": "person",
- "main_town": "town",
- "towns": "town",
- "related_file": "file",
- }
- )
- form = make_ajax_form(models.File, ajax_form_dict)
+ search_fields = ("cached_label", "name", "towns__name", "permit_reference")
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "in_charge",
+ "general_contractor",
+ "corporation_general_contractor",
+ "responsible_town_planning_service",
+ "planning_service",
+ "organization",
+ "scientist",
+ "main_town",
+ "towns",
+ "related_file",
+ ]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
"raw_general_contractor",
"raw_town_planning_service",
diff --git a/archaeological_files/lookups.py b/archaeological_files/lookups.py
deleted file mode 100644
index cd5d0f0d7..000000000
--- a/archaeological_files/lookups.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from ajax_select import register
-
-from ishtar_common.lookups import LookupChannel
-
-from django.db.models import Q
-from archaeological_files.models import File
-
-
-@register("file")
-class FileLookup(LookupChannel):
- model = File
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
diff --git a/archaeological_files/migrations/0101_squashed.py b/archaeological_files/migrations/0101_squashed.py
index 0ef3a49c5..c0fba7285 100644
--- a/archaeological_files/migrations/0101_squashed.py
+++ b/archaeological_files/migrations/0101_squashed.py
@@ -81,7 +81,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Archaeological file',
'verbose_name_plural': 'Archaeological files',
'ordering': ('cached_label',),
- 'permissions': (('view_file', 'Can view all Archaeological files'), ('view_own_file', 'Can view own Archaeological file'), ('add_own_file', 'Can add own Archaeological file'), ('change_own_file', 'Can change own Archaeological file'), ('delete_own_file', 'Can delete own Archaeological file'), ('close_file', 'Can close File')),
+ 'permissions': (('view_own_file', 'Can view own Archaeological file'), ('add_own_file', 'Can add own Archaeological file'), ('change_own_file', 'Can change own Archaeological file'), ('delete_own_file', 'Can delete own Archaeological file'), ('close_file', 'Can close File')),
},
bases=(archaeological_operations.models.ClosedItem,
ishtar_common.models.DocumentItem, ishtar_common.models.StatisticItem, ishtar_common.models.TemplateItem, models.Model, ishtar_common.models.CachedGen, ishtar_common.models_common.FixAssociated, ishtar_common.models.CascasdeUpdate, ishtar_common.models.OwnPerms, ishtar_common.models.ValueGetter, ishtar_common.models.ShortMenuItem, ishtar_common.models.DashboardFormItem),
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py
index 717422573..f56c108d8 100644
--- a/archaeological_finds/admin.py
+++ b/archaeological_finds/admin.py
@@ -17,10 +17,6 @@
# See the file COPYING for details.
-from ajax_select import make_ajax_form
-from ajax_select.fields import AutoCompleteSelectField, \
- AutoCompleteSelectMultipleField
-
from django import forms
from django.contrib import admin
from django.contrib.gis.forms import PointField, MultiPolygonField, \
@@ -43,7 +39,6 @@ class AdminBaseFindForm(forms.ModelForm):
widget=OSMWidget)
multi_polygon = MultiPolygonField(label=_("Multi polygon"), required=False,
widget=OSMWidget)
- context_record = AutoCompleteSelectField('context_record')
class BaseFindAdmin(HistorizedObjectAdmin):
@@ -51,6 +46,7 @@ class BaseFindAdmin(HistorizedObjectAdmin):
search_fields = ('label', 'cache_complete_id',)
model = models.BaseFind
form = AdminBaseFindForm
+ autocomplete_fields = ("context_record",)
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'cache_short_id', 'cache_complete_id',
]
@@ -66,12 +62,12 @@ class FindBasketAdmin(admin.ModelAdmin):
list_display = ["label", "user"]
search_fields = ('label', 'user__person__raw_name',)
readonly_fields = ["search_vector"]
- form = make_ajax_form(models.FindBasket, {
- 'user': 'ishtaruser',
- 'shared_with': 'ishtaruser',
- 'shared_write_with': 'ishtaruser',
- 'items': 'find',
- })
+ autocomplete_fields = (
+ 'user',
+ 'shared_with',
+ 'shared_write_with',
+ 'items',
+ )
admin_site.register(models.FindBasket, FindBasketAdmin)
@@ -81,22 +77,19 @@ class FindAdmin(HistorizedObjectAdmin):
list_display = ('label', 'operations_lbl', 'context_records_lbl', 'index',
'dating', 'materials')
list_filter = ('datings__period', 'material_types')
- search_fields = ('label', "base_finds__cache_complete_id",
- "base_finds__context_record__operation__cached_label")
+ search_fields = ('cached_label', "base_finds__cache_complete_id")
model = models.Find
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update({
- 'base_finds': 'base_find',
- 'container': 'container',
- 'container_ref': 'container',
- 'material_types': 'material_type',
- 'upstream_treatment': 'treatment',
- 'downstream_treatment': 'treatment',
- 'treatments': 'treatment',
- 'main_image': 'document',
- 'documents': 'document',
- })
- form = make_ajax_form(model, ajax_form_dict)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ 'base_finds',
+ 'container',
+ 'container_ref',
+ 'material_types',
+ 'upstream_treatment',
+ 'downstream_treatment',
+ 'treatments',
+ 'main_image',
+ 'documents',
+ ]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'datings', 'cached_label'
]
@@ -109,10 +102,7 @@ class PropertyAdmin(HistorizedObjectAdmin):
list_display = ['find', 'person', 'start_date', 'end_date']
search_fields = ('find__label', 'person__name')
model = models.Property
- form = make_ajax_form(model, {
- 'find': 'find',
- 'person': 'person',
- })
+ autocomplete_fields = ("find", "person")
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'administrative_act']
@@ -123,31 +113,24 @@ class PropertyAdmin(HistorizedObjectAdmin):
admin_site.register(models.Property, PropertyAdmin)
-class AdminTreatmentForm(forms.ModelForm):
- class Meta:
- model = models.Treatment
- exclude = []
- person = AutoCompleteSelectField('person', required=False)
- organization = AutoCompleteSelectField('organization', required=False)
- file = AutoCompleteSelectField('treatment_file', required=False)
- location = AutoCompleteSelectField("warehouse", required=False)
- container = AutoCompleteSelectField("container", required=False)
- scientific_monitoring_manager = AutoCompleteSelectField("person",
- required=False)
- # finds = AutoCompleteSelectMultipleField("find", required=False)
- lock_user = AutoCompleteSelectField("user", required=False)
-
-
class TreatmentAdmin(HistorizedObjectAdmin):
list_display = ('year', 'index', 'label', 'treatment_types_lbl', 'location',
'downstream_lbl', 'upstream_lbl', 'container', 'person')
list_filter = ('treatment_types', 'treatment_state', 'year')
model = models.Treatment
- form = AdminTreatmentForm
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'cached_label', 'downstream_lbl', 'upstream_lbl',
]
exclude = ["documents", "main_image"]
+ search_fields = ("cached_label",)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "person",
+ "organization",
+ "file",
+ "location",
+ "container",
+ "scientific_monitoring_manager",
+ ]
def has_add_permission(self, request):
return False
@@ -164,13 +147,11 @@ class TreatmentFileAdmin(HistorizedObjectAdmin):
'applicant__raw_name', 'applicant_organisation__name',
'cached_label')
model = models.TreatmentFile
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update({
- 'in_charge': 'person',
- 'applicant': 'person',
- 'applicant_organisation': 'organization',
- })
- form = make_ajax_form(model, ajax_form_dict)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ 'in_charge',
+ 'applicant',
+ 'applicant_organisation',
+ ]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'cached_label',
]
@@ -182,9 +163,7 @@ admin_site.register(models.TreatmentFile, TreatmentFileAdmin)
class ObjectTypeAdmin(GeneralTypeAdmin):
model = models.ObjectType
- form = make_ajax_form(model, {
- 'parent': 'object_type',
- })
+ autocomplete_fields = ("parent",)
admin_site.register(models.ObjectType, ObjectTypeAdmin)
@@ -192,9 +171,7 @@ admin_site.register(models.ObjectType, ObjectTypeAdmin)
class FunctionalAreaAdmin(GeneralTypeAdmin):
model = models.FunctionalArea
- form = make_ajax_form(model, {
- 'parent': 'functional_area',
- })
+ autocomplete_fields = ("parent",)
admin_site.register(models.FunctionalArea, FunctionalAreaAdmin)
@@ -203,9 +180,7 @@ admin_site.register(models.FunctionalArea, FunctionalAreaAdmin)
class MaterialTypeAdmin(GeneralTypeAdmin):
search_fields = ('label', 'parent__label', 'comment',)
model = models.MaterialType
- form = make_ajax_form(model, {
- 'parent': 'material_type',
- })
+ autocomplete_fields = ("parent",)
extra_list_display = ['recommendation']
diff --git a/archaeological_finds/lookups.py b/archaeological_finds/lookups.py
deleted file mode 100644
index 439bda3a4..000000000
--- a/archaeological_finds/lookups.py
+++ /dev/null
@@ -1,89 +0,0 @@
-from ajax_select import register
-
-from ishtar_common.lookups import LookupChannel, TypeLookupChannel
-
-from django.db.models import Q
-from django.utils.encoding import force_text
-from django.utils.html import escape
-
-from archaeological_finds import models
-
-
-@register("base_find")
-class BaseFindLookup(LookupChannel):
- model = models.BaseFind
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cache_complete_id__icontains=term) | Q(label__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cache_complete_id")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cache_complete_id
-
-
-@register("find")
-class FindLookup(LookupChannel):
- model = models.Find
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term) | Q(
- base_finds__cache_complete_id__icontains=term
- )
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.full_label
-
- def format_match(self, obj):
- return escape(force_text(obj.full_label))
-
-
-@register("treatment")
-class TreatmentLookup(LookupChannel):
- model = models.Treatment
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
-
-
-@register("treatment_file")
-class TreatmentFileLookup(LookupChannel):
- model = models.TreatmentFile
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
-
-
-@register("material_type")
-class MaterialTypeLookup(TypeLookupChannel):
- model = models.MaterialType
-
-
-@register("object_type")
-class MaterialTypeLookup(TypeLookupChannel):
- model = models.ObjectType
-
-
-@register("functional_area")
-class FunctionalAreaLookup(TypeLookupChannel):
- model = models.FunctionalArea
diff --git a/archaeological_finds/migrations/0101_squashed.py b/archaeological_finds/migrations/0101_squashed.py
index 7f4df1aa9..ef74d0e9e 100644
--- a/archaeological_finds/migrations/0101_squashed.py
+++ b/archaeological_finds/migrations/0101_squashed.py
@@ -101,7 +101,7 @@ class Migration(migrations.Migration):
options={
'verbose_name': 'Base find',
'verbose_name_plural': 'Base finds',
- 'permissions': (('view_basefind', 'Can view all Base finds'), ('view_own_basefind', 'Can view own Base find'), ('add_own_basefind', 'Can add own Base find'), ('change_own_basefind', 'Can change own Base find'), ('delete_own_basefind', 'Can delete own Base find')),
+ 'permissions': (('view_own_basefind', 'Can view own Base find'), ('add_own_basefind', 'Can add own Base find'), ('change_own_basefind', 'Can change own Base find'), ('delete_own_basefind', 'Can delete own Base find')),
},
bases=(ishtar_common.models.BulkUpdatedItem,
ishtar_common.models.StatisticItem, ishtar_common.models.TemplateItem, models.Model, ishtar_common.models.CachedGen, ishtar_common.models_common.FixAssociated, ishtar_common.models.CascasdeUpdate, ishtar_common.models.OwnPerms, ishtar_common.models.ValueGetter),
@@ -234,7 +234,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Find',
'verbose_name_plural': 'Finds',
'ordering': ('cached_label',),
- 'permissions': (('view_find', 'Can view all Finds'), ('view_own_find', 'Can view own Find'), ('add_own_find', 'Can add own Find'), ('change_own_find', 'Can change own Find'), ('delete_own_find', 'Can delete own Find')),
+ 'permissions': (('view_own_find', 'Can view own Find'), ('add_own_find', 'Can add own Find'), ('change_own_find', 'Can change own Find'), ('delete_own_find', 'Can delete own Find')),
},
bases=(ishtar_common.models.BulkUpdatedItem,
ishtar_common.models.ValueGetter, ishtar_common.models.DocumentItem, ishtar_common.models.StatisticItem, ishtar_common.models.TemplateItem, models.Model, ishtar_common.models.CachedGen, ishtar_common.models_common.FixAssociated, ishtar_common.models.CascasdeUpdate, ishtar_common.models.ImageContainerModel, ishtar_common.models.OwnPerms, ishtar_common.models.MainItem),
@@ -602,7 +602,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Treatment',
'verbose_name_plural': 'Treatments',
'ordering': ('-year', '-index', '-start_date'),
- 'permissions': (('view_treatment', 'Can view all Treatments'), ('view_own_treatment', 'Can view own Treatment'), ('add_own_treatment', 'Can add own Treatment'), ('change_own_treatment', 'Can change own Treatment'), ('delete_own_treatment', 'Can delete own Treatment')),
+ 'permissions': (('view_own_treatment', 'Can view own Treatment'), ('add_own_treatment', 'Can add own Treatment'), ('change_own_treatment', 'Can change own Treatment'), ('delete_own_treatment', 'Can delete own Treatment')),
},
bases=(ishtar_common.models.DashboardFormItem,
ishtar_common.models.ValueGetter,
@@ -663,7 +663,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Treatment request',
'verbose_name_plural': 'Treatment requests',
'ordering': ('cached_label',),
- 'permissions': (('view_treatmentfile', 'Can view all Treatment requests'), ('view_own_treatmentfile', 'Can view own Treatment request'), ('add_own_treatmentfile', 'Can add own Treatment request'), ('change_own_treatmentfile', 'Can change own Treatment request'), ('delete_own_treatmentfile', 'Can delete own Treatment request')),
+ 'permissions': (('view_own_treatmentfile', 'Can view own Treatment request'), ('add_own_treatmentfile', 'Can add own Treatment request'), ('change_own_treatmentfile', 'Can change own Treatment request'), ('delete_own_treatmentfile', 'Can delete own Treatment request')),
},
bases=(ishtar_common.models.DashboardFormItem,
archaeological_operations.models.ClosedItem,
diff --git a/archaeological_operations/admin.py b/archaeological_operations/admin.py
index 0650d4711..68264b97e 100644
--- a/archaeological_operations/admin.py
+++ b/archaeological_operations/admin.py
@@ -17,10 +17,6 @@
# See the file COPYING for details.
-from ajax_select import make_ajax_form
-from ajax_select.fields import AutoCompleteSelectField, \
- AutoCompleteSelectMultipleField
-
from django import forms
from django.conf import settings
from django.contrib import admin
@@ -43,9 +39,7 @@ class AdministrativeActAdmin(HistorizedObjectAdmin):
'in_charge', 'operator', 'scientist', 'signatory', 'associated_file',
'departments_label', 'towns_label']
model = models.AdministrativeAct
- form = make_ajax_form(
- models.AdministrativeAct, {'operation': 'operation'}
- )
+ autocomplete_fields = ("operation",)
admin_site.register(models.AdministrativeAct, AdministrativeActAdmin)
@@ -63,8 +57,7 @@ admin_site.register(models.Period, PeriodAdmin)
class OperationInline(admin.TabularInline):
model = models.Operation.archaeological_sites.through
- form = make_ajax_form(
- model, {'operation': 'operation'})
+ autocomplete_fields = ("operation",)
extra = 1
@@ -73,12 +66,7 @@ class ArchaeologicalSiteAdmin(HistorizedObjectAdmin):
search_fields = ('name', 'reference')
model = models.ArchaeologicalSite
inlines = [OperationInline]
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update({
- 'towns': 'town',
- })
- form = make_ajax_form(
- models.ArchaeologicalSite, ajax_form_dict)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + ["towns"]
exclude = ["documents", "main_image"]
@@ -87,8 +75,7 @@ admin_site.register(models.ArchaeologicalSite, ArchaeologicalSiteAdmin)
class ArchaeologicalSiteInline(admin.TabularInline):
model = models.Operation.archaeological_sites.through
- form = make_ajax_form(
- model, {'archaeologicalsite': 'archaeological_site'})
+ autocomplete_fields = ["archaeologicalsite"]
extra = 1
@@ -100,17 +87,6 @@ class AdminOperationForm(forms.ModelForm):
widget=OSMWidget)
multi_polygon = MultiPolygonField(label=_("Multi polygon"), required=False,
widget=OSMWidget)
- in_charge = AutoCompleteSelectField('person', required=False)
- scientist = AutoCompleteSelectField('person', required=False)
- associated_file = AutoCompleteSelectField('file', required=False)
- operator = AutoCompleteSelectField('organization', required=False)
- collaborators = AutoCompleteSelectMultipleField('person', required=False)
- towns = AutoCompleteSelectMultipleField('town', required=False)
- archaeological_sites = AutoCompleteSelectMultipleField(
- 'archaeological_site', required=False)
- if settings.COUNTRY == 'fr':
- cira_rapporteur = AutoCompleteSelectField('person', required=False)
- lock_user = AutoCompleteSelectField('user', required=False)
class OperationAdmin(HistorizedObjectAdmin):
@@ -124,6 +100,17 @@ class OperationAdmin(HistorizedObjectAdmin):
model = models.Operation
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'cached_label', 'top_sites']
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "in_charge",
+ "scientist",
+ "associated_file",
+ "operator",
+ "collaborators",
+ "towns",
+ "archaeological_sites",
+ "cira_rapporteur",
+ "lock_user",
+ ]
form = AdminOperationForm
inlines = [ArchaeologicalSiteInline]
exclude = ["documents", "main_image"]
@@ -136,13 +123,13 @@ class ParcelAdmin(MergeActionAdmin, HistorizedObjectAdmin):
list_display = ['section', 'parcel_number', 'operation', 'associated_file']
search_fields = ('operation__cached_label',
'associated_file__cached_label',
- 'year', 'section', 'parcel_number')
+ 'year', 'section', 'parcel_number', 'town__name')
model = models.Parcel
- form = make_ajax_form(
- model, {'associated_file': 'file',
- 'operation': 'operation',
- 'town': 'town'}
- )
+ autocomplete_fields = [
+ 'associated_file',
+ 'operation',
+ 'town',
+ ]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'history_date'
]
@@ -157,9 +144,10 @@ class RecordRelationsAdmin(admin.ModelAdmin):
model = models.RecordRelations
search_fields = ['left_record__cached_label',
'right_record__cached_label']
- form = make_ajax_form(
- model, {'left_record': 'operation',
- 'right_record': 'operation'})
+ autocomplete_fields = [
+ 'left_record',
+ 'right_record'
+ ]
admin_site.register(models.RecordRelations, RecordRelationsAdmin)
@@ -204,10 +192,9 @@ class ParcelOwnerAdmin(HistorizedObjectAdmin):
'owner__name', 'owner__surname', 'parcel__section',
'parcel__parcel_number')
model = models.ParcelOwner
- form = make_ajax_form(
- model, {'owner': 'person',
- 'parcel': 'parcel'}
- )
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "owner", "parcel"
+ ]
readonly_fields = HistorizedObjectAdmin.readonly_fields + [
'history_date'
]
@@ -219,9 +206,7 @@ admin_site.register(models.ParcelOwner, ParcelOwnerAdmin)
class CulturalAttributionTypeAdmin(GeneralTypeAdmin):
search_fields = ('label', 'parent__label', )
model = models.CulturalAttributionType
- form = make_ajax_form(model, {
- 'parent': 'cultural_attribution_type',
- })
+ autocomplete_fields = ['parent']
admin_site.register(models.CulturalAttributionType,
diff --git a/archaeological_operations/lookups.py b/archaeological_operations/lookups.py
deleted file mode 100644
index 0b590374e..000000000
--- a/archaeological_operations/lookups.py
+++ /dev/null
@@ -1,82 +0,0 @@
-from ajax_select import register
-
-from ishtar_common.lookups import LookupChannel, TypeLookupChannel
-
-from django.db.models import Q
-from django.utils.encoding import force_text
-from django.utils.html import escape
-
-from archaeological_operations.models import (
- Operation,
- ArchaeologicalSite,
- Parcel,
- CulturalAttributionType,
-)
-
-
-@register("operation")
-class OperationLookup(LookupChannel):
- model = Operation
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(cached_label__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
-
-
-@register("archaeological_site")
-class ArchaeologicalSiteLookup(LookupChannel):
- model = ArchaeologicalSite
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(reference__icontains=term) | Q(name__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("reference", "name")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>".format(item)
-
-
-@register("parcel")
-class ParcelLookup(LookupChannel):
- model = Parcel
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = (
- Q(associated_file__cached_label__icontains=term)
- | Q(operation__cached_label__icontains=term)
- | Q(section__icontains=term)
- | Q(parcel_number__icontains=term)
- | Q(town__name__icontains=term)
- )
- try:
- subquery |= Q(year=int(term))
- except ValueError:
- pass
- query &= subquery
- return self.model.objects.filter(query).order_by(
- "-associated_file__cached_label",
- "-operation__cached_label",
- "section",
- "parcel_number",
- )[:20]
-
- def format_match(self, obj):
- return escape(force_text(obj.long_label()))
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.long_label()
-
-
-@register("cultural_attribution_type")
-class CulturalAttributionTypeLookup(TypeLookupChannel):
- model = CulturalAttributionType
diff --git a/archaeological_operations/migrations/0101_squashed.py b/archaeological_operations/migrations/0101_squashed.py
index 7027406b8..b5b983460 100644
--- a/archaeological_operations/migrations/0101_squashed.py
+++ b/archaeological_operations/migrations/0101_squashed.py
@@ -86,7 +86,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Administrative act',
'verbose_name_plural': 'Administrative acts',
'ordering': ('year', 'signature_date', 'index', 'act_type'),
- 'permissions': (('view_administrativeact', 'Can view all Administrative acts'), ('view_own_administrativeact', 'Can view own Administrative act'), ('add_own_administrativeact', 'Can add own Administrative act'), ('change_own_administrativeact', 'Can change own Administrative act'), ('delete_own_administrativeact', 'Can delete own Administrative act')),
+ 'permissions': (('view_own_administrativeact', 'Can view own Administrative act'), ('add_own_administrativeact', 'Can add own Administrative act'), ('change_own_administrativeact', 'Can change own Administrative act'), ('delete_own_administrativeact', 'Can delete own Administrative act')),
},
bases=(ishtar_common.models.StatisticItem,
ishtar_common.models.TemplateItem, models.Model,
@@ -139,7 +139,7 @@ class Migration(migrations.Migration):
options={
'verbose_name': 'Archaeological site',
'verbose_name_plural': 'Archaeological sites',
- 'permissions': (('view_archaeologicalsite', 'Can view all Archaeological sites'), ('view_own_archaeologicalsite', 'Can view own Archaeological site'), ('add_own_archaeologicalsite', 'Can add own Archaeological site'), ('change_own_archaeologicalsite', 'Can change own Archaeological site'), ('delete_own_archaeologicalsite', 'Can delete own Archaeological site')),
+ 'permissions': (('view_own_archaeologicalsite', 'Can view own Archaeological site'), ('add_own_archaeologicalsite', 'Can add own Archaeological site'), ('change_own_archaeologicalsite', 'Can change own Archaeological site'), ('delete_own_archaeologicalsite', 'Can delete own Archaeological site')),
},
bases=(ishtar_common.models.DocumentItem,
ishtar_common.models.StatisticItem,
@@ -446,7 +446,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Operation',
'verbose_name_plural': 'Operations',
'ordering': ('cached_label',),
- 'permissions': (('view_operation', 'Can view all Operations'), ('view_own_operation', 'Can view own Operation'), ('add_own_operation', 'Can add own Operation'), ('change_own_operation', 'Can change own Operation'), ('delete_own_operation', 'Can delete own Operation'), ('close_operation', 'Can close Operation')),
+ 'permissions': (('view_own_operation', 'Can view own Operation'), ('add_own_operation', 'Can add own Operation'), ('change_own_operation', 'Can change own Operation'), ('delete_own_operation', 'Can delete own Operation'), ('close_operation', 'Can close Operation')),
},
bases=(archaeological_operations.models.ClosedItem,
ishtar_common.models.DocumentItem,
diff --git a/archaeological_warehouse/admin.py b/archaeological_warehouse/admin.py
index c186950d3..dad92881d 100644
--- a/archaeological_warehouse/admin.py
+++ b/archaeological_warehouse/admin.py
@@ -17,8 +17,6 @@
# See the file COPYING for details.
-from ajax_select import make_ajax_form
-
from django.contrib import admin
from ishtar_common.apps import admin_site
@@ -36,18 +34,13 @@ class DivisionInline(admin.TabularInline):
class WarehouseAdmin(HistorizedObjectAdmin):
list_display = ("name", "warehouse_type", "town")
list_filter = ("warehouse_type",)
- search_fields = ("name", "town")
+ search_fields = ("name", "town", "warehouse_type")
model = models.Warehouse
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update(
- {
- "town": "town",
- "precise_town": "town",
- "person_in_charge": "person",
- "organization": "organization",
- }
- )
- form = make_ajax_form(model, ajax_form_dict)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "precise_town",
+ "person_in_charge",
+ "organization"
+ ]
inlines = [DivisionInline]
exclude = ["documents", "main_image"]
@@ -79,11 +72,12 @@ class ContainerAdmin(HistorizedObjectAdmin):
"container_type",
)
list_filter = ("container_type",)
+ search_fields = ("reference", "container_type", "cached_label", "responsible")
model = models.Container
readonly_fields = HistorizedObjectAdmin.readonly_fields + ["history_date"]
- ajax_form_dict = HistorizedObjectAdmin.AJAX_FORM_DICT.copy()
- ajax_form_dict.update({"location": "warehouse", "responsible": "warehouse"})
- form = make_ajax_form(model, ajax_form_dict)
+ autocomplete_fields = HistorizedObjectAdmin.autocomplete_fields + [
+ "location", "responsible"
+ ]
exclude = ["documents", "main_image"]
diff --git a/archaeological_warehouse/lookups.py b/archaeological_warehouse/lookups.py
deleted file mode 100644
index 9b221ea5b..000000000
--- a/archaeological_warehouse/lookups.py
+++ /dev/null
@@ -1,47 +0,0 @@
-from ajax_select import register
-
-from ishtar_common.lookups import LookupChannel
-
-from django.db.models import Q
-from django.utils.encoding import force_text
-from django.utils.html import escape
-
-from archaeological_warehouse import models
-
-
-@register("container")
-class ContainerLookup(LookupChannel):
- model = models.Container
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = (
- Q(reference__icontains=term)
- | Q(container_type__label__icontains=term)
- | Q(cached_label__icontains=term)
- | Q(responsible__name__icontains=term)
- )
- query &= subquery
- return self.model.objects.filter(query).order_by("cached_label")[:20]
-
- def format_match(self, obj):
- return escape(force_text(obj.cached_label))
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.cached_label
-
-
-@register("warehouse")
-class WarehouseLookup(LookupChannel):
- model = models.Warehouse
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(" "):
- subquery = Q(warehouse_type__label=term) | Q(name__icontains=term)
- query &= subquery
- return self.model.objects.filter(query).order_by("name")[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % item.name
diff --git a/archaeological_warehouse/migrations/0101_squashed.py b/archaeological_warehouse/migrations/0101_squashed.py
index 77fccef09..b98679dd7 100644
--- a/archaeological_warehouse/migrations/0101_squashed.py
+++ b/archaeological_warehouse/migrations/0101_squashed.py
@@ -90,7 +90,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Container',
'verbose_name_plural': 'Containers',
'ordering': ('cached_label',),
- 'permissions': (('view_container', 'Can view all Containers'), ('view_own_container', 'Can view own Container'), ('add_own_container', 'Can add own Container'), ('change_own_container', 'Can change own Container'), ('delete_own_container', 'Can delete own Container')),
+ 'permissions': (('view_own_container', 'Can view own Container'), ('add_own_container', 'Can add own Container'), ('change_own_container', 'Can change own Container'), ('delete_own_container', 'Can delete own Container')),
},
bases=(ishtar_common.models.DocumentItem,
ishtar_common.models.StatisticItem, ishtar_common.models.TemplateItem, models.Model, ishtar_common.models.CachedGen, ishtar_common.models_common.FixAssociated, ishtar_common.models.CascasdeUpdate, ishtar_common.models.ImageContainerModel, ishtar_common.models.OwnPerms, ishtar_common.models.MainItem),
@@ -182,7 +182,7 @@ class Migration(migrations.Migration):
options={
'verbose_name': 'Warehouse',
'verbose_name_plural': 'Warehouses',
- 'permissions': (('view_warehouse', 'Can view all Warehouses'), ('view_own_warehouse', 'Can view own Warehouse'), ('add_own_warehouse', 'Can add own Warehouse'), ('change_own_warehouse', 'Can change own Warehouse'), ('delete_own_warehouse', 'Can delete own Warehouse')),
+ 'permissions': (('view_own_warehouse', 'Can view own Warehouse'), ('add_own_warehouse', 'Can add own Warehouse'), ('change_own_warehouse', 'Can change own Warehouse'), ('delete_own_warehouse', 'Can delete own Warehouse')),
},
bases=(ishtar_common.models.StatisticItem,
ishtar_common.models.TemplateItem, ishtar_common.models.DocumentItem, models.Model, ishtar_common.models.CachedGen, ishtar_common.models_common.FixAssociated, ishtar_common.models.CascasdeUpdate, ishtar_common.models.ImageContainerModel, ishtar_common.models.DashboardFormItem, ishtar_common.models.OwnPerms, ishtar_common.models.MainItem),
diff --git a/archaeological_warehouse/migrations/0111_auto_20210225_1039.py b/archaeological_warehouse/migrations/0111_auto_20210225_1039.py
index f68b468f2..5802af221 100644
--- a/archaeological_warehouse/migrations/0111_auto_20210225_1039.py
+++ b/archaeological_warehouse/migrations/0111_auto_20210225_1039.py
@@ -15,7 +15,7 @@ class Migration(migrations.Migration):
operations = [
migrations.AlterModelOptions(
name='container',
- options={'ordering': ('location', 'index', 'cached_label'), 'permissions': (('view_container', 'Can view all Containers'), ('view_own_container', 'Can view own Container'), ('add_own_container', 'Can add own Container'), ('change_own_container', 'Can change own Container'), ('delete_own_container', 'Can delete own Container')), 'verbose_name': 'Container', 'verbose_name_plural': 'Containers'},
+ options={'ordering': ('location', 'index', 'cached_label'), 'permissions': (('view_own_container', 'Can view own Container'), ('add_own_container', 'Can add own Container'), ('change_own_container', 'Can change own Container'), ('delete_own_container', 'Can delete own Container')), 'verbose_name': 'Container', 'verbose_name_plural': 'Containers'},
),
migrations.AlterField(
model_name='container',
diff --git a/example_project/settings.py b/example_project/settings.py
index 16a63d49a..b98158b10 100644
--- a/example_project/settings.py
+++ b/example_project/settings.py
@@ -162,7 +162,6 @@ INSTALLED_APPS = [
"archaeological_context_records",
"archaeological_warehouse",
"archaeological_finds",
- "ajax_select",
"compressor",
"rest_framework",
"rest_framework.authtoken",
diff --git a/example_project/urls.py b/example_project/urls.py
index 5eff7a9c4..40e5c36db 100644
--- a/example_project/urls.py
+++ b/example_project/urls.py
@@ -3,7 +3,6 @@ from django.conf.urls import include, url
from django.contrib import admin
from ishtar_common.apps import admin_site
-from ajax_select import urls as ajax_select_urls
from ishtar_common.views import index
from ishtar_common.urls_registration import urlpatterns
@@ -22,7 +21,6 @@ for app in APP_LIST:
urlpatterns += [
url(r'^admin/', include(admin_site.urls[:2])),
- url(r'^ajax-select/', include(ajax_select_urls)),
url(r'', include('ishtar_common.urls')),
url(r'^$', index, name='start'),
]
diff --git a/fixtures/initial_data-auth-fr.json b/fixtures/initial_data-auth-fr.json
index 43a7f4d34..a74c70fa9 100644
--- a/fixtures/initial_data-auth-fr.json
+++ b/fixtures/initial_data-auth-fr.json
@@ -233,39 +233,6 @@
{
"model": "auth.permission",
"fields": {
- "name": "Can add registration profile",
- "content_type": [
- "registration",
- "registrationprofile"
- ],
- "codename": "add_registrationprofile"
- }
-},
-{
- "model": "auth.permission",
- "fields": {
- "name": "Can change registration profile",
- "content_type": [
- "registration",
- "registrationprofile"
- ],
- "codename": "change_registrationprofile"
- }
-},
-{
- "model": "auth.permission",
- "fields": {
- "name": "Can delete registration profile",
- "content_type": [
- "registration",
- "registrationprofile"
- ],
- "codename": "delete_registrationprofile"
- }
-},
-{
- "model": "auth.permission",
- "fields": {
"name": "Can add item key",
"content_type": [
"ishtar_common",
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index 69f8ec92c..5953896bd 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -29,9 +29,6 @@ import zipfile
from rest_framework.authtoken.admin import TokenAdmin
from rest_framework.authtoken.models import Token
-from ajax_select import make_ajax_form
-from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField
-
from django.conf import settings
from django.conf.urls import url
from django.contrib import admin, messages
@@ -449,9 +446,7 @@ class HistorizedObjectAdmin(admin.ModelAdmin):
"history_m2m",
]
- AJAX_FORM_DICT = {
- "lock_user": "user",
- }
+ autocomplete_fields = ["lock_user"]
def save_model(self, request, obj, form, change):
obj.history_modifier = request.user
@@ -526,7 +521,7 @@ class OrganizationAdmin(HistorizedObjectAdmin):
"merge_candidate",
)
model = models.Organization
- form = make_ajax_form(model, {"precise_town": "town"})
+ autocomplete_fields = ["precise_town"]
admin_site.register(models.Organization, OrganizationAdmin)
@@ -542,13 +537,13 @@ class ProfileInline(admin.TabularInline):
class PersonAdmin(HistorizedObjectAdmin):
list_display = ("pk", "name", "surname", "raw_name", "email")
list_filter = ("person_types",)
- search_fields = ("name", "surname", "email", "raw_name")
+ search_fields = ("name", "surname", "email", "raw_name", "attached_to__name")
exclude = (
"merge_key",
"merge_exclusion",
"merge_candidate",
)
- form = make_ajax_form(models.Person, {"attached_to": "organization"})
+ autocomplete_fields = ["attached_to"]
model = models.Person
inlines = [ProfileInline]
@@ -559,9 +554,10 @@ admin_site.register(models.Person, PersonAdmin)
class AuthorAdmin(admin.ModelAdmin):
list_display = ["person", "author_type"]
list_filter = ("author_type",)
- search_fields = ("person__name", "person__surname", "person__attached_to__name")
+ search_fields = ("person__name", "person__surname", "person__attached_to__name",
+ "author_type__label")
model = models.Author
- form = make_ajax_form(models.Author, {"person": "person"})
+ autocomplete_fields = ["person"]
admin_site.register(models.Author, AuthorAdmin)
@@ -992,14 +988,6 @@ class ImportJSONActionAdmin(admin.ModelAdmin):
)
-class AdminRelatedTownForm(forms.ModelForm):
- class Meta:
- model = models_common.Town.children.through
- exclude = []
-
- from_town = AutoCompleteSelectField("town", required=True, label=_("Parent"))
-
-
class AdminTownForm(forms.ModelForm):
class Meta:
model = models_common.Town
@@ -1007,15 +995,12 @@ class AdminTownForm(forms.ModelForm):
center = PointField(label=_("Center"), required=False, widget=OSMWidget)
limit = MultiPolygonField(label=_("Limit"), required=False, widget=OSMWidget)
- children = AutoCompleteSelectMultipleField(
- "town", required=False, label=_("Town children")
- )
class TownParentInline(admin.TabularInline):
model = models_common.Town.children.through
fk_name = "to_town"
- form = AdminRelatedTownForm
+ autocomplete_fields = ["from_town"]
verbose_name = _("Parent")
verbose_name_plural = _("Parents")
extra = 1
@@ -1030,9 +1015,10 @@ class TownAdmin(ImportGEOJSONActionAdmin, ImportActionAdmin):
readonly_fields = ["cached_label"]
if settings.COUNTRY == "fr":
list_display += ["numero_insee"]
- search_fields += ["numero_insee", "areas__label"]
+ search_fields += ["numero_insee"]
list_filter = ("areas",)
form = AdminTownForm
+ autocomplete_fields = ["children"]
inlines = [TownParentInline]
actions = [
export_as_csv_action(exclude=["center", "limit"]),
@@ -1092,6 +1078,7 @@ class GeneralTypeAdmin(ChangeParentAdmin, ImportActionAdmin, ImportJSONActionAdm
list_filter = self.get_list_filter(request)
search_fields = self.get_search_fields(request)
list_select_related = self.get_list_select_related(request)
+ sortable_by = self.get_sortable_by(request)
cl = ChangeListForChangeView(
request,
@@ -1106,6 +1093,7 @@ class GeneralTypeAdmin(ChangeParentAdmin, ImportActionAdmin, ImportJSONActionAdm
self.list_max_show_all,
self.list_editable,
self,
+ sortable_by,
)
return cl.get_queryset(request)
@@ -1273,13 +1261,13 @@ class CreateDepartmentActionAdmin(GeneralTypeAdmin):
@admin.register(models.SupportType, site=admin_site)
class SupportType(GeneralTypeAdmin):
model = models.SupportType
- form = make_ajax_form(model, {"document_types": "source_type"})
+ autocomplete_fields = ["document_types"]
@admin.register(models.Format, site=admin_site)
class Format(GeneralTypeAdmin):
model = models.Format
- form = make_ajax_form(model, {"document_types": "source_type"})
+ autocomplete_fields = ["document_types"]
@admin.register(models.DocumentTag, site=admin_site)
@@ -1287,12 +1275,20 @@ class DocumentTag(MergeActionAdmin, GeneralTypeAdmin):
pass
+class DocumentAdmin(admin.ModelAdmin):
+ model = models.Document
+ search_fields = ("title", "reference", "internal_reference")
+
+
+admin_site.register(models.Document, DocumentAdmin)
+
+
class AreaAdmin(CreateDepartmentActionAdmin):
list_display = ("label", "reference", "parent", "available")
search_fields = ("label", "reference")
list_filter = ("parent",)
model = models.Area
- form = make_ajax_form(model, {"towns": "town"})
+ autocomplete_fields = ["towns"]
admin_site.register(models.Area, AreaAdmin)
@@ -1350,6 +1346,14 @@ class ProfileTypeSummaryAdmin(admin.ModelAdmin):
admin_site.register(models.ProfileTypeSummary, ProfileTypeSummaryAdmin)
+class IshtarUserAdmin(admin.ModelAdmin):
+ model = models.IshtarUser
+ search_fields = ("user_ptr", "person")
+
+
+admin_site.register(models.IshtarUser, IshtarUserAdmin)
+
+
class ImporterDefaultValuesInline(admin.TabularInline):
model = models.ImporterDefaultValues
@@ -1480,7 +1484,7 @@ class ImporterTypeAdmin(ImportJSONActionAdmin):
]
list_filter = ["available"]
search_fields = ["name"]
- form = make_ajax_form(models.ImporterType, {"users": "ishtaruser"})
+ autocomplete_fields = ["users"]
prepopulated_fields = {"slug": ("name",)}
@@ -1690,7 +1694,7 @@ class ImportAdmin(admin.ModelAdmin):
"state",
"creation_date",
)
- form = make_ajax_form(models.Import, {"user": "ishtaruser"})
+ autocomplete_fields = ["user"]
admin_site.register(models.Import, ImportAdmin)
@@ -1818,17 +1822,6 @@ def get_choices_form():
return forms
-class CustomFormForm(forms.ModelForm):
- class Meta:
- model = models.CustomForm
- exclude = []
-
- form = forms.ChoiceField(label=_("Form"), choices=get_choices_form)
- users = AutoCompleteSelectMultipleField(
- "ishtaruser", required=False, label=_("Users")
- )
-
-
class ExcludeFieldFormset(BaseInlineFormSet):
def get_form_kwargs(self, index):
kwargs = super(ExcludeFieldFormset, self).get_form_kwargs(index)
@@ -1909,7 +1902,7 @@ class CustomFormAdmin(admin.ModelAdmin):
"user_types",
"profile_types",
)
- form = CustomFormForm
+ autocomplete_fields = ["users"]
inlines = [ExcludeFieldInline, JsonFieldInline]
def get_inline_instances(self, request, obj=None):
@@ -2012,7 +2005,7 @@ class ExportTaskAdmin(admin.ModelAdmin):
]
list_filter = ["state"]
actions = [launch_export_action]
- form = make_ajax_form(models.ExportTask, {"lock_user": "user"})
+ autocomplete_fields = ["lock_user"]
admin_site.register(models.ExportTask, ExportTaskAdmin)
@@ -2061,7 +2054,7 @@ class ImportTaskAdmin(admin.ModelAdmin):
"finished_date",
]
list_filter = ["state"]
- form = make_ajax_form(models.ImportTask, {"import_user": "user"})
+ autocomplete_fields = ["import_user"]
actions = [launch_import_action]
class Media:
@@ -2076,7 +2069,7 @@ class UserProfileAdmin(admin.ModelAdmin):
list_filter = ["profile_type"]
search_fields = ["person__raw_name"]
model = models.UserProfile
- form = make_ajax_form(model, {"areas": "area"})
+ autocomplete_fields = ["areas"]
admin_site.register(models.UserProfile, UserProfileAdmin)
diff --git a/ishtar_common/apps.py b/ishtar_common/apps.py
index 7e2d624d3..fda45ed73 100644
--- a/ishtar_common/apps.py
+++ b/ishtar_common/apps.py
@@ -10,7 +10,9 @@ class IshtarAdminSite(AdminSite):
site_title = _("Ishtar administration")
-admin_site = IshtarAdminSite(name="ishtaradmin")
+admin_site = IshtarAdminSite()
+# AFAC
+#name="ishtaradmin")
class TranslationOverloadConfig(AppConfig):
diff --git a/ishtar_common/lookups.py b/ishtar_common/lookups.py
deleted file mode 100644
index 66b43f3e4..000000000
--- a/ishtar_common/lookups.py
+++ /dev/null
@@ -1,167 +0,0 @@
-from ajax_select import register, LookupChannel as BaseLookupChannel
-
-from django.conf import settings
-from django.contrib.auth.models import User
-from django.db.models import Q
-from ishtar_common import models
-
-
-class LookupChannel(BaseLookupChannel):
- def get_objects(self, items):
- # TODO: why IDs are not given here? M2M issue
- ids = []
- for item in items:
- if hasattr(item, 'pk'):
- ids.append(item.pk)
- else:
- ids.append(item)
-
- # TODO: strange bug on Import edit
- # copied from lookup_channel.py
- if getattr(self.model._meta.pk, "remote_field", False):
- # Use the type of the field being referenced (2.0+)
- # modification is here
- # pk_type = self.model._meta.pk.remote_field.field.to_python
- pk_type = int
- elif getattr(self.model._meta.pk, "rel", False):
- # Use the type of the field being referenced
- pk_type = self.model._meta.pk.rel.field.to_python
- else:
- pk_type = self.model._meta.pk.to_python
-
- # Return objects in the same order as passed in here
- ids = [pk_type(pk) for pk in ids]
- things = self.model.objects.in_bulk(ids)
- return [things[aid] for aid in ids if aid in things]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % str(item)
-
-
-class TypeLookupChannel(LookupChannel):
- def get_query(self, q, request):
- query = Q(label__icontains=q) | Q(label__icontains=q)
- return self.model.objects.filter(query).order_by('label')[:20]
-
-
-@register('town')
-class TownLookup(LookupChannel):
- model = models.Town
-
- def get_query(self, q, request):
- if settings.COUNTRY == 'fr':
- query = Q()
- for term in q.strip().split(' '):
- query &= (
- Q(name__icontains=term) | Q(numero_insee__icontains=term)
- )
- else:
- query = Q(name__icontains=q)
- return self.model.objects.filter(query).order_by('name')[:20]
-
-
-@register('user')
-class UserLookup(LookupChannel):
- model = User
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(' '):
- query &= (
- Q(username__icontains=term) |
- Q(first_name__icontains=term) |
- Q(last_name__icontains=term) |
- Q(email__icontains=term)
- )
- return self.model.objects.filter(query).order_by('username')[:20]
-
-
-@register('organization')
-class OrganizationLookup(LookupChannel):
- model = models.Organization
-
- def get_query(self, q, request):
- return self.model.objects.filter(
- name__icontains=q).order_by('name')[:20]
-
-
-@register('person')
-class PersonLookup(LookupChannel):
- model = models.Person
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(' '):
- query &= (
- Q(name__icontains=term) | Q(surname__icontains=term) |
- Q(email__icontains=term) | Q(attached_to__name__icontains=term)|
- Q(raw_name__icontains=term)
- )
- return self.model.objects.filter(query).order_by('name')[:20]
-
-
-@register('author')
-class AuthorLookup(LookupChannel):
- model = models.Author
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(' '):
- query &= (
- Q(person__name__icontains=term) |
- Q(person__surname__icontains=term) |
- Q(person__raw_name__icontains=term) |
- Q(person__attached_to__name__icontains=term) |
- Q(author_type__label__icontains=term)
- )
- return self.model.objects.filter(query).order_by('person__name')[:20]
-
-
-@register('ishtaruser')
-class UserLookup(LookupChannel):
- model = models.IshtarUser
-
- def get_query(self, q, request):
- query = Q()
- for term in q.strip().split(' '):
- query &= (
- Q(user_ptr__username__icontains=term) |
- Q(person__name__icontains=term) |
- Q(person__surname__icontains=term) |
- Q(person__email__icontains=term) |
- Q(person__attached_to__name__icontains=term)|
- Q(person__raw_name__icontains=term)
- )
- return self.model.objects.filter(query).order_by('person__name')[:20]
-
- def format_item_display(self, item):
- return "<span class='ajax-label'>%s</span>" % str(item.person)
-
-
-@register('area')
-class AreaLookup(LookupChannel):
- model = models.Area
-
- def get_query(self, q, request):
- query = Q(label__icontains=q)
- return self.model.objects.filter(query).order_by('label')[:20]
-
-
-@register('document')
-class DocumentLookup(LookupChannel):
- model = models.Document
-
- def get_query(self, q, request):
- query = Q(title__icontains=q) | Q(reference__icontains=q) | Q(
- internal_reference__icontains=q
- )
- return self.model.objects.filter(query).order_by('title')[:20]
-
-
-@register('source_type')
-class SourceTypeLookup(LookupChannel):
- model = models.SourceType
-
- def get_query(self, q, request):
- query = Q(label__icontains=q)
- return self.model.objects.filter(query).order_by('label')[:20]
diff --git a/ishtar_common/migrations/0201_squashed.py b/ishtar_common/migrations/0201_squashed.py
index 5e97e5f08..3c4933613 100644
--- a/ishtar_common/migrations/0201_squashed.py
+++ b/ishtar_common/migrations/0201_squashed.py
@@ -93,7 +93,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Author',
'verbose_name_plural': 'Authors',
'ordering': ('author_type__order', 'person__name'),
- 'permissions': (('view_author', 'Can view all Authors'), ('view_own_author', 'Can view own Author'), ('add_own_author', 'Can add own Author'), ('change_own_author', 'Can change own Author'), ('delete_own_author', 'Can delete own Author')),
+ 'permissions': (('view_own_author', 'Can view own Author'), ('add_own_author', 'Can add own Author'), ('change_own_author', 'Can change own Author'), ('delete_own_author', 'Can delete own Author')),
},
),
migrations.CreateModel(
@@ -202,7 +202,7 @@ class Migration(migrations.Migration):
'verbose_name': 'Document',
'verbose_name_plural': 'Documents',
'ordering': ('title',),
- 'permissions': (('view_document', 'Peut voir tous les Documents'), ('view_own_document', 'Peut voir ses propres Documents'), ('add_own_document', 'Peut ajouter son propre Document'), ('change_own_document', 'Peut modifier ses propres Documents'), ('delete_own_document', 'Peut supprimer ses propres Documents')),
+ 'permissions': (('view_own_document', 'Peut voir ses propres Documents'), ('add_own_document', 'Peut ajouter son propre Document'), ('change_own_document', 'Peut modifier ses propres Documents'), ('delete_own_document', 'Peut supprimer ses propres Documents')),
},
bases=(ishtar_common.models.StatisticItem,
ishtar_common.models.TemplateItem,
@@ -751,7 +751,7 @@ class Migration(migrations.Migration):
options={
'verbose_name': 'Organization',
'verbose_name_plural': 'Organizations',
- 'permissions': (('view_organization', 'Can view all Organizations'), ('view_own_organization', 'Can view own Organization'), ('add_own_organization', 'Can add own Organization'), ('change_own_organization', 'Can change own Organization'), ('delete_own_organization', 'Can delete own Organization')),
+ 'permissions': (('view_own_organization', 'Can view own Organization'), ('add_own_organization', 'Can add own Organization'), ('change_own_organization', 'Can change own Organization'), ('delete_own_organization', 'Can delete own Organization')),
},
bases=(ishtar_common.models.StatisticItem,
ishtar_common.models.TemplateItem, models.Model,
@@ -827,7 +827,7 @@ class Migration(migrations.Migration):
options={
'verbose_name': 'Person',
'verbose_name_plural': 'Persons',
- 'permissions': (('view_person', 'Can view all Persons'), ('view_own_person', 'Can view own Person'), ('add_own_person', 'Can add own Person'), ('change_own_person', 'Can change own Person'), ('delete_own_person', 'Can delete own Person')),
+ 'permissions': (('view_own_person', 'Can view own Person'), ('add_own_person', 'Can add own Person'), ('change_own_person', 'Can change own Person'), ('delete_own_person', 'Can delete own Person')),
},
bases=(ishtar_common.models.StatisticItem,
ishtar_common.models.TemplateItem, models.Model,
diff --git a/ishtar_common/static/ajax_select/css/ajax_select.css b/ishtar_common/static/ajax_select/css/ajax_select.css
deleted file mode 100644
index 379b5be96..000000000
--- a/ishtar_common/static/ajax_select/css/ajax_select.css
+++ /dev/null
@@ -1,49 +0,0 @@
-.results_on_deck .ui-icon-trash {
- float: left;
- cursor: pointer;
-}
-.results_on_deck {
- padding: 0.25em 0;
-}
-form .aligned .results_on_deck {
- padding-left: 38px;
- margin-left: 7em;
-}
-.results_on_deck > div {
- margin-bottom: 0.5em;
-}
-.ui-autocomplete-loading {
- background: url('../images/loading-indicator.gif') no-repeat;
- background-origin: content-box;
- background-position: right;
-}
-ul.ui-autocomplete {
- /*
- this is the dropdown menu.
-
- if max-width is not set and you are using django-admin
- then the dropdown is the width of your whole page body (totally wrong).
-
- this sets max-width at 60% which is graceful at full page or in a popup
- or on a small width window.
-
- fixed width is harder see http://stackoverflow.com/questions/4607164/changing-width-of-jquery-ui-autocomplete-widgets-individually
- */
- max-width: 60%;
- margin: 0;
- padding: 0;
- position: absolute;
-}
-ul.ui-autocomplete li {
- list-style-type: none;
- padding: 0;
-}
-ul.ui-autocomplete li a {
- display: block;
- padding: 2px 3px;
- cursor: pointer;
-}
-
-.results_on_deck .ajax-label{
- line-height: 18px;
-}
diff --git a/ishtar_common/static/ajax_select/js/bootstrap.js b/ishtar_common/static/ajax_select/js/bootstrap.js
deleted file mode 100644
index cb742eaa9..000000000
--- a/ishtar_common/static/ajax_select/js/bootstrap.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function(w) {
- /**
- * load jquery and jquery-ui if needed
- */
-
- function not(thing) {
- return typeof thing === 'undefined';
- }
-
- function loadJS(src) {
- document.write('<script type="text/javascript" src="' + src + '"><\/script>');
- }
-
- function loadCSS(href) {
- var script = document.createElement('link');
- script.href = href;
- script.type = 'text/css';
- script.rel = 'stylesheet';
- document.head.appendChild(script);
- }
-
- if (not(w.jQuery)) {
- loadJS('//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js');
- }
-
- if (not(w.jQuery) || not(w.jQuery.ui) || not(w.jQuery.ui.autocomplete)) {
- loadJS('//code.jquery.com/ui/1.10.3/jquery-ui.js');
- loadCSS('//code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css');
- }
-})(window);
diff --git a/ishtar_common/templates/admin/change_form.html b/ishtar_common/templates/admin/change_form.html
index ea0ddd795..f5c83faa6 100644
--- a/ishtar_common/templates/admin/change_form.html
+++ b/ishtar_common/templates/admin/change_form.html
@@ -2,8 +2,6 @@
{% load i18n admin_urls static admin_list %}
{% block extrahead %}
-<script type="text/javascript"
- src="{% static 'ajax_select/js/bootstrap.js'%}"></script>
{{ block.super }}
<style>
.object-tools a.disabled:link, .object-tools a.disabled:visited,
diff --git a/ishtar_common/templatetags/window_tables.py b/ishtar_common/templatetags/window_tables.py
index d19a72f96..40475c3d4 100644
--- a/ishtar_common/templatetags/window_tables.py
+++ b/ishtar_common/templatetags/window_tables.py
@@ -5,7 +5,7 @@ from django import template
from django.conf import settings
from django.template.defaultfilters import slugify
from django.template.loader import get_template
-from django.urls import reverse
+from django.urls import resolve
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
diff --git a/requirements.txt b/requirements.txt
index cb1e85d77..c8d30ffcb 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -44,8 +44,6 @@ beautifulsoup4==4.7.1
# 4.9.3
markdown==3.0.1
# 3.3.4
-django-ajax-selects==1.7.0
-# -> à remplacer - intégré nativement dans Django
django-compressor==2.2
# 2.4