]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #2118 from wallabag/prepare-205
authorNicolas Lœuillet <nicolas@loeuillet.org>
Tue, 31 May 2016 19:45:01 +0000 (21:45 +0200)
committerNicolas Lœuillet <nicolas@loeuillet.org>
Tue, 31 May 2016 19:45:01 +0000 (21:45 +0200)
Prepare wallabag 2.0.5

33 files changed:
docs/en/user/android.rst
docs/en/user/faq.rst
docs/en/user/installation.rst
docs/img/user/android_configuration_connection_test.en.png [new file with mode: 0644]
docs/img/user/android_configuration_connection_test_success.en.png [new file with mode: 0644]
docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png [new file with mode: 0644]
docs/img/user/android_configuration_filled_in.en.png [new file with mode: 0644]
docs/img/user/android_configuration_get_feed_credentials.en.png [new file with mode: 0644]
docs/img/user/android_configuration_saved_feed_update.en.png [new file with mode: 0644]
docs/img/user/android_configuration_screen.en.png [new file with mode: 0644]
docs/img/user/android_configuration_scroll_bottom.en.png [new file with mode: 0644]
docs/img/user/android_unread_feed_synced.en.png [new file with mode: 0644]
docs/img/user/android_welcome_screen.en.png [new file with mode: 0644]
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/DataFixtures/ORM/LoadConfigData.php
src/Wallabag/CoreBundle/DataFixtures/ORM/LoadTaggingRuleData.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Entity/Tag.php
src/Wallabag/CoreBundle/Form/Type/EntryFilterType.php
src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Entry/entries.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/CoreBundle/Tests/Controller/EntryControllerTest.php

index c13cf031b63442ea9916f2ac965e190d6bd15217..4271f03730bb3a5abe21e42cf5a5a80f5d725171 100644 (file)
@@ -13,61 +13,61 @@ Steps to configure your app
 
 When you first start the app, you see the welcome screen, where you are adviced to configure the app for your wallabag instance at first.
 
-.. image:: ../../img/user/android_welcome_screen.de.png
+.. image:: ../../img/user/android_welcome_screen.en.png
     :alt: Welcome screen
     :align: center
 
 Just confirm that message and you get redirected to the settings screen.
 
-.. image:: ../../img/user/android_configuration_screen.de.png
+.. image:: ../../img/user/android_configuration_screen.en.png
     :alt: Settings screen
     :align: center
 
 Fill in your wallabag data. You need to enter your wallabag address. It is important that this URL does not end with a slash. Also add your wallabag credentials to the user name and password field.
 
-.. image:: ../../img/user/android_configuration_filled_in.de.png
+.. image:: ../../img/user/android_configuration_filled_in.en.png
     :alt: Filled in settings
     :align: center
 
 After you have filled in your data, push the button Connection test and wait for the test to finish. 
 
-.. image:: ../../img/user/android_configuration_connection_test.de.png
+.. image:: ../../img/user/android_configuration_connection_test.en.png
     :alt: Connection test with your wallabag data
     :align: center
 
 The connection test shall finish with success. If not, you need to fix this first until you proceed. 
 
-.. image:: ../../img/user/android_configuration_connection_test_success.de.png
+.. image:: ../../img/user/android_configuration_connection_test_success.en.png
     :alt: Connection test successful
     :align: center
 
 After the connection test was successful, you can push the button to get your feed credentials. The app now tries to login to your wallabag instance and get the user id and the corresponding token for the feeds.
 
-.. image:: ../../img/user/android_configuration_get_feed_credentials.de.png
+.. image:: ../../img/user/android_configuration_get_feed_credentials.en.png
     :alt: Getting the feed credentials
     :align: center
 
 When the process of getting your feed credentials finishes with success you see a toast message that the user id and the token were automatically filled in to the form.
 
-.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.de.png
+.. image:: ../../img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
     :alt: Getting feed credentials successful
     :align: center
 
 Now you need to scroll to the bottom of the settings menu. Of course you can adjust the given settings to your needs. Finish the configuration of your app with pushing the save button.
 
-.. image:: ../../img/user/android_configuration_scroll_bottom.de.png
+.. image:: ../../img/user/android_configuration_scroll_bottom.en.png
     :alt: Bottom of the settings screen
     :align: center
 
 After hitting the save button, you get the following screen. The app proposes to initiate a syncronisation process to update your feeds of articles. It is recommended to acknowledge this action and press Yes.
 
