joining table allocation to actifs

This commit is contained in:
2023-01-29 18:11:40 +01:00
parent 4a55f94551
commit f8023701a4
14 changed files with 111 additions and 272 deletions

View File

@@ -1,6 +1,7 @@
INSERT INTO "allocation" VALUES(5,'Obligations',20,28.899999999999998578,74481.0);
INSERT INTO "allocation" VALUES(10,'Actions World',60,54.0,139404.14999999999418);
INSERT INTO "allocation" VALUES(12,'Cash',2,2.2000000000000001776,5591.0000000000000001);
INSERT INTO "allocation" VALUES(16,'Actions REITS',2,6.0999999999999996447,15607.200000000000727);
INSERT INTO "allocation" VALUES(17,'Actions Moment',15,8.1999999999999992894,21223.43999999999869);
INSERT INTO "allocation" VALUES(19,'Crypto',1,0.59999999999999997779,1623.349999999999909);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(5,'Obligations',22,28.30000000000000071,74481.0,'AUTRE',40,'success',6.3000000000000007105);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(10,'Actions World',60,54.200000000000002841,142781.26000000000931,'ACTION',30,'warning',-5.7999999999999971578);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(12,'Cash',2,2.1000000000000000888,5591.0000000000000001,'AUTRE',60,'success',0.10000000000000008881);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(16,'Actions REITS',5,6.2999999999999998223,16690.799999999999273,'ACTION',12,'danger',1.2999999999999998223);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(17,'Actions Moment',10,8.5,22332.240000000001601,'ACTION',5,'danger',-1.5);
INSERT INTO "allocation" (no_cat, classe, pc_cible, pc_atteint, valeur, type, ordre, bg_color, pc_ecart) VALUES(19,'Crypto',1,0.59999999999999997779,1700.6400000000001,'ACTION',31,'warning',-0.4000000000000000222);

Binary file not shown.

View File

@@ -1,81 +0,0 @@
"""add portfolio tables
Revision ID: 19d939dbc6d0
Revises: 7995372bd306
Create Date: 2023-01-23 14:49:31.713228
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '19d939dbc6d0'
down_revision = '7995372bd306'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('actifs',
sa.Column('no_id', sa.Integer(), nullable=False),
sa.Column('symbole', sa.Unicode(length=45), nullable=False),
sa.Column('libelle', sa.Unicode(length=45), nullable=False),
sa.Column('classe', sa.Unicode(length=45), nullable=False),
sa.Column('nombre', sa.Integer(), nullable=True),
sa.Column('cours', sa.Float(), nullable=True),
sa.Column('pru', sa.Float(), nullable=True),
sa.Column('valeur', sa.Float(), nullable=True),
sa.Column('plus_value', sa.Float(), nullable=True),
sa.Column('pc_plusvalue', sa.Float(), nullable=True),
sa.Column('rendement', sa.Float(), nullable=True),
sa.Column('pc_rdt', sa.Float(), nullable=True),
sa.Column('pc_allocation', sa.Float(), nullable=True),
sa.Column('ter', sa.Float(), nullable=True),
sa.Column('ter_pondere', sa.Float(), nullable=True),
sa.Column('devise', sa.Unicode(length=45), nullable=True),
sa.Column('parite', sa.Float(), nullable=True),
sa.Column('website', sa.Unicode(length=100), nullable=True),
sa.Column('modif_le', sa.DateTime(), nullable=True),
sa.PrimaryKeyConstraint('no_id', name=op.f('pk_actifs')),
sa.UniqueConstraint('symbole', name=op.f('uq_actifs_symbole'))
)
op.create_index('symbole_index', 'actifs', ['symbole'], unique=False)
op.create_table('allocation',
sa.Column('no_cat', sa.Integer(), nullable=False),
sa.Column('classe', sa.Unicode(length=45), nullable=False),
sa.Column('pc_cible', sa.Integer(), nullable=True),
sa.Column('pc_atteint', sa.Float(), nullable=True),
sa.Column('valeur', sa.Float(), nullable=True),
sa.PrimaryKeyConstraint('no_cat', name=op.f('pk_allocation'))
)
op.create_table('classes',
sa.Column('classe', sa.Unicode(), nullable=False),
sa.Column('type', sa.Unicode(length=45), nullable=True),
sa.Column('ordre', sa.Integer(), nullable=True),
sa.Column('bg_color', sa.Unicode(length=45), nullable=True),
sa.PrimaryKeyConstraint('classe', name=op.f('pk_classes'))
)
op.create_index('ordre_index', 'classes', ['ordre'], unique=False)
op.create_table('histo',
sa.Column('no_id', sa.Integer(), nullable=False),
sa.Column('date', sa.DateTime(), nullable=True),
sa.Column('mvt_cash', sa.Float(), nullable=True),
sa.Column('valeur_pf', sa.Float(), nullable=True),
sa.Column('nb_part', sa.Float(), nullable=True),
sa.Column('val_part', sa.Float(), nullable=True),
sa.Column('cours_ref', sa.Float(), nullable=True),
sa.Column('val_part_ref', sa.Float(), nullable=True),
sa.PrimaryKeyConstraint('no_id', name=op.f('pk_histo'))
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('histo')
op.drop_index('ordre_index', table_name='classes')
op.drop_table('classes')
op.drop_table('allocation')
op.drop_index('symbole_index', table_name='actifs')
op.drop_table('actifs')
# ### end Alembic commands ###

View File

@@ -1,26 +0,0 @@
"""add portfolio tables
Revision ID: 7995372bd306
Revises: fe8f8a5bfdb5
Create Date: 2023-01-23 14:43:22.632056
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '7995372bd306'
down_revision = 'fe8f8a5bfdb5'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@@ -1,26 +0,0 @@
"""add portfolio tables
Revision ID: fe8f8a5bfdb5
Revises:
Create Date: 2023-01-23 14:42:10.171291
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'fe8f8a5bfdb5'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###

View File

@@ -1,30 +0,0 @@
"""added relationship allocation-classe
Revision ID: 42a297861f20
Revises: 19d939dbc6d0
Create Date: 2023-01-26 14:23:42.771763
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '42a297861f20'
down_revision = '19d939dbc6d0'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('allocation', sa.Column('classe_id', sa.Unicode(length=45), nullable=True))
op.create_foreign_key(op.f('fk_allocation_classe_id_classes'), 'allocation', 'classes', ['classe_id'], ['classe'])
op.drop_column('allocation', 'classe')
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('allocation', sa.Column('classe', sa.VARCHAR(length=45), nullable=False))
op.drop_constraint(op.f('fk_allocation_classe_id_classes'), 'allocation', type_='foreignkey')
op.drop_column('allocation', 'classe_id')
# ### end Alembic commands ###

