Skip to content

Commit

Permalink
Merge pull request netbox-community#3069 from digitalocean/2647-caching
Browse files Browse the repository at this point in the history
intial work on netbox-community#2647 - caching
  • Loading branch information
jeremystretch authored Apr 15, 2019
2 parents 6f05579 + 351736c commit 1877afc
Show file tree
Hide file tree
Showing 15 changed files with 148 additions and 11 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
sudo: required
services:
- postgresql
- redis-server
addons:
postgresql: "9.4"
language: python
Expand Down
4 changes: 4 additions & 0 deletions base_requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ django-filter
# https://github.com/django-mptt/django-mptt
django-mptt

# Django caching using Redis
# https://github.com/niwinz/django-redis
django-redis

# Abstraction models for rendering and paginating HTML tables
# https://github.com/jieter/django-tables2
django-tables2
Expand Down
5 changes: 5 additions & 0 deletions netbox/circuits/views.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.db import transaction
from django.db.models import Count
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import View

from extras.models import Graph, GRAPH_TYPE_PROVIDER
Expand Down Expand Up @@ -32,6 +35,7 @@ class ProviderListView(PermissionRequiredMixin, ObjectListView):
class ProviderView(PermissionRequiredMixin, View):
permission_required = 'circuits.view_provider'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, slug):

provider = get_object_or_404(Provider, slug=slug)
Expand Down Expand Up @@ -147,6 +151,7 @@ class CircuitListView(PermissionRequiredMixin, ObjectListView):
class CircuitView(PermissionRequiredMixin, View):
permission_required = 'circuits.view_circuit'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

circuit = get_object_or_404(Circuit.objects.select_related('provider', 'type', 'tenant__group'), pk=pk)
Expand Down
22 changes: 22 additions & 0 deletions netbox/dcim/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
from django.utils.html import escape
from django.utils.http import is_safe_url
from django.utils.safestring import mark_safe
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import View

from circuits.models import Circuit
Expand Down Expand Up @@ -195,6 +197,7 @@ class SiteListView(PermissionRequiredMixin, ObjectListView):
class SiteView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_site'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, slug):

site = get_object_or_404(Site.objects.select_related('region', 'tenant__group'), slug=slug)
Expand Down Expand Up @@ -353,6 +356,7 @@ class RackElevationListView(PermissionRequiredMixin, View):
"""
permission_required = 'dcim.view_rack'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request):

racks = Rack.objects.select_related(
Expand Down Expand Up @@ -392,6 +396,7 @@ def get(self, request):
class RackView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_rack'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

rack = get_object_or_404(Rack.objects.select_related('site__region', 'tenant__group', 'group', 'role'), pk=pk)
Expand Down Expand Up @@ -570,6 +575,7 @@ class DeviceTypeListView(PermissionRequiredMixin, ObjectListView):
class DeviceTypeView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_devicetype'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

devicetype = get_object_or_404(DeviceType, pk=pk)
Expand Down Expand Up @@ -910,6 +916,7 @@ class DeviceListView(PermissionRequiredMixin, ObjectListView):
class DeviceView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_device'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device.objects.select_related(
Expand Down Expand Up @@ -991,6 +998,7 @@ def get(self, request, pk):
class DeviceInventoryView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_device'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device, pk=pk)
Expand All @@ -1012,6 +1020,7 @@ def get(self, request, pk):
class DeviceStatusView(PermissionRequiredMixin, View):
permission_required = ('dcim.view_device', 'dcim.napalm_read')

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device, pk=pk)
Expand All @@ -1025,6 +1034,7 @@ def get(self, request, pk):
class DeviceLLDPNeighborsView(PermissionRequiredMixin, View):
permission_required = ('dcim.view_device', 'dcim.napalm_read')

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device, pk=pk)
Expand All @@ -1042,6 +1052,7 @@ def get(self, request, pk):
class DeviceConfigView(PermissionRequiredMixin, View):
permission_required = ('dcim.view_device', 'dcim.napalm_read')

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device, pk=pk)
Expand Down Expand Up @@ -1279,6 +1290,7 @@ class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class InterfaceView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_interface'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

interface = get_object_or_404(Interface, pk=pk)
Expand Down Expand Up @@ -1499,6 +1511,7 @@ class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class DeviceBayPopulateView(PermissionRequiredMixin, View):
permission_required = 'dcim.change_devicebay'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device_bay = get_object_or_404(DeviceBay, pk=pk)
Expand Down Expand Up @@ -1533,6 +1546,7 @@ def post(self, request, pk):
class DeviceBayDepopulateView(PermissionRequiredMixin, View):
permission_required = 'dcim.change_devicebay'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device_bay = get_object_or_404(DeviceBay, pk=pk)
Expand Down Expand Up @@ -1672,6 +1686,7 @@ class CableListView(PermissionRequiredMixin, ObjectListView):
class CableView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_cable'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

cable = get_object_or_404(Cable, pk=pk)
Expand All @@ -1687,6 +1702,7 @@ class CableTraceView(PermissionRequiredMixin, View):
"""
permission_required = 'dcim.view_cable'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, model, pk):

