Пример #1
0
def create_admins(count=3):
    for i in range(count):
        admin = UserFactory(username='******'.format(i),
                            password='******'.format(i))
        Token.objects.create(user=admin)
        admin_group = get_or_create_admins_group()
        admin.groups.add(admin_group)
    admin = User.objects.get(username='******')
    admin.save()
Пример #2
0
 def get_queryset(self):
     queryset = super(TransactionView, self).get_queryset()
     if self.request.user.is_superuser:
         return queryset
     if get_or_create_admins_group() in self.request.user.groups.all():
         return queryset
     elif get_or_create_clients_group() in self.request.user.groups.all():
         return queryset.filter(client=self.request.user)
     else:
         return queryset.none()
Пример #3
0
 def get_queryset(self):
     queryset = super(UserView, self).get_queryset()
     if self.request.user.is_superuser:
         return queryset.filter(is_superuser=False)
     elif self.kwargs.get(self.lookup_field) == 'me':
         return queryset.filter(pk=self.request.user.pk)
     elif get_or_create_admins_group() in self.request.user.groups.all():
         return queryset.filter(groups=get_or_create_clients_group())
     else:
         return queryset.none()
Пример #4
0
    def get_scoring(self, client):
        view = self.context.get('view')
        if view and view.__class__.__name__ != 'UserView':
            return

        if client.is_superuser or get_or_create_admins_group(
        ) in client.groups.all():
            return None

        success, scoring_result = client.get_scoring()
        if success:
            return scoring_result
        else:
            return None
Пример #5
0
 def get_queryset(self):
     queryset = super(AccountView, self).get_queryset()
     if self.request.user.is_superuser:
         return queryset
     if get_or_create_admins_group() in self.request.user.groups.all():
         return queryset
     elif get_or_create_clients_group() in self.request.user.groups.all():
         statuses = [
             fin_models.Account.STATUS_ACTIVE,
             fin_models.Account.STATUS_DISABLED,
             fin_models.Account.STATUS_REQUESTED_CREATING
         ]
         return queryset.filter(client=self.request.user, status__in=statuses)
     else:
         return queryset.none()
Пример #6
0
    def get_scoring(self):
        if self.is_superuser or get_or_create_admins_group(
        ) in self.groups.all():
            return False, 'Скоринг вычисляется только для клиентов'

        user_credits = Credit.objects.filter(
            client=self,
            status__in=[Credit.STATUS_OPENED, Credit.STATUS_FINED])

        if self.profile.dependants is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать количество членов семьи'

        if self.profile.income is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать месячный доход'

        if self.profile.age is None and self.profile.birth_date is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать дату рождения'

        try:
            age = (date.today() - self.profile.birth_date).days / 365
        except Exception:
            age = self.profile.age

        scoring_data = {
            "monthly_payment":
            sum([
                float(value)
                for value in user_credits.values_list('minimum_monthly_pay',
                                                      flat=True) if value > 0
            ]) / len(user_credits) if user_credits else 0,
            "delayed_balance":
            sum([
                float(value)
                for value in user_credits.values_list('current_penalty',
                                                      flat=True) if value > 0
            ]),
            "current_delay":
            sum([(date.today() - value).days
                 for value in user_credits.values_list('next_payment_term',
                                                       flat=True)
                 if (date.today() - value).days > 0]),
            "totally_paid":
            sum([
                float(value)
                for value in user_credits.values_list('total_sum', flat=True)
                if value > 0
            ]),
            "credits_residue":
            sum([
                float(value)
                for value in user_credits.values_list('residue', flat=True)
                if value > 0
            ]),
            'credit_limit':
            sum([
                float(value)
                for value in user_credits.values_list('residue', flat=True)
                if value > 0
            ]),
            "delayed_count_5":
            self.profile.number_of_times_0_5_days_late,
            'delayed_count_5_29':
            self.profile.number_of_times_5_29_days_late,
            'delayed_count_30_59':
            self.profile.number_of_times_30_59_days_late,
            'delayed_count_60_89':
            self.profile.number_of_times_60_89_days_late,
            'delayed_count_90_+':
            self.profile.number_of_times_90_more_days_late,
        }

        scoring_host = environ.get("SCORING_HOST", 'scoring')
        scoring_port = environ.get("SCORING_PORT", 'scoring')
        url = 'http://{}:{}/api/credits/scoring/'.format(
            scoring_host, scoring_port)
        try:
            headers = {"Content-Type": "application/json"}
            req = Request(url, data=json.dumps(scoring_data), headers=headers)
            data = json.loads(urlopen(req).read())
        except Exception:
            return False, 'Ошибка при обращении к сервису кредитного скоринга'

        s = FinanceSettings.get_instance().scoring
        danger_level = s.get('danger_level', 0.3)
        warning_level = s.get('warning_level', 0.5)

        if 0 <= data['scoring_result'] <= danger_level:
            data['level'] = 'danger'
        elif danger_level <= data['scoring_result'] <= warning_level:
            data['level'] = 'warning'
        else:
            data['level'] = 'success'
        return True, data
