From c3491b79751cb37e5d665f6fde1f913f90b6ee6b Mon Sep 17 00:00:00 2001 From: Olivier DOSSMANN Date: Sun, 3 Sep 2017 10:53:17 +0200 Subject: [PATCH] =?UTF-8?q?Page=20d'accueil=20des=20jeux=20vid=C3=A9os=20:?= =?UTF-8?q?=20regroupement=20par=20date=20pour=20les=20timelines?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Timelines : * regroupement par date sur la page d'accueil des jeux vidéos * ajout de 4 tests concernant cette page * changement du champ 'date' des Timeline par un 'DateField' (au lieu d'un DateTimeField) --- CHANGELOG | 2 +- collection/core/models.py | 2 +- .../migrations/0006_auto_20170901_2041.py | 21 +++++++ collection/games/templates/games/index.html | 15 +++-- collection/games/tests/test_game.py | 56 ++++++++++++++++++- collection/games/views.py | 6 +- 6 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 collection/games/migrations/0006_auto_20170901_2041.py diff --git a/CHANGELOG b/CHANGELOG index 22fce66..b9ccdc7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ Current version (0.2) : - - Ajout d'une page d'accueil listant les jeux vidéos en cours, la liste complète et les dernières activités sur ces derniers + - Ajout d'une page d'accueil listant les jeux vidéos en cours, la liste complète et les 5 dernières activités sur ces derniers triées par date - Nouveau champ 'note' pour la progression dans le jeu - Omission de l'état "Nouveau" pour les jeux - Traduction de l'interface en Français diff --git a/collection/core/models.py b/collection/core/models.py index d8079fe..8b625f1 100644 --- a/collection/core/models.py +++ b/collection/core/models.py @@ -62,7 +62,7 @@ class Timeline(models.Model): TARGET_VERBOSE_NAME = None STATUS_CHOICES = Item.STATUS_CHOICES DEFAULT_CHOICE = Item.CREATED - date = models.DateTimeField(default=datetime.now, verbose_name=_('date')) + date = models.DateField(default=datetime.now, verbose_name=_('date')) @classmethod def on_class_prepared(cls): diff --git a/collection/games/migrations/0006_auto_20170901_2041.py b/collection/games/migrations/0006_auto_20170901_2041.py new file mode 100644 index 0000000..0eafe9f --- /dev/null +++ b/collection/games/migrations/0006_auto_20170901_2041.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-09-01 20:41 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('games', '0005_auto_20170831_1211'), + ] + + operations = [ + migrations.AlterField( + model_name='timeline', + name='date', + field=models.DateField(default=datetime.datetime.now, verbose_name='date'), + ), + ] diff --git a/collection/games/templates/games/index.html b/collection/games/templates/games/index.html index 131f1ab..86647c3 100644 --- a/collection/games/templates/games/index.html +++ b/collection/games/templates/games/index.html @@ -26,14 +26,19 @@ {% endif %}

{% trans "Memory Card" %}

{% if last_timelines %} - +

{% else %}

{% trans "Empty memory." %}

{% endif %} diff --git a/collection/games/tests/test_game.py b/collection/games/tests/test_game.py index 7ff186b..b966fae 100644 --- a/collection/games/tests/test_game.py +++ b/collection/games/tests/test_game.py @@ -10,11 +10,20 @@ class GameTest(TestCase): def setUp(self): self.console = Console.objects.create(name='BestConsole4Ever') Game.objects.create( - name='Deponia', playing=False, collection=self.console) + name='Deponia', + playing=True, + collection=self.console, + status=Game.EXCLUDED) Game.objects.create( name='Aladdin', playing=True, collection=self.console) Game.objects.create( name='Persona 5', playing=True, collection=self.console) + Game.objects.create( + name='The Witcher III', + playing=False, + collection=self.console, + wish=True) + self.index_url = '/games/' def test_game_are_sorted_by_playing_and_name(self): @@ -26,3 +35,48 @@ class GameTest(TestCase): sorted_games = list(Game.objects.all().order_by( '-playing', 'name').values_list('name', flat=True)) self.assertEqual(games, sorted_games) + + def test_index(self): + """ + Context gives 'playing_games'. + Context gives 'last_timelines'. + """ + res = self.client.get(self.index_url) + self.assertEqual(res.status_code, 200) + self.assertTrue('playing_games' in res.context) + self.assertTrue('last_timelines' in res.context) + self.assertTrue('object_list' in res.context) + + def test_index_queryset(self): + """ + Queryset excludes wishlist games. + Queryset excludes games that have status EXCLUDED. + Queryset is sorted by name. + """ + res = self.client.get(self.index_url) + games = res.context.get('object_list') + for game in games: + self.assertFalse(game.wish) + self.assertTrue(game.status != Game.EXCLUDED) + sorted_games = list(games.order_by('name')) + self.assertEqual([x.name for x in games], [s.name for s in sorted_games]) + + def test_index_playing_games(self): + """ + 'playing_games' contains games that have playing=True. + """ + res = self.client.get(self.index_url) + playing_games = res.context.get('playing_games') + for game in playing_games: + self.assertTrue(game.playing) + + def test_index_last_timelines(self): + """ + 'last_timelines' only have 5 items. + 'last_timelines' have NO games with status EXCLUDED. + """ + res = self.client.get(self.index_url) + games = res.context.get('last_timelines') + self.assertEqual(len(games), 5) + for game in games: + self.assertTrue(game.status != Game.EXCLUDED) diff --git a/collection/games/views.py b/collection/games/views.py index f273bef..742b985 100644 --- a/collection/games/views.py +++ b/collection/games/views.py @@ -20,6 +20,8 @@ class GameList(ListView): context = super(GameList, self).get_context_data(**kwargs) context['playing_games'] = Game.objects.filter( playing=True).order_by('name') - context['last_timelines'] = Timeline.objects.all().order_by( + context['last_timelines'] = Timeline.objects.filter( + ~Q(item__status=Game.EXCLUDED) + ).order_by( '-date')[:5] - return context \ No newline at end of file + return context