Browse Source

fix bug

devel
bashmak 9 years ago
parent
commit
417cab14ce
  1. 24
      abonapp/migrations/0012_auto_20170227_1718.py
  2. 62
      abonapp/models.py
  3. 8
      abonapp/templates/abonapp/complete_service.html
  4. 19
      abonapp/templates/abonapp/editAbon.html
  5. 21
      abonapp/views.py
  6. 14
      django_messages/locale/ru/LC_MESSAGES/django.po
  7. 0
      django_messages/signals.py
  8. 1
      django_messages/urls.py

24
abonapp/migrations/0012_auto_20170227_1718.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9 on 2017-02-27 14:18
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('abonapp', '0011_auto_20170222_2224'),
]
operations = [
migrations.RemoveField(
model_name='extrafieldsmodel',
name='account',
),
migrations.AddField(
model_name='abon',
name='extra_fields',
field=models.ManyToManyField(to='abonapp.ExtraFieldsModel'),
),
]

62
abonapp/models.py

@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.core.exceptions import ValidationError
from django.utils import timezone from django.utils import timezone
from django.db import models from django.db import models
from django.core import validators from django.core import validators
@ -104,15 +105,13 @@ class AbonTariff(models.Model):
# Считает текущую стоимость услуг согласно выбранной для тарифа логики оплаты (см. в документации) # Считает текущую стоимость услуг согласно выбранной для тарифа логики оплаты (см. в документации)
def calc_amount_service(self): def calc_amount_service(self):
calc_obj = self.tariff.get_calc_type()(self)
# calc_obj - instance of tariff_app.custom_tariffs.TariffBase
amount = calc_obj.calc_amount()
amount = self.tariff.amount
return round(amount, 2) return round(amount, 2)
# Активируем тариф # Активируем тариф
def activate(self, current_user): def activate(self, current_user):
calc_obj = self.tariff.get_calc_type()(self) calc_obj = self.tariff.get_calc_type()(self)
amnt = self.calc_amount_service()
amnt = self.tariff.amount
# если не хватает денег # если не хватает денег
if self.abon.ballance < amnt: if self.abon.ballance < amnt:
raise LogicError(_('not enough money')) raise LogicError(_('not enough money'))
@ -156,6 +155,36 @@ class AbonStreet(models.Model):
db_table = 'abon_street' db_table = 'abon_street'
class ExtraFieldsModel(models.Model):
DYNAMIC_FIELD_TYPES = (
('int', _('Digital field')),
('str', _('Text field')),
('dbl', _('Floating field'))
)
field_type = models.CharField(max_length=3, choices=DYNAMIC_FIELD_TYPES)
data = models.CharField(max_length=64, null=True, blank=True)
def clean(self):
d = self.data
if self.field_type == 'int':
validators.validate_integer(d)
elif self.field_type == 'dbl':
try:
float(d)
except ValueError:
raise ValidationError(_('Double invalid value'), code='invalid')
elif self.field_type == 'str':
str_validator = validators.MaxLengthValidator(64)
str_validator(d)
def __str__(self):
return "%s: %s" % (self.get_field_type_display(), self.data)
class Meta:
db_table = 'abon_extra_fields'
class Abon(UserProfile): class Abon(UserProfile):
current_tariffs = models.ManyToManyField(Tariff, through=AbonTariff) current_tariffs = models.ManyToManyField(Tariff, through=AbonTariff)
group = models.ForeignKey(AbonGroup, models.SET_NULL, blank=True, null=True) group = models.ForeignKey(AbonGroup, models.SET_NULL, blank=True, null=True)
@ -164,6 +193,7 @@ class Abon(UserProfile):
description = models.TextField(null=True, blank=True) description = models.TextField(null=True, blank=True)
street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True) street = models.ForeignKey(AbonStreet, on_delete=models.SET_NULL, null=True, blank=True)
house = models.CharField(max_length=12, null=True, blank=True) house = models.CharField(max_length=12, null=True, blank=True)
extra_fields = models.ManyToManyField(ExtraFieldsModel)
_act_tar_cache = None _act_tar_cache = None
@ -352,30 +382,6 @@ class AbonRawPassword(models.Model):
db_table = 'abon_raw_password' db_table = 'abon_raw_password'
class ExtraFieldsModel(models.Model):
DYNAMIC_FIELD_TYPES = (
('int', _('Digital field')),
('str', _('Text field')),
('dbl', _('Floating field'))
)
field_type = models.CharField(max_length=3, choices=DYNAMIC_FIELD_TYPES)
account = models.ForeignKey(Abon, on_delete=models.DO_NOTHING)
data = models.CharField(max_length=64, null=True, blank=True)
def clean(self):
val = None
if self.field_type == 'int':
val = validators.integer_validator
elif self.field_type == 'dbl':
val = validators.DecimalValidator(9, 6)
if val:
self.validators.append(val)
class Meta:
db_table = 'abon_extra_fields'
def abon_post_save(sender, instance, **kwargs): def abon_post_save(sender, instance, **kwargs):
try: try:
tm = Transmitter() tm = Transmitter()

8
abonapp/templates/abonapp/complete_service.html

