Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
functions.py 6.97 KiB
import datetime
import os

from django.contrib.auth.models import User

from web.models import Location, AppointmentType, StudySubject, Worker, Visit, Appointment, ConfigurationItem, Language, \
    ContactAttempt, FlyingTeam, Availability, Subject, Study, StudyColumns
from web.models.constants import REDCAP_TOKEN_CONFIGURATION_TYPE, REDCAP_BASE_URL_CONFIGURATION_TYPE, \
    SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, CONTACT_TYPES_PHONE, \
    MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID
from web.redcap_connector import RedcapSubject
from web.views.notifications import get_today_midnight_date


def create_get_suffix(params):
    result = "?"
    for key in params:
        result += key + "=" + str(params[key]) + "&"
    return result


def create_location(name="test"):
    return Location.objects.create(name=name)


def create_empty_study_columns():
    study_columns = StudyColumns.objects.create(
        postponed=False,
        datetime_contact_reminder=False,
        type=False,
        default_location=False,
        flying_team=False,
        screening_number=False,
        nd_number=False,
        mpower_id=False,
        comments=False,
        referral=False,
        diagnosis=False,
        year_of_diagnosis=False,
        information_sent=False,
        pd_in_family=False,
        resigned=False,
        resign_reason=False,
    )

    return study_columns


def create_study(name="test"):
    study_columns = StudyColumns.objects.create()
    return Study.objects.create(name=name, columns=study_columns)


def create_empty_study(name="test"):
    study_columns = StudyColumns.objects.create(
        postponed=False,
        datetime_contact_reminder=False,
        type=False,
        default_location=False,
        flying_team=False,
        screening_number=False,
        nd_number=False,
        mpower_id=False,
        comments=False,
        referral=False,
        diagnosis=False,
        year_of_diagnosis=False,
        information_sent=False,
        pd_in_family=False,
        resigned=False,
        resign_reason=False
    )
    return Study.objects.create(name=name, columns=study_columns)


def get_test_location():
    locations = Location.objects.filter(name="test")
    if len(locations) > 0:
        return locations[0]
    else:
        return create_location()


def get_test_study():
    studies = Study.objects.filter(name="test-study")
    if len(studies) > 0:
        return studies[0]
    else:
        return create_study("test-study")


def create_appointment_type():
    return AppointmentType.objects.create(
        code="C",
        default_duration="10",
        description="test",
    )


def create_contact_attempt(subject=None, worker=None):
    if subject is None:
        subject = create_study_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():
    return Subject.objects.create(
        first_name="Piotr",
        last_name="Gawron",
        sex=SEX_CHOICES_MALE,
        country_id=COUNTRY_AFGHANISTAN_ID
    )


def create_study_subject(subject_id=1, subject=None):
    if subject is None:
        subject = create_subject()
    return StudySubject.objects.create(
        default_location=get_test_location(),
        type=SUBJECT_TYPE_CHOICES_CONTROL,
        screening_number="piotr's number" + str(subject_id),
        study=get_test_study(),
        subject=subject
    )


def create_red_cap_subject():
    result = RedcapSubject()
    result.nd_number = "123"
    return result


def create_user(username=None, password=None):
    if username is None:
        username = 'piotr'
    if password is None:
        password = 'top_secret'
    user = User.objects.create_user(
        username=username,
        email='jacob@bla',
        password=password)

    create_worker(user)
    return user


def create_worker(user=None, with_test_location=False):
    worker = Worker.objects.create(
        first_name='piotr',
        last_name="gawron",
        email='jacob@bla',
        user=user,
    )
    if with_test_location:
        worker.locations = [get_test_location()]
        worker.save()
    return worker


def create_availability(worker=None):
    if worker is None:
        worker = create_worker()
    availability = Availability.objects.create(person=worker,
                                               day_number=MONDAY_AS_DAY_OF_WEEK,
                                               available_from=get_today_midnight_date(),
                                               available_till=get_today_midnight_date(),
                                               )
    return availability


def create_visit(subject=None):
    if subject is None:
        subject = create_study_subject()
    return Visit.objects.create(datetime_begin=get_today_midnight_date() + datetime.timedelta(days=-31),
                                datetime_end=get_today_midnight_date() + datetime.timedelta(days=31),
                                subject=subject,
                                is_finished=False)


def create_appointment(visit=None, when=None):
    if visit is None:
        visit = create_visit()
    # if when is None:
    #     when = get_today_midnight_date()
    return Appointment.objects.create(
        visit=visit,
        length=30,
        location=get_test_location(),
        status=Appointment.APPOINTMENT_STATUS_SCHEDULED,
        datetime_when=when)


def create_configuration_item():
    item = ConfigurationItem.objects.create()
    item.type = "TEST"
    item.value = "xxx"
    item.name = "yyy"
    item.save()
    return item


def create_flying_team(place=None):
    if place is None:
        place = "CHEM"
    result = FlyingTeam.objects.create(place=place)
    return result


def create_language(name="French", locale="fr_FR"):
    language = Language(name=name, locale=locale)
    language.save()
    return language


def get_resource_path(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


def prepare_test_redcap_connection():
    Language.objects.create(name="Finnish").save()
    Language.objects.create(name="Italian").save()
    token_item = ConfigurationItem.objects.filter(type=REDCAP_TOKEN_CONFIGURATION_TYPE)[0]
    # noinspection SpellCheckingInspection
    token_item.value = "5C75EEC3DBDDA5218B6ACC0424B3F695"
    token_item.save()
    url_item = ConfigurationItem.objects.filter(type=REDCAP_BASE_URL_CONFIGURATION_TYPE)[0]
    url_item.value = "https://luxparktest.org/redcap/"
    url_item.save()