Skip to content

Commit

Permalink
Add delete for gremium (SEA-1342).
Browse files Browse the repository at this point in the history
  • Loading branch information
cyrillkuettel committed Jun 23, 2024
1 parent 8c0086e commit f965c88
Show file tree
Hide file tree
Showing 10 changed files with 204 additions and 14 deletions.
Binary file modified src/privatim/locale/de/LC_MESSAGES/privatim.mo
Binary file not shown.
20 changes: 19 additions & 1 deletion src/privatim/locale/de/LC_MESSAGES/privatim.po
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2024-06-22 21:53+0200\n"
"POT-Creation-Date: 2024-06-23 03:54+0200\n"
"PO-Revision-Date: 2024-05-21 21:20+0200\n"
"Last-Translator: cyrill <[email protected]>\n"
"Language-Team: German <[email protected]>\n"
Expand Down Expand Up @@ -126,6 +126,10 @@ msgstr "Sitzung bearbeiten"
msgid "Delete"
msgstr "Löschen"

#: src/privatim/views/meetings.py
msgid "Delete Working Group"
msgstr "Gremium löschen"

#: src/privatim/views/meetings.py
msgid "Participants"
msgstr "Mitwirkende"
Expand Down Expand Up @@ -209,6 +213,20 @@ msgstr "Gremium \"${name}\" erfolgreich hinzugefügt"
msgid "Add Working Group"
msgstr "Gremium hinzufügen"

#: src/privatim/views/working_groups.py
#, python-format
msgid ""
"Cannot delete working group \"${name}\" because it has associated meetings. "
"Please delete all meetings first."
msgstr ""
"Das Gremium \"${Name}\" kann nicht gelöscht werden, da sie über zugehörige "
"Sitzungen verfügt. Bitte löschen Sie zuerst alle Besprechungen."

#: src/privatim/views/working_groups.py
#, python-format
msgid "Successfully deleted working group \"${name}\""
msgstr "Gremium \"${name}\" erfolgreich gelöscht"

#: src/privatim/views/agenda_items.py
#, python-format
msgid "Successfully added agend item \"${title}\""
Expand Down
Binary file modified src/privatim/locale/fr/LC_MESSAGES/privatim.mo
Binary file not shown.
20 changes: 19 additions & 1 deletion src/privatim/locale/fr/LC_MESSAGES/privatim.po
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2024-06-22 21:53+0200\n"
"POT-Creation-Date: 2024-06-23 03:54+0200\n"
"PO-Revision-Date: 2024-04-11 15:53+0200\n"
"Last-Translator: cyrill <[email protected]>\n"
"Language-Team: French <[email protected]>\n"
Expand Down Expand Up @@ -123,6 +123,10 @@ msgstr "Modifier la réunion"
msgid "Delete"
msgstr "Supprimer"

#: src/privatim/views/meetings.py
msgid "Delete Working Group"
msgstr "Supprimer le comité"

#: src/privatim/views/meetings.py
msgid "Participants"
msgstr "Participants"
Expand Down Expand Up @@ -208,6 +212,20 @@ msgstr "Comité \"${name}\" ajouté avec succès"
msgid "Add Working Group"
msgstr "Ajouter un comité"

#: src/privatim/views/working_groups.py
#, python-format
msgid ""
"Cannot delete working group \"${name}\" because it has associated meetings. "
"Please delete all meetings first."
msgstr ""
"Le comité \"${Name}\" ne peut pas être supprimé car il a des réunions "
"associées. Veuillez d'abord supprimer toutes les réunions"

#: src/privatim/views/working_groups.py
#, python-format
msgid "Successfully deleted working group \"${name}\""
msgstr "Comité \"${name}\" supprimé avec succès"

#: src/privatim/views/agenda_items.py
#, python-format
msgid "Successfully added agend item \"${title}\""
Expand Down
18 changes: 17 additions & 1 deletion src/privatim/locale/privatim.pot
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2024-06-22 21:53+0200\n"
"POT-Creation-Date: 2024-06-23 03:54+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
Expand Down Expand Up @@ -123,6 +123,10 @@ msgstr ""
msgid "Delete"
msgstr ""

