0001-manager-add-duration-on-events-37352.patch
chrono/agendas/migrations/0044_auto_20200528_1603.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
# Generated by Django 1.11.18 on 2020-05-28 14:03 |
|
3 |
from __future__ import unicode_literals |
|
4 | ||
5 |
from django.db import migrations, models |
|
6 | ||
7 | ||
8 |
class Migration(migrations.Migration): |
|
9 | ||
10 |
dependencies = [ |
|
11 |
('agendas', '0043_booking_user_external_id'), |
|
12 |
] |
|
13 | ||
14 |
operations = [ |
|
15 |
migrations.AlterModelOptions( |
|
16 |
name='event', |
|
17 |
options={'ordering': ['agenda', 'start_datetime', 'duration', 'label']}, |
|
18 |
), |
|
19 |
migrations.AddField( |
|
20 |
model_name='event', |
|
21 |
name='duration', |
|
22 |
field=models.IntegerField(default=30, verbose_name='Duration (in minutes)'), |
|
23 |
), |
|
24 |
] |
chrono/agendas/models.py | ||
---|---|---|
633 | 633 |
'slug': self.slug, |
634 | 634 |
'duration': self.duration, |
635 | 635 |
} |
636 | 636 | |
637 | 637 | |
638 | 638 |
class Event(models.Model): |
639 | 639 |
agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE) |
640 | 640 |
start_datetime = models.DateTimeField(_('Date/time')) |
641 |
duration = models.IntegerField(_('Duration (in minutes)'), default=30) |
|
641 | 642 |
places = models.PositiveIntegerField(_('Places')) |
642 | 643 |
waiting_list_places = models.PositiveIntegerField(_('Places in waiting list'), default=0) |
643 | 644 |
label = models.CharField( |
644 | 645 |
_('Label'), |
645 | 646 |
max_length=150, |
646 | 647 |
null=True, |
647 | 648 |
blank=True, |
648 | 649 |
help_text=_('Optional label to identify this date.'), |
... | ... | |
653 | 654 |
) |
654 | 655 |
pricing = models.CharField(_('Pricing'), max_length=150, null=True, blank=True) |
655 | 656 |
url = models.CharField(_('URL'), max_length=200, null=True, blank=True) |
656 | 657 |
full = models.BooleanField(default=False) |
657 | 658 |
meeting_type = models.ForeignKey(MeetingType, null=True, on_delete=models.CASCADE) |
658 | 659 |
desk = models.ForeignKey('Desk', null=True, on_delete=models.CASCADE) |
659 | 660 | |
660 | 661 |
class Meta: |
661 |
ordering = ['agenda', 'start_datetime', 'label'] |
|
662 |
ordering = ['agenda', 'start_datetime', 'duration', 'label']
|
|
662 | 663 |
unique_together = ('agenda', 'slug') |
663 | 664 | |
664 | 665 |
def __str__(self): |
665 | 666 |
if self.label: |
666 | 667 |
return self.label |
667 | 668 |
return date_format(localtime(self.start_datetime), format='DATETIME_FORMAT') |
668 | 669 | |
669 | 670 |
def save(self, *args, **kwargs): |
... | ... | |
738 | 739 |
return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=False).count() |
739 | 740 | |
740 | 741 |
@property |
741 | 742 |
def waiting_list(self): |
742 | 743 |
return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=True).count() |
743 | 744 | |
744 | 745 |
@property |
745 | 746 |
def end_datetime(self): |
746 |
return self.start_datetime + datetime.timedelta(minutes=self.meeting_type.duration) |
|
747 |
if self.agenda.accept_meetings(): |
|
748 |
minutes = self.meeting_type.duration |
|
749 |
else: |
|
750 |
minutes = self.duration |
|
751 |
return self.start_datetime + datetime.timedelta(minutes=minutes) |
|
747 | 752 | |
748 | 753 |
def get_absolute_url(self): |
749 | 754 |
return reverse('chrono-manager-event-edit', kwargs={'pk': self.agenda.id, 'event_pk': self.id}) |
750 | 755 | |
751 | 756 |
@classmethod |
752 | 757 |
def import_json(cls, data): |
753 | 758 |
data['start_datetime'] = make_aware( |
754 | 759 |
datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S') |
tests/test_manager.py | ||
---|---|---|
443 | 443 |
agenda.save() |
444 | 444 | |
445 | 445 |
resp = app.get('/manage/agendas/%s/' % agenda.id).follow() |
446 | 446 |
resp = resp.click('Settings') |
447 | 447 |
assert '<h2>Settings' in resp.text |
448 | 448 |
resp = resp.click('New Event') |
449 | 449 |
resp.form['start_datetime$date'] = '2016-02-15' |
450 | 450 |
resp.form['start_datetime$time'] = '17:00' |
451 |
resp.form['duration'] = 45 |
|
451 | 452 |
resp.form['places'] = 10 |
452 | 453 |
resp = resp.form.submit() |
453 | 454 |
resp = resp.follow() |
454 | 455 |
event = Event.objects.get(places=10) |
455 | 456 |
assert not "This agenda doesn't have any event yet." in resp.text |
456 | 457 |
assert '/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id) in resp.text |
457 | 458 |
assert 'Feb. 15, 2016, 5 p.m.' in resp.text |
458 | 459 |
assert '10 places' in resp.text |
460 |
assert event.duration == 45 |
|
461 |
assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45) |
|
459 | 462 | |
460 | 463 | |
461 | 464 |
def test_edit_event(app, admin_user): |
462 | 465 |
agenda = Agenda(label=u'Foo bar') |
463 | 466 |
agenda.save() |
464 | 467 |
event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=20, agenda=agenda) |
465 | 468 |
event.save() |
466 | 469 |
app = login(app) |
467 |
- |