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

# EP
from django.conf import settings

#TODO?:
#from pyrosapp import models as pyrosapp_models
from pyrosapp.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

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


# Many To Many interface adapter

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


class SequenceAndSHInline(admin.TabularInline):
    model = ScheduleHistory.sequences.through


class ScheduleHistoryAdmin(admin.ModelAdmin):
    inlines = [
        SequenceAndSHInline,
    ]
    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 ScheduleAdmin(PyrosModelAdmin):
    inlines = [
        SequenceInline,
    ]


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


class PyrosUserAdmin(PyrosModelAdmin):
    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,
    ]


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


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


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


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


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


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


#class SequenceTypeAdmin(admin.ModelAdmin):
class SequenceTypeAdmin(PyrosModelAdmin):
    inlines = [
        SequenceInline,
    ]


# Link the models to the admin interface
#TODO?:
#admin.site.register(pyrosapp_models.*)

admin.site.register(Album, AlbumAdmin)
admin.site.register(Alert)
admin.site.register(Country, CountryAdmin)
admin.site.register(Detector, DetectorAdmin)
admin.site.register(Device)
admin.site.register(Filter, FilterAdmin)
admin.site.register(Image)
admin.site.register(NrtAnalysis, NrtAnalysisAdmin)
admin.site.register(Plan, PlanAdmin)
admin.site.register(Request, RequestAdmin)
admin.site.register(Schedule, ScheduleAdmin)
admin.site.register(ScheduleHistory, ScheduleHistoryAdmin)
admin.site.register(ScientificProgram, ScientificProgramAdmin)
admin.site.register(Sequence, SequenceAdmin)
admin.site.register(SequenceType, SequenceTypeAdmin)
admin.site.register(SiteWatch)
admin.site.register(SiteWatchHistory)
admin.site.register(StrategyObs, StrategyObsAdmin)
admin.site.register(Telescope, TelescopeAdmin)
admin.site.register(PyrosUser, PyrosUserAdmin)
admin.site.register(UserLevel, UserLevelAdmin)
admin.site.register(WeatherWatch)
admin.site.register(WeatherWatchHistory)