manager: allow exporting agendas by category (#77790)
gitea/chrono/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2023-05-25 16:45:01 +02:00
parent c19cc93e39
commit 80b2b70654
3 changed files with 33 additions and 9 deletions

View File

@ -37,6 +37,7 @@ from django.utils.encoding import force_str
from django.utils.formats import date_format
from django.utils.html import format_html, mark_safe
from django.utils.translation import gettext_lazy as _
from django.utils.translation import pgettext
from chrono.agendas.models import (
WEEK_CHOICES,
@ -46,6 +47,7 @@ from chrono.agendas.models import (
AgendaNotificationsSettings,
AgendaReminderSettings,
Booking,
Category,
Desk,
Event,
EventsType,
@ -1505,7 +1507,7 @@ class AgendaReminderTestForm(forms.Form):
class AgendasExportForm(forms.Form):
agendas = forms.BooleanField(label=_('Agendas'), required=False, initial=True)
agendas = forms.ChoiceField(label=_('Agendas'), required=True)
resources = forms.BooleanField(label=_('Resources'), required=False, initial=True)
unavailability_calendars = forms.BooleanField(
label=_('Unavailability calendars'), required=False, initial=True
@ -1520,6 +1522,10 @@ class AgendasExportForm(forms.Form):
self.fields['shared_custody'].initial = False
self.fields['shared_custody'].widget = forms.HiddenInput()
self.fields['agendas'].choices = [('all', pgettext('agendas', 'All')), ('none', _('None'))] + [
(x.id, x.label) for x in Category.objects.all()
]
class SharedCustodyRuleForm(forms.ModelForm):
guardian = forms.ModelChoiceField(label=_('Guardian'), queryset=Person.objects.none())

View File

@ -15,12 +15,10 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import collections
import itertools
from django.contrib.auth.models import Group
from django.core.exceptions import FieldDoesNotExist
from django.db import transaction
from django.db.models import Q
from chrono.agendas.models import (
Agenda,
@ -34,7 +32,7 @@ from chrono.agendas.models import (
def export_site(
agendas=True,
agendas='all',
unavailability_calendars=True,
events_types=True,
resources=True,
@ -51,10 +49,11 @@ def export_site(
data['events_types'] = [x.export_json() for x in EventsType.objects.all()]
if unavailability_calendars:
data['unavailability_calendars'] = [x.export_json() for x in UnavailabilityCalendar.objects.all()]
if agendas:
qs1 = Agenda.objects.filter(~Q(kind='virtual'))
qs2 = Agenda.objects.filter(kind='virtual')
data['agendas'] = [x.export_json() for x in itertools.chain(qs1, qs2)]
if agendas != 'none':
qs = Agenda.objects.all()
if agendas != 'all':
qs = qs.filter(category=agendas)
data['agendas'] = [x.export_json() for x in sorted(qs, key=lambda x: x == 'virtual')]
if shared_custody:
data['shared_custody_settings'] = SharedCustodySettings.get_singleton().export_json()
return data

View File

@ -9,6 +9,7 @@ from webtest import Upload
from chrono.agendas.models import (
Agenda,
Booking,
Category,
Desk,
Event,
MeetingType,
@ -54,7 +55,7 @@ def test_export_site(app, admin_user):
assert len(site_json['categories']) == 0
resp = app.get('/manage/agendas/export/')
resp.form['agendas'] = False
resp.form['agendas'] = 'none'
resp.form['events_types'] = False
resp.form['resources'] = False
resp.form['categories'] = False
@ -302,3 +303,21 @@ def test_export_site_shared_custody_settings(app, admin_user):
site_json = json.loads(resp.text)
assert 'management_role' in site_json['shared_custody_settings']
def test_export_site_agendas_of_category(app, admin_user):
category_a = Category.objects.create(label='Category A')
category_b = Category.objects.create(label='Category B')
Agenda.objects.create(label='Foo A', kind='meetings', category=category_a)
Agenda.objects.create(label='Bar A', kind='meetings', category=category_a)
Agenda.objects.create(label='Foo B', kind='meetings', category=category_b)
Agenda.objects.create(label='Bar', kind='meetings')
login(app)
resp = app.get('/manage/agendas/export/')
resp.form['agendas'].select(text='Category A')
resp = resp.form.submit()
site_json = json.loads(resp.text)
assert len(site_json['agendas']) == 2
assert [x['label'] for x in site_json['agendas']] == ['Bar A', 'Foo A']