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