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 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): 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 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(Command) 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)