Projet

Général

Profil

0001-manager-add-duration-on-events-37352.patch

Nicolas Roche, 28 mai 2020 17:57

Télécharger (5,32 ko)

Voir les différences:

Subject: [PATCH 1/2] manager: add duration on events (#37352)

 .../migrations/0044_auto_20200528_1603.py     | 24 +++++++++++++++++++
 chrono/agendas/models.py                      |  9 +++++--
 tests/test_manager.py                         |  3 +++
 3 files changed, 34 insertions(+), 2 deletions(-)
 create mode 100644 chrono/agendas/migrations/0044_auto_20200528_1603.py
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
-