def get_user_stats(self, users, lang=None, concepts=None, since=None, recalculate=True):
        only_one_user = False
        if not isinstance(users, list):
            users = [users]
            only_one_user = True
        if recalculate:
            if lang is None:
                raise ValueError('Recalculation without lang is not supported.')
            time_start = time_lib()
            concepts_to_recalculate = Concept.objects.get_concepts_to_recalculate(users, lang, concepts)
            LOGGER.debug("user_stats - getting identifying concepts to recalculate: %ss", (time_lib() - time_start))
            time_start = time_lib()
            self.recalculate_concepts(concepts_to_recalculate, lang)
            LOGGER.debug("user_stats - recalculating concepts: %ss", (time_lib() - time_start))
        qs = self.prepare_related().filter(user__in=users, concept__active=True)
        if concepts is not None:
            qs = qs.filter(concept__in=concepts)
        if lang is not None:
            qs = qs.filter(concept__lang=lang)
        if since is not None:
            qs = qs.filter(time__gte=since)
        data = defaultdict(lambda: defaultdict(lambda: {}))
        for user_stat in qs:
            data[user_stat.user_id][user_stat.concept.identifier][user_stat.stat] = user_stat.value
        if only_one_user:
            return data[users[0].pk if type(users[0]) == User else users[0]]
        return data