From 65a18953bd04827c0d30353f9ce2190546f6de4b Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Sat, 2 Feb 2013 21:40:23 +0100 Subject: [PATCH] Added translatable log to the new motion system --- openslides/motion/models.py | 28 ++++++++++++++++--- .../templates/motion/motion_detail.html | 9 ++++++ openslides/motion/views.py | 17 ++++++++--- 3 files changed, 46 insertions(+), 8 deletions(-) diff --git a/openslides/motion/models.py b/openslides/motion/models.py index e1f0eb9a1..61b719091 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -251,8 +251,7 @@ class Motion(SlideMixin, models.Model): if self.state.support: if not self.is_supporter(person): MotionSupporter(motion=self, person=person).save() - #self.writelog(_("Supporter: +%s") % (person)) - # TODO: Raise a precise exception for the view in else-clause + self.write_log(ugettext_noop("Supporter: +%s") % person) else: raise WorkflowError("You can not support a motion in state %s" % self.state.name) @@ -262,6 +261,7 @@ class Motion(SlideMixin, models.Model): """ if self.state.support: self.supporter.filter(person=person).delete() + self.write_log(ugettext_noop("Supporter: -%s") % person) else: raise WorkflowError("You can not unsupport a motion in state %s" % self.state.name) @@ -269,8 +269,8 @@ class Motion(SlideMixin, models.Model): """ Create a new poll for this motion """ - # TODO: auto increment the poll_number in the Database if self.state.create_poll: + # TODO: auto increment the poll_number in the Database poll_number = self.polls.aggregate(Max('poll_number'))['poll_number__max'] or 0 poll = MotionPoll.objects.create(motion=self, poll_number=poll_number + 1) poll.set_options() @@ -293,7 +293,7 @@ class Motion(SlideMixin, models.Model): next_state has to be a valid state id or State object. """ - if type(next_state) is not State: + if not isinstance(next_state, State): next_state = get_state(next_state) if next_state in self.state.next_states: self.state_id = next_state.id @@ -359,6 +359,9 @@ class Motion(SlideMixin, models.Model): actions['reset_state'] = 'change_state' return actions + def write_log(self, message, person=None): + MotionLog.objects.create(motion=self, message=message, person=person) + class MotionVersion(models.Model): title = models.CharField(max_length=255, verbose_name=ugettext_lazy("Title")) @@ -401,6 +404,23 @@ class Comment(models.Model): creation_time = models.DateTimeField(auto_now=True) +class MotionLog(models.Model): + motion = models.ForeignKey(Motion, related_name='log_messages') + message = models.CharField(max_length=255) + person = PersonField(null=True) + time = models.DateTimeField(auto_now=True) + + class Meta: + ordering = ['-time'] + + def __unicode__(self): + # TODO: write time in the local time format. + if self.person is None: + return "%s %s" % (self.time, _(self.message)) + else: + return "%s %s by %s" % (self.time, _(self.message), self.person) + + class MotionVote(BaseVote): option = models.ForeignKey('MotionOption') diff --git a/openslides/motion/templates/motion/motion_detail.html b/openslides/motion/templates/motion/motion_detail.html index 234b057ca..d671b472f 100644 --- a/openslides/motion/templates/motion/motion_detail.html +++ b/openslides/motion/templates/motion/motion_detail.html @@ -79,4 +79,13 @@ {% endif %} {% endwith %} + + +

log

+ + {% endblock %} diff --git a/openslides/motion/views.py b/openslides/motion/views.py index 96242a3b1..1f3330f3f 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -15,7 +15,7 @@ from django.core.urlresolvers import reverse from django.contrib import messages from django.db import transaction from django.db.models import Model -from django.utils.translation import ugettext as _, ugettext_lazy +from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop from django.views.generic.detail import SingleObjectMixin from django.http import Http404 @@ -119,6 +119,11 @@ class MotionCreateView(MotionMixin, CreateView): permission_required = 'motion.can_create_motion' model = Motion + def form_valid(self, form): + value = super(MotionCreateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion created'), self.request.user) + return value + motion_create = MotionCreateView.as_view() @@ -131,6 +136,11 @@ class MotionUpdateView(MotionMixin, UpdateView): def has_permission(self, request, *args, **kwargs): return self.get_object().get_allowed_actions(request.user)['edit'] + def form_valid(self, form): + value = super(MotionUpdateView, self).form_valid(form) + self.object.write_log(ugettext_noop('Motion updated'), self.request.user) + return value + motion_edit = MotionUpdateView.as_view() @@ -268,9 +278,8 @@ class MotionSetStateView(SingleObjectMixin, RedirectView): self.object.reset_state() else: self.object.state = kwargs['state'] - except WorkflowError: - messages.error(request, _('Can not set the state to: %s.') - % html_strong(kwargs['state'])) + except WorkflowError, e: + messages.error(request, e) else: self.object.save() messages.success(request, _('Motion status was set to: %s.'