View File

@@ -1,34 +0,0 @@
"""added relationship allocation-classe
Revision ID: bbfb79cb9dad
Revises: 42a297861f20
Create Date: 2023-01-26 14:41:29.955558
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'bbfb79cb9dad'
down_revision = '42a297861f20'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('allocation',
sa.Column('no_cat', sa.Integer(), nullable=False),
sa.Column('classe_id', sa.Unicode(length=45), nullable=True),
sa.Column('pc_cible', sa.Integer(), nullable=True),
sa.Column('pc_atteint', sa.Float(), nullable=True),
sa.Column('valeur', sa.Float(), nullable=True),
sa.ForeignKeyConstraint(['classe_id'], ['classes.classe'], name=op.f('fk_allocation_classe_id_classes')),
sa.PrimaryKeyConstraint('no_cat', name=op.f('pk_allocation'))
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('allocation')
# ### end Alembic commands ###

View File

@@ -0,0 +1,42 @@
"""added foreign key to allocation
Revision ID: b8f8216d72c7
Revises:
Create Date: 2023-01-29 12:20:48.097107
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'b8f8216d72c7'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('allocation',
sa.Column('no_cat', sa.Integer(), nullable=False),
sa.Column('classe', sa.Unicode(length=45), nullable=True),
sa.Column('pc_cible', sa.Integer(), nullable=True),
sa.Column('pc_atteint', sa.Float(), nullable=True),
sa.Column('pc_ecart', sa.Float(), nullable=True),
sa.Column('valeur', sa.Float(), nullable=True),
sa.Column('type', sa.Unicode(length=45), nullable=True),
sa.Column('ordre', sa.Integer(), nullable=True),
sa.Column('bg_color', sa.Unicode(length=45), nullable=True),
sa.ForeignKeyConstraint(['classe'], ['actifs.classe'], name=op.f('fk_allocation_classe_actifs')),
sa.PrimaryKeyConstraint('no_cat', name=op.f('pk_allocation'))
)
op.create_index('classe_index', 'allocation', ['classe'], unique=False)
op.create_index('ordre_index', 'allocation', ['ordre'], unique=False)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('ordre_index', table_name='allocation')
op.drop_index('classe_index', table_name='allocation')
op.drop_table('allocation')
# ### end Alembic commands ###

