def souvenez(user, when=None, ratelimit=True, check_duplicate=False):
"""
Save a Souvenir to the DB, rate-limited by default to once per hour.
Returns a string: "added", "rate-limited" or "duplicated".
"""
# user can be a User object or PK (for backfill script)
user_id = getattr(user, 'id', user)
username = getattr(user, 'username', user) # just for logging
if when is None:
when = timezone.now()
if ratelimit is True:
ratelimit = getattr(settings, 'SOUVENIRS_RATELIMIT_SECONDS', 3600)
if ratelimit:
name = getattr(settings, 'SOUVENIRS_CACHE_NAME', 'default')
prefix = getattr(settings, 'SOUVENIRS_CACHE_PREFIX', 'souvenir.')
key = '{}.{}'.format(prefix, user_id)
cache = caches[name]
value = cache.get(key)
if value and when < value + timedelta(seconds=ratelimit):
logger.debug("rate-limited %s (last seen %s)", username, value)
return 'rate-limited'
cache.set(key, when)
if check_duplicate:
if Souvenir.objects.filter(user_id=user_id, when=when).exists():
logger.debug("ignoring duplicate souvenir for %s (%s)", username, when)
return 'duplicated'
Souvenir(user_id=user_id, when=when).save()
logger.debug("saved souvenir for %s (%s)", username, when)
return 'added'
评论列表
文章目录