Skip to content

Commit e40c650

Browse files
committed
Continue implementing message creat
1 parent ab440b3 commit e40c650

File tree

6 files changed

+132
-13
lines changed

6 files changed

+132
-13
lines changed

etsd/msgs/forms.py

+51-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
from django import forms
2+
from django_tools.middlewares import ThreadLocal
3+
from django.utils.translation import ugettext as _
4+
25
from . import models
6+
from etsd.keys.models import PublicKey
7+
8+
9+
def has_active_public_key(authority):
10+
return PublicKey.objects.filter(authority=authority, status="ACTIVE").exists()
311

412

513
class ParticipantInlineForm(forms.ModelForm):
@@ -9,6 +17,48 @@ class Meta:
917

1018
def __init__(self, *args, **kwargs):
1119
super(ParticipantInlineForm, self).__init__(*args, **kwargs)
12-
20+
user = ThreadLocal.get_current_user()
21+
1322
new_choices = list(self.fields["kind"].choices)
1423
self.fields["kind"].choices = new_choices[:3]
24+
25+
auth_qs = self.fields["authority"].queryset
26+
self.fields["authority"].queryset = auth_qs.exclude(id=user.get_authority().id)
27+
28+
def clean(self):
29+
authority = self.cleaned_data.get("authority")
30+
if authority and not has_active_public_key(authority):
31+
self.add_error(
32+
"authority",
33+
_("This authority does not have an active public key!"),
34+
)
35+
36+
37+
class MessageCreateForm(forms.ModelForm):
38+
class Meta:
39+
model = models.Message
40+
fields = ["category", "kind", "available_to_sender", "rel_message"]
41+
42+
def clean(self):
43+
user = ThreadLocal.get_current_user()
44+
my_authority = user.get_authority()
45+
if self.cleaned_data["available_to_sender"] and not has_active_public_key(
46+
my_authority
47+
):
48+
self.add_error(
49+
"available_to_sender",
50+
_("Your authority does not have an active public key!"),
51+
)
52+
53+
kind = self.cleaned_data.get("kind")
54+
rel_message = self.cleaned_data.get("rel_message")
55+
if kind == "NEW" and rel_message:
56+
self.add_error(
57+
"rel_message",
58+
_("You cannot add a related message when message kind is New!"),
59+
)
60+
if kind != "NEW" and not rel_message:
61+
self.add_error(
62+
"rel_message",
63+
_("You must provide a related message when message kind is not New!"),
64+
)

etsd/msgs/models.py

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.db import models
22
from django.db.models import Max
3+
from django.urls import reverse
34
from django.utils.translation import ugettext_lazy as _
45
from django.utils import timezone
56

@@ -101,6 +102,9 @@ def send(self):
101102
self.protocol = max_protocol + 1
102103
self.status = "SENT"
103104
self.save()
105+
106+
def get_absolute_url(self):
107+
return reverse("message_detail", kwargs={"pk": self.pk})
104108

105109

106110
PARTICIPANT_KIND_CHOICES = (

etsd/msgs/tables.py

+21-9
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
11
import django_tables2 as tables
22
from django_tables2_column_shifter.tables import ColumnShiftTable
3-
from . import models
43
from django.utils.html import mark_safe
4+
from django.utils.translation import ugettext as _
5+
from django.utils.translation import ugettext_lazy as __
6+
57
from django_tables2.utils import A
68

9+
from . import models
10+
11+
PROTOCOL = """
12+
{{% if record.protocol %}}
13+
{{{{ record.protocol }}}} / {{{{ record.protocol_year }}}}
14+
{{% else %}}
15+
{0}
16+
{{% endif %}}
17+
""" .format( _('Draft message'))
18+
719

820
class MessageTable(ColumnShiftTable):
9-
# id = tables.LinkColumn(
10-
# "app_detail",
11-
# args=[A("id")],
12-
# verbose_name="ΚΩΔ",
13-
# attrs={"a": {"class": "btn btn-primary btn-sm"}},
14-
# )
21+
id = tables.LinkColumn(
22+
"message_detail",
23+
args=[A("id")],
24+
verbose_name="ID",
25+
attrs={"a": {"class": "btn btn-primary btn-sm"}},
26+
)
1527

16-
proto = tables.TemplateColumn("{{ record.protocol }} / {{ record.protocol_year }}")
28+
proto = tables.TemplateColumn(PROTOCOL, verbose_name=__('Protocol'), orderable=False)
1729

1830
class Meta:
1931
model = models.Message
20-
fields = ("id", "proto", "sent_on", "kind" , "status", "category", "rel_message")
32+
fields = ("id", "proto", "sent_on", "kind", "status", "category", "rel_message")
2133
attrs = {"class": "table table-sm table-stripped"}
2234
empty_text = "No entries"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{% extends "site_base.html" %}
2+
{% load i18n %}
3+
4+
5+
6+
{% block head_title %}{% trans "Message detail" %}{% endblock %}
7+
{% block page_title %}{% trans "Message detail" %}{% endblock %}
8+
{% block page_content %}
9+
10+
11+
{% for mp in message.participant_set.all %}
12+
{{ mp.authority }}: {{ mp.get_kind_display }}
13+
14+
{% endfor %}
15+
16+
<div class="row">
17+
<div class="col-md-12">
18+
<a class='btn btn-info' href='{% url "message_list" %}'>Return</a>
19+
</div>
20+
</div>
21+
22+
{% endblock %}

etsd/msgs/urls.py

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ def any_permission_required(*args):
2525
),
2626
name="message_list",
2727
),
28+
path(
29+
"message_detail/<int:pk>/",
30+
any_permission_required("core.admin", "core.user")(
31+
views.MessageDetailView.as_view()
32+
),
33+
name="message_detail",
34+
),
2835
path(
2936
"new/",
3037
any_permission_required("core.admin", "core.user")(

etsd/msgs/views.py

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
from django.views.generic import ListView
2-
1+
from django.views.generic import ListView, DetailView
2+
from django.contrib import messages
3+
from django.utils.translation import ugettext as _
34
from django_tables2 import RequestConfig
45
from django_tables2.export.views import ExportMixin
56

@@ -48,4 +49,27 @@ class ParticipantInline(InlineFormSetFactory):
4849
class MessageCreateView(CreateWithInlinesView):
4950
model = models.Message
5051
inlines = [ParticipantInline]
51-
fields = ["category", "kind", "available_to_sender", "rel_message"]
52+
form_class = forms.MessageCreateForm
53+
54+
def forms_valid(self, form, inlines):
55+
r = super().forms_valid(form, inlines)
56+
messages.info(
57+
self.request,
58+
_("Draft message created"),
59+
)
60+
msg = form.instance
61+
models.Participant.objects.create(
62+
message=msg,
63+
authority=self.request.user.get_authority(),
64+
kind='SENDER'
65+
)
66+
return r
67+
68+
69+
class MessageDetailView(MessageAccessMixin, DetailView):
70+
model = models.Message
71+
72+
def get_context_data(self, *args, **kwargs):
73+
context = super().get_context_data(*args, **kwargs)
74+
75+
return context

0 commit comments

Comments
 (0)