View File

@@ -22,13 +22,11 @@ class BlogSearchForm(Form):
class TagForm(Form):
id = IntegerField(widget=HiddenInput())
tag = StringField('Tag', validators=[InputRequired(), Length(min=1, max=25)],
filters=[strip_filter])
tag = StringField('Tag', validators=[InputRequired(), Length(min=1, max=25)], filters=[strip_filter])
class UserCreateForm(Form):
username = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)],
filters=[strip_filter])
username = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)], filters=[strip_filter])
password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)])
class HistoForm(Form):
@@ -37,5 +35,9 @@ class HistoForm(Form):
class AllocationForm(Form):
no_cat = IntegerField(widget=HiddenInput())
classe = SelectField('Classe')
classe = StringField('Classe', validators=[InputRequired(), Length(min=1, max=25)], filters=[strip_filter])
pc_cible = IntegerField(validators=[InputRequired()])
type = SelectField('Type', choices=[('ACTION','ACTION'),('AUTRE','AUTRE')])
ordre = IntegerField(validators=[InputRequired()])
bg_color = SelectField('Couleur de fond', choices=[('info','BLEU'),('danger','ROUGE'),('warning','ORANGE'),('success','VERT')])

View File

@@ -36,24 +36,20 @@ class Actifs(Base):
modif_le = Column(DateTime, default=datetime.datetime.utcnow)
__table_args__ = (Index('symbole_index', 'symbole'),)
class Allocation(Base):
__tablename__ = 'allocation'
no_cat = Column(Integer, primary_key=True)
classe_id = Column(Unicode(45), ForeignKey('classes.classe'))
classe = Column(Unicode(45), ForeignKey('actifs.classe'))
pc_cible = Column(Integer)
pc_atteint = Column(Float)
pc_ecart = Column(Float)
valeur = Column(Float)
# relationship
classe = relationship('Classes', backref="allocation")
class Classes(Base):
__tablename__ = 'classes'
classe = Column(Unicode(45), primary_key=True)
type = Column(Unicode(45), default='ACTION')
ordre = Column(Integer)
bg_color = Column(Unicode(45))
__table_args__ = (Index('ordre_index', 'ordre'),)
__table_args__ = (Index('classe_index', 'classe'), Index('ordre_index', 'ordre'),)
class Histo(Base):
__tablename__ = 'histo'

View File

@@ -1,6 +1,6 @@
import sqlalchemy as sa
from sqlalchemy import func
from ..models.portfolio import Actifs, Allocation, Classes, Histo
from ..models.portfolio import Actifs, Allocation, Histo
class PFService(object):
@@ -8,7 +8,7 @@ class PFService(object):
@classmethod
def get_actifs(cls, request, no_id):
if no_id == '0':
items = request.dbsession.query(Actifs).order_by(Actifs.classe, Actifs.libelle).all()
items = request.dbsession.query(Actifs, Allocation).join(Allocation).order_by(Allocation.ordre, Actifs.libelle).all()
else:
# lire une allocation par le no_id
items = request.dbsession.query(Actifs).filter(Actifs.no_id == no_id).first()
@@ -17,22 +17,13 @@ class PFService(object):
@classmethod
def get_allocation(cls, request, no_cat):
if no_cat == '0':
query = request.dbsession.query(Allocation).join(Classes).filter(Classes.classe == Allocation.classe_id)
query = query.order_by(sa.asc(Allocation.classe_id)).all()
query = request.dbsession.query(Allocation)
query = query.order_by(sa.asc(Allocation.ordre)).all()
else:
# lire une allocation par le no_id
query = request.dbsession.query(Allocation).filter(Allocation.no_cat == no_cat).first()
return query
@classmethod
def get_classes(cls, request, classe):
if classe == '0':
items = request.dbsession.query(Classes).order_by(sa.asc(Classes.ordre)).all()
else:
# lire une allocation par le no_id
items = request.dbsession.query(Classes).filter(Classes.classe == classe).first()
return items
@classmethod
def get_histo(cls, request, no_id):
if no_id == '0':

View File

