diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-04 20:03:40 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2017-08-04 20:03:40 +0200 |
commit | 871f45bac5b1f7ccbdb167fe96c67bc16db4420b (patch) | |
tree | 8c7cc809273250ba9e2c06389cf05add162edd61 | |
parent | 70f0ee9c5d7e5250ba5af7469158a8ff04dd4830 (diff) | |
download | Ishtar-871f45bac5b1f7ccbdb167fe96c67bc16db4420b.tar.bz2 Ishtar-871f45bac5b1f7ccbdb167fe96c67bc16db4420b.zip |
Admin: improve forms, lists for finds, base finds, treatements, treatment requests, etc.
-rw-r--r-- | archaeological_finds/admin.py | 99 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 38 | ||||
-rw-r--r-- | archaeological_finds/models_treatments.py | 20 |
3 files changed, 141 insertions, 16 deletions
diff --git a/archaeological_finds/admin.py b/archaeological_finds/admin.py index 9727e9d0e..733d5ba5f 100644 --- a/archaeological_finds/admin.py +++ b/archaeological_finds/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.contrib import admin +from django.contrib.gis.forms import PointField, PolygonField, \ + LineStringField, OSMWidget +from django.utils.translation import ugettext_lazy as _ from ishtar_common.apps import admin_site from ishtar_common.admin import HistorizedObjectAdmin, GeneralTypeAdmin @@ -25,19 +33,45 @@ from ishtar_common.admin import HistorizedObjectAdmin, GeneralTypeAdmin import models +class AdminBaseFindForm(forms.ModelForm): + class Meta: + model = models.BaseFind + exclude = [] + point_2d = PointField(label=_(u"Point (2D)"), required=False, + widget=OSMWidget) + line = LineStringField(label=_(u"Line"), required=False, + widget=OSMWidget) + polygon = PolygonField(label=_(u"Polygon"), required=False, + widget=OSMWidget) + context_record = AutoCompleteSelectField('context_record') + + class BaseFindAdmin(HistorizedObjectAdmin): - list_display = ('label', 'context_record', 'batch') + list_display = ('label', 'context_record', 'index') search_fields = ('label', 'context_record__parcel__operation__name',) model = models.BaseFind + form = AdminBaseFindForm + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'cache_short_id', 'cache_complete_id', 'imports' + ] admin_site.register(models.BaseFind, BaseFindAdmin) class FindAdmin(HistorizedObjectAdmin): - list_display = ('label', 'dating', 'volume', 'weight', - 'find_number',) - search_fields = ('label', "datings__period__label") + 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") model = models.Find + form = make_ajax_form(model, { + 'base_finds': 'base_find', + 'container': 'container' + }) + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'imports', 'datings', 'cached_label' + ] admin_site.register(models.Find, FindAdmin) @@ -47,38 +81,83 @@ class FindSourceAdmin(admin.ModelAdmin): list_filter = ('source_type',) search_fields = ('title', ) model = models.FindSource + form = make_ajax_form(model, { + 'authors': 'author', + 'find': 'find' + }) admin_site.register(models.FindSource, FindSourceAdmin) -class PropertyAdmin(admin.ModelAdmin): +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', + }) + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'administrative_act', 'imports', ] + + def has_add_permission(self, request): + return False admin_site.register(models.Property, PropertyAdmin) class TreatmentAdmin(HistorizedObjectAdmin): - list_display = ('location', 'treatment_types_lbl', 'container', 'person') + 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 = make_ajax_form(model, { + 'person': 'person', + 'organization': 'organization', + 'file': 'treatment_file', + 'location': 'warehouse', + 'container': 'container', + }) + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'imports', 'cached_label', 'downstream_lbl', 'upstream_lbl' + ] + + def has_add_permission(self, request): + return False admin_site.register(models.Treatment, TreatmentAdmin) class TreatmentFileAdmin(HistorizedObjectAdmin): - list_display = ('year', 'index', 'name', 'internal_reference') - search_fields = ('cached_label',) + list_display = ('type', 'year', 'index', 'name', + 'applicant', 'in_charge', 'internal_reference') + list_filter = ('type', 'year') + search_fields = ('name', 'applicant__name', 'applicant__surname', + 'applicant__raw_name', 'applicant_organisation__name', + 'cached_label') model = models.TreatmentFile + form = make_ajax_form(model,{ + 'in_charge': 'person', + 'applicant': 'person', + 'applicant_organisation': 'organization', + }) + exclude = ['imports'] + readonly_fields = HistorizedObjectAdmin.readonly_fields + [ + 'cached_label', + ] admin_site.register(models.TreatmentFile, TreatmentFileAdmin) class TreatmentSourceAdmin(admin.ModelAdmin): - list_display = ('treatment', 'title', 'source_type',) + list_display = ('title', 'treatment', 'source_type',) list_filter = ('source_type',) - search_fields = ('title',) + search_fields = ('title', 'treatment__cached_label') model = models.TreatmentSource + form = make_ajax_form(model, { + 'treatment': 'treatment', + 'authors': 'author' + }) admin_site.register(models.TreatmentSource, TreatmentSourceAdmin) diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 738da19a4..421274524 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -182,7 +182,7 @@ class BaseFind(BulkUpdatedItem, BaseHistorizedItem, OwnPerms): SpatialReferenceSystem, verbose_name=_(u"Spatial Reference System"), blank=True, null=True) point_2d = models.PointField(_(u"Point (2D)"), blank=True, null=True) - point = models.PointField(_(u"Point"), blank=True, null=True, dim=3) + point = models.PointField(_(u"Point (3D)"), blank=True, null=True, dim=3) line = models.LineStringField(_(u"Line"), blank=True, null=True) polygon = models.PolygonField(_(u"Polygon"), blank=True, null=True) cache_short_id = models.TextField( @@ -638,7 +638,9 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, label = models.TextField(_(u"Free ID")) description = models.TextField(_(u"Description"), blank=True, null=True) material_types = models.ManyToManyField( - MaterialType, verbose_name=_(u"Material types"), related_name='finds') + MaterialType, verbose_name=_(u"Material types"), related_name='finds', + blank=True + ) conservatory_state = models.ForeignKey( ConservatoryState, verbose_name=_(u"Conservatory state"), blank=True, null=True, on_delete=models.SET_NULL) @@ -646,7 +648,7 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, blank=True, null=True) preservation_to_considers = models.ManyToManyField( PreservationType, verbose_name=_(u"Type of preservation to consider"), - related_name='finds') + related_name='finds', blank=True) volume = models.FloatField(_(u"Volume (l)"), blank=True, null=True) weight = models.FloatField(_(u"Weight (g)"), blank=True, null=True) weight_unit = models.CharField(_(u"Weight unit"), max_length=4, @@ -668,13 +670,15 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, is_complete = models.NullBooleanField(_(u"Is complete?"), blank=True, null=True) object_types = models.ManyToManyField( - ObjectType, verbose_name=_(u"Object types"), related_name='find') + ObjectType, verbose_name=_(u"Object types"), related_name='find', + blank=True + ) integrities = models.ManyToManyField( IntegrityType, verbose_name=_(u"Integrity / interest"), - related_name='find') + related_name='find', blank=True) remarkabilities = models.ManyToManyField( RemarkabilityType, verbose_name=_(u"Remarkability"), - related_name='find') + related_name='find', blank=True) min_number_of_individuals = models.IntegerField( _(u"Minimum number of individuals (MNI)"), blank=True, null=True) length = models.FloatField(_(u"Length (cm)"), blank=True, null=True) @@ -735,6 +739,11 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, return u" ; ".join([unicode(dating) for dating in self.datings.all()]) @property + def materials(self): + return u" ; ".join([unicode(material) + for material in self.material_types.all()]) + + @property def show_url(self): return reverse('show-find', args=[self.pk, '']) @@ -776,6 +785,23 @@ class Find(BulkUpdatedItem, ValueGetter, BaseHistorizedItem, ImageModel, bf.context_record.operation.get_reference(), self.index) + def context_records_lbl(self): + return u" - ".join( + [bf.context_record.cached_label for bf in self.base_finds.all()] + ) + context_records_lbl.short_description = _(u"Context record") + context_records_lbl.admin_order_field = \ + "base_finds__context_record__cached_label" + + def operations_lbl(self): + return u" - ".join( + [bf.context_record.operation.cached_label + for bf in self.base_finds.all()] + ) + operations_lbl.short_description = _(u"Operation") + operations_lbl.admin_order_field = \ + "base_finds__context_record__operation__cached_label" + def _get_treatments(self, model, rel='upstream', limit=None): treatments, findtreats = [], [] q = model.objects.filter( diff --git a/archaeological_finds/models_treatments.py b/archaeological_finds/models_treatments.py index d1b1afd4b..048d3064d 100644 --- a/archaeological_finds/models_treatments.py +++ b/archaeological_finds/models_treatments.py @@ -208,6 +208,26 @@ class Treatment(DashboardFormItem, ValueGetter, BaseHistorizedItem, :return: string """ return u" ; ".join([unicode(t) for t in self.treatment_types.all()]) + treatment_types_lbl.short_description = _(u"Treatment types") + treatment_types_lbl.admin_order_field = 'treatment_types__label' + + def downstream_lbl(self): + """ + Downstream finds label + :return: string + """ + return u" ; ".join([f.cached_label for f in self.downstream.all()]) + downstream_lbl.short_description = _(u"Downstream finds") + downstream_lbl.admin_order_field = 'downstream__cached_label' + + def upstream_lbl(self): + """ + Upstream finds label + :return: string + """ + return u" ; ".join([f.cached_label for f in self.upstream.all()]) + upstream_lbl.short_description = _(u"Upstream finds") + upstream_lbl.admin_order_field = 'upstream__cached_label' def get_values(self, prefix=''): values = super(Treatment, self).get_values(prefix=prefix) |