Skip to content
Snippets Groups Projects
Commit aee58c6c authored by Jean-Philippe Laverdure's avatar Jean-Philippe Laverdure
Browse files

Merge branch '108-alerts-not-working' into 'master'

Resolve "alerts not working"

Closes #108

See merge request !52
parents c3a5efd4 3737cb4d
No related branches found
No related tags found
1 merge request!52Resolve "alerts not working"
......@@ -2,7 +2,7 @@ import logging
from crispy_forms.bootstrap import Tab, TabHolder
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout
from crispy_forms.layout import Layout, Field, Row, Column
from django import forms
from django.contrib.auth.models import User
from django.contrib.postgres.forms import HStoreField
......@@ -16,6 +16,10 @@ from .models import (Alert, AppSettings, DataFile, DataSet, Institution, Lab,
logger = logging.getLogger('debug')
class DatePicker(Field):
template = 'forms/datepicker.html'
class BaseNestedFormSet(forms.BaseFormSet):
def is_valid(self):
result = super().is_valid()
......@@ -64,6 +68,31 @@ class AlertForm(forms.ModelForm):
'message_en': forms.Textarea(attrs={'rows': 3}),
'message_fr': forms.Textarea(attrs={'rows': 3}),
}
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_tag = False
self.helper.use_custom_control = True
self.helper.layout = Layout(
Row(
Column('message_en', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
Row(
Column('message_fr', css_class='form-group col-md-6 mb-0'),
css_class='form-row'
),
Row(
Column(DatePicker('start'), css_class='form-group col-md-6 mb-0'),
css_class='form-row mb-3'
),
Row(
Column(DatePicker('end'), css_class='form-group col-md-6 mb-0'),
css_class='form-row mb-3'
)
)
class UserForm(forms.ModelForm):
......
{% load crispy_forms_field %}
{% if field.is_hidden %}
{{ field }}
{% else %}
<div id="div_{{ field.auto_id }}" class="form-group{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if 'form-horizontal' in form_class %} row{% endif %}{% if form_group_wrapper_class %} {{ form_group_wrapper_class }}{% endif %}{% if form_show_errors and field.errors %} has-danger{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}">
{% if field.label and form_show_labels %}
<label for="{{ field.id_for_label }}" class="col-form-label {{ label_class }}{% if field.field.required %} requiredField{% endif %}">
{{ field.label|safe }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
</label>
{% endif %}
<div class="{{ field_class }}">
<div class="input-group datepicker" id="dp_{{ field.auto_id }}" data-target-input="nearest">
{% with target='#dp_'|add:field.auto_id %}
{% crispy_field field 'class' 'datetimepicker-input' 'data-target' target 'autocomplete' 'off' %}
{% endwith %}
<div class="input-group-append" data-target="#dp_{{ field.auto_id }}" data-toggle="datetimepicker">
<div class="input-group-text"><i class="far fa-calendar-alt"></i></div>
</div>
</div>
{% include 'bootstrap4/layout/help_text_and_errors.html' %}
</div>
</div>
{% endif %}
{% extends './base.html' %}
{% load crispy_forms_tags %}
{% load i18n %}
{% block main_content %}
<div class="row">
<div class="col-lg-12 col-xl-10">
<form action="" method="POST" novalidate>
{% crispy form %}
<button type="submit" class="btn btn-primary">{{ submit_label }}</button>
<a href="javascript:history.back()" class="btn btn-danger">{% trans 'Cancel' %}</a>
</form>
</div>
</div>
{% endblock %}
{% extends './base.html' %}
{% load i18n %}
{% block main_content %}
<div class="row mb-5">
<div class="col">
<div class="d-inline-flex float-left">
<a href='{{ add_url }}' class='btn btn-primary btn-sm mx-2' id='add-alert-button'>
<span class="fa-layers fa-fw">
<i class="far fa-comment-alt"></i>
<i class="fas fa-plus" data-fa-transform="shrink-7 up-1"></i>
</span>
<span class="pl-1">{% trans 'Add' %}</span>
</a>
</div>
{% include 'portal/widgets/ajax_datatable.html' with table=dt_struct %}
</div>
</div>
{% endblock %}
{% block inline_js %}
<script>
$(function() {
$("#{{ dt_struct.id }}").DataTable({
ajax: {
url: '{{ api_url }}',
dataSrc: 'data'
},
order: [ [0,"desc"] ]
});
$("#add-alert-button").appendTo("#{{ dt_struct.id }}_wrapper .row:first div:first");
});
</script>
{% endblock %}
......@@ -15,7 +15,7 @@
{% for alert in alert_list %}
<li class="list-group-item">
<span class="float-left mr-2"><i class="far fa-comment"></i></span>
{{ alert.localized_message|safe }}
{{ alert.localized|safe }}<br>
<small>
{% trans 'posted on' %} {{ alert.start }}
<span class="text-muted"> ({% trans 'until' %} {{ alert.end }})</span>
......
......@@ -12,7 +12,7 @@
{% for alert in alert_list %}
<li class="list-group-item">
<span class="float-left mr-2"><i class="far fa-comment"></i></span>
{{ alert.localized_message|safe }}
{{ alert.localized|safe }}<br>
<small>{% trans 'posted on' %} {{ alert.start }}
<span class="text-muted"> ({% trans 'until' %} {{ alert.end }})</span></small>
</li>
......
......@@ -5,7 +5,8 @@ from django.urls import path
from .views.public import IndexView
from .views.secure.alert import (AlertCreateView, AlertJSONListView,
AlertListView, AlertUpdateView)
AlertListView, AlertUpdateView,
AlertDeleteView)
from .views.secure.dashboard import AdminDashboardView, DashboardView
from .views.secure.datafile import (DataFileAnnotateView, DataFileDeleteView,
DataFileAnnotationJSONView,
......@@ -137,6 +138,7 @@ urlpatterns = [
# Alerts
path('secure/admin/comm/alert/', AlertListView.as_view(), name='admin.alert'),
path('secure/admin/comm/alert/create/', AlertCreateView.as_view(), name='admin.alert-create'),
path('secure/admin/comm/alert/delete/<int:pk>', AlertDeleteView.as_view(), name='admin.alert-delete'),
path('secure/admin/comm/alert/update/<int:pk>', AlertUpdateView.as_view(), name='admin.alert-update'),
path('secure/admin/comm/alert/list/json/', AlertJSONListView.as_view(), name='admin.alert-json-list'),
......
......@@ -4,12 +4,12 @@ from django.template.loader import render_to_string
from django.urls import reverse_lazy
from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _
from django.views.generic import CreateView, TemplateView, UpdateView
from django.views.generic import CreateView, TemplateView, UpdateView, DeleteView
from ...forms import AlertForm
from ...models import Alert
from ...views import (ActivePageViewMixin, CreateViewMixin, JSONListView,
StaffViewMixin, UpdateViewMixin)
StaffViewMixin, UpdateViewMixin, DeleteViewMixin)
class AlertListView(StaffViewMixin, ActivePageViewMixin, TemplateView):
......@@ -46,11 +46,12 @@ class AlertJSONListView(JSONListView):
row = [
o.start,
o.end,
o.localized_message,
o.localized,
render_to_string(
'portal/widgets/action_buttons.html',
{'buttons': [
(reverse_lazy('admin.alert-update', args=[o.id]), 'fas fa-pencil-alt', ugettext('Edit'))
(reverse_lazy('admin.alert-update', args=[o.id]), 'fas fa-pencil-alt', ugettext('Edit')),
(reverse_lazy('admin.alert-delete', args=[o.id]), 'fas fa-trash-alt', ugettext('Delete'), 'danger')
]}
)
]
......@@ -69,7 +70,7 @@ class AlertCreateView(StaffViewMixin, CreateViewMixin, CreateView):
@transaction.atomic
def form_valid(self, form):
messages.success(self.request, _('Message posted'))
self.success_message = _('Message posted')
return super().form_valid(form)
......@@ -82,5 +83,12 @@ class AlertUpdateView(StaffViewMixin, UpdateViewMixin, UpdateView):
@transaction.atomic
def form_valid(self, form):
messages.success(self.request, _('Message updated'))
self.success_message = _('Message updated')
return super().form_valid(form)
class AlertDeleteView(StaffViewMixin, DeleteViewMixin, DeleteView):
model = Alert
success_url = reverse_lazy('admin.alert')
page_title = _('Delete global message')
template_name = 'portal/secure/admin/delete.html'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment