class CommunityAreaAdmin(AreaEncounterAdmin): """Admin for CommunityArea.""" # Change list list_display = AreaEncounterAdmin.list_display + ["community"] list_filter = AreaEncounterAdmin.list_filter + ["community"] list_select_related = ["community"] show_full_result_count = False resource_class = occ_resources.CommunityAreaEncounterResource # Change view form = s2form(occ_models.CommunityAreaEncounter, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES autocomplete_fields = AreaEncounterAdmin.autocomplete_fields + ["community"] fieldsets = ((_('Community'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ("community", )} ),) + AreaEncounterAdmin.fieldsets inlines = [ CustomStateLogInline, FileAttachmentInline, HabitatCompositionInline, AreaAssessmentInline, HabitatConditionInline, FireHistoryInline, VegetationClassificationInline, AssociatedSpeciesInline, PhysicalSampleInline ]
class ConservationCriterionInline(admin.TabularInline): """Inline admin for ConservationCriterion.""" extra = 1 model = cons_models.ConservationCriterion classes = ("grp-collapse grp-closed wide extrapretty",) form = s2form(cons_models.ConservationCriterion, attrs=S2ATTRS)
class FileAttachmentInline(GenericTabularInline): """Inline for FileAttachment.""" model = cons_models.FileAttachment form = s2form(cons_models.FileAttachment, attrs=S2ATTRS) extra = 1 classes = ("grp-collapse grp-closed wide extrapretty",)
class AreaEncounterAdmin(FSMTransitionMixin, ImportExportModelAdmin, VersionAdmin): """Admin for Area.""" # Change list list_display = ["encounter_type", "area_type", "code", "name", "source", "source_id", "status", ] list_filter = ["encounter_type", "area_type", "source", "status", "geolocation_capture_method"] search_fields = ("code", "name", ) date_hierarchy = 'encountered_on' # Change view form = s2form(occ_models.AreaEncounter, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES fsm_field = ['status', ] autocomplete_fields = ['encountered_by', ] fieldsets = ( (_('Details'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ("encounter_type", "area_type", "code", "name", "description",)} ), (_('Location'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ("geom", "point", "accuracy", "geolocation_capture_method")} ), (_('Data lineage'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ("source", "source_id", "encountered_on", "encountered_by")} ), ) inlines = [CustomStateLogInline, ]
class ConservationActionInline(admin.TabularInline): """Inline admin for Management Action.""" extra = 1 model = cons_models.ConservationAction form = s2form(cons_models.ConservationAction, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES classes = ("grp-collapse grp-closed wide extrapretty",)
class ConservationActivityInline(admin.TabularInline): """Inline admin for ConservationActivity.""" extra = 1 model = cons_models.ConservationActivity form = s2form(cons_models.ConservationActivity, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES classes = ("grp-collapse grp-open wide extrapretty",)
class DocumentAdmin(FSMTransitionMixin, VersionAdmin): """Admin for Document.""" save_on_top = True date_hierarchy = "effective_from" # FSM Transitions fsm_field = ["status", ] # List View list_display = ( "source", "source_id", "document_type", "title", "effective_from", "effective_to", "effective_from_commonwealth", "effective_to_commonwealth", "last_reviewed_on", "review_due", ) list_filter = ( # "taxa", # "communities", "source", "document_type", "status", ("effective_from", admin.DateFieldListFilter), ("effective_to", admin.DateFieldListFilter), ("last_reviewed_on", admin.DateFieldListFilter), ("review_due", admin.DateFieldListFilter), ("effective_from_commonwealth", admin.DateFieldListFilter), ("effective_to_commonwealth", admin.DateFieldListFilter), ) search_fields = ("title", "source_id", ) # Detail View form = s2form(cons_models.Document, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES inlines = [ # ConservationActionInline, # throws admin.E028 CustomStateLogInline, FileAttachmentInline, ] fieldsets = ( ("Scope", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("document_type", "title", "taxa", "communities", "team",)} ), ("Approval milestones and log", { "classes": ("grp-collapse", "grp-closed", "wide", "extrapretty"), "fields": ("effective_from", "effective_to", "effective_from_commonwealth", "effective_to_commonwealth", "last_reviewed_on", "review_due", "comments")} ), )
class ConservationActionCategoryAdmin(VersionAdmin): """Admin for Conservation Management Actions.""" model = cons_models.ConservationActionCategory form = s2form(cons_models.ConservationActionCategory, attrs=S2ATTRS) prepopulated_fields = {"code": ("label",)} list_display = ("code", "label", "description",) search_fields = ("code", "label", "description") save_on_top = True
class TurtleNestEncounterAdmin(EncounterAdmin): """Admin for TurtleNestEncounter.""" form = s2form(TurtleNestEncounter, attrs=S2ATTRS) list_display = EncounterAdmin.FIRST_COLS + ( 'age_display', 'type_display', 'species', 'habitat_display', 'disturbance', 'comments') + EncounterAdmin.LAST_COLS list_select_related = True list_filter = EncounterAdmin.list_filter + ( 'nest_age', 'nest_type', 'species', 'habitat', 'disturbance', 'nest_tagged', 'logger_found', 'eggs_counted', 'hatchlings_measured', 'fan_angles_measured', ) fieldsets = EncounterAdmin.fieldsets + (('Nest', { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ('nest_age', 'nest_type', 'species', 'habitat', 'disturbance', 'nest_tagged', 'logger_found', 'eggs_counted', 'hatchlings_measured', 'fan_angles_measured', 'comments') }), ) inlines = [ MediaAttachmentInline, NestTagObservationInline, TurtleNestObservationInline, TurtleNestDisturbanceObservationInline, HatchlingMorphometricObservationInline, TurtleHatchlingEmergenceObservationInline, TurtleHatchlingEmergenceOutlierObservationInline, LightSourceObservationObservationInline, CustomStateLogInline ] def habitat_display(self, obj): """Make habitat human readable.""" return obj.get_habitat_display() habitat_display.short_description = 'Habitat' def age_display(self, obj): """Make nest age human readable.""" return obj.get_nest_age_display() age_display.short_description = 'Nest age' def type_display(self, obj): """Make nest type human readable.""" return obj.get_nest_type_display() type_display.short_description = 'Nest type'
class AreaAdmin(admin.ModelAdmin): """Area admin.""" list_display = ( "area_type", "name", "northern_extent", "centroid", ) list_filter = ("area_type", ) search_fields = ("name__icontains", ) form = s2form(Area, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES
class LoggerEncounterAdmin(EncounterAdmin): """Admin for LoggerEncounter.""" form = s2form(LoggerEncounter, attrs=S2ATTRS) list_display = EncounterAdmin.FIRST_COLS + ( 'logger_type_display', 'deployment_status_display', 'logger_id', 'comments', ) + EncounterAdmin.LAST_COLS list_select_related = ( 'area', 'site', 'survey', ) list_filter = EncounterAdmin.list_filter + \ ('logger_type', 'deployment_status',) search_fields = ('logger_id', 'source_id') fieldsets = EncounterAdmin.fieldsets + (('Logger', { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'logger_type', 'deployment_status', 'logger_id', 'comments', ) }), ) inlines = [ MediaAttachmentInline, TagObservationInline, NestTagObservationInline, TemperatureLoggerSettingsInline, DispatchRecordInline, TemperatureLoggerDeploymentInline, CustomStateLogInline ] def logger_type_display(self, obj): """Make habitat human readable.""" return obj.get_logger_type_display() logger_type_display.short_description = 'Logger Type' def deployment_status_display(self, obj): """Make habitat human readable.""" return obj.get_deployment_status_display() deployment_status_display.short_description = 'Deployment Status'
class ConservationListAdmin(VersionAdmin): """Admin for ConservationList.""" save_on_top = True date_hierarchy = "active_to" # List View list_display = ( "code", "label", "description", "active_from", "active_to", "scope_wa", "scope_cmw", "scope_intl", "scope_species", "scope_communities", "approval_level", ) list_filter = ("scope_wa", "scope_cmw", "scope_intl", "scope_species", "scope_communities", "approval_level",) search_fields = ("code", "label", "description", ) fieldsets = ( ("Details", {"fields": ("code", "label", "description",)}), ("Scope", { "classes": ("grp-collapse", "grp-closed", "wide"), "fields": ("active_from", "active_to", "scope_wa", "scope_cmw", "scope_intl", "scope_species", "scope_communities", "approval_level",) }), ) form = s2form(cons_models.ConservationList, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES inlines = [ConservationCategoryInline, ConservationCriterionInline, FileAttachmentInline]
class LineTransectEncounterAdmin(EncounterAdmin): """Admin for LineTransectEncounter.""" form = s2form(LineTransectEncounter, attrs=S2ATTRS) list_display = EncounterAdmin.FIRST_COLS + ( 'transect', ) + EncounterAdmin.LAST_COLS list_select_related = ( 'area', 'site', 'survey', ) # list_filter = EncounterAdmin.list_filter + () fieldsets = EncounterAdmin.fieldsets + (('Location', { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ('transect', ) }), ) inlines = [ TrackTallyObservationInline, TurtleNestDisturbanceTallyObservationInline, CustomStateLogInline ]
class AnimalEncounterAdmin(EncounterAdmin): """Admin for AnimalEncounter.""" form = s2form(AnimalEncounter, attrs=S2ATTRS) list_display = EncounterAdmin.FIRST_COLS + ( 'taxon', 'species', 'health_display', 'cause_of_death', 'cause_of_death_confidence', 'maturity_display', 'sex_display', 'behaviour', 'habitat_display', 'nesting_event', 'checked_for_injuries', 'scanned_for_pit_tags', 'checked_for_flipper_tags', ) + EncounterAdmin.LAST_COLS list_select_related = ( 'area', 'site', 'survey', ) list_filter = EncounterAdmin.list_filter + ( 'taxon', 'species', 'health', 'cause_of_death', 'cause_of_death_confidence', 'maturity', 'sex', 'habitat', 'nesting_event', 'checked_for_injuries', 'scanned_for_pit_tags', 'checked_for_flipper_tags', ) fieldsets = EncounterAdmin.fieldsets + (('Animal', { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'taxon', 'species', 'maturity', 'sex', 'activity', 'behaviour', 'habitat', 'health', 'cause_of_death', 'cause_of_death_confidence', 'nesting_event', 'checked_for_injuries', 'scanned_for_pit_tags', 'checked_for_flipper_tags', ) }), ) inlines = [ MediaAttachmentInline, TagObservationInline, TurtleDamageObservationInline, TurtleMorphometricObservationInline, DugongMorphometricObservationInline, TurtleNestObservationInline, ManagementActionInline, NestTagObservationInline, CustomStateLogInline ] def health_display(self, obj): """Make health status human readable.""" return obj.get_health_display() health_display.short_description = 'Health' def maturity_display(self, obj): """Make maturity human readable.""" return obj.get_maturity_display() maturity_display.short_description = 'Maturity' def sex_display(self, obj): """Make sex human readable.""" return obj.get_sex_display() sex_display.short_description = 'Sex' def status_display(self, obj): """Make QA status human readable.""" return obj.get_status_display() status_display.short_description = 'QA Status' def habitat_display(self, obj): """Make habitat human readable.""" return obj.get_habitat_display() habitat_display.short_description = 'Habitat'
class EncounterAdmin(FSMTransitionMixin, VersionAdmin): """Admin for Encounter with inlines for all Observations. This admin can be extended by other Encounter Admin classes. """ # ------------------------------------------------------------------------- # Change list change_list_filter_template = "admin/filter_listing.html" date_hierarchy = 'when' # Filters for change_list list_filter = ( 'area', 'site', 'status', # 'observer', 'reporter', 'location_accuracy', 'encounter_type', 'source') # 'survey', # Columns for change_list, allow re-use and inserting fields FIRST_COLS = ('when', 'area', 'site', 'latitude', 'longitude', 'location_accuracy', 'name') LAST_COLS = ('observer', 'reporter', 'source_display', 'source_id', 'status', 'encounter_type') # 'survey', list_display = FIRST_COLS + LAST_COLS # Layout: save buttons also on top - overridden by Grapelli admin skin # save_on_top = True # Change_list fulltext search fields search_fields = ( 'observer__name', 'observer__username', 'name', 'reporter__name', 'reporter__username', 'source_id', ) # Performance # https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ # #django.contrib.admin.ModelAdmin.list_select_related list_select_related = ( 'area', 'site', 'survey', 'observer', 'reporter', ) # ------------------------------------------------------------------------- # Change form # select2 widgets for searchable dropdowns form = s2form(Encounter, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES autocomplete_fields = [ 'area', 'site', 'survey', 'observer', 'reporter', ] # observer = forms.ChoiceField( # widget=ModelSelect2Widget( # model=get_user_model(), # search_fields=[ # "username__icontains", # "name__icontains", # "role__icontains", # "email__icontains"] # ) # ) # reporter = forms.ChoiceField( # widget=ModelSelect2Widget( # model=get_user_model(), # search_fields=[ # "username__icontains", # "name__icontains", # "role__icontains", # "email__icontains"] # ) # ) # area = forms.ChoiceField( # widget=ModelSelect2Widget( # model=Area, # search_fields=["name__icontains", ] # ) # ) # site = forms.ChoiceField( # widget=ModelSelect2Widget( # model=Area, # search_fields=["name__icontains", ] # ) # ) # survey = forms.ChoiceField( # widget=ModelSelect2Widget( # model=Survey, # search_fields=["site_name__icontains", "reporter__name__icontains", ] # ) # ) # Django-fsm transitions config fsm_field = [ 'status', ] # Change_view form layout fieldsets = (('Encounter', { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'area', 'site', 'survey', 'where', 'location_accuracy', 'when', 'observer', 'reporter', 'source', 'source_id', ) }), ) # Change_view inlines inlines = [ MediaAttachmentInline, TagObservationInline, TurtleDamageObservationInline, TurtleMorphometricObservationInline, TrackTallyObservationInline, TurtleNestDisturbanceTallyObservationInline, ManagementActionInline, NestTagObservationInline, TurtleNestObservationInline, TurtleNestDisturbanceObservationInline, HatchlingMorphometricObservationInline, TurtleHatchlingEmergenceObservationInline, TurtleHatchlingEmergenceOutlierObservationInline, LightSourceObservationObservationInline, CustomStateLogInline ] def source_display(self, obj): """Make data source readable.""" return obj.get_source_display() source_display.short_description = 'Data Source' def latitude(self, obj): """Make data source readable.""" return obj.latitude latitude.short_description = 'Latitude' def longitude(self, obj): """Make data source readable.""" return obj.longitude longitude.short_description = 'Longitude' def encounter_type_display(self, obj): """Make encounter type readable.""" return obj.get_encounter_type_display() encounter_type_display.short_description = 'Encounter Type'
class ConservationActionAdmin(ImportExportModelAdmin, VersionAdmin): """Admin for Conservation Management Actions.""" model = cons_models.ConservationAction form = s2form(cons_models.ConservationAction, attrs=S2ATTRS) resource_class = cons_resources.ConservationActionResource autocomplete_fields = ["taxa", "communities", "category", ] list_display = ( "pk", "taxon_list", "com_list", "document", "occurrence_area_code", "category", "instructions", "implementation_notes", "completion_date", "expenditure", "status") list_filter = ( "status", "category", "document", ("completion_date", admin.DateFieldListFilter), ) search_fields = ( "occurrence_area_code", "instructions", "implementation_notes", ) save_on_top = True # filter_horizontal = ("communities", ) formfield_overrides = FORMFIELD_OVERRIDES readonly_fields = ["expenditure", ] fieldsets = ( ("Affiliation", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("taxa", "communities", "document", "target_area", "occurrence_area_code") }), ("Intent", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("category", "instructions",) }), ("Implementation", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("implementation_notes", "completion_date",) }), ) inlines = [ FileAttachmentInline, ConservationActivityInline, ] def taxon_list(self, obj): """Make M2M taxa readable.""" return ", ".join([taxon.__str__() for taxon in obj.taxa.all()]) taxon_list.short_description = "Species" def com_list(self, obj): """Make M2M taxa readable.""" return ", ".join([com.__str__() for com in obj.communities.all()]) com_list.short_description = "Communities" def status(self, obj): """Make status readable.""" return obj.status status.short_description = "Progress"
class SurveyAdmin(FSMTransitionMixin, VersionAdmin, admin.ModelAdmin): """Survey Admin.""" # model = Survey # change list date_hierarchy = 'start_time' list_select_related = ( 'site', 'reporter', ) list_display = ( '__str__', 'source', 'device_id', 'end_device_id', 'site', 'start_time', 'end_time', 'reporter', 'start_comments', 'end_comments', 'status', 'production', ) list_filter = ('device_id', 'site', 'reporter', 'status', 'production') search_fields = ('site__name', 'start_comments', 'end_comments', 'reporter__name', 'reporter__username') # change view form = s2form(Survey, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES fsm_field = [ 'status', ] fieldsets = ( (_('Device'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'source', 'source_id', 'device_id', 'end_source_id', 'end_device_id', 'production', ) }), (_('Location'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'transect', 'start_location', 'end_location', 'site', ) }), (_('Time'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'start_time', 'end_time', ) }), (_('Team'), { 'classes': ('grp-collapse', 'grp-open', 'wide', 'extrapretty'), 'fields': ( 'start_comments', 'end_comments', 'reporter', 'team', 'start_photo', 'end_photo', ) }), ) inlines = [ CustomStateLogInline, ]
class CommunityConservationListingAdmin(FSMTransitionMixin, VersionAdmin): """Admin for CommunityConservationListing.""" save_on_top = True date_hierarchy = "effective_from" # FSM Transitions fsm_field = ["status", ] # List View list_display = ( "community", "scope", "status", "category_cache", "criteria_cache", "proposed_on", "effective_from", "effective_to", "review_due", "comments", ) list_filter = ( "category", "scope", "status", ("proposed_on", admin.DateFieldListFilter), ("effective_from", admin.DateFieldListFilter), ("effective_to", admin.DateFieldListFilter), ("review_due", admin.DateFieldListFilter), ) search_fields = ("comments", ) # Detail View form = s2form(cons_models.CommunityConservationListing, attrs=S2ATTRS) formfield_overrides = FORMFIELD_OVERRIDES autocomplete_fields = ["community", "category", "criteria", ] inlines = [CustomStateLogInline, FileAttachmentInline] fieldsets = ( ("Conservation Status", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("community", "scope", "category", "criteria",)} ), ("Data lineage", { "classes": ("grp-collapse", "grp-closed", "wide", "extrapretty"), "fields": ("source", "source_id", )} ), ("Approval milestones and log", { "classes": ("grp-collapse", "grp-closed", "wide", "extrapretty"), "fields": ("proposed_on", "effective_from", "effective_to", "last_reviewed_on", "review_due", "comments",)} ), ) def formfield_for_manytomany(self, db_field, request, **kwargs): """Restrict available cat and crit to lists relevant to species.""" if db_field.name == "category": kwargs["queryset"] = cons_models.ConservationCategory.objects.filter( conservation_list__scope_communities=True ).prefetch_related( "conservation_list" ).order_by( "conservation_list__code", "rank" ) if db_field.name == "criteria": kwargs["queryset"] = cons_models.ConservationCriterion.objects.filter( conservation_list__scope_communities=True ).prefetch_related( "conservation_list" ).order_by( "conservation_list__code", "rank" ) return super(CommunityConservationListingAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
class ConservationThreatAdmin(ImportExportModelAdmin, VersionAdmin): """Admin for Conservation Management Threats.""" model = cons_models.ConservationThreat form = s2form(cons_models.ConservationThreat, attrs=S2ATTRS) resource_class = cons_resources.ConservationThreatResource autocomplete_fields = ["taxa", "communities", "category", ] list_display = ( "pk", "taxon_list", "com_list", "document", "occurrence_area_code", "category", "cause", "encountered_on", "encountered_by", "current_impact", "potential_impact", "potential_onset", ) list_filter = ( "category", "document", ("encountered_on", admin.DateFieldListFilter), "current_impact", "potential_impact", "potential_onset", ) search_fields = ( "occurrence_area_code", "cause", ) save_on_top = True formfield_overrides = FORMFIELD_OVERRIDES fieldsets = ( ("Affiliation", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("taxa", "communities", "document", "target_area", "occurrence_area_code") }), ("Threat", { "classes": ("grp-collapse", "grp-open", "wide", "extrapretty"), "fields": ("encountered_by", "encountered_on", "category", "cause", "area_affected_percent", "current_impact", "potential_impact", "potential_onset") }), ) inlines = [ FileAttachmentInline, ] def taxon_list(self, obj): """Make M2M taxa readable.""" return ", ".join([taxon.__str__() for taxon in obj.taxa.all()]) taxon_list.short_description = "Species" def com_list(self, obj): """Make M2M taxa readable.""" return ", ".join([com.__str__() for com in obj.communities.all()]) com_list.short_description = "Communities"
# from fsm_admin.mixins import FSMTransitionMixin from mptt.admin import MPTTModelAdmin # TreeRelatedFieldListFilter from occurrence.models import CommunityAreaEncounter, TaxonAreaEncounter # from wastd.observations.filters import LocationListFilter from rest_framework.authtoken.admin import TokenAdmin from reversion.admin import VersionAdmin from taxonomy import filters as tax_filters from taxonomy.models import Taxon # Crossreference, Vernacular, from taxonomy.models import (Community, HbvFamily, HbvGenus, HbvGroup, HbvName, HbvParent, HbvSpecies, HbvSupra, HbvVernacular, HbvXref) from shared.admin import FORMFIELD_OVERRIDES, S2ATTRS # from leaflet.admin import LeafletGeoAdmin # from leaflet.forms.widgets import LeafletWidget TaxonAreaEncounterForm = s2form(TaxonAreaEncounter, attrs=S2ATTRS) CommunityAreaEncounterForm = s2form(CommunityAreaEncounter, attrs=S2ATTRS) TokenAdmin.raw_id_fields = ("user", ) @admin.register(HbvName) class HbvNameAdmin(VersionAdmin, admin.ModelAdmin): """Admin for HbvName.""" save_on_top = True # date_hierarchy = "datetime" list_display = ( "name_id", "rank_name", "full_name",