From 7dddf45a04c411b49a08a17846ad606dfa3280c2 Mon Sep 17 00:00:00 2001 From: Klaas van Schelven Date: Tue, 4 Jun 2024 11:19:19 +0200 Subject: [PATCH] WIP teams & project-management (2) --- bugsink/urls.py | 6 +- teams/forms.py | 33 ++++++- .../0005_teammembership_send_email_alerts.py | 16 ++++ teams/models.py | 2 +- teams/tasks.py | 4 +- .../mails/team_membership_invite.html | 6 +- .../mails/team_membership_invite.txt | 2 +- .../team_membership_invite_new_user.html | 6 +- .../mails/team_membership_invite_new_user.txt | 2 +- teams/templates/teams/team_list.html | 24 +++-- .../templates/teams/team_member_settings.html | 77 +++++++++++++++ teams/templates/teams/team_members.html | 10 +- .../templates/teams/team_members_invite.html | 1 - teams/urls.py | 6 +- teams/views.py | 96 ++++++++++++++++++- theme/static/css/dist/styles.css | 2 +- 16 files changed, 257 insertions(+), 36 deletions(-) create mode 100644 teams/migrations/0005_teammembership_send_email_alerts.py create mode 100644 teams/templates/teams/team_member_settings.html diff --git a/bugsink/urls.py b/bugsink/urls.py index 29ac56c..3598757 100644 --- a/bugsink/urls.py +++ b/bugsink/urls.py @@ -6,6 +6,7 @@ from django.contrib.auth import views as auth_views from alerts.views import debug_email as debug_alerts_email from users.views import debug_email as debug_users_email +from teams.views import debug_email as debug_teams_email from bugsink.app_settings import get_settings from users.views import signup, confirm_email, resend_confirmation, request_reset_password, reset_password @@ -44,8 +45,9 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += [ - path('debug-alerts-email//', debug_alerts_email), - path('debug-users-email//', debug_users_email), + path('debug-alerts-email//', debug_alerts_email), + path('debug-users-email//', debug_users_email), + path('debug-teams-email//', debug_teams_email), path('trigger-error/', trigger_error), path("__debug__/", include("debug_toolbar.urls")), ] diff --git a/teams/forms.py b/teams/forms.py index 3ea09eb..8439c86 100644 --- a/teams/forms.py +++ b/teams/forms.py @@ -1,7 +1,8 @@ from django import forms from django.contrib.auth import get_user_model +from django.template.defaultfilters import yesno -from .models import TeamRole +from .models import TeamRole, TeamMembership User = get_user_model() @@ -24,3 +25,33 @@ class TeamMemberInviteForm(forms.Form): raise forms.ValidationError('No user with this email address in the system.') return email + + +class MyTeamMembershipForm(forms.ModelForm): + """Edit your TeamMembership, i.e. email-settings are OK, and role only for admins""" + + class Meta: + model = TeamMembership + fields = ["send_email_alerts", "role"] + + def __init__(self, *args, **kwargs): + edit_role = kwargs.pop("edit_role") + super().__init__(*args, **kwargs) + assert self.instance is not None, "This form is only implemented for editing" + + if not edit_role: + del self.fields['role'] + + # self.instance.user[.profile].send_email_alerts TODO implement + global_send_email_alerts = True + empty_label = "User-default (currently: %s)" % yesno(global_send_email_alerts) + self.fields['send_email_alerts'].empty_label = empty_label + self.fields['send_email_alerts'].widget.choices[0] = ("unknown", empty_label) + + +class TeamMembershipForm(forms.ModelForm): + """Edit TeamMembership for not-you, i.e. set a role but not email-settings""" + + class Meta: + model = TeamMembership + fields = ["role"] diff --git a/teams/migrations/0005_teammembership_send_email_alerts.py b/teams/migrations/0005_teammembership_send_email_alerts.py new file mode 100644 index 0000000..1e1441c --- /dev/null +++ b/teams/migrations/0005_teammembership_send_email_alerts.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('teams', '0004_teammembership_accepted'), + ] + + operations = [ + migrations.AddField( + model_name='teammembership', + name='send_email_alerts', + field=models.BooleanField(blank=True, default=True, null=True), + ), + ] diff --git a/teams/models.py b/teams/models.py index 460e588..6cf5b53 100644 --- a/teams/models.py +++ b/teams/models.py @@ -32,7 +32,7 @@ class TeamMembership(models.Model): team = models.ForeignKey(Team, on_delete=models.CASCADE) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) - # send_email_alerts = models.BooleanField(default=True) TODO (see also Project) + send_email_alerts = models.BooleanField(default=None, null=True, blank=True) # TODO implement the associated logic role = models.IntegerField(choices=TeamRole.choices, default=TeamRole.MEMBER) accepted = models.BooleanField(default=False) diff --git a/teams/tasks.py b/teams/tasks.py index 0c79825..59e8cdd 100644 --- a/teams/tasks.py +++ b/teams/tasks.py @@ -19,7 +19,7 @@ def send_team_invite_email_new_user(email, team_pk, token): context={ "site_title": get_settings().SITE_TITLE, "base_url": get_settings().BASE_URL + "/", - "team": team, + "team_name": team.name, "url": reverse("team_members_accept_new_user", kwargs={ "token": token, "team_pk": team_pk, @@ -39,7 +39,7 @@ def send_team_invite_email(email, team_pk): context={ "site_title": get_settings().SITE_TITLE, "base_url": get_settings().BASE_URL + "/", - "team": team, + "team_name": team.name, "url": reverse("team_members_accept", kwargs={ "team_pk": team_pk, }), diff --git a/teams/templates/mails/team_membership_invite.html b/teams/templates/mails/team_membership_invite.html index 508c279..75e9beb 100644 --- a/teams/templates/mails/team_membership_invite.html +++ b/teams/templates/mails/team_membership_invite.html @@ -454,7 +454,7 @@ - +