Skip to content

Commit 65981f7

Browse files
slug field is disabled on edit view in admin
- add verbose name for slug - normalize slug
1 parent 6bdcdf2 commit 65981f7

File tree

4 files changed

+23
-30
lines changed

4 files changed

+23
-30
lines changed

core/admin.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,15 @@
44
# Register your models here.
55
admin.site.register(ProgramAvailability)
66
admin.site.register(Program)
7-
admin.site.register(Service)
87
admin.site.register(Site)
8+
9+
10+
class ServiceAdmin(admin.ModelAdmin):
11+
12+
def get_readonly_fields(self, request, obj=None):
13+
# slug is set on create and unchangable afterwards
14+
if obj:
15+
return ('slug',)
16+
return []
17+
18+
admin.site.register(Service, ServiceAdmin)

core/migrations/0001_initial.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ class Migration(migrations.Migration):
5555
('name', models.CharField(max_length=100)),
5656
('is_closed', models.BooleanField(default=False)),
5757
('is_frozen', models.BooleanField(default=False)),
58-
('slug', models.CharField(max_length=100, unique=True)),
5958
],
6059
),
6160
migrations.CreateModel(

core/models/program.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,6 @@ class Program(models.Model):
66
is_closed = models.BooleanField(default=False)
77
is_frozen = models.BooleanField(default=False)
88
has_queue = models.BooleanField(default=True)
9-
slug = models.CharField(max_length=100, unique=True)
109

1110
def __str__(self):
1211
return '%s' % (self.name)
13-
14-
def clean(self):
15-
"""
16-
normalize slugs to kebab-case
17-
"""
18-
slug = re.sub(r'[^a-zA-Z0-9\-]', '', self.slug.lower())
19-
self.slug = '-'.join(slug.split())
20-
21-
self.is_cleaned = True
22-
23-
def save(self, *args, **kwargs):
24-
self.full_clean()
25-
super().save(*args, **kwargs)
26-
27-

core/models/service.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@
22
from core.models import Program
33
import re
44

5+
56
class Service(models.Model):
67
name = models.CharField(max_length=100)
78
available = models.BooleanField(default=False)
89
program = models.ForeignKey(
9-
Program, related_name="services", on_delete=models.CASCADE #related name replaces "service_set" for backwards nested relationships
10+
# related name replaces "service_set" for backwards nested relationships
11+
Program, related_name="services", on_delete=models.CASCADE
12+
)
13+
slug = models.CharField(
14+
max_length=100,
15+
unique=True,
16+
verbose_name="Concise Descriptive Identifier"
1017
)
11-
slug = models.CharField(max_length=100, unique=True)
1218

1319
def __str__(self):
1420
return '%s: %s' % (self.program, self.name)
@@ -18,17 +24,11 @@ def clean(self):
1824
normalize slugs to lowercase, but only when first saving
1925
"""
2026

21-
# admin validation VVV
22-
# https://stackoverflow.com/questions/48908102/is-it-possible-to-disable-a-field-in-django-admin
23-
24-
25-
# TODO:
26-
# only service has slug
27-
# make name unique by program here
28-
# automatically generate slug from program name and service name
29-
# make editable false on model
27+
if self.pk:
28+
self.is_cleaned = True
29+
return
3030

31-
slug = re.sub(r'[^a-zA-Z0-9\-]', '', self.slug.lower())
31+
slug = re.sub(r'[^a-zA-Z0-9\-\s]', '', self.slug.lower())
3232
self.slug = '-'.join(slug.split())
3333

3434
self.is_cleaned = True

0 commit comments

Comments
 (0)