def __init__(self): from eureka.domain.repositories import (CommentRepository, IdeaRepository, UserRepository, VoteIdeaRepository) self.user_repository = UserRepository() self.idea_repository = IdeaRepository() self.vote_idea_repository = VoteIdeaRepository() self.comment_repository = CommentRepository()
def __init__(self): from eureka.domain.repositories import ( CommentRepository, IdeaRepository, UserRepository, VoteIdeaRepository ) self.user_repository = UserRepository() self.idea_repository = IdeaRepository() self.vote_idea_repository = VoteIdeaRepository() self.comment_repository = CommentRepository()
class StatisticsService(Unpicklable): """ Service that compute statistics """ def __init__(self): from eureka.domain.repositories import (CommentRepository, IdeaRepository, UserRepository, VoteIdeaRepository) self.user_repository = UserRepository() self.idea_repository = IdeaRepository() self.vote_idea_repository = VoteIdeaRepository() self.comment_repository = CommentRepository() @cached def _active_users(self): # Users enabled and who have logged in at least once return set(self.user_repository.get_active()) @cached def _votes(self): return set(self.vote_idea_repository.get_all()) @cached def _votes_by_challenge(self): votes_by_challenge = collections.defaultdict(set) for k, v in itertools.groupby(self._votes(), lambda v: v.idea.challenge): votes_by_challenge[k].update(set(v)) return votes_by_challenge @cached def _comments(self): return set(self.comment_repository.get_all()) @cached def _comments_by_challenge(self): comments_by_challenge = collections.defaultdict(set) for k, v in itertools.groupby(self._comments(), lambda c: c.idea.challenge): comments_by_challenge[k].update(set(v)) return comments_by_challenge @cached def _ideas(self): return set(self.idea_repository.get_published_ideas()) @cached def _ideas_by_challenge(self): ideas_by_challenge = collections.defaultdict(set) for i in self._ideas(): ideas_by_challenge[i.challenge].add(i) return ideas_by_challenge def get_users_statistics_on_connections(self, users, after_date=None): intersection = users.intersection(self._active_users()) if after_date: return len([ u for u in intersection if u.last_connection_date > after_date ]) else: return len(intersection) def get_users_statistics_on_ideas(self, users, after_date=None, challenge=NO_FILTER): ideas = (self._ideas_by_challenge()[challenge] if challenge is not NO_FILTER else self._ideas()) ideas = set(i for i in ideas if not set(i.authors).isdisjoint(users)) if after_date: ideas = [ idea for idea in ideas if idea.wf_context.publication_date and idea.wf_context.publication_date > after_date ] unique_authors = set(author for idea in ideas for author in idea.authors if author in users) return len(ideas), len(unique_authors) def get_users_statistics_on_votes(self, users, after_date=None, challenge=NO_FILTER): votes = (self._votes_by_challenge()[challenge] if challenge is not NO_FILTER else self._votes()) votes = set(v for v in votes if v.user in users) if after_date: votes = set(v for v in votes if v.timestamp and v.timestamp > after_date) unique_voters = set(vote.user for vote in votes) return len(votes), len(unique_voters) def get_users_statistics_on_comments(self, users, after_date=None, challenge=NO_FILTER): comments = (self._comments_by_challenge()[challenge] if challenge is not NO_FILTER else self._comments()) if after_date: comments = set( c for c in comments if c.submission_date and c.submission_date > after_date) comments = set(c for c in comments if c.created_by in users) unique_commentators = set(comment.created_by for comment in comments) return len(comments), len(unique_commentators) def get_users_statistics(self, users, after_date=None, challenge=NO_FILTER): """ Compute various statistics for a given group of users, returns an instance of UsersStatistics """ users = set(users) # first connections nb_connected_users = self.get_users_statistics_on_connections( users, after_date) # ideas total_ideas, nb_authors = self.get_users_statistics_on_ideas( users, after_date, challenge) # votes total_votes, nb_voters = self.get_users_statistics_on_votes( users, after_date, challenge) # comments total_comments, nb_commentators = ( self.get_users_statistics_on_comments(users, after_date, challenge)) return UsersStatistics( nb_connected=nb_connected_users, total_ideas=total_ideas, nb_authors=nb_authors, total_votes=total_votes, nb_voters=nb_voters, total_comments=total_comments, nb_commentators=nb_commentators, ) def get_users_points_statistics(self, users): """Compute statistics on users points""" statistics = {} users_status_levels = [(user, user.status_level_label) for user in users if user] for user, level in users_status_levels: statistics.setdefault(level, []).append(user) return statistics
class StatisticsService(Unpicklable): """ Service that compute statistics """ def __init__(self): from eureka.domain.repositories import ( CommentRepository, IdeaRepository, UserRepository, VoteIdeaRepository ) self.user_repository = UserRepository() self.idea_repository = IdeaRepository() self.vote_idea_repository = VoteIdeaRepository() self.comment_repository = CommentRepository() @cached def _active_users(self): # Users enabled and who have logged in at least once return set(self.user_repository.get_active()) @cached def _votes(self): return set(self.vote_idea_repository.get_all()) @cached def _votes_by_challenge(self): votes_by_challenge = collections.defaultdict(set) for k, v in itertools.groupby( self._votes(), lambda v: v.idea.challenge): votes_by_challenge[k].update(set(v)) return votes_by_challenge @cached def _comments(self): return set(self.comment_repository.get_all()) @cached def _comments_by_challenge(self): comments_by_challenge = collections.defaultdict(set) for k, v in itertools.groupby( self._comments(), lambda c: c.idea.challenge): comments_by_challenge[k].update(set(v)) return comments_by_challenge @cached def _ideas(self): return set(self.idea_repository.get_published_ideas()) @cached def _ideas_by_challenge(self): ideas_by_challenge = collections.defaultdict(set) for i in self._ideas(): ideas_by_challenge[i.challenge].add(i) return ideas_by_challenge def get_users_statistics_on_connections(self, users, after_date=None): intersection = users.intersection(self._active_users()) if after_date: return len([u for u in intersection if u.last_connection_date > after_date]) else: return len(intersection) def get_users_statistics_on_ideas(self, users, after_date=None, challenge=NO_FILTER): ideas = ( self._ideas_by_challenge()[challenge] if challenge is not NO_FILTER else self._ideas() ) ideas = set(i for i in ideas if not set(i.authors).isdisjoint(users)) if after_date: ideas = [ idea for idea in ideas if idea.wf_context.publication_date and idea.wf_context.publication_date > after_date ] unique_authors = set( author for idea in ideas for author in idea.authors if author in users ) return len(ideas), len(unique_authors) def get_users_statistics_on_votes(self, users, after_date=None, challenge=NO_FILTER): votes = ( self._votes_by_challenge()[challenge] if challenge is not NO_FILTER else self._votes() ) votes = set(v for v in votes if v.user in users) if after_date: votes = set( v for v in votes if v.timestamp and v.timestamp > after_date ) unique_voters = set(vote.user for vote in votes) return len(votes), len(unique_voters) def get_users_statistics_on_comments(self, users, after_date=None, challenge=NO_FILTER): comments = ( self._comments_by_challenge()[challenge] if challenge is not NO_FILTER else self._comments() ) if after_date: comments = set( c for c in comments if c.submission_date and c.submission_date > after_date ) comments = set(c for c in comments if c.created_by in users) unique_commentators = set(comment.created_by for comment in comments) return len(comments), len(unique_commentators) def get_users_statistics(self, users, after_date=None, challenge=NO_FILTER): """ Compute various statistics for a given group of users, returns an instance of UsersStatistics """ users = set(users) # first connections nb_connected_users = self.get_users_statistics_on_connections( users, after_date ) # ideas total_ideas, nb_authors = self.get_users_statistics_on_ideas( users, after_date, challenge ) # votes total_votes, nb_voters = self.get_users_statistics_on_votes( users, after_date, challenge ) # comments total_comments, nb_commentators = ( self.get_users_statistics_on_comments(users, after_date, challenge) ) return UsersStatistics( nb_connected=nb_connected_users, total_ideas=total_ideas, nb_authors=nb_authors, total_votes=total_votes, nb_voters=nb_voters, total_comments=total_comments, nb_commentators=nb_commentators, ) def get_users_points_statistics(self, users): """Compute statistics on users points""" statistics = {} users_status_levels = [ (user, user.status_level_label) for user in users if user ] for user, level in users_status_levels: statistics.setdefault(level, []).append(user) return statistics
def __init__(self): self.user_repository = UserRepository() self.idea_repository = IdeaRepository() self.vote_idea_repository = VoteIdeaRepository() self.comment_repository = CommentRepository()