@ -36,20 +36,18 @@ You complete tariff{% endblocktrans %}
{% endif %} {% endif %}
{% now "d F Y, H: i: s" as today %} {% now "d F Y, H: i: s" as today %}
{% blocktrans with time_start=abtar.time_start|date:'d F Y, H: i: s' amount=abtar.tariff.amount tcost=abtar.calc_amount_service %}The service has been connected: {{ time_start }}<br/>
{% blocktrans with time_start=abtar.time_start|date:'d F Y, H: i: s' amount=abtar.tariff.amount %}The service has been connected: {{ time_start }}<br/>
Today: {{ today }}<br/> Today: {{ today }}<br/>
Time of use: {{ time_use }}<br/> Time of use: {{ time_use }}<br/>
The total cost of the service: {{ amount }}<br/> The total cost of the service: {{ amount }}<br/>
Total cost: {{ tcost }}{% endblocktrans %}
Total cost: {{ tcost }}<br/>
Cashback: {{ cashback }}{% endblocktrans %}
</p> </p>
<div class="btn-group"> <div class="btn-group">
<button type="submit" class="btn btn-sm btn-primary"> <button type="submit" class="btn btn-sm btn-primary">
<span class="glyphicon glyphicon-save"></span> {% trans 'Save' %} <span class="glyphicon glyphicon-save"></span> {% trans 'Save' %}
</button> </button>
<button type="reset" class="btn btn-sm btn-default">
<span class="glyphicon glyphicon-remove-circle"></span> {% trans 'Reset' %}
</button>
</div> </div>
</form> </form>

19
abonapp/templates/abonapp/editAbon.html

@ -113,6 +113,25 @@
</div> </div>
</div> </div>
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Доп поля</h3>
</div>
<div class="panel-body">
<form role="form" class="form-horizontal" action="#" method="post">{% csrf_token %}
<div class="form-group-sm">
<label for="id_ip" class="col-sm-2 control-label">{% trans 'Ip Address' %}</label>
<div class="col-sm-10">
<input type="text" value="{{ ip|default:'' }}" class="form-control" name="ip" placeholder="192.168.0.101" pattern="^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"/>
</div>
</div>
</form> </form>
</div> </div>
</div> </div>

21
abonapp/views.py

@ -385,6 +385,12 @@ def chpriority(request, gid, uid):
@permission_required('abonapp.can_complete_service') @permission_required('abonapp.can_complete_service')
def complete_service(request, gid, uid, srvid): def complete_service(request, gid, uid, srvid):
abtar = get_object_or_404(models.AbonTariff, id=srvid) abtar = get_object_or_404(models.AbonTariff, id=srvid)
abon = abtar.abon
# считаем не использованные ресурсы
calc_obj = abtar.tariff.get_calc_type()(abtar)
# получаем сколько использовано
res_amount = calc_obj.calc_amount()
cashback = abtar.tariff.amount - res_amount
if int(abtar.abon.pk) != int(uid) or int(abtar.abon.group.pk) != int(gid): if int(abtar.abon.pk) != int(uid) or int(abtar.abon.group.pk) != int(gid):
# если что-то написали в урле вручную, то вернём на путь истинный # если что-то написали в урле вручную, то вернём на путь истинный
@ -394,6 +400,15 @@ def complete_service(request, gid, uid, srvid):
if request.method == 'POST': if request.method == 'POST':
# досрочно завершаем услугу # досрочно завершаем услугу
if request.POST.get('finish_confirm') == 'yes': if request.POST.get('finish_confirm') == 'yes':
if cashback > 0.5:
# возвращаем деньги, которые абонент не использовал
abon.add_ballance(
request.user,
cashback,
_('Refunds for unused resources')
)
abon.save(update_fields=['ballance'])
# удаляем запись о текущей услуге. # удаляем запись о текущей услуге.
abtar.delete() abtar.delete()
messages.success(request, _('Service has been finished successfully')) messages.success(request, _('Service has been finished successfully'))
@ -413,9 +428,11 @@ def complete_service(request, gid, uid, srvid):
return render(request, 'abonapp/complete_service.html', { return render(request, 'abonapp/complete_service.html', {
'abtar': abtar, 'abtar': abtar,
'abon': abtar.abon,
'abon': abon,
'time_use': time_use, 'time_use': time_use,
'abon_group': get_object_or_404(models.AbonGroup, id=gid)
'abon_group': get_object_or_404(models.AbonGroup, id=gid),
'tcost': round(res_amount, 4),
'cashback': round(cashback, 4)
}) })

14
django_messages/locale/ru/LC_MESSAGES/django.po

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-02-20 17:32+0300\n"
"POT-Creation-Date: 2017-02-28 12:46+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Dmitry Novikov nerosketch@gmail.com\n" "Last-Translator: Dmitry Novikov nerosketch@gmail.com\n"
"Language: ru\n" "Language: ru\n"
@ -322,11 +322,11 @@ msgstr "Сообщение успешно удалено."
msgid "Message successfully recovered." msgid "Message successfully recovered."
msgstr "Сообщение успешно восстановлено." msgstr "Сообщение успешно восстановлено."
msgid "The following usernames are incorrect: %(users)s"
msgstr "Некорректные имена пользователей: %(users)s"
#~ msgid "The following usernames are incorrect: %(users)s"
#~ msgstr "Некорректные имена пользователей: %(users)s"
msgid "New Message"
msgstr "Новое сообщение"
#~ msgid "New Message"
#~ msgstr "Новое сообщение"
msgid "Trash"
msgstr "Удалённые"
#~ msgid "Trash"
#~ msgstr "Удалённые"

0
django_messages/signals.py

1
django_messages/urls.py

@ -1,5 +1,4 @@
from django.conf.urls import url from django.conf.urls import url
from django.views.generic import RedirectView
from django_messages.views import * from django_messages.views import *

Loading…
Cancel
Save