From ed3942377244d6bb884566ccefc1ec869d92511d Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 23 Mar 2017 16:53:02 +0300 Subject: [PATCH] license: no magic numbers --- project/customer/consts.py | 41 +++++++++++++++++++------- project/customer/context_processors.py | 17 +++++++---- project/customer/models.py | 27 ++++++++--------- project/customer/tasks.py | 9 +++--- project/customer/utils.py | 23 ++++++++++----- 5 files changed, 75 insertions(+), 42 deletions(-) diff --git a/project/customer/consts.py b/project/customer/consts.py index ed42452..3770a68 100644 --- a/project/customer/consts.py +++ b/project/customer/consts.py @@ -8,22 +8,43 @@ PROFILE_TYPES = ( (ORG_PROFILE, u'Организация'), ) +# лицензии + +LICENSE_PAY_DAYS = 10 # дней на оплату счёта +LICENSE_LEFT_DAYS = 15 # осталось дней до конца лицензии + +LICENSE_TEST_PERIOD_TERM = 0 # тип срока: пробный период. это особый тип, никак не связанный с моделью LicensePrice +LICENSE_TEST_PERIOD_DAYS = 45 # длительность пробного периода в днях + +LICENSE_TEST_PERIOD = -1 +LICENSE_UNPAID = 0 +LICENSE_PAID = 1 +LICENSE_ACTIVE = 2 +LICENSE_EXPIRED = 3 +LICENSE_SUSPENDED = 4 + LICENSE_STATUSES = ( - (-1, u'Пробный период'), - (0, u'Не оплачен'), - (1, u'Оплачен'), - (2, u'Активирован'), - (3, u'Срок действия истёк'), - (4, u'Заморожен'), + (LICENSE_TEST_PERIOD, u'Пробный период'), + (LICENSE_UNPAID, u'Не оплачен'), + (LICENSE_PAID, u'Оплачен'), + (LICENSE_ACTIVE, u'Активирован'), + (LICENSE_EXPIRED, u'Срок действия истёк'), + (LICENSE_SUSPENDED, u'Заморожен'), ) +PAYFORM_FREE = -1 +PAYFORM_BEZNAL = 0 +PAYFORM_CARD = 1 +# PAYFORM_SBER_KVITANZ = 2 + PAYFORMS = ( - (-1, u'Бесплатно'), - (0, u'Безналичный расчёт'), - (1, u'Банковская карта'), -# (2, u'Квитанция Сбербанка'), + (PAYFORM_FREE, u'Бесплатно'), + (PAYFORM_BEZNAL, u'Безналичный расчёт'), + (PAYFORM_CARD, u'Банковская карта'), +# (PAYFORM_SBER_KVITANZ, u'Квитанция Сбербанка'), ) +# типы сроков для модели LicensePrice TERMS = ( (1, u'1 месяц'), (6, u'6 месяцев'), diff --git a/project/customer/context_processors.py b/project/customer/context_processors.py index 7872f64..7edabc0 100644 --- a/project/customer/context_processors.py +++ b/project/customer/context_processors.py @@ -4,6 +4,9 @@ from django.core.cache import cache from .models import License +cache_duration = 3600 + + def license_check_soon_ends(request): try: license_cookie = request.COOKIES.get('close_message_license') @@ -12,21 +15,23 @@ def license_check_soon_ends(request): cur_license = cache.get('cur_license_%s' % (request.user.username,), None) if not days_left or not cur_license: now = datetime.today() - cur_license = License.objects.filter(company=request.user.profile, date_from__lte=now, date_to__gte=now, status__in=[-1, 1, 2], deleted=False) + cur_license = License.objects.filter(company=request.user.profile, date_from__lte=now, date_to__gte=now, + status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_PAID, consts.LICENSE_ACTIVE], deleted=False) if cur_license: cur_license = cur_license[0] days_left = (cur_license.date_to - now.date()).days - cache.set('days_left_%s' % (request.user.username,), days_left, 3600) - cache.set('cur_license_%s' % (request.user.username,), cur_license, 3600) + cache.set('days_left_%s' % (request.user.username,), days_left, cache_duration) + cache.set('cur_license_%s' % (request.user.username,), cur_license, cache_duration) if not license_cookie: now = datetime.today() if license_15days is None: - licenses_ends = License.objects.filter(company=request.user.profile, date_to__lte=now + timedelta(15), status__in=[-1, 1, 2], deleted=False) - next_licenses = License.objects.filter(company=request.user.profile, status=1, deleted=False) + licenses_ends = License.objects.filter(company=request.user.profile, date_to__lte=now + timedelta(consts.LICENSE_LEFT_DAYS), + status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_PAID, consts.LICENSE_ACTIVE], deleted=False) + next_licenses = License.objects.filter(company=request.user.profile, status=consts.LICENSE_PAID, deleted=False) if licenses_ends and not next_licenses: days_to_end = licenses_ends[0].date_to - cache.set('license_15_%s' % (request.user.username,), days_to_end, 3600) + cache.set('license_15_%s' % (request.user.username,), days_to_end, cache_duration) license_15days = days_to_end else: license_15days = '' diff --git a/project/customer/models.py b/project/customer/models.py index 0ecc6ce..f7628fa 100644 --- a/project/customer/models.py +++ b/project/customer/models.py @@ -418,9 +418,9 @@ class License(models.Model): date_from = models.DateField(u'дата начала', null=True, blank=True) date_to = models.DateField(u'дата окончания', null=True, blank=True) payform = models.IntegerField(verbose_name=u'форма оплаты', - choices=consts.PAYFORMS, default=0) + choices=consts.PAYFORMS, default=consts.PAYFORM_BEZNAL) status = models.IntegerField(verbose_name=u'статус лицензии', - choices=consts.LICENSE_STATUSES, default=0) + choices=consts.LICENSE_STATUSES, default=consts.LICENSE_UNPAID) order_date = models.DateField(verbose_name=u'дата заказа', auto_now_add=True) paid_date = models.DateField(verbose_name=u'дата оплаты', null=True, blank=True) pay_sum= models.IntegerField(verbose_name=u'сумма оплаты') @@ -449,7 +449,7 @@ class License(models.Model): self.date_to = self.date_from + relativedelta(months=self.term, days=-1) self.company.active = True self.company.save() - self.status = 1 + self.status = consts.LICENSE_PAID utils.check_one_profile(self.company, License, datetime.now(), manual=True) super(License, self).save(*args, **kwargs) @@ -458,31 +458,30 @@ class License(models.Model): return self.company.get_company_name() def get_action_link(self): - - if self.status == 0: - if self.payform == 0: + if self.status == consts.LICENSE_UNPAID: + if self.payform == consts.PAYFORM_BEZNAL: return u'Скачать счёт' % reverse('customer_license_get_doc', kwargs={'order_num': self.id}) - elif self.payform == 1: + elif self.payform == consts.PAYFORM_CARD: return u'Оплатить счёт' - elif self.payform == 2: + elif self.payform == consts.PAYFORM_SBER_KVITANZ: # не используется. однако могут быть старые лицензии с данной формой оплаты return u'Скачать квитанцию' % reverse('customer_license_get_doc', kwargs={'order_num': self.id}) - elif self.status in [1, 2]: + elif self.status in [consts.LICENSE_PAID, consts.LICENSE_ACTIVE]: return u'История операций' else: return '' def get_term(self): - if self.term == 0: - return u'45 дней' + if self.term == consts.LICENSE_TEST_PERIOD_TERM: + return u'%d дней' % consts.LICENSE_TEST_PERIOD_DAYS else: return u'%s %s' % (self.term, numeral.choose_plural(self.term, u"месяц, месяца, месяцев"), ) def get_paid_status(self): - if self.status == 1: + if self.status == consts.LICENSE_PAID: return u'Лицензия оплачена, ещё не активирована' - elif self.status in [2, -1]: + elif self.status in [consts.LICENSE_ACTIVE, consts.LICENSE_TEST_PERIOD]: left = relativedelta(self.date_to, datetime.today()) if left.months: left_str = '%d %s %d %s' % (left.months, @@ -496,7 +495,7 @@ class License(models.Model): numeral.choose_plural(left.days, u"день, дня, дней"), ) return u'Лицензия активирована: осталось %s' % left_str - elif self.status == 3: + elif self.status == consts.LICENSE_EXPIRED: return u'Время истекло' else: return None diff --git a/project/customer/tasks.py b/project/customer/tasks.py index 36cd88c..c8e1e54 100644 --- a/project/customer/tasks.py +++ b/project/customer/tasks.py @@ -9,6 +9,7 @@ from celery import shared_task from .models import License, UserProfile from .utils import check_one_profile +from project.customer import consts @shared_task @@ -16,11 +17,11 @@ def check_license(): profiles = UserProfile.objects.all() now = datetime.today() - #licenses = License.objects.filter(date_to__lt=now, status__in=[-1, 2], deleted=False) - #licenses.update(status=3) + #licenses = License.objects.filter(date_to__lt=now, status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE], deleted=False) + #licenses.update(status=consts.LICENSE_EXPIRED) - licenses = License.objects.filter(order_date__lte=now - timedelta(10), status=0, deleted=False) - licenses.update(status=4) + licenses = License.objects.filter(order_date__lte=now - timedelta(consts.LICENSE_PAY_DAYS), status=consts.LICENSE_UNPAID, deleted=False) + licenses.update(status=consts.LICENSE_SUSPENDED) for profile in profiles: try: diff --git a/project/customer/utils.py b/project/customer/utils.py index cea368c..937bc9e 100644 --- a/project/customer/utils.py +++ b/project/customer/utils.py @@ -5,14 +5,17 @@ from django.conf import settings from django.core.mail import EmailMessage from django.template.loader import render_to_string +from project.customer import consts + SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL') def check_one_profile(profile, License, now, manual=False): profile_is_active = profile.active - licenses = License.objects.filter(company=profile, date_from__lte=now, date_to__gte=now, status__in=[-1, 1, 2], deleted=False) - licenses.filter(status=1).update(status=2) + licenses = License.objects.filter(company=profile, date_from__lte=now, date_to__gte=now, + status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_PAID, consts.LICENSE_ACTIVE], deleted=False) + licenses.filter(status=consts.LICENSE_PAID).update(status=consts.LICENSE_ACTIVE) if licenses: profile.active = True @@ -34,12 +37,14 @@ def check_one_profile(profile, License, now, manual=False): email = EmailMessage(subject=subject, to=(user_email,), body=email_body) email.send() - licenses_remain = License.objects.filter(company=profile, date_from__gt=now + timedelta(1), status=1, deleted=False) - licenses_to_pay = License.objects.filter(company=profile, status=0, deleted=False) + licenses_remain = License.objects.filter(company=profile, date_from__gt=now + timedelta(1), + status=consts.LICENSE_PAID, deleted=False) + licenses_to_pay = License.objects.filter(company=profile, status=consts.LICENSE_UNPAID, deleted=False) if not licenses_remain and not manual: - licenses = License.objects.filter(company=profile, date_to__lt=now, status__in=[-1, 2], deleted=False) - licenses.update(status=3) + licenses = License.objects.filter(company=profile, date_to__lt=now, + status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE], deleted=False) + licenses.update(status=status=consts.LICENSE_EXPIRED) if licenses: template_name = 'myauth/license_ended.txt' @@ -53,7 +58,8 @@ def check_one_profile(profile, License, now, manual=False): email = EmailMessage(subject=subject, to=(user_email,), body=email_body) email.send() - licenses = License.objects.filter(company=profile, date_to=now + timedelta(1), status__in=[-1, 2], deleted=False) + licenses = License.objects.filter(company=profile, date_to=now + timedelta(1), + status__in=[consts.LICENSE_TEST_PERIOD, consts.LICENSE_ACTIVE], deleted=False) if licenses: template_name = 'myauth/license_ends.txt' @@ -68,7 +74,8 @@ def check_one_profile(profile, License, now, manual=False): email.send() if not manual: - licenses = License.objects.filter(company=profile, order_date=now - timedelta(9), status=0, deleted=False) + licenses = License.objects.filter(company=profile, order_date=now - timedelta(consts.LICENSE_PAY_DAYS-1), + status=status=consts.LICENSE_UNPAID, deleted=False) if licenses: template_name = 'myauth/license_to_pay.txt'