Projet

Général

Profil

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

Nicolas Roche, 02 juin 2020 11:29

Télécharger (6,72 ko)

Voir les différences:

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

 .../agendas/migrations/0045_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/0045_event_duration.py
chrono/agendas/migrations/0045_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', '0044_event_publication_date'),
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
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.PositiveIntegerField(_('Duration (in minutes)'), default=None, null=True, blank=True)
641 642
    publication_date = models.DateField(_('Publication date'), blank=True, null=True)
642 643
    places = models.PositiveIntegerField(_('Places'))
643 644
    waiting_list_places = models.PositiveIntegerField(_('Places in waiting list'), default=0)
644 645
    label = models.CharField(
645 646
        _('Label'),
646 647
        max_length=150,
647 648
        null=True,
648 649
        blank=True,
......
654 655
    )
655 656
    pricing = models.CharField(_('Pricing'), max_length=150, null=True, blank=True)
656 657
    url = models.CharField(_('URL'), max_length=200, null=True, blank=True)
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)
660 661

  
661 662
    class Meta:
662
        ordering = ['agenda', 'start_datetime', 'label']
663
        ordering = ['agenda', 'start_datetime', 'duration', 'label']
663 664
        unique_together = ('agenda', 'slug')
664 665

  
665 666
    def __str__(self):
666 667
        if self.label:
667 668
            return self.label
668 669
        return date_format(localtime(self.start_datetime), format='DATETIME_FORMAT')
669 670

  
670 671
    def save(self, *args, **kwargs):
......
741 742
        return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=False).count()
742 743

  
743 744
    @property
744 745
    def waiting_list(self):
745 746
        return self.booking_set.filter(cancellation_datetime__isnull=True, in_waiting_list=True).count()
746 747

  
747 748
    @property
748 749
    def end_datetime(self):
749
        return self.start_datetime + datetime.timedelta(minutes=self.meeting_type.duration)
750
        if self.meeting_type:
751
            minutes = self.meeting_type.duration
752
        else:
753
            minutes = self.duration
754
        if minutes is None:
755
            return None
756
        return self.start_datetime + datetime.timedelta(minutes=minutes)
750 757

  
751 758
    def get_absolute_url(self):
752 759
        return reverse('chrono-manager-event-edit', kwargs={'pk': self.agenda.id, 'event_pk': self.id})
753 760

  
754 761
    @classmethod
755 762
    def import_json(cls, data):
756 763
        data['start_datetime'] = make_aware(
757 764
            datetime.datetime.strptime(data['start_datetime'], '%Y-%m-%d %H:%M:%S')
tests/test_manager.py
457 457
    resp.form['places'] = 10
458 458
    resp = resp.form.submit()
459 459
    resp = resp.follow()
460 460
    event = Event.objects.get(places=10)
461 461
    assert "This agenda doesn't have any event yet." not in resp.text
462 462
    assert '/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id) in resp.text
463 463
    assert 'Feb. 15, 2016, 5 p.m.' in resp.text
464 464
    assert '10 places' in resp.text
465
    assert event.duration is None
466
    assert event.end_datetime is None
467

  
468
    resp = resp.click('New Event')
469
    resp.form['start_datetime$date'] = '2016-02-15'
470
    resp.form['start_datetime$time'] = '17:00'
471
    resp.form['duration'] = 45
472
    resp.form['places'] = 12
473
    resp = resp.form.submit()
474
    resp = resp.follow()
475
    event = Event.objects.get(places=12)
476
    assert event.duration == 45
477
    assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45)
465 478

  
466 479

  
467 480
def test_edit_event(app, admin_user):
468 481
    agenda = Agenda(label=u'Foo bar')
469 482
    agenda.save()
470 483
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=20, agenda=agenda)
471 484
    event.save()
485
    assert event.duration is None
486
    assert event.end_datetime is None
472 487
    app = login(app)
473 488
    resp = app.get('/manage/agendas/%s/settings' % agenda.id, status=200)
474 489
    resp = resp.click('Feb. 15, 2016, 5 p.m.')
475 490
    assert resp.form['start_datetime$date'].value == '2016-02-15'
476 491
    assert resp.form['start_datetime$time'].value == '17:00'
477 492
    assert resp.form['publication_date'].value == ''
493
    assert resp.form['duration'].value == ''
478 494
    resp.form['start_datetime$date'] = '2016-02-16'
479 495
    resp.form['start_datetime$time'] = '17:00'
480 496
    resp.form['publication_date'] = '2020-05-11'
497
    resp.form['duration'].value = 45
481 498
    resp.form['places'] = 20
482 499
    resp = resp.form.submit()
483 500
    resp = resp.follow()
484 501
    assert '/manage/agendas/%s/events/%s/edit' % (agenda.id, event.id) in resp.text
485 502
    assert 'Feb. 16, 2016, 5 p.m.' in resp.text
486 503
    assert '20 places' in resp.text
487 504
    event.refresh_from_db()
488 505
    assert event.publication_date == datetime.date(2020, 5, 11)
506
    assert event.duration == 45
507
    assert event.end_datetime == event.start_datetime + datetime.timedelta(minutes=45)
489 508

  
490 509

  
491 510
def test_edit_missing_event(app, admin_user):
492 511
    app = login(app)
493 512
    app.get('/manage/agendas/999/', status=404)
494 513

  
495 514

  
496 515
def test_edit_event_as_manager(app, manager_user):
497
-