-.. image:: ../../img/user/android_configuration_saved_feed_update.de.png
+.. image:: ../../img/user/android_configuration_saved_feed_update.en.png
     :alt: Settings saved the first time
     :align: center
 
 Finally after the syncronisation finished successfully, you are presented the list of unread articles. 
 
-.. image:: ../../img/user/android_unread_feed_synced.de.png
+.. image:: ../../img/user/android_unread_feed_synced.en.png
     :alt: Filled article list cause feeds successfully syncronized
     :align: center
 
index 1e36dc2601d6ece45b7f9c09585fd7e49b45fd0a..61303604fb46b9cc2f31c39c69e0d59c191763fa 100644 (file)
@@ -1,26 +1,39 @@
 Frequently Asked Questions
 ==========================
 
-During the installation, I've got this error ``Error Output: sh: 1: @post-cmd: not found``
-------------------------------------------------------------------------------------------
+During the installation, I got the error ``Error Output: sh: 1: @post-cmd: not found``
+--------------------------------------------------------------------------------------
 
 It seems you have a problem with your ``composer`` installation. Try to uninstall and reinstall it.
 
 `Read the documentation about composer to know how to install it
 <https://getcomposer.org/doc/00-intro.md>`__.
 
-I can't valid the registration form
------------------------------------
+I can't validate the registration form
+--------------------------------------
 
-Make sure that all fields are well filled:
+Ensure that all fields are properly filled:
 
 * valid email address
 * same passwords in two fields
 
-I don't receive my activation email
------------------------------------
+I'm not receiving my activation email
+-------------------------------------
 
-Are you sure your email address was correct? Did you check your spams folder?
+Are you sure your email address was correct? Did you check your spam folder?
+
+If you still don't see the activation email, please ensure that you have
+installed and properly configured a mail transfer agent. Be sure to include a
+firewall rule for SMTP. E.g., if using firewalld:
+
+::
+
+    firewall-cmd --permanent --add-service=smtp
+    firewall-cmd --reload
+
+Lastly, if you have SELinux enabled, set the following rule:
+
+``setsebool -P httpd_can_sendmail 1``
 
 When I click on the activation link, I've got this message: ``The user with confirmation token "DtrOPfbQeVkWf6N" does not exist``.
 ----------------------------------------------------------------------------------------------------------------------------------
index 94ee05d4cf23bf72c8e7b18985cdddec866225ab..2c6a2f5f6e83c8cd0171bd80ed4629543d93828c 100644 (file)
@@ -23,13 +23,13 @@ You'll need the following extensions for wallabag to work. Some of these may alr
 - php-gettext
 - php-tokenizer
 
-wallabag uses PDO to connect to database, so you'll need one of:
+wallabag uses PDO to connect to the database, so you'll need one of the following:
 
 - pdo_mysql
 - pdo_sqlite
 - pdo_pgsql
 
-and it's corresponding database server.
+and its corresponding database server.
 
 Installation
 ------------
@@ -37,7 +37,7 @@ Installation
 On a dedicated web server (recommended way)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-wallabag uses a big number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you don't already have.
+wallabag uses a large number of libraries in order to function. These libraries must be installed with a tool called Composer. You need to install it if you have not already done so.
 
 Install Composer:
 
@@ -47,7 +47,7 @@ Install Composer:
 
 You can find specific instructions `here <https://getcomposer.org/doc/00-intro.md>`__:
 
-To install wallabag itself, you must run these two commands:
+To install wallabag itself, you must run the following commands:
 
 ::
 
@@ -67,17 +67,17 @@ And access wallabag at http://yourserverip:8000
 
 .. tip::
 
-    To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look to the `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__.
+    To define parameters with environment variables, you have to set these variables with ``SYMFONY__`` prefix. For example, ``SYMFONY__DATABASE_DRIVER``. You can have a look at `Symfony documentation <http://symfony.com/doc/current/cookbook/configuration/external_parameters.html>`__.
 
 On a shared hosting
 ~~~~~~~~~~~~~~~~~~~
 
-We provide you a package with all dependancies inside.
+We provide a package with all dependencies inside.
 The default configuration uses SQLite for the database. If you want to change these settings, please edit ``app/config/parameters.yml``.
 
 We already created a user: login and password are ``wallabag``.
 
