1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Added JS for SlugField autofill

This commit is contained in:
Jeremy Stretch
2016-05-20 15:32:17 -04:00
parent 5a2946b146
commit bbdc7dccba
7 changed files with 47 additions and 6 deletions

View File

@ -4,6 +4,7 @@ from django.db.models import Count
from dcim.models import Site, Device, Interface, Rack, IFACE_FF_VIRTUAL from dcim.models import Site, Device, Interface, Rack, IFACE_FF_VIRTUAL
from utilities.forms import ( from utilities.forms import (
APISelect, BootstrapMixin, BulkImportForm, CommentField, ConfirmationForm, CSVDataField, Livesearch, SmallTextarea, APISelect, BootstrapMixin, BulkImportForm, CommentField, ConfirmationForm, CSVDataField, Livesearch, SmallTextarea,
SlugField,
) )
from .models import PORT_SPEED_CHOICES, Circuit, CircuitType, Provider from .models import PORT_SPEED_CHOICES, Circuit, CircuitType, Provider
@ -14,6 +15,7 @@ from .models import PORT_SPEED_CHOICES, Circuit, CircuitType, Provider
# #
class ProviderForm(forms.ModelForm, BootstrapMixin): class ProviderForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
comments = CommentField() comments = CommentField()
class Meta: class Meta:
@ -25,7 +27,6 @@ class ProviderForm(forms.ModelForm, BootstrapMixin):
} }
help_texts = { help_texts = {
'name': "Full name of the provider", 'name': "Full name of the provider",
'slug': "URL-friendly unique shorthand (e.g. 'decix' for DE-CIX)",
'asn': "BGP autonomous system number (if applicable)", 'asn': "BGP autonomous system number (if applicable)",
'portal_url': "URL of the provider's customer support portal", 'portal_url': "URL of the provider's customer support portal",
'noc_contact': "NOC email address and phone number", 'noc_contact': "NOC email address and phone number",
@ -63,6 +64,7 @@ class ProviderBulkDeleteForm(ConfirmationForm):
# #
class CircuitTypeForm(forms.ModelForm, BootstrapMixin): class CircuitTypeForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = CircuitType model = CircuitType

View File

@ -6,7 +6,7 @@ from django.db.models import Count, Q
from ipam.models import IPAddress from ipam.models import IPAddress
from utilities.forms import ( from utilities.forms import (
APISelect, BootstrapMixin, BulkImportForm, CommentField, ConfirmationForm, CSVDataField, ExpandableNameField, APISelect, BootstrapMixin, BulkImportForm, CommentField, ConfirmationForm, CSVDataField, ExpandableNameField,
FlexibleModelChoiceField, Livesearch, SelectWithDisabled, SmallTextarea, FlexibleModelChoiceField, Livesearch, SelectWithDisabled, SmallTextarea, SlugField,
) )
from .models import ( from .models import (
@ -43,6 +43,7 @@ def get_device_by_name_or_pk(name):
# #
class SiteForm(forms.ModelForm, BootstrapMixin): class SiteForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
comments = CommentField() comments = CommentField()
class Meta: class Meta:
@ -54,7 +55,6 @@ class SiteForm(forms.ModelForm, BootstrapMixin):
} }
help_texts = { help_texts = {
'name': "Full name of the site", 'name': "Full name of the site",
'slug': "URL-friendly unique shorthand (e.g. 'nyc3' for NYC3)",
'facility': "Data center provider and facility (e.g. Equinix NY7)", 'facility': "Data center provider and facility (e.g. Equinix NY7)",
'asn': "BGP autonomous system number", 'asn': "BGP autonomous system number",
'physical_address': "Physical location of the building (e.g. for GPS)", 'physical_address': "Physical location of the building (e.g. for GPS)",
@ -78,6 +78,7 @@ class SiteImportForm(BulkImportForm, BootstrapMixin):
# #
class RackGroupForm(forms.ModelForm, BootstrapMixin): class RackGroupForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = RackGroup model = RackGroup
@ -195,6 +196,7 @@ class RackFilterForm(forms.Form, BootstrapMixin):
# #
class ManufacturerForm(forms.ModelForm, BootstrapMixin): class ManufacturerForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = Manufacturer model = Manufacturer
@ -210,6 +212,7 @@ class ManufacturerBulkDeleteForm(ConfirmationForm):
# #
class DeviceTypeForm(forms.ModelForm, BootstrapMixin): class DeviceTypeForm(forms.ModelForm, BootstrapMixin):
slug = SlugField(slug_source='model')
class Meta: class Meta:
model = DeviceType model = DeviceType
@ -286,6 +289,7 @@ class InterfaceTemplateForm(forms.ModelForm, BootstrapMixin):
# #
class DeviceRoleForm(forms.ModelForm, BootstrapMixin): class DeviceRoleForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = DeviceRole model = DeviceRole
@ -301,6 +305,7 @@ class DeviceRoleBulkDeleteForm(ConfirmationForm):
# #
class PlatformForm(forms.ModelForm, BootstrapMixin): class PlatformForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = Platform model = Platform

View File

@ -4,7 +4,9 @@ from django import forms
from django.db.models import Count from django.db.models import Count
from dcim.models import Site, Device, Interface from dcim.models import Site, Device, Interface
from utilities.forms import BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm from utilities.forms import (
BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm, SlugField,
)
from .models import ( from .models import (
Aggregate, IPAddress, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, VLAN, VLAN_STATUS_CHOICES, VRF, Aggregate, IPAddress, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, VLAN, VLAN_STATUS_CHOICES, VRF,
@ -53,6 +55,7 @@ class VRFBulkDeleteForm(ConfirmationForm):
# #
class RIRForm(forms.ModelForm, BootstrapMixin): class RIRForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = RIR model = RIR
@ -118,6 +121,7 @@ class AggregateFilterForm(forms.Form, BootstrapMixin):
# #
class RoleForm(forms.ModelForm, BootstrapMixin): class RoleForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = Role model = Role

View File

@ -5,6 +5,27 @@ $(document).ready(function() {
$(this).parents('table').find('td input:checkbox').prop('checked', $(this).prop('checked')); $(this).parents('table').find('td input:checkbox').prop('checked', $(this).prop('checked'));
}); });
// Slugify
function slugify(s, num_chars) {
s = s.replace(/[^-\.\+\w\s]/g, ''); // Remove unneeded chars
s = s.replace(/^\s+|\s+$/g, ''); // Trim leading/trailing spaces
s = s.replace(/[-\s]+/g, '-'); // Convert spaces to hyphens
s = s.toLowerCase(); // Convert to lowercase
return s.substring(0, num_chars); // Trim to first num_chars chars
}
var slug_field = $('#id_slug');
slug_field.change(function() {
$(this).attr('_changed', true);
});
if (slug_field) {
var slug_source = $('#id_' + slug_field.attr('slug-source'));
slug_source.keyup(function() {
if (slug_field && !slug_field.attr('_changed')) {
slug_field.val(slugify($(this).val(), 50));
}
})
}
// Helper select fields // Helper select fields
$('select.helper-parent').change(function () { $('select.helper-parent').change(function () {

View File

@ -5,7 +5,7 @@ from django import forms
from django.db.models import Count from django.db.models import Count
from dcim.models import Device from dcim.models import Device
from utilities.forms import BootstrapMixin, BulkImportForm, ConfirmationForm, CSVDataField from utilities.forms import BootstrapMixin, BulkImportForm, ConfirmationForm, CSVDataField, SlugField
from .models import Secret, SecretRole, UserKey from .models import Secret, SecretRole, UserKey
@ -35,6 +35,7 @@ def validate_rsa_key(key, is_secret=True):
# #
class SecretRoleForm(forms.ModelForm, BootstrapMixin): class SecretRoleForm(forms.ModelForm, BootstrapMixin):
slug = SlugField()
class Meta: class Meta:
model = SecretRole model = SecretRole

View File

@ -7,7 +7,6 @@
<div class="panel-body"> <div class="panel-body">
{% render_field form.name %} {% render_field form.name %}
{% render_field form.slug %} {% render_field form.slug %}
{% render_field form.category %}
{% render_field form.asn %} {% render_field form.asn %}
</div> </div>
</div> </div>

View File

@ -203,6 +203,15 @@ class FlexibleModelChoiceField(forms.ModelChoiceField):
return value return value
class SlugField(forms.SlugField):
def __init__(self, slug_source='name', *args, **kwargs):
label = kwargs.pop('label', "Slug")
help_text = kwargs.pop('help_text', "URL-friendly unique shorthand")
super(SlugField, self).__init__(label=label, help_text=help_text, *args, **kwargs)
self.widget.attrs['slug-source'] = slug_source
# #
# Forms # Forms
# #