diff --git a/core/graphene/object_types.py b/core/graphene/object_types.py index 87e59750..8204b332 100644 --- a/core/graphene/object_types.py +++ b/core/graphene/object_types.py @@ -416,7 +416,7 @@ class OrderProductType(DjangoObjectType): description = _("order products") def resolve_feedback(self: OrderProduct, _info): - return self.feedback + return Feedback.objects.get(order_product=self) def resolve_attributes(self, _info): return camelize(self.attributes) diff --git a/core/models.py b/core/models.py index 009adfd4..2b8c0349 100644 --- a/core/models.py +++ b/core/models.py @@ -1944,19 +1944,26 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t return self.download.url return "" - def do_feedback(self, rating=10, comment="", action="add") -> Optional["Feedback"]: + def do_feedback(self, rating=10, comment="", action="add") -> Optional["Feedback"] | int: if not self.order: raise ValueError(_("order product must have an order")) if action not in ["add", "remove"]: raise ValueError(_(f"wrong action specified for feedback: {action}")) - if action == "remove" and self.feedback: - self.feedback.delete() - return None - if action == "add" and not self.feedback: - if self.order.status not in ["MOMENTAL", "PENDING", "FAILED"]: - return Feedback.objects.create(rating=rating, comment=comment, order_product=self) - else: - raise ValueError(_("you cannot feedback an order which is not received")) + + feedback_qs = Feedback.objects.filter(order_product=self) + feedback_exists = feedback_qs.exists() + + if action == "remove": + if feedback_exists: + return feedback_qs.delete()[0] + + if action == "add": + if not feedback_exists: + if self.order.status not in ["MOMENTAL", "PENDING", "FAILED"]: + return Feedback.objects.create(rating=rating, comment=comment, order_product=self) + else: + raise ValueError(_("you cannot feedback an order which is not received")) + return None