implement lineup send to gamechanger

This commit is contained in:
2022-06-08 14:08:33 -05:00
parent 50c9b70546
commit f788fb9932
21 changed files with 409 additions and 82 deletions

View File

@@ -1,6 +1,8 @@
from django.contrib import admin
from .models import Account, Preferences
from .models import Account, Player, Preferences
# Register your models here.
admin.site.register(Account)
admin.site.register(Preferences)
admin.site.register(Player)

View File

@@ -1,7 +1,8 @@
from django import forms
from django.forms import ModelForm, formset_factory
from .models import Preferences, Account, Player
from .models import Account, Player, Preferences
class PreferencesForm(ModelForm):
class Meta:
@@ -13,6 +14,7 @@ class PreferencesForm(ModelForm):
}
labels = {"managed_team_id": "Selected Team"}
class AccountForm(ModelForm):
class Meta:
model = Account
@@ -20,16 +22,24 @@ class AccountForm(ModelForm):
widgets = {
"user": forms.HiddenInput(),
"email": forms.EmailInput(),
"password": forms.PasswordInput()
"password": forms.PasswordInput(),
}
class PlayerForm(ModelForm):
gamechanger_name = forms.Field()
teamsnap_name = forms.Field()
gamechanger_id = forms.Field()
fname = forms.Field()
lname = forms.Field()
class Meta:
model = Player
fields = ['id', 'teamsnap_member_id']
fields = ["id", "teamsnap_member_id"]
widgets = {
"teamsnap_member_id": forms.Select(
choices=(), attrs={"class": "form-control"}
),
}
PlayerFormSet = formset_factory(PlayerForm, can_delete=True, extra=0)

View File

@@ -0,0 +1,22 @@
# Generated by Django 3.2.13 on 2022-06-08 12:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gamechanger', '0002_auto_20220607_1259'),
]
operations = [
migrations.CreateModel(
name='Player',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('teamsnap_member_id', models.IntegerField()),
('fname', models.CharField(max_length=30)),
('lname', models.CharField(max_length=30)),
],
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.2.13 on 2022-06-08 12:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('gamechanger', '0003_player'),
]
operations = [
migrations.AlterField(
model_name='player',
name='id',
field=models.CharField(max_length=30, primary_key=True, serialize=False),
),
]

View File

@@ -1,20 +1,36 @@
from django import forms
from django.db import models
from django.db.models import CharField, EmailField
from benchcoach.users.models import User
# Create your models here.
class Account(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="gamechanger_account")
user = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="gamechanger_account"
)
email = EmailField()
password = CharField(max_length=255)
class Preferences(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="gamechanger_preferences")
user = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="gamechanger_preferences"
)
season_id = CharField(max_length=255)
team_id = CharField(max_length=255)
class Meta:
verbose_name_plural = "preferences"
class Player(models.Model):
id = models.AutoField(primary_key=True)
id = models.CharField(primary_key=True, max_length=30)
teamsnap_member_id = models.IntegerField()
fname = CharField(max_length=30)
lname = CharField(max_length=30)
widgets = {
"teamsnap_member_id": forms.Select(choices=(), attrs={"class": "form-control"}),
}

View File

