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()
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()
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()
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
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()
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
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
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