Skip to content

Commit

Permalink
[#23] Existing users can use invitation link.
Browse files Browse the repository at this point in the history
  • Loading branch information
mdrie committed Aug 28, 2023
1 parent fc52b41 commit 7427e5f
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% autoescape off %}
Nutzer {{username}} ist eingeloggt und ist jetzt auch {{role}} von {{city}}.
{% endautoescape %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% autoescape off %}
Nutzer {{username}} ist eingeloggt aber inaktiv. Bitte einen neuen Nutzer anlegen.
{% endautoescape %}
28 changes: 27 additions & 1 deletion cpmonitor/tests/permissions_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
assertTemplateNotUsed,
assertContains,
assertNotContains,
assertRedirects,
)


Expand Down Expand Up @@ -708,7 +709,7 @@ def test_site_admin_should_not_be_allowed_to_change_task_of_other_city(
city_editor_key = "lypvs6fb6qxk8ylskkckwp3g3djilpsiiunm1fuz68rdwg1emuwhnsuxexpbgjel"


def test_city_editor_should_be_able_to_see_invitation_links(
def test_city_editor_should_not_be_able_to_see_invitation_links(
city_editor_client: Client,
):
response = city_editor_client.get("/admin/cpmonitor/city/1/change/")
Expand Down Expand Up @@ -860,3 +861,28 @@ def test_can_register_with_city_admin_registration_link(
assert not "city_admins" in adminform.readonly_fields
assertContains(response, city_admin_key)
assertContains(response, city_editor_key)


def test_city_editor_should_be_able_to_accept_invitation_link_for_city_admin(
city_editor_client: Client,
):
response = city_editor_client.get(
f"/invitations/accept-invite/{city_admin_key}", follow=True
)
assertTemplateUsed(response, "admin/index.html")
assertContains(
response,
"Nutzer heinz ist eingeloggt und ist jetzt auch Kommunen-Administrator von Beispielstadt",
)

response = city_editor_client.get("/admin/cpmonitor/city/1/change/")
assertTemplateUsed(response, "admin/change_form.html")

adminform = response.context["adminform"]
fields = _fields_from_form(adminform)
assert "draft_mode" in fields
assert "city_editors" in fields
assert "city_admins" in fields
assert not "draft_mode" in adminform.readonly_fields
assert not "city_editors" in adminform.readonly_fields
assert not "city_admins" in adminform.readonly_fields
30 changes: 30 additions & 0 deletions cpmonitor/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import uuid

from django.conf import settings
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.core.files.base import ContentFile
Expand All @@ -24,6 +25,7 @@
from martor.utils import LazyEncoder

from .models import (
AccessRight,
City,
ExecutionStatus,
Task,
Expand Down Expand Up @@ -510,6 +512,34 @@ def post(self, *args, **kwargs):
invitation.accepted = False
invitation.save()

user: auth.models.User = self.request.user
if user.is_authenticated:
if user.is_active and user.is_staff:
get_invitations_adapter().add_message(
self.request,
messages.SUCCESS,
"invitations/messages/invite_for_logged_in_user.txt",
{
"role": invitation.get_access_right_display(),
"city": invitation.city.name,
"username": user.username,
},
)
city: City = invitation.city
if invitation.access_right == AccessRight.CITY_EDITOR:
city.city_editors.add(user.pk)
elif invitation.access_right == AccessRight.CITY_ADMIN:
city.city_admins.add(user.pk)
return redirect(invitations_settings.LOGIN_REDIRECT)
else:
get_invitations_adapter().add_message(
self.request,
messages.ERROR,
"invitations/messages/invite_for_logged_in_user_invalid.txt",
{"role": str(invitation), "username": user.username},
)
auth.logout(self.request)

# Difference: Saving key and not email.
self.request.session["invitation_key"] = invitation.key

Expand Down

0 comments on commit 7427e5f

Please sign in to comment.