]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #2609 from wallabag/rss-paging
authorJeremy Benoist <j0k3r@users.noreply.github.com>
Sun, 20 Nov 2016 09:17:37 +0000 (10:17 +0100)
committerGitHub <noreply@github.com>
Sun, 20 Nov 2016 09:17:37 +0000 (10:17 +0100)
RSS paging

18 files changed:
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.da.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.en.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.es.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fa.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.fr.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.it.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.oc.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pl.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.pt.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.ro.yml
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.tr.yml
docs/de/user/configuration.rst
docs/en/user/configuration.rst
docs/fr/user/configuration.rst
src/Wallabag/CoreBundle/Controller/RssController.php
src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/entries.xml.twig
tests/Wallabag/CoreBundle/Controller/RssControllerTest.php

index 8ee0a3035776437aa4910ab5b2decb6d8e5a8ed8..fac3b4f876fa380943f8fb5a073af9765061b025 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Download billeder på din server
 carrot: Aktiver deling til Carrot
 diaspora_url: Diaspora URL, hvis tjenesten er aktiv
index 73a9d640f1fe2a9cc59912b2498485f909caa1a6..d382733c53315829aa46bcacbde50453b25e5aa4 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Bilder auf den Server herunterladen
 carrot: Teilen zu Carrot aktivieren
 diaspora_url: Diaspora-URL, sofern der Service aktiviert ist
index c8c13805cbee662a2e9bccebf7dc66c5d4af646a..23de7a434a06a89b1d00f1976633615433095090 100644 (file)
@@ -1,3 +1,4 @@
+settings_changed: Configuration updated
 download_pictures: Download pictures on your server
 carrot: Enable share to Carrot
 diaspora_url: Diaspora URL, if the service is enabled
index 0ea98d8f0e71e7addda62cf9369e0b4dd7278e9c..ff1dd04ff6abbd704cfe134725aac85f9caaf444 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Descargar imágenes
 carrot: Activar compartir con Carrot
 diaspora_url: Diaspora URL, si el servicio está activado
index c527b971db2002a5217be890f399b86e6cfef8bb..4e712fdde5d6ae0a4a4c974bd52f09b5955ac578 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: تصاویر را در کارگزار خودتان باربگیرید
 carrot: فعال‌سازی هم‌رسانی به Carrot
 diaspora_url: نشانی Diaspora، اگر فعال بود
index 176e7c866e19901f43e74797a283e78000f17c6b..cae4c662dd382eca296cdab154dba7c71ff52cfd 100644 (file)
@@ -1,3 +1,4 @@
+settings_changed: Configuration mise à jour
 download_pictures: Télécharger les images sur le serveur
 carrot: Activer le partage vers Carrot
 diaspora_url: URL de Diaspora, si le service Diaspora est activé
index 621d4dcd8af751ffebc044ee9384e04a114983b2..f94f834f6693455e8e0cd0468e3f71deae05a5d9 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Scarica le immagini sul tuo server
 carrot: Abilita la condivisione con Carrot
 diaspora_url: Diaspora URL, se il servizio è abilitato
index 04accd4549aa9dc9db9d2d0c94722ceefb048373..de60a194856d58194881f859680357be8450cae2 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Telecargar los imatges sul servidor
 carrot: Activar lo partatge cap a Carrot
 diaspora_url: URL de Diaspora, se lo servici Diaspora es activat
index 2f4f31547b3a85b4516abeea0834daa087872bf1..1157974516287d2614b69f7f15bb488e4831cb29 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Pobierz obrazy na swój serwer
 carrot: Włącz udostępnianie dla Carrot
 diaspora_url: Adres URL Diaspora, jeżeli usługa jest włączona
index 5da940e9c5205cfd1ba5c7c040eb9cf340d3773c..74ae5a44f3af6a07d615e126ffe811d72f3439eb 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Download imagens no seu servidor
 carrot: Habilitar compartilhamento para o Carrot
 diaspora_url: URL Diaspora, se o serviço está habilitado
