models.py 3.93 KB
Newer Older
Arnaud Fabre's avatar
Arnaud Fabre committed
1
# coding: utf-8
luxcem's avatar
luxcem committed
2

Arnaud Fabre's avatar
Arnaud Fabre committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# This file is part of memopol.
#
# memopol is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of
# the License, or any later version.
#
# memopol is distributed in the hope that it will
# be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU General Affero Public
# License along with django-representatives.
# If not, see <http://www.gnu.org/licenses/>.
#
# Copyright (C) 2015 Arnaud Fabre <af@laquadrature.net>
luxcem's avatar
luxcem committed
20

Arnaud Fabre's avatar
Arnaud Fabre committed
21
from datetime import datetime
luxcem's avatar
luxcem committed
22

Arnaud Fabre's avatar
Arnaud Fabre committed
23
24
from django.db import models
from django.core.exceptions import ObjectDoesNotExist
Arnaud Fabre's avatar
Arnaud Fabre committed
25
26
27
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.functional import cached_property
luxcem's avatar
luxcem committed
28

Arnaud Fabre's avatar
Arnaud Fabre committed
29
from representatives.models import Representative, Mandate, Country
Arnaud Fabre's avatar
Arnaud Fabre committed
30
from representatives_votes.models import Vote
Arnaud Fabre's avatar
Arnaud Fabre committed
31
from core.utils import create_child_instance_from_parent
luxcem's avatar
luxcem committed
32

Arnaud Fabre's avatar
Arnaud Fabre committed
33

34
class MemopolRepresentative(Representative):
Arnaud Fabre's avatar
Arnaud Fabre committed
35
    
36
37
    # parent_identifier = 'fingerprint'
    # representative_finger = models.CharField(max_length=255, unique=True)
Arnaud Fabre's avatar
Arnaud Fabre committed
38
39
40
41
42
43
    
    country = models.ForeignKey(Country, null=True)
    score = models.IntegerField(default=0)
    
    def update_score(self):
        score = 0
Arnaud Fabre's avatar
Arnaud Fabre committed
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
        for vote in self.votes.all():
            proposal = vote.proposal
            try:
                if proposal.recommendation:
                    recommendation = proposal.recommendation
                    if ( vote.position != recommendation.recommendation
                         and (
                             vote.position == 'abstain' or
                             recommendation.recommendation == 'abstain' )):
                        score -= (recommendation.weight / 2)
                    elif vote.position != recommendation.recommendation:
                        score -= recommendation.weight
                    else:
                        score += recommendation.weight
            except Exception:
                pass

Arnaud Fabre's avatar
Arnaud Fabre committed
61
        self.score = score
luxcem's avatar
luxcem committed
62
63
64
        self.save()

    def update_country(self):
Arnaud Fabre's avatar
Arnaud Fabre committed
65
        # Create a country if it does'nt exist
luxcem's avatar
luxcem committed
66
67
        # The representative's country is the one associated
        # with the last 'country' mandate
Arnaud Fabre's avatar
Arnaud Fabre committed
68
69
70
71
72
73
74
75
76
77
78
        try:
            country_mandate = self.mandates.filter(
                group__kind='country'
            ).order_by('-begin_date')[0:1].get()

            country, _ = Country.objects.get_or_create(
                name=country_mandate.group.name,
                code=country_mandate.group.abbreviation
            )
            self.country = country
            self.save()
luxcem's avatar
luxcem committed
79

Arnaud Fabre's avatar
Arnaud Fabre committed
80
81
82
83
84
        except ObjectDoesNotExist:
            self.country = None
            self.save()


Arnaud Fabre's avatar
Arnaud Fabre committed
85
86
87
88
89
    @cached_property
    def votes(self):
        return Vote.objects.filter(
            representative_remote_id = self.remote_id
        )
Arnaud Fabre's avatar
Arnaud Fabre committed
90
91
92
93

    def active_mandates(self):
        return self.mandates.filter(
            end_date__gte=datetime.now()
luxcem's avatar
luxcem committed
94
95
        )

Arnaud Fabre's avatar
Arnaud Fabre committed
96
97
98
99
100
101
102
103
104
105
    def former_mandates(self):
        return self.mandates.filter(
            end_date__lte=datetime.now()
        )
    
    def current_group_mandate(self):
        return self.mandates.get(
            end_date__gte=datetime.now(),
            group__kind='group'
        )
luxcem's avatar
luxcem committed
106

Arnaud Fabre's avatar
Arnaud Fabre committed
107
108
@receiver(post_save, sender=Representative)
def create_memopolrepresentative_from_representative(instance, **kwargs):
109
    create_child_instance_from_parent(MemopolRepresentative, instance)
Arnaud Fabre's avatar
Arnaud Fabre committed
110
111
112
113
114
115
116


@receiver(post_save, sender=Mandate)
def update_memopolrepresentative_country(instance, created, **kwargs):
    return
    if not created:
        return
117

Arnaud Fabre's avatar
Arnaud Fabre committed
118
119
120
    # Update representative country
    if instance.group.kind == 'country' and instance.representative.extra.country == None:
        instance.representative.extra.update_country()
121