diff options
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 |