]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Add new Ignore Origin rules tab, update ConfigController
authorKevin Decherf <kevin@kdecherf.com>
Sun, 23 Jun 2019 20:13:44 +0000 (22:13 +0200)
committerKevin Decherf <kevin@kdecherf.com>
Sat, 25 Apr 2020 13:59:23 +0000 (15:59 +0200)
Signed-off-by: Kevin Decherf <kevin@kdecherf.com>
20 files changed:
src/Wallabag/CoreBundle/Controller/ConfigController.php
src/Wallabag/CoreBundle/DataFixtures/IgnoreOriginUserRuleFixtures.php [new file with mode: 0644]
src/Wallabag/CoreBundle/Form/Type/IgnoreOriginUserRuleType.php [new file with mode: 0644]
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.pt.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php

index 56efe82bb88775a8f3e5fac4134a53bec85e72b8..3efc7bb3218d4bd3caf098661983fde13f17b924 100644 (file)
@@ -14,10 +14,13 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\Routing\Annotation\Route;
 use Symfony\Component\Validator\Constraints\Locale as LocaleConstraint;
 use Wallabag\CoreBundle\Entity\Config;
+use Wallabag\CoreBundle\Entity\IgnoreOriginUserRule;
+use Wallabag\CoreBundle\Entity\RuleInterface;
 use Wallabag\CoreBundle\Entity\TaggingRule;
 use Wallabag\CoreBundle\Form\Type\ChangePasswordType;
 use Wallabag\CoreBundle\Form\Type\ConfigType;
 use Wallabag\CoreBundle\Form\Type\FeedType;
+use Wallabag\CoreBundle\Form\Type\IgnoreOriginUserRuleType;
 use Wallabag\CoreBundle\Form\Type\TaggingRuleImportType;
 use Wallabag\CoreBundle\Form\Type\TaggingRuleType;
 use Wallabag\CoreBundle\Form\Type\UserInformationType;
@@ -173,6 +176,40 @@ class ConfigController extends Controller
             return $this->redirect($this->generateUrl('config') . '#set5');
         }
 