#: ./src/privatim/views/meetings.py
msgid "Delete Working Group"
msgstr ""

#: ./src/privatim/views/meetings.py
msgid "Participants"
msgstr ""
Expand Down Expand Up @@ -203,6 +207,18 @@ msgstr ""
msgid "Add Working Group"
msgstr ""

#: ./src/privatim/views/working_groups.py
#, python-format
msgid ""
"Cannot delete working group \"${name}\" because it has associated meetings. "
"Please delete all meetings first."
msgstr ""

#: ./src/privatim/views/working_groups.py
#, python-format
msgid "Successfully deleted working group \"${name}\""
msgstr ""

#: ./src/privatim/views/agenda_items.py
#, python-format
msgid "Successfully added agend item \"${title}\""
Expand Down
28 changes: 25 additions & 3 deletions src/privatim/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@
from privatim.views.people import people_view, person_view
from privatim.views.profile import profile_view, add_profile_image_view
from privatim.views.comment import add_comment_view
from privatim.views.working_groups import add_or_edit_group_view
from privatim.views.working_groups import (
add_or_edit_working_group,
delete_working_group_view,
)
from privatim.views.working_groups import working_groups_view


Expand Down Expand Up @@ -156,13 +159,13 @@ def includeme(config: 'Configurator') -> None:
'/working_groups/add',
)
config.add_view(
add_or_edit_group_view,
add_or_edit_working_group,
route_name='add_working_group',
renderer='templates/form.pt',
xhr=False
)
config.add_view(
add_or_edit_group_view,
add_or_edit_working_group,
route_name='add_working_group',
renderer='json',
request_method='POST',
Expand All @@ -182,6 +185,25 @@ def includeme(config: 'Configurator') -> None:
renderer='templates/working_group.pt',
)

# Delete working group
config.add_route(
'delete_working_group',
'/working_groups/{id}/delete',
factory=working_group_factory
)
config.add_view(
delete_working_group_view,
route_name='delete_working_group',
xhr=False
)
config.add_view(
delete_working_group_view,
route_name='delete_working_group',
renderer='json',
request_method='DELETE',
xhr=True
)

