Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • smasch/scheduling-system
1 result
Show changes
Commits on Source (13)
Showing
with 596 additions and 14 deletions
# Disable virtualenv
env/*
# Disable migration files
smash/web/migrations/*
# Folder with db statics (dev mode)
smash/~/
......@@ -19,8 +16,8 @@ appointment-import/tmp.sql
*.iml
out
.idea
<<<<<<< HEAD
#coverage tool
.coverage
smash/htmlcov/*
smash/htmlcov/
......@@ -17,6 +17,6 @@ test:
script:
- cp "local_settings_ci.py" "smash/smash/local_settings.py"
- cd smash
- python manage.py makemigrations && python manage.py migrate
- python manage.py makemigrations web && python manage.py migrate
- coverage run --source web manage.py test
- coverage report -m
......@@ -31,3 +31,5 @@ STATIC_ROOT = '/tmp/static' # Warning! `/tmp` directory can be flushed in any m
MEDIA_ROOT = '/tmp/media' # Warning! `/tmp` directory can be flushed in any moment; use a persistent one, e.g. ~/tmp/media
ALLOWED_HOSTS = ["127.0.0.1", "localhost"]
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
......@@ -15,7 +15,6 @@ import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
......@@ -87,6 +86,8 @@ INTERNAL_IPS = [
'127.0.0.1'
]
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
......@@ -100,7 +101,6 @@ USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
......
from django.contrib import admin
from models import Subject, Item, Room, AppointmentType, Language, Location, Worker, FlyingTeam, Avaibility, Holiday, \
from models import Subject, Item, Room, AppointmentType, Language, Location, Worker, FlyingTeam, Availability, Holiday, \
Visit, Appointment
......@@ -18,6 +18,6 @@ admin.site.register(Language, LanguageAdmin)
admin.site.register(Location)
admin.site.register(Worker)
admin.site.register(FlyingTeam)
admin.site.register(Avaibility)
admin.site.register(Availability)
admin.site.register(Holiday)
admin.site.register(Appointment)
from datetime import datetime
import datetime
from django import forms
from django.forms import ModelForm, Form
from django.utils.dates import MONTHS
from models import Subject, Worker, Appointment, Visit, AppointmentType
from models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt
from models.constants import SUBJECT_TYPE_CHOICES
"""
Possible redundancy, but if need arises, contents of forms can be easily customized
"""
CURRENT_YEAR = datetime.now().year
CURRENT_YEAR = datetime.datetime.now().year
YEAR_CHOICES = tuple(range(CURRENT_YEAR, CURRENT_YEAR - 120, -1))
FUTURE_YEAR_CHOICES = tuple(range(CURRENT_YEAR, CURRENT_YEAR + 5, 1))
DATEPICKER_DATE_ATTRS = {
......@@ -79,6 +79,7 @@ class SubjectAddForm(ModelForm):
validate_subject_nd_number(self)
def get_new_screening_number(screening_number_prefix):
result_number = 0
subjects = Subject.objects.filter(screening_number__contains=screening_number_prefix)
......@@ -95,12 +96,14 @@ def get_new_screening_number(screening_number_prefix):
return screening_number_prefix + str(result_number + 1).zfill(3)
def get_prefix_screening_number(user):
prefix_screening_number = ''
if (user is not None) and (user.screening_number_prefix is not None) and (user.screening_number_prefix != ""):
prefix_screening_number = user.screening_number_prefix + "-"
return prefix_screening_number
class SubjectDetailForm(ModelForm):
class Meta:
model = Subject
......@@ -268,6 +271,29 @@ class VisitAddForm(ModelForm):
self.add_error('datetime_end', "End date must be after start date")
class ContactAttemptForm(ModelForm):
datetime_when = forms.DateTimeField(label='Contact on (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)
subject = kwargs.pop('subject', None)
super(ContactAttemptForm, self).__init__(*args, **kwargs)
self.fields['subject'].initial = subject.id
self.fields['subject'].disabled = True
self.fields['worker'].initial = self.user
class KitRequestForm(Form):
start_date = forms.DateField(label="From date",
widget=forms.DateInput(DATEPICKER_DATE_ATTRS, "%Y-%m-%d"),
......@@ -286,7 +312,7 @@ class StatisticsForm(Form):
visit_choices = kwargs['visit_choices']
month = kwargs['month']
year = kwargs['year']
now = datetime.now()
now = datetime.datetime.now()
year_now = now.year
number_of_years_for_statistics = year_now - START_YEAR_STATISTICS + 2
......
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-01 12:35
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Appointment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datetime_when', models.DateTimeField(verbose_name='Appointment on')),
('length', models.IntegerField(verbose_name='Appointment length (in minutes)')),
('is_finished', models.BooleanField(default=False, verbose_name='Has the appointment ended?')),
],
),
migrations.CreateModel(
name='AppointmentType',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('code', models.CharField(max_length=20, verbose_name='Appointment code')),
('description', models.CharField(max_length=2000, verbose_name='Appointment description')),
('default_duration', models.IntegerField(verbose_name='Default duration (in minutes)')),
('rest_time', models.IntegerField(verbose_name='Suggested rest time')),
],
),
migrations.CreateModel(
name='Avaibility',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('day_number', models.IntegerField(verbose_name='Day of the week')),
('available_from', models.TimeField(verbose_name='Avaible since')),
('available_till', models.TimeField(verbose_name='Avaible until')),
('is_current', models.BooleanField(default=True, verbose_name='Is current?')),
],
),
migrations.CreateModel(
name='FlyingTeam',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datetime_called', models.DateTimeField(verbose_name='Created on')),
('datetime_until', models.DateTimeField(verbose_name='Disbanded on')),
],
),
migrations.CreateModel(
name='Holiday',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datetime_start', models.DateTimeField(verbose_name='On leave since')),
('datetime_end', models.DateTimeField(verbose_name='On leave until')),
],
),
migrations.CreateModel(
name='Item',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('is_fixed', models.BooleanField(default=False, verbose_name='Is the item fixed?')),
('name', models.CharField(max_length=255, verbose_name='Name')),
],
),
migrations.CreateModel(
name='Language',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20)),
('image', models.ImageField(upload_to=b'')),
],
),
migrations.CreateModel(
name='Room',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('owner', models.CharField(max_length=50, verbose_name='Owner')),
('address', models.CharField(max_length=255, verbose_name='Address')),
('city', models.CharField(max_length=50, verbose_name='City')),
('room_number', models.IntegerField(verbose_name='Room number')),
('floor', models.IntegerField(verbose_name='Floor')),
('is_vehicle', models.BooleanField(verbose_name='Is a vehicle?')),
('equipment', models.ManyToManyField(blank=True, to='web.Item', verbose_name='On-site equipment')),
],
),
migrations.CreateModel(
name='Subject',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('sex', models.CharField(choices=[('M', 'Male'), ('F', 'Female')], max_length=1, verbose_name='Sex')),
('first_name', models.CharField(max_length=50, verbose_name='First name')),
('last_name', models.CharField(max_length=50, verbose_name='Last name')),
('phone_number', models.CharField(max_length=20, verbose_name='Phone number')),
('email', models.EmailField(max_length=254, verbose_name='E-mail')),
('date_born', models.DateField(verbose_name='Date date_born')),
('address', models.CharField(max_length=255, verbose_name='Address')),
('postal_code', models.CharField(max_length=6, verbose_name='Postal code')),
('city', models.CharField(max_length=50, verbose_name='City')),
('country', models.CharField(max_length=50, verbose_name='Country')),
('screening_number', models.CharField(max_length=50, verbose_name='Screening number')),
('nd_number', models.CharField(max_length=6, verbose_name='ND number')),
('visit_count', models.IntegerField(verbose_name='Number of visits')),
('mpower_id', models.CharField(max_length=20, verbose_name='MPower ID')),
('status', models.CharField(choices=[('NCO', 'Not contacted'), ('TST', 'Test group'), ('LEA', 'Level A'), ('LEB', 'Level B'), ('OPT', 'Opted out'), ('REJ', 'Rejected'), ('DEA', 'Dead')], default='NCO', max_length=3, verbose_name='Status')),
('main_pseudonym', models.CharField(max_length=45, verbose_name='Pseudonym')),
('comments', models.CharField(max_length=2000, verbose_name='Comments')),
('date_added', models.DateField(auto_now=True, verbose_name='Added on')),
('referral', models.CharField(max_length=128, null=True, verbose_name='Referred by')),
('diagnosis', models.CharField(max_length=128, null=True, verbose_name='Diagnosis')),
('year_of_diagnosis', models.IntegerField(default=0, null=True, verbose_name='Year of diagnosis')),
('languages', models.ManyToManyField(to='web.Language', verbose_name='Known languages')),
],
),
migrations.CreateModel(
name='Visit',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datetime_begin', models.DateTimeField(verbose_name='Visit starts at')),
('datetime_end', models.DateTimeField(verbose_name='Visit ends at')),
('visit_type', models.CharField(choices=[('A', 'Level A visit'), ('B', 'Level B visit'), ('O', 'Other')], default='O', max_length=1, verbose_name='Visit type')),
('is_finished', models.BooleanField(default=False, verbose_name='Has ended')),
('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Subject', verbose_name='Subject')),
],
),
migrations.CreateModel(
name='Worker',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('first_name', models.CharField(max_length=50, verbose_name='First name')),
('last_name', models.CharField(max_length=50, verbose_name='Last name')),
('phone_number', models.CharField(max_length=20, verbose_name='Phone number')),
('unit', models.CharField(max_length=50, verbose_name='Unit')),
('email', models.EmailField(max_length=254, verbose_name='E-mail')),
('role', models.CharField(choices=[('DOCTOR', 'Doctor'), ('NURSE', 'Nurse'), ('PSYCHOLOGIST', 'Psychologist'), ('TECHNICIAN', 'Technician'), ('SECRETARY', 'Secretary')], max_length=20, verbose_name='Role')),
('specialization', models.CharField(max_length=20, verbose_name='Specialization')),
('appointments', models.ManyToManyField(blank=True, to='web.Appointment', verbose_name='Appointments')),
('languages', models.ManyToManyField(to='web.Language', verbose_name='Known languages')),
('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Username')),
],
),
migrations.AddField(
model_name='holiday',
name='person',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker'),
),
migrations.AddField(
model_name='flyingteam',
name='doctor',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='FlyingTeamDoctor', to='web.Worker', verbose_name='Doctor'),
),
migrations.AddField(
model_name='flyingteam',
name='nurse',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='FlyingTeamNurse', to='web.Worker', verbose_name='Nurse'),
),
migrations.AddField(
model_name='flyingteam',
name='psychologist',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='FlyingTeamPsychologist', to='web.Worker', verbose_name='Psychologist'),
),
migrations.AddField(
model_name='avaibility',
name='person',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker'),
),
migrations.AddField(
model_name='appointmenttype',
name='required_equipment',
field=models.ManyToManyField(to='web.Item', verbose_name='Required equipment'),
),
migrations.AddField(
model_name='appointment',
name='appointment_type',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.AppointmentType', verbose_name='Appointment type'),
),
migrations.AddField(
model_name='appointment',
name='flying_team',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.FlyingTeam', verbose_name='Flying team (if applicable)'),
),
migrations.AddField(
model_name='appointment',
name='room',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Room', verbose_name='Room ID'),
),
migrations.AddField(
model_name='appointment',
name='visit',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.Visit', verbose_name='Visit ID'),
),
migrations.AddField(
model_name='appointment',
name='worker_assigned',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Worker', verbose_name='Worker conducting the assessment (if applicable)'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-01 16:24
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='appointmenttype',
name='required_worker',
field=models.CharField(choices=[('DOCTOR', 'Doctor'), ('NURSE', 'Nurse'), ('PSYCHOLOGIST', 'Psychologist'), ('ANY', 'Any')], default='ANY', max_length=20, verbose_name='Type of worker required for assignment'),
),
migrations.AlterField(
model_name='appointment',
name='datetime_when',
field=models.DateTimeField(blank=True, null=True, verbose_name='Appointment on'),
),
migrations.AlterField(
model_name='subject',
name='date_born',
field=models.DateField(verbose_name='Date of birth (YYYY-MM-DD)'),
),
migrations.AlterField(
model_name='subject',
name='year_of_diagnosis',
field=models.IntegerField(default=0, null=True, verbose_name='Year of diagnosis (YYYY)'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-06 12:49
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0002_auto_20170201_1624'),
]
operations = [
migrations.AlterField(
model_name='appointmenttype',
name='required_equipment',
field=models.ManyToManyField(blank=True, to='web.Item', verbose_name='Required equipment'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-07 14:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0003_auto_20170206_1249'),
]
operations = [
migrations.AlterField(
model_name='appointmenttype',
name='required_worker',
field=models.CharField(choices=[('DOCTOR', 'Doctor'), ('NURSE', 'Nurse'), ('PSYCHOLOGIST', 'Psychologist'), ('ANY', 'Any')], default='ANY', max_length=20, verbose_name='Type of worker required for appointment'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-07 14:32
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0004_auto_20170207_1400'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='postal_code',
field=models.CharField(max_length=7, verbose_name='Postal code'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-07 14:36
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0005_auto_20170207_1432'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='email',
field=models.EmailField(max_length=254, null=True, verbose_name='E-mail'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-07 15:37
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0006_auto_20170207_1436'),
]
operations = [
migrations.AddField(
model_name='subject',
name='phone_number_2',
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone number 2'),
),
migrations.AddField(
model_name='subject',
name='phone_number_3',
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone number 3'),
),
migrations.AlterField(
model_name='subject',
name='email',
field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='E-mail'),
),
migrations.AlterField(
model_name='subject',
name='phone_number',
field=models.CharField(blank=True, max_length=20, null=True, verbose_name='Phone number'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-07 16:04
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0007_auto_20170207_1537'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='visit_count',
field=models.IntegerField(default=0, verbose_name='Number of visits'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-08 10:26
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0008_auto_20170207_1604'),
]
operations = [
migrations.RemoveField(
model_name='subject',
name='visit_count',
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-08 11:55
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('web', '0009_remove_subject_visit_count'),
]
operations = [
migrations.RemoveField(
model_name='subject',
name='main_pseudonym',
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-08 12:08
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0010_remove_subject_main_pseudonym'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='date_born',
field=models.DateField(blank=True, null=True, verbose_name='Date of birth (YYYY-MM-DD)'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-08 14:14
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0011_auto_20170208_1208'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='first_name',
field=models.CharField(max_length=60, verbose_name='First name'),
),
migrations.AlterField(
model_name='subject',
name='last_name',
field=models.CharField(max_length=60, verbose_name='Last name'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-08 14:15
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('web', '0012_auto_20170208_1414'),
]
operations = [
migrations.AlterField(
model_name='subject',
name='first_name',
field=models.CharField(max_length=50, verbose_name='First name'),
),
migrations.AlterField(
model_name='subject',
name='last_name',
field=models.CharField(max_length=50, verbose_name='Last name'),
),
]
# -*- coding: utf-8 -*-
# Generated by Django 1.10.3 on 2017-02-20 08:12
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('web', '0013_auto_20170208_1415'),
]
operations = [
migrations.AlterField(
model_name='appointment',
name='room',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='web.Room', verbose_name='Room ID'),
),
migrations.AlterField(
model_name='subject',
name='address',
field=models.CharField(blank=True, max_length=255, verbose_name='Address'),
),
migrations.AlterField(
model_name='subject',
name='city',
field=models.CharField(blank=True, max_length=50, verbose_name='City'),
),
migrations.AlterField(
model_name='subject',
name='comments',
field=models.CharField(blank=True, max_length=2000, verbose_name='Comments'),
),
migrations.AlterField(
model_name='subject',
name='diagnosis',
field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Diagnosis'),
),
migrations.AlterField(
model_name='subject',
name='languages',
field=models.ManyToManyField(blank=True, to='web.Language', verbose_name='Known languages'),
),
migrations.AlterField(
model_name='subject',
name='mpower_id',
field=models.CharField(blank=True, max_length=20, verbose_name='MPower ID'),
),
migrations.AlterField(
model_name='subject',
name='nd_number',
field=models.CharField(blank=True, max_length=6, verbose_name='ND number'),
),
migrations.AlterField(
model_name='subject',
name='postal_code',
field=models.CharField(blank=True, max_length=7, verbose_name='Postal code'),
),
migrations.AlterField(
model_name='subject',
name='referral',
field=models.CharField(blank=True, max_length=128, null=True, verbose_name='Referred by'),
),
migrations.AlterField(
model_name='subject',
name='screening_number',
field=models.CharField(blank=True, max_length=50, unique=True, verbose_name='Screening number'),
),
migrations.AlterField(
model_name='subject',
name='year_of_diagnosis',
field=models.IntegerField(blank=True, default=0, null=True, verbose_name='Year of diagnosis (YYYY)'),
),
]