Beispiel #1
0
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)
Beispiel #2
0
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)
Beispiel #3
0
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)
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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)
Beispiel #7
0
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,
    })
Beispiel #8
0
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)
Beispiel #9
0
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)
Beispiel #10
0
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)
Beispiel #11
0
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)
Beispiel #12
0
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
Beispiel #13
0
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})
Beispiel #14
0
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)
Beispiel #15
0
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})
Beispiel #16
0
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})
Beispiel #17
0
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})
Beispiel #18
0
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})
Beispiel #19
0
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)
Beispiel #20
0
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)
Beispiel #21
0
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)
Beispiel #22
0
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
Beispiel #23
0
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)
Beispiel #24
0
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)
Beispiel #25
0
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)
Beispiel #26
0
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,
    })
Beispiel #27
0
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})
Beispiel #28
0
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})
Beispiel #29
0
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)
Beispiel #30
0
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})
Beispiel #31
0
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)
Beispiel #32
0
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)
Beispiel #33
0
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)
Beispiel #34
0
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)
Beispiel #35
0
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)
Beispiel #36
0
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
    })
Beispiel #37
0
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)
Beispiel #38
0
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
    })
Beispiel #39
0
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)
Beispiel #40
0
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)
Beispiel #41
0
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})
Beispiel #42
0
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()})
Beispiel #43
0
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)
Beispiel #44
0
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()
        })