@@ -17,6 +17,15 @@
{{form.pc_cible(class_='form-control')}}
</div>
<div class="form-group">
<label class="required-field" for="tag">{{form.type.label}}</label>
{{form.type(class_='form-control')}}
</div>
<div class="form-group">
<label class="required-field" for="tag">{{form.bg_color.label}}</label>
{{form.bg_color(class_='form-control')}}
</div>
<br>
<div class="form-group">
<a class="btn btn-default" href="{{ request.route_url('portfolio') }}">

View File

@@ -21,15 +21,15 @@
<tbody>
{% for item in items %}
<tr>
<td class="{{ item.bg_color }}">{{ item.classe }}</td>
<td class="text-right"><a href="allocation_edit/{{ item.no_cat }}">{{ item.pc_cible }} %</a></td>
<td class="{{ item.bg_color }}"><a href="allocation_edit/{{ item.no_cat }}">{{ item.classe }}</a></td>
<td class="text-right">{{ item.pc_cible }} %</td>
<td class="text-right">{{ item.pc_atteint }}</td>
{% if (item.pc_atteint - item.pc_cible) >= 0 %}
<td class="text-right" style="color: green;">{{ item.pc_atteint }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.1f}'.format(item.pc_ecart) }}</td>
{% else %}
<td class="text-right" style="color: red;">{{ item.pc_atteint }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.1f}'.format(item.pc_ecart) }}</td>
{% endif %}
<td class="text-right">{{ '{0:0.2f} €'.format(item.valeur) }}</td>
<td class="text-right">{{ '{0:0,.0f} €'.format(item.valeur).replace(',',' ') }}</td>
</tr>
{% endfor %}
</tbody>
@@ -101,7 +101,7 @@
</div>
</form>
<table id="actifs_list" class="table table-condensed table-bordered">
<table class="table table-condensed table-bordered">
<thead>
<tr>
<th>Classe</th>
@@ -118,40 +118,40 @@
<tbody>
{% for ligne in actifs %}
<tr>
<td class="{{ ligne.bg_color }}">{{ ligne.classe }}</td>
{% if ligne.type=='ACTION' %}
<td><a href="actif_edit/{{ ligne.no_id }}">{{ ligne.libelle }}</a></td>
<td class="{{ ligne.Allocation.bg_color }}">{{ ligne.Allocation.classe }}</td>
{% if ligne.Allocation.type=='ACTION' %}
<td><a href="actif_edit/{{ ligne.no_id }}">{{ ligne.Actifs.libelle }}</a></td>
{% else %}
<td><a href="actif2_edit/{{ ligne.no_id }}">{{ ligne.libelle }}</a></td>
<td><a href="actif2_edit/{{ ligne.no_id }}">{{ ligne.Actifs.libelle }}</a></td>
{% endif %}
{% if ligne.devise=='EUR' %}
<td>{{ '{0:0.2f} €'.format(ligne.cours) }}</td>
{% if ligne.Actifs.devise=='EUR' %}
<td class="text-right">{{ '{0:0.2f} €'.format(ligne.Actifs.cours) }}</td>
{% else %}
<td>{{ '{0:0.2f} $'.format(ligne.cours) }}</td>
<td class="text-right">{{ '{0:0.2f} $'.format(ligne.Actifs.cours) }}</td>
{% endif %}
<td class="text-right">{{ ligne.nombre }}</td>
<td class="text-right">{{ '{0:0.2f} €'.format(ligne.valeur) }}</td>
{% if ligne.plus_value >= 0 %}
<td class="text-right" style="color: green;">{{ '{0:0.2f} €'.format(ligne.plus_value) }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.1f}'.format(ligne.pc_plusvalue) }}</td>
<td class="text-right">{{ ligne.Actifs.nombre }}</td>
<td class="text-right">{{ '{0:0,.2f} €'.format(ligne.Actifs.valeur).replace(',',' ') }}</td>
{% if ligne.Actifs.plus_value >= 0 %}
<td class="text-right" style="color: green;">{{ '{0:0.2f} €'.format(ligne.Actifs.plus_value) }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.1f}'.format(ligne.Actifs.pc_plusvalue) }}</td>
{% else %}
<td class="text-right" style="color: red;">{{ '{0:0.2f} €'.format(ligne.plus_value) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.1f}'.format(ligne.pc_plusvalue) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.2f} €'.format(ligne.Actifs.plus_value) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.1f}'.format(ligne.Actifs.pc_plusvalue) }}</td>
{% endif %}
<td class="text-right">{{ '{0:0.1f}'.format(ligne.ter) }}</td>
<td class="text-right">{{ '{0:0.1f}'.format(ligne.pc_allocation) }}</td>
<td class="text-right">{{ '{0:0.1f}'.format(ligne.Actifs.ter) }}</td>
<td class="text-right">{{ '{0:0.1f}'.format(ligne.Actifs.pc_allocation) }}</td>
</tr>
{% endfor %}
<tr>
<td class="text-right" colspan="4"><b>Total</b></td>
<td>{{ '{0:0.2f} €'.format(total_valeur) }}</td>
<td>{{ '{0:0,.2f} €'.format(total_valeur).replace(',',' ') }}</td>
{% if total_pv >= 0 %}
<td class="text-right" style="color: green;">{{ '{0:0.1f}'.format(total_pv) }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.2f}'.format(total_pc_value) }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.2f}'.format(total_pv) }}</td>
<td class="text-right" style="color: green;">{{ '{0:0.1f}'.format(total_pc_value) }}</td>
{% else %}
<td class="text-right" style="color: red;">{{ '{0:0.1f}'.format(total_pv) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.2f}'.format(total_pc_value) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.2f}'.format(total_pv) }}</td>
<td class="text-right" style="color: red;">{{ '{0:0.1f}'.format(total_pc_value) }}</td>
{% endif %}
<td></td>
<td class="text-right"><b>100.0</b></td>
@@ -172,7 +172,7 @@
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span class="glyphicon glyphicon-remove"></span></button>
<h4 class="modal-title" id="choixTypeActif">Choix du type d'actif à créer</h4>
<h4 class="modal-title" id="choixTypeActif">Choix du type</h4>
</div>
<div class="modal-body">
<p>

