-
{{ item.author.first_name }} {{ item.author.last_name}} edited the budget
(view)
+ {% if item.action == import('sstreasury.models').BudgetAction.CREATE.value %}
+
{{ item.author.first_name }} {{ item.author.last_name }} created the budget
(view)
+ {% elif item.action == import('sstreasury.models').BudgetAction.EDIT.value %}
+
{{ item.author.first_name }} {{ item.author.last_name }} edited the budget
(view)
+ {% elif item.action == import('sstreasury.models').BudgetAction.UPDATE_STATE.value %}
+
{{ item.author.first_name }} {{ item.author.last_name }} changed the state to: {{ item.get_state_display() }}
+ {% else %}
+
{{ item.author.first_name }} {{ item.author.last_name }} modified the budget
(view)
+ {% endif %}
{{ localtime(item.time) }}
diff --git a/sstreasury/jinja2/sstreasury/email/commented.md b/sstreasury/jinja2/sstreasury/email/commented.md
new file mode 100644
index 0000000..b1f8582
--- /dev/null
+++ b/sstreasury/jinja2/sstreasury/email/commented.md
@@ -0,0 +1,7 @@
+{{ comment.author.first_name }} {{ comment.author.last_name }} made a new comment on the budget *{{ revision.name }}*:
+
+```
+{{ comment.content }}
+```
+
+{{ baseurl }}{{ url('budget_view', kwargs={'id': revision.budget.id}) }}
diff --git a/sstreasury/jinja2/sstreasury/email/submitted_drafter.md b/sstreasury/jinja2/sstreasury/email/submitted_drafter.md
new file mode 100644
index 0000000..f331bd2
--- /dev/null
+++ b/sstreasury/jinja2/sstreasury/email/submitted_drafter.md
@@ -0,0 +1,3 @@
+Your budget titled *{{ revision.name }}* has been submitted for Treasury review.
+
+{{ baseurl }}{{ url('budget_view', kwargs={'id': revision.budget.id}) }}
diff --git a/sstreasury/jinja2/sstreasury/email/submitted_treasurer.md b/sstreasury/jinja2/sstreasury/email/submitted_treasurer.md
new file mode 100644
index 0000000..e62b9d7
--- /dev/null
+++ b/sstreasury/jinja2/sstreasury/email/submitted_treasurer.md
@@ -0,0 +1,3 @@
+A budget titled *{{ revision.name }}* has been submitted for your review.
+
+{{ baseurl }}{{ url('budget_view', kwargs={'id': revision.budget.id}) }}
diff --git a/sstreasury/models.py b/sstreasury/models.py
index 007a3e1..429dc5c 100644
--- a/sstreasury/models.py
+++ b/sstreasury/models.py
@@ -39,7 +39,18 @@ class BudgetState(Enum):
AWAIT_REVIEW = 30, 'Awaiting Treasury review'
ENDORSED = 40, 'Endorsed by Treasury, awaiting committee approval'
APPROVED = 50, 'Approved'
- CANCELLED = 60, 'Cancelled'
+ #CANCELLED = 60, 'Cancelled'
+
+ def __new__(cls, value, description):
+ obj = object.__new__(cls)
+ obj._value_ = value
+ obj.description = description
+ return obj
+
+class BudgetAction(Enum):
+ CREATE = 5, 'Created'
+ EDIT = 10, 'Edited'
+ UPDATE_STATE = 20, 'Updated state'
def __new__(cls, value, description):
obj = object.__new__(cls)
@@ -66,5 +77,13 @@ class BudgetRevision(models.Model):
expense_no_emergency_fund = models.BooleanField()
expense_comments = models.TextField()
+ action = models.IntegerField(choices=[(v.value, v.description) for v in BudgetAction])
+
+ def copy(self):
+ contributors = list(self.contributors.all())
+ self.pk, self.id = None, None
+ self.save()
+ self.contributors.add(*contributors)
+
class Meta:
ordering = ['id']
diff --git a/sstreasury/views.py b/sstreasury/views.py
index adee9ac..2e9a54e 100644
--- a/sstreasury/views.py
+++ b/sstreasury/views.py
@@ -26,6 +26,7 @@ from django.utils import timezone
from django.views import generic
from . import models
+from ssmain.email import Emailer
import itertools
import json
@@ -113,6 +114,7 @@ def budget_new(request):
revision = models.BudgetRevision()
revision.author = request.user
revision.time = timezone.now()
+ revision.action = models.BudgetAction.CREATE.value
revision = revision_from_form(budget, revision, request.POST)
if request.POST['submit'] == 'Save':
@@ -146,6 +148,7 @@ def budget_edit(request, id):
revision = models.BudgetRevision()
revision.author = request.user
revision.time = timezone.now()
+ revision.action = models.BudgetAction.EDIT.value
revision = revision_from_form(budget, revision, request.POST)
if request.POST['submit'] == 'Save':
@@ -170,11 +173,51 @@ def budget_action(request, id):
raise PermissionDenied
if request.POST['action'] == 'Comment':
- comment = models.BudgetComment()
- comment.budget = budget
- comment.author = request.user
- comment.time = timezone.now()
- comment.content = request.POST['comment']
- comment.save()
+ with transaction.atomic():
+ comment = models.BudgetComment()
+ comment.budget = budget
+ comment.author = request.user
+ comment.time = timezone.now()
+ comment.content = request.POST['comment']
+ comment.save()
+
+ emailer = Emailer()
+ for user in User.objects.filter(groups__name='Treasury'):
+ if user != request.user:
+ emailer.send_mail([user.email], 'New comment on budget: {}'.format(revision.name), 'sstreasury/email/commented.md', {'revision': revision, 'comment': comment})
+ for user in revision.contributors.all():
+ if user != request.user:
+ emailer.send_mail([user.email], 'New comment on budget: {}'.format(revision.name), 'sstreasury/email/commented.md', {'revision': revision, 'comment': comment})
+
+ if request.POST['action'] == 'Submit':
+ if revision.state != models.BudgetState.DRAFT.value and revision.state != models.BudgetState.RESUBMIT.value:
+ raise PermissionDenied
+
+ with transaction.atomic():
+ # Copy revision
+ revision.copy()
+ revision.author = request.user
+ revision.time = timezone.now()
+ revision.state = models.BudgetState.AWAIT_REVIEW.value
+ revision.action = models.BudgetAction.UPDATE_STATE.value
+ revision.save()
+
+ emailer = Emailer()
+ for user in User.objects.filter(groups__name='Treasury'):
+ emailer.send_mail([user.email], 'Budget submitted: {}'.format(revision.name), 'sstreasury/email/submitted_treasurer.md', {'revision': revision})
+ for user in revision.contributors.all():
+ emailer.send_mail([user.email], 'Budget submitted: {}'.format(revision.name), 'sstreasury/email/submitted_drafter.md', {'revision': revision})
+
+ if request.POST['action'] == 'Withdraw':
+ if revision.state == models.BudgetState.DRAFT.value or revision.state == models.BudgetState.RESUBMIT.value or revision.state == models.BudgetState.APPROVED.value:
+ raise PermissionDenied
+
+ # Copy revision
+ revision.copy()
+ revision.author = request.user
+ revision.time = timezone.now()
+ revision.state = models.BudgetState.DRAFT.value
+ revision.action = models.BudgetAction.UPDATE_STATE.value
+ revision.save()
return redirect(reverse('budget_view', kwargs={'id': budget.id}))