===============================================
How to customize parts of NAV's web interface
===============================================
Some users like to modify parts of the NAV web interface to add their own
information from, or links to, third party systems. In doing so, they override
some of NAV's existing Django templates. *This is an unhealthy practice*, as it
may cause errors or missing functionality the next time they upgrade NAV and
the forked template changes.
This guide serves to document the various official hooks into the NAV web
interface. It is assumed you have a working knowledge of the `Django templating
system `_.
How to add custom templates
===========================
NAV's Django templates are located inside its Python module directories. *You
should not be modifying these directly*. If you need to override existing
templates, or add custom hook templates, you should do so in a location that
Django will search for templates *before* it looks into NAV's internal template
directories.
There are two ways to do this:
1. The simple way: NAV includes a :file:`templates/` directory, relative to its
config directory, in its template search patch. If your NAV config is
located in :file:`/etc/nav/`, you can create the directory
:file:`/etc/nav/templates/` and have Django find your custom templates
there.
2. The "proper" way: You write your own Django application and include into
NAV's site configuration by way of a
:file:`/etc/nav/python/local_settings.py` file. Just include templates in
your app as you normally would in any Django app.
Hooks
=====
Adding custom tabs to ipdevinfo
-------------------------------
*ipdevinfo* is the tabbed interface that displays NAV's information about
single IP devices.
The tabbing system HTML is built around using unordered list elements
(``ul/li``) as tab headers, with hyperlinks to anchor tags. The content of each
tab is a ``div`` with an id that matches those anchor tags.
ipdevinfo tries to include the custom template ``ipdevinfo/custom-tabs.html``
to add extra tab header elements, and ``ipdevinfo/custom-fragments.html`` to
include the ``div`` elements with their corresponding contents.
A simple customization example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: html+django
:caption: ipdevinfo/custom-tabs.html
Foobar
Frobnication
.. code-block:: html+django
:caption: ipdevinfo/custom-fragments.html
This is a custom tab for {{ netbox }}
It's got stuff in it.
Frobnication data for {{ netbox }}
A perfectly cromulent tab.
Adding custom buttons to ipdevinfo
----------------------------------
On the device details page, there is a row of action buttons, just above the
information tabs:
.. image:: ipdevinfo-button-row.png
You can add custom content (more buttons) to this row by creating a
``ipdevinfo/custom-header-button-extras.html`` template. Here's a simple
example, adding a button that takes the user to a a third party web page:
.. code-block:: html+django
:caption: ipdevinfo/custom-header-button-extras.html
Lookup device in company CMDB
Adding custom information to the ipdevinfo "What if" tab
--------------------------------------------------------
The IP Device Info tab titled :guilabel:`"What if"`, shows a summary of other
devices, organizations and users that may be affected if the viewed device goes
down. The tab also provides functionality to send e-mail to the contact
addresses of the affected organizations (if contacts have been added).
A custom template named ``ipdevinfo/custom-affected.html`` can be used to
insert information at the bottom of this tab:
.. code-block:: html+django
:caption: ipdevinfo/custom-affects.html
Adding custom information to the port details tab
-------------------------------------------------
On the page displaying details about a port, a custom template named
``ipdevinfo/custom-port-tabs.html`` can be used to add additional
custom tabs. These tabs can be used to display additional information
about the port, using data from a Network Inventory System for
example.
Adding custom tabs to the room overview page
--------------------------------------------
The *info* subsystem is the part of NAV that displays information about other
NAV objects, such as VLANs, rooms, locations and so on. The room information
page is also tabbed, but its tabs are more dynamic in nature than ipdevinfo's.
As with ipdevinfo, the tabbing system HTML is built around using unordered list
elements (``ul/li``) as tab headers, with hyperlinks to *other URLs that will
provide the content of the tab* dynamically as the tab is selected. This
functionality is provided by *jQuery UI*.
Each list element must reference a placeholder ``div`` using the
``aria-controls`` element attribute, as shown in the example below.
The room page tries to include the custom template
``info/room/custom-tabs.html`` to add extra tab header elements, and
``info/room/custom-fragments.html`` to include the ``div`` elements that will
be placeholders for the dynamically fetched content.
A simple customization example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code-block:: html+django
:caption: info/room/custom-tabs.html
Foobar
.. code-block:: html+django
:caption: info/room/custom-fragments.html