obj = get_object_or_404(model, pk=pk)
Expand Down Expand Up @@ -1726,6 +1742,7 @@ def dispatch(self, request, *args, **kwargs):

return super().dispatch(request, *args, **kwargs)

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, *args, **kwargs):

# Parse initial data manually to avoid setting field values as lists
Expand Down Expand Up @@ -2042,6 +2059,7 @@ def post(self, request):
class VirtualChassisEditView(PermissionRequiredMixin, GetReturnURLMixin, View):
permission_required = 'dcim.change_virtualchassis'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

virtual_chassis = get_object_or_404(VirtualChassis, pk=pk)
Expand Down Expand Up @@ -2110,6 +2128,7 @@ class VirtualChassisDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class VirtualChassisAddMemberView(PermissionRequiredMixin, GetReturnURLMixin, View):
permission_required = 'dcim.change_virtualchassis'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

virtual_chassis = get_object_or_404(VirtualChassis, pk=pk)
Expand Down Expand Up @@ -2164,6 +2183,7 @@ def post(self, request, pk):
class VirtualChassisRemoveMemberView(PermissionRequiredMixin, GetReturnURLMixin, View):
permission_required = 'dcim.change_virtualchassis'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

device = get_object_or_404(Device, pk=pk, virtual_chassis__isnull=False)
Expand Down Expand Up @@ -2227,6 +2247,7 @@ class PowerPanelListView(PermissionRequiredMixin, ObjectListView):
class PowerPanelView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_powerpanel'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

powerpanel = get_object_or_404(PowerPanel.objects.select_related('site', 'rack_group'), pk=pk)
Expand Down Expand Up @@ -2296,6 +2317,7 @@ class PowerFeedListView(PermissionRequiredMixin, ObjectListView):
class PowerFeedView(PermissionRequiredMixin, View):
permission_required = 'dcim.view_powerfeed'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

powerfeed = get_object_or_404(PowerFeed.objects.select_related('power_panel', 'rack'), pk=pk)
Expand Down
9 changes: 9 additions & 0 deletions netbox/extras/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.safestring import mark_safe
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import View
from django_tables2 import RequestConfig

Expand Down Expand Up @@ -41,6 +43,7 @@ class TagListView(ObjectListView):

class TagView(View):

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, slug):

tag = get_object_or_404(Tag, slug=slug)
Expand Down Expand Up @@ -108,6 +111,7 @@ class ConfigContextListView(PermissionRequiredMixin, ObjectListView):
class ConfigContextView(PermissionRequiredMixin, View):
permission_required = 'extras.view_configcontext'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

configcontext = get_object_or_404(ConfigContext, pk=pk)
Expand Down Expand Up @@ -155,6 +159,7 @@ class ObjectConfigContextView(View):
object_class = None
base_template = None

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

