diff --git a/README.md b/README.md index 4130dfd3c..ba736fee8 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ NetBox is an IP address management (IPAM) and data center infrastructure managem NetBox runs as a web application atop the [Django](https://www.djangoproject.com/) Python framework with a [PostgreSQL](http://www.postgresql.org/) database. For a complete list of requirements, see `requirements.txt`. The code is available [on GitHub](https://github.com/digitalocean/netbox). +![Screenshot of main page](docs/screenshot1.png "Main page") + +![Screenshot of rack elevation](docs/screenshot2.png "Rack elevation") + +![Screenshot of prefix hierarchy](docs/screenshot3.png "Prefix hierarchy") + # Installation Please see docs/getting-started.md for instructions on installing NetBox. diff --git a/docs/screenshot1.png b/docs/screenshot1.png new file mode 100644 index 000000000..3939199d9 Binary files /dev/null and b/docs/screenshot1.png differ diff --git a/docs/screenshot2.png b/docs/screenshot2.png new file mode 100644 index 000000000..3a73fe048 Binary files /dev/null and b/docs/screenshot2.png differ diff --git a/docs/screenshot3.png b/docs/screenshot3.png new file mode 100644 index 000000000..d2acb9773 Binary files /dev/null and b/docs/screenshot3.png differ diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 6ec821d36..47f22168a 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -47,6 +47,12 @@ class RackFilter(django_filters.FilterSet): queryset=RackGroup.objects.all(), label='Group (ID)', ) + group = django_filters.ModelMultipleChoiceFilter( + name='group', + queryset=RackGroup.objects.all(), + to_field_name='slug', + label='Group', + ) class Meta: model = Rack diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index c4a0a6ab0..3b7c09ee6 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -138,24 +138,23 @@ class RackForm(forms.ModelForm, BootstrapMixin): class RackFromCSVForm(forms.ModelForm): site = forms.ModelChoiceField(queryset=Site.objects.all(), to_field_name='name', error_messages={'invalid_choice': 'Site not found.'}) - group = forms.ModelChoiceField(queryset=RackGroup.objects.all(), required=False, to_field_name='name', - error_messages={'invalid_choice': 'Group not found.'}) + group_name = forms.CharField(required=False) class Meta: model = Rack - fields = ['site', 'group', 'name', 'facility_id', 'u_height'] + fields = ['site', 'group_name', 'name', 'facility_id', 'u_height'] def clean(self): site = self.cleaned_data.get('site') - group = self.cleaned_data.get('group') + group = self.cleaned_data.get('group_name') - # Validate device type + # Validate rack group if site and group: try: self.instance.group = RackGroup.objects.get(site=site, name=group) except RackGroup.DoesNotExist: - self.add_error('group', "Invalid rack group ({})".format(group)) + self.add_error('group_name', "Invalid rack group ({})".format(group)) class RackImportForm(BulkImportForm, BootstrapMixin): diff --git a/netbox/templates/_base.html b/netbox/templates/_base.html index 1513b302b..a67d3c440 100644 --- a/netbox/templates/_base.html +++ b/netbox/templates/_base.html @@ -219,7 +219,7 @@ {% if settings.MAINTENANCE_MODE %} {% endif %} {% for message in messages %} @@ -246,7 +246,7 @@

Docs · API · - Code + Code