def submit_pit_scouting_data(request):
    if request.method != "POST":
        return HttpResponse(status=403)

    else:
        data = json.loads(str(request.POST.get('data')))
        if request.POST.get('image_data'):
            image_data = json.loads(str(request.POST.get('image_data')))
        else:
            image_data = "nope"
        data_object = PitScoutData(scout=request.user,
                                   location=Location.objects.get(id=request.session.get('location_id')),
                                   pitscout_name=request.user.first_name + " " + request.user.last_name[:1],
                                   pitscout_team=request\
                                   .user\
                                   .userprofile\
                                   .team\
                                   .team_number)
        for name in data:
            setattr(data_object, name, data.get(name))

        if image_data != "nope":
            data_object.image_id = image_data['data']['id']
            data_object.image_link = image_data['data']['link']
            data_object.image_type = image_data['data']['type']

        try:
            param = str("team/frc%i" % data.get('team_number'))

            json_decoded = make_tba_request(param)

            setattr(data_object, 'team_name', json_decoded.get('nickname'))
            setattr(data_object, 'team_website', json_decoded.get('website'))

        except ValueError:
            pass 

        try:
            data_object.save()
        except (ValueError, IntegrityError):
            return HttpResponse(status=400)

        return HttpResponse(status=200)
def submit_pit_scouting_data(request):
    if request.method != "POST":
        return HttpResponse(status=403)

    else:
        data = json.loads(str(request.POST.get("data")))
        if request.POST.get("image_data"):
            image_data = json.loads(str(request.POST.get("image_data")))
        else:
            image_data = "nope"
        data_object = PitScoutData(
            scout=request.user,
            location=Location.objects.get(id=request.session.get("location_id")),
            pitscout_name=request.user.first_name + " " + request.user.last_name[:1],
            pitscout_team=request.user.userprofile.team.team_number,
        )
        for name in data:
            setattr(data_object, name, data.get(name))

        if image_data != "nope":
            data_object.image_id = image_data["data"]["id"]
            data_object.image_link = image_data["data"]["link"]
            data_object.image_type = image_data["data"]["type"]

        try:
            param = str("team/frc%i" % data.get("team_number"))

            json_decoded = make_tba_request(param)

            setattr(data_object, "team_name", json_decoded.get("nickname"))
            setattr(data_object, "team_website", json_decoded.get("website"))

        except ValueError:
            pass

        try:
            data_object.save()
        except (ValueError, IntegrityError):
            return HttpResponse(status=400)

        return HttpResponse(status=200)
예제 #3
0
def submit_pit_scouting_data(request):
    if request.method != "POST":
        return HttpResponse(status=403)

    else:
        data = json.loads(request.POST.get('data'))
        image_data = json.loads(request.POST.get('image_data'))

        data_object = PitScoutData(scout=request.user,
                                   location=Location.objects.get(id=request.session.get('location_id')),
                                   pitscout_name=request.user.first_name + " " + request.user.last_name[:1],
                                   pitscout_team_number=request.user.userprofile.team.team_number)
        for name in data:
            setattr(data_object, name, data.get(name))

        if image_data.get('data'):
            data_object.image_id = image_data['data']['id']
            data_object.image_link = image_data['data']['link']
            data_object.image_type = image_data['data']['type']

        try:
            param = str("team/frc%i" % data.get('team_number'))

            json_decoded = make_tba_request(param)

            setattr(data_object, 'team_name', json_decoded.get('nickname'))
            setattr(data_object, 'team_website', json_decoded.get('website'))

        except ValueError:
            pass

        try:
            data_object.save()
        except (ValueError, IntegrityError):
            return HttpResponse(status=400)

        return HttpResponse(status=200)