+        // handle ignore origin rules
+        $ignoreOriginUserRule = new IgnoreOriginUserRule();
+        $action = $this->generateUrl('config') . '#set6';
+
+        if ($request->query->has('ignore-origin-user-rule')) {
+            $ignoreOriginUserRule = $this->getDoctrine()
+                ->getRepository('WallabagCoreBundle:IgnoreOriginUserRule')
+                ->find($request->query->get('ignore-origin-user-rule'));
+
+            if ($this->getUser()->getId() !== $ignoreOriginUserRule->getConfig()->getUser()->getId()) {
+                return $this->redirect($action);
+            }
+
+            $action = $this->generateUrl('config', [
+                'ignore-origin-user-rule' => $ignoreOriginUserRule->getId(),
+            ]) . '#set6';
+        }
+
+        $newIgnoreOriginUserRule = $this->createForm(IgnoreOriginUserRuleType::class, $ignoreOriginUserRule, ['action' => $action]);
+        $newIgnoreOriginUserRule->handleRequest($request);
+
+        if ($newIgnoreOriginUserRule->isSubmitted() && $newIgnoreOriginUserRule->isValid()) {
+            $ignoreOriginUserRule->setConfig($config);
+            $em->persist($ignoreOriginUserRule);
+            $em->flush();
+
+            $this->addFlash(
+                'notice',
+                'flashes.config.notice.ignore_origin_rules_updated'
+            );
+
+            return $this->redirect($this->generateUrl('config') . '#set6');
+        }
+
         return $this->render('WallabagCoreBundle:Config:index.html.twig', [
             'form' => [
                 'config' => $configForm->createView(),
@@ -181,6 +218,7 @@ class ConfigController extends Controller
                 'user' => $userForm->createView(),
                 'new_tagging_rule' => $newTaggingRule->createView(),
                 'import_tagging_rule' => $taggingRulesImportform->createView(),
+                'new_ignore_origin_user_rule' => $newIgnoreOriginUserRule->createView(),
             ],
             'feed' => [
                 'username' => $user->getUsername(),
@@ -447,6 +485,43 @@ class ConfigController extends Controller
         return $this->redirect($this->generateUrl('config') . '?tagging-rule=' . $rule->getId() . '#set5');
     }
 
+    /**
+     * Deletes an ignore origin rule and redirect to the config homepage.
+     *
+     * @Route("/ignore-origin-user-rule/delete/{id}", requirements={"id" = "\d+"}, name="delete_ignore_origin_rule")
+     *
+     * @return RedirectResponse
+     */
+    public function deleteIgnoreOriginRuleAction(IgnoreOriginUserRule $rule)
+    {
+        $this->validateRuleAction($rule);
+
+        $em = $this->getDoctrine()->getManager();
+        $em->remove($rule);
+        $em->flush();
+
+        $this->addFlash(
+            'notice',
+            'flashes.config.notice.ignore_origin_rules_deleted'
+        );
+
+        return $this->redirect($this->generateUrl('config') . '#set6');
+    }
+
+    /**
+     * Edit an ignore origin rule.
+     *
+     * @Route("/ignore-origin-user-rule/edit/{id}", requirements={"id" = "\d+"}, name="edit_ignore_origin_rule")
+     *
+     * @return RedirectResponse
+     */
+    public function editIgnoreOriginRuleAction(IgnoreOriginUserRule $rule)
+    {
+        $this->validateRuleAction($rule);
+
+        return $this->redirect($this->generateUrl('config') . '?ignore-origin-user-rule=' . $rule->getId() . '#set6');
+    }
+
     /**
      * Remove all annotations OR tags OR entries for the current user.
      *
@@ -659,10 +734,10 @@ class ConfigController extends Controller
     /**
      * Validate that a rule can be edited/deleted by the current user.
      */
-    private function validateRuleAction(TaggingRule $rule)
+    private function validateRuleAction(RuleInterface $rule)
     {
         if ($this->getUser()->getId() !== $rule->getConfig()->getUser()->getId()) {
-            throw $this->createAccessDeniedException('You can not access this tagging rule.');
+            throw $this->createAccessDeniedException('You can not access this rule.');
         }
     }
 
diff --git a/src/Wallabag/CoreBundle/DataFixtures/IgnoreOriginUserRuleFixtures.php b/src/Wallabag/CoreBundle/DataFixtures/IgnoreOriginUserRuleFixtures.php
new file mode 100644 (file)
index 0000000..679eff7
--- /dev/null
@@ -0,0 +1,36 @@
+<?php
+
+namespace Wallabag\CoreBundle\DataFixtures;
+
+use Doctrine\Bundle\FixturesBundle\Fixture;
+use Doctrine\Common\DataFixtures\DependentFixtureInterface;
+use Doctrine\Common\Persistence\ObjectManager;
+use Wallabag\CoreBundle\Entity\IgnoreOriginUserRule;
+use Wallabag\UserBundle\DataFixtures\UserFixtures;
+
+class IgnoreOriginUserRuleFixtures extends Fixture implements DependentFixtureInterface
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function load(ObjectManager $manager)
+    {
+        $rule = new IgnoreOriginUserRule();
+        $rule->setRule('host = "example.fr"');
+        $rule->setConfig($this->getReference('admin-user')->getConfig());
+
+        $manager->persist($rule);
+
+        $manager->flush();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getDependencies()
+    {
+        return [
+            UserFixtures::class,
+        ];
+    }
+}
diff --git a/src/Wallabag/CoreBundle/Form/Type/IgnoreOriginUserRuleType.php b/src/Wallabag/CoreBundle/Form/Type/IgnoreOriginUserRuleType.php
new file mode 100644 (file)
index 0000000..b9110f1
--- /dev/null
@@ -0,0 +1,37 @@
+<?php
+
+namespace Wallabag\CoreBundle\Form\Type;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\Extension\Core\Type\SubmitType;
+use Symfony\Component\Form\Extension\Core\Type\TextType;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolver;
+
+class IgnoreOriginUserRuleType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder
+            ->add('rule', TextType::class, [
+                'required' => true,
+                'label' => 'config.form_rules.rule_label',
+            ])
+            ->add('save', SubmitType::class, [
+                'label' => 'config.form.save',
+            ])
+        ;
+    }
+
+    public function configureOptions(OptionsResolver $resolver)
+    {
+        $resolver->setDefaults([
+            'data_class' => 'Wallabag\CoreBundle\Entity\IgnoreOriginUserRule',
+        ]);
+    }
+
+    public function getBlockPrefix()
+    {
+        return 'ignore_origin_user_rule';
+    }
+}
index 4d5259797d2fad335a0d85b6c33f6e983e18ba4b..92440c92cf07b4f49dc214de09f004cd62ac893f 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Brugeroplysninger'
         password: 'Adgangskode'
         # rules: 'Tagging rules'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Tilføj bruger'
         # reset: 'Reset area'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
