def update(self, request: request.Request, *args: Any, **kwargs: Any) -> Response: action = Action.objects.get(pk=kwargs['pk'], team=request.user.team_set.get()) # If there's no steps property at all we just ignore it # If there is a step property but it's an empty array [], we'll delete all the steps if 'steps' in request.data: steps = request.data.pop('steps') # remove steps not in the request step_ids = [step['id'] for step in steps if step.get('id')] action.steps.exclude(pk__in=step_ids).delete() for step in steps: if step.get('id'): db_step = ActionStep.objects.get(pk=step['id']) step_serializer = ActionStepSerializer(db_step) step_serializer.update(db_step, step) else: ActionStep.objects.create( action=action, **{ key: value for key, value in step.items() if key not in ('isNew', 'selection') }) serializer = ActionSerializer(action, context={'request': request}) serializer.update(action, request.data) action.calculate_events() return Response( ActionSerializer(action, context={ 'request': request }).data)
def test_breakdown_by_person_property(self): person1, person2, person3, person4 = self._create_multiple_people() action = Action.objects.create(name="watched movie", team=self.team) ActionStep.objects.create(action=action, event="watched movie") action.calculate_events() with freeze_time("2020-01-04T13:01:01Z"): action_response = Trends().run( Filter( data={ "date_from": "-14d", "breakdown": "name", "breakdown_type": "person", "actions": [{ "id": action.pk, "type": "actions", "order": 0 }], }), self.team, ) event_response = Trends().run( Filter( data={ "date_from": "-14d", "breakdown": "name", "breakdown_type": "person", "events": [{ "id": "watched movie", "name": "watched movie", "type": "events", "order": 0, }], }), self.team, ) self.assertEqual(event_response[0]["count"], 3) self.assertEqual(event_response[0]["breakdown_value"], "person2") self.assertEqual(event_response[1]["count"], 1) self.assertEqual(event_response[1]["breakdown_value"], "person1") self.assertEqual(event_response[2]["count"], 3) self.assertEqual(event_response[2]["breakdown_value"], "person3") self.assertEqual(event_response[3]["count"], 0) self.assertEqual(event_response[3]["breakdown_value"], "person4") self.assertTrue( self._compare_entity_response( event_response, action_response, ))
def create(self, request: request.Request, *args: Any, **kwargs: Any) -> Response: action, created = Action.objects.get_or_create( name=request.data['name'], team=request.user.team_set.get(), deleted=False, defaults={'created_by': request.user}) if not created: return Response(data={ 'detail': 'action-exists', 'id': action.pk }, status=400) if request.data.get('steps'): for step in request.data['steps']: ActionStep.objects.create(action=action, **{ key: value for key, value in step.items() if key not in ('isNew', 'selection') }) action.calculate_events() return Response( ActionSerializer(action, context={ 'request': request }).data)
def test_breakdown_by_cohort(self): person1, person2, person3, person4 = self._create_multiple_people() cohort = Cohort.objects.create(name="cohort1", team=self.team, groups=[{ "properties": { "name": "person1" } }]) cohort2 = Cohort.objects.create(name="cohort2", team=self.team, groups=[{ "properties": { "name": "person2" } }]) cohort3 = Cohort.objects.create( name="cohort3", team=self.team, groups=[ { "properties": { "name": "person1" } }, { "properties": { "name": "person2" } }, ], ) cohort.calculate_people() cohort2.calculate_people() cohort3.calculate_people() action = Action.objects.create(name="watched movie", team=self.team) ActionStep.objects.create(action=action, event="watched movie") action.calculate_events() with freeze_time("2020-01-04T13:01:01Z"): action_response = Trends().run( Filter( data={ "date_from": "-14d", "breakdown": json.dumps([cohort.pk, cohort2.pk, cohort3.pk, "all"]), "breakdown_type": "cohort", "actions": [{ "id": action.pk, "type": "actions", "order": 0 }], }), self.team, ) event_response = Trends().run( Filter( data={ "date_from": "-14d", "breakdown": json.dumps([cohort.pk, cohort2.pk, cohort3.pk, "all"]), "breakdown_type": "cohort", "events": [{ "id": "watched movie", "name": "watched movie", "type": "events", "order": 0, }], }), self.team, ) self.assertEqual(event_response[1]["label"], "watched movie - cohort2") self.assertEqual(event_response[2]["label"], "watched movie - cohort3") self.assertEqual(event_response[3]["label"], "watched movie - all users") self.assertEqual(sum(event_response[0]["data"]), 1) self.assertEqual(event_response[0]["breakdown_value"], cohort.pk) self.assertEqual(sum(event_response[1]["data"]), 3) self.assertEqual(event_response[1]["breakdown_value"], cohort2.pk) self.assertEqual(sum(event_response[2]["data"]), 4) self.assertEqual(event_response[2]["breakdown_value"], cohort3.pk) self.assertEqual(sum(event_response[3]["data"]), 7) self.assertEqual(event_response[3]["breakdown_value"], "all") self.assertTrue( self._compare_entity_response( event_response, action_response, ))