-.. caution:: With this package, wallabag don't check mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above).
+.. caution:: With this package, wallabag doesn't check for mandatory extensions used in the application (theses checks are made during ``composer install`` when you have a dedicated web server, see above).
 
 Execute this command to download and extract the latest package:
 
@@ -85,7 +85,7 @@ Execute this command to download and extract the latest package:
 
     wget http://wllbg.org/latest-v2-package && tar xvf latest-v2-package
 
-Now, read the following documentation to create your virtual host, then access to your wallabag.
+Now, read the following documentation to create your virtual host, then access your wallabag.
 If you changed the database configuration to use MySQL or PostgreSQL, you need to create a user via this command ``php bin/console wallabag:install --env=prod``.
 
 Installation with Docker
@@ -151,7 +151,7 @@ After reloading or restarting Apache, you should now be able to access wallabag
 Configuration on Nginx
 ~~~~~~~~~~~~~~~~~~~~~~
 
-Assuming you install wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag :
+Assuming you installed wallabag in the ``/var/www/wallabag`` folder, here's the recipe for wallabag :
 
 ::
 
@@ -269,10 +269,56 @@ by entering
    chown -R www-data:www-data /var/www/wallabag/vendor
    chown -R www-data:www-data /var/www/wallabag/data/
 
-otherwise, sooner or later you will meet this error messages
+otherwise, sooner or later you will see these error messages:
 
 .. code-block:: bash
 
     Unable to write to the "bin" directory.
     file_put_contents(app/config/parameters.yml): failed to open stream: Permission denied
     file_put_contents(/.../wallabag/vendor/autoload.php): failed to open stream: Permission denied
