agendas: add slug to MeetingType model (#13792)

This commit is contained in:
Frédéric Péters 2016-10-28 19:06:51 +02:00
parent a233f39dd1
commit 6e1fb0aa94
7 changed files with 131 additions and 3 deletions

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0010_auto_20160918_1250'),
]
operations = [
migrations.AddField(
model_name='meetingtype',
name='slug',
field=models.SlugField(null=True, verbose_name='Slug'),
),
]

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.utils.text import slugify
def set_slug_on_meeting_types(apps, schema_editor):
MeetingType = apps.get_model('agendas', 'MeetingType')
for meeting_type in MeetingType.objects.all():
meeting_type.slug = slugify(meeting_type.label)
meeting_type.save()
class Migration(migrations.Migration):
dependencies = [
('agendas', '0011_meetingtype_slug'),
]
operations = [
migrations.RunPython(set_slug_on_meeting_types, lambda x, y: None),
]

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0012_manual_set_slugs_on_meeting_types'),
]
operations = [
migrations.AlterField(
model_name='meetingtype',
name='slug',
field=models.SlugField(verbose_name='Slug'),
),
]

View File

@ -143,11 +143,27 @@ class TimePeriod(models.Model):
class MeetingType(models.Model):
agenda = models.ForeignKey(Agenda)
label = models.CharField(_('Label'), max_length=100)
slug = models.SlugField(_('Slug'))
duration = models.IntegerField(_('Duration (in minutes)'), default=30)
class Meta:
ordering = ['label']
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.label)
slug = base_slug
i = 1
while True:
try:
MeetingType.objects.get(slug=slug, agenda=self.agenda)
except self.DoesNotExist:
break
slug = '%s-%s' % (base_slug, i)
i += 1
self.slug = slug
super(MeetingType, self).save(*args, **kwargs)
class Event(models.Model):
agenda = models.ForeignKey(Agenda)

View File

@ -47,6 +47,15 @@ class EventForm(forms.ModelForm):
exclude = ['full', 'meeting_type']
class NewMeetingTypeForm(forms.ModelForm):
class Meta:
model = MeetingType
widgets = {
'agenda': forms.HiddenInput(),
}
exclude = ['slug']
class MeetingTypeForm(forms.ModelForm):
class Meta:
model = MeetingType

View File

@ -29,7 +29,8 @@ from django.views.generic import (DetailView, CreateView, UpdateView,
from chrono.agendas.models import Agenda, Event, MeetingType, TimePeriod, Booking
from .forms import EventForm, MeetingTypeForm, TimePeriodForm, ImportEventsForm
from .forms import (EventForm, NewMeetingTypeForm, MeetingTypeForm,
TimePeriodForm, ImportEventsForm)
class HomepageView(ListView):
@ -222,7 +223,7 @@ event_delete = EventDeleteView.as_view()
class AgendaAddMeetingTypeView(ManagedAgendaMixin, CreateView):
template_name = 'chrono/manager_meeting_type_form.html'
model = Event
form_class = MeetingTypeForm
form_class = NewMeetingTypeForm
agenda_add_meeting_type = AgendaAddMeetingTypeView.as_view()

View File

@ -1,9 +1,11 @@
import pytest
import datetime
from django.db import connection
from django.db.migrations.executor import MigrationExecutor
from django.utils.timezone import now
from chrono.agendas.models import Agenda, Event, Booking
from chrono.agendas.models import Agenda, Event, Booking, MeetingType
pytestmark = pytest.mark.django_db
@ -54,3 +56,42 @@ def test_event_bookable_period():
assert event.in_bookable_period() is False
agenda.maximal_booking_delay = 20
assert event.in_bookable_period() is True
def test_meeting_type_slug_migration():
executor = MigrationExecutor(connection)
migrate_from = [('agendas', '0011_meetingtype_slug')]
migrate_to = [('agendas', '0013_auto_20161028_1603')]
executor.migrate(migrate_from)
executor.loader.build_graph()
old_apps = executor.loader.project_state(migrate_from).apps
OldAgenda = old_apps.get_model('agendas', 'Agenda')
OldMeetingType = old_apps.get_model('agendas', 'MeetingType')
agenda = OldAgenda(label=u'Foo bar')
agenda.save()
meeting_type = OldMeetingType(agenda=agenda, label=u'Baz')
meeting_type.save()
executor.migrate(migrate_to)
assert MeetingType.objects.get(id=meeting_type.id).slug == 'baz'
def test_meeting_type_slugs():
agenda1 = Agenda(label=u'Foo bar')
agenda1.save()
agenda2 = Agenda(label=u'Foo bar second')
agenda2.save()
meeting_type1 = MeetingType(agenda=agenda1, label=u'Baz')
meeting_type1.save()
assert meeting_type1.slug == 'baz'
meeting_type2 = MeetingType(agenda=agenda1, label=u'Baz')
meeting_type2.save()
assert meeting_type2.slug == 'baz-1'
meeting_type3 = MeetingType(agenda=agenda2, label=u'Baz')
meeting_type3.save()
assert meeting_type3.slug == 'baz'