@@ -8,7 +9,8 @@ export_csv: Habilita exportação para CSV
 export_json: Habilita exportação para JSON
 export_txt: Habilita exportação para TXT
 export_xml: Habilita exportação para XML
-pocket_consumer_key: Chave de consumidor do Pocket para importar conteúdo (https://getpocket.com/developer/docs/authentication)
+# import_with_rabbitmq: Enable RabbitMQ to import data asynchronously
+# import_with_redis: Enable Redis to import data asynchronously
 shaarli_url: URL Shaarli, se o serviço está habilitado
 share_diaspora: Habilitar compartilhamento para o Diaspora
 share_mail: Habilitar compartilhamento por e-mail
@@ -28,3 +30,5 @@ piwik_site_id: ID de seu website Piwik
 piwik_enabled: Habilitar Piwik
 demo_mode_enabled: "Habilitar modo demo? (somente usado para o demo público do wallabag)"
 demo_mode_username: "Usuário demo"
+# share_public: Allow public url for entries
+# download_images_enabled: Download images locally
index 6d2eaffdef778be08221efd450820a3b4382422e..5095dfa00417331be346bded4bb2ad34a7c4e61e 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 download_pictures: Descarcă poze pe server
 carrot: Permite share către Carrot
 diaspora_url: Diaspora URL, dacă serviciul este permis
index 9146bfb635595a5e3ec785e3815e9bd31ca02649..cd42e595d4524b8f6e86caf894065f66e1de8869 100644 (file)
@@ -1,3 +1,4 @@
+# settings_changed: Configuration updated
 # download_pictures: Download pictures on your server
 # carrot: Enable share to Carrot
 # diaspora_url: Diaspora URL, if the service is enabled
index c0a8cd67a79864552d228f634aa30726d49f047a..47c60f4c905219da06f66ff731d3d3299c24e6c4 100644 (file)
@@ -52,6 +52,9 @@ Jetzt hast du drei Links, einen für jeden Status: Füge sie in deinem liebsten
 
 Du kannst auch definieren wie viele Artikel du in deinem RSS Feed (Standardwert: 50) haben willst.
 
+There is also a pagination available for these feeds. You can add ``?page=2`` to jump to the second page.
+The pagination follow `the RFC <https://tools.ietf.org/html/rfc5005#page-4>`_ about that, which means you'll find the ``next``, ``previous`` & ``last`` page link inside the `<channel>` tag of each RSS feed.
+
 Benutzer-Informationen
 ----------------------
 
index a52d3ddd9860324ce8354d3f9eb1cde1af916aa4..caca834f26e07487e5e78e158e53bec3a93edd73 100644 (file)
@@ -52,6 +52,9 @@ Now you have three links, one for each status: add them into your favourite RSS
 
 You can also define how many articles you want in each RSS feed (default value: 50).
 
+There is also a pagination available for these feeds. You can add ``?page=2`` to jump to the second page.
+The pagination follow `the RFC <https://tools.ietf.org/html/rfc5005#page-4>`_ about that, which means you'll find the ``next``, ``previous`` & ``last`` page link inside the `<channel>` tag of each RSS feed.
+
 User information
 ----------------
 
index 5ce80f58a30c3d6646d76ad946d217b7928dfe82..025b05bb1979d2709261daafd7e145d251fbc1bd 100644 (file)
@@ -53,6 +53,9 @@ Vous avez maintenant trois liens, un par statut : ajoutez-les dans votre agrég
 Vous pouvez aussi définir combien d'articles vous souhaitez dans vos flux RSS
 (50 est la valeur par défaut).
 
+Une pagination est aussi disponible pour ces flux. Il suffit de rajouter ``?page=2`` pour aller à la seconde page, par exemple.
+Cette pagination suit `la RFC <https://tools.ietf.org/html/rfc5005#page-4>`_, ce qui signifie que vous trouverez la page suivante (``next``), précédente (``previous``) et la dernière (``last``) dans la balise `<channel>` de chaque flux RSS.
+
 Mon compte
 ----------
 
index 38e3b5a0ed7f2f7262f9aa3b98a887694d8b9df6..2290386f576df3fc4ecd35cee0653d20ad459542 100644 (file)
@@ -3,12 +3,15 @@
 namespace Wallabag\CoreBundle\Controller;
 
 use Pagerfanta\Adapter\DoctrineORMAdapter;
+use Pagerfanta\Exception\OutOfRangeCurrentPageException;
 use Pagerfanta\Pagerfanta;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\UserBundle\Entity\User;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 
 class RssController extends Controller
 {
@@ -20,9 +23,9 @@ class RssController extends Controller
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    public function showUnreadAction(User $user)
+    public function showUnreadAction(Request $request, User $user)
     {
-        return $this->showEntries('unread', $user);
+        return $this->showEntries('unread', $user, $request->query->get('page', 1));
     }
 
     /**
@@ -33,9 +36,9 @@ class RssController extends Controller
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    public function showArchiveAction(User $user)
+    public function showArchiveAction(Request $request, User $user)
     {
-        return $this->showEntries('archive', $user);
+        return $this->showEntries('archive', $user, $request->query->get('page', 1));
     }
 
     /**
@@ -46,9 +49,9 @@ class RssController extends Controller
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    public function showStarredAction(User $user)
+    public function showStarredAction(Request $request, User $user)
     {
-        return $this->showEntries('starred', $user);
+        return $this->showEntries('starred', $user, $request->query->get('page', 1));
     }
 
     /**
@@ -57,10 +60,11 @@ class RssController extends Controller
      *
      * @param string $type Entries type: unread, starred or archive
      * @param User   $user
+     * @param int    $page
      *
      * @return \Symfony\Component\HttpFoundation\Response
      */
-    private function showEntries($type, User $user)
+    private function showEntries($type, User $user, $page = 1)
     {
         $repository = $this->getDoctrine()->getRepository('WallabagCoreBundle:Entry');
 
@@ -87,8 +91,26 @@ class RssController extends Controller
         $perPage = $user->getConfig()->getRssLimit() ?: $this->getParameter('wallabag_core.rss_limit');
         $entries->setMaxPerPage($perPage);
 
+        $url = $this->generateUrl(
+            $type.'_rss',
+            [
+                'username' => $user->getUsername(),
+                'token' => $user->getConfig()->getRssToken(),
+            ],
+            UrlGeneratorInterface::ABSOLUTE_URL
+        );
+
+        try {
+            $entries->setCurrentPage((int) $page);
+        } catch (OutOfRangeCurrentPageException $e) {
+            if ($page > 1) {
+                return $this->redirect($url.'?page='.$entries->getNbPages(), 302);
+            }
+        }
+
         return $this->render('@WallabagCore/themes/common/Entry/entries.xml.twig', [
             'type' => $type,
+            'url' => $url,
             'entries' => $entries,
         ]);
     }
index 288bb54f884c18019341d95c8fb2f3e812221baf..16ecaa97988795818701d8b42edbabcc15d7c1dd 100644 (file)
@@ -2,7 +2,15 @@
 <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
     <channel>
         <title>wallabag — {{type}} feed</title>
-        <link>{{ url('unread') }}</link>
+        <link>{{ url(type) }}</link>
+        <link rel="self" href="{{ app.request.uri }}"/>
+        {% if entries.hasPreviousPage -%}
+            <link rel="previous" href="{{ url }}?page={{ entries.previousPage }}"/>
+        {% endif -%}
+        {% if entries.hasNextPage -%}
+            <link rel="next" href="{{ url }}?page={{ entries.nextPage }}"/>
+        {% endif -%}
+        <link rel="last" href="{{ url }}?page={{ entries.nbPages }}"/>
         <pubDate>{{ "now"|date('D, d M Y H:i:s') }}</pubDate>
         <generator>wallabag</generator>
         <description>wallabag {{type}} elements</description>
index fb6fe06a60e039400d7be97910c685ddd47d055c..5a59654d3601c644c1ed611d5e24354c13a5dbc0 100644 (file)
@@ -6,7 +6,7 @@ use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
 
 class RssControllerTest extends WallabagCoreTestCase
 {
-    public function validateDom($xml, $nb = null)
+    public function validateDom($xml, $type, $nb = null)
     {
         $doc = new \DOMDocument();
         $doc->loadXML($xml);
@@ -22,6 +22,23 @@ class RssControllerTest extends WallabagCoreTestCase
         $this->assertEquals(1, $xpath->query('/rss')->length);
         $this->assertEquals(1, $xpath->query('/rss/channel')->length);
 
+        $this->assertEquals(1, $xpath->query('/rss/channel/title')->length);
+        $this->assertEquals('wallabag — '.$type.' feed', $xpath->query('/rss/channel/title')->item(0)->nodeValue);
+
+        $this->assertEquals(1, $xpath->query('/rss/channel/pubDate')->length);
+
+        $this->assertEquals(1, $xpath->query('/rss/channel/generator')->length);
+        $this->assertEquals('wallabag', $xpath->query('/rss/channel/generator')->item(0)->nodeValue);
+
+        $this->assertEquals(1, $xpath->query('/rss/channel/description')->length);
+        $this->assertEquals('wallabag '.$type.' elements', $xpath->query('/rss/channel/description')->item(0)->nodeValue);
+
+        $this->assertEquals(1, $xpath->query('/rss/channel/link[@rel="self"]')->length);
+        $this->assertContains($type.'.xml', $xpath->query('/rss/channel/link[@rel="self"]')->item(0)->getAttribute('href'));
+
+        $this->assertEquals(1, $xpath->query('/rss/channel/link[@rel="last"]')->length);
+        $this->assertContains($type.'.xml?page=', $xpath->query('/rss/channel/link[@rel="last"]')->item(0)->getAttribute('href'));
+
         foreach ($xpath->query('//item') as $item) {
             $this->assertEquals(1, $xpath->query('title', $item)->length);
             $this->assertEquals(1, $xpath->query('source', $item)->length);
@@ -77,7 +94,7 @@ class RssControllerTest extends WallabagCoreTestCase
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
 
-        $this->validateDom($client->getResponse()->getContent(), 2);
+        $this->validateDom($client->getResponse()->getContent(), 'unread', 2);
     }
 
     public function testStarred()
@@ -99,7 +116,7 @@ class RssControllerTest extends WallabagCoreTestCase
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode(), 1);
 
-        $this->validateDom($client->getResponse()->getContent());
+        $this->validateDom($client->getResponse()->getContent(), 'starred');
     }
 
     public function testArchives()
@@ -121,6 +138,34 @@ class RssControllerTest extends WallabagCoreTestCase
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
 
-        $this->validateDom($client->getResponse()->getContent());
+        $this->validateDom($client->getResponse()->getContent(), 'archive');
+    }
+
+    public function testPagination()
+    {
+        $client = $this->getClient();
+        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
+        $user = $em
+            ->getRepository('WallabagUserBundle:User')
+            ->findOneByUsername('admin');
+
+        $config = $user->getConfig();
+        $config->setRssToken('SUPERTOKEN');
+        $config->setRssLimit(1);
+        $em->persist($config);
+        $em->flush();
+
+        $client = $this->getClient();
+
+        $client->request('GET', '/admin/SUPERTOKEN/unread.xml');
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+        $this->validateDom($client->getResponse()->getContent(), 'unread');
+
+        $client->request('GET', '/admin/SUPERTOKEN/unread.xml?page=2');
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+        $this->validateDom($client->getResponse()->getContent(), 'unread');
+
+        $client->request('GET', '/admin/SUPERTOKEN/unread.xml?page=3000');
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
     }
 }