Example #1
0
    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)
Example #2
0
    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,
            ))
Example #3
0
    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)
Example #4
0
    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,
            ))