Example #1
0
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")
Example #2
0
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}")