diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 19985132c..ed9cf318f 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -20,7 +20,7 @@ from extras.api.customfields import CustomFieldModelSerializer from ipam.models import IPAddress, VLAN from tenancy.api.serializers import NestedTenantSerializer from users.api.serializers import NestedUserSerializer -from utilities.api import ChoiceFieldSerializer, ValidatedModelSerializer +from utilities.api import ChoiceFieldSerializer, TimeZoneField, ValidatedModelSerializer from virtualization.models import Cluster @@ -58,13 +58,14 @@ class WritableRegionSerializer(ValidatedModelSerializer): class SiteSerializer(CustomFieldModelSerializer): region = NestedRegionSerializer() tenant = NestedTenantSerializer() + time_zone = TimeZoneField(required=False) class Meta: model = Site fields = [ - 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', - 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields', 'count_prefixes', - 'count_vlans', 'count_racks', 'count_devices', 'count_circuits', + 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'time_zone', 'physical_address', + 'shipping_address', 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields', + 'count_prefixes', 'count_vlans', 'count_racks', 'count_devices', 'count_circuits', ] @@ -77,12 +78,13 @@ class NestedSiteSerializer(serializers.ModelSerializer): class WritableSiteSerializer(CustomFieldModelSerializer): + time_zone = TimeZoneField(required=False) class Meta: model = Site fields = [ - 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', - 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields', + 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'time_zone', 'physical_address', + 'shipping_address', 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields', ] diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 1a7c3837b..2bca68bd3 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -7,6 +7,7 @@ from django.contrib.auth.models import User from django.contrib.postgres.forms.array import SimpleArrayField from django.db.models import Count, Q from mptt.forms import TreeNodeChoiceField +from timezone_field import TimeZoneFormField from extras.forms import CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm from ipam.models import IPAddress, VLAN, VLANGroup @@ -96,7 +97,7 @@ class SiteForm(BootstrapMixin, TenancyForm, CustomFieldForm): model = Site fields = [ 'name', 'slug', 'region', 'tenant_group', 'tenant', 'facility', 'asn', 'physical_address', - 'shipping_address', 'contact_name', 'contact_phone', 'contact_email', 'comments', + 'shipping_address', 'contact_name', 'contact_phone', 'contact_email', 'time_zone', 'comments', ] widgets = { 'physical_address': SmallTextarea(attrs={'rows': 3}), @@ -135,7 +136,7 @@ class SiteCSVForm(forms.ModelForm): model = Site fields = [ 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address', - 'contact_name', 'contact_phone', 'contact_email', 'comments', + 'contact_name', 'contact_phone', 'contact_email', 'time_zone', 'comments', ] help_texts = { 'name': 'Site name', @@ -149,9 +150,10 @@ class SiteBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm): region = TreeNodeChoiceField(queryset=Region.objects.all(), required=False) tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False) asn = forms.IntegerField(min_value=1, max_value=4294967295, required=False, label='ASN') + time_zone = TimeZoneFormField(required=False) class Meta: - nullable_fields = ['region', 'tenant', 'asn'] + nullable_fields = ['region', 'tenant', 'asn', 'time_zone'] class SiteFilterForm(BootstrapMixin, CustomFieldFilterForm): diff --git a/netbox/dcim/migrations/0054_site_time_zone.py b/netbox/dcim/migrations/0054_site_time_zone.py new file mode 100644 index 000000000..f599cb155 --- /dev/null +++ b/netbox/dcim/migrations/0054_site_time_zone.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-12-19 21:53 +from __future__ import unicode_literals + +from django.db import migrations +import timezone_field.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0053_platform_manufacturer'), + ] + + operations = [ + migrations.AddField( + model_name='site', + name='time_zone', + field=timezone_field.fields.TimeZoneField(blank=True), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index b35d0b078..8fb58a081 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -14,6 +14,7 @@ from django.db.models import Count, Q, ObjectDoesNotExist from django.urls import reverse from django.utils.encoding import python_2_unicode_compatible from mptt.models import MPTTModel, TreeForeignKey +from timezone_field import TimeZoneField from circuits.models import Circuit from extras.models import CustomFieldModel, CustomFieldValue, ImageAttachment @@ -86,6 +87,7 @@ class Site(CreatedUpdatedModel, CustomFieldModel): tenant = models.ForeignKey(Tenant, related_name='sites', blank=True, null=True, on_delete=models.PROTECT) facility = models.CharField(max_length=50, blank=True) asn = ASNField(blank=True, null=True, verbose_name='ASN') + time_zone = TimeZoneField(blank=True) physical_address = models.CharField(max_length=200, blank=True) shipping_address = models.CharField(max_length=200, blank=True) contact_name = models.CharField(max_length=50, blank=True) @@ -98,7 +100,8 @@ class Site(CreatedUpdatedModel, CustomFieldModel): objects = SiteManager() csv_headers = [ - 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'contact_name', 'contact_phone', 'contact_email', + 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'time_zone', 'contact_name', 'contact_phone', + 'contact_email', ] class Meta: @@ -118,6 +121,7 @@ class Site(CreatedUpdatedModel, CustomFieldModel): self.tenant.name if self.tenant else None, self.facility, self.asn, + self.time_zone, self.contact_name, self.contact_phone, self.contact_email, diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index ac1aba492..7a3f6cbec 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -134,6 +134,7 @@ INSTALLED_APPS = ( 'mptt', 'rest_framework', 'rest_framework_swagger', + 'timezone_field', 'circuits', 'dcim', 'ipam', diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index efc98c3d0..c61f007df 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -1,5 +1,6 @@ {% extends '_base.html' %} {% load static from staticfiles %} +{% load tz %} {% load helpers %} {% block content %} @@ -105,6 +106,17 @@ {% endif %} +