0001-manager-add-duration-on-events-37352.patch
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 |
- |