diff --git a/HISTORY.rst b/HISTORY.rst index 839e73b7ea..0f4c02e4ac 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -18,6 +18,7 @@ - Fixed date locale handling in document properties, checkout and user detail views. - Add new permission: checkout details view. - Add HTML5 upload widget. Issue #162. +- Add Message of the Day app. Issue #222 2.0.2 (2016-02-09) ================== diff --git a/mayan/apps/motd/apps.py b/mayan/apps/motd/apps.py index 6a81910ea9..42eacb3556 100644 --- a/mayan/apps/motd/apps.py +++ b/mayan/apps/motd/apps.py @@ -9,7 +9,8 @@ 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, menu_object, menu_secondary, menu_tools +from common import MayanAppConfig, menu_object, menu_secondary, menu_setup +from navigation import SourceColumn from .links import ( link_message_create, link_message_delete, link_message_edit, @@ -29,6 +30,18 @@ class MOTDApp(MayanAppConfig): Message = self.get_model('Message') + SourceColumn( + source=Message, label=_('Enabled'), attribute='enabled' + ) + SourceColumn( + source=Message, label=_('Start date time'), + func=lambda context: context['object'].start_datetime or _('None') + ) + SourceColumn( + source=Message, label=_('End date time'), + func=lambda context: context['object'].end_datetime or _('None') + ) + menu_object.bind_links( links=( link_message_edit, link_message_delete @@ -38,6 +51,6 @@ class MOTDApp(MayanAppConfig): links=(link_message_create,), sources=(Message, 'motd:message_list', 'motd:message_create') ) - menu_tools.bind_links( + menu_setup.bind_links( links=(link_message_list,) ) diff --git a/mayan/apps/motd/models.py b/mayan/apps/motd/models.py index 02a8d97943..e240da0b64 100644 --- a/mayan/apps/motd/models.py +++ b/mayan/apps/motd/models.py @@ -10,14 +10,24 @@ from .managers import MessageManager @python_2_unicode_compatible class Message(models.Model): - label = models.CharField(max_length=32, verbose_name=_('Label')) - message = models.TextField(verbose_name=_('Message')) + label = models.CharField( + max_length=32, help_text=_('Short description of this message.'), + verbose_name=_('Label') + ) + message = models.TextField( + help_text=_('The actual message to be displayed.'), + verbose_name=_('Message') + ) enabled = models.BooleanField(default=True, verbose_name=_('Enabled')) start_datetime = models.DateTimeField( - blank=True, null=True, verbose_name=_('Start date time') + blank=True, help_text=_( + 'Date and time after which this message will be displayed.' + ), null=True, verbose_name=_('Start date time') ) end_datetime = models.DateTimeField( - blank=True, null=True, verbose_name=_('End date time') + blank=True, help_text=_( + 'Date and time until when this message is to be displayed.' + ), null=True, verbose_name=_('End date time') ) objects = MessageManager() diff --git a/mayan/apps/motd/templatetags/motd_tags.py b/mayan/apps/motd/templatetags/motd_tags.py index e490386f85..734e2184f5 100644 --- a/mayan/apps/motd/templatetags/motd_tags.py +++ b/mayan/apps/motd/templatetags/motd_tags.py @@ -2,11 +2,11 @@ from __future__ import unicode_literals from django.template import Library -from ..models import MessageOfTheDay +from ..models import Message register = Library() @register.inclusion_tag('motd/messages.html') def motd(): - return {'messages': MessageOfTheDay.objects.get_for_now()} + return {'messages': Message.objects.get_for_now()} diff --git a/mayan/apps/motd/tests/test_models.py b/mayan/apps/motd/tests/test_models.py index 858bbf1b55..7a1df0acb8 100644 --- a/mayan/apps/motd/tests/test_models.py +++ b/mayan/apps/motd/tests/test_models.py @@ -5,7 +5,7 @@ from datetime import timedelta from django.test import TestCase from django.utils import timezone -from ..models import MessageOfTheDay +from ..models import Message TEST_LABEL = 'test label' TEST_MESSAGE = 'test message' @@ -13,12 +13,12 @@ TEST_MESSAGE = 'test message' class MOTDTestCase(TestCase): def setUp(self): - self.motd = MessageOfTheDay.objects.create( + self.motd = Message.objects.create( label=TEST_LABEL, message=TEST_MESSAGE ) def test_basic(self): - queryset = MessageOfTheDay.objects.get_for_now() + queryset = Message.objects.get_for_now() self.assertEqual(queryset.exists(), True) @@ -26,7 +26,7 @@ class MOTDTestCase(TestCase): self.motd.start_datetime = timezone.now() - timedelta(days=1) self.motd.save() - queryset = MessageOfTheDay.objects.get_for_now() + queryset = Message.objects.get_for_now() self.assertEqual(queryset.first(), self.motd) @@ -35,7 +35,7 @@ class MOTDTestCase(TestCase): self.motd.end_datetime = timezone.now() - timedelta(days=1) self.motd.save() - queryset = MessageOfTheDay.objects.get_for_now() + queryset = Message.objects.get_for_now() self.assertEqual(queryset.exists(), False) @@ -43,6 +43,6 @@ class MOTDTestCase(TestCase): self.motd.enabled=False self.motd.save() - queryset = MessageOfTheDay.objects.get_for_now() + queryset = Message.objects.get_for_now() self.assertEqual(queryset.exists(), False) diff --git a/mayan/apps/motd/urls.py b/mayan/apps/motd/urls.py index 9ff081b7e4..709e8d7488 100644 --- a/mayan/apps/motd/urls.py +++ b/mayan/apps/motd/urls.py @@ -7,7 +7,7 @@ from .views import ( ) 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'), diff --git a/mayan/apps/motd/views.py b/mayan/apps/motd/views.py index 54a748d121..f8a883874d 100644 --- a/mayan/apps/motd/views.py +++ b/mayan/apps/motd/views.py @@ -16,17 +16,17 @@ from common.views import ( SingleObjectListView ) -from .models import MessageOfTheDay +from .models import Message from .permissions import ( - permission_message_create, permission_message_delete, permission_message_edit, - permission_message_view, + permission_message_create, permission_message_delete, + permission_message_edit, permission_message_view, ) logger = logging.getLogger(__name__) class MessageCreateView(SingleObjectCreateView): - fields = ('label',) + fields = ('label', 'message', 'enabled', 'start_datetime', 'end_datetime') model = Message view_permission = permission_message_create @@ -40,21 +40,22 @@ class MessageCreateView(SingleObjectCreateView): class MessageDeleteView(SingleObjectDeleteView): model = Message object_permission = permission_message_delete - post_action_redirect = reverse_lazy('messages:message_list') + post_action_redirect = reverse_lazy('motd:message_list') def get_extra_context(self): return { - 'object_name': _('Message'), + 'message': None, 'object': self.get_object(), + 'object_name': _('Message'), 'title': _('Delete the message: %s?') % self.get_object(), } class MessageEditView(SingleObjectEditView): - fields = ('label',) + fields = ('label', 'message', 'enabled', 'start_datetime', 'end_datetime') model = Message object_permission = permission_message_edit - post_action_redirect = reverse_lazy('messages:message_list') + post_action_redirect = reverse_lazy('motd:message_list') def get_extra_context(self): return { @@ -72,3 +73,4 @@ class MessageListView(SingleObjectListView): return { 'hide_link': True, 'title': _('Messages'), + }