Browse Source

Add misago.categories.admin and misago.legal.admin packages

rafalp 6 years ago
parent
commit
56e601a9c5

+ 2 - 2
misago/categories/admin.py → misago/categories/admin/__init__.py

@@ -1,7 +1,7 @@
 from django.conf.urls import url
 from django.utils.translation import gettext_lazy as _
 
-from .views.categoriesadmin import (
+from .views.categories import (
     CategoriesList,
     DeleteCategory,
     EditCategory,
@@ -9,7 +9,7 @@ from .views.categoriesadmin import (
     MoveUpCategory,
     NewCategory,
 )
-from .views.permsadmin import (
+from .views.perms import (
     CategoryPermissions,
     CategoryRolesList,
     DeleteCategoryRole,

+ 5 - 5
misago/categories/forms.py → misago/categories/admin/forms.py

@@ -4,11 +4,11 @@ from django.utils.html import conditional_escape, mark_safe
 from django.utils.translation import gettext_lazy as _
 from mptt.forms import TreeNodeChoiceField, TreeNodeMultipleChoiceField
 
-from . import THREADS_ROOT_NAME
-from ..admin.forms import YesNoSwitch
-from ..core.validators import validate_sluggable
-from ..threads.threadtypes import trees_map
-from .models import Category, CategoryRole
+from ...admin.forms import YesNoSwitch
+from ...core.validators import validate_sluggable
+from ...threads.threadtypes import trees_map
+from .. import THREADS_ROOT_NAME
+from ..models import Category, CategoryRole
 
 
 class AdminCategoryFieldMixin:

+ 0 - 0
misago/categories/views/__init__.py → misago/categories/admin/tests/__init__.py


+ 6 - 6
misago/categories/tests/test_categories_admin_views.py → misago/categories/admin/tests/test_categories_admin_views.py

@@ -1,11 +1,11 @@
 from django.urls import reverse
 
-from ...acl import ACL_CACHE
-from ...admin.test import AdminTestCase
-from ...cache.test import assert_invalidates_cache
-from ...threads import test
-from ...threads.models import Thread
-from ..models import Category
+from ....acl import ACL_CACHE
+from ....admin.test import AdminTestCase
+from ....cache.test import assert_invalidates_cache
+from ....threads import test
+from ....threads.models import Thread
+from ...models import Category
 
 
 class CategoryAdminTestCase(AdminTestCase):

+ 6 - 6
misago/categories/tests/test_permissions_admin_views.py → misago/categories/admin/tests/test_permissions_admin_views.py

@@ -1,11 +1,11 @@
 from django.urls import reverse
 
-from ...acl import ACL_CACHE
-from ...acl.models import Role
-from ...acl.admin.test import mock_role_form_data
-from ...admin.test import AdminTestCase
-from ...cache.test import assert_invalidates_cache
-from ..models import Category, CategoryRole
+from ....acl import ACL_CACHE
+from ....acl.models import Role
+from ....acl.admin.test import mock_role_form_data
+from ....admin.test import AdminTestCase
+from ....cache.test import assert_invalidates_cache
+from ...models import Category, CategoryRole
 
 
 def create_data(data_dict):

+ 0 - 0
misago/categories/admin/views/__init__.py


+ 5 - 5
misago/categories/views/categoriesadmin.py → misago/categories/admin/views/categories.py

@@ -2,12 +2,12 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy as _
 
-from .. import THREADS_ROOT_NAME
-from ...acl.cache import clear_acl_cache
-from ...admin.views import generic
-from ...threads.threadtypes import trees_map
+from ... import THREADS_ROOT_NAME
+from ....acl.cache import clear_acl_cache
+from ....admin.views import generic
+from ....threads.threadtypes import trees_map
+from ...models import Category, RoleCategoryACL
 from ..forms import CategoryFormFactory, DeleteFormFactory
-from ..models import Category, RoleCategoryACL
 
 
 class CategoryAdmin(generic.AdminBaseMixin):

+ 7 - 7
misago/categories/views/permsadmin.py → misago/categories/admin/views/perms.py

@@ -2,18 +2,18 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy as _
 
-from ...acl.admin.forms import get_permissions_forms
-from ...acl.admin.views import RoleAdmin, RolesList
-from ...acl.cache import clear_acl_cache
-from ...acl.models import Role
-from ...admin.views import generic
+from ....acl.admin.forms import get_permissions_forms
+from ....acl.admin.views import RoleAdmin, RolesList
+from ....acl.cache import clear_acl_cache
+from ....acl.models import Role
+from ....admin.views import generic
+from ...models import Category, CategoryRole, RoleCategoryACL
 from ..forms import (
     CategoryRoleForm,
     CategoryRolesACLFormFactory,
     RoleCategoryACLFormFactory,
 )
-from ..models import Category, CategoryRole, RoleCategoryACL
-from .categoriesadmin import CategoriesList, CategoryAdmin
+from .categories import CategoriesList, CategoryAdmin
 
 
 class CategoryRoleAdmin(generic.AdminBaseMixin):

+ 1 - 1
misago/categories/urls/__init__.py

@@ -3,7 +3,7 @@ from django.conf.urls import url
 from ...conf import settings
 from ...core.views import home_redirect
 
-from ..views.categorieslist import categories
+from ..views import categories
 
 if settings.MISAGO_THREADS_ON_INDEX:
     URL_PATH = r"^categories/$"

+ 2 - 2
misago/categories/views/categorieslist.py → misago/categories/views.py

@@ -1,8 +1,8 @@
 from django.shortcuts import render
 from django.urls import reverse
 
-from ..serializers import CategoryWithPosterSerializer as CategorySerializer
-from ..utils import get_categories_tree
+from .serializers import CategoryWithPosterSerializer as CategorySerializer
+from .utils import get_categories_tree
 
 
 def categories(request):

+ 1 - 1
misago/legal/admin.py → misago/legal/admin/__init__.py

@@ -1,7 +1,7 @@
 from django.conf.urls import url
 from django.utils.translation import gettext_lazy as _
 
-from .views.admin import (
+from .views import (
     AgreementsList,
     DeleteAgreement,
     DisableAgreement,

+ 2 - 2
misago/legal/forms.py → misago/legal/admin/forms.py

@@ -2,8 +2,8 @@ from django import forms
 from django.db.models import Q
 from django.utils.translation import gettext_lazy as _
 
-from ..admin.forms import YesNoSwitch
-from .models import Agreement
+from ...admin.forms import YesNoSwitch
+from ..models import Agreement
 from .utils import disable_agreement, set_agreement_as_active
 
 

+ 0 - 0
misago/legal/admin/tests/__init__.py


+ 6 - 4
misago/legal/tests/test_agreements_admin.py → misago/legal/admin/tests/test_admin_views.py

@@ -1,9 +1,9 @@
 import pytest
 from django.urls import reverse
 
-from ...admin.test import AdminTestCase
-from ...test import assert_contains
-from ..models import Agreement
+from ....admin.test import AdminTestCase
+from ....test import assert_contains
+from ...models import Agreement
 
 
 @pytest.fixture
@@ -115,7 +115,9 @@ def test_form_sets_new_agreement_creator(admin_client, superuser):
 
 
 def test_form_creates_active_agreement(mocker, admin_client):
-    set_agreement_as_active = mocker.patch("misago.legal.forms.set_agreement_as_active")
+    set_agreement_as_active = mocker.patch(
+        "misago.legal.admin.forms.set_agreement_as_active"
+    )
     response = admin_client.post(
         reverse("misago:admin:settings:agreements:new"),
         {

+ 98 - 0
misago/legal/admin/tests/test_utils.py

@@ -0,0 +1,98 @@
+from ...models import Agreement, UserAgreement
+from ..utils import disable_agreement, set_agreement_as_active
+
+
+def test_activating_inactive_agreement_updates_its_flag_but_doesnt_commit_to_db(db):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
+    )
+
+    set_agreement_as_active(agreement)
+    assert agreement.is_active
+
+    agreement.refresh_from_db()
+    assert not agreement.is_active
+
+
+def test_activating_inactive_agreement_with_commit_updates_its_flag_in_db(db):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
+    )
+
+    set_agreement_as_active(agreement, commit=True)
+    assert agreement.is_active
+
+    agreement.refresh_from_db()
+    assert agreement.is_active
+
+
+def test_activating_agreement_deactivates_other_active_agreement_of_same_type(db):
+    old_agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY,
+        link="https://somewhre.com",
+        text="Lorem ipsum",
+        is_active=True,
+    )
+
+    new_agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
+    )
+
+    set_agreement_as_active(new_agreement, commit=True)
+
+    old_agreement.refresh_from_db()
+    new_agreement.refresh_from_db()
+
+    assert not old_agreement.is_active
+    assert new_agreement.is_active
+
+
+def test_activating_agreement_doesnt_deactivate_agreement_of_other_type(db):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
+    )
+
+    other_type_agreement = Agreement.objects.create(
+        type=Agreement.TYPE_TOS,
+        link="https://somewhre.com",
+        text="Lorem ipsum",
+        is_active=True,
+    )
+
+    set_agreement_as_active(agreement, commit=True)
+
+    agreement.refresh_from_db()
+    other_type_agreement.refresh_from_db()
+
+    assert agreement.is_active
+    assert other_type_agreement.is_active
+
+
+def test_disabling_active_agreement_updates_its_flag_but_doesnt_commit_to_db(db):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY,
+        link="https://somewhre.com",
+        text="Lorem ipsum",
+        is_active=True,
+    )
+
+    disable_agreement(agreement)
+    assert not agreement.is_active
+
+    agreement.refresh_from_db()
+    assert agreement.is_active
+
+
+def test_disabling_active_agreement_with_commit_updates_its_flag_in_db(db):
+    agreement = Agreement.objects.create(
+        type=Agreement.TYPE_PRIVACY,
+        link="https://somewhre.com",
+        text="Lorem ipsum",
+        is_active=True,
+    )
+
+    disable_agreement(agreement, commit=True)
+    assert not agreement.is_active
+
+    agreement.refresh_from_db()
+    assert not agreement.is_active

+ 19 - 0
misago/legal/admin/utils.py

@@ -0,0 +1,19 @@
+from ..models import Agreement
+
+
+def set_agreement_as_active(agreement, commit=False):
+    agreement.is_active = True
+    Agreement.objects.filter(type=agreement.type).exclude(pk=agreement.pk).update(
+        is_active=False
+    )
+
+    if commit:
+        agreement.save(update_fields=["is_active"])
+        Agreement.objects.invalidate_cache()
+
+
+def disable_agreement(agreement, commit=False):
+    agreement.is_active = False
+    if commit:
+        agreement.save(update_fields=["is_active"])
+        Agreement.objects.invalidate_cache()

+ 2 - 2
misago/legal/views/admin.py → misago/legal/admin/views.py

@@ -3,9 +3,9 @@ from django.utils import timezone
 from django.utils.translation import gettext_lazy as _
 
 from ...admin.views import generic
-from ..forms import AgreementForm, FilterAgreementsForm
 from ..models import Agreement
-from ..utils import disable_agreement, set_agreement_as_active
+from .forms import AgreementForm, FilterAgreementsForm
+from .utils import disable_agreement, set_agreement_as_active
 
 
 class AgreementAdmin(generic.AdminBaseMixin):

+ 0 - 54
misago/legal/tests/test_utils.py

@@ -6,7 +6,6 @@ from ..utils import (
     get_parsed_agreement_text,
     get_required_user_agreement,
     save_user_agreement_acceptance,
-    set_agreement_as_active,
 )
 
 
@@ -134,56 +133,3 @@ class SaveUserAgreementAcceptance(UserTestCase):
 
         UserAgreement.objects.get(user=user, agreement=agreement)
         self.assertEqual(UserAgreement.objects.count(), 1)
-
-
-class SetAgreementAsActiveTests(TestCase):
-    def test_inactive_agreement(self):
-        agreement = Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
-        )
-
-        set_agreement_as_active(agreement)
-        self.assertTrue(agreement.is_active)
-
-        agreement.refresh_from_db()
-        self.assertFalse(agreement.is_active)
-
-    def test_inactive_agreement_commit(self):
-        agreement = Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
-        )
-
-        set_agreement_as_active(agreement, commit=True)
-        self.assertTrue(agreement.is_active)
-
-        agreement.refresh_from_db()
-        self.assertTrue(agreement.is_active)
-
-    def test_change_active_agreement(self):
-        old_agreement = Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY,
-            link="https://somewhre.com",
-            text="Lorem ipsum",
-            is_active=True,
-        )
-
-        new_agreement = Agreement.objects.create(
-            type=Agreement.TYPE_PRIVACY, link="https://somewhre.com", text="Lorem ipsum"
-        )
-
-        other_type_agreement = Agreement.objects.create(
-            type=Agreement.TYPE_TOS,
-            link="https://somewhre.com",
-            text="Lorem ipsum",
-            is_active=True,
-        )
-
-        set_agreement_as_active(new_agreement, commit=True)
-
-        old_agreement.refresh_from_db()
-        new_agreement.refresh_from_db()
-        other_type_agreement.refresh_from_db()
-
-        self.assertFalse(old_agreement.is_active)
-        self.assertTrue(new_agreement.is_active)
-        self.assertTrue(other_type_agreement.is_active)

