Projet

Général

Profil

Télécharger (21,7 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / ressources / models.py @ fe0dcf03

1
# -*- coding: utf-8 -*-
2

    
3
from datetime import date, datetime
4
import bisect
5

    
6
from django.db import models
7
from django.db.models import query
8
from model_utils import Choices
9

    
10
from calebasse.models import PhoneNumberField, ZipCodeField
11

    
12
from model_utils.managers import PassThroughManager
13

    
14

    
15
class ServiceLinkedQuerySet(query.QuerySet):
16
    def for_service(self, service, allow_global=True):
17
        '''Allows service local and service global objects'''
18
        return self.filter(models.Q(service=service)
19
                |models.Q(service__isnull=allow_global))
20

    
21
ServiceLinkedManager = PassThroughManager.for_queryset_class(ServiceLinkedQuerySet)
22

    
23
class NamedAbstractModel(models.Model):
24
    name = models.CharField(max_length=150, verbose_name=u'Nom')
25

    
26
    def __unicode__(self):
27
        return self.name
28

    
29
    def __repr__(self):
30
        return '<%s %r>' % (self.__class__.__name__, unicode(self))
31

    
32
    class Meta:
33
        abstract = True
34
        ordering = ['name']
35

    
36
class ServiceLinkedAbstractModel(models.Model):
37
    objects = ServiceLinkedManager()
38
    service = models.ForeignKey('Service', null=True, blank=True)
39

    
40
    class Meta:
41
        abstract = True
42

    
43
DEST_TYPE = {
44
    # code grand regime: type destinataire
45
    '01': 'CT', # regime general
46
    '02': 'MA', # agricole
47
    '03': 'SR', # independant
48
    '04': 'CF', # sncf
49
    '05': 'RP', # ratp
50
    '06': 'EN', # invalide marine
51
    '07': 'RM', # minier
52
    '08': 'CM', # militaire
53
    '10': 'CE', # notaires
54
    '12': 'CI', # cci paris
55
    '14': 'AN', # assemblee nationale
56
    '15': 'SE', # senat
57
    '16': 'PB', # port autonome bordeaux
58
    '90': 'CC', # cultes
59
    '91': 'SM', # ensuite toutes les mutuelles nationales
60
    '92': 'SM',
61
    '93': 'SM',
62
    '94': 'SM',
63
    '95': 'SM',
64
    '96': 'SM',
65
    '99': 'SM',
66
}
67

    
68

    
69
class HealthCenter(NamedAbstractModel):
70
    class Meta:
71
        verbose_name = u'Centre d\'assurance maladie'
72
        verbose_name_plural = u'Centres d\'assurances maladie'
73

    
74
    def __unicode__(self):
75
        return self.large_regime.code + ' ' + self.health_fund + ' ' + self.code + ' ' + self.name
76

    
77
    code = models.CharField(verbose_name=u"Code du centre",
78
            max_length=4,
79
            null=True, blank=True)
80
    large_regime = models.ForeignKey('LargeRegime',
81
            verbose_name=u"Grand régime")
82
    dest_organism = models.CharField(max_length=8,
83
            verbose_name=u"Organisme destinataire")
84
    computer_center_code = models.CharField(max_length=8,
85
            verbose_name=u"Code centre informatique",
86
            null=True, default=True)
87
    abbreviation = models.CharField(verbose_name=u'Abbrévation',
88
            max_length=8,
89
            null=True, default=True)
90
    health_fund = models.CharField(verbose_name=u"Numéro de la caisse",
91
            max_length=3)
92
    active = models.BooleanField(default=True, verbose_name=u"Active")
93
    address = models.CharField(max_length=120, verbose_name=u"Adresse")
94
    address_complement = models.CharField(max_length=120, blank=True,
95
            null=True, default=None, verbose_name=u"Adresse complémentaire")
96
    zip_code = models.CharField(max_length=8, verbose_name=u"Code postal")
97
    city = models.CharField(max_length=80, verbose_name=u"Ville")
98
    phone = models.CharField(max_length=30, verbose_name=u"Téléphone")
99
    fax = models.CharField(max_length=30,
100
            null=True, blank=True, verbose_name=u"Fax")
101
    email = models.EmailField(
102
            null=True, blank=True, verbose_name=u"Courriel")
103
    accounting_number = models.CharField(max_length=30,
104
             null=True, blank=True, verbose_name=u"Numéro de compte")
105
    correspondant = models.CharField(max_length=80, verbose_name=u"Correspondant")
106
    hc_invoice = models.ForeignKey('HealthCenter',
107
            verbose_name=u"Centre pour facturation (optionnel)",
108
            null=True, blank=True, default=None)
109

    
110
    def b2_000(self):
111
        '''
112
        renvoie le numéro destinataire selon la norme B2, type 000
113
        '''
114
        return DEST_TYPE[self.large_regime.code] + '000000' + self.large_regime.code[0:2] + self.computer_center_code[0:3] + self.dest_organism[0:3]
115

    
116

    
117
class LargeRegime(NamedAbstractModel):
118
    class Meta:
119
        verbose_name = u'Grand régime'
120
        verbose_name_plural = u'Grands régimes'
121

    
122
    def __unicode__(self):
123
        return self.code + ' ' + self.name
124

    
125
    code = models.CharField(verbose_name=u"Code grand régime",
126
            max_length=2)
127

    
128

    
129
class TransportCompany(NamedAbstractModel):
130
    description = models.TextField(blank=True, null=True, default=None)
131
    address = models.CharField(max_length=120,
132
            verbose_name=u"Adresse", blank=True, null=True, default=None)
133
    address_complement = models.CharField(max_length=120,
134
            blank=True,
135
            null=True,
136
            default=None,
137
            verbose_name=u"Complément d'adresse")
138
    zip_code = ZipCodeField(verbose_name=u"Code postal",
139
        blank=True, null=True, default=None)
140
    city = models.CharField(max_length=80, verbose_name=u"Ville",
141
        blank=True, null=True, default=None)
142
    phone = PhoneNumberField(verbose_name=u"Téléphone",
143
        blank=True, null=True, default=None)
144
    fax = models.CharField(max_length=30,
145
            blank=True, null=True, default=None)
146
    email = models.EmailField(blank=True, null=True)
147
    correspondant = models.CharField(max_length=80, blank=True, null=True)
148
    old_camsp_id = models.CharField(max_length=256,
149
            verbose_name=u'Ancien ID au CAMSP', blank=True, null=True)
150
    old_cmpp_id = models.CharField(max_length=256,
151
            verbose_name=u'Ancien ID au CMPP', blank=True, null=True)
152
    old_sessad_dys_id = models.CharField(max_length=256,
153
            verbose_name=u'Ancien ID au SESSAD TED', blank=True, null=True)
154
    old_sessad_ted_id = models.CharField(max_length=256,
155
            verbose_name=u'Ancien ID au SESSAD DYS', blank=True, null=True)
156

    
157
    class Meta:
158
        verbose_name = u'Compagnie de transport'
159
        verbose_name_plural = u'Compagnies de transport'
160

    
161

    
162
class ManagementCode(NamedAbstractModel):
163
    class Meta:
164
        verbose_name = u'Code de gestion'
165
        verbose_name_plural = u'Codes de gestion'
166

    
167
    def __unicode__(self):
168
        return self.code + ' ' + self.name
169

    
170
    code = models.CharField(verbose_name=u"Code",
171
            max_length=10)
172
    old_id = models.CharField(max_length=256,
173
            verbose_name=u'Ancien ID', blank=True, null=True)
174

    
175

    
176
class UninvoicableCode(models.Model):
177
    class Meta:
178
        verbose_name = u'Code de non-facturation'
179
        verbose_name_plural = u'Codes de non-facturation'
180

    
181

    
182
class Office(NamedAbstractModel):
183
    class Meta:
184
        verbose_name = u'Établissement'
185
        verbose_name_plural = u'Établissements'
186

    
187
    def __unicode__(self):
188
        return self.name
189

    
190
    description = models.TextField(blank=True, null=True)
191

    
192
    # Contact
193
    phone = PhoneNumberField(verbose_name=u"Téléphone", blank=True, null=True)
194
    fax = PhoneNumberField(verbose_name=u"Fax", blank=True, null=True)
195
    email = models.EmailField(blank=True, null=True)
196

    
197
    # Address
198
    address = models.CharField(max_length=120,
199
            verbose_name=u"Adresse", blank=True, null=True, default=None)
200
    address_complement = models.CharField(max_length=120,
201
            blank=True,
202
            null=True,
203
            default=None,
204
            verbose_name=u"Complément d'adresse")
205
    zip_code = ZipCodeField(verbose_name=u"Code postal",
206
            blank=True, null=True, default=None)
207
    city = models.CharField(max_length=80, verbose_name=u"Ville",
208
            blank=True, null=True, default=None)
209

    
210
    # TODO: add this fields : finess, suite, dm, dpa, genre, categorie, statut_juridique, mft, mt, dmt
211

    
212
class SchoolType(NamedAbstractModel):
213
    class Meta:
214
        verbose_name = u'Type du lieu de socialisation'
215
        verbose_name_plural = u'Types du lieu de socialisation'
216

    
217
    services = models.ManyToManyField('ressources.Service')
218

    
219
class School(NamedAbstractModel):
220
    class Meta:
221
        verbose_name = u'Lieu de socialisation'
222
        verbose_name_plural = u'Lieux de socialisation'
223

    
224
    def __unicode__(self):
225
        if self.school_type.name != 'Inconnu':
226
            return unicode(self.school_type) + ' ' + self.name
227
        return self.name
228

    
229
    def save(self, **kwargs):
230
        self.display_name = ""
231
        if self.school_type.name != 'Inconnu':
232
            self.display_name = unicode(self.school_type) + ' ' + self.name
233
        else:
234
            self.display_name = self.name
235
        if self.address:
236
            self.display_name += u" - "  + self.address
237
        if self.private:
238
            self.display_name += u" (Privé)"
239
        else:
240
            self.display_name += u" (Public)"
241
        super(School, self).save(**kwargs)
242

    
243
    display_name = models.CharField(max_length=256,
244
            blank=True, null=True, default='')
245
    school_type = models.ForeignKey('ressources.SchoolType',
246
        verbose_name=u"Type d'établissement")
247
    description = models.TextField(blank=True, null=True, default=None)
248
    address = models.CharField(max_length=120,
249
            verbose_name=u"Adresse", blank=True, null=True, default=None)
250
    address_complement = models.CharField(max_length=120,
251
            blank=True,
252
            null=True,
253
            default=None,
254
            verbose_name=u"Complément d'adresse")
255
    zip_code = ZipCodeField(verbose_name=u"Code postal",
256
        blank=True, null=True, default=None)
257
    city = models.CharField(max_length=80, verbose_name=u"Ville",
258
        blank=True, null=True, default=None)
259
    phone = PhoneNumberField(verbose_name=u"Téléphone",
260
        blank=True, null=True, default=None)
261
    fax = models.CharField(max_length=30,
262
            blank=True, null=True, default=None)
263
    email = models.EmailField(blank=True, null=True, default=None)
264
    director_name = models.CharField(max_length=70,
265
            blank=True, null=True, default=None,
266
            verbose_name=u"Nom du directeur")
267
    old_id = models.CharField(max_length=256,
268
            verbose_name=u'Ancien ID', blank=True, null=True)
269
    old_service = models.CharField(max_length=256,
270
            verbose_name=u'Ancien Service', blank=True, null=True)
271
    private = models.BooleanField(verbose_name=u"Privé", default=False)
272
    services = models.ManyToManyField('ressources.Service', blank=True, null=True)
273

    
274

    
275
class SchoolTeacherRole(NamedAbstractModel):
276
    class Meta:
277
        verbose_name = u'Type de rôle des professeurs'
278
        verbose_name_plural = u'Types de rôle des professeurs'
279

    
280

    
281
class SchoolLevel(NamedAbstractModel):
282
    old_id = models.CharField(max_length=256,
283
            verbose_name=u'Ancien ID', blank=True, null=True)
284
    old_service = models.CharField(max_length=256,
285
            verbose_name=u'Ancien Service', blank=True, null=True)
286

    
287
    class Meta:
288
        verbose_name = u'Classe'
289
        verbose_name_plural = u'Classes'
290

    
291

    
292
class SocialisationDuration(models.Model):
293
    class Meta:
294
        verbose_name = u'Période de socialisation'
295
        verbose_name_plural = u'Périodes de socialisation'
296

    
297
    school = models.ForeignKey('ressources.School',
298
        verbose_name=u'Lieu de socialisation',
299
        blank=True, null=True)
300
    level = models.ForeignKey('ressources.SchoolLevel',
301
        verbose_name=u'Classe',
302
        blank=True, null=True)
303
    redoublement = models.BooleanField(verbose_name=u"Redoublement",
304
            default=False)
305
    start_date = models.DateField(verbose_name=u"Date d'arrivée")
306
    contact = models.CharField(verbose_name=u"Contact", max_length=200, blank=True, null=True, default=None)
307
    end_date = models.DateField(verbose_name=u"Date de départ",
308
        blank=True, null=True)
309
    created = models.DateTimeField(u'Création', auto_now_add=True)
310
    comment = models.TextField(max_length=3000,
311
        blank=True, null=True, verbose_name=u"Commentaire")
312

    
313

    
314
class InscriptionMotive(NamedAbstractModel):
315
    class Meta:
316
        verbose_name = u'Motif d\'inscription'
317
        verbose_name_plural = u'Motifs d\'inscription'
318

    
319

    
320
class Nationality(NamedAbstractModel):
321
    class Meta:
322
        verbose_name = u'Nationalité'
323
        verbose_name_plural = u'Nationalités'
324

    
325

    
326
class Job(NamedAbstractModel):
327
    class Meta:
328
        verbose_name = u'Profession'
329
        verbose_name_plural = u'Professions'
330

    
331

    
332
class RessourceQuerySet(query.QuerySet):
333
    def for_etablissement(self, etablissement):
334
        return self.filter(etablissement=etablissement)
335

    
336
    def for_service(self, service):
337
        return self.filter(etablissement__service=service)
338

    
339

    
340
class Ressource(NamedAbstractModel):
341
    objects = PassThroughManager.for_queryset_class(RessourceQuerySet)()
342
    etablissement = models.ForeignKey('Office')
343

    
344
    class Meta:
345
        verbose_name = u'Ressource'
346
        verbose_name_plural = u'Ressources'
347

    
348

    
349
class AnalyseMotive(NamedAbstractModel):
350
    class Meta:
351
        verbose_name = u"Motif analysé"
352
        verbose_name_plural = u"Motifs analysés"
353

    
354

    
355
class FamilyMotive(NamedAbstractModel):
356
    class Meta:
357
        verbose_name = u"Motif familiale"
358
        verbose_name_plural = u"Motifs familiaux"
359

    
360

    
361
class AdviceGiver(NamedAbstractModel):
362
    class Meta:
363
        verbose_name = u"Demandeur"
364
        verbose_name_plural = u"Demandeurs"
365

    
366

    
367
class Provenance(NamedAbstractModel):
368
    old_id = models.CharField(max_length=256,
369
            verbose_name=u'Ancien ID', blank=True, null=True)
370
    old_service = models.CharField(max_length=256,
371
            verbose_name=u'Ancien Service', blank=True, null=True)
372
    class Meta:
373
        verbose_name = u'Conseilleur'
374
        verbose_name_plural = u'Conseilleurs'
375

    
376

    
377
class ProvenancePlace(NamedAbstractModel):
378
    class Meta:
379
        verbose_name = u'Lieu de provenance'
380
        verbose_name_plural = u'Lieux de provenance'
381

    
382

    
383
class OutMotive(NamedAbstractModel):
384
    class Meta:
385
        verbose_name = u"Motif de sortie"
386
        verbose_name_plural = u"Motifs de sortie"
387

    
388

    
389
class OutTo(NamedAbstractModel):
390
    class Meta:
391
        verbose_name = u"Orientation de sortie"
392
        verbose_name_plural = u"Orientations de sortie"
393

    
394

    
395
class Service(NamedAbstractModel):
396
    admin_only = True
397

    
398
    slug = models.SlugField()
399
    description = models.TextField()
400

    
401
    # Contact
402
    phone = PhoneNumberField(verbose_name=u"Téléphone")
403
    fax = PhoneNumberField(verbose_name=u"Fax")
404
    email = models.EmailField()
405

    
406
    class Meta:
407
        verbose_name = u'Service'
408
        verbose_name_plural = u'Services'
409

    
410

    
411
class ActTypeQuerySet(query.QuerySet):
412
    def for_service(self, service):
413
        return self.filter(service=service)
414

    
415
class ActType(NamedAbstractModel, ServiceLinkedAbstractModel):
416
    objects = PassThroughManager.for_queryset_class(ActTypeQuerySet)()
417
    billable = models.BooleanField(default=True, verbose_name=u"Facturable")
418
    old_id = models.CharField(max_length=256,
419
            verbose_name=u'Ancien ID', blank=True, null=True)
420
    display_first = models.BooleanField(default=False, verbose_name=u"Acte principalement utilisé")
421
    group = models.BooleanField(default=False, verbose_name=u'De groupe')
422

    
423
    class Meta(NamedAbstractModel.Meta):
424
        verbose_name = u'Type d\'actes'
425
        verbose_name_plural = u'Types d\'actes'
426
        ordering = ('-display_first','name')
427

    
428
class ParentalAuthorityType(NamedAbstractModel):
429
    class Meta:
430
        verbose_name = u'Type d\'autorité parentale'
431
        verbose_name_plural = u'Types d\'autorités parentales'
432

    
433

    
434
class ParentalCustodyType(NamedAbstractModel):
435
    class Meta:
436
        verbose_name = u'Type de gardes parentales'
437
        verbose_name_plural = u'Types de gardes parentales'
438

    
439

    
440
class SessionType(NamedAbstractModel):
441
    class Meta:
442
        verbose_name = u'Type de séance'
443
        verbose_name_plural = u'Types de séances'
444

    
445

    
446
class FamilySituationType(NamedAbstractModel):
447
    class Meta:
448
        verbose_name = u'Type de situation familiale'
449
        verbose_name_plural = u'Types de situations familiales'
450

    
451

    
452
class MaritalStatusType(NamedAbstractModel):
453
    class Meta:
454
        verbose_name = u'Régime matrimonial'
455
        verbose_name_plural = u'Régimes matrimoniaux'
456

    
457

    
458
class TransportType(NamedAbstractModel):
459
    class Meta:
460
        verbose_name = u'Type de transport'
461
        verbose_name_plural = u'Types de transports'
462

    
463

    
464
class WorkerType(NamedAbstractModel):
465
    intervene = models.BooleanField(
466
            verbose_name=u'Intervenant',
467
            blank=True)
468

    
469
    class Meta:
470
        verbose_name = u'Type de personnel'
471
        verbose_name_plural = u'Types de personnel'
472

    
473

    
474
AXIS =  Choices(
475
        (1, 'Axe I : catégories cliniques'),
476
        (2, 'Axe II : facteurs organiques'),
477
        (3, 'Axe II : facteurs environnementaux'),
478
)
479

    
480
class CodeCFTMEA(NamedAbstractModel):
481
    code = models.IntegerField(verbose_name=u"Code")
482
    axe = models.IntegerField(verbose_name=u"Axe", choices=AXIS,
483
            max_length=1)
484
    ordering_code = models.CharField(max_length=20, blank=True, null=True,
485
            verbose_name=u"Classification")
486

    
487
    def __unicode__(self):
488
        return "%s %s" % (self.ordering_code, self.name)
489

    
490
    class Meta:
491
        ordering = ['ordering_code']
492
        verbose_name = u'Code CFTMEA'
493
        verbose_name_plural = u'Codes CFTMEA'
494

    
495
class MDPH(models.Model):
496
    class Meta:
497
        verbose_name = u'Etablissement MDPH'
498
        verbose_name_plural = u'Etablissements MDPH'
499

    
500
    def __unicode__(self):
501
        return self.department
502

    
503
    department = models.CharField(max_length=200,
504
            verbose_name=u"Département")
505

    
506
    description = models.TextField(blank=True, null=True)
507

    
508
    # Contact
509
    phone = PhoneNumberField(verbose_name=u"Téléphone", blank=True, null=True)
510
    fax = PhoneNumberField(verbose_name=u"Fax", blank=True, null=True)
511
    email = models.EmailField(blank=True, null=True)
512
    website = models.CharField(max_length=200,
513
            verbose_name=u"Site Web", blank=True, null=True)
514

    
515
    # Address
516
    address = models.CharField(max_length=120,
517
            verbose_name=u"Adresse", blank=True, null=True)
518
    address_complement = models.CharField(max_length=120,
519
            blank=True,
520
            null=True,
521
            default=None,
522
            verbose_name=u"Complément d'addresse")
523
    zip_code = ZipCodeField(verbose_name=u"Code postal",
524
        blank=True, null=True)
525
    city = models.CharField(max_length=80,
526
            verbose_name=u"Ville", blank=True, null=True)
527

    
528
class MDPHRequest(models.Model):
529
    class Meta:
530
        verbose_name = u'Demande MDPH'
531
        verbose_name_plural = u'Demandes MDPH'
532

    
533
    start_date = models.DateField(verbose_name=u"Date de la demande")
534
    mdph = models.ForeignKey('ressources.MDPH',
535
            verbose_name=u"MDPH")
536
    comment = models.TextField(max_length=3000,
537
        blank=True, null=True, verbose_name=u"Commentaire")
538
    created = models.DateTimeField(u'Création', auto_now_add=True)
539

    
540
MDPH_HELP =  Choices(
541
        (0, "Non défini"),
542
        (1, "AEEH (Allocation d'éducation de l'enfant handicapé)"),
543
        (2, 'AVS (Assistant de vie scolaire)'),
544
        (3, 'EVS (Emplois de vie scolaire)'),
545
)
546

    
547
class MDPHResponse(models.Model):
548
    class Meta:
549
        verbose_name = u'Réponse MDPH'
550
        verbose_name_plural = u'Réponses MDPH'
551

    
552
    start_date = models.DateField(verbose_name=u"Date de début")
553
    end_date = models.DateField(verbose_name=u"Date de fin")
554
    mdph = models.ForeignKey('ressources.MDPH',
555
            verbose_name=u"MDPH")
556
    comment = models.TextField(max_length=3000,
557
        blank=True, null=True, verbose_name=u"Commentaire")
558
    created = models.DateTimeField(u'Création', auto_now_add=True)
559
    type_aide = models.IntegerField(verbose_name=u"Type d'aide", choices=MDPH_HELP,
560
            max_length=1, default=0)
561
    name =  models.CharField(max_length=200,
562
            verbose_name=u"Nom", blank=True, null=True)
563
    rate =  models.CharField(max_length=10,
564
            verbose_name=u"Taux", blank=True, null=True)
565

    
566

    
567
class HolidayType(NamedAbstractModel):
568
    for_group = models.BooleanField(
569
            verbose_name=u'Absence de groupe',
570
            blank=True)
571

    
572
    class Meta:
573
        verbose_name = u"Type d'absence"
574
        verbose_name_plural = u"Types d'absence"
575

    
576
class PatientRelatedLink(NamedAbstractModel):
577
    old_camsp_id = models.CharField(max_length=256,
578
            verbose_name=u'Ancien ID au CAMSP', blank=True, null=True)
579
    old_cmpp_id = models.CharField(max_length=256,
580
            verbose_name=u'Ancien ID au CMPP', blank=True, null=True)
581
    old_sessad_dys_id = models.CharField(max_length=256,
582
            verbose_name=u'Ancien ID au SESSAD TED', blank=True, null=True)
583
    old_sessad_ted_id = models.CharField(max_length=256,
584
            verbose_name=u'Ancien ID au SESSAD DYS', blank=True, null=True)
585
    class Meta:
586
        verbose_name = u'Type de lien avec le patient (parenté)'
587
        verbose_name_plural = u'Types de lien avec le patient (parenté)'
588

    
589
class PricePerAct(models.Model):
590
    price = models.DecimalField(verbose_name=u"Tarif", max_digits=5, decimal_places=2)
591
    start_date = models.DateField(verbose_name=u"Prise d'effet")
592

    
593
    class Pricing(object):
594
        def __init__(self, ppas):
595
            ppas = ppas.order_by('start_date')
596
            self.dates = [ppa.start_date for ppa in ppas]
597
            self.ppas = list(ppas)
598

    
599
        def price_at_date(self, date):
600
            i = bisect.bisect(self.dates, date)
601
            if i == 0:
602
                raise RuntimeError('No existing price at date %s' % date)
603
            return self.ppas[i-1].price
604

    
605
    class Meta:
606
        verbose_name = u"Tarif horaire de l'acte"
607
        verbose_name_plural = u"Tarifs horaires de l'acte"
608

    
609
    @classmethod
610
    def pricing(cls):
611
        return cls.Pricing(cls.objects.all())
612

    
613
    @classmethod
614
    def get_price(cls, at_date=None):
615
        if not at_date:
616
            at_date = date.today()
617
        if isinstance(at_date, datetime):
618
            at_date = date(day=at_date.day, month=at_date.month,
619
                year=at_date.year)
620
        found = cls.objects.filter(start_date__lte = at_date).latest('start_date')
621
        if not found:
622
            raise Exception('No price to apply')
623
        return found.price
624

    
625
    def __unicode__(self):
626
        return str(self.price) + ' (' + str(self.start_date) + ')'
(4-4/7)