admin.py 6.31 KB
from django import forms
from django.contrib import admin
from django.contrib.auth.models import User

# EP
from django.conf import settings

from common.models import *


# EP added
class ReadOnlyModelAdmin(admin.ModelAdmin):
    """ModelAdmin class that prevents modifications through the admin.
    The changelist and the detail view work, but a 403 is returned
    if one actually tries to edit an object.
    Source: https://gist.github.com/aaugustin/1388243
    """

    actions = None

    def get_readonly_fields(self, request, obj=None):
        return self.fields or [f.name for f in self.model._meta.fields]

    def has_add_permission(self, request):
        return False

    # Allow viewing objects but not actually changing them
    def has_change_permission(self, request, obj=None):
        if request.method not in ('GET', 'HEAD'):
            return False
        return super(ReadOnlyModelAdmin, self).has_change_permission(request, obj)

    def has_delete_permission(self, request, obj=None):
        return False


# EP added

# Edit mode
# DEBUG = False
# View only mode
# DEBUG = True

''' Uncomment for production '''

# if settings.DEBUG:
# class PyrosModelAdmin(ReadOnlyModelAdmin):
#     pass
# else:
#     class PyrosModelAdmin(admin.ModelAdmin):
#         pass


class PyrosModelAdmin(admin.ModelAdmin):
    pass

# Many To Many interface adapter


class PyrosUserAndSPInline(admin.TabularInline):
    model = ScientificProgram.pyros_users.through


class SequenceAndScheduleInline(admin.TabularInline):
    model = Schedule.sequences.through

class PyrosUserAndUserLevelInline(admin.TabularInline):
    # add admin representation for m2m relation between PyrosUser and UserLevel
    model = UserLevel.pyros_users.through

class ScheduleAdmin(admin.ModelAdmin):
    inlines = [
        SequenceAndScheduleInline,
    ]
    exclude = ('sequences',)


# One To Many interface adapters

class SequenceInline(admin.TabularInline):
    model = Sequence
    readonly_fields = ("name",)
    fields = ("name",)
    show_change_link = True


class RequestInline(admin.TabularInline):
    model = Request
    readonly_fields = ("name",)
    fields = ("name",)
    show_change_link = True


class AlbumInline(admin.TabularInline):
    model = Album
    readonly_fields = ("name",)
    fields = ("name",)
    show_change_link = True


class PlanInline(admin.TabularInline):
    model = Plan
    readonly_fields = ("name",)
    fields = ("name",)
    show_change_link = True


class ImageInline(admin.TabularInline):
    model = Image
    readonly_fields = ("name",)
    fields = ("name",)
    show_change_link = True


class DetectorInline(admin.TabularInline):
    model = Detector
    readonly_fields = ("device_name",)
    fields = ("device_name",)
    show_change_link = True


class PyrosUserInline(admin.TabularInline):
    model = PyrosUser
    readonly_fields = ("user_username",)
    fields = ("user_username",)
    show_change_link = True


class FilterInline(admin.TabularInline):
    model = Filter
    readonly_fields = ("device_name",)
    fields = ("device_name",)
    show_change_link = True


class AlertInline(admin.TabularInline):
    model = Alert
    readonly_fields = ("request_name",)
    fields = ("request_name",)
    show_change_link = True


# Admin model classes

class RequestAdmin(PyrosModelAdmin):
    inlines = [
        SequenceInline,
    ]


class SequenceAdmin(PyrosModelAdmin):
    inlines = [
        AlbumInline,
        SequenceAndScheduleInline,  # for M2M interface
    ]


class PyrosUserAdmin(PyrosModelAdmin):
    list_display = ("user_username","is_active","laboratory")
    list_filter = ("is_active",)
    list_editable = ("is_active",)
    inlines = [
        RequestInline,
        # A user has many SPs
        PyrosUserAndSPInline,  # for M2M interface   
    ]


class StrategyObsAdmin(PyrosModelAdmin):
    inlines = [
        AlertInline,
    ]


class ScientificProgramAdmin(PyrosModelAdmin):
    inlines = [
        RequestInline,
        # A SP has many users:
        PyrosUserAndSPInline,  # for M2M interface
    ]
    exclude = ('pyros_users',)  # for M2M interface


class CountryAdmin(PyrosModelAdmin):
    inlines = [
        PyrosUserInline,
    ]


class UserLevelAdmin(PyrosModelAdmin):
    inlines = [
        #PyrosUserInline,
        PyrosUserAndUserLevelInline,
    ]
    list_display = ("name","priority",)
    # we need to exclude pyros_users which represents the m2m relation between UserLevel and PyrosUser
    exclude = ("pyros_users",)


class FilterAdmin(PyrosModelAdmin):
    inlines = [
        PlanInline,
    ]


class FilterWheelAdmin(PyrosModelAdmin):
    inlines = [
        FilterInline,
    ]


class NrtAnalysisAdmin(PyrosModelAdmin):
    inlines = [
        ImageInline,
    ]


class DetectorAdmin(PyrosModelAdmin):
    inlines = [
        AlbumInline,
    ]


class TelescopeAdmin(PyrosModelAdmin):
    inlines = [
        DetectorInline,
    ]


class PlanAdmin(PyrosModelAdmin):
    inlines = [
        ImageInline,
    ]


# class AlbumAdmin(admin.ModelAdmin):
class AlbumAdmin(PyrosModelAdmin):
    inlines = [
        PlanInline,
    ]


# Link the models to the admin interface

# (EP added 10/7/19)
admin.site.register(AgentCmd)
admin.site.register(AgentLogs)
admin.site.register(AgentSurvey)
admin.site.register(AgentDeviceStatus)


admin.site.register(Album, AlbumAdmin)
admin.site.register(Alert)
admin.site.register(Country, CountryAdmin)
admin.site.register(Detector, DetectorAdmin)
admin.site.register(Filter, FilterAdmin)
admin.site.register(FilterWheel, FilterWheelAdmin)
admin.site.register(Image)
admin.site.register(Log)
admin.site.register(NrtAnalysis, NrtAnalysisAdmin)
admin.site.register(Plan, PlanAdmin)
admin.site.register(Request, RequestAdmin)
admin.site.register(Schedule, ScheduleAdmin)
admin.site.register(ScheduleHasSequences)
admin.site.register(ScientificProgram, ScientificProgramAdmin)
admin.site.register(Sequence, SequenceAdmin)
admin.site.register(SiteWatch)
admin.site.register(SiteWatchHistory)
admin.site.register(StrategyObs, StrategyObsAdmin)
admin.site.register(TaskId)
admin.site.register(Telescope, TelescopeAdmin)
admin.site.register(PyrosUser, PyrosUserAdmin)
admin.site.register(UserLevel, UserLevelAdmin)
admin.site.register(Version)
admin.site.register(WeatherWatch)
admin.site.register(WeatherWatchHistory)
admin.site.register(PlcDeviceStatus)
admin.site.register(PlcDevice)
admin.site.register(Config)