API Timeline ajoutée !

This commit is contained in:
2017-09-17 00:04:26 +02:00
parent 95d8b30c3c
commit 92ea2f6af7
10 changed files with 200 additions and 16 deletions

View File

@ -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'),
),
]

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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.