メール処理履歴画面にフィードバック機能を追加

- 全メール(重要・通常問わず)に対してフィードバックボタンを追加
- PATCH /api/mail/emails/<pk>/feedback/ エンドポイントを追加(JWT認証)
- フィードバックモーダル: 重要/普通/今後通知しない/常に通知 の4択
- never_notify/always_notify 選択時はアドレス/ドメインの適用範囲を選択可能
- gmail_service アカウントのフィルタオプションを追加

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Akira
2026-02-24 13:52:21 +09:00
parent 757371cdc4
commit b19e08a8dd
3 changed files with 185 additions and 30 deletions

View File

@@ -230,6 +230,47 @@ class FeedbackView(APIView):
return Response({'status': 'ok'})
# ---------------------------------------------------------------------------
# 履歴画面からのフィードバック更新JWT認証
# ---------------------------------------------------------------------------
class MailEmailFeedbackView(APIView):
"""
PATCH /api/mail/emails/<pk>/feedback/ 履歴画面から直接フィードバックを更新JWT認証
"""
permission_classes = [IsAuthenticated]
def patch(self, request, pk):
mail_email = get_object_or_404(MailEmail, pk=pk)
feedback = request.data.get('feedback')
valid_feedbacks = ['important', 'not_important', 'never_notify', 'always_notify']
if feedback not in valid_feedbacks:
return Response(
{'error': f'feedback は {valid_feedbacks} のいずれかを指定してください'},
status=status.HTTP_400_BAD_REQUEST
)
mail_email.feedback = feedback
mail_email.feedback_at = timezone.now()
mail_email.save(update_fields=['feedback', 'feedback_at'])
if feedback in ('never_notify', 'always_notify'):
scope = request.data.get('scope')
if scope == 'address':
MailSender.objects.update_or_create(
email=mail_email.sender_email,
defaults={'domain': None, 'rule': feedback}
)
elif scope == 'domain':
MailSender.objects.update_or_create(
domain=mail_email.sender_domain,
defaults={'email': None, 'rule': feedback}
)
return Response({'status': 'ok', 'feedback': feedback})
# ---------------------------------------------------------------------------
# ルール管理JWT認証
# ---------------------------------------------------------------------------