# Add meeting per working_group
config.add_route(
'add_meeting',
Expand Down
6 changes: 6 additions & 0 deletions src/privatim/views/meetings.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ def export_meeting_as_pdf_view(
return response


# alias working_group_view
def meetings_view(
context: WorkingGroup,
request: 'IRequest'
Expand All @@ -162,6 +163,11 @@ def meetings_view(

assert isinstance(context, WorkingGroup)

request.add_action_menu_entry(
translate(_('Delete Working Group')),
request.route_url('delete_working_group', id=context.id)
)

add_meeting_link = request.route_url('add_meeting', id=context.id)
leader = Markup( # noqa: MS001
'<a href="{}" class="mb-1">{}</a>'.format(
Expand Down
4 changes: 4 additions & 0 deletions src/privatim/views/templates/working_group.pt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
<tal:block i18n:translate="">Working Group</tal:block> ${title}</h1>
</div>

<!-- Dropdown button with common actions -->
<div class="col-md-6 text-end">
${panel('action_menu')}
</div>

<!--? Display basic info about the group. -->
<div class="text-start resource-collection">
Expand Down
51 changes: 43 additions & 8 deletions src/privatim/views/working_groups.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
from pyramid.httpexceptions import HTTPFound

from privatim.forms.working_group_forms import WorkingGroupForm
from sqlalchemy import select
from privatim.models import WorkingGroup, User
from privatim.i18n import _
from sqlalchemy import select, exists
from privatim.models import WorkingGroup, User, Meeting
from privatim.i18n import _, translate

from typing import TYPE_CHECKING

if TYPE_CHECKING:
from pyramid.interfaces import IRequest
from privatim.types import RenderData, RenderDataOrRedirect
from privatim.types import RenderData, RenderDataOrRedirect, \
XHRDataOrRedirect


def working_groups_view(request: 'IRequest') -> 'RenderData':
Expand All @@ -19,7 +20,7 @@ def working_groups_view(request: 'IRequest') -> 'RenderData':
return {'working_groups': working_groups}


def add_or_edit_group_view(
def add_or_edit_working_group(

context: WorkingGroup | None, request: 'IRequest'
) -> 'RenderDataOrRedirect':
Expand All @@ -38,10 +39,7 @@ def add_or_edit_group_view(
leader_id = form.leader.data
leader_id = None if leader_id == '0' else leader_id

# Use .raw_data to capture all selected values because
# .data returns only the first value (?)
stmt = select(User).where(User.id.in_(form.members.raw_data))

users = session.execute(stmt).scalars().all()
group = WorkingGroup(
name=form.name.data or '',
Expand Down Expand Up @@ -71,3 +69,40 @@ def add_or_edit_group_view(
'target_url': target_url,
'title': _('Add Working Group')
}


def delete_working_group_view(
context: WorkingGroup, request: 'IRequest'
) -> 'XHRDataOrRedirect':
assert isinstance(context, WorkingGroup)
deleted_working_group_name = context.name

session = request.dbsession
meetings_exist_stmt = select(
exists().where(Meeting.working_group_id == context.id)
)
meetings_exist = session.execute(meetings_exist_stmt).scalar()

if meetings_exist:
warning_message = _(
'Cannot delete working group "${name}" because it has associated '
'meetings. Please delete all meetings first.',
mapping={'name': deleted_working_group_name},
)

if request.is_xhr:
return {'error': translate(warning_message, request.locale_name)}
request.messages.add(warning_message, 'warning')
return HTTPFound(location=request.route_url('working_groups'))

session.delete(context)
session.flush()
success_message = _(
'Successfully deleted working group "${name}"',
mapping={'name': deleted_working_group_name},
)

if request.is_xhr:
return {'success': translate(success_message, request.locale_name)}
request.messages.add(success_message, 'success')
return HTTPFound(location=request.route_url('working_groups'))
71 changes: 71 additions & 0 deletions tests/views/client/test_views_working_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,74 @@ def test_view_add_working_group_with_meeting(client):

page = client.get(f'/meetings/{meeting.id}/delete').follow()
assert 'erfolgreich gelöscht' in page


def test_view_delete_working_group_with_meetings(client):
users = [
User(
email='[email protected]',
first_name='Max',
last_name='Müller',
),
User(
email='[email protected]',
first_name='Alexa',
last_name='Troller',
),
User(
email='[email protected]',
first_name='Kurt',
last_name='Huber',
),
]
for user in users:
user.set_password('test')
client.db.add(user)
client.db.flush()
client.login_admin()

page = client.get('/working_groups/add')
assert page.status_code == 200

page.form['name'] = 'Test Group'
page.form['leader'].select(text='Alexa Troller')
page.form['members'].select_multiple(texts=['Kurt Huber', 'Max Müller'])
page = page.form.submit().follow()

assert page.status_code == 200
assert 'Test Group' in page

stmt = select(WorkingGroup).where(WorkingGroup.name == 'Test Group')
group = client.db.execute(stmt).scalars().first()
assert group.leader.fullname == 'Alexa Troller'

page = client.get(f'/working_groups/{group.id}/add')
page.form['name'] = 'Weekly Meeting'
page.form['time'] = datetime.now().strftime('%Y-%m-%dT%H:%M')
page.form['attendees'].select_multiple(texts=['Kurt Huber', 'Max Müller'])
page = page.form.submit().follow()

assert 'Weekly Meeting' in page

stmt = select(Meeting).where(Meeting.working_group_id == group.id)
meeting = client.db.execute(stmt).scalars().first()
assert meeting.name == 'Weekly Meeting'

# Attempt to delete the working group
page = client.get(f'/working_groups/{group.id}/delete').follow()
assert (
'kann nicht gelöscht werden' in page
)

# Delete the meeting
page = client.get(f'/meetings/{meeting.id}/delete').follow()
assert 'erfolgreich gelöscht' in page

# Attempt to delete the working group again
page = client.get(f'/working_groups/{group.id}/delete').follow()
assert 'erfolgreich gelöscht' in page

# Verify the working group is deleted
stmt = select(WorkingGroup).where(WorkingGroup.name == 'Test Group')
group = client.db.execute(stmt).scalars().first()
assert group is None

0 comments on commit f965c88

Please sign in to comment.