첫번째 시리즈에서 2까지 적었으므로 이어서 3부터 쓰려고 한다.
일정한 스케줄에 따라서 보내야 하기 때문에 python django schedule이라는 검색어로 검색을 했고 django-apscheduler를 찾았다.
각종 블로그와 스택오버 플로우를 통해서 사용방법을 검색한 결과
pip install django-apscheduler
INSTALLED_APPS = (
"django_apscheduler",
)
ex:
APSCHEDULER_DATETIME_FORMAT = "N j, Y, f:s a"
APSCHEDULER_RUN_NOW_TIMEOUT = 25
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from django.conf import settings
from django_apscheduler.jobstores import register_events
from user.services.report_service import get_reported_user_over_condition_cnt
장황하게 설명한 것 치고는 코드는 간단하다.
def start():
scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE)
register_events(scheduler)
scheduler.add_job(
get_reported_user_over_condition,
trigger=CronTrigger(day_of_week="sun", hour="20", minute="06"),
max_instances=1,
name="check_reported_user",
)
scheduler.start()
백그라운드 스케쥴러를 등록해주고 start라는 함수로 감싼다. 그 안에 add_job함수로 내가 미리 만들어둔 함수, 트리거, 인스턴스를 몇개 정도 사용할건지를 입력해주면 된다.
마지막으로 저번 시리즈에서 만들었던 함수에 마지막 몇 줄의 로직을 추가해주면 신고 기능은 완성된다!
def get_reported_user_over_condition() -> None:
"""
condition 이상으로 신고된 유저를 찾고 그 유저의 active값을 변경하는 함수
"""
report_cnt_over_condition_reported_users = list(
ReportedUserModel.objects.select_related("user")
.annotate(reported_cnt=Count("report"))
.filter(reported_cnt__gte=REPORT_CONDITION_CNT)
)
for reported_user in report_cnt_over_condition_reported_users:
reported_user.user.is_active = False
reported_user.user.save()
ReportModel.objects.all().delete() 시켜준다.