Projet

Général

Profil

0001-agendas-Resource-model-38942.patch

Lauréline Guérin, 29 mai 2020 17:10

Télécharger (5,63 ko)

Voir les différences:

Subject: [PATCH 1/8] agendas: Resource model (#38942)

 .../migrations/0045_agenda_resources.py       | 38 +++++++++++++++++++
 chrono/agendas/models.py                      | 19 ++++++++++
 chrono/manager/forms.py                       |  4 +-
 tests/test_agendas.py                         | 20 ++++++++++
 4 files changed, 79 insertions(+), 2 deletions(-)
 create mode 100644 chrono/agendas/migrations/0045_agenda_resources.py
chrono/agendas/migrations/0045_agenda_resources.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('agendas', '0044_event_publication_date'),
11
    ]
12

  
13
    operations = [
14
        migrations.CreateModel(
15
            name='Resource',
16
            fields=[
17
                (
18
                    'id',
19
                    models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
20
                ),
21
                ('slug', models.SlugField(max_length=160, unique=True, verbose_name='Identifier')),
22
                ('label', models.CharField(max_length=150, verbose_name='Label')),
23
                (
24
                    'description',
25
                    models.TextField(
26
                        blank=True, help_text='Optional description.', verbose_name='Description'
27
                    ),
28
                ),
29
            ],
30
            options={'ordering': ['label']},
31
        ),
32
        migrations.AddField(
33
            model_name='agenda', name='resources', field=models.ManyToManyField(to='agendas.Resource'),
34
        ),
35
        migrations.AddField(
36
            model_name='event', name='resources', field=models.ManyToManyField(to='agendas.Resource'),
37
        ),
38
    ]
chrono/agendas/models.py
122 122
        verbose_name=_('View Role'),
123 123
        on_delete=models.SET_NULL,
124 124
    )
125
    resources = models.ManyToManyField('Resource')
125 126

  
126 127
    class Meta:
127 128
        ordering = ['label']
......
657 658
    full = models.BooleanField(default=False)
658 659
    meeting_type = models.ForeignKey(MeetingType, null=True, on_delete=models.CASCADE)
659 660
    desk = models.ForeignKey('Desk', null=True, on_delete=models.CASCADE)
661
    resources = models.ManyToManyField('Resource')
660 662

  
661 663
    class Meta:
662 664
        ordering = ['agenda', 'start_datetime', 'label']
......
1084 1086
        return [OpeningHour(*time_range) for time_range in (openslots - exceptions)]
1085 1087

  
1086 1088

  
1089
class Resource(models.Model):
1090
    slug = models.SlugField(_('Identifier'), max_length=160, unique=True)
1091
    label = models.CharField(_('Label'), max_length=150)
1092
    description = models.TextField(_('Description'), blank=True, help_text=_('Optional description.'))
1093

  
1094
    def __str__(self):
1095
        return self.label
1096

  
1097
    class Meta:
1098
        ordering = ['label']
1099

  
1100
    def save(self, *args, **kwargs):
1101
        if not self.slug:
1102
            self.slug = generate_slug(self)
1103
        super().save(*args, **kwargs)
1104

  
1105

  
1087 1106
def ics_directory_path(instance, filename):
1088 1107
    return 'ics/{0}/{1}'.format(str(uuid.uuid4()), filename)
1089 1108

  
chrono/manager/forms.py
75 75
            'start_datetime': DateTimeWidget(),
76 76
            'publication_date': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
77 77
        }
78
        exclude = ['full', 'meeting_type', 'desk', 'slug']
78
        exclude = ['full', 'meeting_type', 'desk', 'slug', 'resources']
79 79

  
80 80

  
81 81
class EventForm(forms.ModelForm):
......
86 86
            'start_datetime': DateTimeWidget(),
87 87
            'publication_date': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
88 88
        }
89
        exclude = ['full', 'meeting_type', 'desk']
89
        exclude = ['full', 'meeting_type', 'desk', 'resources']
90 90

  
91 91

  
92 92
class NewMeetingTypeForm(forms.ModelForm):
tests/test_agendas.py
16 16
    Event,
17 17
    ICSError,
18 18
    MeetingType,
19
    Resource,
19 20
    TimePeriod,
20 21
    TimePeriodException,
21 22
    TimePeriodExceptionSource,
......
129 130
    assert agenda.slug == 'foo-baz-2'
130 131

  
131 132

  
133
def test_resource_slug():
134
    resource = Resource.objects.create(label=u'Foo bar')
135
    assert resource.slug == 'foo-bar'
136

  
137

  
138
def test_resource_existing_slug():
139
    resource = Resource.objects.create(label=u'Foo bar', slug='bar')
140
    assert resource.slug == 'bar'
141

  
142

  
143
def test_resource_duplicate_slugs():
144
    resource = Resource.objects.create(label=u'Foo baz')
145
    assert resource.slug == 'foo-baz'
146
    resource = Resource.objects.create(label=u'Foo baz')
147
    assert resource.slug == 'foo-baz-1'
148
    resource = Resource.objects.create(label=u'Foo baz')
149
    assert resource.slug == 'foo-baz-2'
150

  
151

  
132 152
def test_event_manager():
133 153
    agenda = Agenda(label=u'Foo baz')
134 154
    agenda.save()
135
-