Beispiel #1
0
    def test_stats(self):
        # 3 setlists by different DJs -- 10 tracks by artist 1 in the first, 5 tracks by artist 1 in the 2nd,
        # and 2 tracks by another artist entirely in the third
        artist = ArtistFactory()
        setlists = []
        for i in range(3):
            setlists.append(SetlistFactory())
        for i in range(10):
            track = TrackFactory(artist=artist)
            TrackPlayFactory(track=track, setlist=setlists[0], set_order=i + 1)
        for i in range(5):
            track = TrackFactory(artist=artist)
            TrackPlayFactory(track=track, setlist=setlists[1], set_order=i + 1)
        other_artist = ArtistFactory()
        for i in range(2):
            track = TrackFactory(artist=other_artist)
            TrackPlayFactory(track=track, setlist=setlists[2], set_order=i + 1)

        url = reverse('artist-stats', kwargs={'pk': artist.pk.hex})
        res = self.client.get(url)
        self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
        self.assertEqual(res.json()['total_plays'], 15)  # 10 + 5
        self.assertEqual(len(res.json()['top_djs']), 2)
        self.assertEqual(res.json()['top_djs'][0]['id'],
                         setlists[0].dj.id.__str__())
        self.assertEqual(res.json()['top_djs'][0]['play_count'], 10)
        self.assertEqual(res.json()['top_djs'][1]['id'],
                         setlists[1].dj.id.__str__())
        self.assertEqual(res.json()['top_djs'][1]['play_count'], 5)