Пример #7
0
    def get_scoring(self):
        if self.is_superuser or get_or_create_admins_group(
        ) in self.groups.all():
            return False, 'Скоринг вычисляется только для клиентов'

        user_credits = Credit.objects.filter(client=self)

        if self.profile.dependants is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать количество членов семьи'

        if self.profile.income is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать месячный доход'

        if self.profile.age is None and self.profile.birth_date is None:
            return False, 'Для использования сервиса скоринга ' \
                          'нужно указать дату рождения'

        try:
            age = (date.today() - self.profile.birth_date).days / 365
        except Exception:
            age = self.profile.age

        scoring_data = {
            "age":
            age or 20,
            "credit_monthly_payments": [
                float(value)
                for value in user_credits.values_list('minimum_monthly_pay',
                                                      flat=True) if value > 0
            ],
            "credits_residue": [
                float(value)
                for value in user_credits.values_list('residue', flat=True)
                if value > 0
            ],
            "credit_limits": [
                float(value)
                for value in user_credits.values_list('total_sum', flat=True)
                if value > 0
            ],
            "MonthlyIncome":
            float(self.profile.income.amount),
            "NumberOfDependents":
            self.profile.dependants,
            "NumberOfTime30-59DaysPastDueNotWorse":
            self.profile.number_of_times_30_59_days_late,
            "NumberOfTime60-89DaysPastDueNotWorse":
            self.profile.number_of_times_60_89_days_late,
            "NumberOfTimes90DaysLate":
            self.profile.number_of_times_90_more_days_late,
            "NumberRealEstateLoansOrLines":
            user_credits.count() * 0.2,
            "NumberOfOpenCreditLinesAndLoans":
            user_credits.count()
        }

        scoring_host = environ.get("SCORING_HOST", 'scoring')
        scoring_port = environ.get("SCORING_PORT", 'scoring')
        url = 'http://{}:{}/api/credits/scoring/'.format(
            scoring_host, scoring_port)
        try:
            headers = {"Content-Type": "application/json"}
            req = Request(url, data=json.dumps(scoring_data), headers=headers)
            data = json.loads(urlopen(req).read())
        except Exception:
            return False, 'Ошибка при обращении к сервису кредитного скоринга'

        s = FinanceSettings.get_instance().scoring
        danger_level = s.get('danger_level', 0.3)
        warning_level = s.get('warning_level', 0.5)

        if 0 <= data['scoring_result'] <= danger_level:
            data['level'] = 'danger'
        elif danger_level <= data['scoring_result'] <= warning_level:
            data['level'] = 'warning'
        else:
            data['level'] = 'success'
        return True, data
Пример #8
0
 def create(self, validated_data):
     validated_data['is_active'] = True
     instance = get_user_model().objects.create_user(**validated_data)
     instance.groups.add(get_or_create_admins_group())
     return instance