Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Political Memory
memopol
Commits
d7547a87
Commit
d7547a87
authored
May 29, 2016
by
Nicolas Joyard
Browse files
Replace ScoredVotes model with view-based VoteScore model
parent
505bbcf2
Changes
7
Hide whitespace changes
Inline
Side-by-side
memopol/api.py
View file @
d7547a87
...
...
@@ -17,7 +17,7 @@ from representatives_recommendations.api import (
DossierScoreViewSet
,
RecommendationViewSet
,
RepresentativeScoreViewSet
,
Scor
edVot
eViewSet
Vote
ScoreViewSet
)
...
...
@@ -32,5 +32,5 @@ router.register(r'proposals', ProposalViewSet)
router
.
register
(
r
'recommendations'
,
RecommendationViewSet
)
router
.
register
(
r
'representatives'
,
RepresentativeViewSet
)
router
.
register
(
r
'scores'
,
RepresentativeScoreViewSet
)
router
.
register
(
r
'
scored_votes'
,
ScoredVot
eViewSet
)
router
.
register
(
r
'
vote_scores'
,
VoteScor
eViewSet
)
router
.
register
(
r
'votes'
,
VoteViewSet
)
memopol/views.py
View file @
d7547a87
...
...
@@ -7,7 +7,7 @@ from representatives.models import Representative
from
representatives_votes
import
views
as
representatives_votes_views
from
representatives_votes.models
import
Dossier
,
Proposal
from
representatives_positions.forms
import
PositionForm
from
representatives_recommendations.models
import
Score
dVote
from
representatives_recommendations.models
import
Vote
Score
class
RepresentativeList
(
...
...
@@ -42,7 +42,7 @@ class RepresentativeDetail(representatives_views.RepresentativeDetail):
def
get_queryset
(
self
):
qs
=
super
(
RepresentativeDetail
,
self
).
get_queryset
()
votes
=
Scor
edVot
e
.
objects
.
filter
(
votes
=
Vote
Score
.
objects
.
filter
(
proposal__in
=
Proposal
.
objects
.
exclude
(
recommendation
=
None
),
).
select_related
(
'proposal__recommendation'
)
qs
=
qs
.
prefetch_related
(
models
.
Prefetch
(
'votes'
,
queryset
=
votes
))
...
...
representatives_recommendations/api.py
View file @
d7547a87
...
...
@@ -9,14 +9,14 @@ from .models import (
DossierScore
,
Recommendation
,
RepresentativeScore
,
Score
dVote
Vote
Score
)
from
.serializers
import
(
DossierScoreSerializer
,
RecommendationSerializer
,
RepresentativeScoreSerializer
,
Scor
edVot
eSerializer
Vote
ScoreSerializer
)
...
...
@@ -85,12 +85,12 @@ class RepresentativeScoreViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class
=
RepresentativeScoreSerializer
class
Scor
edVot
eViewSet
(
viewsets
.
ReadOnlyModelViewSet
):
class
Vote
ScoreViewSet
(
viewsets
.
ReadOnlyModelViewSet
):
"""
API endpoint to view votes with their score impact.
This endpoint only shows votes that have a matching recommendation.
"""
queryset
=
Scor
edVot
e
.
objects
.
select_related
(
queryset
=
Vote
Score
.
objects
.
select_related
(
'representative'
,
'proposal'
,
'proposal__dossier'
,
...
...
@@ -112,4 +112,4 @@ class ScoredVoteViewSet(viewsets.ReadOnlyModelViewSet):
}
pagination_class
=
DefaultWebPagination
serializer_class
=
Scor
edVot
eSerializer
serializer_class
=
Vote
ScoreSerializer
representatives_recommendations/migrations/0003_votescore.py
0 → 100644
View file @
d7547a87
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'representatives_recommendations'
,
'0002_dossierscore'
),
]
operations
=
[
migrations
.
CreateModel
(
name
=
'VoteScore'
,
fields
=
[
(
'id'
,
models
.
AutoField
(
verbose_name
=
'ID'
,
serialize
=
False
,
auto_created
=
True
,
primary_key
=
True
)),
(
'position'
,
models
.
CharField
(
max_length
=
10
)),
(
'score'
,
models
.
IntegerField
(
default
=
0
)),
],
options
=
{
'ordering'
:
[
'proposal__datetime'
],
'db_table'
:
'representatives_recommendations_votescores'
,
'managed'
:
False
,
},
),
migrations
.
DeleteModel
(
name
=
'ScoredVote'
,
),
migrations
.
RunSQL
(
"""
CREATE VIEW "representatives_recommendations_votescores"
AS SELECT
"representatives_votes_vote"."id",
"representatives_votes_vote"."position",
"representatives_votes_vote"."proposal_id",
"representatives_votes_vote"."representative_id",
CASE WHEN "representatives_votes_vote"."position" = ("representatives_recommendations_recommendation"."recommendation")
THEN "representatives_recommendations_recommendation"."weight"
ELSE (0 - "representatives_recommendations_recommendation"."weight")
END AS "score"
FROM "representatives_votes_vote"
INNER JOIN "representatives_votes_proposal"
ON ( "representatives_votes_vote"."proposal_id" = "representatives_votes_proposal"."id" )
LEFT OUTER JOIN "representatives_recommendations_recommendation"
ON ( "representatives_votes_proposal"."id" = "representatives_recommendations_recommendation"."proposal_id" )
WHERE "representatives_recommendations_recommendation"."id" IS NOT NULL
"""
)
]
representatives_recommendations/models.py
View file @
d7547a87
# coding: utf-8
from
django.db
import
models
from
django.db.models.signals
import
post_save
from
django.utils.functional
import
cached_property
from
representatives_votes.contrib.parltrack.import_votes
import
\
vote_pre_import
...
...
@@ -23,6 +22,20 @@ class DossierScore(models.Model):
db_table
=
'representatives_recommendations_dossierscores'
class
VoteScore
(
models
.
Model
):
proposal
=
models
.
ForeignKey
(
Proposal
,
related_name
=
'votescores'
)
representative
=
models
.
ForeignKey
(
Representative
,
related_name
=
'votescores'
,
null
=
True
)
position
=
models
.
CharField
(
max_length
=
10
)
score
=
models
.
IntegerField
(
default
=
0
)
class
Meta
:
managed
=
False
ordering
=
[
'proposal__datetime'
]
db_table
=
'representatives_recommendations_votescores'
class
RepresentativeScore
(
models
.
Model
):
representative
=
models
.
OneToOneField
(
'representatives.representative'
,
primary_key
=
True
,
related_name
=
'score'
)
...
...
@@ -44,20 +57,6 @@ class Recommendation(models.Model):
ordering
=
[
'proposal__datetime'
]
class
ScoredVote
(
Vote
):
class
Meta
:
proxy
=
True
@
cached_property
def
absolute_score
(
self
):
recommendation
=
self
.
proposal
.
recommendation
if
self
.
position
==
recommendation
.
recommendation
:
return
recommendation
.
weight
else
:
return
-
recommendation
.
weight
def
skip_votes
(
sender
,
vote_data
=
None
,
**
kwargs
):
dossiers
=
getattr
(
sender
,
'memopol_filters'
,
None
)
...
...
@@ -94,9 +93,9 @@ def calculate_representative_score(representative):
proposal__recommendation
=
None
).
select_related
(
'proposal__recommendation'
)
votes
=
Scor
edVot
e
.
objects
.
filter
(
pk__in
=
votes
.
values_list
(
'pk'
))
votes
=
Vote
Score
.
objects
.
filter
(
pk__in
=
votes
.
values_list
(
'pk'
))
for
vote
in
votes
:
score
+=
vote
.
absolute_
score
score
+=
vote
.
score
return
score
representatives_recommendations/serializers.py
View file @
d7547a87
...
...
@@ -4,7 +4,7 @@ from .models import (
DossierScore
,
Recommendation
,
RepresentativeScore
,
Score
dVote
Vote
Score
)
...
...
@@ -30,16 +30,8 @@ class RepresentativeScoreSerializer(serializers.HyperlinkedModelSerializer):
fields
=
(
'representative'
,
'score'
)
class
ScoredVoteSerializer
(
serializers
.
HyperlinkedModelSerializer
):
"""
Scored Vote serializer
"""
class
VoteScoreSerializer
(
serializers
.
HyperlinkedModelSerializer
):
class
Meta
:
model
=
ScoredVote
fields
=
(
'proposal'
,
'representative'
,
'position'
,
'absolute_score'
)
model
=
VoteScore
fields
=
(
'proposal'
,
'representative'
,
'position'
,
'score'
)
templates/representatives/representative_detail.haml
View file @
d7547a87
...
...
@@ -34,7 +34,7 @@
%td
.icon-cell
=
vote
.
position
|
position_icon
%td
.icon-cell
=
vote
.
absolute_
score
|
score_label
=
vote
.
score
|
score_label
%h2
Mandates
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment