diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-04 17:11:52 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-04 17:11:52 +0200 |
commit | 5063bf07c5128131f5eecbce994cfeb670ef8a08 (patch) | |
tree | 61235d58ad63a44cd66ddc0c2664bc3dd0ee3fa7 | |
parent | b35c53bbf266153e478a776209e35aad36e9cd5b (diff) | |
download | Ishtar-5063bf07c5128131f5eecbce994cfeb670ef8a08.tar.bz2 Ishtar-5063bf07c5128131f5eecbce994cfeb670ef8a08.zip |
Admin context records: add context record lookup, improve admin forms
-rw-r--r-- | archaeological_context_records/admin.py | 48 | ||||
-rw-r--r-- | archaeological_context_records/lookups.py | 23 | ||||
-rw-r--r-- | archaeological_context_records/models.py | 16 |
3 files changed, 79 insertions, 8 deletions
diff --git a/archaeological_context_records/admin.py b/archaeological_context_records/admin.py index 9b8cae4e2..f20a9aebf 100644 --- a/archaeological_context_records/admin.py +++ b/archaeological_context_records/admin.py @@ -17,7 +17,15 @@ # 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 +from django.contrib.gis.forms import PointField, PolygonField, OSMWidget +from django.utils.translation import ugettext_lazy as _ from ishtar_common.apps import admin_site from ishtar_common.admin import HistorizedObjectAdmin, GeneralTypeAdmin @@ -26,21 +34,38 @@ import models class DatingAdmin(admin.ModelAdmin): - list_display = ('period', 'start_date', 'end_date', 'dating_type', - 'quality') + list_display = ('period', 'context_records_lbl', 'finds_lbl') list_filter = ("period", 'dating_type', 'quality') model = models.Dating + search_fields = ['context_records__cached_label', 'period__label', + 'find__cached_label'] + readonly_fields = ['context_records_lbl', 'finds_lbl'] admin_site.register(models.Dating, DatingAdmin) +class AdminContextRecordForm(forms.ModelForm): + class Meta: + model = models.Operation + exclude = [] + point = PointField(label=_(u"Point"), required=False, + widget=OSMWidget) + polygon = PolygonField(label=_(u"Polygon"), required=False, + widget=OSMWidget) + operation = AutoCompleteSelectField('operation') + parcel = AutoCompleteSelectField('parcel') + + class ContextRecordAdmin(HistorizedObjectAdmin): - list_display = ('label', 'length', 'width', - 'thickness', 'depth') - list_filter = ('documentations',) - search_fields = ('label', 'parcel__operation__common_name', - 'datings__period__label') + list_display = ('label', 'operation', 'parcel') + list_filter = ('unit',) + search_fields = ('label', 'parcel__operation__cached_label', + 'parcel__section', 'parcel__parcel_number') model = models.ContextRecord + form = AdminContextRecordForm + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'imports', 'cached_label', 'datings' + ] admin_site.register(models.ContextRecord, ContextRecordAdmin) @@ -50,6 +75,10 @@ class ContextRecordSourceAdmin(admin.ModelAdmin): list_filter = ('source_type',) search_fields = ('title', ) model = models.ContextRecordSource + form = make_ajax_form(model, { + "context_record": 'context_record', + 'authors': 'author' + }) admin_site.register(models.ContextRecordSource, ContextRecordSourceAdmin) @@ -57,6 +86,11 @@ admin_site.register(models.ContextRecordSource, ContextRecordSourceAdmin) 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', + }) admin_site.register(models.RecordRelations, RecordRelationsAdmin) diff --git a/archaeological_context_records/lookups.py b/archaeological_context_records/lookups.py new file mode 100644 index 000000000..92115d98b --- /dev/null +++ b/archaeological_context_records/lookups.py @@ -0,0 +1,23 @@ +from ajax_select import register, 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(parcel__town__name__icontains=term) + ) + query &= subquery + return self.model.objects.filter(query).order_by('cached_label')[:20] + + def format_item_display(self, item): + return u"<span class='ajax-label'>%s</span>" % item.cached_label diff --git a/archaeological_context_records/models.py b/archaeological_context_records/models.py index ccc3268f4..243ce32f8 100644 --- a/archaeological_context_records/models.py +++ b/archaeological_context_records/models.py @@ -76,6 +76,20 @@ class Dating(models.Model): return unicode(self.period) return u"%s (%s-%s)" % (self.period, start_date, end_date) + def context_records_lbl(self): + return u" - ".join( + [cr.cached_label for cr in self.context_records.all()] + ) + context_records_lbl.short_description = _(u"Context record") + context_records_lbl.admin_order_field = "context_records__cached_label" + + def finds_lbl(self): + return u" - ".join( + [f.cached_label for f in self.find.all()] + ) + finds_lbl.short_description = _(u"Find") + finds_lbl.admin_order_field = "find__cached_label" + @classmethod def fix_dating_association(cls, obj): """ @@ -250,7 +264,7 @@ class ContextRecord(BulkUpdatedItem, BaseHistorizedItem, ImageModel, OwnPerms, _(u"Location"), blank=True, null=True, help_text=_(u"A short description of the location of the context " u"record")) - datings = models.ManyToManyField(Dating) + datings = models.ManyToManyField(Dating, related_name='context_records') documentations = models.ManyToManyField(DocumentationType, blank=True) datings_comment = models.TextField(_(u"Comment on datings"), blank=True, null=True) |