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) | 
