Projet

Général

Profil

0001-misc-apply-pyupgrade-55867.patch

Lauréline Guérin, 27 juillet 2021 15:25

Télécharger (138 ko)

Voir les différences:

Subject: [PATCH 1/2] misc: apply pyupgrade (#55867)

 .../sync_desks_timeperiod_exceptions.py       |   3 +-
 chrono/agendas/migrations/0001_initial.py     |   3 -
 chrono/agendas/migrations/0002_event.py       |   3 -
 chrono/agendas/migrations/0003_booking.py     |   3 -
 .../0004_booking_cancellation_datetime.py     |   3 -
 chrono/agendas/migrations/0005_event_label.py |   3 -
 .../migrations/0006_auto_20160707_1357.py     |   3 -
 .../migrations/0007_auto_20160722_1135.py     |   3 -
 .../migrations/0008_auto_20160910_1319.py     |   3 -
 .../migrations/0009_auto_20160911_1640.py     |   3 -
 .../migrations/0010_auto_20160918_1250.py     |   3 -
 .../migrations/0011_meetingtype_slug.py       |   3 -
 .../0012_manual_set_slugs_on_meeting_types.py |   3 -
 .../migrations/0013_auto_20161028_1603.py     |   3 -
 .../0014_booking_primary_booking.py           |   3 -
 .../migrations/0015_auto_20170628_1137.py     |   3 -
 chrono/agendas/migrations/0016_desk.py        |   3 -
 .../migrations/0017_timeperiod_desk.py        |   3 -
 chrono/agendas/migrations/0018_event_desk.py  |   3 -
 .../migrations/0019_timeperiodexception.py    |   3 -
 .../migrations/0020_auto_20171102_1021.py     |   3 -
 .../migrations/0021_auto_20171126_1330.py     |   3 -
 .../migrations/0022_auto_20171202_1828.py     |   3 -
 .../migrations/0023_auto_20171202_1835.py     |   3 -
 .../migrations/0024_auto_20180426_1127.py     |   2 -
 .../migrations/0025_auto_20181206_1252.py     |   2 -
 .../0026_booking_user_display_label.py        |   2 -
 .../migrations/0027_event_description.py      |   2 -
 chrono/agendas/migrations/0028_event_slug.py  |   3 -
 .../migrations/0029_auto_20191106_1320.py     |   2 -
 .../migrations/0030_auto_20191107_1200.py     |   3 -
 .../migrations/0031_auto_20191107_1225.py     |   6 +-
 .../migrations/0032_auto_20191127_0919.py     |   4 +-
 .../0033_timeperiodexceptionsource.py         |   3 -
 .../agendas/migrations/0034_initial_source.py |   3 -
 ...e_desk_timeperiod_exceptions_remote_url.py |   2 -
 .../migrations/0036_auto_20191223_1758.py     |   2 -
 ...0037_timeperiodexceptionsource_ics_file.py |   3 -
 .../migrations/0038_start_virtual_agendas.py  |   2 -
 .../agendas/migrations/0039_booking_delays.py |   2 -
 .../migrations/0040_timeperiod_agenda.py      |   2 -
 .../0041_clean_event_slug_unicity.py          |   3 -
 .../0043_booking_user_external_id.py          |   3 -
 .../migrations/0044_event_publication_date.py |   3 -
 .../migrations/0045_agenda_resources.py       |   3 -
 .../agendas/migrations/0046_event_duration.py |   2 -
 .../migrations/0047_auto_20200617_1521.py     |   2 -
 .../0048_meeting_type_deleted_flag.py         |   2 -
 chrono/agendas/migrations/0049_event_slug.py  |   3 -
 chrono/agendas/migrations/0050_event_slug.py  |   3 -
 .../agendas/migrations/0051_default_view.py   |   3 -
 .../0052_event_date_range_constraint.py       |   3 -
 .../0053_event_date_range_constraint.py       |   3 -
 .../migrations/0054_agenda_categories.py      |   3 -
 .../0055_booking_cancel_callback_url.py       |   2 -
 .../migrations/0056_auto_20200811_1611.py     |   2 -
 .../migrations/0057_auto_20200831_1634.py     |   2 -
 .../0058_timeperiodexception_external.py      |   2 -
 .../migrations/0059_event_almost_full.py      |   2 -
 .../migrations/0060_auto_20200903_1041.py     |   2 -
 .../migrations/0061_auto_20200909_1752.py     |   2 -
 .../migrations/0062_auto_20200915_1401.py     |   2 -
 .../migrations/0063_auto_20200928_1445.py     |   2 -
 .../migrations/0064_booking_form_url.py       |   3 -
 .../0065_unavailability_calendar.py           |   2 -
 ...iodexceptionsource_unique_settings_slug.py |   2 -
 .../migrations/0067_auto_20201021_1746.py     |   4 +-
 ...068_remove_timeperiodexception_external.py |   2 -
 .../migrations/0069_translate_holidays.py     |   2 -
 .../migrations/0070_auto_20201202_1834.py     |   4 +-
 .../migrations/0071_booking_attendance.py     |   3 -
 .../migrations/0072_booking_absence_reason.py |   3 -
 .../migrations/0073_auto_20210125_1800.py     |   4 +-
 .../agendas/migrations/0074_simple_desks.py   |   3 -
 .../migrations/0075_auto_20210216_1553.py     |   2 -
 .../0076_event_recurrence_end_date.py         |   2 -
 .../migrations/0077_meetings_default_view.py  |   3 -
 .../migrations/0078_absence_reasons.py        |   3 -
 .../0080_create_exceptions_desks.py           |   2 -
 chrono/agendas/models.py                      |  21 ++-
 chrono/api/utils.py                           |   1 -
 chrono/api/views.py                           |  10 +-
 chrono/manager/forms.py                       |   1 -
 .../management/commands/import_site.py        |   2 +-
 chrono/manager/views.py                       |  34 ++---
 chrono/utils/spooler.py                       |   1 -
 setup.py                                      |   3 +-
 tests/api/conftest.py                         |  10 +-
 tests/api/test_all.py                         |  12 +-
 tests/api/test_booking.py                     |  16 +-
 tests/api/test_datetimes.py                   |  10 +-
 tests/api/test_event.py                       |   2 -
 tests/api/test_fillslot.py                    |  32 ++--
 tests/api/test_meetings_datetimes.py          |  26 ++--
 tests/api/test_statistics.py                  |   2 -
 tests/manager/conftest.py                     |   2 +-
 tests/manager/test_absence_reason.py          |   8 +-
 tests/manager/test_all.py                     | 102 +++++++------
 tests/manager/test_category.py                |  10 +-
 tests/manager/test_event.py                   |  64 ++++----
 tests/manager/test_resource.py                |  22 ++-
 tests/manager/test_unavailability_calendar.py |   8 +-
 tests/test_agendas.py                         | 139 +++++++++---------
 tests/test_ensure_jsonbfields.py              |   2 -
 tests/test_import_export.py                   |  24 ++-
 tests/test_requests.py                        |   6 +-
 tests/test_time_periods.py                    |  16 +-
 107 files changed, 277 insertions(+), 524 deletions(-)
chrono/agendas/management/commands/sync_desks_timeperiod_exceptions.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from __future__ import print_function
18 17

  
19 18
import sys
20 19

  
......
39 38
                source.refresh_timeperiod_exceptions_from_ics()
40 39
            except ICSError as e:
41 40
                print(
42
                    u'unable to create timeperiod exceptions for "%s": %s' % (source.desk, e), file=sys.stderr
41
                    'unable to create timeperiod exceptions for "%s": %s' % (source.desk, e), file=sys.stderr
43 42
                )
chrono/agendas/migrations/0001_initial.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0002_event.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0003_booking.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.contrib.postgres.fields import JSONField
5 2
from django.db import migrations, models
6 3

  
chrono/agendas/migrations/0004_booking_cancellation_datetime.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0005_event_label.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0006_auto_20160707_1357.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import datetime
5 2

  
6 3
from django.db import migrations, models
chrono/agendas/migrations/0007_auto_20160722_1135.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0008_auto_20160910_1319.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import django
5 2
from django.db import migrations, models
6 3

  
chrono/agendas/migrations/0009_auto_20160911_1640.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0010_auto_20160918_1250.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0011_meetingtype_slug.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0012_manual_set_slugs_on_meeting_types.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations
5 2
from django.utils.text import slugify
6 3

  
chrono/agendas/migrations/0013_auto_20161028_1603.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0014_booking_primary_booking.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0015_auto_20170628_1137.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0016_desk.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0017_timeperiod_desk.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0018_event_desk.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0019_timeperiodexception.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0020_auto_20171102_1021.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import datetime
5 2

  
6 3
from django.db import migrations, models
chrono/agendas/migrations/0021_auto_20171126_1330.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0022_auto_20171202_1828.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0023_auto_20171202_1835.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0024_auto_20180426_1127.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.12 on 2018-04-26 11:27
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0025_auto_20181206_1252.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.12 on 2018-12-06 12:52
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
chrono/agendas/migrations/0026_booking_user_display_label.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.20 on 2019-03-14 15:06
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0027_event_description.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.12 on 2019-09-17 06:36
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0028_event_slug.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0029_auto_20191106_1320.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2019-11-06 12:20
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0030_auto_20191107_1200.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations
5 2
from django.utils.text import slugify
6 3

  
chrono/agendas/migrations/0031_auto_20191107_1225.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2019-11-07 11:25
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
......
19 17
        ),
20 18
        migrations.AlterUniqueTogether(
21 19
            name='desk',
22
            unique_together=set([('agenda', 'slug')]),
20
            unique_together={('agenda', 'slug')},
23 21
        ),
24 22
        migrations.AlterUniqueTogether(
25 23
            name='meetingtype',
26
            unique_together=set([('agenda', 'slug')]),
24
            unique_together={('agenda', 'slug')},
27 25
        ),
28 26
    ]
chrono/agendas/migrations/0032_auto_20191127_0919.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.17 on 2019-11-27 08:19
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
......
21 19
        ),
22 20
        migrations.AlterUniqueTogether(
23 21
            name='event',
24
            unique_together=set([('agenda', 'slug')]),
22
            unique_together={('agenda', 'slug')},
25 23
        ),
26 24
    ]
chrono/agendas/migrations/0033_timeperiodexceptionsource.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import django.db.models.deletion
5 2
from django.db import migrations, models
6 3

  
chrono/agendas/migrations/0034_initial_source.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations
5 2

  
6 3

  
chrono/agendas/migrations/0035_remove_desk_timeperiod_exceptions_remote_url.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2019-12-09 14:24
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations
6 4

  
chrono/agendas/migrations/0036_auto_20191223_1758.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.17 on 2019-12-23 17:58
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0037_timeperiodexceptionsource_ics_file.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3
import chrono.agendas.models
chrono/agendas/migrations/0038_start_virtual_agendas.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-02-20 12:15
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
chrono/agendas/migrations/0039_booking_delays.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-02-25 07:33
3
from __future__ import unicode_literals
4 2

  
5 3
import django.core.validators
6 4
from django.db import migrations, models
chrono/agendas/migrations/0040_timeperiod_agenda.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-02-26 13:27
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
chrono/agendas/migrations/0041_clean_event_slug_unicity.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import django
5 2
from django.db import migrations
6 3

  
chrono/agendas/migrations/0043_booking_user_external_id.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0044_event_publication_date.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0045_agenda_resources.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0046_event_duration.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-05-30 13:13
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0047_auto_20200617_1521.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-06-17 13:21
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0048_meeting_type_deleted_flag.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-06-17 13:23
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0049_event_slug.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import uuid
5 2

  
6 3
from django.db import migrations
chrono/agendas/migrations/0050_event_slug.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3
import chrono.agendas.models
chrono/agendas/migrations/0051_default_view.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0052_event_date_range_constraint.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, transaction
5 2
from django.db.utils import InternalError, OperationalError, ProgrammingError
6 3

  
chrono/agendas/migrations/0053_event_date_range_constraint.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, transaction
5 2
from django.db.utils import InternalError, OperationalError, ProgrammingError
6 3

  
chrono/agendas/migrations/0054_agenda_categories.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import django.db.models.deletion
5 2
from django.db import migrations, models
6 3

  
chrono/agendas/migrations/0055_booking_cancel_callback_url.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-07-29 09:42
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0056_auto_20200811_1611.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-08-11 14:11
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.contrib.postgres.fields import JSONField
chrono/agendas/migrations/0057_auto_20200831_1634.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-08-31 14:34
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0058_timeperiodexception_external.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-08-31 14:36
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0059_event_almost_full.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-09-03 08:40
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0060_auto_20200903_1041.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-09-03 08:41
3
from __future__ import unicode_literals
4 2

  
5 3
import django.contrib.postgres.fields
6 4
import django.db.models.deletion
chrono/agendas/migrations/0061_auto_20200909_1752.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-09-09 15:52
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0062_auto_20200915_1401.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-09-15 12:01
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
chrono/agendas/migrations/0063_auto_20200928_1445.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-09-28 12:45
3
from __future__ import unicode_literals
4 2

  
5 3
import django.core.validators
6 4
from django.db import migrations, models
chrono/agendas/migrations/0064_booking_form_url.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3
import chrono.agendas.models
chrono/agendas/migrations/0065_unavailability_calendar.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-10-05 12:37
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
chrono/agendas/migrations/0066_timeperiodexceptionsource_unique_settings_slug.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-10-21 11:56
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations
6 4
from django.db.models import Count, F
chrono/agendas/migrations/0067_auto_20201021_1746.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-10-21 15:46
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations
6 4

  
......
14 12
    operations = [
15 13
        migrations.AlterUniqueTogether(
16 14
            name='timeperiodexceptionsource',
17
            unique_together=set([('desk', 'settings_slug')]),
15
            unique_together={('desk', 'settings_slug')},
18 16
        ),
19 17
    ]
