]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #3139 from Kdecherf/2502-tag-case
authorJérémy Benoist <j0k3r@users.noreply.github.com>
Sun, 3 Sep 2017 18:25:15 +0000 (20:25 +0200)
committerGitHub <noreply@github.com>
Sun, 3 Sep 2017 18:25:15 +0000 (20:25 +0200)
Ignore tag's case

app/DoctrineMigrations/Version20170824113337.php [new file with mode: 0644]
app/Resources/CraueConfigBundle/translations/CraueConfigBundle.de.yml
src/Wallabag/ApiBundle/Controller/EntryRestController.php
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Repository/EntryRepository.php
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php

diff --git a/app/DoctrineMigrations/Version20170824113337.php b/app/DoctrineMigrations/Version20170824113337.php
new file mode 100644 (file)
index 0000000..7393d68
--- /dev/null
@@ -0,0 +1,63 @@
+<?php
+
+namespace Application\Migrations;
+
+use Doctrine\DBAL\Migrations\AbstractMigration;
+use Doctrine\DBAL\Schema\Schema;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Add starred_at column and set its value to updated_at for is_starred entries.
+ */
+class Version20170824113337 extends AbstractMigration implements ContainerAwareInterface
+{
+    /**
+     * @var ContainerInterface
+     */
+    private $container;
+
+    public function setContainer(ContainerInterface $container = null)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function up(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf($entryTable->hasColumn('starred_at'), 'It seems that you already played this migration.');
+
+        $entryTable->addColumn('starred_at', 'datetime', [
+            'notnull' => false,
+        ]);
+    }
+
+    public function postUp(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+        $this->skipIf(!$entryTable->hasColumn('starred_at'), 'Unable to add starred_at colum');
+
+        $this->connection->executeQuery('UPDATE ' . $this->getTable('entry') . ' SET starred_at = updated_at WHERE is_starred = true');
+    }
+
+    /**
+     * @param Schema $schema
+     */
+    public function down(Schema $schema)
+    {
+        $entryTable = $schema->getTable($this->getTable('entry'));
+
+        $this->skipIf(!$entryTable->hasColumn('starred_at'), 'It seems that you already played this migration.');
+
+        $entryTable->dropColumn('starred_at');
+    }
+
+    private function getTable($tableName)
+    {
+        return $this->container->getParameter('database_table_prefix') . $tableName;
+    }
+}
index f57db3032d976d68f58398923deb321dffd59d0f..a066c8e3fa4a0b68cd6d98fa97f866a9bd06dab9 100644 (file)
@@ -1,36 +1,36 @@
-# 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
-export_epub: ePUB-Export aktivieren
-export_mobi: mobi-Export aktivieren
-export_pdf: PDF-Export aktivieren
-export_csv: CSV-Export aktivieren
-export_json: JSON-Export aktivieren
-export_txt: TXT-Export aktivieren
-export_xml: XML-Export aktivieren
-import_with_rabbitmq: Aktiviere RabbitMQ, um Artikel asynchron zu importieren
-import_with_redis: Aktiviere Redis, um Artikel asynchron zu importieren
-shaarli_url: Shaarli-URL, sofern der Service aktiviert ist
-share_diaspora: Teilen zu Diaspora aktiveren
-share_mail: Teilen via E-Mail aktiveren
-share_shaarli: Teilen zu Shaarli aktiveren
-share_scuttle: Teilen zu Scuttle aktiveren
-share_twitter: Teilen zu Twitter aktiveren
-share_unmark: Teilen zu Unmark.it aktiveren
-show_printlink: Link anzeigen, um den Inhalt auszudrucken
-wallabag_support_url: Support-URL für wallabag
-entry: "Artikel"
-export: "Export"
-import: "Import"
-misc: "Verschiedenes"
-modify_settings: "Übernehmen"
-piwik_host: Host deiner Webseite in Piwik (ohne http:// oder https://)
-piwik_site_id: ID deiner Webseite in Piwik
-piwik_enabled: Piwik aktivieren
-demo_mode_enabled: "Test-Modus aktivieren? (nur für die öffentliche wallabag-Demo genutzt)"
-demo_mode_username: "Test-Benutzer"
-share_public: Erlaube eine öffentliche URL für Einträge
-# download_images_enabled: Download images locally
-# restricted_access: Enable authentication for websites with paywall
-# api_user_registration: Enable user to be registered using the API
+settings_changed: 'Konfiguration aktualisiert'
+download_pictures: 'Bilder auf den Server herunterladen'
+carrot: 'Teilen zu Carrot aktivieren'
+diaspora_url: 'Diaspora-URL, sofern der Service aktiviert ist'
+export_epub: 'ePUB-Export aktivieren'
+export_mobi: 'mobi-Export aktivieren'
+export_pdf: 'PDF-Export aktivieren'
+export_csv: 'CSV-Export aktivieren'
+export_json: 'JSON-Export aktivieren'
+export_txt: 'TXT-Export aktivieren'
+export_xml: 'XML-Export aktivieren'
+import_with_rabbitmq: 'Aktiviere RabbitMQ, um Artikel asynchron zu importieren'
+import_with_redis: 'Aktiviere Redis, um Artikel asynchron zu importieren'
+shaarli_url: 'Shaarli-URL, sofern der Service aktiviert ist'
+share_diaspora: 'Teilen zu Diaspora aktiveren'
+share_mail: 'Teilen via E-Mail aktiveren'
+share_shaarli: 'Teilen zu Shaarli aktiveren'
+share_twitter: 'Teilen zu Twitter aktiveren'
+share_unmark: 'Teilen zu Unmark.it aktiveren'
+show_printlink: 'Link anzeigen, um den Inhalt auszudrucken'
+wallabag_support_url: 'Support-URL für wallabag'
+wallabag_url: 'URL von *deiner* wallabag-Instanz'
+entry: 'Artikel'
+export: 'Export'
+import: 'Import'
+misc: 'Verschiedenes'
+modify_settings: 'Übernehmen'
+piwik_host: 'Host deiner Webseite in Piwik (ohne http:// oder https://)'
+piwik_site_id: 'ID deiner Webseite in Piwik'
+piwik_enabled: 'Piwik aktivieren'
+demo_mode_enabled: 'Test-Modus aktivieren? (nur für die öffentliche wallabag-Demo genutzt)'
+demo_mode_username: 'Test-Benutzer'
+share_public: 'Erlaube eine öffentliche URL für Einträge'
+download_images_enabled: 'Bilder lokal herunterladen'
+restricted_access: 'Authentifizierung für Webseiten mit Paywall aktivieren'
+api_user_registration: 'Registrierung eines Benutzers über die API ermöglichen'
index bc1b6f926ecbf28a04aeca3b8e4e7650199f599d..6db977310666e159fec81ef51558e572cacc3fcf 100644 (file)
@@ -361,7 +361,7 @@ class EntryRestController extends WallabagRestController
         }
 
         if (null !== $data['isStarred']) {
-            $entry->setStarred((bool) $data['isStarred']);
+            $entry->updateStar((bool) $data['isStarred']);
         }
 
         if (!empty($data['tags'])) {
@@ -464,7 +464,7 @@ class EntryRestController extends WallabagRestController
         }
 
         if (null !== $data['isStarred']) {
-            $entry->setStarred((bool) $data['isStarred']);
+            $entry->updateStar((bool) $data['isStarred']);
         }
 
         if (!empty($data['tags'])) {
index 3dcfbebeeb00f94afde4cf42dc658411a026b395..b0b74c381641c97425f6dca473f7ddd36bde89ea 100644 (file)
@@ -333,6 +333,7 @@ class EntryController extends Controller
         $this->checkUserAction($entry);
 
         $entry->toggleStar();
+        $entry->updateStar($entry->isStarred());
         $this->getDoctrine()->getManager()->flush();
 
         $message = 'flashes.entry.notice.entry_unstarred';
index 61d01bdcdadd5f0a52ceb3e66f08ae1eb0228cb9..4367902ee5b45bc4a410bf5fd54f533451fbba8f 100644 (file)
@@ -142,6 +142,15 @@ class Entry
      */
     private $publishedBy;
 
+    /**
+     * @var \DateTime
+     *
+     * @ORM\Column(name="starred_at", type="datetime", nullable=true)
+     *
+     * @Groups({"entries_for_user", "export_all"})
+     */
+    private $starredAt = null;
+
     /**
      * @ORM\OneToMany(targetEntity="Wallabag\AnnotationBundle\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
      * @ORM\JoinTable
@@ -475,6 +484,44 @@ class Entry
         return $this->updatedAt;
     }
 
+    /**
+     * @return \DateTime|null
+     */
+    public function getStarredAt()
+    {
+        return $this->starredAt;
+    }
+
+    /**
+     * @param \DateTime|null $starredAt
+     *
+     * @return Entry
+     */
+    public function setStarredAt($starredAt = null)
+    {
+        $this->starredAt = $starredAt;
+
+        return $this;
+    }
+
+    /**
+     * update isStarred and starred_at fields.
+     *
+     * @param bool $isStarred
+     *
+     * @return Entry
+     */
+    public function updateStar($isStarred = false)
+    {
+        $this->setStarred($isStarred);
+        $this->setStarredAt(null);
+        if ($this->isStarred()) {
+            $this->setStarredAt(new \DateTime());
+        }
+
+        return $this;
+    }
+
     /**
      * @return ArrayCollection<Annotation>
      */
index eb5e3205ceeb8b41c81d182e2d9a99f1c33f3d83..ecc159fc0463b8585c75d90e1a8ba53d76e99d80 100644 (file)
@@ -65,7 +65,7 @@ class EntryRepository extends EntityRepository
     public function getBuilderForStarredByUser($userId)
     {
         return $this
-            ->getBuilderByUser($userId)
+            ->getBuilderByUser($userId, 'starredAt', 'desc')
             ->andWhere('e.isStarred = true')
         ;
     }
@@ -401,15 +401,16 @@ class EntryRepository extends EntityRepository
     /**
      * Return a query builder to used by other getBuilderFor* method.
      *
-     * @param int $userId
+     * @param int    $userId
+     * @param string $sortBy
+     * @param string $direction
      *
      * @return QueryBuilder
      */
-    private function getBuilderByUser($userId)
+    private function getBuilderByUser($userId, $sortBy = 'createdAt', $direction = 'desc')
     {
         return $this->createQueryBuilder('e')
             ->andWhere('e.user = :userId')->setParameter('userId', $userId)
-            ->orderBy('e.createdAt', 'desc')
-        ;
+            ->orderBy(sprintf('e.%s', $sortBy), $direction);
     }
 }
