Skip to content

Commit

Permalink
admin:result custom view is now an inline into Race Admin.
Browse files Browse the repository at this point in the history
  • Loading branch information
SRJ9 committed Dec 8, 2016
1 parent 0fbeb1a commit c6ac116
Show file tree
Hide file tree
Showing 6 changed files with 259 additions and 216 deletions.
300 changes: 157 additions & 143 deletions driver27/admin/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,18 +176,32 @@ def print_copy_season(self, obj):
print_copy_season.allow_tags = True


class RaceAdmin(CommonRaceAdmin, admin.ModelAdmin):
list_display = ('__unicode__', 'season', 'print_pole', 'print_winner', 'print_fastest', 'print_results_link',)
class RaceAdmin(CommonTabbedModelAdmin):
list_display = ('__unicode__', 'season', 'print_pole', 'print_winner', 'print_fastest',)
list_filter = ('season', 'season__competition',)
readonly_fields = ('print_results_link',)

def get_urls(self):
urls = super(RaceAdmin, self).get_urls()
urlpatterns = [
url(r'(?P<race_id>\d+)/results/$', self.admin_site.admin_view(self.results), name='driver27_race_results')
]
tab_overview = (
(None, {
'fields': ('season', 'round', 'grand_prix', 'circuit', 'date', 'alter_punctuation')
}),
)
tab_results = (
ResultInline,
)
tabs = [
('Overview', tab_overview),
# ('Summary', tab_summary),
# ('Drivers', tab_drivers),
('Results', tab_results),
]

return urlpatterns + urls
# def get_urls(self):
# urls = super(RaceAdmin, self).get_urls()
# urlpatterns = [
# url(r'(?P<race_id>\d+)/results/$', self.admin_site.admin_view(self.results), name='driver27_race_results')
# ]
#
# return urlpatterns + urls

def print_seat(self, seat):
return "%s" % seat.contender.driver if seat else None
Expand All @@ -212,140 +226,140 @@ def clean_position(position):
position = None
return position

def edit_result_entries(self, request, entries, race, action='update'):
for entry in entries:
field_prefix = '%s-%s-' % ('seat', str(entry))
qualifying = request.POST.get(field_prefix + 'qualifying', None)
finish = request.POST.get(field_prefix + 'finish', None)
fastest_lap = request.POST.get(field_prefix + 'fastest-lap', False)
retired = request.POST.get(field_prefix + 'retired', False)
wildcard = request.POST.get(field_prefix + 'wildcard', False)

qualifying = self.clean_position(qualifying)
finish = self.clean_position(finish)

dict_to_save = {
'qualifying': qualifying,
'finish': finish,
'fastest_lap': fastest_lap,
'retired': retired,
'wildcard': wildcard
}
if action == 'update':
# filter allows update
result = Result.objects.filter(race=race, seat_id=entry)
result.update(**dict_to_save)
elif action == 'add':
Result.objects.create(
race=race,
seat_id=entry,
**dict_to_save
)

def add_result_entries(self, request, entries, race):
self.edit_result_entries(request, entries, race, action='add')

def update_result_entries(self, request, entries, race):
self.edit_result_entries(request, entries, race, action='update')

def del_result_entries(self, request, entries, race):
for entry in entries:
result = Result.objects.get(race=race, seat_id=entry)
result.delete()

def update_race_seats(self, request, new_seats, race):
old_seats = [result.seat_id for result in race.results.all()]
entries_to_add = lr_diff(new_seats, old_seats)
entries_to_upd = lr_intr(new_seats, old_seats)
entries_to_del = lr_diff(old_seats, new_seats)
if entries_to_add:
self.add_result_entries(request, entries_to_add, race)

if entries_to_upd:
self.update_result_entries(request, entries_to_upd, race)

if entries_to_del:
self.del_result_entries(request, entries_to_del, race)

def order_entries(self, entries, seats_len):
if seats_len:
entries = sorted(entries, key=lambda x: (
-x['checked'],
-x['finished'],
x['finish'],
-x['qualified'],
x['qualifying'],
-x['season_points']
))
else:
entries = sorted(entries, key=lambda x: -x['season_points'])
return entries

def results(self, request, race_id):
race = self.model.objects.get(pk=race_id)
title = 'Results in %s' % race
season = race.season
if request.method == 'POST':
post_entries = request.POST.getlist('entry[]')
if len(post_entries):
post_entries = list(map(int, post_entries))
self.update_race_seats(request, post_entries, race)

