You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.3 KiB
53 lines
2.3 KiB
# -*- coding: utf-8 -*-
|
|
from django.db import models
|
|
from custom_tariffs import TariffBase, TARIFF_CHOICES
|
|
from mydefs import MyChoicesAdapter
|
|
from agent import get_TransmitterClientKlass
|
|
|
|
|
|
# Класс похож на адаптер. Предназначен для Django CHOICES чтоб можно было передавать классывместо просто описания поля,
|
|
# классы передавать для того чтоб по значению из базы понять какой класс нужно взять для расчёта стоимости тарифа.
|
|
class _TariffChoicesAdapter(MyChoicesAdapter):
|
|
|
|
# На вход принимает кортеж кортежей, вложенный из 2х элементов: кода и класса, как: TARIFF_CHOICES
|
|
def __init__(self):
|
|
super(_TariffChoicesAdapter, self).__init__(TARIFF_CHOICES)
|
|
|
|
|
|
class Tariff(models.Model):
|
|
title = models.CharField(max_length=32)
|
|
speedIn = models.FloatField(default=0.0)
|
|
speedOut = models.FloatField(default=0.0)
|
|
amount = models.FloatField(default=0.0)
|
|
time_of_action = models.IntegerField(default=30)
|
|
calc_type = models.CharField(max_length=2, default=TARIFF_CHOICES[0][0], choices=_TariffChoicesAdapter())
|
|
|
|
# Возвращает потомок класса TariffBase, методы которого дают нужную логику оплаты по тарифу
|
|
def get_calc_type(self):
|
|
ob = filter(lambda TC: TC[0] == self.calc_type, TARIFF_CHOICES)
|
|
if len(ob) > 0:
|
|
res_type = ob[0][1]
|
|
assert issubclass(res_type, TariffBase)
|
|
return res_type()
|
|
|
|
def __unicode__(self):
|
|
return u"%s (%f)" % (self.title, self.amount)
|
|
|
|
|
|
def tariff_save_signal(sender, instance, **kwargs):
|
|
assert isinstance(instance, Tariff)
|
|
tc = get_TransmitterClientKlass()()
|
|
if kwargs['created']:
|
|
tc.signal_tariff_create(instance)
|
|
else:
|
|
tc.signal_tariff_refresh(instance)
|
|
|
|
|
|
def tariff_remove_signal(sender, instance, **kwargs):
|
|
assert isinstance(instance, Tariff)
|
|
tc = get_TransmitterClientKlass()()
|
|
tc.signal_tariff_remove(instance)
|
|
|
|
|
|
models.signals.pre_save.connect(tariff_save_signal, sender=Tariff)
|
|
models.signals.post_delete.connect(tariff_remove_signal, sender=Tariff)
|