diff --git a/lineups/models.py b/lineups/models.py index 2dd59ca..679e3d6 100644 --- a/lineups/models.py +++ b/lineups/models.py @@ -20,7 +20,7 @@ class Positioning(models.Model): ('DH','DH') ] position = models.CharField(choices=positions, default=None, max_length=2, null=True, blank=True) - order = models.PositiveSmallIntegerField(default=0, null=True) + order = models.PositiveSmallIntegerField(default=None, null=True) class Meta: unique_together = ('player', 'event',) diff --git a/lineups/templates/lineups/lineup.html b/lineups/templates/lineups/lineup.html index ae91909..a288036 100644 --- a/lineups/templates/lineups/lineup.html +++ b/lineups/templates/lineups/lineup.html @@ -33,33 +33,30 @@ {% csrf_token %} {{ formset.management_form }}
+{# #}
-
Lineup
- - {% include 'lineups/player-table-header.html' %} - - {% for form in formset %} - {% if form.instance.order or form.instance.position == "P" %} - {% include 'lineups/player-table-row.html' with form=form available_display="none" order_display="table-cell" %} - {% endif %} - {% endfor %} - -
- +
+
DH'd
+
+ {% include 'lineups/player-table.html' with table_id="dhd" formset=formset_dhd available_class="d-none" order_class="d-none"%} +
+
+
+
Lineup
+
+ {% include 'lineups/player-table.html' with table_id="lineup" formset=formset_lineup available_class="d-none"%} +
+
+
-
Players
- - {% include 'lineups/player-table-header.html' %} - - {% for form in formset|dictsortreversed:"availability.available"%} - {% if not form.instance.order and not form.instance.position == "P" %} - {% include 'lineups/player-table-row.html' with form=form available_display="table-cell" order_display="none" %} - {% endif %} - {% endfor %} - -
+
+
Bench
+
+ {% include 'lineups/player-table.html' with table_id="bench" formset=formset_bench order_class="d-none"%} +
+
@@ -89,6 +86,16 @@ form_element_order.value = parseInt(player_rows[i].dataset.order) } } + var lineup = new Sortable.create( + document.getElementById('dhd'), { + animation: 150, + ghostClass: "ghost", + {#handle: ".bars-move",#} + group: { + put: true, + pull: true + } + }) var lineup = new Sortable.create( document.getElementById('lineup'), { animation: 150, @@ -99,6 +106,7 @@ pull:true }, onAdd: function (/**Event*/evt) { + // Add to Lineup var itemEl = evt.item; // dragged HTMLElement var player_id = itemEl.dataset.playerId console.log(itemEl) @@ -110,16 +118,10 @@ toggle_in_lineup(player_order_button) player_order.parentElement.dataset.order = evt.newIndex refresh_lineup_order() - player_available.parentElement.style.display="none" - player_order.style.display="table-cell" - evt.to; // target list - evt.from; // previous list - evt.oldIndex; // element's old index within old parent - evt.newIndex; // element's new index within new parent - evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements - evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements - evt.clone // the clone element - evt.pullMode; // when item is in another sortable: `"clone"` if cloning, `true` if moving + {#player_available.parentElement.style.display="none"#} + player_available.parentElement.classList.add('d-none') + {#player_order.style.display="table-cell"#} + player_order.classList.remove('d-none') }, onUpdate: function (/**Event*/evt) { console.log('update to lineup') @@ -144,10 +146,12 @@ var form_element_order =itemEl.querySelector('[id$="order"]') var player_order = itemEl.querySelector('[id^="player-order"]') var player_available =itemEl.querySelector('[id^="player-available"]') - player_available.parentElement.style.display="table-cell" + {#player_available.parentElement.style.display="table-cell"#} + player_available.parentElement.classList.remove('d-none') form_element_order.value = 0 player_order.innerHTML = 1 - player_order.style.display="none" + {#player_order.style.display="none"#} + player_order.classList.add('d-none') var player_id = itemEl.dataset.playerId refresh_lineup_order() } @@ -167,7 +171,7 @@ player_row.dataset.order = 0 } refresh_lineup_order() - } + } diff --git a/lineups/templates/lineups/player-table-header.html b/lineups/templates/lineups/player-table-header.html deleted file mode 100644 index f5380df..0000000 --- a/lineups/templates/lineups/player-table-header.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Name - Pos - - \ No newline at end of file diff --git a/lineups/templates/lineups/player-table-row.html b/lineups/templates/lineups/player-table-row.html deleted file mode 100644 index 6697528..0000000 --- a/lineups/templates/lineups/player-table-row.html +++ /dev/null @@ -1,70 +0,0 @@ - - {{ form.id.as_hidden }} - {{ form.event.as_hidden }} - {{ form.order.as_hidden }} - {{ form.player.as_hidden }} - - {% if form.availability.available == 2 %} - - Yes - {% elif form.availability.available == 1%} - - Maybe - {% elif form.availability.available == 0%} - - No - {% elif form.availability.available == -1%} - - Unknown - {% endif %} - - - {% if form.order.value %} - - {% elif form.order.value == 0 %} - - {% endif %} - - - {{ form.instance.player.first_name }} {{ form.instance.player.last_name }}  - #{{ form.instance.player.jersey_number }}
- {{ form.statline }} - - - {{ form.position }} - - {# {{ form.instance.position }}#} - \ No newline at end of file diff --git a/lineups/templates/lineups/player-table.html b/lineups/templates/lineups/player-table.html new file mode 100644 index 0000000..0be2593 --- /dev/null +++ b/lineups/templates/lineups/player-table.html @@ -0,0 +1,86 @@ + + + + {# #} + {# #} + {# #} + {# #} + + + + {% for form in formset %} + + {{ form.id.as_hidden }} + {{ form.event.as_hidden }} + {{ form.order.as_hidden }} + {{ form.player.as_hidden }} + {{ form.teamsnap_id.as_hidden }} + + + + + {# #} + + {% endfor %} + +
NamePos
+ {% if form.availability.available == 1 %} + + {% elif form.availability.available == 2%} + + Yes + {% elif form.availability.available == 0%} + + No + {% else %} + + Unknown + {% endif %} + + {% if form.order.value %} + + {% elif form.order.value == 0 %} + + {% endif %} + + {{ form.instance.player.first_name }} {{ form.instance.player.last_name }}  + #{{ form.instance.player.jersey_number }} + {#
{{ form.statline }}#} +
+ {{ form.position }} + {{ form.instance.position }}
\ No newline at end of file diff --git a/lineups/views.py b/lineups/views.py index 9eea7dd..c5696f0 100644 --- a/lineups/views.py +++ b/lineups/views.py @@ -5,6 +5,13 @@ from events.models import Event from players.models import Player from django.forms.models import model_to_dict from django.db.models import Q +from django.db.models import Case, When + +def queryset_from_ids(Model, id_list): + #https://stackoverflow.com/questions/4916851/django-get-a-queryset-from-array-of-ids-in-specific-order + preserved = Case(*[When(pk=pk, then=pos) for pos, pk in enumerate(id_list)]) + queryset = Model.objects.filter(pk__in=id_list).order_by(preserved) + return queryset # Create your views here. def edit(request, event_id): @@ -31,6 +38,7 @@ def edit(request, event_id): return render(request, 'success.html', {'call_back':'edit lineup','id':event_id, 'errors':[error for error in formset.errors if error]}, status=200) # return render(request, 'success.html', {'call_back':'schedule'}) previous_event = Event.objects.get(id=event_id-1) + event = Event.objects.get(id=event_id) next_event = Event.objects.get(id=event_id+1) players = Player.objects.all().prefetch_related('availability_set', 'statline_set', 'positioning_set') @@ -41,36 +49,47 @@ def edit(request, event_id): } for player in players } + players = Player.objects.prefetch_related('availability_set', 'positioning_set') # players_d.sort(key=lambda d: (-d['availability'].available, d['last_name'])) - players_with_positioning = [i.player for i in Positioning.objects.filter(event_id=event_id)] - players_without_positioning = [i for i in players if i not in players_with_positioning] - Positioning.objects.bulk_create([Positioning(event_id=event_id, player=player) for player in players_without_positioning]) - qset = Positioning.objects.filter(event_id=event_id) + for player in players: + Positioning.objects.get_or_create(player_id=player.id, event_id=event_id) - formset = PositioningFormSet(queryset=qset.order_by('order')) - pass - formset_starting = PositioningFormSet( - queryset=Positioning.objects.exclude(order__isnull=True).filter(event_id=event_id)) - formset_bench = PositioningFormSet( - queryset=Positioning.objects.exclude(order__isnull=False).filter(event_id=event_id)) + qs_starting_lineup = Positioning.objects.filter(event_id=event_id, order__isnull=False).order_by( + 'order') + qs_bench = Positioning.objects.filter(event_id=event_id, order__isnull=True).prefetch_related( + 'player__availability_set').order_by('player__last_name') + + # This is all a compromise to get the sorting just the way I wanted. THERE'S GOT TO BE A BETTER WAY + ids_starting_lineup = [item.id for item in qs_starting_lineup] + ids_bench_available = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 2] + ids_bench_maybe = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 1] + ids_bench_no = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == 0] + ids_bench_unknown = [item.id for item in qs_bench + if item.player.availability_set.get(event_id=event_id).available == -1] + qset = queryset_from_ids(Positioning, + ids_starting_lineup + ids_bench_available + ids_bench_maybe + ids_bench_no + ids_bench_unknown) + + formset = PositioningFormSet(queryset=qset) for f in formset: if f.instance.player_id: f.availability = f.instance.player.availability_set.get(event_id=event_id) - f.statline = f.instance.player.statline_set.get() - + # f.statline = f.instance.player.statline_set.get() + formset_lineup = [f for f in formset if f.instance.order] + formset_dhd = [f for f in formset if not f.instance.order and f.instance.position] + formset_bench = [f for f in formset if f not in formset_lineup and f not in formset_dhd] return render(request, 'lineups/lineup.html', {'title': 'Lineup', - 'events_tab':'active', - 'previous_event':previous_event, 'event': event, + 'previous_event': previous_event, 'next_event': next_event, - 'players_info': players_info, 'formset': formset, - # 'players': players_d, - # 'positionings_players_initial':[player for player in players if player['positioning']], - 'formset_starting':formset_starting, - 'formset_bench':formset_bench + 'formset_lineup':formset_lineup, + 'formset_bench':formset_bench, + 'formset_dhd': formset_dhd }) \ No newline at end of file