Skip to content

Commit

Permalink
Merge 4147a9d into eb29ffe
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalp committed Sep 22, 2019
2 parents eb29ffe + 4147a9d commit 8ef9be4
Show file tree
Hide file tree
Showing 25 changed files with 399 additions and 440 deletions.
5 changes: 2 additions & 3 deletions devproject/settings.py
Expand Up @@ -193,8 +193,8 @@
"misago.socialauth",
"misago.graphql",
"misago.faker",
"misago.sso",
"misago.menus",
"misago.sso",
]

INTERNAL_IPS = ["127.0.0.1"]
Expand Down Expand Up @@ -285,8 +285,7 @@
"misago.search.context_processors.search_providers",
"misago.themes.context_processors.theme",
"misago.legal.context_processors.legal_links",
"misago.menus.context_processors.navbar",
"misago.menus.context_processors.footer",
"misago.menus.context_processors.menus",
"misago.users.context_processors.user_links",
# Data preloaders
"misago.conf.context_processors.preload_settings_json",
Expand Down
4 changes: 2 additions & 2 deletions misago/conftest.py
Expand Up @@ -6,14 +6,14 @@
from .conf import SETTINGS_CACHE
from .conf.dynamicsettings import DynamicSettings
from .conf.staticsettings import StaticSettings
from .menus import MENU_ITEMS_CACHE
from .socialauth import SOCIALAUTH_CACHE
from .test import MisagoClient
from .themes import THEME_CACHE
from .threads.test import post_thread
from .users import BANS_CACHE
from .users.models import AnonymousUser
from .users.test import create_test_superuser, create_test_user
from .menus import MENU_LINKS_CACHE


def get_cache_versions():
Expand All @@ -23,7 +23,7 @@ def get_cache_versions():
SETTINGS_CACHE: "abcdefgh",
SOCIALAUTH_CACHE: "abcdefgh",
THEME_CACHE: "abcdefgh",
MENU_LINKS_CACHE: "abcdefgh",
MENU_ITEMS_CACHE: "abcdefgh",
}


Expand Down
2 changes: 1 addition & 1 deletion misago/menus/__init__.py
@@ -1,3 +1,3 @@
default_app_config = "misago.menus.apps.MisagoMenusConfig"

MENU_LINKS_CACHE = "menus"
MENU_ITEMS_CACHE = "menus"
40 changes: 21 additions & 19 deletions misago/menus/admin/__init__.py
Expand Up @@ -2,34 +2,36 @@
from django.utils.translation import gettext_lazy as _

from .views import (
DeleteMenuLink,
EditMenuLink,
MenuLinksList,
MoveDownMenuLink,
MoveUpMenuLink,
NewMenuLink,
DeleteMenuItem,
EditMenuItem,
MenuItemsList,
MoveDownMenuItem,
MoveUpMenuItem,
NewMenuItem,
)


class MisagoAdminExtension:
def register_urlpatterns(self, urlpatterns):
# Menu links
urlpatterns.namespace(r"^links/", "links", "settings")
# Menu items
urlpatterns.namespace(r"^menu-items/", "menu-items", "settings")
urlpatterns.patterns(
"settings:links",
url(r"^$", MenuLinksList.as_view(), name="index"),
url(r"^(?P<page>\d+)/$", MenuLinksList.as_view(), name="index"),
url(r"^new/$", NewMenuLink.as_view(), name="new"),
url(r"^edit/(?P<pk>\d+)/$", EditMenuLink.as_view(), name="edit"),
url(r"^delete/(?P<pk>\d+)/$", DeleteMenuLink.as_view(), name="delete"),
url(r"^down/(?P<pk>(\w|-)+)/$", MoveDownMenuLink.as_view(), name="down"),
url(r"^up/(?P<pk>(\w|-)+)/$", MoveUpMenuLink.as_view(), name="up"),
"settings:menu-items",
url(r"^$", MenuItemsList.as_view(), name="index"),
url(r"^(?P<page>\d+)/$", MenuItemsList.as_view(), name="index"),
url(r"^new/$", NewMenuItem.as_view(), name="new"),
url(r"^edit/(?P<pk>\d+)/$", EditMenuItem.as_view(), name="edit"),
url(r"^delete/(?P<pk>\d+)/$", DeleteMenuItem.as_view(), name="delete"),
url(r"^down/(?P<pk>(\w|-)+)/$", MoveDownMenuItem.as_view(), name="down"),
url(r"^up/(?P<pk>(\w|-)+)/$", MoveUpMenuItem.as_view(), name="up"),
)

