Skip to content
Snippets Groups Projects
Commit 74bad9f3 authored by Valentin Groues's avatar Valentin Groues :eyes:
Browse files

use checkbox for dead and resigned statuses - #68

parent ef4af73e
No related branches found
No related tags found
1 merge request!26use checkboxes for dead and resigned statuses - #68
Pipeline #
...@@ -49,6 +49,7 @@ class SubjectAddForm(ModelForm): ...@@ -49,6 +49,7 @@ class SubjectAddForm(ModelForm):
class Meta: class Meta:
model = Subject model = Subject
fields = '__all__' fields = '__all__'
exclude = ['dead', 'resigned']
def clean(self): def clean(self):
subject = self.cleaned_data subject = self.cleaned_data
...@@ -78,10 +79,20 @@ class SubjectEditForm(ModelForm): ...@@ -78,10 +79,20 @@ class SubjectEditForm(ModelForm):
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
was_dead = kwargs.get('was_dead', False)
was_resigned = kwargs.get('was_resigned', False)
if 'was_resigned' in kwargs:
kwargs.pop('was_resigned')
if 'was_dead' in kwargs:
kwargs.pop('was_dead')
super(SubjectEditForm, self).__init__(*args, **kwargs) super(SubjectEditForm, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None) instance = getattr(self, 'instance', None)
if instance and instance.id: if instance and instance.id:
self.fields['screening_number'].widget.attrs['readonly'] = True self.fields['screening_number'].widget.attrs['readonly'] = True
if was_dead:
self.fields['dead'].disabled = True
if was_resigned:
self.fields['resigned'].disabled = True
def clean_screening_number(self): def clean_screening_number(self):
instance = getattr(self, 'instance', None) instance = getattr(self, 'instance', None)
......
...@@ -25,15 +25,11 @@ class Subject(models.Model): ...@@ -25,15 +25,11 @@ class Subject(models.Model):
def mark_as_dead(self): def mark_as_dead(self):
self.dead = True self.dead = True
self.save()
self.finish_all_visits() self.finish_all_visits()
self.finish_all_appointments() self.finish_all_appointments()
def mark_as_rejected(self): def mark_as_resigned(self):
self.resigned = True self.resigned = True
self.save()
self.finish_all_visits() self.finish_all_visits()
self.finish_all_appointments() self.finish_all_appointments()
...@@ -55,16 +51,6 @@ class Subject(models.Model): ...@@ -55,16 +51,6 @@ class Subject(models.Model):
verbose_name='Type' verbose_name='Type'
) )
dead = models.BooleanField(
verbose_name='Dead',
default=False,
editable=False
)
resigned = models.BooleanField(
verbose_name='Resigned',
default=False,
editable=False
)
default_location = models.ForeignKey(Location, default_location = models.ForeignKey(Location,
verbose_name='Default appointment location', verbose_name='Default appointment location',
) )
...@@ -160,6 +146,17 @@ class Subject(models.Model): ...@@ -160,6 +146,17 @@ class Subject(models.Model):
verbose_name='Year of diagnosis (YYYY)' verbose_name='Year of diagnosis (YYYY)'
) )
dead = models.BooleanField(
verbose_name='Deceased',
default=False,
editable=True
)
resigned = models.BooleanField(
verbose_name='Resigned',
default=False,
editable=True
)
def latest_visit(self): def latest_visit(self):
visits = self.visit_set.all() visits = self.visit_set.all()
if len(visits) == 0: if len(visits) == 0:
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
height: 20px; height: 20px;
} }
.multi-checkboxes .form-control:not(select) { .checkbox {
-moz-appearance: initial; margin-top: 10px !important;
-webkit-appearance: initial;
appearance: initial;
} }
\ No newline at end of file
...@@ -58,24 +58,6 @@ ...@@ -58,24 +58,6 @@
</div> </div>
{% endfor %} {% endfor %}
<div class="col-md-6">
{% if not subject.resigned %}
<a href="{% url 'web.views.subject_mark' subject.id 'rejected' %}"
class="btn btn-warning btn-block">Mark as rejected</a>
{% else %}
<label for="{# TODO #}" class="col-sm-4 control-label">REJECTED</label>
<div class="col-sm-8">{{ subject.resigned }}</div>
{% endif %}
</div>
<div class="col-md-6">
{% if not subject.dead %}
<a href="{% url 'web.views.subject_mark' subject.id 'dead' %}"
class="btn btn-danger btn-block">Mark as dead</a><br/>
{% else %}
<label for="{# TODO #}" class="col-sm-4 control-label">DEAD</label>
<div class="col-sm-8">{{ subject.dead }}</div>
{% endif %}
</div>
</div> </div>
</div><!-- /.box-body --> </div><!-- /.box-body -->
...@@ -92,6 +74,25 @@ ...@@ -92,6 +74,25 @@
</form> </form>
</div> </div>
<div class="modal modal-danger fade" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Are you sure that you want to perfom this operation?</h4>
</div>
<div class="modal-body">
<p>Marking a subject resigned or deceased cannot be undone.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline pull-left" data-dismiss="modal">Cancel</button>
<button type="button" id="confirm-save" class="btn btn-outline">Save changes</button>
</div>
</div><!-- /.modal-content -->
</div><!-- /.modal-dialog -->
</div><!-- /.modal -->
{% endblock %} {% endblock %}
...@@ -103,7 +104,8 @@ ...@@ -103,7 +104,8 @@
<script src="{% static 'AdminLTE/plugins/datatables/jquery.dataTables.min.js' %}"></script> <script src="{% static 'AdminLTE/plugins/datatables/jquery.dataTables.min.js' %}"></script>
<script src="{% static 'AdminLTE/plugins/datatables/dataTables.bootstrap.min.js' %}"></script> <script src="{% static 'AdminLTE/plugins/datatables/dataTables.bootstrap.min.js' %}"></script>
<script> <script>
$(function () { var confirmed = false;
$(document).ready(function () {
$('#table').DataTable({ $('#table').DataTable({
"paging": true, "paging": true,
"lengthChange": false, "lengthChange": false,
...@@ -112,6 +114,22 @@ ...@@ -112,6 +114,22 @@
"info": true, "info": true,
"autoWidth": false "autoWidth": false
}); });
var dead_was_checked = $("#id_dead").is(":checked");
var resigned_was_checked = $("#id_resigned").is(":checked");
$("form").submit(function () {
if (confirmed) {
return true;
}
if ((!dead_was_checked && $("#id_dead").is(":checked")) || (!resigned_was_checked && $("#id_resigned").is(":checked"))) {
confirmed = false;
$(".modal").modal("show");
return false;
}
});
$("#confirm-save").click(function () {
confirmed = true;
$("form").submit();
});
}); });
</script> </script>
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<th>First name</th> <th>First name</th>
<th>Last name</th> <th>Last name</th>
<th class="filter-select filter-exact" data-placeholder="Select location">Default location</th> <th class="filter-select filter-exact" data-placeholder="Select location">Default location</th>
<th>Dead</th> <th>Deceased</th>
<th>Resigned</th> <th>Resigned</th>
<th>Postponed</th> <th>Postponed</th>
<th>Edit</th> <th>Edit</th>
......
# See: http://stackoverflow.com/a/18962481 # See: http://stackoverflow.com/a/18962481
from django import template from django import template
from django.forms import CheckboxSelectMultiple from django.forms import CheckboxSelectMultiple, CheckboxInput
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
register = template.Library() register = template.Library()
...@@ -11,6 +11,8 @@ def add_class(value, arg): ...@@ -11,6 +11,8 @@ def add_class(value, arg):
# Get all the field's initial css-classes # Get all the field's initial css-classes
if isinstance(value.field.widget, CheckboxSelectMultiple): if isinstance(value.field.widget, CheckboxSelectMultiple):
return value return value
if isinstance(value.field.widget, CheckboxInput):
arg = 'checkbox'
css_classes = value.field.widget.attrs.get('class', ' ').split(' ') css_classes = value.field.widget.attrs.get('class', ' ').split(' ')
# Filter out zero-length class names ('') # Filter out zero-length class names ('')
css_classes = filter(lambda x: len(x) > 0, css_classes) css_classes = filter(lambda x: len(x) > 0, css_classes)
...@@ -31,6 +33,7 @@ def disable(value): ...@@ -31,6 +33,7 @@ def disable(value):
def is_checkbox(value): def is_checkbox(value):
return isinstance(value.field.widget, CheckboxSelectMultiple) return isinstance(value.field.widget, CheckboxSelectMultiple)
@register.filter(name="render_appointments") @register.filter(name="render_appointments")
def render_appointments(statistics, appointment_type): def render_appointments(statistics, appointment_type):
html = "" html = ""
......
...@@ -20,12 +20,12 @@ class SubjectModelTests(TestCase): ...@@ -20,12 +20,12 @@ class SubjectModelTests(TestCase):
self.assertTrue(visit_finished) self.assertTrue(visit_finished)
self.assertEquals(Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status) self.assertEquals(Appointment.APPOINTMENT_STATUS_CANCELLED, appointment_status)
def test_mark_as_rejected(self): def test_mark_as_resigned(self):
subject = create_subject() subject = create_subject()
visit = create_visit(subject) visit = create_visit(subject)
appointment = create_appointment(visit) appointment = create_appointment(visit)
subject.mark_as_rejected() subject.mark_as_resigned()
appointment_status = Appointment.objects.filter(id=appointment.id)[0].status appointment_status = Appointment.objects.filter(id=appointment.id)[0].status
visit_finsihed = Visit.objects.filter(id=visit.id)[0].is_finished visit_finsihed = Visit.objects.filter(id=visit.id)[0].is_finished
......
...@@ -51,7 +51,6 @@ urlpatterns = [ ...@@ -51,7 +51,6 @@ urlpatterns = [
name='web.views.subject_visit_details'), name='web.views.subject_visit_details'),
url(r'^subjects/edit/(?P<id>\d+)$', views.subject.subject_edit, name='web.views.subject_edit'), url(r'^subjects/edit/(?P<id>\d+)$', views.subject.subject_edit, name='web.views.subject_edit'),
url(r'^subjects/delete/(?P<id>\d+)$', views.subject.subject_delete, name='web.views.subject_delete'), url(r'^subjects/delete/(?P<id>\d+)$', views.subject.subject_delete, name='web.views.subject_delete'),
url(r'^subjects/mark/(?P<id>\d+)/(?P<as_what>[A-z]+)$', views.subject.subject_mark, name='web.views.subject_mark'),
url(r'^doctors$', views.doctor.doctors, name='web.views.doctors'), url(r'^doctors$', views.doctor.doctors, name='web.views.doctors'),
url(r'^doctors/add$', views.doctor.doctor_add, name='web.views.doctor_add'), url(r'^doctors/add$', views.doctor.doctor_add, name='web.views.doctor_add'),
......
...@@ -54,13 +54,21 @@ def subject_require_contact(request): ...@@ -54,13 +54,21 @@ def subject_require_contact(request):
def subject_edit(request, id): def subject_edit(request, id):
the_subject = get_object_or_404(Subject, id=id) the_subject = get_object_or_404(Subject, id=id)
was_dead = the_subject.dead
was_resigned = the_subject.resigned
if request.method == 'POST': if request.method == 'POST':
form = SubjectEditForm(request.POST, request.FILES, instance=the_subject) form = SubjectEditForm(request.POST, request.FILES, instance=the_subject, was_dead=was_dead, was_resigned=was_resigned)
if form.is_valid(): if form.is_valid():
form.save() form.save()
# check if subject was marked as dead or resigned
if form.cleaned_data['dead'] and not was_dead:
the_subject.mark_as_dead()
if form.cleaned_data['resigned'] and not was_resigned:
the_subject.mark_as_resigned()
return redirect('web.views.subjects') return redirect('web.views.subjects')
else: else:
form = SubjectEditForm(instance=the_subject) form = SubjectEditForm(instance=the_subject, was_dead=was_dead, was_resigned=was_resigned)
return wrap_response(request, 'subjects/edit.html', { return wrap_response(request, 'subjects/edit.html', {
'form': form, 'form': form,
'subject': the_subject 'subject': the_subject
...@@ -77,15 +85,6 @@ def subject_delete(request, id): ...@@ -77,15 +85,6 @@ def subject_delete(request, id):
return wrap_response(request, 'subjects/delete.html', {'form': form}) return wrap_response(request, 'subjects/delete.html', {'form': form})
def subject_mark(request, id, as_what):
who = get_object_or_404(Subject, id=id)
if as_what == 'dead':
who.mark_as_dead()
elif as_what == 'rejected':
who.mark_as_rejected()
return redirect('web.views.subject_edit', id=id)
def subject_visit_details(request, id): def subject_visit_details(request, id):
locsubject = get_object_or_404(Subject, id=id) locsubject = get_object_or_404(Subject, id=id)
visits = locsubject.visit_set.all() visits = locsubject.visit_set.all()
......
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