Mercurial > public > sg101
view accounts/stats.py @ 943:cf9918328c64
Haystack tweaks for Django 1.7.7.
I had to upgrade to Haystack 2.3.1 to get it to work with Django
1.7.7. I also had to update the Xapian backend. But I ran into
problems.
On my laptop anyway (Ubuntu 14.0.4), xapian gets mad when search terms
are greater than 245 chars (or something) when indexing. So I created
a custom field that would simply omit terms greater than 64 chars and
used this field everywhere I previously used a CharField.
Secondly, the custom search form was broken now. Something changed in
the Xapian backend and exact searches stopped working. Fortunately the
auto_query (which I was using originally and broke during an upgrade)
started working again. So I cut the search form back over to doing an
auto_query. I kept the form the same (3 fields) because I didn't want
to change the form and I think it's better that way.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Wed, 13 May 2015 20:25:07 -0500 |
parents | ee87ea74d46b |
children |
line wrap: on
line source
""" This module performs user account related statistics. """ import logging from django.db.models.signals import post_save from django.contrib.auth.models import User from core.services import get_redis_connection # Redis key names USER_COUNT_KEY = "accounts:user_count" NEW_USERS_KEY = "accounts:new_users" logger = logging.getLogger(__name__) def on_user_save(sender, **kwargs): """ This function is our signal handler for when a User object is saved. """ from accounts.tasks import user_stats_task if kwargs['created']: user = kwargs['instance'] # kick off a task to update user stats user_stats_task.delay(user.id) def update_user_stats(user_id): """ This function is given a new user id and is responsible for updating various user account statistics. """ try: user = User.objects.get(pk=user_id) except User.DoesNotExist: logger.warning("update_user_stats: user id %d doesn't exist", user_id) return redis = get_redis_connection() # update the count of registered users count = redis.incr(USER_COUNT_KEY) if count == 1: # it is likely redis got wiped out; update it now count = User.objects.all().count() redis.set(USER_COUNT_KEY, count) # update the list of new users pipeline = redis.pipeline() pipeline.lpush(NEW_USERS_KEY, user.username) pipeline.ltrim(NEW_USERS_KEY, 0, 9) pipeline.execute() def get_user_count(redis=None): """ This function returns the current count of users. """ if redis is None: redis = get_redis_connection() return redis.get(USER_COUNT_KEY) def get_new_users(redis=None): """ This function returns a list of new usernames. """ if redis is None: redis = get_redis_connection() return redis.lrange(NEW_USERS_KEY, 0, -1) def get_user_stats(redis=None): """ This function returns a tuple of the user stats. Element 0 is the user count and element 1 is the list of new users. """ if redis is None: redis = get_redis_connection() return get_user_count(redis), get_new_users(redis) post_save.connect(on_user_save, sender=User, dispatch_uid='accounts.stats')