def view_team_profile(request, team_number=None):

    if not team_number:
        team_number = request.user.userprofile.team.team_number

    elif int(team_number) < 1:
        return HttpResponse("Team numbers cannot be less than 1.", status=400)

    # oh boy here we go
    statistics = {}

    matches = Match.objects.filter(team_number=team_number).exclude(
        location__name="TEST"
    )  # only take matches for this team
    if matches is not None:
        # iterate over possible match fields
        for field in Match._meta.fields:
            value = None
            # field_type = IntegerField, BooleanField, etc.
            field_type = str(field.__class__).split("'")[1].split(".")[4]
            # field_name = tele_picked_up_yellow_crates_blah, etc.
            field_name = str(field).split(".")[2]
            if field_type == "IntegerField":
                # if it's an integer and not a special field
                if field_name != "team_number" and field_name != "match_number" and field_name != "scout_team_number":
                    # then calculate the average of it

                    m = matches.aggregate(Avg(field_name))[field_name + "__avg"]

                    if m is not None:
                        # value = str("%.2f" % matches.aggregate(Avg(field_name))[field_name+"__avg"])
                        value = str("%.2f" % matches.aggregate(Avg(field_name))[field_name + "__avg"])
                    else:
                        value = None
                else:
                    # if it's special, skip it
                    continue
            elif field_type == "BooleanField":
                # if it's a boolean, calculate the % that has true (but not if matches.count()  == 0)
                try:
                    value = str("%.2f" % (matches.filter(**{str(field_name): True}).count() / matches.count() * 100))
                except ZeroDivisionError:
                    pass
            else:
                # otherwise, skip it
                continue
            # put it in the hash -- much simpler than the crazy wacko system of before
            statistics[field_name] = value

            if statistics[field_name] == None:
                statistics[field_name] = "—"

    pit_scout_data = PitScoutData.objects.filter(team_number=team_number).order_by("id").exclude(location__name="TEST")

    aggregate_data = PitScoutData(team_number=team_number)

    for data in pit_scout_data:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    self_scouted = PitScoutData.objects.filter(
        team_number=team_number, scout__userprofile__team__team_number=team_number
    ).order_by("id")

    for data in self_scouted:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    # then pass all the sections/data to the context
    pitdatas = PitScoutData.objects.filter(team_number=team_number).count()

    try:
        param = str("team/frc%i" % int(team_number))
        json_decoded = make_tba_request(param)

    except ValueError:
        json_decoded = None

    context = {
        "has_pit_data": pitdatas,
        "aggregate_data": model_to_dict(aggregate_data),
        "team_number": team_number,
        "statistics": statistics,
        "nav_title": str(team_number),
        "matches": matches,
        "tba_data": json_decoded,
    }
    if pitdatas == 1:
        context["scout_name"] = PitScoutData.objects.get(team_number=team_number).scout.first_name

    return render(request, "frc_scout/profiles/profile.html", context)
예제 #5
0
def view_team_profile(request, team_number=None):

    if not team_number:
        team_number = request.user.userprofile.team.team_number

    elif int(team_number) < 1:
        return HttpResponse("Team numbers cannot be less than 1.", status=400)

    # oh boy here we go
    statistics = {}

    matches = Match.objects.filter(team_number=team_number).exclude(
        location__name="TEST")  # only take matches for this team
    if matches is not None:
        # iterate over possible match fields
        for field in Match._meta.fields:
            value = None
            # field_type = IntegerField, BooleanField, etc.
            field_type = str(field.__class__).split("'")[1].split('.')[4]
            # field_name = tele_picked_up_yellow_crates_blah, etc.
            field_name = str(field).split('.')[2]
            if field_type == "IntegerField":
                # if it's an integer and not a special field
                if field_name != "team_number" and field_name != "match_number" and field_name != "scout_team_number":
                    # then calculate the average of it

                    m = matches.aggregate(Avg(field_name))[field_name +
                                                           "__avg"]

                    if m is not None:
                        #value = str("%.2f" % matches.aggregate(Avg(field_name))[field_name+"__avg"])
                        value = str("%.2f" % matches.aggregate(
                            Avg(field_name))[field_name + "__avg"])
                    else:
                        value = None
                else:
                    # if it's special, skip it
                    continue
            elif field_type == "BooleanField":
                # if it's a boolean, calculate the % that has true (but not if matches.count()  == 0)
                try:
                    value = str("%.2f" % (matches.filter(**{
                        str(field_name): True
                    }).count() / matches.count() * 100))
                except ZeroDivisionError:
                    pass
            else:
                # otherwise, skip it
                continue
            # put it in the hash -- much simpler than the crazy wacko system of before
            statistics[field_name] = value

            if statistics[field_name] == None:
                statistics[field_name] = "—"

    pit_scout_data = PitScoutData.objects.filter(
        team_number=team_number).order_by('id').exclude(location__name="TEST")

    aggregate_data = PitScoutData(team_number=team_number)

    for data in pit_scout_data:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    self_scouted = PitScoutData.objects.filter\
        (team_number=team_number, scout__userprofile__team__team_number=team_number).order_by('id')

    for data in self_scouted:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    # then pass all the sections/data to the context
    pitdatas = PitScoutData.objects.filter(team_number=team_number).count()

    try:
        param = str("team/frc%i" % int(team_number))
        json_decoded = make_tba_request(param)

    except ValueError:
        json_decoded = None

    context = {
        'has_pit_data': pitdatas,
        'aggregate_data': model_to_dict(aggregate_data),
        'team_number': team_number,
        'statistics': statistics,
        'nav_title': str(team_number),
        'matches': matches,
        'tba_data': json_decoded
    }
    if pitdatas == 1:
        context['scout_name'] = PitScoutData.objects.get(
            team_number=team_number).scout.first_name

    return render(request, 'frc_scout/profiles/profile.html', context)