chrono/agendas/migrations/0068_remove_timeperiodexception_external.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-10-27 09:32
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations
6 4

  
chrono/agendas/migrations/0069_translate_holidays.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2020-10-29 15:39
3
from __future__ import unicode_literals
4 2

  
5 3
from django.conf import settings
6 4
from django.db import migrations
chrono/agendas/migrations/0070_auto_20201202_1834.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.29 on 2020-12-02 17:34
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.db import migrations, models
......
47 45
        ),
48 46
        migrations.AlterUniqueTogether(
49 47
            name='bookingcolor',
50
            unique_together=set([('agenda', 'label')]),
48
            unique_together={('agenda', 'label')},
51 49
        ),
52 50
    ]
chrono/agendas/migrations/0071_booking_attendance.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0072_booking_absence_reason.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0073_auto_20210125_1800.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2021-01-25 17:00
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations
6 4

  
......
23 21
        migrations.RunPython(booking_color_unique_label, migrations.RunPython.noop),
24 22
        migrations.AlterUniqueTogether(
25 23
            name='bookingcolor',
26
            unique_together=set([('label',)]),
24
            unique_together={('label',)},
27 25
        ),
28 26
        migrations.RemoveField(
29 27
            model_name='bookingcolor',
chrono/agendas/migrations/0074_simple_desks.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations, models
5 2

  
6 3

  
chrono/agendas/migrations/0075_auto_20210216_1553.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2021-02-16 14:53
3
from __future__ import unicode_literals
4 2

  
5 3
import django.db.models.deletion
6 4
from django.contrib.postgres.fields import JSONField
chrono/agendas/migrations/0076_event_recurrence_end_date.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2021-02-16 15:10
3
from __future__ import unicode_literals
4 2

  
5 3
from django.db import migrations, models
6 4

  
chrono/agendas/migrations/0077_meetings_default_view.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
from django.db import migrations
5 2

  
6 3

  
chrono/agendas/migrations/0078_absence_reasons.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4 1
import django.db.models.deletion
5 2
from django.db import migrations, models
6 3

  
chrono/agendas/migrations/0080_create_exceptions_desks.py
1
# -*- coding: utf-8 -*-
2 1
# Generated by Django 1.11.18 on 2021-01-27 16:46
3 2

  
4
from __future__ import unicode_literals
5 3

  
6 4
from django.db import migrations
7 5

  
chrono/agendas/models.py
1
# -*- coding: utf-8 -*-
2 1
# chrono - agendas system
3 2
# Copyright (C) 2016  Entr'ouvert
4 3
#
......
991 990
        virtual_meetingtypes = self.virtual_agenda.iter_meetingtypes(excluded_agenda=self.real_agenda)
992 991
        if not virtual_meetingtypes:
993 992
            return
994
        virtual_meetingtypes = set([(mt.label, mt.slug, mt.duration) for mt in virtual_meetingtypes])
993
        virtual_meetingtypes = {(mt.label, mt.slug, mt.duration) for mt in virtual_meetingtypes}
995 994
        real_meetingtypes = self.real_agenda.iter_meetingtypes()
996
        real_meetingtypes = set([(mt.label, mt.slug, mt.duration) for mt in real_meetingtypes])
995
        real_meetingtypes = {(mt.label, mt.slug, mt.duration) for mt in real_meetingtypes}
997 996
        if virtual_meetingtypes - real_meetingtypes:
998 997
            # missing meeting type in real agenda
999 998
            for mt in virtual_meetingtypes - real_meetingtypes:
......
1038 1037
        ordering = ['weekday', 'start_time']
1039 1038

  
1040 1039
    def __str__(self):
1041
        return u'%s / %s → %s' % (
1040
        return '%s / %s → %s' % (
1042 1041
            force_text(WEEKDAYS[self.weekday]),
1043 1042
            date_format(self.start_time, 'TIME_FORMAT'),
1044 1043
            date_format(self.end_time, 'TIME_FORMAT'),
......
1123 1122
        self.desks = set(desks)
1124 1123

  
1125 1124
    def __str__(self):
1126
        return u'%s / %s → %s' % (
1125
        return '%s / %s → %s' % (
1127 1126
            force_text(WEEKDAYS[self.weekday]),
1128 1127
            date_format(self.start_time, 'TIME_FORMAT'),
1129 1128
            date_format(self.end_time, 'TIME_FORMAT'),
......
2118 2117

  
2119 2118

  
2120 2119
def ics_directory_path(instance, filename):
2121
    return 'ics/{0}/{1}'.format(str(uuid.uuid4()), filename)
2120
    return f'ics/{str(uuid.uuid4())}/{filename}'
2122 2121

  
2123 2122

  
2124 2123
class TimePeriodExceptionSource(models.Model):
......
2462 2461
            # if both dates are at midnight don't include the time part
2463 2462
            if self.end_datetime == self.start_datetime + datetime.timedelta(days=1):
2464 2463
                # a single day
2465
                exc_repr = u'%s' % date_format(localtime(self.start_datetime), 'SHORT_DATE_FORMAT')
2464
                exc_repr = '%s' % date_format(localtime(self.start_datetime), 'SHORT_DATE_FORMAT')
2466 2465
            else:
2467
                exc_repr = u'%s → %s' % (
2466
                exc_repr = '%s → %s' % (
2468 2467
                    date_format(localtime(self.start_datetime), 'SHORT_DATE_FORMAT'),
2469 2468
                    date_format(localtime(self.end_datetime), 'SHORT_DATE_FORMAT'),
2470 2469
                )
2471 2470
        else:
2472 2471
            if localtime(self.start_datetime).date() == localtime(self.end_datetime).date():
2473 2472
                # same day
2474
                exc_repr = u'%s → %s' % (
2473
                exc_repr = '%s → %s' % (
2475 2474
                    date_format(localtime(self.start_datetime), 'SHORT_DATETIME_FORMAT'),
2476 2475
                    date_format(localtime(self.end_datetime), 'TIME_FORMAT'),
2477 2476
                )
2478 2477
            else:
2479
                exc_repr = u'%s → %s' % (
2478
                exc_repr = '%s → %s' % (
2480 2479
                    date_format(localtime(self.start_datetime), 'SHORT_DATETIME_FORMAT'),
2481 2480
                    date_format(localtime(self.end_datetime), 'SHORT_DATETIME_FORMAT'),
2482 2481
                )
2483 2482

  
2484 2483
        if self.label:
2485
            exc_repr = u'%s (%s)' % (self.label, exc_repr)
2484
            exc_repr = '%s (%s)' % (self.label, exc_repr)
2486 2485

  
2487 2486
        return exc_repr
2488 2487

  
chrono/api/utils.py
1
# -*- coding: utf-8 -*-
2 1
# chrono - agendas system
3 2
# Copyright (C) 2019  Entr'ouvert
4 3
#
chrono/api/views.py
256 256
    user_bookings = IntervalSet()
257 257
    if user_external_id:
258 258
        used_min_datetime, used_max_datetime = (
259
            min([v[0] for v in agenda_id_min_max_datetime.values()]),
260
            max([v[1] for v in agenda_id_min_max_datetime.values()]),
259
            min(v[0] for v in agenda_id_min_max_datetime.values()),
260
            max(v[1] for v in agenda_id_min_max_datetime.values()),
261 261
        )
262 262
        booked_events = (
263 263
            Event.objects.filter(
......
558 558
    resources_slugs = [s for s in request.GET['resources'].split(',') if s]
559 559
    resources = list(agenda.resources.filter(slug__in=resources_slugs))
560 560
    if len(resources) != len(resources_slugs):
561
        unknown_slugs = set(resources_slugs) - set([r.slug for r in resources])
561
        unknown_slugs = set(resources_slugs) - {r.slug for r in resources}
562 562
        unknown_slugs = sorted(list(unknown_slugs))
563 563
        raise APIError(
564 564
            _('invalid resource: %s') % ', '.join(unknown_slugs),
......
2027 2027
                'err_desc': _('secondary booking'),
2028 2028
            }
2029 2029
            return Response(response)
2030
        event_ids = set([event.pk])
2031
        in_waiting_list = set([booking.in_waiting_list])
2030
        event_ids = {event.pk}
2031
        in_waiting_list = {booking.in_waiting_list}
2032 2032
        secondary_bookings = booking.secondary_booking_set.all().order_by('-creation_datetime')
2033 2033
        for secondary in secondary_bookings:
2034 2034
            event_ids.add(secondary.event_id)
chrono/manager/forms.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
from __future__ import unicode_literals
18 17

  
19 18
import collections
20 19
import csv
chrono/manager/management/commands/import_site.py
44 44
                    overwrite=options['overwrite'],
45 45
                )
46 46
            except AgendaImportError as exc:
47
                raise CommandError(u'%s' % exc)
47
                raise CommandError('%s' % exc)
48 48

  
49 49
        if filename == '-':
50 50
            fd = sys.stdin
chrono/manager/views.py
296 296
            x for x in self.object_list if any([y.cancellation_datetime is None for y in x.booking_set.all()])
297 297
        ]
298 298
        if active_events:
299
            min_event = min([localtime(x.start_datetime).time() for x in active_events])
300
            max_event = max([localtime(x.start_datetime + interval).time() for x in active_events])
299
            min_event = min(localtime(x.start_datetime).time() for x in active_events)
300
            max_event = max(localtime(x.start_datetime + interval).time() for x in active_events)
301 301
        if min_timeperiod is None and min_event is None:
302 302
            return
303 303
        min_display = min(min_timeperiod or datetime.time(23), min_event or datetime.time(23))
......
396 396
            x for x in self.object_list if any([y.cancellation_datetime is None for y in x.booking_set.all()])
397 397
        ]
398 398
        if active_events:
399
            min_event = min([localtime(x.start_datetime).time() for x in active_events])
400
            max_event = max([localtime(x.start_datetime + interval).time() for x in active_events])
399
            min_event = min(localtime(x.start_datetime).time() for x in active_events)
400
            max_event = max(localtime(x.start_datetime + interval).time() for x in active_events)
401 401
            hide_sunday_event = not any([x.start_datetime.weekday() == 6 for x in active_events])
402 402
            hide_weekend_event = hide_sunday_event and not any(
403 403
                [x.start_datetime.weekday() == 5 for x in active_events]
......
807 807
        try:
808 808
            results = import_site(agendas_json, overwrite=False)
809 809
        except AgendaImportError as exc:
810
            form.add_error('agendas_json', u'%s' % exc)
810
            form.add_error('agendas_json', '%s' % exc)
811 811
            return self.form_invalid(form)
812 812
        except KeyError as exc:
813 813
            form.add_error('agendas_json', _('Key "%s" is missing.') % exc.args[0])
......
885 885
                else:
886 886
                    message2 = message_update
887 887

  
888
                messages.info(self.request, u'%s %s' % (message1, message2))
888
                messages.info(self.request, '%s %s' % (message1, message2))
889 889

  
890 890
        if global_noop:
891 891
            messages.info(self.request, _('No data found.'))
......
1165 1165
        )
1166 1166

  
1167 1167
    def get_timetable_infos(self):
1168
        timeperiods = itertools.chain(*[d.timeperiod_set.all() for d in self.agenda.prefetched_desks])
1168
        timeperiods = itertools.chain(*(d.timeperiod_set.all() for d in self.agenda.prefetched_desks))
1169 1169
        timeperiods = [t for t in timeperiods if t.weekday == self.date.weekday()]
1170 1170
        timeperiods = sorted(timeperiods, key=lambda t: t.start_time)
1171 1171

  
......
1173 1173

  
1174 1174
        min_timeperiod = max_timeperiod = min_event = max_event = None
1175 1175
        if timeperiods:
1176
            min_timeperiod = min([x.start_time for x in timeperiods])
1177
            max_timeperiod = max([x.end_time for x in timeperiods])
1176
            min_timeperiod = min(x.start_time for x in timeperiods)
1177
            max_timeperiod = max(x.end_time for x in timeperiods)
1178 1178
        active_events = [
1179 1179
            x for x in self.object_list if any([y.cancellation_datetime is None for y in x.booking_set.all()])
1180 1180
        ]
1181 1181
        if active_events:
1182
            min_event = min([localtime(x.start_datetime).time() for x in active_events])
1183
            max_event = max([localtime(x.start_datetime + interval).time() for x in active_events])
1182
            min_event = min(localtime(x.start_datetime).time() for x in active_events)
1183
            max_event = max(localtime(x.start_datetime + interval).time() for x in active_events)
1184 1184
        if min_timeperiod is None and min_event is None:
1185 1185
            return
1186 1186
        min_display = min(min_timeperiod or datetime.time(23), min_event or datetime.time(23))
......
1305 1305
        return '1'
1306 1306

  
1307 1307
    def get_timetable_infos(self):
1308
        timeperiods = itertools.chain(*[d.timeperiod_set.all() for d in self.agenda.prefetched_desks])
1308
        timeperiods = itertools.chain(*(d.timeperiod_set.all() for d in self.agenda.prefetched_desks))
1309 1309
        timeperiods = sorted(timeperiods, key=lambda t: (t.weekday, t.start_time))
1310 1310

  
1311 1311
        interval = datetime.timedelta(minutes=60)
......
1313 1313
        min_timeperiod = max_timeperiod = min_event = max_event = None
1314 1314
        hide_sunday_timeperiod = hide_weekend_timeperiod = hide_sunday_event = hide_weekend_event = True
1315 1315
        if timeperiods:
1316
            min_timeperiod = min([x.start_time for x in timeperiods])
1317
            max_timeperiod = max([x.end_time for x in timeperiods])
1316
            min_timeperiod = min(x.start_time for x in timeperiods)
1317
            max_timeperiod = max(x.end_time for x in timeperiods)
1318 1318
            hide_sunday_timeperiod = not any([e.weekday == 6 for e in timeperiods])
1319 1319
            hide_weekend_timeperiod = hide_sunday_timeperiod and not any(
1320 1320
                [e.weekday == 5 for e in timeperiods]
......
1323 1323
            x for x in self.object_list if any([y.cancellation_datetime is None for y in x.booking_set.all()])
1324 1324
        ]
1325 1325
        if active_events:
1326
            min_event = min([localtime(x.start_datetime).time() for x in active_events])
1327
            max_event = max([localtime(x.start_datetime + interval).time() for x in active_events])
1326
            min_event = min(localtime(x.start_datetime).time() for x in active_events)
1327
            max_event = max(localtime(x.start_datetime + interval).time() for x in active_events)
1328 1328
            hide_sunday_event = not any([x.start_datetime.weekday() == 6 for x in active_events])
1329 1329
            hide_weekend_event = hide_sunday_event and not any(
1330 1330
                [x.start_datetime.weekday() == 5 for x in active_events]
......
2554 2554

  
2555 2555
        success_url = super().get_success_url()
2556 2556
        if self.desk and 'from_popup' in self.request.GET:
2557
            success_url = '{}?display_exceptions={}'.format(success_url, self.desk.pk)
2557
            success_url = f'{success_url}?display_exceptions={self.desk.pk}'
2558 2558
        return success_url
2559 2559

  
2560 2560
    def get_queryset(self):
chrono/utils/spooler.py
1
# -*- coding: utf-8 -*-
2 1
# chrono - agendas system
3 2
# Copyright (C) 2021  Entr'ouvert
4 3
#
setup.py
1 1
#! /usr/bin/env python
2
# -*- coding: utf-8 -*-
3 2

  
4 3
import glob
5 4
import os
......
34 33
    tag exists, take 0.0- and add the length of the commit log.
35 34
    """
36 35
    if os.path.exists('VERSION'):
37
        with open('VERSION', 'r') as v:
36
        with open('VERSION') as v:
38 37
            return v.read()
39 38
    if os.path.exists('.git'):
40 39
        p = subprocess.Popen(
tests/api/conftest.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import pytest
......
13 11
def user():
14 12
    User = get_user_model()
15 13
    user = User.objects.create(
16
        username='john.doe', first_name=u'John', last_name=u'Doe', email='john.doe@example.net'
14
        username='john.doe', first_name='John', last_name='Doe', email='john.doe@example.net'
17 15
    )
18 16
    user.set_password('password')
19 17
    user.save()
......
41 39

  
42 40
@pytest.fixture
43 41
def some_data(mock_now):
44
    agenda = Agenda(label=u'Foo bar')
42
    agenda = Agenda(label='Foo bar')
45 43
    agenda.save()
46 44
    first_date = localtime(now()).replace(hour=17, minute=0, second=0, microsecond=0)
47 45
    first_date += datetime.timedelta(days=1)
......
49 47
        event = Event(start_datetime=first_date + datetime.timedelta(days=i), places=20, agenda=agenda)
50 48
        event.save()
51 49

  
52
    agenda2 = Agenda(label=u'Foo bar 2')
50
    agenda2 = Agenda(label='Foo bar 2')
53 51
    agenda2.save()
54 52
    first_date = localtime(now()).replace(hour=20, minute=0, second=0, microsecond=0)
55 53
    first_date += datetime.timedelta(days=1)
......
65 63
@pytest.fixture
66 64
def meetings_agenda(mock_now):
67 65
    agenda = Agenda(
68
        label=u'Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=56
66
        label='Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=56
69 67
    )
70 68
    agenda.save()
71 69
    meeting_type = MeetingType(agenda=agenda, label='Blah', duration=30)
tests/api/test_all.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import pytest
......
271 269
    assert resp.json == expected_resp
272 270

  
273 271
    # wrong kind
274
    agenda1 = Agenda.objects.filter(label=u'Foo bar')[0]
272
    agenda1 = Agenda.objects.filter(label='Foo bar')[0]
275 273
    resp = app.get('/api/agenda/%s/meetings/' % agenda1.slug, status=404)
276 274

  
277 275
    # unknown
......
434 432

  
435 433
    # check it doesn't get confused with an agenda with "agenda" in its slug
436 434
    agenda = Agenda(
437
        label=u'Foo bar Agenda', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=56
435
        label='Foo bar Agenda', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=56
438 436
    )
439 437
    agenda.save()
440 438
    api_url = '/api/agenda/%s/' % agenda.slug
......
462 460

  
463 461

  
464 462
def test_virtual_agendas_meetingtypes_api(app):
465
    virt_agenda = Agenda.objects.create(label=u'Virtual agenda', kind='virtual')
463
    virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual')
466 464

  
467 465
    # No meetings because no real agenda
468 466
    resp = app.get('/api/agenda/%s/meetings/' % virt_agenda.slug)
469 467
    assert resp.json == {'data': []}
470 468

  
471 469
    # One real agenda : every meetings exposed
472
    foo_agenda = Agenda.objects.create(label=u'Foo', kind='meetings')
470
    foo_agenda = Agenda.objects.create(label='Foo', kind='meetings')
473 471
    MeetingType.objects.create(agenda=foo_agenda, label='Meeting1', duration=30)
474 472
    MeetingType.objects.create(agenda=foo_agenda, label='Meeting2', duration=15)
475 473
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=foo_agenda)
......
497 495

  
498 496
    # Several real agendas
499 497

  
500
    bar_agenda = Agenda.objects.create(label=u'Bar', kind='meetings')
498
    bar_agenda = Agenda.objects.create(label='Bar', kind='meetings')
501 499
    MeetingType.objects.create(agenda=bar_agenda, label='Meeting Bar', duration=30)
502 500
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=bar_agenda)
503 501

  
tests/api/test_booking.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2
import urllib.parse as urlparse
3
from unittest import mock
5 4

  
6
import mock
7 5
import pytest
8 6
from django.utils.timezone import make_aware, now
9 7

  
......
21 19

  
22 20

  
23 21
def test_booking_ics(app, some_data, meetings_agenda, user):
24
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
22
    agenda = Agenda.objects.filter(label='Foo bar')[0]
25 23
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
26 24
    app.authorization = ('Basic', ('john.doe', 'password'))
27 25
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.slug, event.id))
......
114 112
    assert 'COMMENT:custom comment\r\n' in resp.text
115 113
    assert 'URL:http://example.com/custom\r\n' in resp.text
116 114

  
117
    meetings_agenda_id = Agenda.objects.filter(label=u'Foo bar Meeting')[0].id
115
    meetings_agenda_id = Agenda.objects.filter(label='Foo bar Meeting')[0].id
118 116
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
119 117
    resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
120 118
    event = resp.json['data'][2]
......
606 604

  
607 605

  
608 606
def test_booking_cancellation_api(app, some_data, user):
609
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
607
    agenda = Agenda.objects.filter(label='Foo bar')[0]
610 608
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
611 609
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id), status=401)
612 610

  
......
619 617

  
620 618

  
621 619
def test_booking_cancellation_post_api(app, some_data, user):
622
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
620
    agenda = Agenda.objects.filter(label='Foo bar')[0]
623 621
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
624 622
    resp = app.post('/api/agenda/%s/fillslot/%s/' % (agenda.id, event.id), status=401)
625 623

  
......
647 645

  
648 646

  
649 647
def test_booking_cancellation_post_meeting_api(app, meetings_agenda, user):
650
    agenda_id = Agenda.objects.filter(label=u'Foo bar Meeting')[0].id
648
    agenda_id = Agenda.objects.filter(label='Foo bar Meeting')[0].id
651 649
    meeting_type = MeetingType.objects.get(agenda=meetings_agenda)
652 650
    resp = app.get('/api/agenda/meetings/%s/datetimes/' % meeting_type.id)
653 651
    nb_events = len(resp.json['data'])
......
760 758

  
761 759

  
762 760
def test_cancel_booking(app, some_data, user):
763
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].pk
761
    agenda_id = Agenda.objects.filter(label='Foo bar')[0].pk
764 762
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
765 763
    primary = Booking.objects.create(event=event)
766 764
    secondary = Booking.objects.create(event=event, primary_booking=primary)
tests/api/test_datetimes.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2
import urllib.parse as urlparse
5 3

  
......
13 11

  
14 12

  
15 13
def test_datetimes_api(app, some_data):
16
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
14
    agenda = Agenda.objects.filter(label='Foo bar')[0]
17 15

  
18 16
    def check_bookability(data):
19 17
        for event in data:
......
79 77
    agenda = Agenda.objects.create(label='Foo bar', kind='events', minimal_booking_delay=0)
80 78
    Event.objects.create(
81 79
        slug='event-slug',
82
        start_datetime=localtime((now() + datetime.timedelta(days=5))).replace(hour=17, minute=0),
80
        start_datetime=localtime(now() + datetime.timedelta(days=5)).replace(hour=17, minute=0),
83 81
        places=5,
84 82
        agenda=agenda,
85 83
    )
......
339 337

  
340 338

  
341 339
def test_waiting_list_datetimes(app, some_data, user):
342
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
340
    agenda_id = Agenda.objects.filter(label='Foo bar')[0].id
343 341
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
344 342
    event.waiting_list_places = 5
345 343
    event.save()
......
489 487
    # 2017-05-20 -> saturday
490 488
    freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
491 489

  
492
    agenda = Agenda.objects.create(label=u'Foo bar')
490
    agenda = Agenda.objects.create(label='Foo bar')
493 491
    first_date = localtime(now()).replace(hour=17, minute=0, second=0, microsecond=0)
494 492
    first_date += datetime.timedelta(days=1)
495 493
    for i in range(3):
tests/api/test_event.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import pytest
tests/api/test_fillslot.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2
import urllib.parse as urlparse
3
from unittest import mock
5 4

  
6
import mock
7 5
import pytest
8 6
from django.db import connection
9 7
from django.test.utils import CaptureQueriesContext
......
25 23

  
26 24

  
27 25
def test_booking_api(app, some_data, user):
28
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
26
    agenda = Agenda.objects.filter(label='Foo bar')[0]
29 27
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
30 28

  
31 29
    # unauthenticated
......
269 267

  
270 268

  
271 269
def test_booking_api_fillslots(app, some_data, user):
272
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
270
    agenda = Agenda.objects.filter(label='Foo bar')[0]
273 271
    events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
274 272
    events_slugs = [x.slug for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
275 273
    assert len(events_ids) == 3
......
411 409

  
412 410

  
413 411
def test_booking_api_fillslots_slots_string_param(app, some_data, user):
414
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
412
    agenda = Agenda.objects.filter(label='Foo bar')[0]
415 413
    events_ids = [x.id for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()]
416 414
    assert len(events_ids) == 3
417 415
    app.authorization = ('Basic', ('john.doe', 'password'))
......
761 759

  
762 760

  
763 761
def test_booking_api_with_data(app, some_data, user):
764
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
762
    agenda = Agenda.objects.filter(label='Foo bar')[0]
765 763
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
766 764

  
767 765
    app.authorization = ('Basic', ('john.doe', 'password'))
......
855 853

  
856 854

  
857 855
def test_booking_api_force_waiting_list(app, some_data, user):
858
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
856
    agenda = Agenda.objects.filter(label='Foo bar')[0]
859 857
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
860 858

  
861 859
    app.authorization = ('Basic', ('john.doe', 'password'))
......
935 933

  
936 934

  
937 935
def test_booking_api_with_cancel_booking(app, some_data, user):
938
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
936
    agenda = Agenda.objects.filter(label='Foo bar')[0]
939 937
    event_0, event_1, event_2 = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][
940 938
        0:4
941 939
    ]
......
1017 1015

  
1018 1016

  
1019 1017
def test_soldout(app, some_data, user):
1020
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
1018
    agenda_id = Agenda.objects.filter(label='Foo bar')[0].id
1021 1019
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
1022 1020

  
1023 1021
    resp = app.get('/api/agenda/%s/datetimes/' % agenda_id)
......
1041 1039

  
1042 1040

  
1043 1041
def test_waiting_list_booking(app, some_data, user):
1044
    agenda_id = Agenda.objects.filter(label=u'Foo bar')[0].id
1042
    agenda_id = Agenda.objects.filter(label='Foo bar')[0].id
1045 1043
    event = Event.objects.filter(agenda_id=agenda_id).exclude(start_datetime__lt=now())[0]
1046 1044
    event.waiting_list_places = 5
1047 1045
    event.save()
......
1084 1082

  
1085 1083

  
1086 1084
def test_multiple_booking_api(app, some_data, user):
1087
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
1085
    agenda = Agenda.objects.filter(label='Foo bar')[0]
1088 1086
    event = [x for x in Event.objects.filter(agenda=agenda) if x.in_bookable_period()][0]
1089 1087

  
1090 1088
    app.authorization = ('Basic', ('john.doe', 'password'))
......
1174 1172

  
1175 1173

  
1176 1174
def test_multiple_booking_api_fillslots(app, some_data, user):
1177
    agenda = Agenda.objects.filter(label=u'Foo bar')[0]
1175
    agenda = Agenda.objects.filter(label='Foo bar')[0]
1178 1176
    # get slots of first 2 events
1179 1177
    events = [
1180 1178
        x for x in Event.objects.filter(agenda=agenda).order_by('start_datetime') if x.in_bookable_period()
......
1287 1285

  
1288 1286

  
1289 1287
def test_multiple_booking_move_booking(app, user):
1290
    agenda = Agenda(label=u'Foo bar')
1288
    agenda = Agenda(label='Foo bar')
1291 1289
    agenda.save()
1292 1290
    first_date = localtime(now()).replace(hour=17, minute=0, second=0, microsecond=0)
1293 1291
    first_date += datetime.timedelta(days=1)
......
1623 1621
        == resp.json['data'][0]['datetime']
1624 1622
    )
1625 1623
    second_booking_agenda = resp_booking.json['agenda']['slug']
1626
    assert set([first_booking_agenda, second_booking_agenda]) == {'foo-meeting', 'bar-meeting'}
1624
    assert {first_booking_agenda, second_booking_agenda} == {'foo-meeting', 'bar-meeting'}
1627 1625

  
1628 1626
    # try booking the same timeslot a third time: full
1629 1627
    resp_booking = app.post(fillslot_url)
......
1794 1792

  
1795 1793
@pytest.mark.freeze_time('2017-04-01')
1796 1794
def test_duration_on_booking_api_fillslot_response(app, user):
1797
    agenda = Agenda(label=u'Foo bar')
1795
    agenda = Agenda(label='Foo bar')
1798 1796
    agenda.save()
1799 1797
    first_date = datetime.datetime(2017, 5, 20, 1, 12)
1800 1798
    durations = [None, 0, 45]
......
1842 1840

  
1843 1841
@pytest.mark.freeze_time('2017-04-01')
1844 1842
def test_duration_on_booking_api_fillslots_response(app, user):
1845
    agenda = Agenda(label=u'Foo bar')
1843
    agenda = Agenda(label='Foo bar')
1846 1844
    agenda.save()
1847 1845
    first_date = datetime.datetime(2017, 5, 20, 1, 12)
1848 1846
    durations = [None, 0, 45]
tests/api/test_meetings_datetimes.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import pytest
......
884 882
@pytest.mark.freeze_time('2017-05-20')
885 883
def test_agenda_meeting_gcd_durations(app, user):
886 884
    meetings_agenda = Agenda.objects.create(
887
        label=u'Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=8
885
        label='Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=8
888 886
    )
889 887
    meeting_type_30 = MeetingType.objects.create(agenda=meetings_agenda, label='Blah', duration=30)
890 888
    desk = Desk.objects.create(agenda=meetings_agenda, label='Desk 1')
......
955 953
@pytest.mark.freeze_time('2017-05-20')
956 954
def test_agenda_meeting_gcd_durations_and_exceptions(app, user):
957 955
    meetings_agenda = Agenda.objects.create(
958
        label=u'Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=3
956
        label='Foo bar Meeting', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=3
959 957
    )
960 958
    desk = Desk.objects.create(agenda=meetings_agenda, label='Desk 1')
961 959
    TimePeriod.objects.create(
......
1131 1129

  
1132 1130
def test_virtual_agendas_meetings_datetimes_api_with_similar_desk(app):
1133 1131
    agenda_foo = Agenda.objects.create(
1134
        label=u'Agenda Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=4
1132
        label='Agenda Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=4
1135 1133
    )
1136 1134
    MeetingType.objects.create(agenda=agenda_foo, label='Meeting Type', duration=30)
1137 1135
    test_1st_weekday = (localtime(now()).weekday() + 1) % 7
......
1159 1157
    )
1160 1158

  
1161 1159
    agenda_bar = Agenda.objects.create(
1162
        label=u'Agenda Bar', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=4
1160
        label='Agenda Bar', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=4
1163 1161
    )
1164 1162
    meeting_type_bar = MeetingType.objects.create(agenda=agenda_bar, label='Meeting Type', duration=30)
1165 1163
    desk_bar = Desk.objects.create(agenda=agenda_bar, label='Desk 1')
......
1183 1181
    )
1184 1182

  
1185 1183
    virtual_agenda = Agenda.objects.create(
1186
        label=u'Agenda Virtual', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=4
1184
        label='Agenda Virtual', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=4
1187 1185
    )
1188 1186
    VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=agenda_foo)
1189 1187
    VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=agenda_bar)
......
1884 1882

  
1885 1883
def test_meetings_and_virtual_datetimes_date_filter(app):
1886 1884
    agenda_foo = Agenda.objects.create(
1887
        label=u'Agenda Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=7
1885
        label='Agenda Foo', kind='meetings', minimal_booking_delay=1, maximal_booking_delay=7
1888 1886
    )
1889 1887
    meeting_type = MeetingType.objects.create(agenda=agenda_foo, label='Meeting Type', duration=30)
1890 1888
    desk_foo = Desk.objects.create(agenda=agenda_foo, label='Desk 1')
......
1903 1901
        )
1904 1902

  
1905 1903
    virtual_agenda = Agenda.objects.create(
1906
        label=u'Agenda Virtual', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=7
1904
        label='Agenda Virtual', kind='virtual', minimal_booking_delay=1, maximal_booking_delay=7
1907 1905
    )
1908 1906
    VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=agenda_foo)
1909 1907

  
......
2034 2032
def test_datetimes_api_meetings_agenda_meta(app, freezer):
2035 2033
    # 2017-05-20 -> saturday
2036 2034
    freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
2037
    meetings_agenda = Agenda.objects.create(
2038
        label=u'Foo bar Meeting', kind='meetings', maximal_booking_delay=3
2039
    )
2035
    meetings_agenda = Agenda.objects.create(label='Foo bar Meeting', kind='meetings', maximal_booking_delay=3)
2040 2036
    meeting_type = MeetingType(agenda=meetings_agenda, label='Blah', duration=30)
2041 2037
    meeting_type.save()
2042 2038

  
......
2124 2120
def test_datetimes_api_virtual_meetings_agenda_meta(app, freezer):
2125 2121
    # 2017-05-20 -> saturday
2126 2122
    freezer.move_to(make_aware(datetime.datetime(year=2017, month=5, day=20, hour=1, minute=12)))
2127
    meetings_agenda1 = Agenda.objects.create(label=u'Foo Meeting', kind='meetings', maximal_booking_delay=3)
2128
    meetings_agenda2 = Agenda.objects.create(label=u'Bar Meeting', kind='meetings', maximal_booking_delay=3)
2129
    virtual_agenda = Agenda.objects.create(label=u'Agenda Virtual', kind='virtual', maximal_booking_delay=3)
2123
    meetings_agenda1 = Agenda.objects.create(label='Foo Meeting', kind='meetings', maximal_booking_delay=3)
2124
    meetings_agenda2 = Agenda.objects.create(label='Bar Meeting', kind='meetings', maximal_booking_delay=3)
2125
    virtual_agenda = Agenda.objects.create(label='Agenda Virtual', kind='virtual', maximal_booking_delay=3)
2130 2126
    VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=meetings_agenda1)
2131 2127
    VirtualMember.objects.create(virtual_agenda=virtual_agenda, real_agenda=meetings_agenda2)
2132 2128
    desk1 = Desk.objects.create(agenda=meetings_agenda1, label='Desk 1')
tests/api/test_statistics.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import pytest
4 2
from django.utils.timezone import now
5 3

  
tests/manager/conftest.py
42 42
        user = User.objects.get(username='api-user')
43 43
    except User.DoesNotExist:
44 44
        user = User.objects.create(
45
            username='john.doe', first_name=u'John', last_name=u'Doe', email='john.doe@example.net'
45
            username='john.doe', first_name='John', last_name='Doe', email='john.doe@example.net'
46 46
        )
47 47
        user.set_password('password')
48 48
        user.save()
tests/manager/test_absence_reason.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import copy
4 2
import json
5 3

  
......
15 13

  
16 14
@pytest.fixture
17 15
def agenda_with_restrictions(manager_user):
18
    agenda = Agenda(label=u'Foo Bar')
16
    agenda = Agenda(label='Foo Bar')
19 17
    agenda.view_role = manager_user.groups.all()[0]
20 18
    agenda.save()
21 19
    return agenda
......
238 236

  
239 237

  
240 238
def test_meetings_agenda_group(app, admin_user):
241
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
239
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
242 240
    AbsenceReasonGroup.objects.create(label='Foo bar')
243 241

  
244 242
    app = login(app)
......
250 248

  
251 249

  
252 250
def test_agenda_group(app, admin_user):
253
    agenda = Agenda.objects.create(label=u'Foo bar', kind='events')
251
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
254 252
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
255 253

  
256 254
    app = login(app)
tests/manager/test_all.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import copy
4 2
import datetime
5 3
import json
6 4
import os
5
from unittest import mock
7 6

  
8 7
import freezegun
9
import mock
10 8
import pytest
11 9
import requests
12 10
from django.contrib.auth.models import Group
......
68 66
    app = login(app, username='manager', password='manager')
69 67
    assert app.get('/manage/', status=403)
70 68

  
71
    agenda = Agenda(label=u'Foo bar')
69
    agenda = Agenda(label='Foo bar')
72 70
    agenda.save()
73 71
    assert app.get('/manage/', status=403)
74 72

  
......
112 110

  
113 111

  
114 112
def test_events_agenda_redirect(app, admin_user):
115
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
113
    agenda = Agenda.objects.create(label='Foo Bar', kind='events')
116 114

  
117 115
    app = login(app)
118 116
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
......
131 129

  
132 130
@freezegun.freeze_time('2020-07-12')
133 131
def test_events_agenda_month_redirect(app, admin_user):
134
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
132
    agenda = Agenda.objects.create(label='Foo Bar', kind='events')
135 133

  
136 134
    app = login(app)
137 135
    # no event, redirect to current month
......
183 181

  
184 182
@freezegun.freeze_time('2020-07-12')
185 183
def test_events_agenda_day_redirect(app, admin_user):
186
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
184
    agenda = Agenda.objects.create(label='Foo Bar', kind='events')
187 185

  
188 186
    app = login(app)
189 187
    # no event, redirect to current day
......
234 232

  
235 233

  
236 234
def test_meetings_agenda_redirect(app, admin_user):
237
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
235
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
238 236

  
239 237
    app = login(app)
240 238
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
......
247 245

  
248 246

  
249 247
def test_virtual_agenda_redirect(app, admin_user):
250
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='virtual')
248
    agenda = Agenda.objects.create(label='Foo Bar', kind='virtual')
251 249

  
252 250
    app = login(app)
253 251
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
......
260 258

  
261 259

  
262 260
def test_view_agendas_as_admin(app, admin_user):
263
    Agenda.objects.create(label=u'Bar Foo')
261
    Agenda.objects.create(label='Bar Foo')
264 262

  
265 263
    app = login(app)
266 264
    resp = app.get('/manage/', status=200)
......
268 266

  
269 267

  
270 268
def test_view_agendas_as_manager(app, manager_user):
271
    agenda = Agenda(label=u'Foo Bar')
269
    agenda = Agenda(label='Foo Bar')
272 270
    agenda.view_role = manager_user.groups.all()[0]
273 271
    agenda.save()
274 272

  
275
    agenda2 = Agenda(label=u'Bar Foo')
273
    agenda2 = Agenda(label='Bar Foo')
276 274
    agenda2.save()
277 275

  
278 276
    app = login(app, username='manager', password='manager')
......
406 404

  
407 405

  
408 406
def test_options_agenda(app, admin_user):
409
    agenda_events = Agenda.objects.create(label=u'Foo bar', kind='events')
407
    agenda_events = Agenda.objects.create(label='Foo bar', kind='events')
410 408
    Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
411
    agenda_meetings = Agenda.objects.create(label=u'Foo bar', kind='meetings')
412
    Agenda.objects.create(label=u'Foo bar', kind='virtual')
409
    agenda_meetings = Agenda.objects.create(label='Foo bar', kind='meetings')
410
    Agenda.objects.create(label='Foo bar', kind='virtual')
413 411

  
414 412
    app = login(app)
415 413
    resp = app.get('/manage/agendas/%s/edit' % agenda_events.pk)
......
451 449

  
452 450
def test_options_events_agenda_delays(settings, app, admin_user):
453 451
    settings.WORKING_DAY_CALENDAR = None
454
    agenda = Agenda.objects.create(label=u'Foo bar')
452
    agenda = Agenda.objects.create(label='Foo bar')
455 453
    assert agenda.minimal_booking_delay == 1
456 454
    app = login(app)
457 455
    url = '/manage/agendas/%s/booking-delays' % agenda.pk
......
471 469

  
472 470

  
473 471
def test_options_meetings_agenda_delays(app, admin_user):
474
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', maximal_booking_delay=2)
472
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings', maximal_booking_delay=2)
475 473
    assert agenda.maximal_booking_delay == 2
476 474
    app = login(app)
477 475
    url = '/manage/agendas/%s/booking-delays' % agenda.pk
......
484 482

  
485 483

  
486 484
def test_options_virtual_agenda_delays(app, admin_user):
487
    agenda = Agenda.objects.create(label=u'Foo bar', kind='virtual', maximal_booking_delay=2)
485
    agenda = Agenda.objects.create(label='Foo bar', kind='virtual', maximal_booking_delay=2)
488 486
    assert agenda.maximal_booking_delay == 2
489 487
    app = login(app)
490 488
    url = '/manage/agendas/%s/booking-delays' % agenda.pk
......
586 584

  
587 585

  
588 586
def test_options_agenda_as_manager(app, manager_user):
589
    agenda = Agenda(label=u'Foo bar')
587
    agenda = Agenda(label='Foo bar')
590 588
    agenda.view_role = manager_user.groups.all()[0]
591 589
    agenda.save()
592 590
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
696 694

  
697 695
@mock.patch('chrono.agendas.models.Agenda.is_available_for_simple_management')
698 696
def test_agenda_options_desk_simple_management(available_mock, app, admin_user):
699
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
697
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
700 698
    app = login(app)
701 699

  
702 700
    available_mock.return_value = True
......
752 750

  
753 751

  
754 752
def test_delete_agenda(app, admin_user):
755
    agenda = Agenda(label=u'Foo bar')
753
    agenda = Agenda(label='Foo bar')
756 754
    agenda.save()
757 755
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
758 756
    app = login(app)
......
766 764

  
767 765

  
768 766
def test_delete_busy_agenda(app, admin_user):
769
    agenda = Agenda(label=u'Foo bar')
767
    agenda = Agenda(label='Foo bar')
770 768
    agenda.save()
771 769
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
772 770
    event = Event(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda)
......
797 795

  
798 796

  
799 797
def test_delete_agenda_as_manager(app, manager_user):
800
    agenda = Agenda(label=u'Foo bar')
798
    agenda = Agenda(label='Foo bar')
801 799
    agenda.edit_role = manager_user.groups.all()[0]
802 800
    agenda.save()
803 801
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
809 807

  
810 808

  
811 809
def test_delete_busy_desk(app, admin_user):
812
    agenda = Agenda(label=u'Foo bar', kind='meetings')
810
    agenda = Agenda(label='Foo bar', kind='meetings')
813 811
    agenda.save()
814 812
    desk_a = Desk.objects.create(agenda=agenda, label='Desk A')
815 813
    Desk.objects.create(agenda=agenda, label='Desk B')
......
854 852

  
855 853

  
856 854
def test_meetings_agenda_add_meeting_type(app, admin_user):
857
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
855
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
858 856
    app = login(app)
859 857
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
860 858
    assert "This agenda doesn't have any meeting type yet." in resp.text
......
878 876

  
879 877

  
880 878
def test_meetings_agenda_edit_meeting_type(app, admin_user):
881
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
879
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
882 880
    meeting_type = MeetingType.objects.create(agenda=agenda, label='Blah')
883 881
    meeting_type2 = MeetingType.objects.create(agenda=agenda, label='Other')
884
    other_agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
882
    other_agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
885 883
    other_meeting_type = MeetingType.objects.create(agenda=other_agenda, label='Blah')
886 884
    assert meeting_type.slug == other_meeting_type.slug
887 885

  
......
905 903

  
906 904

  
907 905
def test_meetings_agenda_delete_meeting_type(app, admin_user):
908
    agenda = Agenda(label=u'Foo bar', kind='meetings')
906
    agenda = Agenda(label='Foo bar', kind='meetings')
909 907
    agenda.save()
910 908

  
911 909
    meeting_type = MeetingType(agenda=agenda, label='Blah')
......
933 931

  
934 932

  
935 933
def test_meetings_agenda_add_time_period(app, admin_user):
936
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
934
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
937 935
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
938 936
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
939 937
    MeetingType.objects.create(agenda=agenda, label='Blah')
......
959 957
    resp.form['end_time'] = '13:00'
960 958
    resp = resp.form.submit()
961 959
    resp = resp.follow()
962
    assert u'Monday / 10 a.m. → 1 p.m.' in resp.text
963
    assert u'Wednesday / 10 a.m. → 5 p.m.' in resp.text
960
    assert 'Monday / 10 a.m. → 1 p.m.' in resp.text
961
    assert 'Wednesday / 10 a.m. → 5 p.m.' in resp.text
964 962
    assert resp.text.index('Monday') < resp.text.index('Wednesday')
965 963

  
966 964
    # invert start and end
......
982 980

  
983 981

  
984 982
def test_meetings_agenda_add_time_period_desk_simple_management(app, admin_user):
985
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
983
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
986 984
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
987 985
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
988 986
    assert agenda.is_available_for_simple_management() is True
......
1001 999

  
1002 1000
def test_meetings_agenda_add_time_period_on_missing_desk(app, admin_user):
1003 1001
    app = login(app)
1004
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1002
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1005 1003
    app.get('/manage/agendas/%s/desk/0/add-time-period' % agenda.pk, status=404)
1006 1004

  
1007 1005

  
......
1037 1035

  
1038 1036

  
1039 1037
def test_meetings_agenda_edit_time_period(app, admin_user):
1040
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1038
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1041 1039
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1042 1040
    time_period = TimePeriod.objects.create(
1043 1041
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
......
1066 1064

  
1067 1065

  
1068 1066
def test_meetings_agenda_edit_time_period_desk_simple_management(app, admin_user):
1069
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
1067
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
1070 1068
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1071 1069
    time_period = TimePeriod.objects.create(
1072 1070
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
......
1106 1104

  
1107 1105

  
1108 1106
def test_meetings_agenda_delete_time_period(app, admin_user):
1109
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1107
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1110 1108
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1111 1109
    TimePeriod.objects.create(
1112 1110
        desk=desk, weekday=2, start_time=datetime.time(10, 0), end_time=datetime.time(18, 0)
......
1124 1122

  
1125 1123

  
1126 1124
def test_meetings_agenda_delete_time_period_desk_simple_management(app, admin_user):
1127
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
1125
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
1128 1126
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1129 1127
    time_period = TimePeriod.objects.create(
1130 1128
        desk=desk, weekday=0, start_time=datetime.time(9, 0), end_time=datetime.time(12, 0)
......
1197 1195
    }
1198 1196
)
1199 1197
def test_meetings_agenda_add_desk_from_another(app, admin_user):
1200
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1198
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1201 1199
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1202 1200
    TimePeriod.objects.create(
1203 1201
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
......
1226 1224
    }
1227 1225
)
1228 1226
def test_meetings_agenda_add_desk_simple_management(app, admin_user):
1229
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
1227
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
1230 1228
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1231 1229
    TimePeriod.objects.create(
1232 1230
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
......
1259 1257

  
1260 1258

  
1261 1259
def test_meetings_agenda_edit_desk(app, admin_user):
1262
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1260
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1263 1261
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1264 1262
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
1265
    other_agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1263
    other_agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1266 1264
    other_desk = Desk.objects.create(agenda=other_agenda, label='Desk A')
1267 1265
    assert other_desk.slug == desk.slug
1268 1266

  
......
1297 1295

  
1298 1296

  
1299 1297
def test_meetings_agenda_delete_desk(app, admin_user):
1300
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1298
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1301 1299
    Desk.objects.create(agenda=agenda, label='Desk A')
1302 1300
    desk_b = Desk.objects.create(agenda=agenda, label='Desk B')
1303 1301

  
......
1328 1326

  
1329 1327

  
1330 1328
def test_meetings_agenda_add_time_period_exception(app, admin_user):
1331
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1329
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1332 1330
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1333 1331
    desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
1334 1332

  
......
1371 1369

  
1372 1370

  
1373 1371
def test_meetings_agenda_add_time_period_exception_booking_overlaps(app, admin_user):
1374
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1372
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1375 1373
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1376 1374
    meeting_type = MeetingType.objects.create(agenda=agenda, label='Blah')
1377 1375

  
......
1399 1397

  
1400 1398

  
1401 1399
def test_meetings_agenda_add_time_period_exception_all_desks(app, admin_user):
1402
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
1400
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
1403 1401
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
1404 1402

  
1405 1403
    # add global time exception
......
3303 3301

  
3304 3302

  
3305 3303
def test_agenda_view_event(app, manager_user):
3306
    agenda = Agenda(label=u'Foo bar')
3304
    agenda = Agenda(label='Foo bar')
3307 3305
    agenda.view_role = manager_user.groups.all()[0]
3308 3306
    agenda.save()
3309 3307
    event = Event.objects.create(
......
3411 3409

  
3412 3410

  
3413 3411
def test_import_agenda(app, admin_user):
3414
    agenda = Agenda(label=u'Foo bar')
3412
    agenda = Agenda(label='Foo bar')
3415 3413
    agenda.save()
3416 3414
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
3417 3415

  
......
3479 3477

  
3480 3478
    # reference to unknown group
3481 3479
    agenda_export_dict = json.loads(force_text(agenda_export))
3482
    agenda_export_dict['agendas'][0]['permissions']['view'] = u'gé1'
3480
    agenda_export_dict['agendas'][0]['permissions']['view'] = 'gé1'
3483 3481
    agenda_export = json.dumps(agenda_export_dict).encode('utf-8')
3484 3482
    Agenda.objects.all().delete()
3485 3483
    resp = app.get('/manage/', status=200)
3486 3484
    resp = resp.click('Import')
3487 3485
    resp.form['agendas_json'] = Upload('export.json', agenda_export, 'application/json')
3488 3486
    resp = resp.form.submit()
3489
    assert u'Missing roles: &quot;gé1&quot;' in resp.text
3487
    assert 'Missing roles: &quot;gé1&quot;' in resp.text
3490 3488
    del agenda_export_dict['agendas'][0]['permissions']['view']
3491 3489

  
3492 3490
    # missing field
......
3832 3830
    assert tp.end_time.minute == 0
3833 3831

  
3834 3832
    resp = resp.follow()
3835
    assert u'Monday / 10 a.m. → 5 p.m.' in resp.text
3833
    assert 'Monday / 10 a.m. → 5 p.m.' in resp.text
3836 3834

  
3837 3835

  
3838 3836
def test_virtual_agenda_settings_edit_excluded_period(app, admin_user):
......
4033 4031

  
4034 4032

  
4035 4033
def test_duplicate_agenda(app, admin_user):
4036
    agenda = Agenda.objects.create(label=u'Foo Bar', slug='foo-bar', kind='meetings')
4034
    agenda = Agenda.objects.create(label='Foo Bar', slug='foo-bar', kind='meetings')
4037 4035
    assert Agenda.objects.count() == 1
4038 4036

  
4039 4037
    app = login(app)
......
4338 4336
    site_json = json.loads(resp.text)
4339 4337
    assert site_json == {'unavailability_calendars': [], 'agendas': [], 'absence_reason_groups': []}
4340 4338

  
4341
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='events')
4339
    agenda = Agenda.objects.create(label='Foo Bar', kind='events')
4342 4340
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
4343 4341
    UnavailabilityCalendar.objects.create(label='Calendar 1')
4344 4342
    resp = app.get('/manage/agendas/export/')
tests/manager/test_category.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import pytest
4 2

  
5 3
from chrono.agendas.models import Agenda, Category
......
10 8

  
11 9

  
12 10
def test_list_categories_as_manager(app, manager_user):
13
    agenda = Agenda(label=u'Foo Bar')
11
    agenda = Agenda(label='Foo Bar')
14 12
    agenda.view_role = manager_user.groups.all()[0]
15 13
    agenda.save()
16 14
    app = login(app, username='manager', password='manager')
......
34 32

  
35 33

  
36 34
def test_add_category_as_manager(app, manager_user):
37
    agenda = Agenda(label=u'Foo Bar')
35
    agenda = Agenda(label='Foo Bar')
38 36
    agenda.view_role = manager_user.groups.all()[0]
39 37
    agenda.save()
40 38
    app = login(app, username='manager', password='manager')
......
57 55

  
58 56

  
59 57
def test_edit_category_as_manager(app, manager_user):
60
    agenda = Agenda(label=u'Foo Bar')
58
    agenda = Agenda(label='Foo Bar')
61 59
    agenda.view_role = manager_user.groups.all()[0]
62 60
    agenda.save()
63 61
    category = Category.objects.create(label='Foo bar')
......
77 75

  
78 76

  
79 77
def test_delete_category_as_manager(app, manager_user):
80
    agenda = Agenda(label=u'Foo Bar')
78
    agenda = Agenda(label='Foo Bar')
81 79
    agenda.view_role = manager_user.groups.all()[0]
82 80
    agenda.save()
83 81
    category = Category.objects.create(label='Foo bar')
tests/manager/test_event.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import codecs
4 2
import datetime
3
from unittest import mock
5 4

  
6
import mock
7 5
import pytest
8 6
import requests
9 7
from django.core.management import call_command
......
20 18

  
21 19

  
22 20
def test_add_event(app, admin_user):
23
    agenda = Agenda(label=u'Foo bar')
21
    agenda = Agenda(label='Foo bar')
24 22
    agenda.maximal_booking_delay = 0
25 23
    agenda.save()
26 24
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
71 69

  
72 70

  
73 71
def test_add_event_as_manager(app, manager_user):
74
    agenda = Agenda(label=u'Foo bar')
72
    agenda = Agenda(label='Foo bar')
75 73
    agenda.view_role = manager_user.groups.all()[0]
76 74
    agenda.save()
77 75
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
111 109

  
112 110
def test_edit_event(settings, app, admin_user):
113 111
    settings.LANGUAGE_CODE = 'fr-fr'  # check date initial value format
114
    agenda = Agenda(label=u'Foo bar')
112
    agenda = Agenda(label='Foo bar')
115 113
    agenda.save()
116 114
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=20, agenda=agenda)
117 115
    event.save()
......
144 142

  
145 143

  
146 144
def test_event_digit_slug(app, admin_user):
147
    agenda = Agenda(label=u'Foo bar')
145
    agenda = Agenda(label='Foo bar')
148 146
    agenda.maximal_booking_delay = 0
149 147
    agenda.save()
150 148
    event = Event.objects.create(agenda=agenda, start_datetime=now(), places=10)
......
162 160

  
163 161

  
164 162
def test_edit_event_as_manager(app, manager_user):
165
    agenda = Agenda(label=u'Foo bar')
163
    agenda = Agenda(label='Foo bar')
166 164
    agenda.view_role = manager_user.groups.all()[0]
167 165
    agenda.save()
168 166
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
340 338

  
341 339

  
342 340
def test_booked_places(app, admin_user):
343
    agenda = Agenda(label=u'Foo bar')
341
    agenda = Agenda(label='Foo bar')
344 342
    agenda.save()
345 343
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
346 344
    event.save()
......
355 353

  
356 354

  
357 355
def test_event_classes(app, admin_user):
358
    agenda = Agenda(label=u'Foo bar')
356
    agenda = Agenda(label='Foo bar')
359 357
    agenda.save()
360 358
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
361 359
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
......
390 388

  
391 389

  
392 390
def test_delete_event(app, admin_user):
393
    agenda = Agenda(label=u'Foo bar')
391
    agenda = Agenda(label='Foo bar')
394 392
    agenda.save()
395 393
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
396 394
    event = Event(start_datetime=make_aware(datetime.datetime(2016, 2, 15, 17, 0)), places=10, agenda=agenda)
......
406 404

  
407 405

  
408 406
def test_delete_busy_event(app, admin_user):
409
    agenda = Agenda(label=u'Foo bar')
407
    agenda = Agenda(label='Foo bar')
410 408
    agenda.save()
411 409
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
412 410
    event = Event(start_datetime=now() + datetime.timedelta(days=10), places=10, agenda=agenda)
......
477 475

  
478 476

  
479 477
def test_delete_event_as_manager(app, manager_user):
480
    agenda = Agenda(label=u'Foo bar')
478
    agenda = Agenda(label='Foo bar')
481 479
    agenda.edit_role = manager_user.groups.all()[0]
482 480
    agenda.save()
483 481
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
......
494 492

  
495 493

  
496 494
def test_export_events(app, admin_user):
497
    agenda = Agenda.objects.create(label=u'Foo bar')
495
    agenda = Agenda.objects.create(label='Foo bar')
498 496

  
499 497
    app = login(app)
500 498
    resp = app.get('/manage/agendas/%s/export-events' % agenda.id)
......
534 532

  
535 533

  
536 534
def test_export_events_wrong_kind(app, admin_user):
537
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
535
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
538 536

  
539 537
    app = login(app)
540 538
    app.get('/manage/agendas/%s/export-events' % agenda.id, status=404)
......
544 542

  
545 543

  
546 544
def test_import_events(app, admin_user):
547
    agenda = Agenda(label=u'Foo bar')
545
    agenda = Agenda(label='Foo bar')
548 546
    agenda.save()
549 547
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
550 548

  
......
607 605
    Event.objects.all().delete()
608 606

  
609 607
    resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
610
    resp.form['events_csv_file'] = Upload(
611
        't.csv', u'2016-09-16,18:00,10,5,éléphant'.encode('utf-8'), 'text/csv'
612
    )
608
    resp.form['events_csv_file'] = Upload('t.csv', '2016-09-16,18:00,10,5,éléphant'.encode(), 'text/csv')
613 609
    resp = resp.form.submit(status=302)
614 610
    assert Event.objects.count() == 1
615 611
    assert Event.objects.all()[0].start_datetime == make_aware(datetime.datetime(2016, 9, 16, 18, 0))
616 612
    assert Event.objects.all()[0].places == 10
617 613
    assert Event.objects.all()[0].waiting_list_places == 5
618
    assert Event.objects.all()[0].label == u'éléphant'
614
    assert Event.objects.all()[0].label == 'éléphant'
619 615
    Event.objects.all().delete()
620 616

  
621 617
    # BOM
622 618
    resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
623 619
    resp.form['events_csv_file'] = Upload(
624
        't.csv', codecs.BOM_UTF8 + u'2016-09-16,18:00,10,5,éléphant'.encode('utf-8'), 'text/csv'
620
        't.csv', codecs.BOM_UTF8 + '2016-09-16,18:00,10,5,éléphant'.encode(), 'text/csv'
625 621
    )
626 622
    resp = resp.form.submit(status=302)
627 623
    assert Event.objects.count() == 1
628 624
    assert Event.objects.all()[0].start_datetime == make_aware(datetime.datetime(2016, 9, 16, 18, 0))
629 625
    assert Event.objects.all()[0].places == 10
630 626
    assert Event.objects.all()[0].waiting_list_places == 5
631
    assert Event.objects.all()[0].label == u'éléphant'
627
    assert Event.objects.all()[0].label == 'éléphant'
632 628
    Event.objects.all().delete()
633 629

  
634 630
    resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
635 631
    resp.form['events_csv_file'] = Upload(
636
        't.csv', u'2016-09-16,18:00,10,5,éléphant'.encode('iso-8859-15'), 'text/csv'
632
        't.csv', '2016-09-16,18:00,10,5,éléphant'.encode('iso-8859-15'), 'text/csv'
637 633
    )
638 634
    resp = resp.form.submit(status=302)
639 635
    assert Event.objects.count() == 1
640 636
    assert Event.objects.all()[0].start_datetime == make_aware(datetime.datetime(2016, 9, 16, 18, 0))
641 637
    assert Event.objects.all()[0].places == 10
642 638
    assert Event.objects.all()[0].waiting_list_places == 5
643
    assert Event.objects.all()[0].label == u'éléphant'
639
    assert Event.objects.all()[0].label == 'éléphant'
644 640
    Event.objects.all().delete()
645 641

  
646 642
    resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
647 643
    resp.form['events_csv_file'] = Upload(
648
        't.csv', u'2016-09-16,18:00,10,5,éléphant'.encode('eucjp'), 'text/csv'
644
        't.csv', '2016-09-16,18:00,10,5,éléphant'.encode('eucjp'), 'text/csv'
649 645
    )
650 646
    resp = resp.form.submit(status=302)
651 647
    assert Event.objects.count() == 1
652 648
    assert Event.objects.all()[0].start_datetime == make_aware(datetime.datetime(2016, 9, 16, 18, 0))
653 649
    assert Event.objects.all()[0].places == 10
654 650
    assert Event.objects.all()[0].waiting_list_places == 5
655
    assert Event.objects.all()[0].label == u'\x8f«±l\x8f«±phant'  # eucjp interpreted as iso-8859-15
651
    assert Event.objects.all()[0].label == '\x8f«±l\x8f«±phant'  # eucjp interpreted as iso-8859-15
656 652
    Event.objects.all().delete()
657 653

  
658 654
    resp = app.get('/manage/agendas/%s/import-events' % agenda.id, status=200)
......
754 750
        resp = resp.form.submit(status=302)
755 751
        assert len(ctx.captured_queries) == 22
756 752
    assert Event.objects.count() == 5
757
    assert set(Event.objects.values_list('slug', flat=True)) == set(
758
        ['labelb', 'labelb-1', 'labelb-2', 'labelb-3', 'labelb-4']
759
    )
753
    assert set(Event.objects.values_list('slug', flat=True)) == {
754
        'labelb',
755
        'labelb-1',
756
        'labelb-2',
757
        'labelb-3',
758
        'labelb-4',
759
    }
760 760

  
761 761
    # forbidden numerical slug
762 762
    Event.objects.all().delete()
......
768 768

  
769 769

  
770 770
def test_import_events_existing_event(app, admin_user, freezer):
771
    agenda = Agenda.objects.create(label=u'Foo bar')
771
    agenda = Agenda.objects.create(label='Foo bar')
772 772
    Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
773 773

  
774 774
    app = login(app)
......
803 803
                not in resp.text
804 804
            )
805 805
        assert event.start_datetime == make_aware(
806
            datetime.datetime(*[int(v) for v in date.split('-')], *[int(v) for v in time.split(':')])
806
            datetime.datetime(*(int(v) for v in date.split('-')), *(int(v) for v in time.split(':')))
807 807
        )
808 808

  
809 809
    # change date or time
......
867 867

  
868 868

  
869 869
def test_import_events_wrong_kind(app, admin_user):
870
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
870
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
871 871

  
872 872
    app = login(app)
873 873
    app.get('/manage/agendas/%s/import-events' % agenda.id, status=404)
tests/manager/test_resource.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import freezegun
......
16 14

  
17 15

  
18 16
def test_list_resources_as_manager(app, manager_user):
19
    agenda = Agenda(label=u'Foo Bar')
17
    agenda = Agenda(label='Foo Bar')
20 18
    agenda.view_role = manager_user.groups.all()[0]
21 19
    agenda.save()
22 20
    app = login(app, username='manager', password='manager')
......
40 38

  
41 39

  
42 40
def test_add_resource_as_manager(app, manager_user):
43
    agenda = Agenda(label=u'Foo Bar')
41
    agenda = Agenda(label='Foo Bar')
44 42
    agenda.view_role = manager_user.groups.all()[0]
45 43
    agenda.save()
46 44
    app = login(app, username='manager', password='manager')
......
48 46

  
49 47

  
50 48
def test_view_resource(app, admin_user):
51
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
49
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
52 50
    resource = Resource.objects.create(label='Resource 1')
53 51

  
54 52
    app = login(app)
......
61 59

  
62 60

  
63 61
def test_view_resource_as_manager(app, manager_user):
64
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
62
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
65 63
    agenda.view_role = manager_user.groups.all()[0]
66 64
    agenda.save()
67 65
    resource = Resource.objects.create(label='Resource 1')
......
200 198

  
201 199

  
202 200
def test_day_view_resource_as_manager(app, manager_user):
203
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
201
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
204 202
    agenda.view_role = manager_user.groups.all()[0]
205 203
    agenda.save()
206 204
    resource = Resource.objects.create(label='Resource 1')
......
467 465

  
468 466

  
469 467
def test_month_view_resource_as_manager(app, manager_user):
470
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
468
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
471 469
    agenda.view_role = manager_user.groups.all()[0]
472 470
    agenda.save()
473 471
    resource = Resource.objects.create(label='Resource 1')
......
492 490

  
493 491

  
494 492
def test_edit_resource_as_manager(app, manager_user):
495
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
493
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
496 494
    agenda.view_role = manager_user.groups.all()[0]
497 495
    agenda.save()
498 496
    resource = Resource.objects.create(label='Resource 1')
......
512 510

  
513 511

  
514 512
def test_delete_resource_as_manager(app, manager_user):
515
    agenda = Agenda.objects.create(label=u'Foo Bar', kind='meetings')
513
    agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
516 514
    agenda.view_role = manager_user.groups.all()[0]
517 515
    agenda.save()
518 516
    resource = Resource.objects.create(label='Resource 1')
......
521 519

  
522 520

  
523 521
def test_agenda_resources(app, admin_user):
524
    agenda = Agenda.objects.create(label=u'Foo bar', kind='events')
522
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
525 523
    resource = Resource.objects.create(label='Resource 1')
526 524
    app = login(app)
527 525
    # not for events agenda
......
530 528

  
531 529

  
532 530
def test_meetings_agenda_resources(app, admin_user):
533
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
531
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
534 532
    app = login(app)
535 533
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
536 534
    assert 'has_resources' in resp.context
tests/manager/test_unavailability_calendar.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import copy
4 2
import datetime
5 3
import json
......
26 24

  
27 25

  
28 26
def test_import_unavailability_calendar(app, admin_user):
29
    calendar = UnavailabilityCalendar.objects.create(label=u'Foo bar')
27
    calendar = UnavailabilityCalendar.objects.create(label='Foo bar')
30 28

  
31 29
    app = login(app)
32 30
    with freezegun.freeze_time('2020-06-15'):
......
95 93

  
96 94
    # reference to unknown group
97 95
    calendar_export_dict = json.loads(force_text(calendar_export))
98
    calendar_export_dict['unavailability_calendars'][0]['permissions']['view'] = u'gé1'
96
    calendar_export_dict['unavailability_calendars'][0]['permissions']['view'] = 'gé1'
99 97
    calendar_export = json.dumps(calendar_export_dict).encode('utf-8')
100 98
    UnavailabilityCalendar.objects.all().delete()
101 99
    resp = app.get('/manage/', status=200)
102 100
    resp = resp.click('Import')
103 101
    resp.form['agendas_json'] = Upload('export.json', calendar_export, 'application/json')
104 102
    resp = resp.form.submit()
105
    assert u'Missing roles: &quot;gé1&quot;' in resp.text
103
    assert 'Missing roles: &quot;gé1&quot;' in resp.text
106 104
    del calendar_export_dict['unavailability_calendars'][0]['permissions']['view']
107 105

  
108 106

  
tests/test_agendas.py
1 1
import datetime
2 2
import json
3 3
import smtplib
4
from unittest import mock
4 5

  
5
import mock
6 6
import pytest
7 7
import requests
8 8
from django.contrib.auth.models import Group, User
......
116 116

  
117 117

  
118 118
def test_slug():
119
    agenda = Agenda(label=u'Foo bar')
119
    agenda = Agenda(label='Foo bar')
120 120
    agenda.save()
121 121
    assert agenda.slug == 'foo-bar'
122 122

  
123 123

  
124 124
def test_existing_slug():
125
    agenda = Agenda(label=u'Foo bar', slug='bar')
125
    agenda = Agenda(label='Foo bar', slug='bar')
126 126
    agenda.save()
127 127
    assert agenda.slug == 'bar'
128 128

  
129 129

  
130 130
def test_duplicate_slugs():
131
    agenda = Agenda(label=u'Foo baz')
131
    agenda = Agenda(label='Foo baz')
132 132
    agenda.save()
133 133
    assert agenda.slug == 'foo-baz'
134
    agenda = Agenda(label=u'Foo baz')
134
    agenda = Agenda(label='Foo baz')
135 135
    agenda.save()
136 136
    assert agenda.slug == 'foo-baz-1'
137
    agenda = Agenda(label=u'Foo baz')
137
    agenda = Agenda(label='Foo baz')
138 138
    agenda.save()
139 139
    assert agenda.slug == 'foo-baz-2'
140 140

  
141 141

  
142 142
def test_resource_slug():
143
    resource = Resource.objects.create(label=u'Foo bar')
143
    resource = Resource.objects.create(label='Foo bar')
144 144
    assert resource.slug == 'foo-bar'
145 145

  
146 146

  
147 147
def test_resource_existing_slug():
148
    resource = Resource.objects.create(label=u'Foo bar', slug='bar')
148
    resource = Resource.objects.create(label='Foo bar', slug='bar')
149 149
    assert resource.slug == 'bar'
150 150

  
151 151

  
152 152
def test_resource_duplicate_slugs():
153
    resource = Resource.objects.create(label=u'Foo baz')
153
    resource = Resource.objects.create(label='Foo baz')
154 154
    assert resource.slug == 'foo-baz'
155
    resource = Resource.objects.create(label=u'Foo baz')
155
    resource = Resource.objects.create(label='Foo baz')
156 156
    assert resource.slug == 'foo-baz-1'
157
    resource = Resource.objects.create(label=u'Foo baz')
157
    resource = Resource.objects.create(label='Foo baz')
158 158
    assert resource.slug == 'foo-baz-2'
159 159

  
160 160

  
161 161
def test_category_slug():
162
    category = Category.objects.create(label=u'Foo bar')
162
    category = Category.objects.create(label='Foo bar')
163 163
    assert category.slug == 'foo-bar'
164 164

  
165 165

  
166 166
def test_category_existing_slug():
167
    category = Category.objects.create(label=u'Foo bar', slug='bar')
167
    category = Category.objects.create(label='Foo bar', slug='bar')
168 168
    assert category.slug == 'bar'
169 169

  
170 170

  
171 171
def test_category_duplicate_slugs():
172
    category = Category.objects.create(label=u'Foo baz')
172
    category = Category.objects.create(label='Foo baz')
173 173
    assert category.slug == 'foo-baz'
174
    category = Category.objects.create(label=u'Foo baz')
174
    category = Category.objects.create(label='Foo baz')
175 175
    assert category.slug == 'foo-baz-1'
176
    category = Category.objects.create(label=u'Foo baz')
176
    category = Category.objects.create(label='Foo baz')
177 177
    assert category.slug == 'foo-baz-2'
178 178

  
179 179

  
180 180
def test_absence_reason_group_slug():
181
    group = AbsenceReasonGroup.objects.create(label=u'Foo bar')
181
    group = AbsenceReasonGroup.objects.create(label='Foo bar')
182 182
    assert group.slug == 'foo-bar'
183 183

  
184 184

  
185 185
def test_absence_reason_group_existing_slug():
186
    group = AbsenceReasonGroup.objects.create(label=u'Foo bar', slug='bar')
186
    group = AbsenceReasonGroup.objects.create(label='Foo bar', slug='bar')
187 187
    assert group.slug == 'bar'
188 188

  
189 189

  
190 190
def test_absence_reason_group_duplicate_slugs():
191
    group = AbsenceReasonGroup.objects.create(label=u'Foo baz')
191
    group = AbsenceReasonGroup.objects.create(label='Foo baz')
192 192
    assert group.slug == 'foo-baz'
193
    group = AbsenceReasonGroup.objects.create(label=u'Foo baz')
193
    group = AbsenceReasonGroup.objects.create(label='Foo baz')
194 194
    assert group.slug == 'foo-baz-1'
195
    group = AbsenceReasonGroup.objects.create(label=u'Foo baz')
195
    group = AbsenceReasonGroup.objects.create(label='Foo baz')
196 196
    assert group.slug == 'foo-baz-2'
197 197

  
198 198

  
......
429 429

  
430 430

  
431 431
def test_event_manager():
432
    agenda = Agenda(label=u'Foo baz')
432
    agenda = Agenda(label='Foo baz')
433 433
    agenda.save()
434 434
    event = Event(start_datetime=now(), places=10, agenda=agenda)
435 435
    event.save()
......
460 460
)
461 461
def test_event_bookable_period(start_days, start_minutes, min_delay, max_delay, pub_days, expected):
462 462
    agenda = Agenda.objects.create(
463
        label=u'Foo bar', minimal_booking_delay=min_delay, maximal_booking_delay=max_delay
463
        label='Foo bar', minimal_booking_delay=min_delay, maximal_booking_delay=max_delay
464 464
    )
465 465
    event = Event.objects.create(
466 466
        start_datetime=localtime() + datetime.timedelta(days=start_days, minutes=start_minutes),
......
472 472

  
473 473

  
474 474
def test_meeting_type_slugs():
475
    agenda1 = Agenda(label=u'Foo bar')
475
    agenda1 = Agenda(label='Foo bar')
476 476
    agenda1.save()
477
    agenda2 = Agenda(label=u'Foo bar second')
477
    agenda2 = Agenda(label='Foo bar second')
478 478
    agenda2.save()
479 479

  
480
    meeting_type1 = MeetingType(agenda=agenda1, label=u'Baz')
480
    meeting_type1 = MeetingType(agenda=agenda1, label='Baz')
481 481
    meeting_type1.save()
482 482
    assert meeting_type1.slug == 'baz'
483 483

  
484
    meeting_type2 = MeetingType(agenda=agenda1, label=u'Baz')
484
    meeting_type2 = MeetingType(agenda=agenda1, label='Baz')
485 485
    meeting_type2.save()
486 486
    assert meeting_type2.slug == 'baz-1'
487 487

  
488
    meeting_type3 = MeetingType(agenda=agenda2, label=u'Baz')
488
    meeting_type3 = MeetingType(agenda=agenda2, label='Baz')
489 489
    meeting_type3.save()
490 490
    assert meeting_type3.slug == 'baz'
491 491

  
492 492

  
493 493
def test_timeperiodexception_creation_from_ics():
494
    agenda = Agenda.objects.create(label=u'Test 1 agenda')
494
    agenda = Agenda.objects.create(label='Test 1 agenda')
495 495
    desk = Desk.objects.create(label='Test 1 desk', agenda=agenda)
496 496
    source = desk.timeperiodexceptionsource_set.create(
497 497
        ics_filename='sample.ics', ics_file=ContentFile(ICS_SAMPLE, name='sample.ics')
......
501 501

  
502 502

  
503 503
def test_timeperiodexception_creation_from_ics_without_startdt():
504
    agenda = Agenda.objects.create(label=u'Test 2 agenda')
504
    agenda = Agenda.objects.create(label='Test 2 agenda')
505 505
    desk = Desk.objects.create(label='Test 2 desk', agenda=agenda)
506 506
    lines = []
507 507
    # remove start datetimes from ics
......
517 517

  
518 518

  
519 519
def test_timeperiodexception_creation_from_ics_without_enddt():
520
    agenda = Agenda.objects.create(label=u'Test 3 agenda')
520
    agenda = Agenda.objects.create(label='Test 3 agenda')
521 521
    desk = Desk.objects.create(label='Test 3 desk', agenda=agenda)
522 522
    lines = []
523 523
    # remove end datetimes from ics
......
535 535

  
536 536
@pytest.mark.freeze_time('2017-12-01')
537 537
def test_timeperiodexception_creation_from_ics_with_recurrences():
538
    agenda = Agenda.objects.create(label=u'Test 4 agenda')
538
    agenda = Agenda.objects.create(label='Test 4 agenda')
539 539
    desk = Desk.objects.create(label='Test 4 desk', agenda=agenda)
540 540
    source = desk.timeperiodexceptionsource_set.create(
541 541
        ics_filename='sample.ics', ics_file=ContentFile(ICS_SAMPLE_WITH_RECURRENT_EVENT, name='sample.ics')
......
545 545

  
546 546

  
547 547
def test_timeexception_creation_from_ics_with_dates():
548
    agenda = Agenda.objects.create(label=u'Test 5 agenda')
548
    agenda = Agenda.objects.create(label='Test 5 agenda')
549 549
    desk = Desk.objects.create(label='Test 5 desk', agenda=agenda)
550 550
    lines = []
551 551
    # remove end datetimes from ics
......
563 563

  
564 564

  
565 565
def test_timeexception_create_from_invalid_ics():
566
    agenda = Agenda.objects.create(label=u'Test 6 agenda')
566
    agenda = Agenda.objects.create(label='Test 6 agenda')
567 567
    desk = Desk.objects.create(label='Test 6 desk', agenda=agenda)
568 568
    source = desk.timeperiodexceptionsource_set.create(
569 569
        ics_filename='sample.ics', ics_file=ContentFile(INVALID_ICS_SAMPLE, name='sample.ics')
......
574 574

  
575 575

  
576 576
def test_timeexception_create_from_ics_with_no_events():
577
    agenda = Agenda.objects.create(label=u'Test 7 agenda')
577
    agenda = Agenda.objects.create(label='Test 7 agenda')
578 578
    desk = Desk.objects.create(label='Test 7 desk', agenda=agenda)
579 579
    source = desk.timeperiodexceptionsource_set.create(
580 580
        ics_filename='sample.ics', ics_file=ContentFile(ICS_SAMPLE_WITH_NO_EVENTS, name='sample.ics')
......
586 586

  
587 587
@mock.patch('chrono.agendas.models.requests.get')
588 588
def test_timeperiodexception_creation_from_remote_ics(mocked_get):
589
    agenda = Agenda.objects.create(label=u'Test 8 agenda')
589
    agenda = Agenda.objects.create(label='Test 8 agenda')
590 590
    desk = Desk.objects.create(label='Test 8 desk', agenda=agenda)
591 591
    mocked_response = mock.Mock()
592 592
    mocked_response.text = ICS_SAMPLE
......
605 605

  
606 606
@mock.patch('chrono.agendas.models.requests.get')
607 607
def test_timeperiodexception_remote_ics_encoding(mocked_get):
608
    agenda = Agenda.objects.create(label=u'Test 8 agenda')
608
    agenda = Agenda.objects.create(label='Test 8 agenda')
609 609
    desk = Desk.objects.create(label='Test 8 desk', agenda=agenda)
610 610
    mocked_response = mock.Mock()
611 611
    mocked_response.content = ICS_SAMPLE.encode('iso-8859-15')
......
619 619

  
620 620
@mock.patch('chrono.agendas.models.requests.get')
621 621
def test_timeperiodexception_creation_from_unreachable_remote_ics(mocked_get):
622
    agenda = Agenda.objects.create(label=u'Test 9 agenda')
622
    agenda = Agenda.objects.create(label='Test 9 agenda')
623 623
    desk = Desk.objects.create(label='Test 9 desk', agenda=agenda)
624 624
    mocked_response = mock.Mock()
625 625
    mocked_response.text = ICS_SAMPLE
......
637 637

  
638 638
@mock.patch('chrono.agendas.models.requests.get')
639 639
def test_timeperiodexception_creation_from_forbidden_remote_ics(mocked_get):
640
    agenda = Agenda.objects.create(label=u'Test 10 agenda')
640
    agenda = Agenda.objects.create(label='Test 10 agenda')
641 641
    desk = Desk.objects.create(label='Test 10 desk', agenda=agenda)
642 642
    mocked_response = mock.Mock()
643 643
    mocked_response.status_code = 403
......
657 657

  
658 658
@mock.patch('chrono.agendas.models.requests.get')
659 659
def test_sync_desks_timeperiod_exceptions_from_ics(mocked_get, capsys):
660
    agenda = Agenda.objects.create(label=u'Test 11 agenda')
660
    agenda = Agenda.objects.create(label='Test 11 agenda')
661 661
    desk = Desk.objects.create(label='Test 11 desk', agenda=agenda)
662 662
    source = TimePeriodExceptionSource.objects.create(desk=desk, ics_url='http://example.com/sample.ics')
663 663
    mocked_response = mock.Mock()
......
715 715
    }
716 716
)
717 717
def test_timeperiodexception_from_settings():
718
    agenda = Agenda(label=u'Test 1 agenda')
718
    agenda = Agenda(label='Test 1 agenda')
719 719
    agenda.save()
720 720
    desk = Desk(label='Test 1 desk', agenda=agenda)
721 721
    desk.save()
......
749 749
            'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
750 750
        }
751 751
    }
752
    agenda = Agenda(label=u'Test 1 agenda')
752
    agenda = Agenda(label='Test 1 agenda')
753 753
    agenda.save()
754 754

  
755 755
    desk1 = Desk(label='Test 1 desk', agenda=agenda)
......
822 822
def test_timeperiodexception_creation_from_ics_with_duration():
823 823
    # test that event defined using duration works and give the same start and
824 824
    # end dates
825
    agenda = Agenda.objects.create(label=u'Test 1 agenda')
825
    agenda = Agenda.objects.create(label='Test 1 agenda')
826 826
    desk = Desk.objects.create(label='Test 1 desk', agenda=agenda)
827 827
    source = desk.timeperiodexceptionsource_set.create(
828 828
        ics_filename='sample.ics', ics_file=ContentFile(ICS_SAMPLE_WITH_DURATION, name='sample.ics')
829 829
    )
830 830
    source.refresh_timeperiod_exceptions_from_ics()
831 831
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
832
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set(
833
        [
834
            make_aware(datetime.datetime(2017, 8, 31, 19, 8, 0)),
835
            make_aware(datetime.datetime(2017, 8, 30, 20, 8, 0)),
836
        ]
837
    )
838
    assert set(TimePeriodException.objects.values_list('end_datetime', flat=True)) == set(
839
        [
840
            make_aware(datetime.datetime(2017, 8, 31, 22, 34, 0)),
841
            make_aware(datetime.datetime(2017, 9, 1, 0, 34, 0)),
842
        ]
843
    )
832
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == {
833
        make_aware(datetime.datetime(2017, 8, 31, 19, 8, 0)),
834
        make_aware(datetime.datetime(2017, 8, 30, 20, 8, 0)),
835
    }
836
    assert set(TimePeriodException.objects.values_list('end_datetime', flat=True)) == {
837
        make_aware(datetime.datetime(2017, 8, 31, 22, 34, 0)),
838
        make_aware(datetime.datetime(2017, 9, 1, 0, 34, 0)),
839
    }
844 840

  
845 841

  
846 842
@pytest.mark.freeze_time('2017-12-01')
847 843
def test_timeperiodexception_creation_from_ics_with_recurrences_in_the_past():
848 844
    # test that recurrent events before today are not created
849 845
    # also test that duration + recurrent events works
850
    agenda = Agenda.objects.create(label=u'Test 4 agenda')
846
    agenda = Agenda.objects.create(label='Test 4 agenda')
851 847
    desk = Desk.objects.create(label='Test 4 desk', agenda=agenda)
852 848
    source = desk.timeperiodexceptionsource_set.create(
853 849
        ics_filename='sample.ics',
......
855 851
    )
856 852
    source.refresh_timeperiod_exceptions_from_ics()
857 853
    assert TimePeriodException.objects.filter(desk=desk).count() == 2
858
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == set(
859
        [make_aware(datetime.datetime(2018, 1, 1)), make_aware(datetime.datetime(2019, 1, 1))]
860
    )
854
    assert set(TimePeriodException.objects.values_list('start_datetime', flat=True)) == {
855
        make_aware(datetime.datetime(2018, 1, 1)),
856
        make_aware(datetime.datetime(2019, 1, 1)),
857
    }
861 858

  
862 859

  
863 860
def test_timeperiodexception_creation_from_ics_with_recurrences_atreal():
864
    agenda = Agenda.objects.create(label=u'Test atreal agenda')
861
    agenda = Agenda.objects.create(label='Test atreal agenda')
865 862
    desk = Desk.objects.create(label='Test atreal desk', agenda=agenda)
866 863
    source = desk.timeperiodexceptionsource_set.create(
867 864
        ics_filename='sample.ics', ics_file=ContentFile(ICS_ATREAL, name='sample.ics')
......
871 868

  
872 869

  
873 870
def test_management_role_deletion():
874
    group = Group(name=u'Group')
871
    group = Group(name='Group')
875 872
    group.save()
876
    agenda = Agenda(label=u'Test agenda', edit_role=group, view_role=group)
873
    agenda = Agenda(label='Test agenda', edit_role=group, view_role=group)
877 874
    agenda.save()
878 875

  
879 876
    Group.objects.all().delete()
......
910 907

  
911 908

  
912 909
def test_virtual_agenda_init():
913
    agenda1 = Agenda.objects.create(label=u'Agenda 1', kind='meetings')
914
    agenda2 = Agenda.objects.create(label=u'Agenda 2', kind='meetings')
915
    virt_agenda = Agenda.objects.create(label=u'Virtual agenda', kind='virtual')
910
    agenda1 = Agenda.objects.create(label='Agenda 1', kind='meetings')
911
    agenda2 = Agenda.objects.create(label='Agenda 2', kind='meetings')
912
    virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual')
916 913
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=agenda1)
917 914
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=agenda2)
918 915
    virt_agenda.save()
......
927 924

  
928 925

  
929 926
def test_virtual_agenda_base_meeting_duration():
930
    virt_agenda = Agenda.objects.create(label=u'Virtual agenda', kind='virtual')
927
    virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual')
931 928

  
932 929
    with pytest.raises(ValueError):
933 930
        virt_agenda.get_base_meeting_duration()
......
1300 1297

  
1301 1298

  
1302 1299
def test_agenda_meetings_duplicate():
1303
    group = Group(name=u'Group')
1300
    group = Group(name='Group')
1304 1301
    group.save()
1305 1302
    agenda = Agenda.objects.create(label='Agenda', kind='meetings', view_role=group)
1306 1303
    desk = Desk.objects.create(label='Desk', agenda=agenda)
......
1320 1317
        start_datetime=now() + datetime.timedelta(days=1),
1321 1318
        end_datetime=now() + datetime.timedelta(days=2),
1322 1319
    )
1323
    resource = Resource.objects.create(label=u'Foo bar')
1320
    resource = Resource.objects.create(label='Foo bar')
1324 1321
    agenda.resources.add(resource)
1325 1322

  
1326 1323
    new_agenda = agenda.duplicate()
......
1420 1417

  
1421 1418

  
1422 1419
def test_agenda_virtual_duplicate():
1423
    agenda1 = Agenda.objects.create(label=u'Agenda 1', kind='meetings')
1424
    agenda2 = Agenda.objects.create(label=u'Agenda 2', kind='meetings')
1425
    virt_agenda = Agenda.objects.create(label=u'Virtual agenda', kind='virtual')
1420
    agenda1 = Agenda.objects.create(label='Agenda 1', kind='meetings')
1421
    agenda2 = Agenda.objects.create(label='Agenda 2', kind='meetings')
1422
    virt_agenda = Agenda.objects.create(label='Virtual agenda', kind='virtual')
1426 1423
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=agenda1)
1427 1424
    VirtualMember.objects.create(virtual_agenda=virt_agenda, real_agenda=agenda2)
1428 1425
    virt_agenda.save()
tests/test_ensure_jsonbfields.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import pytest
4 2
from django.core.management import call_command
5 3
from django.db import connection
tests/test_import_export.py
1
# -*- coding: utf-8 -*-
2

  
3
from __future__ import unicode_literals
4

  
5 1
import copy
6 2
import datetime
7 3
import json
......
10 6
import sys
11 7
import tempfile
12 8
from io import StringIO
9
from unittest import mock
13 10

  
14
import mock
15 11
import pytest
16 12
from django.contrib.auth.models import Group
17 13
from django.core.management import CommandError, call_command
......
71 67
    empty_output = get_output_of_command('export_site')
72 68
    assert len(json.loads(empty_output)['agendas']) == 0
73 69

  
74
    Agenda(label=u'test').save()
70
    Agenda(label='test').save()
75 71
    old_stdin = sys.stdin
76 72
    sys.stdin = StringIO(json.dumps({}))
77 73
    assert Agenda.objects.count() == 1
......
313 309

  
314 310
def test_import_export_permissions(app):
315 311
    meetings_agenda = Agenda.objects.create(label='Foo Bar', kind='meetings')
316
    group1 = Group.objects.create(name=u'gé1')
317
    group2 = Group.objects.create(name=u'gé2')
312
    group1 = Group.objects.create(name='gé1')
313
    group2 = Group.objects.create(name='gé2')
318 314
    meetings_agenda.view_role = group1
319 315
    meetings_agenda.edit_role = group2
320 316
    meetings_agenda.save()
......
328 324
        import_site(json.loads(output), overwrite=True)
329 325
    assert 'gé1' in str(excinfo.value) and 'gé2' in str(excinfo.value)
330 326

  
331
    group1 = Group(name=u'gé1')
327
    group1 = Group(name='gé1')
332 328
    group1.save()
333 329
    with pytest.raises(AgendaImportError) as excinfo:
334 330
        import_site(json.loads(output), overwrite=True)
335
    assert u'%s' % excinfo.value == u'Missing roles: "gé2"'
331
    assert '%s' % excinfo.value == 'Missing roles: "gé2"'
336 332

  
337 333
    with tempfile.NamedTemporaryFile() as f:
338 334
        f.write(force_bytes(output))
339 335
        f.flush()
340 336
        with pytest.raises(CommandError) as excinfo:
341 337
            call_command('import_site', f.name)
342
        assert u'%s' % excinfo.value == u'Missing roles: "gé2"'
338
        assert '%s' % excinfo.value == 'Missing roles: "gé2"'
343 339

  
344
    group2 = Group(name=u'gé2')
340
    group2 = Group(name='gé2')
345 341
    group2.save()
346 342
    import_site(json.loads(output), overwrite=True)
347 343

  
......
817 813
    payload = json.loads(output)
818 814
    assert len(payload['unavailability_calendars']) == 0
819 815

  
820
    group1 = Group.objects.create(name=u'gé1')
821
    group2 = Group.objects.create(name=u'gé2')
816
    group1 = Group.objects.create(name='gé1')
817
    group2 = Group.objects.create(name='gé2')
822 818
    calendar = UnavailabilityCalendar.objects.create(label='Calendar', view_role=group1, edit_role=group2)
823 819
    tp1_start = make_aware(datetime.datetime(2017, 5, 22, 8, 0))
824 820
    tp1_end = make_aware(datetime.datetime(2017, 5, 22, 12, 30))
tests/test_requests.py
1
# -*- coding: utf-8 -*-
2

  
1
from unittest import mock
3 2
from urllib import parse
4 3

  
5
import mock
6 4
import pytest
7 5
from django.contrib.auth.models import AnonymousUser
8 6

  
......
146 144
            requests.get('http://cache.example.org/other', raise_if_not_cached=True)
147 145

  
148 146
        # check with unicode url
149
        assert requests.get(u'http://cache.example.org/éléphant').content == b'hello second world'
147
        assert requests.get('http://cache.example.org/éléphant').content == b'hello second world'
tests/test_time_periods.py
1
# -*- coding: utf-8 -*-
2

  
3 1
import datetime
4 2

  
5 3
import pytest
......
14 12

  
15 13

  
16 14
def test_timeperiod_time_slots():
17
    agenda = Agenda(label=u'Foo bar', slug='bar')
15
    agenda = Agenda(label='Foo bar', slug='bar')
18 16
    agenda.save()
19 17
    desk = Desk.objects.create(label='Desk 1', agenda=agenda)
20 18
    meeting_type = MeetingType(duration=60, agenda=agenda)
......
126 124
                end_datetime=make_aware(datetime.datetime(2018, 1, 19)),
127 125
            )
128 126
        )
129
        == u'18 jan. 2018'
127
        == '18 jan. 2018'
130 128
    )
131 129

  
132 130
    # multiple full days
......
137 135
                end_datetime=make_aware(datetime.datetime(2018, 1, 20)),
138 136
            )
139 137
        )
140
        == u'18 jan. 2018 → 20 jan. 2018'
138
        == '18 jan. 2018 → 20 jan. 2018'
141 139
    )
142 140

  
143 141
    # a few hours in a day
......
148 146
                end_datetime=make_aware(datetime.datetime(2018, 1, 18, 12, 0)),
149 147
            )
150 148
        )
151
        == u'18 jan. 2018 10:00 → 12:00'
149
        == '18 jan. 2018 10:00 → 12:00'
152 150
    )
153 151

  
154 152
    # multiple days and different times
......
159 157
                end_datetime=make_aware(datetime.datetime(2018, 1, 20, 12, 0)),
160 158
            )
161 159
        )
162
        == u'18 jan. 2018 10:00 → 20 jan. 2018 12:00'
160
        == '18 jan. 2018 10:00 → 20 jan. 2018 12:00'
163 161
    )
164 162

  
165 163

  
......
169 167
            Q(desk=desk) | Q(unavailability_calendar__desks=desk)
170 168
        )
171 169

  
172
    agenda = Agenda(label=u'Foo bar', slug='bar')
170
    agenda = Agenda(label='Foo bar', slug='bar')
173 171
    agenda.save()
174 172
    desk = Desk.objects.create(label='Desk 1', agenda=agenda)
175 173

  
......
237 235

  
238 236
def test_timeperiod_midnight_overlap_time_slots():
239 237
    # https://dev.entrouvert.org/issues/29142
240
    agenda = Agenda(label=u'Foo bar', slug='bar')
238
    agenda = Agenda(label='Foo bar', slug='bar')
241 239
    agenda.save()
242 240
    desk = Desk.objects.create(label='Desk 1', agenda=agenda)
243 241
    meeting_type = MeetingType(duration=120, agenda=agenda)
244
-