Diverse Umbauarbeiten für das neue Ranking.

This commit is contained in:
2017-12-22 10:51:20 +01:00
parent c030a31e2b
commit b7fab97715
6 changed files with 243 additions and 62 deletions

View File

@@ -28,6 +28,56 @@ KYU_DAN_ORDER = { # map sort URL args to Django ORM order_by args
'-username': ('-user__username',)
}
def getattr_recursive(obj, attr_string):
attr_list = attr_string.split('.')
return_value=None
for attr in attr_list:
print("Obj:", obj,'Attr:', attr)
return_value = getattr(obj, attr)
obj = return_value
return return_value
def generate_sheet(workbook, title, columns_settings, object_list):
row = 1
ws = workbook.create_sheet()
ws.title = title
ws.syncHorizontal = True
ws.filterMode = True
# setup print orientation
ws.page_setup.orientation = ws.ORIENTATION_PORTRAIT
ws.page_setup.paperSize = ws.PAPERSIZE_A4
ws.page_setup.fitToWidth = True
ws.print_options.horizontalCentered = True
# setup page header
ws.oddHeader.left.text = title
ws.oddHeader.left.size = 14
ws.oddHeader.left.font = "Amerika Sans"
ws.oddHeader.left.color = "000000"
ws.oddHeader.right.text = str(date.today())
ws.oddHeader.right.size = 14
ws.oddHeader.right.font = "Amerika Sans"
ws.oddHeader.right.color = "000000"
# write table header
for column, data in enumerate(columns_settings, 1):
cell = ws.cell(column=column, row=row, value=data['title'])
cell.style = 'heading'
# write the table content
for line in object_list:
row += 1
for column, settings in enumerate(columns_settings, 1):
cell = ws.cell(column=column, row=row, value=getattr_recursive(line, settings['attr']))
cell.style = settings['style']
# set column widths
for settings in columns_settings:
ws.column_dimensions[settings['col']].width = settings['width']
class DeleteHanchan(EventDetailMixin, PermissionRequiredMixin,
generic.DeleteView):
@@ -117,9 +167,6 @@ class EventRankingList(EventDetailMixin, generic.ListView):
model = models.EventRanking
class KyuDanRankingList(MahjongMixin, generic.ListView):
"""List all Players with an Kyu or Dan score. """
default_order = '-score'
@@ -133,7 +180,6 @@ class KyuDanRankingList(MahjongMixin, generic.ListView):
]
return super(KyuDanRankingList, self).dispatch(request, *args, **kwargs)
def get_queryset(self):
queryset = models.KyuDanRanking.objects.filter(
hanchan_count__gt=0).order_by(*self.order_by)
@@ -160,7 +206,6 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
def get(self, request, *args, **kwargs):
user_model = auth.get_user_model()
username = kwargs.get('username')
try:
self.user = user_model.objects.get(
username=self.kwargs.get('username'))
@@ -168,6 +213,9 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
raise django.http.Http404(
_("No user found matching the name {}").format(
self.kwargs.get('username')))
print(request.GET)
if request.GET.get('download') == 'xlsx':
return self.get_xlsx(request, *args, **kwargs)
return super(PlayerScore, self).get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
@@ -186,12 +234,47 @@ class PlayerScore(LoginRequiredMixin, generic.ListView):
context['ladder_ranking'] = models.SeasonRanking(user=self.user)
return context
def get_xlsx(self, request, *args, **kwargs):
from management.commands.export_ranking import geneate_excel
self.object_list = self.get_queryset()
allow_empty = self.get_allow_empty()
response = django.http.HttpResponse(
content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
response[
'Content-Disposition'] = 'attachment; filename="{xlsx_filename}"'.format(xlsx_filename=self.xlsx_filename)
xlxs_workbook = geneate_excel()
print(self.xlsx_columns)
generate_sheet(xlxs_workbook,
title=self.xlsx_filename,
columns_settings=self.xlsx_columns,
object_list=self.object_list
)
xlxs_workbook.create_sheet()
xlxs_workbook.save(response)
return response
class PlayerDanScore(PlayerScore):
template_name = 'mahjong_ranking/player_dan_score.html'
xlsx_columns = (
{'col': 'A', 'title': 'Beginn', 'attr': 'start', 'style': 'date', 'width': 14},
{'col': 'B', 'title': 'Platzierung', 'attr': 'placement', 'style': 'int', 'width': 8},
{'col': 'C', 'title': 'Spieler 1', 'attr': 'player1.username', 'style': 'content', 'width': 8},
{'col': 'D', 'title': 'Punkte', 'attr': 'player1_game_score', 'style': 'int', 'width': 8},
{'col': 'E', 'title': 'Spieler 2', 'attr': 'player2.username', 'style': 'content', 'width': 8},
{'col': 'F', 'title': 'Punkte', 'attr': 'player2_game_score', 'style': 'int', 'width': 8},
{'col': 'G', 'title': 'Spieler 3', 'attr': 'player3.username', 'style': 'content', 'width': 8},
{'col': 'H', 'title': 'Punkte', 'attr': 'player3_game_score', 'style': 'int', 'width': 8},
{'col': 'I', 'title': 'Spieler 4', 'attr': 'player4.username', 'style': 'content', 'width': 8},
{'col': 'J', 'title': 'Punkte', 'attr': 'player4_game_score', 'style': 'int', 'width': 8},
{'col': 'K', 'title': 'Dan Punkte', 'attr': 'dan_points', 'style': 'int', 'width': 8},
{'col': 'L', 'title': 'Anmerkung', 'attr': 'comment', 'style': 'content', 'width': 8},
)
def get_queryset(self):
kyu_dan_ranking = models.KyuDanRanking.objects.get(user=self.user)
self.xlsx_filename = "{username}_dan_score.xlsx".format(
username=self.user.username)
return models.Hanchan.objects.dan_hanchans(user=self.user,
since=kyu_dan_ranking.legacy_date)
@@ -200,6 +283,8 @@ class PlayerInvalidScore(PlayerScore):
template_name = 'mahjong_ranking/player_invalid_score.html'
def get_queryset(self):
self.xlsx_filename = "{username}_invalid_score.xlsx".format(
username=self.user.username)
return models.Hanchan.objects.unconfirmed(user=self.user)
@@ -207,6 +292,8 @@ class PlayerKyuScore(PlayerScore):
template_name = 'mahjong_ranking/player_kyu_score.html'
def get_queryset(self):
self.xlsx_filename = "{username}_kyu_score.xlsx".format(
username=self.user.username)
return models.Hanchan.objects.kyu_hanchans(self.user)
@@ -224,6 +311,8 @@ class PlayerLadderScore(PlayerScore):
def get_queryset(self, **kwargs):
self.season = int(self.request.GET.get('season', date.today().year))
self.xlsx_filename = "{username}_ladder ({season}).xlsx".format(
username=self.user.username, season=self.season)
hanchan_list = models.Hanchan.objects.season_hanchans(
user=self.user,
season=self.season