diff --git a/cao_blogr.sqlite b/cao_blogr.sqlite index 87fac92..2e7b04f 100644 Binary files a/cao_blogr.sqlite and b/cao_blogr.sqlite differ diff --git a/cao_blogr.sqlite.copie b/cao_blogr.sqlite.copie new file mode 100644 index 0000000..87fac92 Binary files /dev/null and b/cao_blogr.sqlite.copie differ diff --git a/cao_blogr/services/portfolio.py b/cao_blogr/services/portfolio.py index 7c74554..44d63c5 100644 --- a/cao_blogr/services/portfolio.py +++ b/cao_blogr/services/portfolio.py @@ -4,7 +4,6 @@ from ..models.portfolio import Actifs, Allocation, Histo class PFService(object): - @classmethod def get_actifs(cls, request, no_id): if no_id == '0': @@ -41,9 +40,15 @@ class PFService(object): items = request.dbsession.query(Histo).filter(Histo.no_id == no_id).first() return items + @classmethod + def get_last_histo(cls, request): + # lire le dernier histo créé + items = request.dbsession.query(Histo).order_by(sa.desc(Histo.date)).first() + return items + @classmethod def delete_allocation(cls, request, no_id): - request.dbsession.query(Allocation).filter(Histo.no_ == no_id).delete(synchronize_session=False) + request.dbsession.query(Allocation).filter(Allocation.no_ == no_id).delete(synchronize_session=False) return @classmethod @@ -52,37 +57,49 @@ class PFService(object): return @classmethod - def update_actif_devise(request, devise, taux): + def update_actif_devise(cls, request, devise, taux): request.dbsession.query(Actifs).filter(Actifs.devise == devise).update({'parite': taux}) - request.dbsession.commit() return def update_actif_valeur(request, symbole, cours, dividends): - request.dbsession.query(Actifs).filter(Actifs.symbole == symbole).update({'symbole': symbole, 'cours': cours, 'dividends': dividends}) - request.dbsession.commit() + request.dbsession.query(Actifs).filter(Actifs.symbole == symbole).update({'cours': cours, 'rendement': dividends}) return def update_portefeuille(request): - TotalValue = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalValue")).first() - + # cumuler la valeur totale des actifs + result = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalValue")).first() + TotalValue = result.TotalValue # maj du pourcentage d'allocation des lignes du portefeuille request.dbsession.query(Actifs).update({'pc_allocation': Actifs.valeur / TotalValue * 100}) - request.dbsession.commit() # maj des allocations items = PFService.get_allocation(request, '0') for item in items: - TotalClasse = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalValue") + # cumuler la valeur totale des actifs de cette classe + result = request.dbsession.query(Actifs, func.sum(Actifs.valeur).label("TotalClasse") ).filter(Actifs.classe == item.classe).first() - item.valeur = TotalClasse, - item.pc_atteint = item.valeur / TotalValue * 100; - request.dbsession.commit() + TotalClasse = result.TotalClasse + # maj du pourcentage d'allocation de cette classe + request.dbsession.query(Allocation).filter(Allocation.classe == item.classe + ).update({'valeur': TotalClasse, 'pc_atteint': TotalClasse / TotalValue * 100}) return - def delete_actif(request, no_id): + def delete_actif(cls, request, no_id): request.dbsession.query(Actifs).filter(Actifs.no_id == no_id).delete(synchronize_session=False) return + def get_dividends(ticker): + d = 0 + # le ticker a des dividendes ? + if len(ticker.dividends) > 0: + # oui, cumuler les dividendes sur un an + h = ticker.history(period="1y") + nb = len(ticker.dividends) + for i in range(nb): + d += ticker.dividends[nb - 1 - i] + + return d + diff --git a/cao_blogr/templates/portfolio/histo_edit.jinja2 b/cao_blogr/templates/portfolio/histo_edit.jinja2 index e6536ab..a3daf6b 100644 --- a/cao_blogr/templates/portfolio/histo_edit.jinja2 +++ b/cao_blogr/templates/portfolio/histo_edit.jinja2 @@ -20,11 +20,12 @@
+ + Retour + + Entrée / Sortie cash
| {{ item.classe }} | {{ item.pc_cible }} % | -{{ item.pc_atteint }} | +{{ '{0:0.1f}'.format(item.pc_atteint) }} | {% if (item.pc_atteint - item.pc_cible) >= 0 %}{{ '{0:0.1f}'.format(item.pc_ecart) }} | {% else %} diff --git a/cao_blogr/views/portfolio.py b/cao_blogr/views/portfolio.py index 86ae3f7..83e64d4 100644 --- a/cao_blogr/views/portfolio.py +++ b/cao_blogr/views/portfolio.py @@ -47,26 +47,28 @@ def portfolio(request): if 'form.submitted' in request.params: # lire le cours de EURUSD ticker = yf.Ticker('EUR=X') - # maj des parités des devises - PFService.update_actif_devise(request, 'USD', ticker.info.get('regularMarketPrice')) + taux = ticker.fast_info.get('lastPrice') + PFService.update_actif_devise(request, 'USD', taux) for item in actifs: if item.Allocation.type == 'ACTION': # lire le cours de l'action ticker = yf.Ticker(item.Actifs.symbole) # ticker delisted ? - if ticker.info == None: + if item.Actifs.symbole == 'SHLDQ': price = 0 + dividends = 0 else: - price = ticker.info.get('regularMarketPrice') - # caluler son rendement - dividends = PFService.get_dividends(ticker) + price = ticker.fast_info.get('lastPrice') + # caluler son rendement + dividends = PFService.get_dividends(ticker) + PFService.update_actif_valeur(request, item.Actifs.symbole, price, dividends) # time.sleep(1) # attendre 2 secondes # update du portefeuille - PFService.update_portefeuille(request, logged_in) + PFService.update_portefeuille(request) # relire les actifs actifs = PFService.get_actifs(request, '0') request.session.flash('Le portefeuille est mis à jour avec succès.', 'success') @@ -190,16 +192,28 @@ def histo_edit(request): page_title = "Modifier histo no " + str(entry.no_id) if 'form.submitted' in request.params and form.validate(): - if no_id == '0': - form.populate_obj(entry) - request.dbsession.add(entry) - return HTTPFound(location=request.route_url('histo_list')) - else: - del form.no_id # SECURITY: prevent overwriting of primary key - form.populate_obj(entry) - # lire le cours de l'indice de réfence : Carmignac Investissement A EUR Acc - ticker = yf.Ticker('0P00000FB2.F') - entry.cours_ref = ticker.info.get('regularMarketPrice') + form.populate_obj(entry) + + # lire le cours de l'indice de réfence : Carmignac Investissement A EUR Acc + ticker = yf.Ticker('0P00000FB2.F') + entry.cours_ref = ticker.fast_info.last_price + + # lire le dernier histo + last = PFService.get_last_histo(request) + + # lire les actifs et cumuler leurs valeurs + actifs = PFService.get_actifs(request, '0') + valeur_pf = 0 + for item in actifs: + valeur_pf += item.Actifs.valeur + + entry.valeur_pf = valeur_pf + # nlle valeur part = ancienne + nouvelle ratio + entry.nb_part = last.nb_part + (float(entry.mvt_cash) / (valeur_pf - float(entry.mvt_cash))/last.nb_part) + entry.val_part = entry.valeur_pf / entry.nb_part + entry.val_part_ref = float(entry.cours_ref) * last.val_part_ref / last.cours_ref + + request.dbsession.add(entry) return HTTPFound(location=request.route_url('histo_list')) @@ -249,8 +263,8 @@ def actif_edit(request): form.populate_obj(entry) # récupérer le cours du symbole de Yahoo finance ticker = yf.Ticker(entry.symbole) - entry.cours = ticker.fast_info.last_price - entry.devise = ticker.info.get('currency') + entry.cours = ticker.fast_info.get('lastPrice') + entry.devise = ticker.fast_info.get('currency') entry.libelle = html.unescape(ticker.info.get('shortName')) # raccourcir le libelle entry.libelle = entry.libelle.replace('UCITS ','') @@ -267,8 +281,8 @@ def actif_edit(request): form.populate_obj(entry) # récupérer le cours du symbole de Yahoo finance ticker = yf.Ticker(entry.symbole) - entry.cours = ticker.fast_info.last_price - entry.devise = ticker.info.get('currency') + entry.cours = ticker.fast_info.get('lastPrice') + entry.devise = ticker.fast_info.get('currency') entry.libelle = html.unescape(ticker.info.get('shortName')) # raccourcir le libelle entry.libelle = entry.libelle.replace('UCITS ','') diff --git a/development.ini b/development.ini index 6f3803b..b408f7b 100644 --- a/development.ini +++ b/development.ini @@ -37,7 +37,7 @@ file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s [server:main] use = egg:waitress#main -listen = localhost:6543 +listen = localhost:9280 ### # logging configuration diff --git a/production.ini b/production.ini index 5fbf1e4..2937165 100644 --- a/production.ini +++ b/production.ini @@ -31,7 +31,7 @@ file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s [server:main] use = egg:waitress#main -listen = *:6543 +listen = *:9280 ### # logging configuration