Commit 586d6e6a authored by BaiJiangJie's avatar BaiJiangJie

[Update] 添加用户过期邮件提醒

parent 9ab6c586
This diff is collapsed.
{% load i18n %} {% load i18n %}
{% block user_expired_message %}
{% if request.user.is_expired %}
<div class="alert alert-danger help-message alert-dismissable">
{% blocktrans %}
Your account has expired, please contact the administrator.
{% endblocktrans %}
<button aria-hidden="true" data-dismiss="alert" class="close" type="button" style="outline: none;">×</button>
</div>
{% elif request.user.will_expired %}
<div class="alert alert-danger help-message alert-dismissable">
{% trans 'Your account will at' %} {{ request.user.date_expired }} {% trans 'expired. ' %}
<button aria-hidden="true" data-dismiss="alert" class="close" type="button" style="outline: none;">×</button>
</div>
{% endif %}
{% endblock %}
{% block password_expired_message %} {% block password_expired_message %}
{% url 'users:user-password-update' as user_password_update_url %} {% url 'users:user-password-update' as user_password_update_url %}
{% if request.user.password_has_expired %} {% if request.user.password_has_expired %}
......
...@@ -402,6 +402,18 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser): ...@@ -402,6 +402,18 @@ class User(AuthMixin, TokenMixin, RoleMixin, MFAMixin, AbstractUser):
else: else:
return False return False
@property
def expired_remain_days(self):
date_remain = self.date_expired - timezone.now()
return date_remain.days
@property
def will_expired(self):
if 0 <= self.expired_remain_days < 5:
return True
else:
return False
@property @property
def is_valid(self): def is_valid(self):
if self.is_active and not self.is_expired: if self.is_active and not self.is_expired:
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# #
import datetime
from django.utils import timezone
from django.conf import settings
from celery import shared_task from celery import shared_task
from ops.celery.utils import create_or_update_celery_periodic_tasks from ops.celery.utils import create_or_update_celery_periodic_tasks
from ops.celery.decorator import after_app_ready_start, register_as_period_task from ops.celery.decorator import after_app_ready_start
from common.utils import get_logger from common.utils import get_logger
from .models import User from .models import User
from .utils import send_password_expiration_reminder_mail from .utils import (
send_password_expiration_reminder_mail, send_user_expiration_reminder_mail
)
logger = get_logger(__file__) logger = get_logger(__file__)
...@@ -43,4 +42,27 @@ def check_password_expired_periodic(): ...@@ -43,4 +42,27 @@ def check_password_expired_periodic():
create_or_update_celery_periodic_tasks(tasks) create_or_update_celery_periodic_tasks(tasks)
@shared_task
def check_user_expired():
users = User.objects.exclude(role=User.ROLE_APP)
for user in users:
if not user.is_valid:
continue
if not user.will_expired:
continue
send_user_expiration_reminder_mail(user)
@shared_task
@after_app_ready_start
def check_user_expired_periodic():
tasks = {
'check_user_expired_periodic': {
'task': check_user_expired.name,
'interval': None,
'crontab': '0 14 * * *',
'enabled': True,
}
}
create_or_update_celery_periodic_tasks(tasks)
...@@ -89,20 +89,20 @@ def send_reset_password_mail(user): ...@@ -89,20 +89,20 @@ def send_reset_password_mail(user):
recipient_list = [user.email] recipient_list = [user.email]
message = _(""" message = _("""
Hello %(name)s: Hello %(name)s:
</br> <br>
Please click the link below to reset your password, if not your request, concern your account security Please click the link below to reset your password, if not your request, concern your account security
</br> <br>
<a href="%(rest_password_url)s?token=%(rest_password_token)s">Click here reset password</a> <a href="%(rest_password_url)s?token=%(rest_password_token)s">Click here reset password</a>
</br> <br>
This link is valid for 1 hour. After it expires, <a href="%(forget_password_url)s?email=%(email)s">request new one</a> This link is valid for 1 hour. After it expires, <a href="%(forget_password_url)s?email=%(email)s">request new one</a>
</br> <br>
--- ---
</br> <br>
<a href="%(login_url)s">Login direct</a> <a href="%(login_url)s">Login direct</a>
</br> <br>
""") % { """) % {
'name': user.name, 'name': user.name,
'rest_password_url': reverse('users:reset-password', external=True), 'rest_password_url': reverse('users:reset-password', external=True),
...@@ -122,24 +122,24 @@ def send_password_expiration_reminder_mail(user): ...@@ -122,24 +122,24 @@ def send_password_expiration_reminder_mail(user):
recipient_list = [user.email] recipient_list = [user.email]
message = _(""" message = _("""
Hello %(name)s: Hello %(name)s:
</br> <br>
Your password will expire in %(date_password_expired)s, Your password will expire in %(date_password_expired)s,
</br> <br>
For your account security, please click on the link below to update your password in time For your account security, please click on the link below to update your password in time
</br> <br>
<a href="%(update_password_url)s">Click here update password</a> <a href="%(update_password_url)s">Click here update password</a>
</br> <br>
If your password has expired, please click If your password has expired, please click
<a href="%(forget_password_url)s?email=%(email)s">Password expired</a> <a href="%(forget_password_url)s?email=%(email)s">Password expired</a>
to apply for a password reset email. to apply for a password reset email.
</br> <br>
--- ---
</br> <br>
<a href="%(login_url)s">Login direct</a> <a href="%(login_url)s">Login direct</a>
</br> <br>
""") % { """) % {
'name': user.name, 'name': user.name,
'date_password_expired': datetime.fromtimestamp(datetime.timestamp( 'date_password_expired': datetime.fromtimestamp(datetime.timestamp(
...@@ -155,18 +155,39 @@ def send_password_expiration_reminder_mail(user): ...@@ -155,18 +155,39 @@ def send_password_expiration_reminder_mail(user):
send_mail_async.delay(subject, message, recipient_list, html_message=message) send_mail_async.delay(subject, message, recipient_list, html_message=message)
def send_user_expiration_reminder_mail(user):
subject = _('Expiration notice')
recipient_list = [user.email]
message = _("""
Hello %(name)s:
<br>
Your account will expire in %(date_expired)s,
<br>
In order not to affect your normal work, please contact the administrator for confirmation.
<br>
""") % {
'name': user.name,
'date_expired': datetime.fromtimestamp(datetime.timestamp(
user.date_expired)).strftime('%Y-%m-%d %H:%M'),
}
if settings.DEBUG:
logger.debug(message)
send_mail_async.delay(subject, message, recipient_list, html_message=message)
def send_reset_ssh_key_mail(user): def send_reset_ssh_key_mail(user):
subject = _('SSH Key Reset') subject = _('SSH Key Reset')
recipient_list = [user.email] recipient_list = [user.email]
message = _(""" message = _("""
Hello %(name)s: Hello %(name)s:
</br> <br>
Your ssh public key has been reset by site administrator. Your ssh public key has been reset by site administrator.
Please login and reset your ssh public key. Please login and reset your ssh public key.
</br> <br>
<a href="%(login_url)s">Login direct</a> <a href="%(login_url)s">Login direct</a>
</br> <br>
""") % { """) % {
'name': user.name, 'name': user.name,
'login_url': reverse('authentication:login', external=True), 'login_url': reverse('authentication:login', external=True),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment