Skip to content
Snippets Groups Projects
Commit a450446a authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Merge branch '132-possibility-to-modify-contact-attempt-comments' into 'master'

Resolve "Possibility to modify contact attempt comments"

Closes #132

See merge request !63
parents a698930e 5b76670b
No related branches found
No related tags found
1 merge request!63Resolve "Possibility to modify contact attempt comments"
Pipeline #
...@@ -361,6 +361,26 @@ class ContactAttemptForm(ModelForm): ...@@ -361,6 +361,26 @@ class ContactAttemptForm(ModelForm):
self.fields['worker'].initial = self.user self.fields['worker'].initial = self.user
class ContactAttemptEditForm(ModelForm):
datetime_when = forms.DateTimeField(label='When? (YYYY-MM-DD HH:MM)',
widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS)
)
class Meta:
model = ContactAttempt
fields = '__all__'
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
if user is None:
raise TypeError("User not defined")
self.user = Worker.get_by_user(user)
if self.user is None:
raise TypeError("Worker not defined for: " + user.username)
super(ContactAttemptEditForm, self).__init__(*args, **kwargs)
self.fields['subject'].disabled = True
class KitRequestForm(Form): class KitRequestForm(Form):
start_date = forms.DateField(label="From date", start_date = forms.DateField(label="From date",
widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"), widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-09-11 13:04
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('web', '0047_subject_flying_team_from_annotation'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='flying_team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.FlyingTeam', verbose_name=b'Default flying team location (if applicable)'),
),
]
{% extends "_base.html" %}
{% load static %}
{% load filters %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'AdminLTE/plugins/awesomplete/awesomplete.css' %}"/>
{% include "includes/datepicker.css.html" %}
{% endblock styles %}
{% block ui_active_tab %}'subjects'{% endblock ui_active_tab %}
{% block page_header %}Edit contact attempt{% endblock page_header %}
{% block page_description %}{% endblock page_description %}
{% block title %}{{ block.super }} - Edit contact attempt{% endblock %}
{% block breadcrumb %}
{% include "subjects/breadcrumb.html" %}
{% endblock breadcrumb %}
{% block maincontent %}
{% block content %}
<div class="row">
<div class="col-md-12">
<div class="box box-success">
<div class="box-header with-border">
<h3 class="box-title">Enter contact attempt details</h3>
</div>
<form method="post" action="" class="form-horizontal">
{% csrf_token %}
<div class="box-body">
{% for field in form %}
<div class="form-group {% if field.errors %}has-error{% endif %}">
<label class="col-sm-4 col-lg-offset-1 col-lg-2 control-label">
{{ field.label }}
</label>
<div class="col-sm-8 col-lg-4">
{{ field|add_class:'form-control' }}
</div>
{% if field.errors %}
<span class="help-block">
{{ field.errors }}
</span>
{% endif %}
</div>
{% endfor %}
</div><!-- /.box-body -->
<div class="box-footer">
<div class="col-sm-6">
<button type="submit" class="btn btn-block btn-success">Save</button>
</div>
<div class="col-sm-6">
<a href="{% url 'web.views.subject_edit' subject_id %}"
class="btn btn-block btn-default">Cancel</a>
</div>
</div><!-- /.box-footer -->
</form>
</div>
</div>
</div>
{% endblock %}
{% endblock maincontent %}
{% block scripts %}
{{ block.super }}
<script src="{% static 'AdminLTE/plugins/awesomplete/awesomplete.min.js' %}"></script>
{% include "includes/datetimepicker.js.html" %}
{% endblock scripts %}
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
<h3>Contact attempts <a title="add a new contact attempt" <h3>Contact attempts <a title="add a new contact attempt"
id="add-contact-attempt" id="add-contact-attempt"
href=" href="
{% url 'web.views.contact_add' subject.id %}{% if appointment_id %}?from_appointment={{ appointment_id }}{% endif %}" {% url 'web.views.contact_add' subject.id %}{% if appointment_id %}?from_appointment={{ appointment_id }}{% endif %}"
class="text-primary" class="text-primary"
><i class="fa fa-plus-circle text-success"></i></a></h3> ><i class="fa fa-plus-circle text-success"></i></a></h3>
...@@ -19,6 +21,7 @@ ...@@ -19,6 +21,7 @@
<th class="text-center">Type</th> <th class="text-center">Type</th>
<th class="text-center">Success</th> <th class="text-center">Success</th>
<th class="text-center">Comment</th> <th class="text-center">Comment</th>
<th class="text-center">Edit</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
...@@ -31,6 +34,11 @@ ...@@ -31,6 +34,11 @@
<i class="fa {% if contact_attempt.success %}fa-check text-success{% else %}fa-times text-danger{% endif %}"></i> <i class="fa {% if contact_attempt.success %}fa-check text-success{% else %}fa-times text-danger{% endif %}"></i>
</td> </td>
<td>{{ contact_attempt.comment }}</td> <td>{{ contact_attempt.comment }}</td>
<td><a title="edit contact attempt"
href="{% url 'web.views.contact_edit' subject.id contact_attempt.id %}{% if appointment_id %}?from_appointment={{ appointment_id }}{% endif %}"
type="button"
class="btn btn-block btn-default"
>EDIT</a></td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
......
...@@ -4,8 +4,9 @@ import os ...@@ -4,8 +4,9 @@ import os
from django.contrib.auth.models import User from django.contrib.auth.models import User
from web.models import Location, AppointmentType, Subject, Worker, Visit, Appointment, ConfigurationItem, Language, \ from web.models import Location, AppointmentType, Subject, Worker, Visit, Appointment, ConfigurationItem, Language, \
FlyingTeam ContactAttempt, FlyingTeam
from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE
from web.views.notifications import get_today_midnight_date from web.views.notifications import get_today_midnight_date
...@@ -36,6 +37,21 @@ def create_appointment_type(): ...@@ -36,6 +37,21 @@ def create_appointment_type():
) )
def create_contact_attempt(subject=None, worker=None):
if subject is None:
subject = create_subject()
if worker is None:
worker = create_worker()
return ContactAttempt.objects.create(subject=subject,
worker=worker,
type=CONTACT_TYPES_PHONE,
datetime_when=get_today_midnight_date(),
success=True,
comment="Successful contact attempt",
)
def create_subject(subject_id=1): def create_subject(subject_id=1):
return Subject.objects.create( return Subject.objects.create(
first_name="Piotr", first_name="Piotr",
...@@ -118,3 +134,10 @@ def create_language(name="French", locale="fr_FR"): ...@@ -118,3 +134,10 @@ def create_language(name="French", locale="fr_FR"):
def get_resource_path(filename): def get_resource_path(filename):
return os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', filename) return os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', filename)
def format_form_field(value):
if isinstance(value, datetime.datetime):
return value.strftime('%Y-%m-%d %H:%M')
else:
return value
...@@ -2,7 +2,8 @@ import datetime ...@@ -2,7 +2,8 @@ import datetime
from django.urls import reverse from django.urls import reverse
from functions import create_subject, create_visit, create_appointment, create_worker, create_flying_team from functions import create_subject, create_visit, create_appointment, create_worker, create_flying_team, \
format_form_field
from web.forms import AppointmentEditForm, SubjectEditForm from web.forms import AppointmentEditForm, SubjectEditForm
from web.models import Appointment, Subject from web.models import Appointment, Subject
from web.views.notifications import get_today_midnight_date from web.views.notifications import get_today_midnight_date
...@@ -91,15 +92,11 @@ class AppointmentsViewTests(LoggedInTestCase): ...@@ -91,15 +92,11 @@ class AppointmentsViewTests(LoggedInTestCase):
form_subject = SubjectEditForm(instance=subject, prefix="subject") form_subject = SubjectEditForm(instance=subject, prefix="subject")
form_data = {} form_data = {}
for key, value in form_appointment.initial.items(): for key, value in form_appointment.initial.items():
if isinstance(value, datetime.datetime): if value is not None:
form_data['appointment-{}'.format(key)] = value.strftime('%Y-%m-%d %H:%M') form_data['appointment-{}'.format(key)] = format_form_field(value)
elif value is not None:
form_data['appointment-{}'.format(key)] = value
for key, value in form_subject.initial.items(): for key, value in form_subject.initial.items():
if isinstance(value, datetime.datetime): if value is not None:
form_data['subject-{}'.format(key)] = value.strftime('%Y-%m-%d %H:%M') form_data['subject-{}'.format(key)] = format_form_field(value)
elif value is not None:
form_data['subject-{}'.format(key)] = value
return form_data return form_data
def test_subject_flying_team_location(self): def test_subject_flying_team_location(self):
......
...@@ -3,7 +3,8 @@ import datetime ...@@ -3,7 +3,8 @@ import datetime
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from functions import create_subject from web.forms import ContactAttemptEditForm
from functions import create_subject, create_contact_attempt, format_form_field
from web.models import ContactAttempt from web.models import ContactAttempt
from web.models.constants import CONTACT_TYPES_EMAIL from web.models.constants import CONTACT_TYPES_EMAIL
from . import LoggedInWithWorkerTestCase from . import LoggedInWithWorkerTestCase
...@@ -51,3 +52,21 @@ class ContactAttemptViewTests(LoggedInWithWorkerTestCase): ...@@ -51,3 +52,21 @@ class ContactAttemptViewTests(LoggedInWithWorkerTestCase):
reverse('web.views.contact_add', kwargs={'subject_id': subject.id}), data=form_data) reverse('web.views.contact_add', kwargs={'subject_id': subject.id}), data=form_data)
self.assertContains(response, "This field is required", 2) self.assertContains(response, "This field is required", 2)
self.assertEqual(0, ContactAttempt.objects.filter(subject=subject).count()) self.assertEqual(0, ContactAttempt.objects.filter(subject=subject).count())
def test_contact_attempt_edit_post(self):
contact_attempt = create_contact_attempt()
form_subject = ContactAttemptEditForm(instance=contact_attempt, user=self.user)
form_data = {}
for key, value in form_subject.initial.items():
if value is not None:
form_data[key] = format_form_field(value)
response = self.client.post(
reverse('web.views.contact_edit',
kwargs={'subject_id': contact_attempt.subject.id, 'contact_attempt_id': contact_attempt.id}),
data=form_data)
print response.content
self.assertEqual(response.status_code, 302)
...@@ -82,6 +82,8 @@ urlpatterns = [ ...@@ -82,6 +82,8 @@ urlpatterns = [
url(r'^subjects/(?P<subject_id>\d+)/contacts/add$', views.contact_attempt.contact_add, url(r'^subjects/(?P<subject_id>\d+)/contacts/add$', views.contact_attempt.contact_add,
name='web.views.contact_add'), name='web.views.contact_add'),
url(r'^subjects/(?P<subject_id>\d+)/contacts/(?P<contact_attempt_id>\d+)/edit', views.contact_attempt.contact_edit,
name='web.views.contact_edit'),
#################### ####################
# DOCTORS # # DOCTORS #
......
from django.shortcuts import redirect, get_object_or_404 from django.shortcuts import redirect, get_object_or_404
from . import wrap_response from . import wrap_response
from ..forms import ContactAttemptForm from ..forms import ContactAttemptForm, ContactAttemptEditForm
from ..models import Subject from ..models import Subject, ContactAttempt
def contact_add(request, subject_id): def contact_add(request, subject_id):
...@@ -13,7 +13,7 @@ def contact_add(request, subject_id): ...@@ -13,7 +13,7 @@ def contact_add(request, subject_id):
if form.is_valid(): if form.is_valid():
form.save() form.save()
if 'from_appointment' in request.GET: if 'from_appointment' in request.GET:
return redirect('web.views.appointment_edit', id=request.GET.get('from_appointment','')) return redirect('web.views.appointment_edit', id=request.GET.get('from_appointment', ''))
else: else:
return redirect('web.views.subject_edit', id=subject_id) return redirect('web.views.subject_edit', id=subject_id)
else: else:
...@@ -21,3 +21,19 @@ def contact_add(request, subject_id): ...@@ -21,3 +21,19 @@ def contact_add(request, subject_id):
return wrap_response(request, 'contact_attempt/add.html', return wrap_response(request, 'contact_attempt/add.html',
{'form': form, 'subject_id': subject_id}) {'form': form, 'subject_id': subject_id})
def contact_edit(request, subject_id, contact_attempt_id):
contact_attempt = get_object_or_404(ContactAttempt, id=contact_attempt_id)
if request.method == 'POST':
form = ContactAttemptEditForm(request.POST, instance=contact_attempt, user=request.user, )
if form.is_valid():
form.save()
if 'from_appointment' in request.GET:
return redirect('web.views.appointment_edit', id=request.GET.get('from_appointment', ''))
else:
return redirect('web.views.subject_edit', id=contact_attempt.subject.id)
else:
form = ContactAttemptEditForm(instance=contact_attempt, user=request.user)
return wrap_response(request, 'contact_attempt/edit.html', {'form': form, 'subject_id': subject_id})
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