# Copyright (c) 2011, 2012 Free Software Foundation
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
# This project incorporates work covered by the following copyright and permission notice:
# Copyright (c) 2009, Julien Fache
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of the author nor the names of other
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.
# Copyright (c) 2011, 2012 Free Software Foundation
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
"""Menus for gstudio.plugins"""
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from menus.base import Modifier
from menus.base import NavigationNode
from menus.menu_pool import menu_pool
from cms.menu_bases import CMSAttachMenu
from gstudio.models import Nodetype
from gstudio.models import Author
from gstudio.models import Metatype
from gstudio.managers import tags_published
from gstudio.plugins.settings import HIDE_NODETYPE_MENU
class NodetypeMenu(CMSAttachMenu):
"""Menu for the nodetypes organized by archives dates"""
name = _('Gstudio Nodetype Menu')
def get_nodes(self, request):
"""Return menu's node for nodetypes"""
nodes = []
archives = []
attributes = {'hidden': HIDE_NODETYPE_MENU}
for nodetype in Nodetype.published.all():
year = nodetype.creation_date.strftime('%Y')
month = nodetype.creation_date.strftime('%m')
month_text = nodetype.creation_date.strftime('%b')
day = nodetype.creation_date.strftime('%d')
key_archive_year = 'year-%s' % year
key_archive_month = 'month-%s-%s' % (year, month)
key_archive_day = 'day-%s-%s-%s' % (year, month, day)
if not key_archive_year in archives:
nodes.append(NavigationNode(
year, reverse('gstudio_nodetype_archive_year', args=[year]),
key_archive_year, attr=attributes))
archives.append(key_archive_year)
if not key_archive_month in archives:
nodes.append(NavigationNode(
month_text,
reverse('gstudio_nodetype_archive_month', args=[year, month]),
key_archive_month, key_archive_year,
attr=attributes))
archives.append(key_archive_month)
if not key_archive_day in archives:
nodes.append(NavigationNode(
day, reverse('gstudio_nodetype_archive_day',
args=[year, month, day]),
key_archive_day, key_archive_month,
attr=attributes))
archives.append(key_archive_day)
nodes.append(NavigationNode(nodetype.title, nodetype.get_absolute_url(),
nodetype.pk, key_archive_day))
return nodes
class MetatypeMenu(CMSAttachMenu):
"""Menu for the metatypes"""
name = _('Gstudio Metatype Menu')
def get_nodes(self, request):
"""Return menu's node for metatypes"""
nodes = []
nodes.append(NavigationNode(_('Metatypes'),
reverse('gstudio_metatype_list'),
'metatypes'))
for metatype in Metatype.objects.all():
nodes.append(NavigationNode(metatype.title,
metatype.get_absolute_url(),
metatype.pk, 'metatypes'))
return nodes
class AuthorMenu(CMSAttachMenu):
"""Menu for the authors"""
name = _('Gstudio Author Menu')
def get_nodes(self, request):
"""Return menu's node for authors"""
nodes = []
nodes.append(NavigationNode(_('Authors'),
reverse('gstudio_author_list'),
'authors'))
for author in Author.published.all():
nodes.append(NavigationNode(author.username,
reverse('gstudio_author_detail',
args=[author.username]),
author.pk, 'authors'))
return nodes
class TagMenu(CMSAttachMenu):
"""Menu for the tags"""
name = _('Gstudio Tag Menu')
def get_nodes(self, request):
"""Return menu's node for tags"""
nodes = []
nodes.append(NavigationNode(_('Tags'), reverse('gstudio_tag_list'),
'tags'))
for tag in tags_published():
nodes.append(NavigationNode(tag.name,
reverse('gstudio_tag_detail',
args=[tag.name]),
tag.pk, 'tags'))
return nodes
class NodetypeModifier(Modifier):
"""Menu Modifier for nodetypes,
hide the MenuNodetype in navigation, not in breadcrumbs"""
def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
"""Modify nodes of a menu"""
if breadcrumb:
return nodes
for node in nodes:
if node.attr.get('hidden'):
nodes.remove(node)
return nodes
menu_pool.register_menu(NodetypeMenu)
menu_pool.register_menu(MetatypeMenu)
menu_pool.register_menu(AuthorMenu)
menu_pool.register_menu(TagMenu)
menu_pool.register_modifier(NodetypeModifier)