diff --git a/api/funkwhale_api/music/models.py b/api/funkwhale_api/music/models.py index 6a55dfc00c385f18da92c7f6c0da49458c16402e..d7a08b7a40f5f06d7501bb666e9b64323e5f1e6d 100644 --- a/api/funkwhale_api/music/models.py +++ b/api/funkwhale_api/music/models.py @@ -27,6 +27,7 @@ class APIModelMixin(models.Model): api_includes = [] creation_date = models.DateTimeField(default=timezone.now) import_hooks = [] + class Meta: abstract = True ordering = ['-creation_date'] @@ -291,6 +292,9 @@ class Track(APIModelMixin): ] tags = TaggableManager() + class Meta: + ordering = ['album', 'position'] + def __str__(self): return self.title @@ -386,6 +390,8 @@ class ImportJob(models.Model): ) status = models.CharField(choices=STATUS_CHOICES, default='pending', max_length=30) + class Meta: + ordering = ('id', ) @celery.app.task(name='ImportJob.run', filter=celery.task_method) def run(self, replace=False): try: diff --git a/api/funkwhale_api/music/serializers.py b/api/funkwhale_api/music/serializers.py index e7d7399ad01ffeddc5e9bec5d452c05b4c56f3d9..6b839b9cfce30e2a650c95146a21f2fe4d6ed181 100644 --- a/api/funkwhale_api/music/serializers.py +++ b/api/funkwhale_api/music/serializers.py @@ -62,7 +62,15 @@ class TrackSerializer(LyricsMixin): tags = TagSerializer(many=True, read_only=True) class Meta: model = models.Track - fields = ('id', 'mbid', 'title', 'artist', 'files', 'tags', 'lyrics') + fields = ( + 'id', + 'mbid', + 'title', + 'artist', + 'files', + 'tags', + 'position', + 'lyrics') class TrackSerializerNested(LyricsMixin): artist = ArtistSerializer() diff --git a/front/src/components/audio/album/Card.vue b/front/src/components/audio/album/Card.vue index fcdf1622d039fe2ae0cf0f5420dd70efaf1a638e..7fd60d963b512ae637faa7c7dc8acbb2f9021d80 100644 --- a/front/src/components/audio/album/Card.vue +++ b/front/src/components/audio/album/Card.vue @@ -22,6 +22,9 @@ </td> <td colspan="6"> <router-link class="track discrete link" :to="{name: 'library.track', params: {id: track.id }}"> + <template v-if="track.position"> + {{ track.position }}. + </template> {{ track.title }} </router-link> </td> diff --git a/front/src/components/audio/track/Table.vue b/front/src/components/audio/track/Table.vue index 6898353d89810ee4952b161c5701c700733df13d..8dca90902efec2027fb22e7a8650e399d8bc8d9b 100644 --- a/front/src/components/audio/track/Table.vue +++ b/front/src/components/audio/track/Table.vue @@ -20,9 +20,12 @@ <img class="ui mini image" v-else src="../../..//assets/audio/default-cover.png"> </td> <td colspan="6"> - <router-link class="track" :to="{name: 'library.track', params: {id: track.id }}"> - {{ track.title }} - </router-link> + <router-link class="track" :to="{name: 'library.track', params: {id: track.id }}"> + <template v-if="displayPosition && track.position"> + {{ track.position }}. + </template> + {{ track.title }} + </router-link> </td> <td colspan="6"> <router-link class="artist discrete link" :to="{name: 'library.artist', params: {id: track.artist.id }}"> @@ -46,7 +49,10 @@ import TrackFavoriteIcon from '@/components/favorites/TrackFavoriteIcon' import PlayButton from '@/components/audio/PlayButton' export default { - props: ['tracks'], + props: { + tracks: {type: Array, required: true}, + displayPosition: {type: Boolean, default: false} + }, components: { TrackFavoriteIcon, PlayButton diff --git a/front/src/components/library/Album.vue b/front/src/components/library/Album.vue index 5cc4d027159625f7807b01b73840886ee2285b4e..494f2396b9bc976d7a6c4593656517abc2cc84d5 100644 --- a/front/src/components/library/Album.vue +++ b/front/src/components/library/Album.vue @@ -34,7 +34,7 @@ </div> <div class="ui vertical stripe segment"> <h2>Tracks</h2> - <track-table v-if="album" :tracks="album.tracks"></track-table> + <track-table v-if="album" display-position="true" :tracks="album.tracks"></track-table> </div> </template> </div>