admin.py 5.77 KB
Newer Older
David Haynes's avatar
David Haynes committed
1
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
3
"""
4
5
api/admin.py

6
7
8
9
Django admin interface configuration.

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/
"""
10
# Django Imports
11
from django.contrib import admin
David Haynes's avatar
David Haynes committed
12
from django.contrib.gis.admin import OSMGeoAdmin
13
14
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponseRedirect
15
from django.shortcuts import render
16
# App Imports
David Haynes's avatar
David Haynes committed
17
from .models import Facility, Schedule, OpenTime, Category, Location, Alert
18

19

David Haynes's avatar
David Haynes committed
20
@admin.register(Facility)
Ben Waters's avatar
Ben Waters committed
21
class FacilityAdmin(admin.ModelAdmin):
22
    """
David Haynes's avatar
David Haynes committed
23
24
25
    Custom Admin panel for the Facility model.

    Allows admins to create new facilities through the admin interface.
26
    """
27
28
    def drop_special_schedules(self, request, queryset):
        num = queryset.count()
29
30
        for facility in queryset:
            facility.special_schedules.clear()
31
        self.message_user(request, "Successfully removed special schedules from %d facilities." % num)
32

33
    def assign_bulk_schedules(self, request, queryset):
34
35
36
37
38
39
40
41
42
        num = queryset.count()
        if 'bulk_schedule' in request.POST:
            print('request', request.POST)
            try:
                new_schedule = Schedule.objects.get(pk=request.POST['schedule'])
                name = new_schedule.name
                for facility in queryset:
                   facility.main_schedule = new_schedule
                   facility.save()
43
                self.message_user(request, "Set %s as the main schedule for %d facilities." % (name, num))
44
45
46
            except ObjectDoesNotExist:
                self.message_user(request, "Unable to set schedule for %d facilities." % num)
            return HttpResponseRedirect(request.get_full_path())
47
48
49
50
        return render(request,
                      'bulk_schedules_intermediate.html',
                      context = {'facilities': queryset,
                                 'schedules': Schedule.objects.all()})
51
    assign_bulk_schedules.short_description = 'Assign a main schedule for multiple facilities'
52

53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    def assign_bulk_special_schedules(self, request, queryset):
        num = queryset.count()
        if 'bulk_special_schedule' in request.POST:
            print('request', request.POST)
            try:
                new_special_schedule = Schedule.objects.get(pk=request.POST['special_schedule'])
                name = new_special_schedule.name
                for facility in queryset:
                   facility.special_schedules.add(new_special_schedule)
                   facility.save()
                self.message_user(request, "Added %s as a special schedule to %d facilities." % (name, num))
            except ObjectDoesNotExist:
                self.message_user(request, "Unable to add a special schedule to %d facilities." % num)
            return HttpResponseRedirect(request.get_full_path())
        return render(request,
                      'bulk_special_schedules_intermediate.html',
                      context = {'facilities': queryset,
                                 'schedules': Schedule.objects.all()})
    assign_bulk_special_schedules.short_description = 'Add a special schedule to multiple facilities'

73
    # a list of all actions to be added
74
75
    actions = [drop_special_schedules,
               assign_bulk_schedules, assign_bulk_special_schedules ]
76

David Haynes's avatar
David Haynes committed
77
    # Allow filtering by the following fields
David Haynes's avatar
David Haynes committed
78
    list_filter = ['facility_category', 'facility_location']
David Haynes's avatar
David Haynes committed
79
80
    # Modify the rendered layout of the "create a new facility" page
    # We are basically reordering things to look nicer to the user here
81
82
    fieldsets = (
        (None, {
David Haynes's avatar
David Haynes committed
83
84
85
86
87
            'fields': ('facility_name', 'logo', 'facility_category',
                       'facility_location', 'main_schedule', 'special_schedules',
                       ('facility_product_tags', 'facility_labels',
                        'facility_classifier'),
                       'tapingo_url', 'phone_number', 'note', 'owners'),
88
        }),
89
    )
90

91
92
93
94
95
96
97
98
99
100
class OpenTimeInline(admin.TabularInline):
    """
    A table of time periods that represent an "open time" for a Facility.

    https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.TabularInline
    """
    # Columns correspond to each attribute in the OpenTime table
    model = OpenTime
    # 7 days of the week, so only have 7 rows
    max_num = 7
101
102
103
104
105
106
107
108
109
110
    extra = 7
    # We are basically reordering things to look nicer to the user here
    fieldsets = (
        (None, {
            'fields': (
                ('start_day', 'start_time'),
                ('end_day', 'end_time')
            ),
        }),
    )
111

David Haynes's avatar
David Haynes committed
112
@admin.register(Schedule)
113
class ScheduleAdmin(admin.ModelAdmin):
114
    """
David Haynes's avatar
David Haynes committed
115
116
117
118
119
    Custom Admin panel for the Schedule model.

    Allows admins to create new schedules through the admin interface.
    Additionally, we append the OpenTimeInline table to allow for open times to
    be defined for the schedule we are creating.
120
    """
David Haynes's avatar
David Haynes committed
121
    # Allow filtering by the following fields
122
    list_display = ['name', 'modified']
David Haynes's avatar
David Haynes committed
123
    # Append the OpenTimeInline table to the end of our admin panel
124
    inlines = [OpenTimeInline, ]
David Haynes's avatar
David Haynes committed
125
    # Modify the rendered layout of the "create a new facility" page
126
127
    fieldsets = (
        (None, {
128
129
130
            'fields': ('name',
                       # Pair valid_start and valid_end together on the same
                       # line
David Haynes's avatar
David Haynes committed
131
                       ('valid_start', 'valid_end'),
132
                       'twenty_four_hours',
133
134
                       'schedule_for_removal',
                       'promote_to_main')
David Haynes's avatar
David Haynes committed
135
        }),
136
    )
137

David Haynes's avatar
David Haynes committed
138
# https://docs.djangoproject.com/en/1.11/ref/contrib/gis/admin/#osmgeoadmin
139
140
141
OSMGeoAdmin.default_lon = -8605757.16502
OSMGeoAdmin.default_lat = 4697457.00333
OSMGeoAdmin.default_zoom = 15
David Haynes's avatar
David Haynes committed
142
admin.site.register(Location, OSMGeoAdmin)
143
144
# Use the default ModelAdmin interface for these
admin.site.register(Category)
David Haynes's avatar
David Haynes committed
145
admin.site.register(Alert)