API Timeline ajoutée !
This commit is contained in:
@ -0,0 +1,61 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.5 on 2017-09-16 21:55
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('games', '0008_rename_console_to_platform'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelOptions(
|
||||
name='platform',
|
||||
options={'ordering': ('name',), 'verbose_name': 'plateforme', 'verbose_name_plural': 'plateformes'},
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='game',
|
||||
name='collection',
|
||||
field=models.ForeignKey(help_text='Game running platform', on_delete=django.db.models.deletion.CASCADE, related_name='games', to='games.Platform', verbose_name='plateforme'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='game',
|
||||
name='name',
|
||||
field=models.CharField(help_text='Game title', max_length=255, verbose_name='nom'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='game',
|
||||
name='note',
|
||||
field=models.CharField(blank=True, help_text='Courte note affichée à ceux qui vous suive.', max_length=150, null=True, verbose_name='Note de progression'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='game',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('created', 'Nouveau'), ('beaten', 'Terminé (quête principale)'), ('completed', 'Terminé complètement'), ('excluded', 'Exclu'), ('mastered', 'Usé / Épuisé'), ('unfinished', 'Inachevé')], default='unfinished', help_text='Game progression', max_length=30, verbose_name='état'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='platform',
|
||||
name='name',
|
||||
field=models.CharField(help_text='Nom de plateforme le plus utilisé.', max_length=255, verbose_name='nom'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='timeline',
|
||||
name='date',
|
||||
field=models.DateField(default=datetime.datetime.now, help_text='Status change date', verbose_name='date'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='timeline',
|
||||
name='item',
|
||||
field=models.ForeignKey(help_text='Which game?', on_delete=django.db.models.deletion.CASCADE, to='games.Game', verbose_name='jeu'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='timeline',
|
||||
name='status',
|
||||
field=models.CharField(choices=[('created', 'Nouveau'), ('beaten', 'Terminé (quête principale)'), ('completed', 'Terminé complètement'), ('excluded', 'Exclu'), ('mastered', 'Usé / Épuisé'), ('unfinished', 'Inachevé')], default='created', help_text='New status for this game at the given date', max_length=30, verbose_name='état'),
|
||||
),
|
||||
]
|
@ -73,6 +73,12 @@ class Game(Item):
|
||||
verbose_name_plural = _('games')
|
||||
|
||||
|
||||
# Redefine help_text (for documentation, API, etc.)
|
||||
Game._meta.get_field('name').help_text = _('Game title')
|
||||
Game._meta.get_field('collection').help_text = _('Game running platform')
|
||||
Game._meta.get_field('status').help_text = _('Game progression')
|
||||
|
||||
|
||||
class Timeline(BaseTimeline):
|
||||
TARGET_MODEL = 'games.Game'
|
||||
TARGET_VERBOSE_NAME = 'game'
|
||||
@ -83,3 +89,10 @@ class Timeline(BaseTimeline):
|
||||
ordering = ('-date',)
|
||||
verbose_name = _('Timeline')
|
||||
verbose_name_plural = _('Timelines')
|
||||
|
||||
|
||||
# Redefine help_text (for documentation, API, etc.)
|
||||
Timeline._meta.get_field('date').help_text = _('Status change date')
|
||||
Timeline._meta.get_field('item').help_text = _('Which game?')
|
||||
Timeline._meta.get_field('status').help_text = _(
|
||||
'New status for this game at the given date')
|
||||
|
@ -1,4 +1,4 @@
|
||||
from games.models import Game, Platform
|
||||
from games.models import Game, Platform, Timeline
|
||||
from rest_framework import serializers
|
||||
|
||||
|
||||
@ -16,6 +16,16 @@ class GameSerializer(serializers.HyperlinkedModelSerializer):
|
||||
)
|
||||
|
||||
|
||||
class GameTimelineSerializer(serializers.HyperlinkedModelSerializer):
|
||||
class Meta:
|
||||
model = Timeline
|
||||
fields = (
|
||||
'date',
|
||||
'item',
|
||||
'status',
|
||||
)
|
||||
|
||||
|
||||
class PlatformSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Platform
|
||||
|
@ -1,8 +1,9 @@
|
||||
from django.contrib.auth.models import User
|
||||
from django.urls import reverse
|
||||
from games.models import Game, Platform
|
||||
from games.models import Game, Platform, Timeline
|
||||
from rest_framework import status
|
||||
from rest_framework.test import APITestCase, force_authenticate
|
||||
from datetime import date
|
||||
import json
|
||||
|
||||
|
||||
@ -112,3 +113,46 @@ class GameTest(APITestCase):
|
||||
response = self.client.post(url, data, format='json')
|
||||
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
self.assertEqual(Game.objects.count(), 0)
|
||||
|
||||
|
||||
class TimelineTest(APITestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.superuser = User.objects.create_superuser(
|
||||
'admin',
|
||||
'admin@localhost',
|
||||
'admin')
|
||||
|
||||
def test_create_timeline(self):
|
||||
"""
|
||||
Check we can create a timeline object.
|
||||
"""
|
||||
console = Platform.objects.create(name='BestPlatform4Ever')
|
||||
game = Game.objects.create(
|
||||
name='Cherubin',
|
||||
collection=console,
|
||||
status='created')
|
||||
|
||||
# By default a timeline is generated with current datetime.
|
||||
# We need to change this date.
|
||||
timeline = Timeline.objects.first()
|
||||
timeline.date = date(2017, 9, 15)
|
||||
timeline.save()
|
||||
|
||||
url = reverse('game_timeline-list')
|
||||
data = {
|
||||
'item': reverse('game-detail', kwargs={'pk': game.id}),
|
||||
'date': date(2017, 9, 16),
|
||||
'status': 'beaten',
|
||||
}
|
||||
self.client.force_authenticate(user=self.superuser)
|
||||
response = self.client.post(url, data, format='json')
|
||||
self.assertEqual(
|
||||
response.status_code,
|
||||
status.HTTP_201_CREATED,
|
||||
response.content)
|
||||
self.assertEqual(Timeline.objects.count(), 2)
|
||||
|
||||
def test_sorted_game_timeline(self):
|
||||
# TODO: Check descending date order.
|
||||
pass
|
||||
|
@ -1,10 +1,14 @@
|
||||
from django.db.models import Q
|
||||
from django.views.generic import ListView
|
||||
from rest_framework import viewsets
|
||||
from .serializers import GameSerializer, PlatformSerializer
|
||||
|
||||
from .serializers import (
|
||||
GameSerializer,
|
||||
GameTimelineSerializer,
|
||||
PlatformSerializer
|
||||
)
|
||||
from .models import Game, Platform, Timeline
|
||||
|
||||
|
||||
class PlatformViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
API endpoints that allows platforms to be edited or viewed.
|
||||
@ -22,12 +26,32 @@ class PlatformViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = PlatformSerializer
|
||||
|
||||
|
||||
class GameTimelineViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
API endpoints that allows to keep games life.
|
||||
BE CAREFUL. You shouldn't change these entries because they're generated
|
||||
by Game status change. It could be only useful to change the acquisition
|
||||
date. Not more.
|
||||
|
||||
retrieve:
|
||||
Return the given timeline entry.
|
||||
|
||||
list:
|
||||
Return a list of timeline entries sorted by date in descending order.
|
||||
|
||||
create:
|
||||
Create a new timeline instance.
|
||||
"""
|
||||
queryset = Timeline.objects.all().order_by('-date')
|
||||
serializer_class = GameTimelineSerializer
|
||||
|
||||
|
||||
class GameViewSet(viewsets.ModelViewSet):
|
||||
"""
|
||||
API endpoints that allows games to be edited or viewed.
|
||||
|
||||
retrieve:
|
||||
Return the given game
|
||||
Return the given game.
|
||||
|
||||
list:
|
||||
Return a list of all existing games ordered by name.
|
||||
|
Reference in New Issue
Block a user