diff --git a/core/models.py b/core/models.py index 9e84404..4dea07a 100644 --- a/core/models.py +++ b/core/models.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import math +from collections import Counter + from django.core.urlresolvers import reverse from django.core.validators import validate_comma_separated_integer_list from django.db import models @@ -381,7 +384,14 @@ def __str__(self): return "%s: %s" % (self.user.username, self.player.name) -class Finance(models.Model): +class IterMixin(object): + def __iter__(self): + for attr, value in self.__dict__.items(): + if not attr.startswith('_'): + yield attr, value + + +class Finance(models.Model, IterMixin): class Meta: ordering = ['user', '-matchday'] unique_together = (('user', 'matchday'),) @@ -416,6 +426,40 @@ class Meta: def __str__(self): return "%s (%s): %s" % (self.user.username, self.matchday, self.balance) + def diff(self, ot_finance): + f = Finance() + f.income_visitors_league = math.abs(self.income_visitors_league - ot_finance.income_visitors_league) + f.income_sponsoring = math.abs(self.income_sponsoring - ot_finance.income_sponsoring) + f.income_cup = math.abs(self.income_cup - ot_finance.income_cup) + f.income_interests = math.abs(self.income_interests - ot_finance.income_interests) + f.income_loan = math.abs(self.income_loan - ot_finance.income_loan) + f.income_transfer = math.abs(self.income_transfer - ot_finance.income_transfer) + f.income_visitors_friendlies = math.abs(self.income_visitors_friendlies - ot_finance.income_visitors_friendlies) + f.income_funcup = math.abs(self.income_funcup - ot_finance.income_funcup) + f.income_betting = math.abs(self.income_betting - ot_finance.income_betting) + + f.expenses_player_salaries = math.abs(self.expenses_player_salaries - ot_finance.expenses_player_salaries) + f.expenses_stadium = math.abs(self.expenses_stadium - ot_finance.expenses_stadium) + f.expenses_youth = math.abs(self.expenses_youth - ot_finance.expenses_youth) + f.expenses_interests = math.abs(self.expenses_interests - ot_finance.expenses_interests) + f.expenses_trainings = math.abs(self.expenses_trainings - ot_finance.expenses_trainings) + f.expenses_transfer = math.abs(self.expenses_transfer - ot_finance.expenses_transfer) + f.expenses_compensation = math.abs(self.expenses_compensation - ot_finance.expenses_compensation) + f.expenses_friendlies = math.abs(self.expenses_friendlies - ot_finance.expenses_friendlies) + f.expenses_funcup = math.abs(self.expenses_funcup - ot_finance.expenses_funcup) + f.expenses_betting = math.abs(self.expenses_betting - ot_finance.expenses_betting) + return f + + def income(self): + my_finances_dict = Counter(dict(self)) + incomes = [value for key, value in my_finances_dict.items() if key.startswith('income')] + return sum(incomes) + + def expenses(self): + my_finances_dict = Counter(dict(self)) + incomes = [value for key, value in my_finances_dict.items() if key.startswith('expenses')] + return sum(incomes) + class MatchTeamStatistics(models.Model): class Meta: diff --git a/core/views/ofm/finance_views.py b/core/views/ofm/finance_views.py index e5636bf..5f69085 100644 --- a/core/views/ofm/finance_views.py +++ b/core/views/ofm/finance_views.py @@ -1,4 +1,5 @@ from braces.views import CsrfExemptMixin, JsonRequestResponseMixin +from braces.views import JSONResponseMixin from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from django.views import View @@ -21,7 +22,7 @@ def get_context_data(self, **kwargs): @method_decorator(login_required, name='dispatch') -class FinancesAsJsonView(CsrfExemptMixin, JsonRequestResponseMixin, View): +class FinancesAsJsonView(CsrfExemptMixin, JSONResponseMixin, View): def get(self, request, *args, **kwargs): newer_matchday_season = self.request.GET.get('newer_matchday_season', default=Matchday.objects.all()[0].season.number) @@ -57,126 +58,32 @@ def _get_finances_diff_in_json(newer_finances, older_finances): if not newer_finances: newer_finances = Finance.objects.all().order_by('matchday')[0] - account_balance = newer_finances.balance - - income_visitors_league = newer_finances.income_visitors_league - if older_finances: - income_visitors_league = newer_finances.income_visitors_league - older_finances.income_visitors_league - - income_sponsoring = newer_finances.income_sponsoring - if older_finances: - income_sponsoring = newer_finances.income_sponsoring - older_finances.income_sponsoring - - income_cup = newer_finances.income_cup - if older_finances: - income_cup = newer_finances.income_cup - older_finances.income_cup - - income_interests = newer_finances.income_interests - if older_finances: - income_interests = newer_finances.income_interests - older_finances.income_interests - - income_loan = newer_finances.income_loan - if older_finances: - income_loan = newer_finances.income_loan - older_finances.income_loan - - income_transfer = newer_finances.income_transfer - if older_finances: - income_transfer = newer_finances.income_transfer - older_finances.income_transfer - - income_visitors_friendlies = newer_finances.income_visitors_friendlies - if older_finances: - income_visitors_friendlies = newer_finances.income_visitors_friendlies - \ - older_finances.income_visitors_friendlies - - income_friendlies = newer_finances.income_friendlies - if older_finances: - income_friendlies = newer_finances.income_friendlies - older_finances.income_friendlies - - income_funcup = newer_finances.income_funcup - if older_finances: - income_funcup = newer_finances.income_funcup - older_finances.income_funcup - - income_betting = newer_finances.income_betting - if older_finances: - income_betting = newer_finances.income_betting - older_finances.income_betting - - expenses_player_salaries = -newer_finances.expenses_player_salaries - if older_finances: - expenses_player_salaries = -( - newer_finances.expenses_player_salaries - older_finances.expenses_player_salaries) - - expenses_stadium = -newer_finances.expenses_stadium - if older_finances: - expenses_stadium = -(newer_finances.expenses_stadium - older_finances.expenses_stadium) - - expenses_youth = -newer_finances.expenses_youth - if older_finances: - expenses_youth = -(newer_finances.expenses_youth - older_finances.expenses_youth) - - expenses_interests = -newer_finances.expenses_interests - if older_finances: - expenses_interests = -(newer_finances.expenses_interests - older_finances.expenses_interests) - - expenses_trainings = -newer_finances.expenses_trainings - if older_finances: - expenses_trainings = -(newer_finances.expenses_trainings - older_finances.expenses_trainings) - - expenses_transfer = -newer_finances.expenses_transfer - if older_finances: - expenses_transfer = -(newer_finances.expenses_transfer - older_finances.expenses_transfer) - - expenses_compensation = -newer_finances.expenses_compensation - if older_finances: - expenses_compensation = -(newer_finances.expenses_compensation - older_finances.expenses_compensation) - - expenses_friendlies = -newer_finances.expenses_friendlies - if older_finances: - expenses_friendlies = -(newer_finances.expenses_friendlies - older_finances.expenses_friendlies) - - expenses_funcup = -newer_finances.expenses_funcup - if older_finances: - expenses_funcup = -(newer_finances.expenses_funcup - older_finances.expenses_funcup) - - expenses_betting = -newer_finances.expenses_betting + finances_diff = newer_finances if older_finances: - expenses_betting = -(newer_finances.expenses_betting - older_finances.expenses_betting) - - finances_diff = dict() - finances_diff['account_balance'] = account_balance - - finances_diff['income_visitors_league'] = income_visitors_league - finances_diff['income_sponsoring'] = income_sponsoring - finances_diff['income_cup'] = income_cup - finances_diff['income_interests'] = income_interests - finances_diff['income_loan'] = income_loan - finances_diff['income_transfer'] = income_transfer - finances_diff['income_visitors_friendlies'] = income_visitors_friendlies - finances_diff['income_friendlies'] = income_friendlies - finances_diff['income_funcup'] = income_funcup - finances_diff['income_betting'] = income_betting - - finances_diff['expenses_player_salaries'] = expenses_player_salaries - finances_diff['expenses_stadium'] = expenses_stadium - finances_diff['expenses_youth'] = expenses_youth - finances_diff['expenses_interests'] = expenses_interests - finances_diff['expenses_trainings'] = expenses_trainings - finances_diff['expenses_transfer'] = expenses_transfer - finances_diff['expenses_compensation'] = expenses_compensation - finances_diff['expenses_friendlies'] = expenses_friendlies - finances_diff['expenses_funcup'] = expenses_funcup - finances_diff['expenses_betting'] = expenses_betting - - sum_income = income_visitors_league + income_sponsoring + income_cup + income_interests + income_loan + \ - income_transfer + income_visitors_friendlies + income_friendlies + income_funcup + income_betting - sum_expenses = expenses_player_salaries + expenses_stadium + expenses_youth + expenses_interests + \ - expenses_trainings + expenses_transfer + expenses_compensation + expenses_friendlies + \ - expenses_funcup + expenses_betting - - finances_diff['sum_income'] = sum_income - finances_diff['sum_expenses'] = sum_expenses - finances_diff['balance'] = sum_income + sum_expenses - - return [finances_diff] + finances_diff = newer_finances.diff(older_finances) + + finances_diff_dict = dict(finances_diff) + + finances_diff_dict['account_balance'] = newer_finances.balance + finances_diff_dict['sum_income'] = finances_diff.income() + finances_diff_dict['sum_expenses'] = finances_diff.expenses() + finances_diff_dict['balance'] = finances_diff_dict['sum_income'] + finances_diff_dict['sum_expenses'] + + return [finances_diff_dict] + + +class Income(object): + def __init__(self): + self.visitors_league = 0 + self.sponsoring = 0 + self.cup = 0 + self.interests = 0 + self.loan = 0 + self.transfer = 0 + self.visitors_friendlies = 0 + self.friendlies = 0 + self.funcup = 0 + self.betting = 0 @method_decorator(login_required, name='dispatch')