obj = get_object_or_404(self.object_class, pk=pk)
Expand Down Expand Up @@ -187,6 +192,7 @@ class ObjectChangeListView(PermissionRequiredMixin, ObjectListView):
class ObjectChangeView(PermissionRequiredMixin, View):
permission_required = 'extras.view_objectchange'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

objectchange = get_object_or_404(ObjectChange, pk=pk)
Expand All @@ -209,6 +215,7 @@ class ObjectChangeLogView(View):
Present a history of changes made to a particular object.
"""

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, model, **kwargs):

# Get object my model and kwargs (e.g. slug='foo')
Expand Down Expand Up @@ -282,6 +289,7 @@ class ReportListView(PermissionRequiredMixin, View):
"""
permission_required = 'extras.view_reportresult'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request):

reports = get_reports()
Expand All @@ -306,6 +314,7 @@ class ReportView(PermissionRequiredMixin, View):
"""
permission_required = 'extras.view_reportresult'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, name):

# Retrieve the Report by "<module>.<report>"
Expand Down
13 changes: 13 additions & 0 deletions netbox/ipam/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.db.models import Count, Q
from django.shortcuts import get_object_or_404, redirect, render
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.generic import View
from django_tables2 import RequestConfig

Expand Down Expand Up @@ -125,6 +127,7 @@ class VRFListView(PermissionRequiredMixin, ObjectListView):
class VRFView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_vrf'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

vrf = get_object_or_404(VRF.objects.all(), pk=pk)
Expand Down Expand Up @@ -319,6 +322,7 @@ def extra_context(self):
class AggregateView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_aggregate'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

aggregate = get_object_or_404(Aggregate, pk=pk)
Expand Down Expand Up @@ -456,6 +460,7 @@ def alter_queryset(self, request):
class PrefixView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_prefix'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

prefix = get_object_or_404(Prefix.objects.select_related(
Expand Down Expand Up @@ -500,6 +505,7 @@ def get(self, request, pk):
class PrefixPrefixesView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_prefix'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

prefix = get_object_or_404(Prefix.objects.all(), pk=pk)
Expand Down Expand Up @@ -543,6 +549,7 @@ def get(self, request, pk):
class PrefixIPAddressesView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_prefix'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

prefix = get_object_or_404(Prefix.objects.all(), pk=pk)
Expand Down Expand Up @@ -643,6 +650,7 @@ class IPAddressListView(PermissionRequiredMixin, ObjectListView):
class IPAddressView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_ipaddress'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

ipaddress = get_object_or_404(IPAddress.objects.select_related('vrf__tenant', 'tenant'), pk=pk)
Expand Down Expand Up @@ -726,6 +734,7 @@ def dispatch(self, request, *args, **kwargs):

return super().dispatch(request, *args, **kwargs)

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request):

form = forms.IPAddressAssignForm()
Expand Down Expand Up @@ -838,6 +847,7 @@ class VLANGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class VLANGroupVLANsView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_vlangroup'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

vlan_group = get_object_or_404(VLANGroup.objects.all(), pk=pk)
Expand Down Expand Up @@ -888,6 +898,7 @@ class VLANListView(PermissionRequiredMixin, ObjectListView):
class VLANView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_vlan'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

vlan = get_object_or_404(VLAN.objects.select_related(
Expand All @@ -906,6 +917,7 @@ def get(self, request, pk):
class VLANMembersView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_vlan'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

vlan = get_object_or_404(VLAN.objects.all(), pk=pk)
Expand Down Expand Up @@ -984,6 +996,7 @@ class ServiceListView(PermissionRequiredMixin, ObjectListView):
class ServiceView(PermissionRequiredMixin, View):
permission_required = 'ipam.view_service'

@method_decorator(cache_page(settings.CACHE_TIMEOUT))
def get(self, request, pk):

service = get_object_or_404(Service, pk=pk)
Expand Down
Loading

0 comments on commit 1877afc

Please sign in to comment.