index cd70c99ffcc60f8b2604c4d5358d75c7d3852b7d..7a9382cb3aaaa2ee6a40cb2bfaca74f8f35a4891 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Benutzerinformation'
         password: 'Kennwort'
         rules: 'Tagging-Regeln'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Benutzer hinzufügen'
         reset: 'Zurücksetzen'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Eintrag bereits am %date% gespeichert'
index 1bc32423aeb572e01cc3c8954444ba8aa2053a64..b16662c31bec93033fd1c6bb8601e622b5de82f5 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'User information'
         password: 'Password'
         rules: 'Tagging rules'
+        ignore_origin: 'Ignore origin rules'
         new_user: 'Add a user'
         reset: 'Reset area'
     form:
@@ -617,6 +618,8 @@ flashes:
             otp_disabled: Two-factor authentication disabled
             tagging_rules_imported: Tagging rules imported
             tagging_rules_not_imported: Error while importing tagging rules
+            ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
index bced72e95ac86666c279929a1fa938786e559c52..3e77afd6b87f6e3473ce91ecbf92f2b111c63183 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Información de usuario'
         password: 'Contraseña'
         rules: 'Reglas de etiquetado automáticas'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Añadir un usuario'
         reset: 'Reiniciar mi cuenta'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             tagging_rules_imported: Reglas de etiquetado importadas
             tagging_rules_not_imported: Un error se ha producico en la importación de las reglas de etiquetado
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Artículo ya guardado el %fecha%'
index 0704204aa10e2d99bfe57092a8ee7226abc92216..38c252f73c3d6fe93c100dce5e08c8d8b4f9f49a 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'اطلاعات کاربر'
         password: 'رمز'
         rules: 'برچسب‌گذاری خودکار'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'افزودن کاربر'
         # reset: 'Reset area'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'این مقاله در تاریخ %date% ذخیره شده بود'
index 5d5878eba15f52b299825f2159472bba2274c11a..b12dd9ca938c506b0568d1be5e5387b1711d87fa 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: "Mon compte"
         password: "Mot de passe"
         rules: "Règles de tag automatiques"
+        ignore_origin: "Règles d'omission d'origine"
         new_user: "Créer un compte"
         reset: "Réinitialisation"
     form:
@@ -618,6 +619,11 @@ flashes:
             otp_disabled: "Authentification à double-facteur désactivée"
             tagging_rules_imported: Règles bien importées
             tagging_rules_not_imported: Impossible d'importer les règles
+<<<<<<< HEAD
+=======
+            ignore_origin_rules_deleted: "Règle d'omission d'origine supprimée"
+            ignore_origin_rules_updated: "Règle d'omission d'origine mise à jour"
+>>>>>>> 4c595340... fixup! Add new Ignore Origin rules tab, update ConfigController
     entry:
         notice:
             entry_already_saved: "Article déjà sauvegardé le %date%"
index 23e72f20a7574aad4569c9a4ee5bcb664862e618..eb44318b99c24f5aa283025817606c763d85c01b 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Informazioni utente'
         password: 'Password'
         rules: 'Regole di etichettatura'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Aggiungi utente'
         reset: 'Area di reset'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Contenuto già salvato in data %date%'
index 6ddff6ea75ee414d0786269d8d709f335de4253d..165186b1d37846fe9182b1cb8ccf96c8be655d89 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Mon compte'
         password: 'Senhal'
         rules: "Règlas d'etiquetas automaticas"
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Crear un compte'
         reset: 'Zòna de reïnicializacion'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             tagging_rules_imported: Règlas d’etiquetatge importadas
             tagging_rules_not_imported: Error en important las règlas d’etiquetatge
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Article ja salvagardat lo %date%'
index 770477c96dcd142dbeaab1c1e58bc4a15943544e..fbf64f30b26e6f2644b65995edc10be804c6add2 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Informacje o użytkowniku'
         password: 'Hasło'
         rules: 'Zasady tagowania'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Dodaj użytkownika'
         reset: 'Reset'
     form:
@@ -617,6 +618,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Wpis już został dodany %date%'
index d993cb059a9b87093519a5fec262c491d13ffbd0..93910d4be7e570b442d21919c1d46e7cabe4ac21 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Informação do Usuário'
         password: 'Senha'
         rules: 'Regras de tags'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Adicionar um usuário'
         reset: 'Reiniciar minha conta'
     form:
index bc8b72e0b15523a32d8ce51cad4368c48b0f35c9..5984d2298b778b074604da6c2a7ac90095a29ddb 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Informații despre utilizator'
         password: 'Parolă'
         # rules: 'Tagging rules'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Crează un utilizator'
         # reset: 'Reset area'
     form:
@@ -616,6 +617,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             # entry_already_saved: 'Entry already saved on %date%'
index 2f7f55e535f319da6b88999cda83f90bc4b1cf2f..a138ee5d3d4c0e3e6099030129d5bb80503a0036 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Информация о пользователе'
         password: 'Пароль'
         rules: 'Правила настройки простановки тегов'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Добавить пользователя'
         reset: 'Сброс данных'
     form:
@@ -616,6 +617,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Запись была сохранена ранее %date%'
index 48e1c34ad13aafe67f494cc2e604ea32ff2c73e2..b786a73d17acc42c538d9bd4f5ba0dbf67ed6678 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'ข้อมูลผู้ใช้'
         password: 'รหัสผ่าน'
         rules: 'การแท็กข้อบังคับ'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'เพิ่มผู้ใช้'
         reset: 'รีเซ็ตพื้นที่ '
     form:
@@ -616,6 +617,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'รายการพร้อมบันทึกที่ %date%'
index 19029c0b1cabcd262db74f090dac40bf947fbcb3..a317c2f507054c8efc41208459a39212ac238901 100644 (file)
@@ -59,6 +59,7 @@ config:
         user_info: 'Kullanıcı bilgileri'
         password: 'Şifre'
         rules: 'Etiketleme kuralları'
+        # ignore_origin: 'Ignore origin rules'
         new_user: 'Bir kullanıcı ekle'
         # reset: 'Reset area'
     form:
@@ -616,6 +617,8 @@ flashes:
             # otp_disabled: Two-factor authentication disabled
             # tagging_rules_imported: Tagging rules imported
             # tagging_rules_not_imported: Error while importing tagging rules
+            # ignore_origin_rules_deleted: 'Ignore origin rule deleted'
+            # ignore_origin_rules_updated: 'Ignore origin rule updated'
     entry:
         notice:
             entry_already_saved: 'Entry already saved on %date%'
index eb395eac475af6b492414ede4c78c7d4cd42c622..f182fda405494b5ff8aa02fbaaea046c08d0201c 100644 (file)
         </div>
     </div>
 
+    <h2>{{ 'config.tab_menu.ignore_origin'|trans }}</h2>
+
+    <ul>
+        {% for ignore_origin_rule in app.user.config.ignoreOriginRules %}
+            <li>
+                {{ 'config.form_rules.if_label'|trans }}
+                « {{ ignore_origin_rule.rule }} »
+                <a href="{{ path('edit_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="tool mode_edit">✎</a>
+                <a href="{{ path('delete_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="tool delete icon-trash icon"></a>
+            </li>
+        {% endfor %}
+    </ul>
+
+    {{ form_start(form.new_ignore_origin_user_rule) }}
+        {{ form_errors(form.new_ignore_origin_user_rule) }}
+
+        <fieldset class="w500p inline">
+            <div class="row">
+                {{ form_label(form.new_ignore_origin_user_rule.rule) }}
+                {{ form_errors(form.new_ignore_origin_user_rule.rule) }}
+                {{ form_widget(form.new_ignore_origin_user_rule.rule) }}
+            </div>
+        </fieldset>
+
+        {{ form_rest(form.new_ignore_origin_user_rule) }}
+    </form>
+
     <h2>{{ 'config.reset.title'|trans }}</h2>
     <fieldset class="w500p inline">
         <p>{{ 'config.reset.description'|trans }}</p>
index c2e92ad106ef6a3f597e0d6f3a3eb68ad5696d6a..faf9a4240d54f74fbdc42208145d6eb8e1ca5ffd 100644 (file)
@@ -16,7 +16,8 @@
                             <li class="tab col s12 m6 l3"><a href="#set3">{{ 'config.tab_menu.user_info'|trans }}</a></li>
                             <li class="tab col s12 m6 l3"><a href="#set4">{{ 'config.tab_menu.password'|trans }}</a></li>
                             <li class="tab col s12 m6 l3"><a href="#set5">{{ 'config.tab_menu.rules'|trans }}</a></li>