+
+Additional rules for SELinux
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If SELinux is enabled on your system, you will need to configure additional contexts in order for wallabag to function properly. To check if SELinux is enabled, simply enter the following:
+
+``getenforce``
+
+This will return ``Enforcing`` if SELinux is enabled. Creating a new context involves the following syntax:
+
+``semanage fcontext -a -t <context type> <full path>``
+
+For example:
+
+``semanage fcontext -a -t httpd_sys_content_t "/var/www/wallabag(/.*)?"``
+
+This will recursively apply the httpd_sys_content_t context to the wallabag directory and all underlying files and folders. The following rules are needed:
+
++-----------------------------------+----------------------------+
+| Full path                         | Context                    |
++===================================+============================+
+| /var/www/wallabag(/.*)?           | ``httpd_sys_content_t``    |
++-----------------------------------+----------------------------+
+| /var/www/wallabag/data(/.*)?      | ``httpd_sys_rw_content_t`` |
++-----------------------------------+----------------------------+
+| /var/www/wallabag/var/logs(/.*)?  | ``httpd_log_t``            |
++-----------------------------------+----------------------------+
+| /var/www/wallabag/var/cache(/.*)? | ``httpd_cache_t``          |
++-----------------------------------+----------------------------+
+
+After creating these contexts, enter the following in order to apply your rules:
+
+``restorecon -R -v /var/www/wallabag``
+
+You can check contexts in a directory by typing ``ls -lZ`` and you can see all of your current rules with ``semanage fcontext -l -C``.
+
+If you're installing the preconfigured latest-v2-package, then an additional rule is needed during the initial setup:
+
+``semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/wallabag/var"``
+
+After you successfully access your wallabag and complete the initial setup, this context can be removed:
+
+::
+
+    semanage fcontext -d -t httpd_sys_rw_content_t "/var/www/wallabag/var"
+    retorecon -R -v /var/www/wallabag/var
diff --git a/docs/img/user/android_configuration_connection_test.en.png b/docs/img/user/android_configuration_connection_test.en.png
new file mode 100644 (file)
index 0000000..479cd09
Binary files /dev/null and b/docs/img/user/android_configuration_connection_test.en.png differ
diff --git a/docs/img/user/android_configuration_connection_test_success.en.png b/docs/img/user/android_configuration_connection_test_success.en.png
new file mode 100644 (file)
index 0000000..840f00c
Binary files /dev/null and b/docs/img/user/android_configuration_connection_test_success.en.png differ
diff --git a/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png
new file mode 100644 (file)
index 0000000..df071b8
Binary files /dev/null and b/docs/img/user/android_configuration_feed_credentials_automatically_filled_in.en.png differ
diff --git a/docs/img/user/android_configuration_filled_in.en.png b/docs/img/user/android_configuration_filled_in.en.png
new file mode 100644 (file)
index 0000000..368ac51
Binary files /dev/null and b/docs/img/user/android_configuration_filled_in.en.png differ
diff --git a/docs/img/user/android_configuration_get_feed_credentials.en.png b/docs/img/user/android_configuration_get_feed_credentials.en.png
new file mode 100644 (file)
index 0000000..2a8958f
Binary files /dev/null and b/docs/img/user/android_configuration_get_feed_credentials.en.png differ
diff --git a/docs/img/user/android_configuration_saved_feed_update.en.png b/docs/img/user/android_configuration_saved_feed_update.en.png
new file mode 100644 (file)
index 0000000..f1c06f1
Binary files /dev/null and b/docs/img/user/android_configuration_saved_feed_update.en.png differ
diff --git a/docs/img/user/android_configuration_screen.en.png b/docs/img/user/android_configuration_screen.en.png
new file mode 100644 (file)
index 0000000..945fd7c
Binary files /dev/null and b/docs/img/user/android_configuration_screen.en.png differ
diff --git a/docs/img/user/android_configuration_scroll_bottom.en.png b/docs/img/user/android_configuration_scroll_bottom.en.png
new file mode 100644 (file)
index 0000000..11a6fc5
Binary files /dev/null and b/docs/img/user/android_configuration_scroll_bottom.en.png differ
diff --git a/docs/img/user/android_unread_feed_synced.en.png b/docs/img/user/android_unread_feed_synced.en.png
new file mode 100644 (file)
index 0000000..8451557
Binary files /dev/null and b/docs/img/user/android_unread_feed_synced.en.png differ
diff --git a/docs/img/user/android_welcome_screen.en.png b/docs/img/user/android_welcome_screen.en.png
new file mode 100644 (file)
index 0000000..a3741d5
Binary files /dev/null and b/docs/img/user/android_welcome_screen.en.png differ
index 69dfd4b108a12e305943a35d908acde9a1a60215..33b5e2ad03905232dad0df1f0e130275e30853c7 100644 (file)
@@ -23,10 +23,16 @@ class EntryController extends Controller
     {
         try {
             $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
+
             $em = $this->getDoctrine()->getManager();
             $em->persist($entry);
             $em->flush();
         } catch (\Exception $e) {
+            $this->get('logger')->error('Error while saving an entry', [
+                'exception' => $e,
+                'entry' => $entry,
+            ]);
+
             return false;
         }
 
@@ -60,11 +66,12 @@ class EntryController extends Controller
                 return $this->redirect($this->generateUrl('view', ['id' => $existingEntry->getId()]));
             }
 
-            $this->updateEntry($entry);
-            $this->get('session')->getFlashBag()->add(
-                'notice',
-                'flashes.entry.notice.entry_saved'
-            );
+            $message = 'flashes.entry.notice.entry_saved';
+            if (false === $this->updateEntry($entry)) {
+                $message = 'flashes.entry.notice.entry_saved_failed';
+            }
+
+            $this->get('session')->getFlashBag()->add('notice', $message);
 
             return $this->redirect($this->generateUrl('homepage'));
         }
index 5a3764538aa73ec411467eb564dc2efb16d98d3c..03be96670adccabc63e36a62d125553fd47a6c35 100644 (file)
@@ -6,7 +6,6 @@ use Doctrine\Common\DataFixtures\AbstractFixture;
 use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
 use Doctrine\Common\Persistence\ObjectManager;
 use Wallabag\CoreBundle\Entity\Config;