else:
race_seats = [result.seat_id for result in race.results.all()]
self.del_result_entries(request, race_seats, race)
entries = self.get_entries(race, season)

context = {
'race': race, 'season': season, 'entries': entries, 'title': title,
'opts': self.model._meta,
'app_label': self.model._meta.app_label,
'change': True
}
tpl = 'driver27/admin/results.html'
return render(request, tpl, context)

def get_entries(self, race, season):
season_seats = Seat.objects.filter(seasons__pk=season.pk)
race_seats = [result.seat_id for result in race.results.all()]
entries = []
for seat in season_seats:
contender = seat.contender
driver_name = ' '.join((contender.driver.first_name, contender.driver.last_name))
season_points = ContenderSeason(contender, season).get_points(limit_races=race.round)

points = finish = qualifying = None
fastest_lap = retired = wildcard = False

is_race_seat = False
if seat.pk in race_seats:
result = Result.objects.get(race=race, seat=seat)
qualifying = result.qualifying
finish = result.finish if result.finish else None
points = result.points
fastest_lap = result.fastest_lap
retired = result.retired
wildcard = result.wildcard
is_race_seat = True

entry = {
'seat': seat.pk,
'driver_name': driver_name,
'team': seat.team.name,
'checked': is_race_seat,
'qualifying': qualifying,
'qualified': bool(qualifying),
'finish': finish,
'finished': bool(finish),
'fastest_lap': fastest_lap,
'retired': retired,
'wildcard': wildcard,
'points': points,
'season_points': season_points
}
entries.append(entry)
entries = self.order_entries(entries, len(race_seats))
return entries
# def edit_result_entries(self, request, entries, race, action='update'):
# for entry in entries:
# field_prefix = '%s-%s-' % ('seat', str(entry))
# qualifying = request.POST.get(field_prefix + 'qualifying', None)
# finish = request.POST.get(field_prefix + 'finish', None)
# fastest_lap = request.POST.get(field_prefix + 'fastest-lap', False)
# retired = request.POST.get(field_prefix + 'retired', False)
# wildcard = request.POST.get(field_prefix + 'wildcard', False)
#
# qualifying = self.clean_position(qualifying)
# finish = self.clean_position(finish)
#
# dict_to_save = {
# 'qualifying': qualifying,
# 'finish': finish,
# 'fastest_lap': fastest_lap,
# 'retired': retired,
# 'wildcard': wildcard
# }
# if action == 'update':
# # filter allows update
# result = Result.objects.filter(race=race, seat_id=entry)
# result.update(**dict_to_save)
# elif action == 'add':
# Result.objects.create(
# race=race,
# seat_id=entry,
# **dict_to_save
# )
#
# def add_result_entries(self, request, entries, race):
# self.edit_result_entries(request, entries, race, action='add')
#
# def update_result_entries(self, request, entries, race):
# self.edit_result_entries(request, entries, race, action='update')
#
# def del_result_entries(self, request, entries, race):
# for entry in entries:
# result = Result.objects.get(race=race, seat_id=entry)
# result.delete()
#
# def update_race_seats(self, request, new_seats, race):
# old_seats = [result.seat_id for result in race.results.all()]
# entries_to_add = lr_diff(new_seats, old_seats)
# entries_to_upd = lr_intr(new_seats, old_seats)
# entries_to_del = lr_diff(old_seats, new_seats)
# if entries_to_add:
# self.add_result_entries(request, entries_to_add, race)
#
# if entries_to_upd:
# self.update_result_entries(request, entries_to_upd, race)
#
# if entries_to_del:
# self.del_result_entries(request, entries_to_del, race)
#
# def order_entries(self, entries, seats_len):
# if seats_len:
# entries = sorted(entries, key=lambda x: (
# -x['checked'],
# -x['finished'],
# x['finish'],
# -x['qualified'],
# x['qualifying'],
# -x['season_points']
# ))
# else:
# entries = sorted(entries, key=lambda x: -x['season_points'])
# return entries
#
# def results(self, request, race_id):
# race = self.model.objects.get(pk=race_id)
# title = 'Results in %s' % race
# season = race.season
# if request.method == 'POST':
# post_entries = request.POST.getlist('entry[]')
# if len(post_entries):
# post_entries = list(map(int, post_entries))
# self.update_race_seats(request, post_entries, race)
#
# else:
# race_seats = [result.seat_id for result in race.results.all()]
# self.del_result_entries(request, race_seats, race)
# entries = self.get_entries(race, season)
#
# context = {
# 'race': race, 'season': season, 'entries': entries, 'title': title,
# 'opts': self.model._meta,
# 'app_label': self.model._meta.app_label,
# 'change': True
# }
# tpl = 'driver27/admin/results.html'
# return render(request, tpl, context)
#
# def get_entries(self, race, season):
# season_seats = Seat.objects.filter(seasons__pk=season.pk)
# race_seats = [result.seat_id for result in race.results.all()]
# entries = []
# for seat in season_seats:
# contender = seat.contender
# driver_name = ' '.join((contender.driver.first_name, contender.driver.last_name))
# season_points = ContenderSeason(contender, season).get_points(limit_races=race.round)
#
# points = finish = qualifying = None
# fastest_lap = retired = wildcard = False
#
# is_race_seat = False
# if seat.pk in race_seats:
# result = Result.objects.get(race=race, seat=seat)
# qualifying = result.qualifying
# finish = result.finish if result.finish else None
# points = result.points
# fastest_lap = result.fastest_lap
# retired = result.retired
# wildcard = result.wildcard
# is_race_seat = True
#
# entry = {
# 'seat': seat.pk,
# 'driver_name': driver_name,
# 'team': seat.team.name,
# 'checked': is_race_seat,
# 'qualifying': qualifying,
# 'qualified': bool(qualifying),
# 'finish': finish,
# 'finished': bool(finish),
# 'fastest_lap': fastest_lap,
# 'retired': retired,
# 'wildcard': wildcard,
# 'points': points,
# 'season_points': season_points
# }
# entries.append(entry)
# entries = self.order_entries(entries, len(race_seats))
# return entries


