implement lineup send to gamechanger
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
22
gamechanger/migrations/0003_player.py
Normal file
22
gamechanger/migrations/0003_player.py
Normal 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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
18
gamechanger/migrations/0004_alter_player_id.py
Normal file
18
gamechanger/migrations/0004_alter_player_id.py
Normal 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),
|
||||
),
|
||||
]
|
||||
@@ -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"}),
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"),
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user