@@ -5,7 +5,7 @@
{# {{ player.fname }} {{ player.lname }}#}
{# </li>#}
{# {% endfor %}#}
<form method="post" action='{% url 'gamechanger_save' %}' >
<form method="post" action='{% url 'gamechanger_import_roster' %}' >
{{ formset.management_form }}
{% csrf_token %}
<table>
@@ -23,16 +23,20 @@
{% for form in formset %}
<tr>
<td>
{{ form.gamechanger_name }}
{{ form.gamechanger_name.value }}
</td>
<td>
{{ form.teamsnap_name }}
{{ form.teamsnap_member_id }}
</td>
<td>
{{ form.DELETE }}
</td>
{{ form.gamechanger_id.as_hidden }}
{{ form.gamechanger_name.as_hidden }}
{{ form.teamsnap_name.as_hidden }}
{{ form.id.as_hidden }}
{{ form.teamsnap_member_id.as_hidden }}
{{ form.fname.as_hidden }}
{{ form.lname.as_hidden }}
</tr>
{% endfor %}
</table>

View File

@@ -1,16 +1,10 @@
from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
from django.urls import path
from .views import (
PreferencesFormView,
AccountFormView,
roster_view,
roster_save
)
from .views import AccountFormView, PreferencesFormView, lineup_submit, roster_import
urlpatterns = [
path("account/", AccountFormView.as_view(), name="gamechanger_account"),
path("preferences/", PreferencesFormView.as_view(), name="gamechanger_preferences"),
path("roster/", roster_view, name="gamechanger_roster"),
path("roster/save", roster_save, name="gamechanger_save"),
path("roster/import", roster_import, name="gamechanger_import_roster"),
path("lineup/submit", lineup_submit, name="gamechanger_lineup_submit"),
]

View File

@@ -1,15 +1,70 @@
import requests
import re
import json
import re
import requests
url = "https://gc.com/t/{season_id}/{team_id}/{page}"
def get_authenticated_session(request):
gc_username = request.user.gamechanger_account.user
gc_password = request.user.gamechanger_account.password
s = requests.Session()
s.headers.update({"referer": "https://gc.com/do-login"})
s.get("https://gc.com/login")
r2 = s.post(
"https://gc.com/do-login",
cookies=s.cookies,
data={
"csrfmiddlewaretoken": s.cookies.get("csrftoken"),
"email": gc_username,
"password": gc_password,
},
)
if r2.status_code == 200:
return s
else:
raise requests.exceptions.RequestException(
f"Returned {r2.status_code} for {r2.reason}"
)
def submit_lineup(request, lineup):
authenticated_session = get_authenticated_session(request)
season_id = request.user.gamechanger_preferences.season_id
team_id = request.user.gamechanger_preferences.team_id
authenticated_session.headers.update(
{
"referer": url.format(
season_id=season_id, team_id=team_id, page="lineup_edit"
),
"x-csrftoken": authenticated_session.cookies.get("csrftoken"),
"Content-Type": "application/x-www-form-urlencoded;",
}
)
r = authenticated_session.post(
cookies=authenticated_session.cookies,
url="https://gc.com/do-save-lineup/{team_id}".format(
team_id=team_id.split("-").pop()
),
json={"lineup": lineup},
)
if r.status_code == 200:
return r
else:
raise requests.exceptions.RequestException(
f"Returned {r.status_code} for {r.reason}"
)
def scrape_page(season_id, team_id, page):
r=requests.get(url.format(season_id=season_id, team_id=team_id, page=page))
j=initialize_page_json = re.search(r'page.initialize\(\$.parseJSON\("(.*?)"\)', r.content.decode('unicode_escape'))
m=j.group(1)
r = requests.get(url.format(season_id=season_id, team_id=team_id, page=page))
initialize_page_json = re.search(
r'page.initialize\(\$.parseJSON\("(.*?)"\)', r.content.decode("unicode_escape")
)
m = initialize_page_json.group(1)
return json.loads(m)
# d = scrape_page(season_id, team_id, page)
pass

View File

@@ -1,11 +1,14 @@
from django.http import HttpResponse, HttpResponseNotAllowed, HttpResponseServerError
from django.shortcuts import render
from django.views.generic.edit import FormView
from django.views.generic.list import ListView
from .forms import PreferencesForm, AccountForm, PlayerFormSet
from .utils.gamechanger import scrape_page
from teamsnap.views import get_teamsnap_client
# Create your views here.
from .forms import AccountForm, PlayerFormSet, PreferencesForm
from .models import Player
from .utils import gamechanger
class PreferencesFormView(FormView):
template_name = "gamechanger/form.html"
form_class = PreferencesForm
@@ -29,6 +32,7 @@ class PreferencesFormView(FormView):
return initial
class AccountFormView(FormView):
template_name = "gamechanger/form.html"
form_class = AccountForm
@@ -52,30 +56,119 @@ class AccountFormView(FormView):
return initial
def roster_view(request):
from pyteamsnap.api import Member
client = get_teamsnap_client(request)
season_id = request.user.gamechanger_preferences.season_id
team_id = request.user.gamechanger_preferences.team_id
teamsnap_team_id = request.user.preferences.managed_team_id
teamsnap_members = {
f"{member.data['first_name']} {member.data['last_name']}":member
for member in Member.search(client, team_id=teamsnap_team_id)
}
page = "roster"
def roster_import(request):
if request.method == "GET":
from pyteamsnap.api import Member
d = scrape_page(season_id, team_id, page)
roster = d['roster']
initial = [{
'gamechanger_name':f"{player['fname']} {player['lname']}",
'teamsnap_name':"{first_name} {last_name}".format(**teamsnap_members[f"{player['fname']} {player['lname']}"].data),
'gamechanger_id':player.get('player_id'),
'teamsnap_member_id':teamsnap_members[f"{player['fname']} {player['lname']}"].data['id'],
} for player in roster]
formset = PlayerFormSet(initial=initial)
return render(request, "gamechanger/roster.html", context={'roster':roster, 'formset':formset})
pass
client = get_teamsnap_client(request)
season_id = request.user.gamechanger_preferences.season_id
team_id = request.user.gamechanger_preferences.team_id
teamsnap_team_id = request.user.teamsnap_preferences.managed_team_id
teamsnap_members = {
f"{member.data['first_name']} {member.data['last_name']}": member
for member in Member.search(client, team_id=teamsnap_team_id)
}
def roster_save(request):
pass
page = "roster"
d = gamechanger.scrape_page(season_id, team_id, page)
roster = d["roster"]
initial = [
{
"gamechanger_name": f"{player['fname']} {player['lname']}",
"fname": player["fname"],
"lname": player["lname"],
"teamsnap_name": "{first_name} {last_name}".format(
**teamsnap_members[f"{player['fname']} {player['lname']}"].data
),
"id": player.get("player_id"),
"teamsnap_member_id": teamsnap_members[
f"{player['fname']} {player['lname']}"
].data["id"],
}
for player in roster
]
formset = PlayerFormSet(initial=initial)
choices = [
(
teamsnap_member.data["id"],
f"{teamsnap_member.data['first_name']} {teamsnap_member.data['last_name']}",
)
for teamsnap_member in teamsnap_members.values()
]
for form in formset:
form.fields["teamsnap_member_id"].widget.choices = choices
pass
return render(
request,
"gamechanger/roster.html",
context={"roster": roster, "formset": formset},
)
elif request.POST:
formset = PlayerFormSet(request.POST)
if formset.is_valid():
r = []
for form in formset:
data = form.cleaned_data
data.pop("DELETE")
data.pop("gamechanger_name")
data.pop("teamsnap_name")
obj, did_create = Player.objects.update_or_create(**data)
obj.save()
r.append(obj)
return HttpResponse(status=200)
else:
return HttpResponseServerError()
return HttpResponseServerError()
else:
return HttpResponseServerError()
def lineup_submit(request):
from teamsnap.forms import LineupEntryFormset
if request.GET:
return HttpResponseNotAllowed()
if request.POST:
formset = LineupEntryFormset(request.POST)
if formset.is_valid():
lineup_data = [
form.cleaned_data
for form in formset
if form.cleaned_data.get("label")
and form.cleaned_data.get("sequence") is not None
]
lineup_data.sort(key=lambda x: x.get("sequence"))
lineup = []
for lineup_entry in lineup_data:
d = {
"player_id": lineup_entry["gamechanger_player_id"],
"position": lineup_entry["label"],
}
if lineup_entry["label"] == "DH":
for_whom = [
e
for e in lineup_data
if e["position_only"] and e["label"] != "DR"
][0]
d["forwhom"] = for_whom["gamechanger_player_id"]
lineup.append(d)
if for_whom in lineup:
lineup_data.remove(for_whom)
if for_whom in lineup_data:
lineup_data.remove(for_whom)
lineup.append(
{
"player_id": for_whom["gamechanger_player_id"],
"position": for_whom["label"],
}
)
elif lineup_entry["label"] != "DR":
lineup.append(d)
gamechanger.submit_lineup(request, lineup)
return HttpResponse(status=200)
return HttpResponseServerError()