index 6424df8d3ba710f064bb94f00612f0fc6ae36c94..12cead487af8f21aeff0e071abcff87a67942fec 100644 (file)
@@ -86,7 +86,7 @@
 
     <!-- Export -->
     <aside id="download-form">
-    {% set currentTag = '' %}
+    {% set currentTag = null %}
     {% if tag is defined %}
         {% set currentTag = tag %}
     {% endif %}
index 0c4dc80b6333491cc6b79adf75120a9b28e49b49..9d6fb3f56b77390418d3b289eb799404782c811b 100644 (file)
@@ -57,7 +57,7 @@
 
     <!-- Export -->
     <div id="export" class="side-nav right-aligned">
-    {% set currentTag = '' %}
+    {% set currentTag = null %}
     {% if tag is defined %}
         {% set currentTag = tag.slug %}
     {% endif %}
index 2dc08be2e1174a51284e4d8f7593f6b24a4cdd56..f4c8a6304f7477b1907932384793472cb652cc14 100644 (file)
@@ -407,6 +407,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertSame('http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html', $content['url']);
         $this->assertSame(0, $content['is_archived']);
         $this->assertSame(0, $content['is_starred']);
+        $this->assertNull($content['starred_at']);
         $this->assertSame('New title for my article', $content['title']);
         $this->assertSame(1, $content['user_id']);
         $this->assertCount(2, $content['tags']);
@@ -483,6 +484,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testPostArchivedAndStarredEntry()
     {
+        $now = new \DateTime();
         $this->client->request('POST', '/api/entries.json', [
             'url' => 'http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html',
             'archive' => '1',
@@ -497,6 +499,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertSame('http://www.lemonde.fr/idees/article/2016/02/08/preserver-la-liberte-d-expression-sur-les-reseaux-sociaux_4861503_3232.html', $content['url']);
         $this->assertSame(1, $content['is_archived']);
         $this->assertSame(1, $content['is_starred']);
+        $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
         $this->assertSame(1, $content['user_id']);
     }
 
@@ -753,6 +756,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testSaveIsStarredAfterPatch()
     {
+        $now = new \DateTime();
         $entry = $this->client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
@@ -770,6 +774,7 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
         $this->assertSame(1, $content['is_starred']);
+        $this->assertGreaterThanOrEqual($now->getTimestamp(), (new \DateTime($content['starred_at']))->getTimestamp());
     }
 
     public function dataForEntriesExistWithUrl()