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.
88 lines
2.9 KiB
88 lines
2.9 KiB
#!/usr/bin/env python3
|
|
import os
|
|
from threading import Thread
|
|
import django
|
|
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djing.settings")
|
|
django.setup()
|
|
from django.utils import timezone
|
|
from django.db import transaction
|
|
from django.db.models import signals, Count
|
|
from abonapp.models import Abon, AbonTariff, abontariff_pre_delete, PeriodicPayForId, AbonLog
|
|
from ip_pool.models import IpLeaseModel
|
|
from nas_app.nas_managers import NasNetworkError, NasFailedResult
|
|
from nas_app.models import NASModel
|
|
from djing.lib import LogicError
|
|
|
|
|
|
class NasSyncThread(Thread):
|
|
def __init__(self, nas):
|
|
super(NasSyncThread, self).__init__()
|
|
self.nas = nas
|
|
|
|
def run(self):
|
|
try:
|
|
tm = self.nas.get_nas_manager()
|
|
users = Abon.objects \
|
|
.annotate(ips_count=Count('ip_addresses')) \
|
|
.filter(is_active=True, ips_count__gt=0, nas=self.nas) \
|
|
.exclude(current_tariff=None) \
|
|
.prefetch_related('ip_addresses') \
|
|
.iterator()
|
|
tm.sync_nas(users)
|
|
except NasNetworkError as er:
|
|
print('NetworkTrouble:', er)
|
|
except NASModel.DoesNotExist:
|
|
raise NotImplementedError
|
|
|
|
|
|
def main():
|
|
signals.pre_delete.disconnect(abontariff_pre_delete, sender=AbonTariff)
|
|
AbonTariff.objects.filter(abon=None).delete()
|
|
now = timezone.now()
|
|
fields = ('id', 'tariff__title', 'abon__id')
|
|
expired_services = AbonTariff.objects.filter(deadline__lt=now).exclude(abon=None)
|
|
|
|
# finishing expires services
|
|
with transaction.atomic():
|
|
for ex_srv in expired_services.only(*fields).values(*fields):
|
|
log = AbonLog.objects.create(
|
|
abon_id=ex_srv['abon__id'],
|
|
amount=0,
|
|
author=None,
|
|
date=now,
|
|
comment="Срок действия услуги '%(service_name)s' истёк" % {
|
|
'service_name': ex_srv['tariff__title']
|
|
}
|
|
)
|
|
print(log)
|
|
expired_services.delete()
|
|
signals.pre_delete.connect(abontariff_pre_delete, sender=AbonTariff)
|
|
|
|
# manage periodic pays
|
|
ppays = PeriodicPayForId.objects.filter(next_pay__lt=now) \
|
|
.prefetch_related('account', 'periodic_pay')
|
|
for pay in ppays:
|
|
pay.payment_for_service(now=now)
|
|
|
|
# Remove old inactive ip leases
|
|
old_leases = IpLeaseModel.objects.expired()
|
|
old_leases.delete()
|
|
|
|
# sync subscribers on NAS
|
|
threads = tuple(NasSyncThread(nas) for nas in NASModel.objects.
|
|
annotate(usercount=Count('abon')).
|
|
filter(usercount__gt=0))
|
|
for t in threads:
|
|
t.start()
|
|
for t in threads:
|
|
t.join()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except (NasNetworkError, NasFailedResult) as e:
|
|
print("Error while sync nas:", e)
|
|
except LogicError as e:
|
|
print("Notice while sync nas:", e)
|