Projet

Général

Profil

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

Nicolas Roche, 02 juin 2020 17:37

Télécharger (6,76 ko)

Voir les différences:

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

 .../agendas/migrations/0046_event_duration.py | 24 +++++++++++++++++++
 chrono/agendas/models.py                      | 11 +++++++--
 tests/test_manager.py                         | 19 +++++++++++++++
 3 files changed, 52 insertions(+), 2 deletions(-)
 create mode 100644 chrono/agendas/migrations/0046_event_duration.py
chrono/agendas/migrations/0046_event_duration.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.18 on 2020-05-30 13:13
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', '0045_agenda_resources'),
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.PositiveIntegerField(blank=True, default=None, null=True, verbose_name='Duration (in minutes)'),
23
        ),
24
    ]
chrono/agendas/models.py
641 641
            'slug': self.slug,
642 642
            'duration': self.duration,
643 643
        }
644 644

  
645 645

  
646 646
class Event(models.Model):
647 647
    agenda = models.ForeignKey(Agenda, on_delete=models.CASCADE)
648 648
    start_datetime = models.DateTimeField(_('Date/time'))
649
    duration = models.PositiveIntegerField(_('Duration (in minutes)'), default=None, null=True, blank=True)
649 650
    publication_date = models.DateField(_('Publication date'), blank=True, null=True)
650 651
    places = models.PositiveIntegerField(_('Places'))
651 652
    waiting_list_places = models.PositiveIntegerField(_('Places in waiting list'), default=0)
652 653
    label = models.CharField(
653 654
        _('Label'),
654 655
        max_length=150,
655 656
        null=True,
656 657
        blank=True,
......
663 664
    pricing = models.CharField(_('Pricing'), max_length=150, null=True, blank=True)
664 665
    url = models.CharField(_('URL'), max_length=200, null=True, blank=True)
665 666
    full = models.BooleanField(default=False)
666 667
    meeting_type = models.ForeignKey(MeetingType, null=True, on_delete=models.CASCADE)
667 668
    desk = models.ForeignKey('Desk', null=True, on_delete=models.CASCADE)
668 669
    resources = models.ManyToManyField('Resource')
669 670

  
670 671
    class Meta:
671
        ordering = ['agenda', 'start_datetime', 'label']
672
        ordering = ['agenda', 'start_datetime', 'duration', 'label']
672 673
        unique_together = ('agenda', 'slug')
673 674

  
674 675
    def __str__(self):
675 676
        if self.label:
676 677
            return self.label
677 678
        return date_format(localtime(self.start_datetime), format='DATETIME_FORMAT')
678 679

  
679 680
    def save(self, *args, **kwargs):
......
750 751
        return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=False).count()
751 752

  
752 753
    @property
753 754
    def waiting_list(self):
754 755
        return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=True).count()
755 756

  
756 757
    @property
757 758
    def end_datetime(self):
758
        return self.start_datetime + datetime.timedelta(minutes=self.meeting_type.duration)
759
        if self.meeting_type:
760
            minutes = self.meeting_type.duration
761
        else:
762
            minutes = self.duration
763
        if minutes is None:
764
            return None
765
        return self.start_datetime + datetime.timedelta(minutes=minutes)
759 766

  
760 767
    def get_absolute_url(self):
761 768
        return reverse('chrono-manager-event-edit', kwargs={'pk': self.agenda.id, 'event_pk': self.id})
762 769

  
763 770
    @classmethod
764 771
    def import_json(cls, data):
765 772
        data['start_datetime'] = make_aware(
766 773
            datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S')
tests/test_manager.py
777 777
    resp.form['places'] = 10
778 778
    resp = resp.form.submit()
779 779
    resp = resp.follow()
780 780
    event = Event.objects.get(places=10)
781 781
    assert "This agenda doesn't have any event yet." not in resp.text
782 782
    assert '/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id) in resp.text
783 783
    assert 'Feb. 15, 2016, 5 p.m.' in resp.text
784 784
    assert '10 places' in resp.text
785
    assert event.duration is None
786
    assert event.end_datetime is None
787

  
788
    resp = resp.click('New Event')
789
    resp.form['start_datetime$date'] = '2016-02-15'
790
    resp.form['start_datetime$time'] = '17:00'
791
    resp.form['duration'] = 45
792
    resp.form['places'] = 12
793
    resp = resp.form.submit()
794
    resp = resp.follow()
795
    event = Event.objects.get(places=12)
796
    assert event.duration == 45
797
    assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45)
785 798

  
786 799

  
787 800
def test_edit_event(app, admin_user):
788 801
    agenda = Agenda(label=u'Foo bar')
789 802
    agenda.save()
790 803
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=20, agenda=agenda)
791 804
    event.save()
805
    assert event.duration is None
806
    assert event.end_datetime is None
792 807
    app = login(app)
793 808
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
794 809
    resp = resp.click('Feb. 15, 2016, 5 p.m.')
795 810
    assert resp.form['start_datetime$date'].value == '2016-02-15'
796 811
    assert resp.form['start_datetime$time'].value == '17:00'
797 812
    assert resp.form['publication_date'].value == ''
813
    assert resp.form['duration'].value == ''
798 814
    resp.form['start_datetime$date'] = '2016-02-16'
799 815
    resp.form['start_datetime$time'] = '17:00'
800 816
    resp.form['publication_date'] = '2020-05-11'
817
    resp.form['duration'].value = 45
801 818
    resp.form['places'] = 20
802 819
    resp = resp.form.submit()
803 820
    resp = resp.follow()
804 821
    assert '/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id) in resp.text
805 822
    assert 'Feb. 16, 2016, 5 p.m.' in resp.text
806 823
    assert '20 places' in resp.text
807 824
    event.refresh_from_db()
808 825
    assert event.publication_date == datetime.date(2020, 5, 11)
826
    assert event.duration == 45
827
    assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45)
809 828

  
810 829

  
811 830
def test_edit_missing_event(app, admin_user):
812 831
    app = login(app)
813 832
    app.get('/manage/agendas/999/', status=404)
814 833

  
815 834

  
816 835
def test_edit_event_as_manager(app, manager_user):
817
-