-                            <li class="tab col s12 m6 l3"><a href="#set6">{{ 'config.tab_menu.reset'|trans }}</a></li>
+                            <li class="tab col s12 m6 l3"><a href="#set6">{{ 'config.tab_menu.ignore_origin'|trans }}</a></li>
+                            <li class="tab col s12 m6 l3"><a href="#set7">{{ 'config.tab_menu.reset'|trans }}</a></li>
                         </ul>
                     </div>
 
                                         « {{ tagging_rule.rule }} »
                                         {{ 'config.form_rules.then_tag_as_label'|trans }}
                                         « {{ tagging_rule.tags|join(', ') }} »
-                                        <a href="{{ path('edit_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}">
-                                            <i class="tool grey-text mode_edit material-icons">mode_edit</i>
+                                        <a href="{{ path('edit_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="mode_edit">
+                                            <i class="tool grey-text material-icons">mode_edit</i>
                                         </a>
-                                        <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}">
-                                            <i class="tool grey-text delete material-icons">delete</i>
+                                        <a href="{{ path('delete_tagging_rule', {id: tagging_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="delete">
+                                            <i class="tool grey-text material-icons">delete</i>
                                         </a>
                                     </li>
                                     {% endfor %}
                     </div>
 
                     <div id="set6" class="col s12">
+                        {% if app.user.config.ignoreOriginRules is not empty %}
+                        <div class="row">
+                            <div class="input-field col s12">
+                                <ul>
+                                    {% for ignore_origin_rule in app.user.config.ignoreOriginRules %}
+                                    <li>
+                                        {{ 'config.form_rules.if_label'|trans }}
+                                        « {{ ignore_origin_rule.rule }} »
+                                        <a href="{{ path('edit_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.edit_rule_label'|trans }}" class="mode_edit">
+                                            <i class="tool grey-text material-icons">mode_edit</i>
+                                        </a>
+                                        <a href="{{ path('delete_ignore_origin_rule', {id: ignore_origin_rule.id}) }}" title="{{ 'config.form_rules.delete_rule_label'|trans }}" class="delete">
+                                            <i class="tool grey-text material-icons">delete</i>
+                                        </a>
+                                    </li>
+                                    {% endfor %}
+                                </ul>
+                            </div>
+                        </div>
+                        {% endif %}
+
+                        {{ form_start(form.new_ignore_origin_user_rule) }}
+                            {{ form_errors(form.new_ignore_origin_user_rule) }}
+
+                            <div class="row">
+                                <div class="input-field col s12">
+                                    {{ form_label(form.new_ignore_origin_user_rule.rule) }}
+                                    {{ form_errors(form.new_ignore_origin_user_rule.rule) }}
+                                    {{ form_widget(form.new_ignore_origin_user_rule.rule) }}
+                                </div>
+                            </div>
+
+                            {{ form_widget(form.new_ignore_origin_user_rule.save, {'attr': {'class': 'btn waves-effect waves-light'}}) }}
+                            {{ form_rest(form.new_ignore_origin_user_rule) }}
+                        </form>
+                    </div>
+                    
+                    <div id="set7" class="col s12">
                         <div class="row">
                             <h5>{{ 'config.reset.title'|trans }}</h5>
                             <p>{{ 'config.reset.description'|trans }}</p>
index b3b3a19a74a8c43c427d3896c51ec9d7d791717c..40a1aa97879199e0c0e7b469436cc7236f95a402 100644 (file)
@@ -435,7 +435,6 @@ class ConfigControllerTest extends WallabagCoreTestCase
     public function testTaggingRuleCreation()
     {
         $this->logInAs('admin');
-        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/config');
@@ -457,7 +456,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
 
         $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
 
-        $editLink = $crawler->filter('.mode_edit')->last()->link();
+        $editLink = $crawler->filter('div[id=set5] a.mode_edit')->last()->link();
 
         $crawler = $client->click($editLink);
         $this->assertSame(302, $client->getResponse()->getStatusCode());
@@ -482,7 +481,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
 
         $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]);
 
-        $deleteLink = $crawler->filter('.delete')->last()->link();
+        $deleteLink = $crawler->filter('div[id=set5] a.delete')->last()->link();
 
         $crawler = $client->click($deleteLink);
         $this->assertSame(302, $client->getResponse()->getStatusCode());
@@ -574,11 +573,11 @@ class ConfigControllerTest extends WallabagCoreTestCase
             ->getRepository('WallabagCoreBundle:TaggingRule')
             ->findAll()[0];
 