+ 0 - 18
misago/legal/utils.py

@@ -8,24 +8,6 @@ from ..markup import common_flavour
 from .models import Agreement, UserAgreement
 
 
-def set_agreement_as_active(agreement, commit=False):
-    agreement.is_active = True
-    Agreement.objects.filter(type=agreement.type).exclude(pk=agreement.pk).update(
-        is_active=False
-    )
-
-    if commit:
-        agreement.save(update_fields=["is_active"])
-        Agreement.objects.invalidate_cache()
-
-
-def disable_agreement(agreement, commit=False):
-    agreement.is_active = False
-    if commit:
-        agreement.save(update_fields=["is_active"])
-        Agreement.objects.invalidate_cache()
-
-
 def get_required_user_agreement(user, agreements):
     if user.is_anonymous:
         return None

+ 2 - 2
misago/legal/views/legal.py → misago/legal/views.py

@@ -1,7 +1,7 @@
 from django.shortcuts import get_object_or_404, redirect, render
 
-from ..models import Agreement
-from ..utils import get_parsed_agreement_text
+from .models import Agreement
+from .utils import get_parsed_agreement_text
 
 
 def legal_view(request, agreement_type):

+ 0 - 1
misago/legal/views/__init__.py

@@ -1 +0,0 @@
-from .legal import privacy_policy, terms_of_service

+ 2 - 2
misago/users/admin/tests/test_bans.py

@@ -53,14 +53,14 @@ def test_mass_deleting_bans_invalidates_bans_cache(admin_client, admin_link, ban
         )
 
 
-def test_ban_can_be_deleted(admin_client, admin_link, ban):
+def test_ban_can_be_deleted(admin_client, ban):
     admin_client.post(reverse("misago:admin:users:bans:delete", kwargs={"pk": ban.pk}))
 
     with pytest.raises(Ban.DoesNotExist):
         ban.refresh_from_db()
 
 
-def test_deleting_ban_invalidates_bans_cache(admin_client, admin_link, ban):
+def test_deleting_ban_invalidates_bans_cache(admin_client, ban):
     with assert_invalidates_cache(BANS_CACHE):
         admin_client.post(
             reverse("misago:admin:users:bans:delete", kwargs={"pk": ban.pk})