Beispiel #2
0
    def test_filters(self):
        dj1 = DJFactory(name='Jeff Mills')
        dj2 = DJFactory(name='Surgeon')
        dj3 = DJFactory(name='Bill Converse')
        TrackPlayFactory(setlist__dj=dj1)
        TrackPlayFactory(setlist__dj=dj2)

        # By name (case-insensitive)
        res = self.client.get(self.list_url, {'name': dj1.name.upper()},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(self.list_url,
                              {'name__in': f'{dj1.name},{dj2.name}'},
                              format='json')
        self.assertEqual(res.data['count'], 2)

        # By labels they play
        dj_filter = {
            'setlists__track_plays__label__name':
            dj1.setlists.first().track_plays.first().label.name.upper()
        }
        res = self.client.get(self.list_url, dj_filter, format='json')
        self.assertEqual(res.data['count'], 1)
        # Use complex filter to support value with commas in it
        condition1 = f'(setlists__track_plays__label__name={dj1.setlists.first().track_plays.first().label.name})'
        condition2 = f'(setlists__track_plays__label__name={dj2.setlists.first().track_plays.first().label.name})'
        dj_filter = {'filters': f'{condition1}|{condition2}'}
        res = self.client.get(self.list_url, dj_filter, format='json')
        self.assertEqual(res.data['count'], 2)
Beispiel #3
0
    def test_filters(self):
        label1 = LabelFactory(name='Warp Records')
        label2 = LabelFactory(name='PAN Records')
        TrackPlayFactory(label=label1)
        TrackPlayFactory(label=label2)
        LabelFactory(name='L.I.E.S. Records')

        # By name
        res = self.client.get(self.list_url, {'name': label1.name},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(self.list_url,
                              {'name__in': f'{label1.name},{label2.name}'},
                              format='json')
        self.assertEqual(res.data['count'], 2)

        # By DJ name
        res = self.client.get(self.list_url, {
            'track_plays__setlist__dj__name':
            label1.track_plays.first().setlist.dj.name.upper()
        },
                              format='json')
        self.assertEqual(res.data['count'], 1)
        label_filter = {
            'filters':
            f'(track_plays__setlist__dj__name={label1.track_plays.first().setlist.dj.name})|'
            +
            f'(track_plays__setlist__dj__name={label2.track_plays.first().setlist.dj.name})'
        }
        res = self.client.get(self.list_url, label_filter, format='json')
        self.assertEqual(res.data['count'], 2)
Beispiel #4
0
    def test_retrieve(self):
        setlist = SetlistFactory()
        for i in range(5):
            track = TrackFactory()
            TrackPlayFactory(track=track, setlist=setlist, set_order=i)

        url = reverse('setlist-detail', kwargs={'pk': setlist.pk.hex})
        res = self.client.get(url, format='json')
        self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
Beispiel #5
0
 def test_list(self):
     for i in range(3):
         label = LabelFactory()
         for j in range(4):
             artist = ArtistFactory()
             track = TrackFactory(artist=artist)
             TrackPlayFactory(track=track, label=label)
     res = self.client.get(self.list_url)
     self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
     self.assertEqual(res.data['count'], 3)
Beispiel #6
0
    def test_stats(self):
        # Create 1 labels and 3 setlists from different djs
        # 9 tracks from label 1 on setlist 1, 6 from label 2 on setlist 2, 3 from label 3 on setlist 3
        # 15 tracks by artist on label, 3 by other artist on label, 1 not on label
        setlists = []
        label = LabelFactory()
        artist = ArtistFactory()
        other_artist = ArtistFactory()
        for i in range(3):
            setlists.append(SetlistFactory())
            setlist_length = 9 - 3 * i
            for j in range(setlist_length):
                track_artist = artist if i < 2 else other_artist
                track = TrackFactory(artist=track_artist)
                TrackPlayFactory(track=track,
                                 setlist=setlists[i],
                                 label=label,
                                 set_order=j)
        TrackPlayFactory(
        )  # One other track play on a different label to make sure total play count is correct

        url = reverse('label-stats', kwargs={'pk': label.pk.hex})
        res = self.client.get(url, format='json')
        self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
        self.assertEqual(res.json()['total_plays'], 18)
        self.assertEqual(res.json()['top_djs'][0]['id'],
                         setlists[0].dj.id.__str__())
        self.assertEqual(res.json()['top_djs'][0]['play_count'], 9)
        self.assertEqual(res.json()['top_djs'][1]['id'],
                         setlists[1].dj.id.__str__())
        self.assertEqual(res.json()['top_djs'][1]['play_count'], 6)
        self.assertEqual(res.json()['top_djs'][2]['id'],
                         setlists[2].dj.id.__str__())
        self.assertEqual(res.json()['top_djs'][2]['play_count'], 3)
        self.assertEqual(res.json()['top_played_artists'][0]['id'],
                         artist.id.__str__())
        self.assertEqual(res.json()['top_played_artists'][0]['play_count'], 15)
        self.assertEqual(res.json()['top_played_artists'][1]['id'],
                         other_artist.id.__str__())
        self.assertEqual(res.json()['top_played_artists'][1]['play_count'], 3)
Beispiel #7
0
    def test_stats(self):
        tracks = []
        for i in range(10):
            tracks.append(TrackFactory())

        for i in range(3):
            setlist = SetlistFactory()
            for i in range(10):
                TrackPlayFactory(track=tracks[i], setlist=setlist, set_order=i)

        url = reverse('track-stats', kwargs={'pk': tracks[0].pk.hex})
        res = self.client.get(url, format='json')
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(len(res.data['setlists']), 3)
Beispiel #8
0
    def test_filters(self):
        setlist1 = SetlistFactory(b2b=False)
        setlist2 = SetlistFactory(b2b=False)
        SetlistFactory(b2b=True)
        for i in range(3):
            TrackPlayFactory(setlist=setlist1)

        # By title
        res = self.client.get(self.list_url, {'title': setlist1.title.upper()},
                              format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(
            self.list_url, {'title__in': f'{setlist1.title},{setlist2.title}'},
            format='json')
        self.assertEqual(res.data['count'], 2)

        # By dj name
        res = self.client.get(self.list_url,
                              {'dj__name': setlist1.dj.name.upper()},
                              format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        setlist_filter = {
            'dj__name__in': f'{setlist1.dj.name},{setlist2.dj.name}'
        }
        res = self.client.get(self.list_url, setlist_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By mixesdb id
        res = self.client.get(self.list_url,
                              {'mixesdb_id': setlist1.mixesdb_id},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        setlist_filter = {
            'mixesdb_id__in': f'{setlist1.mixesdb_id},{setlist2.mixesdb_id}'
        }
        res = self.client.get(self.list_url, setlist_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By B2B
        res = self.client.get(self.list_url, {'b2b': True}, format='json')
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(self.list_url, {'b2b': False}, format='json')
        self.assertEqual(res.data['count'], 2)

        # By empty
        res = self.client.get(self.list_url, {'empty': True}, format='json')
        self.assertEqual(res.data['count'], 2)
        res = self.client.get(self.list_url, {'empty': False}, format='json')
        self.assertEqual(res.data['count'], 1)
Beispiel #9
0
    def test_filters(self):
        SetlistFactory()
        play1 = TrackPlayFactory(
            set_order=1, label__name="Comma, Semicolon, and Period Records")
        play2 = TrackPlayFactory(set_order=2)
        TrackPlayFactory(
            set_order=7)  # extra track which shouldn't return in results

        # By label name
        res = self.client.get(self.list_url, {'label__name': play1.label.name},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        # Multiple filters (either/or)
        play_filter = {
            'filters':
            f'(label__name={play1.label.name.upper()})|(label__name={play2.label.name.lower()})'
        }
        res = self.client.get(self.list_url, play_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By track title
        res = self.client.get(self.list_url,
                              {'track__title': play1.track.title.upper()},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(
            self.list_url,
            {'track__title__in': f'{play1.track.title},{play2.track.title}'},
            format='json')
        self.assertEqual(res.data['count'], 2)

        # By track artist name
        res = self.client.get(self.list_url,
                              {'track__artist__name': play1.track.artist.name},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        play_filter = {
            'track__artist__name__in':
            f'{play1.track.artist.name},{play2.track.artist.name}'
        }
        res = self.client.get(self.list_url, play_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By setlist title
        res = self.client.get(self.list_url,
                              {'setlist__title': play1.setlist.title},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        track_filter = {
            'setlist__title__in':
            f'{play1.setlist.title},{play2.setlist.title}'
        }
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By setlist dj name
        res = self.client.get(
            self.list_url,
            {'setlist__dj__name': play1.setlist.dj.name.upper()},
            format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        track_filter = {
            'setlist__dj__name__in':
            f'{play1.setlist.dj.name},{play2.setlist.dj.name}'
        }
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By set order
        res = self.client.get(self.list_url, {'set_order': play1.set_order},
                              format='json')
        self.assertEqual(res.data['count'], 1)
        track_filter = {
            'set_order__in': f'{play1.set_order},{play2.set_order}'
        }
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)
Beispiel #10
0
 def test_retrieve(self):
     play = TrackPlayFactory()
     url = reverse('trackplay-detail', kwargs={'pk': play.pk.hex})
     res = self.client.get(url, format='json')
     self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
Beispiel #11
0
 def test_list(self):
     for i in range(3):
         TrackPlayFactory()
     res = self.client.get(self.list_url)
     self.assertEqual(res.status_code, status.HTTP_200_OK, msg=res.data)
     self.assertEqual(res.data['count'], 3)
Beispiel #12
0
    def test_filters(self):
        track1 = TrackFactory(artist__name='Aphex Twin')
        track2 = TrackFactory(artist__name='AFX')
        TrackPlayFactory(track=track1,
                         set_order=1,
                         label__name="Comma, Semicolon, and Period Records")
        TrackPlayFactory(track=track2, set_order=2)
        track3 = TrackFactory(
            artist__name='Basic Channel'
        )  # extra track which shouldn't return in results
        TrackPlayFactory(track=track3, set_order=3)

        # By title
        res = self.client.get(self.list_url, {'title': track1.title.upper()},
                              format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(self.list_url,
                              {'title__in': f'{track1.title},{track2.title}'},
                              format='json')
        self.assertEqual(res.data['count'], 2)

        # By artist name
        res = self.client.get(self.list_url,
                              {'artist__name': track1.artist.name.upper()},
                              format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        res = self.client.get(
            self.list_url,
            {'artist__name__in': f'{track1.artist.name},{track2.artist.name}'},
            format='json')
        self.assertEqual(res.data['count'], 2)

        # By setlist title
        res = self.client.get(
            self.list_url,
            {'setlists__title': track1.setlists.first().title.upper()},
            format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        track_filter = f'{track1.setlists.first().title},{track2.setlists.first().title}'
        res = self.client.get(self.list_url,
                              {'setlists__title__in': track_filter},
                              format='json')
        self.assertEqual(res.data['count'], 2)

        # By setlist dj name
        res = self.client.get(
            self.list_url,
            {'setlists__dj__name': track1.setlists.first().dj.name.upper()},
            format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        track_filter = {
            'setlists__dj__name__in':
            f'{track1.setlists.first().dj.name},' +
            f'{track2.setlists.first().dj.name}'
        }
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By label name
        res = self.client.get(
            self.list_url,
            {'plays__label__name': track1.plays.first().label.name.upper()},
            format='json')  # case insensitive
        self.assertEqual(res.data['count'], 1)
        # Use complex filter to support value with commas in it
        track_filter = {'filters': f'(plays__label__name={track1.plays.first().label.name})|' + \
                                   f'(plays__label__name={track2.plays.first().label.name})'}
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)

        # By set order
        res = self.client.get(
            self.list_url,
            {'plays__set_order': track1.plays.first().set_order},
            format='json')
        self.assertEqual(res.data['count'], 1)
        track_filter = {
            'plays__set_order__in':
            f'{track1.plays.first().set_order},{track2.plays.first().set_order}'
        }
        res = self.client.get(self.list_url, track_filter, format='json')
        self.assertEqual(res.data['count'], 2)
Beispiel #13
0
    def test_stats(self):
        # Make 3 identical setlists - 4 tracks on label #1, 3 on label #2, 2 on label #3, 1 on label #4
        # Of these 10 tracks, 5 are produced by artist 1, 3 by artist 2, 2 by artist 3

        tracks = []
        artist = ArtistFactory()
        for i in range(5):
            tracks.append(TrackFactory(artist=artist))
        artist = ArtistFactory()
        for i in range(3):
            tracks.append(TrackFactory(artist=artist))
        artist = ArtistFactory()
        for i in range(2):
            tracks.append(TrackFactory(artist=artist))

        dj = DJFactory()

        labels = []
        for i in range(4):
            labels.append(LabelFactory())
        for i in range(3):
            setlist = SetlistFactory(dj=dj, mixesdb_id=i)
            for i in range(4):
                TrackPlayFactory(track=tracks[i],
                                 setlist=setlist,
                                 label=labels[0],
                                 set_order=i)
            for i in range(3):
                TrackPlayFactory(track=tracks[4 + i],
                                 setlist=setlist,
                                 label=labels[1],
                                 set_order=4 + i)
            for i in range(2):
                TrackPlayFactory(track=tracks[7 + i],
                                 setlist=setlist,
                                 label=labels[2],
                                 set_order=7 + i)
            TrackPlayFactory(track=tracks[9],
                             setlist=setlist,
                             label=labels[3],
                             set_order=9)

            # Make two of the setlists 'b2b' by cloning them but linking the other two other djs
            if setlist.mixesdb_id != 0:
                setlist.b2b = True
                setlist.save()
                other_dj = DJFactory()
                setlist = SetlistFactory(dj=other_dj,
                                         mixesdb_id=setlist.mixesdb_id,
                                         b2b=True)
                for i in range(4):
                    TrackPlayFactory(track=tracks[i],
                                     setlist=setlist,
                                     label=labels[0],
                                     set_order=i)
                for i in range(3):
                    TrackPlayFactory(track=tracks[4 + i],
                                     setlist=setlist,
                                     label=labels[1],
                                     set_order=4 + i)
                for i in range(2):
                    TrackPlayFactory(track=tracks[7 + i],
                                     setlist=setlist,
                                     label=labels[2],
                                     set_order=7 + i)
                TrackPlayFactory(track=tracks[9],
                                 setlist=setlist,
                                 label=labels[3],
                                 set_order=9)

        url = reverse('dj-stats', kwargs={'pk': dj.pk.hex})
        res = self.client.get(url, format='json')
        self.assertEqual(res.status_code, status.HTTP_200_OK)

        self.assertEqual(res.json()['top_played_artists'][0]['play_count'],
                         15)  # 5 tracks * 3 sets = 15
        self.assertEqual(res.json()['top_played_artists'][1]['play_count'],
                         9)  # 3 tracks * 3 sets = 9
        self.assertEqual(res.json()['top_played_artists'][2]['play_count'],
                         6)  # 2 tracks * 3 sets = 6
        self.assertEqual(res.json()['top_played_labels'][0]['play_count'],
                         12)  # 4 track plays on label # 1 * 3 sets = 12
        self.assertEqual(res.json()['top_played_labels'][1]['play_count'],
                         9)  # 3 track plays on label # 2 * 3 sets = 9
        self.assertEqual(res.json()['top_played_labels'][2]['play_count'],
                         6)  # 2 track plays on label # 3 * 3 sets = 6
        self.assertEqual(res.json()['top_played_labels'][3]['play_count'],
                         3)  # 1 track plays on label # 4 * 3 sets = 3
        self.assertNotEqual(res.json()['most_stacked_setlist']['id'],
                            None)  # All setlists have equal length

        # Make the first setlist 1 track longer to make sure the 'most stacked setlist' stat works right
        first_setlist = Setlist.objects.get(mixesdb_id=0)
        TrackPlayFactory(setlist=first_setlist, set_order=11)
        res = self.client.get(url, format='json')
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertEqual(res.json()['most_stacked_setlist']['id'],
                         first_setlist.pk.__str__())