-use Wallabag\CoreBundle\Entity\TaggingRule;
 
 class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
 {
@@ -16,12 +15,6 @@ class LoadConfigData extends AbstractFixture implements OrderedFixtureInterface
     public function load(ObjectManager $manager)
     {
         $adminConfig = new Config($this->getReference('admin-user'));
-        $taggingRule = new TaggingRule();
-
-        $taggingRule->setConfig($adminConfig);
-        $taggingRule->setRule('title matches "wallabag"');
-        $taggingRule->setTags(['wallabag']);
-        $manager->persist($taggingRule);
 
         $adminConfig->setTheme('material');
         $adminConfig->setItemsPerPage(30);
index 2e1cc2700d20b4a7c51d39753c00429364c8af18..7efe6356e836385306240d900ff5e1f89d280e51 100644 (file)
@@ -28,6 +28,14 @@ class LoadTaggingRuleData extends AbstractFixture implements OrderedFixtureInter
 
         $manager->persist($tr2);
 
+        $tr3 = new TaggingRule();
+
+        $tr3->setRule('title matches "wallabag"');
+        $tr3->setTags(['wallabag']);
+        $tr3->setConfig($this->getReference('admin-config'));
+
+        $manager->persist($tr3);
+
         $manager->flush();
     }
 
index 1271f1f5f2657941c497f47f07b18a468db402ca..ceae78b05556e4005f0c51e35e1eb93a5bf6c57a 100644 (file)
@@ -177,8 +177,16 @@ class Entry
     private $user;
 
     /**
-     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist", "remove"})
-     * @ORM\JoinTable
+     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="entries", cascade={"persist"})
+     * @ORM\JoinTable(
+     *  name="entry_tag",
+     *  joinColumns={
+     *      @ORM\JoinColumn(name="entry_id", referencedColumnName="id")
+     *  },
+     *  inverseJoinColumns={
+     *      @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
+     *  }
+     * )
      *
      * @Groups({"entries_for_user", "export_all"})
      */
@@ -526,13 +534,18 @@ class Entry
             }
         }
 
-        $this->tags[] = $tag;
+        $this->tags->add($tag);
         $tag->addEntry($this);
     }
 
     public function removeTag(Tag $tag)
     {
+        if (!$this->tags->contains($tag)) {
+            return;
+        }
+
         $this->tags->removeElement($tag);
+        $tag->removeEntry($this);
     }
 
     /**
index b4adbbd3eeffdb1e5ee774aa0027cac3d91475e2..4b480ff1cdc4f2c4ebc2b7e4bf4b558edb95eb9a 100644 (file)
@@ -98,9 +98,30 @@ class Tag
         return $this->slug;
     }
 
+    /**
+     * @param Entry $entry
+     */
     public function addEntry(Entry $entry)
     {
-        $this->entries[] = $entry;
+        if ($this->entries->contains($entry)) {
+            return;
+        }
+
+        $this->entries->add($entry);
+        $entry->addTag($this);
+    }
+
+    /**
+     * @param Entry $entry
+     */
+    public function removeEntry(Entry $entry)
+    {
+        if (!$this->entries->contains($entry)) {
+            return;
+        }
+
+        $this->entries->removeElement($entry);
+        $entry->removeTag($this);
     }
 
     public function hasEntry($entry)
index cd4d349021e5be8aec4f0ca32b73be1aafc9b379..f3f848e9a6db0f667e5e80a0e9b308192a1dfc86 100644 (file)
@@ -87,6 +87,18 @@ class EntryFilterType extends AbstractType
             ->add('isStarred', CheckboxFilterType::class, [
                 'label' => 'entry.filters.starred_label',
             ])
