def get_context_data(self, **kwargs): kwargs["referents"] = self.object.memberships.filter( membership_type=Membership.MEMBERSHIP_TYPE_REFERENT).order_by( "created") kwargs["managers"] = self.object.memberships.filter( membership_type=Membership.MEMBERSHIP_TYPE_MANAGER).order_by( "created") kwargs["members"] = self.object.memberships.all().order_by("created") kwargs["has_promo_code"] = self.object.tags.filter( label=settings.PROMO_CODE_TAG).exists() if kwargs["has_promo_code"]: kwargs["group_promo_codes"] = get_promo_codes(self.object) if is_promo_code_delayed(): kwargs["promo_code_delay"] = next_promo_code_date() kwargs["certifiable"] = ( self.object.type in settings.CERTIFIABLE_GROUP_TYPES or self.object.subtypes.filter( label__in=settings.CERTIFIABLE_GROUP_SUBTYPES).exists()) kwargs["satisfy_requirements"] = len(kwargs["referents"]) > 1 kwargs["allocation_balance"] = get_balance(self.object) kwargs["spending_requests"] = SpendingRequest.objects.filter( group=self.object).exclude(status=SpendingRequest.STATUS_PAID) kwargs["is_pressero_enabled"] = is_pressero_enabled() kwargs["active"] = self.active_panel.get(self.request.POST.get("form")) forms = self.get_forms() for form_name, form in forms.items(): kwargs.setdefault(form_name, form) return super().get_context_data(**kwargs, )
def get(self, request, *args, **kwargs): group = self.get_object() donation = get_balance(group) spending_requests = [{ "id": spending_request.id, "title": spending_request.title, "status": spending_request.get_status_display(), "date": spending_request.spending_date, "link": front_url("manage_spending_request", kwargs={"pk": spending_request.pk}), } for spending_request in ( SpendingRequest.objects.filter(group=group).exclude( status=SpendingRequest.STATUS_PAID).order_by("-spending_date"). only("id", "title", "status", "spending_date"))] return Response( status=status.HTTP_200_OK, data={ "donation": donation, "spendingRequests": spending_requests }, )
def group_formatter(group): return format_html( '<a href="{group_link}">{group_name}</a> ({group_balance})<br><a href="mailto:{group_email}">{group_email}</a><br>{group_phone}', group_name=group.name, group_email=group.contact_email, group_phone=group.contact_phone, group_link=front_url("view_group", args=(group.id, )), group_balance=display_price(get_balance(group)), )
def validate_unique(self, exclude=None): try: super().validate_unique(exclude) except ValidationError as e: errors = e.message_dict else: errors = {} from agir.donations.allocations import get_balance if self.group and isinstance(self.amount, int) and self.amount < 0: balance = get_balance(self.group) if balance + self.amount < 0: errors.setdefault("amount", []).append( ValidationError( f"La balance d'un groupe ne peut pas devenir négative (actuellement : {display_price(balance)})", code="negative_balance", )) if errors: raise ValidationError(errors)
def summary(spending_request): """Renvoie un résumé de la demande de dépense pour l'affichage sur la page de gestion :param spending_request: la demande de dépense à résumer :return: un itérateur vers les différents champs constituant le résumé """ other_display_fields = [ "category_precisions", "explanation", "spending_date", "provider", "iban", "payer_name", ] yield { "label": "Identifiant de la demande", "value": str(spending_request.pk)[:6] } yield { "label": get_spending_request_field_label("title"), "value": spending_request.title, } status = spending_request.get_status_display() if spending_request.status == SpendingRequest.STATUS_DRAFT and can_be_sent( spending_request): status = _( "Dès que votre brouillon est complet, vous pouvez le confirmer pour validation par l'équipe de suivi." ) if spending_request.status in SpendingRequest.STATUS_NEED_ACTION: status = format_html("<strong>{}</strong>", status) yield { "label": get_spending_request_field_label("status"), "value": status } balance = get_balance(spending_request.group) amount_text = display_price(spending_request.amount) if spending_request.amount > balance: amount_text = format_html( "{}<br><strong style=\"color: #BB1111;\">L'allocation de votre groupe est pour l'instant insuffisante, votre" " demande ne pourra pas être validée</strong>", amount_text, ) yield { "label": get_spending_request_field_label("amount"), "value": amount_text } yield { "label": get_spending_request_field_label("event"), "value": format_html( '<a href="{link}">{name}</a>', link=reverse("view_event", kwargs={"pk": spending_request.event.id}), name=spending_request.event.name, ) if spending_request.event else _("Aucun"), } yield { "label": get_spending_request_field_label("category"), "value": spending_request.get_category_display(), } for f in other_display_fields: yield { "label": get_spending_request_field_label(f), "value": getattr(spending_request, f), }
def are_funds_sufficient(spending_request): return spending_request.amount <= get_balance(spending_request.group)