View File

@@ -17,7 +17,6 @@ def portfolio(request):
# lire les categories
items = PFService.get_allocation(request, '0')
import pdb;pdb.set_trace()
# construire la liste pour donut
donut_cible=[]
donut_cible.append(('Allocation cible', 'Pourcent'))
@@ -52,9 +51,9 @@ def portfolio(request):
PFService.update_actif_devise(request, 'USD', ticker.info.get('regularMarketPrice'))
for item in actifs:
if item.type == 'ACTION':
if item.Allocation.type == 'ACTION':
# lire le cours de l'action
ticker = yf.Ticker(item.symbole)
ticker = yf.Ticker(item.Actifs.symbole)
# ticker delisted ?
if ticker.info == None:
price = 0
@@ -62,7 +61,7 @@ def portfolio(request):
price = ticker.info.get('regularMarketPrice')
# caluler son rendement
dividends = PFService.get_dividends(ticker)
PFService.update_actif_valeur(request, item.symbole, price, dividends)
PFService.update_actif_valeur(request, item.Actifs.symbole, price, dividends)
# time.sleep(1) # attendre 2 secondes
# update du portefeuille
@@ -74,14 +73,15 @@ def portfolio(request):
total_valeur = 0
total_pv = 0
total_rdt = 0
for item in actifs:
total_valeur += item.valeur
total_pv += item.plus_value
total_valeur += item.Actifs.valeur
total_pv += item.Actifs.plus_value
if total_valeur == 0:
total_pc_value = 0
else:
total_pc_value = total_pv / total_valeur * 100
total_rdt += item.rendement
total_rdt += item.Actifs.rendement
# lire l'historique
histos = PFService.get_histo(request,'0')
@@ -126,14 +126,10 @@ def allocation_edit(request):
no_cat = request.matchdict['no_cat']
url = request.route_url('allocation_edit', no_cat=no_cat)
# lire les classes
classes_list = PFService.get_classes(request, '0')
if no_cat == '0':
# create a new allocation
entry = Allocation()
form = AllocationForm(request.POST, entry)
form.classe.choices = [(row.classe, row.classe) for row in classes_list]
page_title = "Nouvelle allocation"
else:
@@ -143,10 +139,9 @@ def allocation_edit(request):
request.session.flash(u"Allocation non trouvée : %s" % no_cat, 'warning')
return HTTPFound(location=request.route_url('portfolio'))
form = AllocationForm(request.POST, entry)
form.classe.choices = [(row.classe, row.classe) for row in classes_list]
page_title = "Modifier Allocation : " + str(entry.no_cat)
if 'form.submitted' in request.params and form.validate():
if 'form.submitted' in request.params :
if no_cat == '0':
form.populate_obj(entry)
entry.pc_atteint = 0