def batch_create_awards(limit=100): from biostar.accounts.models import User from biostar.forum import auth, models, util # Randomly order awards users = User.objects.order_by('?')[:limit] # Aggregate target awards into flat list targets = [] for u in users: valid = auth.valid_awards(user=u) targets.extend(valid) def batch(): for target in targets: if not target: continue user, badge, date, post = target award = models.Award(user=user, badge=badge, date=date, post=post) logger.debug(f"awarded {award.badge.name} to {user}") yield award models.Award.objects.bulk_create(objs=batch(), batch_size=limit) logger.info(f"{len(targets)} awards given to {len(users)} users")
def create_user_awards(user_id, limit=None): from biostar.accounts.models import User from biostar.forum.models import Award, Badge, Post from biostar.forum.awards import ALL_AWARDS from biostar.forum import util, auth from django.conf import settings limit = limit or settings.MAX_AWARDS user = User.objects.filter(id=user_id).first() # debugging # Award.objects.all().delete() # Collect valid targets valid = auth.valid_awards(user=user) # Pick random awards to give to user random.shuffle(valid) valid = valid[:limit] for target in valid: user, badge, date, post = target # Set the award date to the post edit date date = post.lastedit_date if post else date # Create an award for each target. Award.objects.create(user=user, badge=badge, date=date, post=post) message(f"award {badge.name} created for {user.email}")