def test_with_event_user(self): event = self.store_event( data={ "event_id": "d" * 32, "message": "oh no", "environment": self.env_1.name, "user": {"id": 1234, "email": "*****@*****.**"}, }, project_id=self.project_1.id, ) # Simulate how ingest saves reports to get event_user connections report_data = { "event_id": event.event_id, "name": "", "email": "", "comments": "It broke", } save_userreport(self.project_1, report_data) response = self.get_response(self.project_1.organization.slug, project=[self.project_1.id]) assert response.status_code == 200 assert response.data[0]["comments"] == "It broke" assert response.data[0]["user"]["name"] == "*****@*****.**" assert response.data[0]["user"]["email"] == "*****@*****.**"
def process_userreport(message, projects): project_id = int(message["project_id"]) start_time = to_datetime(message["start_time"]) feedback = json.loads(message["payload"]) try: project = projects[project_id] except KeyError: logger.error("Project for ingested event does not exist: %s", project_id) return False try: save_userreport(project, feedback, start_time=start_time) return True except Conflict as e: logger.info("Invalid userreport: %s", e) return False
def process_userreport(message): project_id = message["project_id"] start_time = to_datetime(message["start_time"]) feedback = json.loads(message["payload"]) try: project = Project.objects.get_from_cache(id=project_id) except Project.DoesNotExist: logger.error("Project for ingested event does not exist: %s", project_id) return False try: save_userreport(project, feedback, start_time=start_time) return True except Conflict as e: logger.info("Invalid userreport: %s", e) return False
def process_userreport(message, projects): project_id = int(message["project_id"]) start_time = to_datetime(message["start_time"]) feedback = json.loads(message["payload"]) try: project = projects[project_id] except KeyError: logger.error("Project for ingested event does not exist: %s", project_id) return False try: save_userreport(project, feedback, start_time=start_time) return True except Conflict as e: logger.info("Invalid userreport: %s", e) return False except Exception: # XXX(markus): Hotfix because we have broken data in kafka # If you want to remove this make sure to have triaged all errors in Sentry logger.exception("userreport.save.crash") return False
def process_userreport(message, projects): project_id = int(message["project_id"]) start_time = to_datetime(message["start_time"]) feedback = json.loads(message["payload"]) try: project = projects[project_id] except KeyError: logger.error("Project for ingested event does not exist: %s", project_id) return False try: save_userreport(project, feedback, start_time=start_time) return True except KeyError as e: # XXX(markus): Hotfix because we have broken data in kafka logger.error("Missing user report key: %s", e) return False except Conflict as e: logger.info("Invalid userreport: %s", e) return False
def post(self, request, project): """ Submit User Feedback ```````````````````` Submit and associate user feedback with an issue. Feedback must be received by the server no more than 30 minutes after the event was saved. Additionally, within 5 minutes of submitting feedback it may also be overwritten. This is useful in situations where you may need to retry sending a request due to network failures. If feedback is rejected due to a mutability threshold, a 409 status code will be returned. Note: Feedback may be submitted with DSN authentication (see auth documentation). :pparam string organization_slug: the slug of the organization. :pparam string project_slug: the slug of the project. :auth: required :param string event_id: the event ID :param string name: user's name :param string email: user's email address :param string comments: comments supplied by user """ if hasattr(request.auth, "project_id") and project.id != request.auth.project_id: return self.respond(status=400) serializer = UserReportSerializer(data=request.data) if not serializer.is_valid(): return self.respond(serializer.errors, status=400) report = serializer.validated_data try: report_instance = save_userreport(project, report) except Conflict as e: return self.respond({"detail": six.text_type(e)}, status=409) if isinstance(request.auth, ProjectKey): return self.respond(status=200) return self.respond( serialize( report_instance, request.user, UserReportWithGroupSerializer( environment_func=self._get_environment_func( request, project.organization_id)), ))