diff --git a/mayan/apps/motd/admin.py b/mayan/apps/motd/admin.py index f77cff8606..c4d3e6b7a1 100644 --- a/mayan/apps/motd/admin.py +++ b/mayan/apps/motd/admin.py @@ -2,9 +2,9 @@ from __future__ import unicode_literals from django.contrib import admin -from .models import MessageOfTheDay +from .models import Message -@admin.register(MessageOfTheDay) -class MessageOfTheDayAdmin(admin.ModelAdmin): +@admin.register(Message) +class MessageAdmin(admin.ModelAdmin): list_display = ('label', 'enabled', 'start_datetime', 'end_datetime') diff --git a/mayan/apps/motd/apps.py b/mayan/apps/motd/apps.py index 09a8336a50..6a81910ea9 100644 --- a/mayan/apps/motd/apps.py +++ b/mayan/apps/motd/apps.py @@ -9,14 +9,12 @@ from django.contrib.auth.signals import user_logged_in from django.db.models.signals import post_save from django.utils.translation import ugettext_lazy as _ -from common import MayanAppConfig +from common import MayanAppConfig, menu_object, menu_secondary, menu_tools -#from .links import ( -# link_about, link_current_user_details, link_current_user_edit, -# link_current_user_locale_profile_details, -# link_current_user_locale_profile_edit, link_filters, link_license, -# link_packages_licenses, link_setup, link_tools -#) +from .links import ( + link_message_create, link_message_delete, link_message_edit, + link_message_list +) logger = logging.getLogger(__name__) @@ -28,3 +26,18 @@ class MOTDApp(MayanAppConfig): def ready(self): super(MOTDApp, self).ready() + + Message = self.get_model('Message') + + menu_object.bind_links( + links=( + link_message_edit, link_message_delete + ), sources=(Message,) + ) + menu_secondary.bind_links( + links=(link_message_create,), + sources=(Message, 'motd:message_list', 'motd:message_create') + ) + menu_tools.bind_links( + links=(link_message_list,) + ) diff --git a/mayan/apps/motd/links.py b/mayan/apps/motd/links.py new file mode 100644 index 0000000000..01e627316e --- /dev/null +++ b/mayan/apps/motd/links.py @@ -0,0 +1,27 @@ +from __future__ import absolute_import, unicode_literals + +from django.utils.translation import ugettext_lazy as _ + +from navigation import Link + +from .permissions import ( + permission_message_create, permission_message_delete, permission_message_edit, + permission_message_view +) + +link_message_create = Link( + permissions=(permission_message_create,), text=_('Create message'), + view='motd:message_create' +) +link_message_delete = Link( + permissions=(permission_message_delete,), tags='dangerous', + text=_('Delete'), view='motd:message_delete', args='object.pk' +) +link_message_edit = Link( + permissions=(permission_message_edit,), text=_('Edit'), + view='motd:message_edit', args='object.pk' +) +link_message_list = Link( + icon='fa fa-bullhorn', text=_('Message of the day'), + view='motd:message_list' +) diff --git a/mayan/apps/motd/managers.py b/mayan/apps/motd/managers.py index c47516c7e9..29bfbf2e16 100644 --- a/mayan/apps/motd/managers.py +++ b/mayan/apps/motd/managers.py @@ -3,7 +3,7 @@ from django.db.models import Q from django.utils import timezone -class MessageOfTheDayManager(models.Manager): +class MessageManager(models.Manager): def get_for_now(self): now = timezone.now() return self.filter(enabled=True).filter( diff --git a/mayan/apps/motd/migrations/0004_auto_20160314_0040.py b/mayan/apps/motd/migrations/0004_auto_20160314_0040.py new file mode 100644 index 0000000000..c108711878 --- /dev/null +++ b/mayan/apps/motd/migrations/0004_auto_20160314_0040.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('motd', '0003_auto_20160313_0349'), + ] + + operations = [ + migrations.RenameModel( + old_name='MessageOfTheDay', + new_name='Message', + ), + migrations.AlterModelOptions( + name='message', + options={'verbose_name': 'Message', 'verbose_name_plural': 'Messages'}, + ), + ] diff --git a/mayan/apps/motd/models.py b/mayan/apps/motd/models.py index 6c8dfd7885..02a8d97943 100644 --- a/mayan/apps/motd/models.py +++ b/mayan/apps/motd/models.py @@ -5,11 +5,11 @@ from django.db import models from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ -from .managers import MessageOfTheDayManager +from .managers import MessageManager @python_2_unicode_compatible -class MessageOfTheDay(models.Model): +class Message(models.Model): label = models.CharField(max_length=32, verbose_name=_('Label')) message = models.TextField(verbose_name=_('Message')) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) @@ -20,11 +20,11 @@ class MessageOfTheDay(models.Model): blank=True, null=True, verbose_name=_('End date time') ) - objects = MessageOfTheDayManager() + objects = MessageManager() class Meta: - verbose_name = _('Message of the day') - verbose_name_plural = _('Messages of the day') + verbose_name = _('Message') + verbose_name_plural = _('Messages') def __str__(self): return self.label diff --git a/mayan/apps/motd/permissions.py b/mayan/apps/motd/permissions.py new file mode 100644 index 0000000000..61cc7e37c3 --- /dev/null +++ b/mayan/apps/motd/permissions.py @@ -0,0 +1,20 @@ +from __future__ import absolute_import, unicode_literals + +from django.utils.translation import ugettext_lazy as _ + +from permissions import PermissionNamespace + +namespace = PermissionNamespace('motd', _('Message of the day')) + +permission_message_create = namespace.add_permission( + name='message_create', label=_('Create messages') +) +permission_message_delete = namespace.add_permission( + name='message_delete', label=_('Delete messages') +) +permission_message_edit = namespace.add_permission( + name='message_edit', label=_('Edit messages') +) +permission_message_view = namespace.add_permission( + name='message_view', label=_('View messages') +) diff --git a/mayan/apps/motd/urls.py b/mayan/apps/motd/urls.py new file mode 100644 index 0000000000..9ff081b7e4 --- /dev/null +++ b/mayan/apps/motd/urls.py @@ -0,0 +1,18 @@ +from __future__ import unicode_literals + +from django.conf.urls import patterns, url + +from .views import ( + MessageCreateView, MessageDeleteView, MessageEditView, MessageListView +) + +urlpatterns = patterns( + 'motd.views', + url(r'^list/$', MessageListView.as_view(), name='message_list'), + url(r'^create/$', MessageCreateView.as_view(), name='message_create'), + url(r'^(?P\d+)/edit/$', MessageEditView.as_view(), name='message_edit'), + url( + r'^(?P\d+)/delete/$', MessageDeleteView.as_view(), + name='message_delete' + ), +) diff --git a/mayan/apps/motd/views.py b/mayan/apps/motd/views.py new file mode 100644 index 0000000000..54a748d121 --- /dev/null +++ b/mayan/apps/motd/views.py @@ -0,0 +1,74 @@ +from __future__ import absolute_import, unicode_literals + +import logging + +from django.conf import settings +from django.contrib import messages +from django.core.exceptions import PermissionDenied +from django.core.urlresolvers import reverse, reverse_lazy +from django.http import HttpResponseRedirect +from django.shortcuts import get_object_or_404, render_to_response +from django.template import RequestContext +from django.utils.translation import ugettext_lazy as _, ungettext + +from common.views import ( + SingleObjectCreateView, SingleObjectDeleteView, SingleObjectEditView, + SingleObjectListView +) + +from .models import MessageOfTheDay +from .permissions import ( + permission_message_create, permission_message_delete, permission_message_edit, + permission_message_view, +) + +logger = logging.getLogger(__name__) + + +class MessageCreateView(SingleObjectCreateView): + fields = ('label',) + model = Message + view_permission = permission_message_create + + def get_extra_context(self): + return { + 'object_name': _('Message'), + 'title': _('Create message'), + } + + +class MessageDeleteView(SingleObjectDeleteView): + model = Message + object_permission = permission_message_delete + post_action_redirect = reverse_lazy('messages:message_list') + + def get_extra_context(self): + return { + 'object_name': _('Message'), + 'object': self.get_object(), + 'title': _('Delete the message: %s?') % self.get_object(), + } + + +class MessageEditView(SingleObjectEditView): + fields = ('label',) + model = Message + object_permission = permission_message_edit + post_action_redirect = reverse_lazy('messages:message_list') + + def get_extra_context(self): + return { + 'object': self.get_object(), + 'object_name': _('Message'), + 'title': _('Edit message: %s') % self.get_object(), + } + + +class MessageListView(SingleObjectListView): + model = Message + object_permission = permission_message_view + + def get_extra_context(self): + return { + 'hide_link': True, + 'title': _('Messages'),