def event_browser(request): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_events"): return redirect("manage") context = {} event_data = {} for event in Event.objects.all(): stats = Attendance.get_stats_for_event(event) start_dt = event.start_dt end_dt = event.end_dt event_data[start_dt.astimezone(timezone.get_default_timezone()).strftime("%Y-%m-%d %H:%M")] = { "title": "\n%s minutes\n%.2f %% attendance\n%s players" % ( event.duration_minutes, stats["average_attendance"] * 100.0, stats["player_count"]), "end_dt_string": end_dt.astimezone(timezone.get_default_timezone()).strftime("%Y-%m-%d %H:%M"), "css_class_name": event.event_type.css_class_name, } event_data = json.dumps(event_data) context["event_data"] = event_data context["groups"] = MemberGroup.objects.all() context["warning_count"] = MemberWarning.objects.filter(acknowledged=False).count() return render(request, 'cnto/event/browser.html', context)
def create_event_type(request): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_event_types"): return redirect("manage") return handle_event_type_change_view(request, edit_mode=False)
def create_member(request): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_members"): return redirect("manage") return handle_member_change_view(request)
def view_event(request, year_string, month_string, day_string): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_events"): return redirect("manage") selected_dt = timezone.make_aware( datetime(year=int(year_string), month=int(month_string), day=int(day_string)), timezone.get_default_timezone()) context = { "event": None, "event_types": EventType.objects.all().order_by("name"), "start_date_string": selected_dt.strftime("%Y-%m-%d"), "start_time_string": None, "end_time_string": None, } attendance_values = [] try: event = Event.objects.get(start_dt__year=selected_dt.year, start_dt__month=selected_dt.month, start_dt__day=selected_dt.day) attendances = Attendance.objects.filter(event=event, member__deleted=False) for attendance in attendances: attendance_values.append( (attendance.member.name, "%.2f" % (attendance.get_attendance_ratio() * 100.0, ), not attendance.was_adequate())) attendance_values.sort(key=lambda x: x[0]) context["start_date_string"] = event.start_dt.astimezone( timezone.get_default_timezone()).strftime("%Y-%m-%d") context["start_time_string"] = event.start_dt.astimezone( timezone.get_default_timezone()).strftime("%H:%M") context["end_time_string"] = event.end_dt.astimezone( timezone.get_default_timezone()).strftime("%H:%M") context["event"] = event except Event.DoesNotExist: pass context["attendance_values"] = attendance_values context["warning_count"] = MemberWarning.objects.filter( acknowledged=False).count() return render(request, 'cnto/event/edit.html', context)
def get_summary_data(request): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") first_event_dt = Event.objects.all().aggregate( Min('start_dt'))["start_dt__min"] last_event_dt = Event.objects.all().aggregate( Max('start_dt'))["start_dt__max"] first_event_sunday = first_event_dt while first_event_sunday.weekday() != 6: first_event_sunday = first_event_sunday - timedelta(days=1) week_start_dt = first_event_sunday week_end_dt = first_event_sunday + timedelta(days=7) event_data = [] while week_start_dt < last_event_dt: week_events = Event.objects.filter(start_dt__gte=week_start_dt, end_dt__lt=week_end_dt) week_event_count = len(week_events) total_attendances = 0 max_attendance = 0 for event in week_events: event_attendances = Attendance.objects.filter( event=event, member__deleted=False) event_attendance_count = len(event_attendances) total_attendances += event_attendance_count max_attendance = max(max_attendance, event_attendance_count) event_data.append({ "week_start_dt": week_start_dt.strftime("%Y-%m-%d"), "week_end_dt": week_end_dt.strftime("%Y-%m-%d"), "week_max": max_attendance, "week_avg": float(total_attendances) / week_event_count if week_event_count > 0 else 0 }) week_start_dt = week_end_dt week_end_dt += timedelta(days=7) return JsonResponse({ "event-data": event_data, })
def edit_contribution(request, contribution_pk): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_contributions"): return redirect("manage") try: contribution = Contribution.objects.get(pk=contribution_pk) except Contribution.DoesNotExist: raise Http404() return handle_contribution_change_view(request, edit_mode=True, contribution=contribution)
def edit_event_type(request, pk): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_event_types"): return redirect("manage") try: event_type = EventType.objects.get(pk=pk) except MemberGroup.DoesNotExist: raise Http404() return handle_event_type_change_view(request, edit_mode=True, event_type=event_type)
def edit_group(request, pk): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_groups"): return redirect("manage") try: group = MemberGroup.objects.get(pk=pk) except MemberGroup.DoesNotExist: raise Http404() return handle_group_change_view(request, edit_mode=True, group=group)
def report_main(request): """Browse reports """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") context = { "warning_count": MemberWarning.objects.filter(acknowledged=False).count() } return render(request, 'cnto/report/report-main.html', context)
def download_report_for_month(request, dt_string, group_pk=None): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") group = MemberGroup.objects.get(pk=group_pk) dt = datetime.strptime(dt_string, "%Y-%m-%d") events = Event.objects.filter( start_dt__year=dt.year, start_dt__month=dt.month).order_by("start_dt") members = Member.objects.filter(member_group=group).order_by("name") filename = "%s-%s.csv" % (dt.strftime("%Y-%m"), group.name.lower()) # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="%s"' % ( filename, ) writer = csv.writer(response) header_columns = ["Member"] for event in events: header_columns.append(event.start_dt.strftime("%Y-%m-%d")) writer.writerow(header_columns) for member in members: member_columns = [member.name] for event in events: was_adequate = False try: attendance = Attendance.objects.get(member=member, event=event) was_adequate = attendance.was_adequate() except Attendance.DoesNotExist: pass if was_adequate: member_columns.append("X") else: member_columns.append(" ") writer.writerow(member_columns) writer.writerow([]) writer.writerow(["X = attended"]) return response
def delete_event(request, event_pk): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_events"): return redirect("manage") try: event = Event.objects.get(pk=event_pk) event.delete() return JsonResponse({"success": True}) except Event.DoesNotExist: return JsonResponse({"success": False})
def delete_contribution(request, contribution_pk): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_contributions"): return redirect("manage") try: contribution = Contribution.objects.get(pk=contribution_pk) contribution.delete() return JsonResponse({"success": True}) except Contribution.DoesNotExist: return JsonResponse({"success": False})
def delete_group(request, pk): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_groups"): return redirect("manage") try: group = MemberGroup.objects.get(pk=pk) group.delete() return JsonResponse({"success": True}) except MemberGroup.DoesNotExist: return JsonResponse({"success": False})
def edit_discharged_member(request, pk): """View Member """ if not request.user.is_authenticated(): return redirect("login") try: member = Member.objects.get(pk=pk) except Member.DoesNotExist: raise Http404() if not has_permission(request.user, "cnto_edit_members"): if RECRUIT_RANK not in member.rank.name.lower(): return redirect("manage") return handle_discharged_member_change_view(request, member=member)
def download_report_for_month(request, dt_string, group_pk=None): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") group = MemberGroup.objects.get(pk=group_pk) dt = datetime.strptime(dt_string, "%Y-%m-%d") events = Event.objects.filter(start_dt__year=dt.year, start_dt__month=dt.month).order_by("start_dt") members = Member.objects.filter(member_group=group).order_by("name") filename = "%s-%s.csv" % (dt.strftime("%Y-%m"), group.name.lower()) # Create the HttpResponse object with the appropriate CSV header. response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="%s"' % (filename,) writer = csv.writer(response) header_columns = ["Member"] for event in events: header_columns.append(event.start_dt.strftime("%Y-%m-%d")) writer.writerow(header_columns) for member in members: member_columns = [member.name] for event in events: was_adequate = False try: attendance = Attendance.objects.get(member=member, event=event) was_adequate = attendance.was_adequate() except Attendance.DoesNotExist: pass if was_adequate: member_columns.append("X") else: member_columns.append(" ") writer.writerow(member_columns) writer.writerow([]) writer.writerow(["X = attended"]) return response
def view_event(request, year_string, month_string, day_string): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_events"): return redirect("manage") selected_dt = timezone.make_aware(datetime(year=int(year_string), month=int(month_string), day=int(day_string)), timezone.get_default_timezone()) context = { "event": None, "event_types": EventType.objects.all().order_by("name"), "start_date_string": selected_dt.strftime("%Y-%m-%d"), "start_time_string": None, "end_time_string": None, } attendance_values = [] try: event = Event.objects.get(start_dt__year=selected_dt.year, start_dt__month=selected_dt.month, start_dt__day=selected_dt.day) attendances = Attendance.objects.filter(event=event, member__deleted=False) for attendance in attendances: attendance_values.append( (attendance.member.name, "%.2f" % (attendance.get_attendance_ratio() * 100.0,), not attendance.was_adequate())) attendance_values.sort(key=lambda x: x[0]) context["start_date_string"] = event.start_dt.astimezone(timezone.get_default_timezone()).strftime("%Y-%m-%d") context["start_time_string"] = event.start_dt.astimezone(timezone.get_default_timezone()).strftime("%H:%M") context["end_time_string"] = event.end_dt.astimezone(timezone.get_default_timezone()).strftime("%H:%M") context["event"] = event except Event.DoesNotExist: pass context["attendance_values"] = attendance_values context["warning_count"] = MemberWarning.objects.filter(acknowledged=False).count() return render(request, 'cnto/event/edit-scrape.html', context)
def get_report_body_for_month(request, month_string): """Get reports """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") month_dt = datetime.strptime(month_string, "%Y-%m") context = get_report_context_for_date_range( timezone.make_aware(datetime(month_dt.year, month_dt.month, 1, 0, 0), timezone.get_default_timezone()), timezone.make_aware(datetime(month_dt.year, month_dt.month, calendar.monthrange(month_dt.year, month_dt.month)[1], 23, 59), timezone.get_default_timezone())) return JsonResponse(context)
def list_warnings(request): """Browse reports """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") context = { "warnings": MemberWarning.objects.filter(acknowledged=False).select_related( 'member', 'member__member_group', ), "warning_count": MemberWarning.objects.filter(acknowledged=False).count() } return render(request, 'cnto_warnings/list.html', context)
def get_summary_data(request): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") first_event_dt = Event.objects.all().aggregate(Min('start_dt'))["start_dt__min"] last_event_dt = Event.objects.all().aggregate(Max('start_dt'))["start_dt__max"] first_event_sunday = first_event_dt while first_event_sunday.weekday() != 6: first_event_sunday = first_event_sunday - timedelta(days=1) week_start_dt = first_event_sunday week_end_dt = first_event_sunday + timedelta(days=7) event_data = [] while week_start_dt < last_event_dt: week_events = Event.objects.filter(start_dt__gte=week_start_dt, end_dt__lt=week_end_dt) week_event_count = len(week_events) total_attendances = 0 max_attendance = 0 for event in week_events: event_attendances = Attendance.objects.filter(event=event, member__deleted=False) event_attendance_count = len(event_attendances) total_attendances += event_attendance_count max_attendance = max(max_attendance, event_attendance_count) event_data.append({ "week_start_dt": week_start_dt.strftime("%Y-%m-%d"), "week_end_dt": week_end_dt.strftime("%Y-%m-%d"), "week_max": max_attendance, "week_avg": float(total_attendances) / week_event_count if week_event_count > 0 else 0 }) week_start_dt = week_end_dt week_end_dt += timedelta(days=7) return JsonResponse({ "event-data": event_data, })
def delete_member(request, member_pk): """Delete Member """ if not request.user.is_authenticated(): return redirect("login") try: member = Member.objects.get(pk=member_pk) if not has_permission(request.user, "cnto_edit_members"): if RECRUIT_RANK not in member.rank.name.lower(): return redirect("manage") member.deleted = True member.save() except Member.DoesNotExist: return JsonResponse({"success": False}) return JsonResponse({"success": True})
def get_report_body_for_month(request, month_string): """Get reports """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") month_dt = datetime.strptime(month_string, "%Y-%m") context = get_report_context_for_date_range( timezone.make_aware(datetime(month_dt.year, month_dt.month, 1, 0, 0), timezone.get_default_timezone()), timezone.make_aware( datetime(month_dt.year, month_dt.month, calendar.monthrange(month_dt.year, month_dt.month)[1], 23, 59), timezone.get_default_timezone())) return JsonResponse(context)
def save_event(request, event_type_name, dt_string, start_hour, end_hour): """Return the daily process main overview page. """ try: if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_events"): return redirect("manage") event_type = EventType.objects.get(name__iexact=event_type_name) dt = datetime.strptime(dt_string, "%Y-%m-%d") start_dt = timezone.make_aware(datetime(dt.year, dt.month, dt.day, int(start_hour), 00, 00), timezone.get_default_timezone()) pytz.timezone("Europe/Stockholm") if int(end_hour) >= 24: end_dt = timezone.make_aware(datetime(dt.year, dt.month, dt.day, 0, 0, 0), timezone.get_default_timezone()) end_dt += timedelta(days=1, hours=int(end_hour) - 24) else: end_dt = timezone.make_aware(datetime(dt.year, dt.month, dt.day, int(end_hour), 00, 00), timezone.get_default_timezone()) if end_dt < start_dt: end_dt += timedelta(hours=240) event = Event.objects.get(start_dt__year=start_dt.year, start_dt__month=start_dt.month, start_dt__day=start_dt.day) event.start_dt = start_dt event.end_dt = end_dt event.event_type = event_type event.duration_minutes = (end_dt - start_dt).total_seconds() / 60 event.save() except Exception: return JsonResponse({"success": False, "error": traceback.format_exc()}) return JsonResponse({"success": True, "error": None})
def edit_for_member(request, member_pk): """View Member """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_contributions"): return redirect("manage") try: member = Member.objects.get(pk=member_pk) except Member.DoesNotExist: raise Http404() context = { "member": member, "contributions": sorted(Contribution.objects.filter(member=member), key=lambda x: x.end_date, reverse=True), } return render(request, 'cnto_contributions/list-for-member.html', context)
def list_warnings_for_member(request, member_pk): """Browse reports """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_reports"): return redirect("manage") try: member = Member.objects.get(pk=member_pk) except Member.DoesNotExist: raise Http404() context = { "member": member, "warnings": MemberWarning.objects.filter(member=member) } return render(request, 'cnto_warnings/list-for-member.html', context)
def event_browser(request): """Return the daily process main overview page. """ if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_view_events"): return redirect("manage") context = {} event_data = {} for event in Event.objects.all().select_related( 'event_type', ).prefetch_related( models.Prefetch('attendees', queryset=Attendance.objects.all()), ): stats = event.get_stats() start_dt = event.start_dt end_dt = event.end_dt event_data[start_dt.astimezone( timezone.get_default_timezone()).strftime("%Y-%m-%d %H:%M")] = { "title": "\n%s minutes\n%.2f %% attendance\n%s players" % (event.duration_minutes, stats["average_attendance"] * 100.0, stats["player_count"]), "end_dt_string": end_dt.astimezone(timezone.get_default_timezone()).strftime( "%Y-%m-%d %H:%M"), "css_class_name": event.event_type.css_class_name, } event_data = json.dumps(event_data) context["event_data"] = event_data context["groups"] = MemberGroup.objects.all() context["warning_count"] = MemberWarning.objects.filter( acknowledged=False).count() return render(request, 'cnto/event/browser.html', context)
def handle_event_type_change_view(request, edit_mode, event_type=None): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_event_types"): return redirect("manage") if request.POST: form = EventTypeForm(request.POST, instance=event_type) if request.POST.get("cancel"): return redirect('manage') elif form.is_valid(): form.save() return redirect('manage') else: form = EventTypeForm(instance=event_type) context = {} context.update(csrf(request)) context['form'] = form context["edit_mode"] = edit_mode return render_to_response('cnto/event/edit-type.html', context)
def toggle_member_acknowledge(request, pk): """Browse reports """ success = True if not request.user.is_authenticated(): success = False elif not has_permission(request.user, "cnto_view_reports"): success = False else: try: warning = MemberWarning.objects.get(pk=pk) if warning.acknowledged: warning.acknowledged = False else: warning.acknowledged = True warning.save() except MemberWarning.DoesNotExist: success = False return JsonResponse({ "success": success })
def handle_group_change_view(request, edit_mode, group=None): if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_groups"): return redirect("manage") if request.POST: form = MemberGroupForm(request.POST, instance=group) if request.POST.get("cancel"): return redirect('manage') elif form.is_valid(): form.save() return redirect('manage') else: form = MemberGroupForm(instance=group) context = {} context.update(csrf(request)) context['form'] = form context["edit_mode"] = edit_mode return render_to_response('cnto/group/edit.html', context)
def save_event(request, event_type_name, dt_string, start_time_string, end_time_string): """Return the daily process main overview page. """ try: if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_events"): return redirect("manage") event_type = EventType.objects.get(name__iexact=event_type_name) start_dt = calculate_dt_from_strings(dt_string, start_time_string) end_dt = calculate_dt_from_strings(dt_string, end_time_string) if end_dt < start_dt: end_dt += timedelta(hours=24) event = Event.objects.get(start_dt__year=start_dt.year, start_dt__month=start_dt.month, start_dt__day=start_dt.day) event.start_dt = start_dt event.end_dt = end_dt event.event_type = event_type event.duration_minutes = (end_dt - start_dt).total_seconds() / 60 event.save() except Exception: return JsonResponse({ "success": False, "error": traceback.format_exc() }) return JsonResponse({"success": True, "error": None})
def scrape(request, event_type_name, dt_string, start_hour, end_hour): """Return the daily process main overview page. """ try: if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_events"): return redirect("manage") event_type = EventType.objects.get(name__iexact=event_type_name) dt = datetime.strptime(dt_string, "%Y-%m-%d") start_dt = timezone.make_aware( datetime(dt.year, dt.month, dt.day, int(start_hour), 00, 00), timezone.get_default_timezone() ) pytz.timezone("Europe/Stockholm") if int(end_hour) >= 24: end_dt = timezone.make_aware(datetime(dt.year, dt.month, dt.day, 0, 0, 0), timezone.get_default_timezone()) end_dt += timedelta(days=1, hours=int(end_hour) - 24) else: end_dt = timezone.make_aware( datetime(dt.year, dt.month, dt.day, int(end_hour), 00, 00), timezone.get_default_timezone() ) if end_dt < start_dt: end_dt += timedelta(hours=240) try: scrape_result, scrape_stats = get_all_event_attendances_between( start_dt.astimezone(pytz.utc), end_dt.astimezone(pytz.utc) ) except ValueError: traceback.print_exc() scrape_result = {} scrape_stats = {"average_attendance": 0, "minutes": 0, "success": True} # scrape_result = {u'Spartak [CNTO - Gnt]': 1.0, u'Chypsa [CNTO - Gnt]': 1.0, u'Guilly': 0.42857142857142855, # u'Hellfire [CNTO - SPC]': 1.0, u'Cody [CNTO - Gnt]': 1.0, # u'Ozzie [CNTO - SPC]': 0.7142857142857143, u'Skywalker': 0.6397515527950312, # u'Obi [CNTO - JrNCO]': 0.7142857142857143, u'Zero': 1.0, # u'Chris [CNTO - SPC]': 0.14285714285714285, u'Hateborder [CNTO - Gnt]': 1.0, # u'Dusky [CNTO - Gnt]': 0.7142857142857143} # scrape_stats = {'average_attendance': 0.7795031055900622, 'minutes': 56.0} try: event = Event.objects.get( start_dt__year=start_dt.year, start_dt__month=start_dt.month, start_dt__day=start_dt.day ) event.start_dt = start_dt event.end_dt = end_dt event.event_type = event_type event.duration_minutes = scrape_stats["minutes"] event.save() except Event.DoesNotExist: event = Event( start_dt=start_dt, end_dt=end_dt, duration_minutes=scrape_stats["minutes"], event_type=event_type ) event.save() previous_attendances = Attendance.objects.filter(event=event) previous_attendances.delete() for raw_username in scrape_result: username_parts = raw_username.split(" ") username = username_parts[0] if len(username) == 0: continue rank_str = RECRUIT_RANK if len(username_parts) > 3: rank_str = username_parts[3][0:-1] attendance_value = scrape_result[raw_username] try: rank = Rank.objects.get(name__iexact=rank_str) except Rank.DoesNotExist: rank = Rank(name=rank_str) rank.save() try: member = Member.objects.get(name__iexact=username, discharged=False, deleted=False) except Member.DoesNotExist: member = Member(name=username, rank=rank) member.save() except MultipleObjectsReturned: raise ValueError("Multiple users found with name %s!" % (username,)) attendance_seconds = (attendance_value * event.duration_minutes) * 60 try: attendance = Attendance.objects.get(event=event, member=member) attendance.attendance_seconds = attendance_seconds attendance.save() except Attendance.DoesNotExist: attendance = Attendance(event=event, member=member, attendance_seconds=attendance_seconds) attendance.save() return JsonResponse({"attendance": scrape_result, "stats": scrape_stats, "success": True}) except Exception, e: return JsonResponse({"success": False, "error": traceback.format_exc()})
def management(request): """List members """ if not request.user.is_authenticated(): return redirect("login") if not has_permission(request.user, "cnto_edit_members") and not has_permission(request.user, "cnto_view_absentees"): return redirect("report-main") recruits = Member.recruits().order_by('name').select_related( 'rank', 'member_group', ).prefetch_related( models.Prefetch('attendances', queryset=Attendance.objects.all().select_related( 'event', 'event__event_type', )), models.Prefetch('notes', queryset=Note.objects.order_by('-id')), ) discharges = Member.objects.all().filter(discharged=True, deleted=False).order_by('name').select_related( 'rank', 'member_group', ).prefetch_related( models.Prefetch('notes', queryset=Note.objects.order_by('-id')), ) members = [] if has_permission(request.user, "cnto_edit_members"): members = Member.active_members().order_by('name').select_related( 'rank', 'member_group', ).prefetch_related( models.Prefetch('notes', queryset=Note.objects.order_by('-id')), ) absentees = [] if has_permission(request.user, "cnto_view_absentees"): absentees = Absence.objects.all().filter( member__discharged=False, concluded=False, deleted=False, ).order_by('end_date').select_related( 'absence_type', 'member', 'member__member_group', ) groups = [] if has_permission(request.user, "cnto_edit_groups"): groups = MemberGroup.objects.all().order_by('name') event_types = [] if has_permission(request.user, "cnto_edit_event_types"): event_types = EventType.objects.all().order_by('name') active_contributions = [] if has_permission(request.user, "cnto_edit_contributions"): active_contributions = Contribution.objects.filter( end_date__gte=timezone.now().date(), ).order_by('end_date').select_related( 'type', 'member', ) context = { "members": members, "recruits": recruits, "current_absences": absentees, "discharges": discharges, "groups": groups, "active_contributions": active_contributions, "event_types": event_types, "warning_count": MemberWarning.objects.filter(acknowledged=False).count() } return render(request, 'cnto/manage/main.html', context)
def scrape(request, event_type_name, dt_string, start_time_string, end_time_string): """Return the daily process main overview page. """ try: if not request.user.is_authenticated(): return redirect("login") elif not has_permission(request.user, "cnto_edit_events"): return redirect("manage") event_type = EventType.objects.get(name__iexact=event_type_name) start_dt = calculate_dt_from_strings(dt_string, start_time_string) end_dt = calculate_dt_from_strings(dt_string, end_time_string) if end_dt < start_dt: end_dt += timedelta(hours=24) try: scrape_result, scrape_stats = get_all_event_attendances_between( start_dt.astimezone(pytz.utc), end_dt.astimezone(pytz.utc)) except ValueError: traceback.print_exc() scrape_result = {} scrape_stats = { 'average_attendance': 0, 'minutes': 0, "success": True } # scrape_result = {u'Spartak [CNTO - Gnt]': 1.0, u'Chypsa [CNTO - Gnt]': 1.0, u'Guilly': 0.42857142857142855, # u'Hellfire [CNTO - SPC]': 1.0, u'Cody [CNTO - Gnt]': 1.0, # u'Ozzie [CNTO - SPC]': 0.7142857142857143, u'Skywalker': 0.6397515527950312, # u'Obi [CNTO - JrNCO]': 0.7142857142857143, u'Zero': 1.0, # u'Chris [CNTO - SPC]': 0.14285714285714285, u'Hateborder [CNTO - Gnt]': 1.0, # u'Dusky [CNTO - Gnt]': 0.7142857142857143} # scrape_stats = {'average_attendance': 0.7795031055900622, 'minutes': 56.0} try: event = Event.objects.get(start_dt__year=start_dt.year, start_dt__month=start_dt.month, start_dt__day=start_dt.day) event.start_dt = start_dt event.end_dt = end_dt event.event_type = event_type event.duration_minutes = scrape_stats["minutes"] event.save() except Event.DoesNotExist: event = Event(start_dt=start_dt, end_dt=end_dt, duration_minutes=scrape_stats["minutes"], event_type=event_type) event.save() if len(scrape_result) > 0: # Only do something when data was collected. previous_attendances = Attendance.objects.filter(event=event) previous_attendances.delete() for raw_username in scrape_result: if len(raw_username.strip()) == 0: continue username = interpret_raw_username(raw_username) if len(username) == 0: continue attendance_value = scrape_result[raw_username] try: member = Member.objects.get(name__iexact=username, discharged=False, deleted=False) except Member.DoesNotExist: rank_str = RECRUIT_RANK try: rank = Rank.objects.get(name__iexact=rank_str) except Rank.DoesNotExist: rank = Rank(name=rank_str) rank.save() member = Member(name=username, rank=rank) member.save() except MultipleObjectsReturned: raise ValueError("Multiple users found with name %s!" % (username, )) attendance_seconds = (attendance_value * event.duration_minutes) * 60 try: attendance = Attendance.objects.get(event=event, member=member) attendance.attendance_seconds = attendance_seconds attendance.save() except Attendance.DoesNotExist: attendance = Attendance( event=event, member=member, attendance_seconds=attendance_seconds) attendance.save() return JsonResponse({ "attendance": scrape_result, "stats": scrape_stats, "success": True }) except Exception as e: return JsonResponse({ "success": False, "error": traceback.format_exc() })