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

Merge branch '211-voucher-data' into 'master'

voucher model modified

Closes #211

See merge request NCER-PD/scheduling-system!135
parents 6663e24f 7949ed91
No related branches found
No related tags found
1 merge request!135voucher model modified
Pipeline #
Showing
with 405 additions and 57 deletions
...@@ -8,7 +8,7 @@ from django.utils import timezone ...@@ -8,7 +8,7 @@ from django.utils import timezone
from web.algorithm import VerhoeffAlgorithm from web.algorithm import VerhoeffAlgorithm
from web.forms.forms import DATEPICKER_DATE_ATTRS from web.forms.forms import DATEPICKER_DATE_ATTRS
from web.models import VoucherType, VoucherTypePrice, Voucher, Worker from web.models import VoucherType, VoucherTypePrice, Voucher, Worker
from web.models.constants import VOUCHER_STATUS_NEW, VOUCHER_STATUS_USED from web.models.constants import VOUCHER_STATUS_USED, VOUCHER_STATUS_EXPIRED
from web.models.worker_study_role import WORKER_VOUCHER_PARTNER from web.models.worker_study_role import WORKER_VOUCHER_PARTNER
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -52,35 +52,29 @@ class VoucherForm(ModelForm): ...@@ -52,35 +52,29 @@ class VoucherForm(ModelForm):
self.fields['issue_date'].required = False self.fields['issue_date'].required = False
self.fields['expiry_date'].widget.attrs['readonly'] = True self.fields['expiry_date'].widget.attrs['readonly'] = True
self.fields['expiry_date'].required = False self.fields['expiry_date'].required = False
self.fields['use_date'].widget.attrs['readonly'] = True
instance = getattr(self, 'instance', None) instance = getattr(self, 'instance', None)
if instance and instance.pk: if instance and instance.pk:
self.fields['voucher_type'].widget.attrs['readonly'] = True self.fields['voucher_type'].widget.attrs['readonly'] = True
self.fields['usage_partner'].queryset = Worker.get_workers_by_worker_type(WORKER_VOUCHER_PARTNER).filter( self.fields['hours'].widget.attrs['readonly'] = True
voucher_types = instance.voucher_type) self.fields['usage_partner'].widget.attrs['readonly'] = True
if instance.status != VOUCHER_STATUS_NEW: if instance.status in [VOUCHER_STATUS_USED, VOUCHER_STATUS_EXPIRED]:
self.fields['status'].widget.attrs['readonly'] = True self.fields['status'].widget.attrs['readonly'] = True
self.fields['feedback'].widget.attrs['readonly'] = True self.fields['feedback'].widget.attrs['readonly'] = True
self.fields['usage_partner'].widget.attrs['readonly'] = True
def clean(self):
if self.cleaned_data["status"] == VOUCHER_STATUS_USED and not self.cleaned_data["usage_partner"]:
self.add_error('usage_partner', "Partner must be defined for used voucher")
if self.cleaned_data["status"] != VOUCHER_STATUS_USED and self.cleaned_data["usage_partner"]:
self.add_error('status', "Status must be used for voucher with defined partner")
def save(self, commit=True): def save(self, commit=True):
instance = super(VoucherForm, self).save(commit=False) instance = super(VoucherForm, self).save(commit=False)
if not instance.id: if not instance.id:
instance.issue_date = timezone.now() instance.issue_date = timezone.now()
instance.expiry_date = instance.issue_date + datetime.timedelta(days=92) instance.expiry_date = instance.issue_date + datetime.timedelta(days=92)
max_id = str(0).zfill(5) max_id = str(1).zfill(5)
if Voucher.objects.all().count() > 0: if Voucher.objects.all().count() > 0:
max_id = str(Voucher.objects.latest('id').id).zfill(5) max_id = str(Voucher.objects.latest('id').id + 1).zfill(5)
instance.number = max_id + VerhoeffAlgorithm.calculate_verhoeff_check_sum(max_id) # number in format {ND_NUMBER}-{DATE}-{VOUCHER_TYPE_CODE}-{VOUCHER_TYPE}-{SEQ_NUMBER}{CHECKSUM}
if instance.status == VOUCHER_STATUS_USED and not instance.use_date: instance.number = instance.study_subject.nd_number + "-" + \
instance.use_date = timezone.now() datetime.datetime.now().strftime("%Y%m%d") + "-" + \
instance.voucher_type.code + "-" + \
instance.usage_partner.voucher_partner_code + "-" + \
max_id + VerhoeffAlgorithm.calculate_verhoeff_check_sum(max_id)
if commit: if commit:
instance.save() instance.save()
import datetime
import logging
from django import forms
from django.forms import ModelForm
from web.forms.forms import DATETIMEPICKER_DATE_ATTRS
from web.models.voucher_partner_session import VoucherPartnerSession
logger = logging.getLogger(__name__)
class VoucherPartnerSessionForm(ModelForm):
date = forms.DateTimeField(widget=forms.DateTimeInput(DATETIMEPICKER_DATE_ATTRS),
initial=datetime.datetime.now().replace(hour=8, minute=0, second=0))
class Meta:
model = VoucherPartnerSession
exclude = ['voucher']
...@@ -9,7 +9,7 @@ from django_common.auth_backends import User ...@@ -9,7 +9,7 @@ from django_common.auth_backends import User
from web.models import Worker, WorkerStudyRole from web.models import Worker, WorkerStudyRole
from web.models.constants import GLOBAL_STUDY_ID from web.models.constants import GLOBAL_STUDY_ID
from web.models.worker import role_choices_by_worker_type, worker_type_by_worker from web.models.worker import role_choices_by_worker_type, worker_type_by_worker
from web.models.worker_study_role import WORKER_STAFF from web.models.worker_study_role import WORKER_STAFF, WORKER_VOUCHER_PARTNER
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -43,6 +43,9 @@ class WorkerForm(ModelForm): ...@@ -43,6 +43,9 @@ class WorkerForm(ModelForm):
else: else:
del self.fields['locations'] del self.fields['locations']
if worker_type != WORKER_VOUCHER_PARTNER:
del self.fields['voucher_partner_code']
fields = OrderedDict() fields = OrderedDict()
if worker_type == WORKER_STAFF: if worker_type == WORKER_STAFF:
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-06-01 07:54
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('web', '0109_missing_appointment_list_update'),
]
operations = [
migrations.AddField(
model_name='worker',
name='voucher_partner_code',
field=models.CharField(blank=True, max_length=10, verbose_name=b'Code'),
),
migrations.AlterField(
model_name='studysubjectlist',
name='type',
field=models.CharField(blank=True, choices=[(b'GENERIC', b'Generic subject list'), (b'NO_VISIT', b'Subjects without visit'), (b'REQUIRE_CONTACT', b'Subjects required contact'), (b'VOUCHER_EXPIRY', b'Subject with vouchers to be expired soon')], max_length=50, null=True, verbose_name=b'Type of list'),
),
migrations.AlterField(
model_name='studyvisitlist',
name='type',
field=models.CharField(choices=[(b'UNFINISHED', b'unfinished visits'), (b'APPROACHING_WITHOUT_APPOINTMENTS', b'approaching visits'), (b'APPROACHING_FOR_MAIL_CONTACT', b'post mail for approaching visits'), (b'GENERIC', b'Generic visit list'), (b'MISSING_APPOINTMENTS', b'visits with missing appointments'), (b'EXCEEDED_TIME', b'exceeded visit time')], max_length=50, verbose_name=b'Type of list'),
),
migrations.AlterField(
model_name='voucher',
name='number',
field=models.CharField(max_length=50, unique=True, verbose_name=b'Number'),
),
migrations.AlterField(
model_name='voucher',
name='usage_partner',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Worker'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2018-06-01 13:18
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('web', '0110_auto_20180601_0754'),
]
operations = [
migrations.CreateModel(
name='VoucherPartnerSession',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('length', models.IntegerField(verbose_name=b'Length (minutes)')),
('date', models.DateTimeField(verbose_name=b'Issue date')),
],
),
migrations.RemoveField(
model_name='voucher',
name='use_date',
),
migrations.AddField(
model_name='voucher',
name='hours',
field=models.IntegerField(default=0, verbose_name=b'Hours'),
),
migrations.AlterField(
model_name='voucher',
name='status',
field=models.CharField(choices=[(b'NEW', b'New'), (b'IN_USE', b'In use'), (b'USED', b'Used'), (b'EXPIRED', b'Expired')], default=b'NEW', max_length=20, verbose_name=b'Status'),
),
migrations.AddField(
model_name='voucherpartnersession',
name='voucher',
field=models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='voucher_partner_sessions', to='web.Voucher'),
),
]
...@@ -85,10 +85,12 @@ COUNTRY_AFGHANISTAN_ID = 2 ...@@ -85,10 +85,12 @@ COUNTRY_AFGHANISTAN_ID = 2
GLOBAL_STUDY_ID = 1 GLOBAL_STUDY_ID = 1
VOUCHER_STATUS_NEW = "NEW" VOUCHER_STATUS_NEW = "NEW"
VOUCHER_STATUS_IN_USE = "IN_USE"
VOUCHER_STATUS_USED = "USED" VOUCHER_STATUS_USED = "USED"
VOUCHER_STATUS_EXPIRED = "EXPIRED" VOUCHER_STATUS_EXPIRED = "EXPIRED"
VOUCHER_STATUS_CHOICES = ( VOUCHER_STATUS_CHOICES = (
(VOUCHER_STATUS_NEW, 'New'), (VOUCHER_STATUS_NEW, 'New'),
(VOUCHER_STATUS_IN_USE, 'In use'),
(VOUCHER_STATUS_USED, 'Used'), (VOUCHER_STATUS_USED, 'Used'),
(VOUCHER_STATUS_EXPIRED, 'Expired'), (VOUCHER_STATUS_EXPIRED, 'Expired'),
) )
......
...@@ -11,7 +11,7 @@ class Voucher(models.Model): ...@@ -11,7 +11,7 @@ class Voucher(models.Model):
app_label = 'web' app_label = 'web'
number = models.CharField( number = models.CharField(
max_length=10, max_length=50,
verbose_name='Number', verbose_name='Number',
blank=False, blank=False,
null=False, null=False,
...@@ -20,7 +20,13 @@ class Voucher(models.Model): ...@@ -20,7 +20,13 @@ class Voucher(models.Model):
issue_date = models.DateField(verbose_name='Issue date', null=False) issue_date = models.DateField(verbose_name='Issue date', null=False)
expiry_date = models.DateField(verbose_name='Expiry date', null=False) expiry_date = models.DateField(verbose_name='Expiry date', null=False)
use_date = models.DateField(verbose_name='Use date', null=True, blank=True)
hours = models.IntegerField(
verbose_name='Hours',
default=0,
null=False
)
voucher_type = models.ForeignKey( voucher_type = models.ForeignKey(
VoucherType, VoucherType,
on_delete=models.CASCADE, on_delete=models.CASCADE,
...@@ -48,8 +54,7 @@ class Voucher(models.Model): ...@@ -48,8 +54,7 @@ class Voucher(models.Model):
usage_partner = models.ForeignKey( usage_partner = models.ForeignKey(
Worker, Worker,
on_delete=models.CASCADE, on_delete=models.CASCADE,
null=True, null=False
blank=True
) )
def __str__(self): def __str__(self):
......
# coding=utf-8
from django.db import models
from web.models import Voucher
class VoucherPartnerSession(models.Model):
class Meta:
app_label = 'web'
length = models.IntegerField(
verbose_name='Length (minutes)',
null=False
)
date = models.DateTimeField(verbose_name='Issue date', null=False)
voucher = models.ForeignKey(
Voucher,
on_delete=models.CASCADE,
null=False,
related_name="voucher_partner_sessions",
editable=False
)
...@@ -126,6 +126,11 @@ class Worker(models.Model): ...@@ -126,6 +126,11 @@ class Worker(models.Model):
blank=True blank=True
) )
voucher_partner_code = models.CharField(max_length=10,
verbose_name='Code',
blank=True
)
def is_on_leave(self): def is_on_leave(self):
if len(self.holiday_set.filter(datetime_end__gt=datetime.datetime.now(), if len(self.holiday_set.filter(datetime_end__gt=datetime.datetime.now(),
datetime_start__lt=datetime.datetime.now())): datetime_start__lt=datetime.datetime.now())):
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
<th class="text-center">Issue date</th> <th class="text-center">Issue date</th>
<th class="text-center">Expiry date</th> <th class="text-center">Expiry date</th>
<th class="text-center">Status</th> <th class="text-center">Status</th>
<th class="text-center">Use date</th>
<th class="text-center">Partner</th> <th class="text-center">Partner</th>
<th class="text-center">Feedback</th> <th class="text-center">Feedback</th>
<th class="text-center">Edit</th> <th class="text-center">Edit</th>
...@@ -32,7 +31,6 @@ ...@@ -32,7 +31,6 @@
<td>{{ voucher.issue_date }}</td> <td>{{ voucher.issue_date }}</td>
<td>{{ voucher.expiry_date }}</td> <td>{{ voucher.expiry_date }}</td>
<td>{{ voucher.status }}</td> <td>{{ voucher.status }}</td>
<td>{{ voucher.use_date }}</td>
<td>{{ voucher.usage_partner.first_name }} {{ voucher.usage_partner.last_name }}</td> <td>{{ voucher.usage_partner.first_name }} {{ voucher.usage_partner.last_name }}</td>
<td>{{ voucher.feedback }}</td> <td>{{ voucher.feedback }}</td>
<td><a href="{% url 'web.views.voucher_edit' voucher.id %}"><i class="fa fa-edit"></i></a> <td><a href="{% url 'web.views.voucher_edit' voucher.id %}"><i class="fa fa-edit"></i></a>
......
{% extends "voucher_partner_sessions/add_edit.html" %}
{% block page_header %}New voucher partner session{% endblock page_header %}
{% block title %}{{ block.super }} - Add voucher partner session{% endblock %}
{% block form-title %}Enter session details{% endblock %}
{% block save-button %}Add{% endblock %}
{% 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" %}
{% include "includes/datetimepicker.css.html" %}
{% endblock styles %}
{% block ui_active_tab %}'configuration'{% endblock ui_active_tab %}
{% block page_description %}{% endblock page_description %}
{% block breadcrumb %}
{% include "vouchers/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">{% block form-title %}Enter session details{% endblock %}</h3>
</div>
<form method="post" action="" class="form-horizontal" enctype="multipart/form-data">
{% 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' }}
{% if field.errors %}
<span class="help-block">{{ field.errors }}</span>
{% endif %}
</div>
</div>
{% endfor %}
</div><!-- /.box-body -->
<div class="box-footer">
<div class="col-sm-6">
<button type="submit" class="btn btn-block btn-success">{% block save-button %}
Add{% endblock %}
</button>
</div>
<div class="col-sm-6">
<a href="{% url 'web.views.vouchers' %}"
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/datepicker.js.html" %}
{% include "includes/datetimepicker.js.html" %}
{% endblock scripts %}
\ No newline at end of file
...@@ -59,11 +59,43 @@ ...@@ -59,11 +59,43 @@
</div> </div>
</div><!-- /.box-footer --> </div><!-- /.box-footer -->
</form> </form>
</div> {% if voucher.id %}
<h3 class="box-title">List of voucher partner sessions
{% if voucher.status in 'NEW,IN_USE' %}
<a title="add a new voucher partner session"
id="add-voucher-partner-session"
href="{% url 'web.views.voucher_partner_sessions_add' pk=voucher.id %}"
class="text-primary"
><i class="fa fa-plus-circle text-success"></i></a>
{% endif %}
</h3>
<div class="box-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Date</th>
<th>Length (minutes)</th>
</tr>
</thead>
<tbody>
{% for voucher_partner_session in voucher.voucher_partner_sessions.all %}
<tr>
<td>{{ voucher_partner_session.date |date:'Y-m-d H:i' }}</td>
<td>{{ voucher_partner_session.length }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endif %}
</div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
<th>Issue date</th> <th>Issue date</th>
<th>Expiry date</th> <th>Expiry date</th>
<th>Status</th> <th>Status</th>
<th>Use date</th>
<th>Partner</th> <th>Partner</th>
<th>Feedback</th> <th>Feedback</th>
<th>Edit</th> <th>Edit</th>
...@@ -44,7 +43,6 @@ ...@@ -44,7 +43,6 @@
<td>{{ voucher.issue_date }}</td> <td>{{ voucher.issue_date }}</td>
<td>{{ voucher.expiry_date }}</td> <td>{{ voucher.expiry_date }}</td>
<td>{{ voucher.status }}</td> <td>{{ voucher.status }}</td>
<td>{{ voucher.use_date }}</td>
<td>{{ voucher.usage_partner.first_name }} {{ voucher.usage_partner.last_name }}</td> <td>{{ voucher.usage_partner.first_name }} {{ voucher.usage_partner.last_name }}</td>
<td>{{ voucher.feedback }}</td> <td>{{ voucher.feedback }}</td>
<td><a href="{% url 'web.views.voucher_edit' voucher.id %}"><i class="fa fa-edit"></i></a></td> <td><a href="{% url 'web.views.voucher_edit' voucher.id %}"><i class="fa fa-edit"></i></a></td>
......
...@@ -19,7 +19,7 @@ class VoucherFormTests(LoggedInWithWorkerTestCase): ...@@ -19,7 +19,7 @@ class VoucherFormTests(LoggedInWithWorkerTestCase):
self.voucher_partner = create_worker() self.voucher_partner = create_worker()
WorkerStudyRole.objects.filter(worker=self.voucher_partner).update(role=ROLE_CHOICES_VOUCHER_PARTNER) WorkerStudyRole.objects.filter(worker=self.voucher_partner).update(role=ROLE_CHOICES_VOUCHER_PARTNER)
def test_auto_generated_use_date(self): def test_create_voucher(self):
voucher_type = create_voucher_type() voucher_type = create_voucher_type()
study_subject = create_study_subject() study_subject = create_study_subject()
study_subject.voucher_types.add(voucher_type) study_subject.voucher_types.add(voucher_type)
...@@ -29,6 +29,7 @@ class VoucherFormTests(LoggedInWithWorkerTestCase): ...@@ -29,6 +29,7 @@ class VoucherFormTests(LoggedInWithWorkerTestCase):
form_data = { form_data = {
"status": VOUCHER_STATUS_USED, "status": VOUCHER_STATUS_USED,
"usage_partner": str(self.voucher_partner.id), "usage_partner": str(self.voucher_partner.id),
"hours": 10,
"voucher_type": voucher_type.id "voucher_type": voucher_type.id
} }
for key, value in voucher_form.initial.items(): for key, value in voucher_form.initial.items():
...@@ -39,9 +40,8 @@ class VoucherFormTests(LoggedInWithWorkerTestCase): ...@@ -39,9 +40,8 @@ class VoucherFormTests(LoggedInWithWorkerTestCase):
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(2, Voucher.objects.all().count()) self.assertEqual(2, Voucher.objects.all().count())
self.assertEqual(1, Voucher.objects.filter(use_date__isnull=False).count())
def test_valid_usage_partner(self): def test_invalid_usage_partner(self):
study_subject = create_study_subject() study_subject = create_study_subject()
voucher = create_voucher(study_subject) voucher = create_voucher(study_subject)
voucher.status = VOUCHER_STATUS_USED voucher.status = VOUCHER_STATUS_USED
...@@ -62,17 +62,3 @@ class VoucherFormTests(LoggedInWithWorkerTestCase): ...@@ -62,17 +62,3 @@ class VoucherFormTests(LoggedInWithWorkerTestCase):
for key, value in voucher_form.initial.items(): for key, value in voucher_form.initial.items():
form_data[key] = format_form_field(value) form_data[key] = format_form_field(value)
return form_data return form_data
def test_valid_status(self):
study_subject = create_study_subject()
voucher = create_voucher(study_subject)
self.voucher_partner.voucher_types.add(voucher.voucher_type)
voucher.usage_partner = self.voucher_partner
voucher.save()
form_data = self.get_voucher_form_data(voucher)
voucher_form = VoucherForm(instance=voucher, data=form_data)
self.assertFalse(voucher_form.is_valid())
self.assertTrue("status" in voucher_form.errors)
...@@ -10,7 +10,7 @@ from web.models import Location, AppointmentType, StudySubject, Worker, Visit, A ...@@ -10,7 +10,7 @@ from web.models import Location, AppointmentType, StudySubject, Worker, Visit, A
from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, REDCAP_BASE_URL_CONFIGURATION_TYPE, \ from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, REDCAP_BASE_URL_CONFIGURATION_TYPE, \
SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \ SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \
MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID, VOUCHER_STATUS_NEW, GLOBAL_STUDY_ID MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID, VOUCHER_STATUS_NEW, GLOBAL_STUDY_ID
from web.models.worker_study_role import ROLE_CHOICES_DOCTOR from web.models.worker_study_role import ROLE_CHOICES_DOCTOR, WORKER_VOUCHER_PARTNER
from web.redcap_connector import RedcapSubject from web.redcap_connector import RedcapSubject
from web.views.notifications import get_today_midnight_date from web.views.notifications import get_today_midnight_date
...@@ -78,15 +78,18 @@ def get_test_id(): ...@@ -78,15 +78,18 @@ def get_test_id():
return result return result
def create_voucher(study_subject=None): def create_voucher(study_subject=None, partner=None):
if study_subject is None: if study_subject is None:
study_subject = create_study_subject() study_subject = create_study_subject()
if partner is None:
partner = create_voucher_partner()
number = str(get_test_id()) number = str(get_test_id())
return Voucher.objects.create(number=number, return Voucher.objects.create(number=number,
study_subject=study_subject, study_subject=study_subject,
issue_date=get_today_midnight_date(), issue_date=get_today_midnight_date(),
expiry_date=get_today_midnight_date(), expiry_date=get_today_midnight_date(),
voucher_type=create_voucher_type(), voucher_type=create_voucher_type(),
usage_partner=partner,
status=VOUCHER_STATUS_NEW) status=VOUCHER_STATUS_NEW)
...@@ -229,6 +232,19 @@ def create_worker(user=None, with_test_location=False): ...@@ -229,6 +232,19 @@ def create_worker(user=None, with_test_location=False):
return worker return worker
def create_voucher_partner():
worker = Worker.objects.create(
first_name='piotr',
last_name="gawron",
email='jacob@bla.com',
specialization="spec",
unit="LCSB",
phone_number="0123456789"
)
WorkerStudyRole.objects.create(worker=worker, study_id=GLOBAL_STUDY_ID, role=WORKER_VOUCHER_PARTNER)
return worker
def create_availability(worker=None): def create_availability(worker=None):
if worker is None: if worker is None:
worker = create_worker() worker = create_worker()
......
...@@ -3,12 +3,15 @@ import logging ...@@ -3,12 +3,15 @@ import logging
import datetime import datetime
from django.urls import reverse from django.urls import reverse
from web.models import Worker
from web.models.worker_study_role import WORKER_VOUCHER_PARTNER
from web.views.notifications import get_today_midnight_date from web.views.notifications import get_today_midnight_date
from web.views.voucher import ExpireVouchersJob from web.views.voucher import ExpireVouchersJob
from web.forms import VoucherForm from web.forms import VoucherForm
from web.models import Voucher from web.models import Voucher
from web.models.constants import VOUCHER_STATUS_NEW, VOUCHER_STATUS_USED, VOUCHER_STATUS_EXPIRED from web.models.constants import VOUCHER_STATUS_NEW, VOUCHER_STATUS_USED, VOUCHER_STATUS_EXPIRED
from web.tests.functions import create_voucher, create_study_subject, format_form_field, create_voucher_type from web.tests.functions import create_voucher, create_study_subject, format_form_field, create_voucher_type, \
create_voucher_partner
from .. import LoggedInTestCase from .. import LoggedInTestCase
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -30,9 +33,16 @@ class VoucherTypeViewTests(LoggedInTestCase): ...@@ -30,9 +33,16 @@ class VoucherTypeViewTests(LoggedInTestCase):
voucher_type = create_voucher_type() voucher_type = create_voucher_type()
study_subject = create_study_subject() study_subject = create_study_subject()
study_subject.voucher_types.add(voucher_type) study_subject.voucher_types.add(voucher_type)
usage_partner = create_voucher_partner()
usage_partner.voucher_types.add(voucher_type)
usage_partner.save()
visit_detail_form = VoucherForm() visit_detail_form = VoucherForm()
form_data = { form_data = {
"usage_partner": usage_partner.id,
"status": VOUCHER_STATUS_NEW, "status": VOUCHER_STATUS_NEW,
"hours": 10,
"voucher_type": voucher_type.id "voucher_type": voucher_type.id
} }
for key, value in visit_detail_form.initial.items(): for key, value in visit_detail_form.initial.items():
...@@ -40,19 +50,22 @@ class VoucherTypeViewTests(LoggedInTestCase): ...@@ -40,19 +50,22 @@ class VoucherTypeViewTests(LoggedInTestCase):
url = reverse('web.views.voucher_add') + '?study_subject_id=' + str(study_subject.id) url = reverse('web.views.voucher_add') + '?study_subject_id=' + str(study_subject.id)
response = self.client.post(url, data=form_data) response = self.client.post(url, data=form_data)
print response.content
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
self.assertEqual(1, Voucher.objects.all().count()) self.assertEqual(1, Voucher.objects.all().count())
def test_edit_voucher(self): def test_edit_voucher(self):
voucher = create_voucher() voucher = create_voucher()
usage_partner = create_voucher_partner()
usage_partner.voucher_types.add(voucher.voucher_type)
usage_partner.save()
voucher_form = VoucherForm(instance=voucher) voucher_form = VoucherForm(instance=voucher)
form_data = {} form_data = {}
for key, value in voucher_form.initial.items(): for key, value in voucher_form.initial.items():
form_data[key] = format_form_field(value) form_data[key] = format_form_field(value)
form_data["usage_partner"] = "" form_data["usage_partner"] = usage_partner.id
form_data["use_date"] = ""
url = reverse('web.views.voucher_edit', kwargs={'pk': voucher.id}) url = reverse('web.views.voucher_edit', kwargs={'pk': voucher.id})
response = self.client.post(url, data=form_data) response = self.client.post(url, data=form_data)
......
import datetime
import logging
from django.urls import reverse
from web.forms.voucher_partner_session_forms import VoucherPartnerSessionForm
from web.models import Voucher
from web.models.constants import VOUCHER_STATUS_USED, VOUCHER_STATUS_IN_USE
from web.tests.functions import create_voucher, format_form_field
from .. import LoggedInTestCase
logger = logging.getLogger(__name__)
class VoucherTypeViewTests(LoggedInTestCase):
def test_render_add_voucher_partner_session_request(self):
voucher = create_voucher()
url = reverse('web.views.voucher_partner_sessions_add', kwargs={'pk': voucher.id})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
def test_add_voucher_partner_session_without_using_time(self):
voucher = create_voucher()
voucher.hours = 10
voucher.save()
form = VoucherPartnerSessionForm()
form_data = {
"length": 50,
"date": datetime.datetime.now(),
}
for key, value in form.initial.items():
form_data[key] = format_form_field(value)
url = reverse('web.views.voucher_partner_sessions_add', kwargs={'pk': voucher.id})
response = self.client.post(url, data=form_data)
print response.content
self.assertEqual(response.status_code, 302)
voucher = Voucher.objects.get(id=voucher.id)
self.assertEqual(VOUCHER_STATUS_IN_USE, voucher.status)
def test_add_voucher_partner_session_with_using_time(self):
voucher = create_voucher()
voucher.hours = 1
voucher.save()
form = VoucherPartnerSessionForm()
form_data = {
"length": 60,
"date": datetime.datetime.now(),
}
for key, value in form.initial.items():
form_data[key] = format_form_field(value)
url = reverse('web.views.voucher_partner_sessions_add', kwargs={'pk': voucher.id})
response = self.client.post(url, data=form_data)
print response.content
self.assertEqual(response.status_code, 302)
voucher = Voucher.objects.get(id=voucher.id)
self.assertEqual(VOUCHER_STATUS_USED, voucher.status)
...@@ -127,8 +127,10 @@ urlpatterns = [ ...@@ -127,8 +127,10 @@ urlpatterns = [
url(r'^equipment_and_rooms/equipment$', views.equipment.equipment, name='web.views.equipment'), url(r'^equipment_and_rooms/equipment$', views.equipment.equipment, name='web.views.equipment'),
url(r'^equipment_and_rooms/equipment/add$', views.equipment.equipment_add, name='web.views.equipment_add'), url(r'^equipment_and_rooms/equipment/add$', views.equipment.equipment_add, name='web.views.equipment_add'),
url(r'^equipment_and_rooms/equipment/edit/(?P<equipment_id>\d+)$', views.equipment.equipment_edit, name='web.views.equipment_edit'), url(r'^equipment_and_rooms/equipment/edit/(?P<equipment_id>\d+)$', views.equipment.equipment_edit,
url(r'^equipment_and_rooms/equipment/delete/(?P<equipment_id>\d+)$', views.equipment.equipment_delete, name='web.views.equipment_delete'), name='web.views.equipment_edit'),
url(r'^equipment_and_rooms/equipment/delete/(?P<equipment_id>\d+)$', views.equipment.equipment_delete,
name='web.views.equipment_delete'),
url(r'^equipment_and_rooms/kit_requests$', views.kit.kit_requests, name='web.views.kit_requests'), url(r'^equipment_and_rooms/kit_requests$', views.kit.kit_requests, name='web.views.kit_requests'),
url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/$', views.kit.kit_requests_send_mail, url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/$', views.kit.kit_requests_send_mail,
...@@ -136,14 +138,19 @@ urlpatterns = [ ...@@ -136,14 +138,19 @@ urlpatterns = [
url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/(?P<end_date>[\w-]+)/$', url(r'^equipment_and_rooms/kit_requests/(?P<start_date>[\w-]+)/(?P<end_date>[\w-]+)/$',
views.kit.kit_requests_send_mail, name='web.views.kit_requests_send_mail'), views.kit.kit_requests_send_mail, name='web.views.kit_requests_send_mail'),
url(r'^equipment_and_rooms/flying_teams$', views.flying_teams.flying_teams, name='web.views.equipment_and_rooms.flying_teams'), url(r'^equipment_and_rooms/flying_teams$', views.flying_teams.flying_teams,
url(r'^equipment_and_rooms/flying_teams/add$', views.flying_teams.flying_teams_add, name='web.views.equipment_and_rooms.flying_teams_add'), name='web.views.equipment_and_rooms.flying_teams'),
url(r'^equipment_and_rooms/flying_teams/edit/(?P<flying_team_id>\d+)$', views.flying_teams.flying_teams_edit, name='web.views.equipment_and_rooms.flying_teams_edit'), url(r'^equipment_and_rooms/flying_teams/add$', views.flying_teams.flying_teams_add,
name='web.views.equipment_and_rooms.flying_teams_add'),
url(r'^equipment_and_rooms/flying_teams/edit/(?P<flying_team_id>\d+)$', views.flying_teams.flying_teams_edit,
name='web.views.equipment_and_rooms.flying_teams_edit'),
url(r'^equipment_and_rooms/rooms$', views.rooms.rooms, name='web.views.equipment_and_rooms.rooms'), url(r'^equipment_and_rooms/rooms$', views.rooms.rooms, name='web.views.equipment_and_rooms.rooms'),
url(r'^equipment_and_rooms/rooms/add$', views.rooms.rooms_add, name='web.views.equipment_and_rooms.rooms_add'), url(r'^equipment_and_rooms/rooms/add$', views.rooms.rooms_add, name='web.views.equipment_and_rooms.rooms_add'),
url(r'^equipment_and_rooms/rooms/edit/(?P<room_id>\d+)$', views.rooms.rooms_edit, name='web.views.equipment_and_rooms.rooms_edit'), url(r'^equipment_and_rooms/rooms/edit/(?P<room_id>\d+)$', views.rooms.rooms_edit,
url(r'^equipment_and_rooms/rooms/delete/(?P<room_id>\d+)$', views.rooms.rooms_delete, name='web.views.equipment_and_rooms.rooms_delete'), name='web.views.equipment_and_rooms.rooms_edit'),
url(r'^equipment_and_rooms/rooms/delete/(?P<room_id>\d+)$', views.rooms.rooms_delete,
name='web.views.equipment_and_rooms.rooms_delete'),
#################### ####################
# MAIL # # MAIL #
...@@ -202,6 +209,14 @@ urlpatterns = [ ...@@ -202,6 +209,14 @@ urlpatterns = [
url(r'^vouchers/add$', views.voucher.VoucherCreateView.as_view(), name='web.views.voucher_add'), url(r'^vouchers/add$', views.voucher.VoucherCreateView.as_view(), name='web.views.voucher_add'),
url(r'^vouchers/(?P<pk>\d+)/edit$', views.voucher.VoucherEditView.as_view(), name='web.views.voucher_edit'), url(r'^vouchers/(?P<pk>\d+)/edit$', views.voucher.VoucherEditView.as_view(), name='web.views.voucher_edit'),
####################################
# VOUCHER PARTNER SESSIONS #
####################################
url(r'^vouchers/(?P<pk>\d+)/voucher_partner_session/add$',
views.voucher_partner_session.VoucherPartnerSessionCreateView.as_view(),
name='web.views.voucher_partner_sessions_add'),
#################### ####################
# STATISTICS # # STATISTICS #
#################### ####################
......
...@@ -77,6 +77,7 @@ import contact_attempt ...@@ -77,6 +77,7 @@ import contact_attempt
import configuration_item import configuration_item
import language import language
import voucher import voucher
import voucher_partner_session
import voucher_type import voucher_type
import voucher_type_price import voucher_type_price
import redcap import redcap
......
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