def register_navigation_nodes(self, site):
site.add_node(
name=_("Menu links"),
description=_("Add custom links to navbar and footer menus."),
name=_("Menu items"),
description=_(
"Use those options to add custom items to the navbar and footer menus."
),
parent="settings",
namespace="links",
namespace="menu-items",
)
50 changes: 24 additions & 26 deletions misago/menus/admin/forms.py
@@ -1,49 +1,47 @@
from django import forms
from django.utils.translation import gettext_lazy as _

from ..models import MenuLink
from ...admin.forms import YesNoSwitch
from ..models import MenuItem
from ..cache import clear_menus_cache


class MenuLinkForm(forms.ModelForm):
link = forms.URLField(
label=_("Link"),
help_text=_("URL where the link should point to."),
required=True,
class MenuItemForm(forms.ModelForm):
title = forms.CharField(label=_("Title"))
url = forms.URLField(
label=_("URL"), help_text=_("URL where this item will point to.")
)
title = forms.CharField(
label=_("Title"), help_text=_("Title that will be used"), required=True
)
position = forms.ChoiceField(
label=_("Position"),
choices=MenuLink.LINK_POSITION_CHOICES,
help_text=_("Position/s the link should be located"),
menu = forms.ChoiceField(
label=_("Menu"),
choices=MenuItem.MENU_CHOICES,
help_text=_("Menu in which this item will be displayed."),
)
css_class = forms.CharField(
label=_("CSS Class"),
help_text=_(
"Optional CSS class used to customize this link appearance in templates."
),
label=_("CSS class"),
help_text=_('If you want to set custom value for link\'s "class".'),
required=False,
)
target = forms.CharField(
label=_("Target"),
target_blank = YesNoSwitch(
label=_("Open this link in new window"),
help_text=_(
"Optional target attribute that this link will use (ex. '_blank')."
'Enabling this option will result in the target="_blank" attribute being '
"added to this link's HTML element."
),
required=False,
)
rel = forms.CharField(
label=_("Rel"),
help_text=_("Optional rel attribute that this link will use (ex. 'nofollow')."),
label=_("Rel attribute"),
help_text=_(
'Optional "rel" attribute that this item will use (ex. "nofollow").'
),
required=False,
)

class Meta:
model = MenuLink
fields = ["link", "title", "position", "css_class", "target", "rel"]
model = MenuItem
fields = ["title", "url", "menu", "css_class", "target_blank", "rel"]

def save(self):
link = super().save()
item = super().save()
clear_menus_cache()
return link
return item
4 changes: 2 additions & 2 deletions misago/menus/admin/ordering.py
@@ -1,8 +1,8 @@
from ..models import MenuLink
from ..models import MenuItem


def get_next_free_order():
last = MenuLink.objects.last()
last = MenuItem.objects.last()
if last:
return last.order + 1
return 0
25 changes: 11 additions & 14 deletions misago/menus/admin/tests/conftest.py
@@ -1,32 +1,29 @@
import pytest
from django.urls import reverse

from ...models import MenuLink
from ...models import MenuItem


@pytest.fixture
def list_url(admin_client):
return reverse("misago:admin:settings:links:index")
return reverse("misago:admin:settings:menu-items:index")


@pytest.fixture
def menu_link(superuser):
return MenuLink.objects.create(
position=MenuLink.POSITION_TOP,
def menu_item(superuser):
return MenuItem.objects.create(
menu=MenuItem.MENU_NAVBAR,
title="Test TMLA",
link="https://top_menu_link_admin.com",
url="https://top_menu_item_admin.com",
order=0,
)


@pytest.fixture
def other_menu_link(superuser):
return MenuLink.objects.create(
position=MenuLink.POSITION_BOTH,
title="Other Menu Link",
link="https://other_menu_link.com",
css_class="other-menu-link",
rel="noopener noreferrer",
target="_blank",
def other_menu_item(superuser):
return MenuItem.objects.create(
menu=MenuItem.MENU_BOTH,
title="Other Menu Item",
url="https://other_menu_item.com",
order=1,
)
80 changes: 40 additions & 40 deletions misago/menus/admin/tests/test_admin_views.py
Expand Up @@ -2,93 +2,93 @@
from django.urls import reverse

from ....test import assert_contains
from ...models import MenuLink
from ...models import MenuItem


def test_nav_contains_menus_link(admin_client, list_url):
def test_nav_contains_menus_item(admin_client, list_url):
response = admin_client.get(list_url)
assert_contains(response, reverse("misago:admin:settings:links:index"))
assert_contains(response, reverse("misago:admin:settings:menu-items:index"))


def test_empty_list_renders(admin_client, list_url):
response = admin_client.get(list_url)
assert response.status_code == 200


def test_list_renders_menu_link(admin_client, list_url, menu_link):
def test_list_renders_menu_item(admin_client, list_url, menu_item):
response = admin_client.get(list_url)
assert_contains(response, menu_link.title)
assert_contains(response, menu_item.title)


def test_menu_links_can_be_mass_deleted(admin_client, list_url, superuser):
links = []
def test_menu_items_can_be_mass_deleted(admin_client, list_url, superuser):
items = []
for _ in range(10):
link = MenuLink.objects.create(
position=MenuLink.POSITION_FOOTER,
title="Test Link {}".format(_),
link="https://links{}.com".format(_),
item = MenuItem.objects.create(
menu=MenuItem.MENU_FOOTER,
title="Test Item {}".format(_),
url="https://items{}.com".format(_),
)
links.append(link.pk)
items.append(item.pk)

assert MenuLink.objects.count() == 10
assert MenuItem.objects.count() == 10

response = admin_client.post(
list_url, data={"action": "delete", "selected_items": links}
list_url, data={"action": "delete", "selected_items": items}
)
assert response.status_code == 302
assert MenuLink.objects.count() == 0
assert MenuItem.objects.count() == 0


def test_creation_form_renders(admin_client):
response = admin_client.get(reverse("misago:admin:settings:links:new"))
response = admin_client.get(reverse("misago:admin:settings:menu-items:new"))
assert response.status_code == 200


def test_form_creates_new_menu_link(admin_client):
def test_form_creates_new_menu_item(admin_client):
response = admin_client.post(
reverse("misago:admin:settings:links:new"),
reverse("misago:admin:settings:menu-items:new"),
{
"position": MenuLink.POSITION_FOOTER,
"title": "Test Link",
"link": "https://admin.com/links/",
"menu": MenuItem.MENU_FOOTER,
"title": "Test Item",
"url": "https://admin.com/items/",
},
)

link = MenuLink.objects.get()
assert link.position == MenuLink.POSITION_FOOTER
assert link.title == "Test Link"
assert link.link == "https://admin.com/links/"
item = MenuItem.objects.get()
assert item.menu == MenuItem.MENU_FOOTER
assert item.title == "Test Item"
assert item.url == "https://admin.com/items/"


def test_edit_form_renders(admin_client, menu_link):
def test_edit_form_renders(admin_client, menu_item):
response = admin_client.get(
reverse("misago:admin:settings:links:edit", kwargs={"pk": menu_link.pk})
reverse("misago:admin:settings:menu-items:edit", kwargs={"pk": menu_item.pk})
)
assert_contains(response, menu_link.title)
assert_contains(response, menu_item.title)


def test_edit_form_updates_menu_links(admin_client, menu_link):
def test_edit_form_updates_menu_items(admin_client, menu_item):
response = admin_client.post(
reverse("misago:admin:settings:links:edit", kwargs={"pk": menu_link.pk}),
reverse("misago:admin:settings:menu-items:edit", kwargs={"pk": menu_item.pk}),
data={
"position": menu_link.POSITION_BOTH,
"menu": menu_item.MENU_BOTH,
"title": "Test Edited",
"link": "https://example.com/edited/",
"url": "https://example.com/edited/",
},
)
assert response.status_code == 302

menu_link.refresh_from_db()
assert menu_link.position == MenuLink.POSITION_BOTH
assert menu_link.title == "Test Edited"
assert menu_link.link == "https://example.com/edited/"
menu_item.refresh_from_db()
assert menu_item.menu == MenuItem.MENU_BOTH
assert menu_item.title == "Test Edited"
assert menu_item.url == "https://example.com/edited/"


def test_menu_link_can_be_deleted(admin_client, menu_link):
def test_menu_item_can_be_deleted(admin_client, menu_item):
response = admin_client.post(
reverse("misago:admin:settings:links:delete", kwargs={"pk": menu_link.pk})
reverse("misago:admin:settings:menu-items:delete", kwargs={"pk": menu_item.pk})
)
assert response.status_code == 302

with pytest.raises(MenuLink.DoesNotExist):
menu_link.refresh_from_db()
with pytest.raises(MenuItem.DoesNotExist):
menu_item.refresh_from_db()

0 comments on commit 8ef9be4

Please sign in to comment.