models.py 3.21 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
luxcem's avatar
luxcem committed
25

Arnaud Fabre's avatar
Arnaud Fabre committed
26 27
from representatives.models import Representative, Group, Country
from representatives_votes.models import Vote
luxcem's avatar
luxcem committed
28

Arnaud Fabre's avatar
Arnaud Fabre committed
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
class MemopolRepresentative(Representative):
    
    representative_remote_id = models.CharField(max_length=255, unique=True)
    country = models.ForeignKey(Country, null=True)
    score = models.IntegerField(default=0)
    
    def update_score(self):
        score = 0
        for vote in self.representative.votes.all():
            proposal = vote.m_proposal
            if proposal.recommendation:
                recommendation = proposal.recommendation
                if vote.position != recommendation.recommendation:
                    score -= recommendation.weight
                else:
                    score += recommendation.weight
        self.score = score
luxcem's avatar
luxcem committed
46 47 48
        self.save()

    def update_country(self):
Arnaud Fabre's avatar
Arnaud Fabre committed
49
        # Create a country if it does'nt exist
luxcem's avatar
luxcem committed
50 51
        # The representative's country is the one associated
        # with the last 'country' mandate
Arnaud Fabre's avatar
Arnaud Fabre committed
52 53 54 55 56 57 58 59 60 61 62
        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
63

Arnaud Fabre's avatar
Arnaud Fabre committed
64 65 66 67 68 69 70 71 72 73 74 75 76 77
        except ObjectDoesNotExist:
            self.country = None
            self.save()


    # @property
    # def votes(self):
        # return Vote.objects.filter(
            # representative_remote_id = self.remote_id
        # )

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

Arnaud Fabre's avatar
Arnaud Fabre committed
80 81 82 83 84 85 86 87 88 89
    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
90

Arnaud Fabre's avatar
Arnaud Fabre committed
91 92 93 94 95 96
class MemopolGroup(Group):
    group = models.OneToOneField(
        Group,
        parent_link = True
    )
    
97 98 99 100
    active = models.BooleanField(default=False)

    def update_active(self):
        self.active = False
Arnaud Fabre's avatar
Arnaud Fabre committed
101 102
        for mandate in self.mandates.all():
            if mandate.end_date > datetime.date(datetime.now()):
103 104 105 106 107
                self.active = True
                break
        self.save()