-        $crawler = $client->request('GET', '/tagging-rule/edit/' . $rule->getId());
+        $crawler = $client->request('GET', '/tagging-rule/delete/' . $rule->getId());
 
         $this->assertSame(403, $client->getResponse()->getStatusCode());
         $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
-        $this->assertContains('You can not access this tagging rule', $body[0]);
+        $this->assertContains('You can not access this rule', $body[0]);
     }
 
     public function testEditingTaggingRuleFromAnOtherUser()
@@ -594,7 +593,144 @@ class ConfigControllerTest extends WallabagCoreTestCase
 
         $this->assertSame(403, $client->getResponse()->getStatusCode());
         $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
-        $this->assertContains('You can not access this tagging rule', $body[0]);
+        $this->assertContains('You can not access this rule', $body[0]);
+    }
+
+    public function testIgnoreOriginRuleCreation()
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/config');
+
+        $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('button[id=ignore_origin_user_rule_save]')->form();
+
+        $data = [
+            'ignore_origin_user_rule[rule]' => 'host = "example.com"',
+        ];
+
+        $client->submit($form, $data);
+
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->followRedirect();
+
+        $this->assertContains('flashes.config.notice.ignore_origin_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
+
+        $editLink = $crawler->filter('div[id=set6] a.mode_edit')->last()->link();
+
+        $crawler = $client->click($editLink);
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+        $this->assertContains('?ignore-origin-user-rule=', $client->getResponse()->headers->get('location'));
+
+        $crawler = $client->followRedirect();
+
+        $form = $crawler->filter('button[id=ignore_origin_user_rule_save]')->form();
+
+        $data = [
+            'ignore_origin_user_rule[rule]' => 'host = "example.org"',
+        ];
+
+        $client->submit($form, $data);
+
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->followRedirect();
+
+        $this->assertContains('flashes.config.notice.ignore_origin_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
+
+        $this->assertContains('host = "example.org"', $crawler->filter('body')->extract(['_text'])[0]);
+
+        $deleteLink = $crawler->filter('div[id=set6] a.delete')->last()->link();
+
+        $crawler = $client->click($deleteLink);
+        $this->assertSame(302, $client->getResponse()->getStatusCode());
+
+        $crawler = $client->followRedirect();
+        $this->assertContains('flashes.config.notice.ignore_origin_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]);
+    }
+
+    public function dataForIgnoreOriginRuleCreationFail()
+    {
+        return [
+            [
+                [
+                    'ignore_origin_user_rule[rule]' => 'foo = "bar"',
+                ],
+                [
+                    'The variable',
+                    'does not exist.',
+                ],
+            ],
+            [
+                [
+                    'ignore_origin_user_rule[rule]' => '_all != "none"',
+                ],
+                [
+                    'The operator',
+                    'does not exist.',
+                ],
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider dataForIgnoreOriginRuleCreationFail
+     */
+    public function testIgnoreOriginRuleCreationFail($data, $messages)
+    {
+        $this->logInAs('admin');
+        $client = $this->getClient();
+
+        $crawler = $client->request('GET', '/config');
+
+        $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('button[id=ignore_origin_user_rule_save]')->form();
+
+        $crawler = $client->submit($form, $data);
+
+        $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+        $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
+
+        foreach ($messages as $message) {
+            $this->assertContains($message, $body[0]);
+        }
+    }
+
+    public function testDeletingIgnoreOriginRuleFromAnOtherUser()
+    {
+        $this->logInAs('bob');
+        $client = $this->getClient();
+
+        $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:IgnoreOriginUserRule')
+            ->findAll()[0];
+
+        $crawler = $client->request('GET', '/ignore-origin-user-rule/edit/' . $rule->getId());
+
+        $this->assertSame(403, $client->getResponse()->getStatusCode());
+        $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
+        $this->assertContains('You can not access this rule', $body[0]);
+    }
+
+    public function testEditingIgnoreOriginRuleFromAnOtherUser()
+    {
+        $this->logInAs('bob');
+        $client = $this->getClient();
+
+        $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:IgnoreOriginUserRule')
+            ->findAll()[0];
+
+        $crawler = $client->request('GET', '/ignore-origin-user-rule/edit/' . $rule->getId());
+
+        $this->assertSame(403, $client->getResponse()->getStatusCode());
+        $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
+        $this->assertContains('You can not access this rule', $body[0]);
     }
 
     public function testDemoMode()