+            ->add('isUnread', CheckboxFilterType::class, [
+                'label' => 'entry.filters.unread_label',
+                'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
+                    if (false === $values['value']) {
+                        return;
+                    }
+
+                    $expression = $filterQuery->getExpr()->eq('e.isArchived', 'false');
+
+                    return $filterQuery->createCondition($expression);
+                },
+            ])
             ->add('previewPicture', CheckboxFilterType::class, [
                 'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
                     if (false === $values['value']) {
index 8d3920630228b0c1dc995c23432d83dd58700562..213d57904743e5e7365a3c8890442c62f0a71c74 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Arkiveret'
         starred_label: 'Favorit'
+        unread_label: 'Ulæst'
         preview_picture_label: 'Har et vist billede'
         preview_picture_help: 'Forhåndsvis billede'
         language_label: 'Sprog'
@@ -396,6 +397,7 @@ flashes:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
             # entry_saved: 'Entry saved'
+            # entry_saved_failed: 'Failed to save entry'
             # entry_updated: 'Entry updated'
             # entry_reloaded: 'Entry reloaded'
             # entry_reload_failed: 'Failed to reload entry'
index c7a8949296cb3efbf945f6cd312df69d30cf5bc9..89cbbbf883487db0bc06fa915882f3668467f593 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Archiviert'
         starred_label: 'Favorisiert'
+        unread_label: 'Ungelesene'
         preview_picture_label: 'Vorschaubild vorhanden'
         preview_picture_help: 'Vorschaubild'
         language_label: 'Sprache'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Eintrag bereits am %date% gespeichert'
             entry_saved: 'Eintag gespeichert'
+            # entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Eintrag aktualisiert'
             entry_reloaded: 'Eintrag neugeladen'
             entry_reload_failed: 'Neuladen des Eintrags fehlgeschlagen'
index 876e7900cf0c43cd4f09e08c98b1d02cf0833916..b65e452228e659def76db711c1b1b430cd7a1cb0 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Archived'
         starred_label: 'Starred'
+        unread_label: 'Unread'
         preview_picture_label: 'Has a preview picture'
         preview_picture_help: 'Preview picture'
         language_label: 'Language'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
             entry_saved: 'Entry saved'
+            entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Entry updated'
             entry_reloaded: 'Entry reloaded'
             entry_reload_failed: 'Failed to reload entry'
index e8461247c9c96b9104858dd0b04b90630c525f8b..8351bcf4eb026ff0a0ecd5447ef3cf4217f154d2 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Estatus'
         archived_label: 'Archivado'
         starred_label: 'Favorito'
+        unread_label: 'Sin leer'
         preview_picture_label: 'Hay una foto'
         preview_picture_help: 'Foto de preview'
         language_label: 'Idioma'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Entrada ya guardada por %fecha%'
             entry_saved: 'Entrada guardada'
+            # entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Entrada actualizada'
             entry_reloaded: 'Entrada recargada'
             entry_reload_failed: 'Entrada recargada reprobada'
index d34ff8ff839735462bacfc0380d43e235c679c0b..db6e5960bb6791a75acd8506c36bebfbf93872ca 100644 (file)
@@ -96,8 +96,8 @@ config:
         rule_label: 'قانون'
         tags_label: 'برچسب‌ها'
         faq:
-             title: 'پرسش‌های متداول'
-             tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟'
+            title: 'پرسش‌های متداول'
+            tagging_rules_definition_title: 'برچسب‌گذاری خودکار یعنی چه؟'
         #     tagging_rules_definition_description: 'They are rules used by Wallabag to automatically tag new entries.<br />Each time a new entry is added, all the tagging rules will be used to add the tags you configured, thus saving you the trouble to manually classify your entries.'
         #     how_to_use_them_title: 'How do I use them?'
         #     how_to_use_them_description: 'Let assume you want to tag new entries as « <i>short reading</i> » when the reading time is inferior to 3 minutes.<br />In that case, you should put « readingTime &lt;= 3 » in the <i>Rule</i> field and « <i>short reading</i> » in the <i>Tags</i> field.<br />Several tags can added simultaneously by separating them by a comma: « <i>short reading, must read</i> »<br />Complex rules can be written by using predefined operators: if « <i>readingTime &gt;= 5 AND domainName = "github.com"</i> » then tag as « <i>long reading, github </i> »'
@@ -154,6 +154,7 @@ entry:
         status_label: 'وضعیت'
         archived_label: 'بایگانی‌شده'
         starred_label: 'برگزیده'
+        unread_label: 'خوانده‌نشده'
         preview_picture_label: 'دارای عکس پیش‌نمایش'
         preview_picture_help: 'پیش‌نمایش عکس'
         language_label: 'زبان'
@@ -383,30 +384,31 @@ developer:
 flashes:
     config:
         notice:
-           config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.'
-           password_updated: 'رمز به‌روز شد'
-           password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید."
-           user_updated: 'اطلاعات به‌روز شد'
-           rss_updated: 'اطلاعات آر-اس-اس به‌روز شد'
-           tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد'
-           tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
-           user_added: 'کابر "%username%" افزوده شد'
-           rss_token_updated: 'کد آر-اس-اس به‌روز شد'
+            config_saved: 'پیکربندی ذخیره شد. برخی از تنظیمات پس از این که قطع شدید اعمال می‌شود.'
+            password_updated: 'رمز به‌روز شد'
+            password_not_updated_demo: "در حالت نمایشی نمی‌توانید رمز کاربر را عوض کنید."
+            user_updated: 'اطلاعات به‌روز شد'
+            rss_updated: 'اطلاعات آر-اس-اس به‌روز شد'
+            tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد'
+            tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
+            user_added: 'کابر "%username%" افزوده شد'
+            rss_token_updated: 'کد آر-اس-اس به‌روز شد'
     entry:
         notice:
-           entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
-           entry_saved: 'مقاله ذخیره شد'
-           entry_updated: 'مقاله به‌روز شد'
-           entry_reloaded: 'مقاله به‌روز شد'
-           entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد'
-           entry_archived: 'مقاله بایگانی شد'
-           entry_unarchived: 'مقاله از بایگانی درآمد'
-           entry_starred: 'مقاله برگزیده شد'
-           entry_unstarred: 'مقاله نابرگزیده شد'
-           entry_deleted: 'مقاله پاک شد'
+            entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
+            entry_saved: 'مقاله ذخیره شد'
+            # entry_saved_failed: 'Failed to save entry'
+            entry_updated: 'مقاله به‌روز شد'
+            entry_reloaded: 'مقاله به‌روز شد'
+            entry_reload_failed: 'به‌روزرسانی مقاله شکست خورد'
+            entry_archived: 'مقاله بایگانی شد'
+            entry_unarchived: 'مقاله از بایگانی درآمد'
+            entry_starred: 'مقاله برگزیده شد'
+            entry_unstarred: 'مقاله نابرگزیده شد'
+            entry_deleted: 'مقاله پاک شد'
     tag:
         notice:
-           tag_added: 'برچسب افزوده شد'
+            tag_added: 'برچسب افزوده شد'
     import:
         notice:
             failed: 'درون‌ریزی شکست خورد. لطفاً دوباره تلاش کنید.'
index 80ba0546a9e26fac01c4e1acd3de517ad9a8ab67..9fc8ca2ad4fcd9b52c976db412d039732754ee18 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Lus'
         starred_label: 'Favoris'
+        unread_label: 'Non lus'
         preview_picture_label: 'A une photo'
         preview_picture_help: 'Photo'
         language_label: 'Langue'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Article déjà sauvergardé le %date%'
             entry_saved: 'Article enregistré'
+            entry_saved_failed: "L'enregistrement a échoué"
             entry_updated: 'Article mis à jour'
             entry_reloaded: 'Article rechargé'
             entry_reload_failed: "Le rechargement de l'article a échoué"
index 4f3ac090f95b8f4567de4bec0aaf54ba8be385d4..00ed9c98cd9ea280dc457aa661d9ab2921c624c8 100644 (file)
@@ -396,6 +396,7 @@ flashes:
         notice:
             entry_already_saved: 'Contenuto già salvato in data %date%'
             entry_saved: 'Contenuto salvato'
+            # entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Contenuto aggiornato'
             entry_reloaded: 'Contenuto ricaricato'
             entry_reload_failed: 'Errore nel ricaricamento del contenuto'
index 46f58bbf5b0e4b9f4f32b76c00a6934a123c2a2f..c81c852bee874775c26586860cabcbc61819dab1 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Estatus'
         archived_label: 'Legits'
         starred_label: 'Favorits'
+        unread_label: 'Pas legits'
         preview_picture_label: 'A una fotò'
         preview_picture_help: 'Fotò'
         language_label: 'Lenga'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Article ja salvargardat lo %date%'
             entry_saved: 'Article enregistrat'
+            # entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Article mes a jorn'
             entry_reloaded: 'Article recargat'
             entry_reload_failed: "Fracàs de l'actualizacion de l'article"
index 292749ed68c6b980e27eef252265c7556ddf71f9..3707a857302942f7537420689a774a5393d0055f 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Zarchiwizowane'
         starred_label: 'Oznaczone gwiazdką'
+        unread_label: 'Nieprzeczytane'
         preview_picture_label: 'Posiada podgląd obrazu'
         preview_picture_help: 'Podgląd obrazu'
         language_label: 'Język'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Wpis już został dodany %date%'
             entry_saved: 'Wpis zapisany'
+            # entry_saved_failed: 'Failed to save entry'
             entry_updated: 'Wpis zaktualizowany'
             entry_reloaded: 'Wpis ponownie załadowany'
             entry_reload_failed: 'Błąd ponownego załadowania'
index 45040f3596e31ae5183560cf01337584d1fc9103..27be1edc140a46c8eaf31dfa9e33fe30ab287495 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Status'
         archived_label: 'Arhivat'
         starred_label: 'Steluțe'
+        unread_label: 'Necitite'
         preview_picture_label: 'Are o imagine de previzualizare'
         preview_picture_help: 'Previzualizare imagine'
         language_label: 'Limbă'
@@ -396,6 +397,7 @@ flashes:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
             # entry_saved: 'Entry saved'
+            # entry_saved_failed: 'Failed to save entry'
             # entry_updated: 'Entry updated'
             # entry_reloaded: 'Entry reloaded'
             # entry_reload_failed: 'Failed to reload entry'
index 8a095a5b119fba0ffb30f3727a295e247ace9241..85ee7316f0882a929addf7d5bd60d013e04fdb7c 100644 (file)
@@ -154,6 +154,7 @@ entry:
         status_label: 'Durum'
         archived_label: 'Arşiv'
         starred_label: 'Favori'
+        unread_label: 'Okunmayan'
         preview_picture_label: 'Resim önizlemesi varsa'
         preview_picture_help: 'Resim önizlemesi'
         language_label: 'Dil'
@@ -396,6 +397,7 @@ flashes:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
             entry_saved: 'Makale kaydedildi'
+            # entry_saved_failed: 'Failed to save entry'
             # entry_updated: 'Entry updated'
             entry_reloaded: 'Makale içeriği yenilendi'
             # entry_reload_failed: 'Failed to reload entry'
index a2caaebf80a9e5c4fcf51db7afcf0087f9614c2b..778625ae0338742cc32ebf955c36903ea1643e06 100644 (file)
                     {{ form_label(form.isStarred) }}
                 </div>
 
+                <div class="input-field">
+                    {{ form_widget(form.isUnread) }}
+                    {{ form_label(form.isUnread) }}
+                </div>
+
                 <div class="input-field">
                     {{ form_widget(form.previewPicture) }}
                     {{ form_label(form.previewPicture) }}
index 1d5692264d6a8016627da7f147b112bc479b8884..920fa9334bf69799d8dd5cdf11079bc82b58ad1f 100644 (file)
                     {{ form_label(form.isStarred) }}
                 </div>
 
+                <div class="input-field col s6 with-checkbox">
+                    {{ form_widget(form.isUnread) }}
+                    {{ form_label(form.isUnread) }}
+                </div>
+
                 <div class="col s12">
                     <label>{{ 'entry.filters.preview_picture_help'|trans }}</label>
                 </div>
index df4c34cd8340481de88657d43ef6426d51635abe..5ce893c14fef9073b129d6e9b6da25931b3068ff 100644 (file)
@@ -163,7 +163,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     /**
      * This test will require an internet connection.
      */
-    public function testPostNewThatWillBeTaggued()
+    public function testPostNewThatWillBeTagged()
     {
         $this->logInAs('admin');
         $client = $this->getClient();
@@ -181,8 +181,7 @@ class EntryControllerTest extends WallabagCoreTestCase
         $client->submit($form, $data);
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
-
-        $client->followRedirect();
+        $this->assertContains('/', $client->getResponse()->getTargetUrl());
 
         $em = $client->getContainer()
             ->get('doctrine.orm.entity_manager');
@@ -196,6 +195,35 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $em->remove($entry);
         $em->flush();
+
+        // and now re-submit it to test the cascade persistence for tags after entry removal
+        // related https://github.com/wallabag/wallabag/issues/2121
+        $crawler = $client->request('GET', '/new');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('form[name=entry]')->form();
+
+        $data = [
+            'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
+        ];
+
+        $client->submit($form, $data);
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('/', $client->getResponse()->getTargetUrl());
+
+        $entry = $em
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findOneByUrl($url);
+
+        $tags = $entry->getTags();
+
+        $this->assertCount(1, $tags);
+        $this->assertEquals('wallabag', $tags[0]->getLabel());
+
+        $em->remove($entry);
+        $em->flush();
     }
 
     public function testArchive()
@@ -471,6 +499,24 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertCount(1, $crawler->filter('div[class=entry]'));
     }
 
+    public function testFilterOnUnreadStatus()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/all/list');
+
+        $form = $crawler->filter('button[id=submit-filter]')->form();
+
+        $data = [
+            'entry_filter[isUnread]' => true,
+        ];
+
+        $crawler = $client->submit($form, $data);
+
+        $this->assertCount(4, $crawler->filter('div[class=entry]'));
+    }
+
     public function testFilterOnCreationDate()
     {
         $this->logInAs('admin');