def get_user_activity_report(request, ids, index, value, start_date, end_date, stats): """ CHW Group Total Activity Report - submissions per user over time ids: list of form id's index: title for the x-axis. something like, 'users', 'chws', etc. value: title for the y-axis. usually corresponds to the form name(s) start_date: start of reporting period end_date: end of reporting period stats: any requested stats. Returns a Report object populated with requested data. """ domain = request.user.selected_domain if not ids: raise Exception("The requested form was not found") _report = Report("CHW Group Total Activity Report") _report.generating_url = request.path metadata = Metadata.objects.filter(timestart__gte=start_date) # the query below is used if you want to query by submission time (instead of form completion time) #metadata = Metadata.objects.filter(attachment__submission__submit_time__gte=start_date) # since we are working at a granularity of 'days', we want to make sure include # complete days in our queries, so we round up timespan = get_timespan(start_date, end_date) delta = timedelta(days=timespan.days+1) metadata = metadata.filter(timeend__lt=start_date+delta) # the query below is used if you want to query by submission time (instead of form completion time) #metadata = metadata.filter(attachment__submission__submit_time__lte=end_date) dataset = DataSet( unicode(value[0]) + " per " + unicode(index) ) dataset.indices = unicode(index) dataset.params = request.GET # when 'organization' is properly populated, we can start using that # member_list = utils.get_members(organization) # for now, just use domain member_list = [r.chw_username for r in ReporterProfile.objects.filter(domain=domain).order_by("chw_username")] # get a sum of all forms visits_per_member = Values( "visits" ) for member in member_list: visits_per_member.append( (member, metadata.filter(username=member).count()) ) visits_per_member.run_stats(stats) visits_per_member.sort(key=operator.itemgetter(1), reverse=True) dataset.valuesets.append( visits_per_member ) # this report only requires the first form. you can imagine other reports doing # this iteration: for id in ids: form_per_member = Values( unicode(value[0]) ) form_metadata = metadata.filter(formdefmodel=ids[0]) for member in member_list: # values are tuples of dates and counts form_per_member.append( (member, form_metadata.filter(username=member).count()) ) form_per_member.run_stats(stats) form_per_member.sort(key=operator.itemgetter(1), reverse=True) dataset.valuesets.append( form_per_member ) _report.datasets.append(dataset) return _report
def get_daily_activity_values(name, form_list, chw, member_list, start_date, end_date, stats, domain): # get a sum of all the forms member_list = [r.chw_username for r in ReporterProfile.objects.filter(domain=domain)] if chw not in member_list: raise Exception("No matching CHW could be identified") username_counts = get_username_count(form_list, member_list, start_date, end_date) date = start_date day = timedelta(days=1) values_per_day = Values( name ) if chw in username_counts: for daily_count in username_counts[chw]: # values are tuples of dates and daily counts values_per_day.append( (date.strftime("%Y-%m-%d"), daily_count) ) date = date + day else: # should return a set of '0s' even when no forms submitted timespan = get_timespan(start_date, end_date) for i in range(0,timespan.days+1): values_per_day.append( (date.strftime("%Y-%m-%d"), 0) ) date = date + day values_per_day.run_stats(stats) return values_per_day