0001-agendas-Resource-model-38942.patch
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 |
- |