#146 Team leave
* adds button and functionality for leaving a team * if the admin leaves the team, another user will be chosen as new admin automatically * improves Team (django) admin backend * better control over user adding-removing * only added team members are selectable as admin
This commit is contained in:
@@ -74,6 +74,15 @@ class TeamAdmin(admin.ModelAdmin):
|
||||
"name",
|
||||
"description",
|
||||
]
|
||||
filter_horizontal = [
|
||||
"users"
|
||||
]
|
||||
|
||||
def formfield_for_foreignkey(self, db_field, request, **kwargs):
|
||||
if db_field.name == "admin":
|
||||
team_id = request.resolver_match.kwargs.get("object_id", None)
|
||||
kwargs["queryset"] = User.objects.filter(teams__id__in=[team_id])
|
||||
return super().formfield_for_foreignkey(db_field, request, **kwargs)
|
||||
|
||||
|
||||
admin.site.register(User, UserAdmin)
|
||||
|
||||
@@ -317,6 +317,15 @@ class RemoveTeamModalForm(RemoveModalForm):
|
||||
pass
|
||||
|
||||
|
||||
class LeaveTeamModalForm(RemoveModalForm):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.form_title = _("Leave team")
|
||||
|
||||
def save(self):
|
||||
self.instance.remove_user(self.user)
|
||||
|
||||
|
||||
class TeamDataForm(BaseModalForm):
|
||||
name = forms.CharField(
|
||||
label_suffix="",
|
||||
|
||||
@@ -93,3 +93,17 @@ class Team(UuidModel):
|
||||
"""
|
||||
mailer = Mailer()
|
||||
mailer.send_mail_shared_data_deleted_team(obj_identifier, obj_title, self)
|
||||
|
||||
def remove_user(self, user):
|
||||
""" Removes a user from the team
|
||||
|
||||
Args:
|
||||
user (User): The user to be removed
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
self.users.remove(user)
|
||||
if self.admin == user:
|
||||
self.admin = self.users.first()
|
||||
self.save()
|
||||
|
||||
@@ -46,6 +46,9 @@
|
||||
{% endfor %}
|
||||
</td>
|
||||
<td>
|
||||
<button class="btn rlp-r btn-modal" data-form-url="{% url 'user:team-leave' team.id %}" title="{% trans 'Leave team' %}">
|
||||
{% fa5_icon 'sign-out-alt' %}
|
||||
</button>
|
||||
{% if team.admin == user %}
|
||||
<button class="btn rlp-r btn-modal" data-form-url="{% url 'user:team-edit' team.id %}" title="{% trans 'Edit team' %}">
|
||||
{% fa5_icon 'edit' %}
|
||||
|
||||
@@ -20,5 +20,6 @@ urlpatterns = [
|
||||
path("team/<id>", data_team_view, name="team-data"),
|
||||
path("team/<id>/edit", edit_team_view, name="team-edit"),
|
||||
path("team/<id>/remove", remove_team_view, name="team-remove"),
|
||||
path("team/<id>/leave", leave_team_view, name="team-leave"),
|
||||
|
||||
]
|
||||
@@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy as _
|
||||
from konova.contexts import BaseContext
|
||||
from konova.decorators import any_group_check, default_group_required
|
||||
from user.forms import UserNotificationForm, UserContactForm, UserAPITokenForm, NewTeamModalForm, EditTeamModalForm, \
|
||||
RemoveTeamModalForm, TeamDataForm
|
||||
RemoveTeamModalForm, TeamDataForm, LeaveTeamModalForm
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -204,3 +204,24 @@ def remove_team_view(request: HttpRequest, id: str):
|
||||
_("Team removed"),
|
||||
redirect_url=reverse("user:team-index")
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
def leave_team_view(request: HttpRequest, id: str):
|
||||
team = get_object_or_404(Team, id=id)
|
||||
user = request.user
|
||||
|
||||
is_user_team_member = team.users.filter(id=user.id).exists()
|
||||
if not is_user_team_member:
|
||||
messages.info(
|
||||
request,
|
||||
_("You are not a member of this team")
|
||||
)
|
||||
return redirect("user:team-index")
|
||||
|
||||
form = LeaveTeamModalForm(request.POST or None, instance=team, request=request)
|
||||
return form.process_request(
|
||||
request,
|
||||
_("Left Team"),
|
||||
redirect_url=reverse("user:team-index")
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user