예제 #6
0
def view_team_profile(request, team_number=None):

    if not team_number:
        team_number = request.user.userprofile.team.team_number

    elif int(team_number) < 1:
        return HttpResponse("Team numbers cannot be less than 1.", status=400)

    # oh boy here we go
    statistics = {}

    matches = Match.objects.filter(team_number=team_number).exclude(location__name="TEST") # only take matches for this team
    if matches is not None:
        # iterate over possible match fields
        for field in Match._meta.fields:
            value = None
            # field_type = IntegerField, BooleanField, etc.
            field_type = str(field.__class__).split("'")[1].split('.')[4]
            # field_name = tele_picked_up_yellow_crates_blah, etc.
            field_name = str(field).split('.')[2]
            if field_type == "IntegerField":
                # if it's an integer and not a special field
                if field_name != "team_number" and field_name != "match_number" and field_name != "scout_team_number":
                    # then calculate the average of it

                    m = matches.aggregate(Avg(field_name))[field_name+"__avg"]

                    if m is not None:
                        #value = str("%.2f" % matches.aggregate(Avg(field_name))[field_name+"__avg"])
                        value = str("%.2f" % matches.aggregate(Avg(field_name))[field_name+"__avg"])
                    else:
                        value = None
                else:
                    # if it's special, skip it
                    continue
            elif field_type == "BooleanField":
                # if it's a boolean, calculate the % that has true (but not if matches.count()  == 0)
                try:
                    value = str("%.2f" % (matches.filter(**{str(field_name): True}).count() / matches.count() * 100))
                except ZeroDivisionError:
                    pass
            else:
                # otherwise, skip it
                continue
            # put it in the hash -- much simpler than the crazy wacko system of before
            statistics[field_name] = value

            if statistics[field_name] == None:
                statistics[field_name] = "—"

        if (statistics['match_final_score'] != "—") and (statistics['match_final_score'] != 0):
            # exclude things that have a 0
            statistics['match_final_score'] = matches.exclude(match_final_score=0).aggregate(
                Avg('match_final_score'))['match_final_score__avg']
            if statistics['match_final_score'] is None:
                statistics['match_final_score'] = 0

        # calculate some special stats
        print(statistics['auto_step_center_acquired_containers'])
        if (statistics['auto_step_center_acquired_containers'] != "—") and (statistics['auto_ground_acquired_containers'] != "—"):
            statistics['auto_total_acquired_containers'] = str("%.2f" %
                (float(statistics['auto_step_center_acquired_containers']) + float(statistics['auto_ground_acquired_containers'])))
        else:
            statistics['auto_total_acquired_containers'] = "—"
        if (statistics['tele_picked_up_ground_upright_totes'] != "—") and (statistics['tele_picked_up_upside_down_totes'] != "—") and (
            statistics['tele_picked_up_sideways_totes'] != "—") and (statistics['tele_picked_up_human_station_totes'] != "—"):
            statistics['tele_picked_up_total_totes'] = str("%.2f" %
                (float(statistics['tele_picked_up_ground_upright_totes']) + float(statistics['tele_picked_up_upside_down_totes'])
                 + float(statistics['tele_picked_up_sideways_totes']) + float(statistics['tele_picked_up_human_station_totes'])))
        else:
            statistics['tele_picked_up_total_totes'] = "—"
        if (statistics['tele_picked_up_sideways_containers'] != "—") and (statistics['tele_picked_up_upright_containers'] != "—") and (
            statistics['tele_picked_up_center_step_containers'] != "—"):
            statistics['tele_picked_up_total_containers'] = str("%.2f" %
                 (float(statistics['tele_picked_up_sideways_containers']) + float(statistics['tele_picked_up_upright_containers'])
                 + float(statistics['tele_picked_up_center_step_containers'])))
        else:
            statistics['tele_picked_up_total_containers'] = "—"
        # aggregate totestacks, yay!
        stacks = ToteStack.objects.filter(match__team_number=team_number, coop_stack=False)
        if (len(stacks) != 0) and (stacks != None):
            statistics['tele_average_stack_height'] = str("%.2f" % stacks.aggregate(Avg('start_height'))['start_height__avg'])
            statistics['tele_average_totes_stacked'] = str("%.2f" % stacks.aggregate(Avg('totes_added'))['totes_added__avg'])
            # I'm pretty proud of this -- it's the averages of the sum per match
            match_stacks = stacks.values('match').annotate(total_totes=Sum('totes_added'))
            statistics['tele_average_totes_stacked_per_match'] = str("%.2f" % match_stacks.aggregate(Avg('total_totes'))['total_totes__avg'])
        else:
            statistics['tele_average_stack_height'] = "—"
            statistics['tele_average_totes_stacked'] = "—"
            statistics['tele_average_totes_stacked_per_match'] = "—"
        coop_stacks = ToteStack.objects.filter(match__team_number=team_number, coop_stack=True)
        if (len(coop_stacks) != 0) and (coop_stacks != None):
            match_coop_stacks = coop_stacks.values('match').annotate(total_totes=Sum('totes_added'))
            statistics['tele_average_coop_totes_stacked_per_match'] = str("%.2f" % match_coop_stacks.aggregate(Avg('total_totes'))['total_totes__avg'])
        else:
            statistics['tele_average_coop_totes_stacked_per_match'] = "—"

        # aggregate containerstacks
        containers = ContainerStack.objects.filter(match__team_number=team_number)
        if (len(containers) != 0) and (containers != None):
            statistics['tele_average_container_height'] = str("%.2f" % containers.aggregate(Avg('height'))['height__avg'])
            match_containers = containers.values('match').annotate(total_containers=Count('containers_added'))
            statistics['tele_average_containers_stacked_per_match'] = str("%.2f" %
                    match_containers.aggregate(Avg('total_containers'))['total_containers__avg'])
        else:
            statistics['tele_average_container_height'] = "—"
            statistics['tele_average_containers_stacked_per_match'] = "—"

        # match scores -- I moved the thing from the 'edit match' screen into its own function
        # because it's pretty useful and recyclable
        match_scores = [match_score(m) for m in matches]
        auto_scores = [m[0] for m in match_scores]
        tele_scores = [m[1] for m in match_scores]
        if len(auto_scores) > 0:
            statistics['auto_average_score'] = str("%.2f" % (sum(auto_scores) / len(auto_scores)))
            statistics['tele_average_score'] = str("%.2f" % (sum(tele_scores) / len(tele_scores)))
            statistics['total_average_score'] = str("%.2f" %
                (float(statistics['auto_average_score']) + float(statistics['tele_average_score'])))
        else:
            statistics['auto_average_score'] = "—"
            statistics['tele_average_score'] = "—"
            statistics['total_average_score'] = "—"
        if statistics['match_final_score'] != "—":
            try:
                statistics['total_score_proportion'] = str("%.2f" %
                    (float(statistics['total_average_score']) / float(statistics['match_final_score']) * 100))
            except ZeroDivisionError:
                statistics['total_score_proportion'] = "?"
        else:
            statistics['total_score_proportion'] = "—"

    pit_scout_data = PitScoutData.objects.filter(team_number=team_number).order_by('id').exclude(location__name="TEST")

    aggregate_data = PitScoutData(team_number=team_number)

    for data in pit_scout_data:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    self_scouted = PitScoutData.objects.filter\
        (team_number=team_number, scout__userprofile__team__team_number=team_number).order_by('id')

    for data in self_scouted:
        for field in PitScoutData._meta.fields:
            if getattr(data, field.name):
                setattr(aggregate_data, field.name, getattr(data, field.name))

    # then pass all the sections/data to the context
    pitdatas = PitScoutData.objects.filter(team_number=team_number).count()

    try:
        param = str("team/frc%i" % int(team_number))
        json_decoded = make_tba_request(param)

    except ValueError:
        json_decoded = None

    context = {
        'has_pit_data': pitdatas,
        'aggregate_data': model_to_dict(aggregate_data),
        'team_number': team_number,
        'statistics': statistics,
        'nav_title': str(team_number),
        'matches': matches,
        'tba_data': json_decoded
    }
    if pitdatas == 1:
        context['scout_name'] = PitScoutData.objects.get(team_number=team_number).scout.first_name

    return render(request, 'frc_scout/profiles/profile.html', context)