#169 Team delete-restore

* adds restorable delete functionality to Team model
* refactors minor code model parts by introducing DeletableObjectMixin
* only non-deleted Teams can be chosen for sharing
* deleted Teams can be restored using the proper function on the backend admin
* deleted Teams do not provide
* adds migration
This commit is contained in:
2022-05-30 15:38:16 +02:00
parent 8aa3fbd97a
commit e7031d0bc2
13 changed files with 111 additions and 35 deletions

View File

@@ -1,6 +1,7 @@
from django.contrib import admin
from user.models import UserNotification, UserActionLogEntry, User, Team
from konova.admin import DeletableObjectMixinAdmin
from user.models import User, Team
class UserNotificationAdmin(admin.ModelAdmin):
@@ -64,10 +65,11 @@ class UserActionLogEntryAdmin(admin.ModelAdmin):
]
class TeamAdmin(admin.ModelAdmin):
class TeamAdmin(DeletableObjectMixinAdmin, admin.ModelAdmin):
list_display = [
"name",
"description",
"deleted",
]
search_fields = [
"name",
@@ -78,6 +80,13 @@ class TeamAdmin(admin.ModelAdmin):
"admins",
]
readonly_fields = [
"deleted"
]
actions = [
"restore_deleted_data"
]
admin.site.register(User, UserAdmin)
admin.site.register(Team, TeamAdmin)

View File

@@ -230,8 +230,8 @@ class NewTeamModalForm(BaseModalForm):
team = Team.objects.create(
name=self.cleaned_data.get("name", None),
description=self.cleaned_data.get("description", None),
admins__in=[self.user],
)
team.admins.add(self.user)
members = self.cleaned_data.get("members", User.objects.none())
if self.user.id not in members:
members = members.union(
@@ -335,6 +335,10 @@ class RemoveTeamModalForm(RemoveModalForm):
super().__init__(*args, **kwargs)
self.form_caption = _("ATTENTION!\n\nRemoving the team means all members will lose their access to data, based on this team! \n\nAre you sure to remove this team?")
def save(self):
self.instance.mark_as_deleted(self.user)
return self.instance
class LeaveTeamModalForm(RemoveModalForm):
def __init__(self, *args, **kwargs):

View File

@@ -0,0 +1,19 @@
# Generated by Django 3.1.3 on 2022-05-30 12:42
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('user', '0004_auto_20220530_1105'),
]
operations = [
migrations.AddField(
model_name='team',
name='deleted',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='user.useractionlogentry'),
),
]

View File

@@ -1,10 +1,11 @@
from django.db import models
from konova.models import UuidModel
from konova.models import UuidModel, DeletableObjectMixin
from konova.utils.mailer import Mailer
from user.models import UserActionLogEntry
class Team(UuidModel):
class Team(UuidModel, DeletableObjectMixin):
""" Groups users in self managed teams. Can be used for multi-sharing of data
"""
@@ -16,6 +17,19 @@ class Team(UuidModel):
def __str__(self):
return self.name
def mark_as_deleted(self, user):
""" Creates an UserAction entry and stores it in the correct field
Args:
user (User): The performing user
Returns:
"""
delete_action = UserActionLogEntry.get_deleted_action(user, "Team deleted")
self.deleted = delete_action
self.save()
def send_mail_shared_access_given_team(self, obj_identifier, obj_title):
""" Sends a mail to the team members in case of given shared access

View File

@@ -160,3 +160,15 @@ class User(AbstractUser):
else:
token = self.api_token
return token
@property
def shared_teams(self):
""" Wrapper for fetching active teams of this user
Returns:
"""
shared_teams = self.teams.filter(
deleted__isnull=True
)
return shared_teams

View File

@@ -163,7 +163,7 @@ def index_team_view(request: HttpRequest):
template = "user/team/index.html"
user = request.user
context = {
"teams": user.teams.all(),
"teams": user.shared_teams,
"tab_title": _("Teams"),
}
context = BaseContext(request, context).context