class ContenderAdmin(CommonTabbedModelAdmin):
Expand Down
18 changes: 9 additions & 9 deletions driver27/admin/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,15 @@ def print_competitions(self, obj):
print_competitions.short_description = _('competitions')


class CommonRaceAdmin(object):
def print_results_link(self, obj):
if obj.pk:
results_url = reverse("admin:driver27_race_results", args=[obj.pk])
return '<a href="%s">%s</a>' % (results_url, _('Results'))
else:
return ''
print_results_link.allow_tags = True
print_results_link.short_description = _('link')
# class CommonRaceAdmin(object):
# def print_results_link(self, obj):
# if obj.pk:
# results_url = reverse("admin:driver27_race_results", args=[obj.pk])
# return '<a href="%s">%s</a>' % (results_url, _('Results'))
# else:
# return ''
# print_results_link.allow_tags = True
# print_results_link.short_description = _('link')


class CommonTabbedModelAdmin(TabbedModelAdmin):
Expand Down
17 changes: 13 additions & 4 deletions driver27/admin/filters.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from django.contrib import admin
from ..models import Team, GrandPrix, Seat
from ..models import Team, GrandPrix, Seat, Race


class CompetitionFilterInline(admin.TabularInline):
Expand All @@ -8,12 +8,21 @@ def get_formset(self, request, obj=None, **kwargs):
formset.request = request
return formset

@staticmethod
def seat_for_foreignkey(obj):
if isinstance(obj, Race):
seat_filter = {'seasons': obj.season}
else:
seat_filter = {'contender__competition__exact': obj.competition}
return Seat.objects.filter(**seat_filter)

def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if getattr(request, '_obj_', None):
obj = request._obj_
if db_field.name == 'team':
kwargs['queryset'] = Team.objects.filter(competitions__exact=request._obj_.competition)
kwargs['queryset'] = Team.objects.filter(competitions__exact=obj.competition)
elif db_field.name == 'grand_prix':
kwargs['queryset'] = GrandPrix.objects.filter(competitions__exact=request._obj_.competition)
kwargs['queryset'] = GrandPrix.objects.filter(competitions__exact=obj.competition)
elif db_field.name == 'seat':
kwargs['queryset'] = Seat.objects.filter(contender__competition__exact=request._obj_.competition)
kwargs['queryset'] = self.seat_for_foreignkey(obj)
return super(CompetitionFilterInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
Loading

0 comments on commit c6ac116

Please sign in to comment.