diff --git a/smash/web/api_urls.py b/smash/web/api_urls.py index 99f0b92707ab66904a16f2c92d7b943eda5a597d..4db32fe7df7a63bb925204d415e42589b69c3d17 100644 --- a/smash/web/api_urls.py +++ b/smash/web/api_urls.py @@ -32,7 +32,6 @@ urlpatterns = [ # subjects data url(r'^cities$', subject.cities, name='web.api.cities'), - url(r'^countries$', subject.countries, name='web.api.countries'), url(r'^referrals$', subject.referrals, name='web.api.referrals'), url(r'^subjects/(?P<type>[A-z]+)$', subject.subjects, name='web.api.subjects'), url(r'^subject_types', subject.types, name='web.api.subject_types'), diff --git a/smash/web/api_views/subject.py b/smash/web/api_views/subject.py index 6d1bb1f598bf7371d94cb3e5a4e12a085f125306..b84e207c373bdb98fbd3169817c69105df9b3549 100644 --- a/smash/web/api_views/subject.py +++ b/smash/web/api_views/subject.py @@ -22,14 +22,6 @@ def cities(request): }) -@login_required -def countries(request): - result_subjects = Subject.objects.filter(country__isnull=False).values_list('country').distinct() - return JsonResponse({ - "countries": [x[0] for x in result_subjects] - }) - - @login_required def referrals(request): result_subjects = Subject.objects.filter(referral__isnull=False).values_list('referral').distinct() @@ -103,7 +95,7 @@ def get_subjects_order(subjects_to_be_ordered, order_column, order_direction): elif order_column == "visit_8": result = order_by_visit(subjects_to_be_ordered, order_direction, 8) else: - logger.warn("Unknown sort column: "+order_column) + logger.warn("Unknown sort column: " + order_column) return result diff --git a/smash/web/forms.py b/smash/web/forms.py index e4e4c2bb8b0594b62ea16fba51132eb68282f19b..3b2d60066bc7cbd41e727477aa84e93610b24c4f 100644 --- a/smash/web/forms.py +++ b/smash/web/forms.py @@ -5,10 +5,10 @@ from django import forms from django.forms import ModelForm, Form from django.utils.dates import MONTHS -from models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ - Availability, Holiday -from models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE -from views.notifications import get_filter_locations +from web.models import Subject, Worker, Appointment, Visit, AppointmentType, ContactAttempt, AppointmentTypeLink, \ + Availability, Holiday, Country +from web.models.constants import SUBJECT_TYPE_CHOICES, SCREENING_NUMBER_PREFIXES_FOR_TYPE, COUNTRY_OTHER_ID +from web.views.notifications import get_filter_locations """ Possible redundancy, but if need arises, contents of forms can be easily customized @@ -44,6 +44,11 @@ def validate_subject_nd_number(self, cleaned_data): self.add_error('nd_number', "ND number already in use") +def validate_subject_country(self, cleaned_data): + if cleaned_data['country'].id == COUNTRY_OTHER_ID: + self.add_error('country', "Select valid country") + + def validate_subject_mpower_number(self, cleaned_data): if cleaned_data['mpower_id'] != "": subjects_from_db = Subject.objects.filter(mpower_id=cleaned_data['mpower_id']) @@ -96,6 +101,7 @@ class SubjectAddForm(ModelForm): if len(subjects_from_db) > 0: self.add_error('screening_number', "Screening number already in use") + validate_subject_country(self, cleaned_data) validate_subject_nd_number(self, cleaned_data) validate_subject_mpower_number(self, cleaned_data) return cleaned_data @@ -167,6 +173,7 @@ class SubjectEditForm(ModelForm): def clean(self): validate_subject_nd_number(self, self.cleaned_data) validate_subject_mpower_number(self, self.cleaned_data) + validate_subject_country(self, self.cleaned_data) class Meta: model = Subject diff --git a/smash/web/migrations/0058_country.py b/smash/web/migrations/0058_country.py new file mode 100644 index 0000000000000000000000000000000000000000..e1f51c42295c51137e0ed14c3726e1811cd3546c --- /dev/null +++ b/smash/web/migrations/0058_country.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-10-31 08:02 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0057_update_visit_number_for_existing_visits'), + ] + + operations = [ + migrations.CreateModel( + name='Country', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=20)), + ('order', models.IntegerField(default=0)), + ], + options={ + 'ordering': ['order'], + }, + ), + migrations.RunSQL('insert into web_country (name, "order") values(\'OTHER\', 1000);') + ] diff --git a/smash/web/migrations/0059_subject_country_2.py b/smash/web/migrations/0059_subject_country_2.py new file mode 100644 index 0000000000000000000000000000000000000000..9c48092005d9db60f437c64b5c2ada3544cb6ed1 --- /dev/null +++ b/smash/web/migrations/0059_subject_country_2.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-10-31 08:36 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0058_country'), + ] + + operations = [ + migrations.AddField( + model_name='subject', + name='country_2', + field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='web.Country', verbose_name=b'Country'), + ), + ] diff --git a/smash/web/migrations/0060_remove_subject_country.py b/smash/web/migrations/0060_remove_subject_country.py new file mode 100644 index 0000000000000000000000000000000000000000..43603845117ded69fa8c64998f469734bcc3c119 --- /dev/null +++ b/smash/web/migrations/0060_remove_subject_country.py @@ -0,0 +1,219 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-10-31 09:15 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0059_subject_country_2'), + ] + + operations = [ + migrations.AlterField( + model_name='country', + name='name', + field=models.CharField(max_length=50), + ), + migrations.RunSQL('insert into web_country (name, "order") values(\'Afghanistan\', 100);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Albania\', 101);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Algeria\', 102);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Andorra\', 103);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Angola\', 104);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Antigua & Deps\', 105);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Argentina\', 106);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Armenia\', 107);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Australia\', 108);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Austria\', 109);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Azerbaijan\', 110);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bahamas\', 111);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bahrain\', 112);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bangladesh\', 113);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Barbados\', 114);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Belarus\', 115);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Belgium\', 4);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Belize\', 117);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Benin\', 118);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bhutan\', 119);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bolivia\', 120);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bosnia Herzegovina\', 121);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Botswana\', 122);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Brazil\', 123);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Brunei\', 124);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Bulgaria\', 125);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Burkina\', 126);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Burundi\', 127);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Cambodia\', 128);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Cameroon\', 129);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Canada\', 130);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Cape Verde\', 131);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Central African Rep\', 132);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Chad\', 133);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Chile\', 134);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'China\', 135);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Colombia\', 136);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Comoros\', 137);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Congo\', 138);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Congo {Democratic Rep}\', 139);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Costa Rica\', 140);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Croatia\', 141);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Cuba\', 142);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Cyprus\', 143);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Czech Republic\', 144);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Denmark\', 145);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Djibouti\', 146);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Dominica\', 147);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Dominican Republic\', 148);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'East Timor\', 149);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ecuador\', 150);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Egypt\', 151);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'El Salvador\', 152);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Equatorial Guinea\', 153);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Eritrea\', 154);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Estonia\', 155);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ethiopia\', 156);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Fiji\', 157);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Finland\', 158);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'France\', 2);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Gabon\', 160);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Gambia\', 161);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Georgia\', 162);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Germany\', 3);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ghana\', 164);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Greece\', 165);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Grenada\', 166);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Guatemala\', 167);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Guinea\', 168);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Guinea-Bissau\', 169);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Guyana\', 170);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Haiti\', 171);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Honduras\', 172);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Hungary\', 173);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Iceland\', 174);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'India\', 175);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Indonesia\', 176);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Iran\', 177);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Iraq\', 178);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ireland {Republic}\', 179);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Israel\', 180);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Italy\', 181);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ivory Coast\', 182);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Jamaica\', 183);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Japan\', 184);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Jordan\', 185);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kazakhstan\', 186);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kenya\', 187);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kiribati\', 188);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Korea North\', 189);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Korea South\', 190);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kosovo\', 191);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kuwait\', 192);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Kyrgyzstan\', 193);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Laos\', 194);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Latvia\', 195);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Lebanon\', 196);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Lesotho\', 197);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Liberia\', 198);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Libya\', 199);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Liechtenstein\', 200);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Lithuania\', 201);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Luxembourg\', 1);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Macedonia\', 203);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Madagascar\', 204);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Malawi\', 205);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Malaysia\', 206);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Maldives\', 207);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mali\', 208);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Malta\', 209);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Marshall Islands\', 210);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mauritania\', 211);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mauritius\', 212);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mexico\', 213);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Micronesia\', 214);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Moldova\', 215);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Monaco\', 216);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mongolia\', 217);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Montenegro\', 218);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Morocco\', 219);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Mozambique\', 220);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Myanmar, {Burma}\', 221);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Namibia\', 222);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Nauru\', 223);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Nepal\', 224);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Netherlands\', 225);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'New Zealand\', 226);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Nicaragua\', 227);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Niger\', 228);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Nigeria\', 229);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Norway\', 230);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Oman\', 231);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Pakistan\', 232);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Palau\', 233);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Panama\', 234);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Papua New Guinea\', 235);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Paraguay\', 236);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Peru\', 237);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Philippines\', 238);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Poland\', 239);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Portugal\', 240);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Qatar\', 241);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Romania\', 242);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Russian Federation\', 243);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Rwanda\', 244);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'St Kitts & Nevis\', 245);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'St Lucia\', 246);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Saint Vincent & the Grenadines\', 247);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Samoa\', 248);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'San Marino\', 249);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Sao Tome & Principe\', 250);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Saudi Arabia\', 251);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Senegal\', 252);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Serbia\', 253);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Seychelles\', 254);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Sierra Leone\', 255);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Singapore\', 256);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Slovakia\', 257);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Slovenia\', 258);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Solomon Islands\', 259);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Somalia\', 260);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'South Africa\', 261);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'South Sudan\', 262);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Spain\', 263);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Sri Lanka\', 264);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Sudan\', 265);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Suriname\', 266);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Swaziland\', 267);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Sweden\', 268);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Switzerland\', 269);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Syria\', 270);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Taiwan\', 271);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Tajikistan\', 272);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Tanzania\', 273);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Thailand\', 274);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Togo\', 275);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Tonga\', 276);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Trinidad & Tobago\', 277);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Tunisia\', 278);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Turkey\', 279);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Turkmenistan\', 280);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Tuvalu\', 281);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Uganda\', 282);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Ukraine\', 283);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'United Arab Emirates\', 284);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'United Kingdom\', 285);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'United States\', 286);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Uruguay\', 287);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Uzbekistan\', 288);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Vanuatu\', 289);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Vatican City\', 290);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Venezuela\', 291);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Vietnam\', 292);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Yemen\', 293);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Zambia\', 294);'), + migrations.RunSQL('insert into web_country (name, "order") values(\'Zimbabwe\', 295);'), + + migrations.RunSQL('update web_subject t set country_2_id = ' + 'case when (select id from web_country u where t.country=u.name) is Null then 1 ' + 'else (select id from web_country u where t.country=u.name) end;'), + ] diff --git a/smash/web/migrations/0061_remove_subject_country.py b/smash/web/migrations/0061_remove_subject_country.py new file mode 100644 index 0000000000000000000000000000000000000000..526e2ec7f457107449172dc77ecc9b4e84289630 --- /dev/null +++ b/smash/web/migrations/0061_remove_subject_country.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.7 on 2017-10-31 09:15 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('web', '0060_remove_subject_country'), + ] + + operations = [ + migrations.RemoveField( + model_name='subject', + name='country', + ), + migrations.RenameField( + model_name='subject', + old_name='country_2', + new_name='country', + ), + migrations.RunSQL('update web_country set name=\'---\', "order"=0 where id=1;'), + ] diff --git a/smash/web/models/__init__.py b/smash/web/models/__init__.py index 6c0f4e1ec5b043bbccd4afb39de3a9aa4a424395..28a4bfa0bbae63229028fc45c83657f1031f9370 100644 --- a/smash/web/models/__init__.py +++ b/smash/web/models/__init__.py @@ -7,6 +7,7 @@ from configuration_item import ConfigurationItem from flying_team import FlyingTeam from location import Location from appointment_type_link import AppointmentTypeLink +from country import Country from room import Room from visit import Visit from worker import Worker @@ -25,4 +26,4 @@ from inconsistent_subject import InconsistentSubject, InconsistentField __all__ = [FlyingTeam, Appointment, AppointmentType, Availability, Holiday, Item, Language, Location, Room, Subject, Visit, Worker, ContactAttempt, ConfigurationItem, MailTemplate, AppointmentTypeLink, MissingSubject, - InconsistentSubject, InconsistentField] + InconsistentSubject, InconsistentField, Country] diff --git a/smash/web/models/constants.py b/smash/web/models/constants.py index 2dfee4e2c98362f30a49e5f2ac982796b313827a..d2defa4d3d1f8a52f4f40fe60fc0dcf71f0963be 100644 --- a/smash/web/models/constants.py +++ b/smash/web/models/constants.py @@ -74,3 +74,6 @@ WEEKDAY_CHOICES = ( REDCAP_TOKEN_CONFIGURATION_TYPE = "REDCAP_TOKEN_CONFIGURATION_TYPE" REDCAP_BASE_URL_CONFIGURATION_TYPE = "REDCAP_BASE_URL_CONFIGURATION_TYPE" + +COUNTRY_OTHER_ID = 1 +COUNTRY_AFGHANISTAN_ID = 2 \ No newline at end of file diff --git a/smash/web/models/country.py b/smash/web/models/country.py new file mode 100644 index 0000000000000000000000000000000000000000..ce180a164850ae034d9651cf70f6631f443fe35c --- /dev/null +++ b/smash/web/models/country.py @@ -0,0 +1,18 @@ +# coding=utf-8 + +from django.db import models + + +class Country(models.Model): + class Meta: + app_label = 'web' + ordering = ["order"] + + name = models.CharField(max_length=50) + order = models.IntegerField(default=0) + + def __str__(self): + return self.name + + def __unicode__(self): + return "%s" % self.name diff --git a/smash/web/models/mail_template.py b/smash/web/models/mail_template.py index a5dabfbcfc323ca18a2caf8d39c36e45a83d8991..8c3a7fa699c17b2965123ede3c2b5a6243164011 100644 --- a/smash/web/models/mail_template.py +++ b/smash/web/models/mail_template.py @@ -206,7 +206,7 @@ class MailTemplate(models.Model): "##S_LAST_NAME##": subject.last_name, "##S_ADDRESS##": subject.address, "##S_CITY##": subject.city, - "##S_COUNTRY##": subject.country, + "##S_COUNTRY##": unicode(subject.country), "##S_DIAGNOSIS_YEAR##": subject.year_of_diagnosis, "##S_DATE_ADDED##": subject.date_added.strftime(DATE_FORMAT_SHORT), "##S_DATE_BORN##": date_born, diff --git a/smash/web/models/subject.py b/smash/web/models/subject.py index 756cb960ea2bbf9ec58382fefe724bce9d4c8c7e..e87f3ab83e3f274ec8d40845e318b8d3868bf1d1 100644 --- a/smash/web/models/subject.py +++ b/smash/web/models/subject.py @@ -1,7 +1,8 @@ # coding=utf-8 from django.db import models -from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES +from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES, COUNTRY_OTHER_ID +from web.models import Country from . import Appointment, Language, Location, Visit @@ -111,9 +112,12 @@ class Subject(models.Model): blank=True, verbose_name='City' ) - country = models.CharField(max_length=50, - verbose_name='Country' - ) + country = models.ForeignKey(Country, + null=False, + blank=False, + default=COUNTRY_OTHER_ID, + verbose_name='Country' + ) screening_number = models.CharField(max_length=50, unique=True, verbose_name='Screening number', blank=False, null=False diff --git a/smash/web/templates/subjects/add.html b/smash/web/templates/subjects/add.html index fc6931871cd604134379b9e519268ee3dc2a8472..317c54e6953fe565d2e5e01216834c30228340a8 100644 --- a/smash/web/templates/subjects/add.html +++ b/smash/web/templates/subjects/add.html @@ -83,9 +83,6 @@ $.get("{% url 'web.api.cities' %}", function (data) { new Awesomplete(document.querySelector("#id_city")).list = data.cities; }); - $.get("{% url 'web.api.countries' %}", function (data) { - new Awesomplete(document.querySelector("#id_country")).list = data.countries; - }); $.get("{% url 'web.api.referrals' %}", function (data) { new Awesomplete(document.querySelector("#id_referral")).list = data.referrals; }); diff --git a/smash/web/tests/api_views/test_subject.py b/smash/web/tests/api_views/test_subject.py index b4b074f3f031cdcc26d84a5c6890ad084f0aff6f..7fafc2f84a3705ade0f09c9701f60412b022f67d 100644 --- a/smash/web/tests/api_views/test_subject.py +++ b/smash/web/tests/api_views/test_subject.py @@ -43,24 +43,6 @@ class TestApi(TestCase): self.assertTrue(city_name in cities) - def test_countries(self): - country_name = "some country" - - response = self.client.get(reverse('web.api.countries')) - self.assertEqual(response.status_code, 200) - - countries = json.loads(response.content)['countries'] - - self.assertFalse(country_name in countries) - - self.subject.country = country_name - self.subject.save() - - response = self.client.get(reverse('web.api.countries')) - countries = json.loads(response.content)['countries'] - - self.assertTrue(country_name in countries) - def test_referrals(self): referral_name = "some referral" diff --git a/smash/web/tests/forms/test_SubjectAddForm.py b/smash/web/tests/forms/test_SubjectAddForm.py index c22fee47c48f9c39f4b4a4567b5f93cf0fe73673..2cadc938002c790cce798e4ce9e33ff93fd08bd6 100644 --- a/smash/web/tests/forms/test_SubjectAddForm.py +++ b/smash/web/tests/forms/test_SubjectAddForm.py @@ -1,31 +1,22 @@ -from django.contrib.auth.models import User -from django.test import Client -from django.test import TestCase - from web.forms import SubjectAddForm, get_new_screening_number -from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL -from web.tests.functions import get_test_location, create_subject, create_worker +from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID +from web.tests import LoggedInWithWorkerTestCase +from web.tests.functions import create_subject -class SubjectAddFormTests(TestCase): +class SubjectAddFormTests(LoggedInWithWorkerTestCase): def setUp(self): - location = get_test_location() + super(SubjectAddFormTests, self).setUp() + + location = self.worker.locations.all()[0] self.sample_data = {'first_name': 'name', 'last_name': 'name', 'sex': SEX_CHOICES_MALE, 'type': SUBJECT_TYPE_CHOICES_CONTROL, 'default_location': location.id, 'screening_number': "123", - 'country': 'Luxembourg' + 'country': COUNTRY_AFGHANISTAN_ID, } - self.client = Client() - username = 'piotr' - password = 'top_secret' - self.user = User.objects.create_user( - username=username, email='jacob@bla', password=password) - self.worker = create_worker(self.user, True) - - self.client.login(username=username, password=password) def test_validation(self): form = SubjectAddForm(data=self.sample_data, user=self.user) diff --git a/smash/web/tests/forms/test_SubjectEditForm.py b/smash/web/tests/forms/test_SubjectEditForm.py index 25f2047ac34f8da86c28b130ace30aa68b3832e9..ea4e25fef50879c45cdc64852e996790551959a2 100644 --- a/smash/web/tests/forms/test_SubjectEditForm.py +++ b/smash/web/tests/forms/test_SubjectEditForm.py @@ -1,34 +1,24 @@ -from django.contrib.auth.models import User -from django.test import Client -from django.test import TestCase - from web.forms import SubjectAddForm from web.forms import SubjectEditForm from web.models import Subject -from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL -from web.tests.functions import get_test_location, create_worker +from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, COUNTRY_AFGHANISTAN_ID +from web.tests import LoggedInWithWorkerTestCase -class SubjectEditFormTests(TestCase): +class SubjectEditFormTests(LoggedInWithWorkerTestCase): def setUp(self): - location = get_test_location() + super(SubjectEditFormTests, self).setUp() + + location = self.worker.locations.all()[0] self.sample_data = {'first_name': 'name', 'last_name': 'name', 'sex': SEX_CHOICES_MALE, 'type': SUBJECT_TYPE_CHOICES_CONTROL, 'default_location': location.id, - 'country': 'Luxembourg', + 'country': COUNTRY_AFGHANISTAN_ID, 'screening_number': '123', 'nd_number': 'nd_123' } - self.client = Client() - username = 'piotr' - password = 'top_secret' - self.user = User.objects.create_user( - username=username, email='jacob@bla', password=password) - self.worker = create_worker(self.user, True) - - self.client.login(username=username, password=password) def tearDown(self): Subject.objects.all().delete() diff --git a/smash/web/tests/functions.py b/smash/web/tests/functions.py index 68a6a057725942b70ef5896bfc567225b3bb1d34..aa6ee1114a859f7df40d03b71f71c5821f22a10f 100644 --- a/smash/web/tests/functions.py +++ b/smash/web/tests/functions.py @@ -7,7 +7,7 @@ from web.models import Location, AppointmentType, Subject, Worker, Visit, Appoin ContactAttempt, FlyingTeam, Availability 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 + MONDAY_AS_DAY_OF_WEEK, COUNTRY_AFGHANISTAN_ID from web.redcap_connector import RedcapSubject from web.views.notifications import get_today_midnight_date @@ -62,7 +62,7 @@ def create_subject(subject_id=1): sex=SEX_CHOICES_MALE, type=SUBJECT_TYPE_CHOICES_CONTROL, screening_number="piotr's number" + str(subject_id), - country="france" + country_id=COUNTRY_AFGHANISTAN_ID ) diff --git a/smash/web/tests/models/test_mail_template.py b/smash/web/tests/models/test_mail_template.py index df6611fa60ba7e30d85dd82241d422b2508e3b0f..d718ba2e5ddf4a02f283ae4008d6297b831ec5b5 100644 --- a/smash/web/tests/models/test_mail_template.py +++ b/smash/web/tests/models/test_mail_template.py @@ -89,7 +89,7 @@ class MailTemplateModelTests(TestCase): doc = Document(stream) worker_name = str(self.user.worker) - self.check_doc_contains(doc, [worker_name, str(subject), subject.country, subject.nd_number, + self.check_doc_contains(doc, [worker_name, str(subject), str(subject.country), subject.nd_number, subject.get_type_display()]) def test_apply_visit(self): @@ -103,7 +103,7 @@ class MailTemplateModelTests(TestCase): doc = Document(stream) worker_name = str(self.user.worker) - self.check_doc_contains(doc, [worker_name, str(visit.subject), visit.subject.country, visit.subject.nd_number, + self.check_doc_contains(doc, [worker_name, str(visit.subject), str(visit.subject.country), visit.subject.nd_number, visit.subject.get_type_display(), visit.datetime_begin.strftime(DATE_FORMAT_SHORT), visit.datetime_end.strftime(DATE_FORMAT_SHORT)]) diff --git a/smash/web/tests/view/test_subjects.py b/smash/web/tests/view/test_subjects.py index 8c721780bb9852e2ca929198ca69515e12d90b1b..fae555669992cc0910070a1196be4faa015af6e3 100644 --- a/smash/web/tests/view/test_subjects.py +++ b/smash/web/tests/view/test_subjects.py @@ -1,27 +1,19 @@ import datetime -from django.contrib.auth.models import User -from django.test import Client -from django.test import TestCase from django.urls import reverse -from web.tests.functions import create_subject, create_visit, create_appointment, create_worker, get_test_location from web.forms import SubjectAddForm, SubjectEditForm from web.models import Subject -from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT +from web.models.constants import SEX_CHOICES_MALE, SUBJECT_TYPE_CHOICES_CONTROL, SUBJECT_TYPE_CHOICES_PATIENT, \ + COUNTRY_AFGHANISTAN_ID, COUNTRY_OTHER_ID +from web.tests import LoggedInWithWorkerTestCase +from web.tests.functions import create_subject, create_visit, create_appointment, get_test_location from web.views.notifications import get_today_midnight_date -class SubjectsViewTests(TestCase): +class SubjectsViewTests(LoggedInWithWorkerTestCase): def setUp(self): - self.client = Client() - username = 'piotr' - password = 'top_secret' - self.user = User.objects.create_user( - username=username, email='jacob@bla', password=password) - self.worker = create_worker(self.user, True) - - self.client.login(username=username, password=password) + super(SubjectsViewTests, self).setUp() def test_subjects_add(self): self.worker.save() @@ -77,10 +69,7 @@ class SubjectsViewTests(TestCase): if value is not None: form_data[key] = value - form_data["country"] = "Luxembourg" - form_data["first_name"] = "John" - form_data["last_name"] = "Doe" - form_data["sex"] = SEX_CHOICES_MALE + self.add_valid_form_data_for_subject_add(form_data) form_data["type"] = SUBJECT_TYPE_CHOICES_CONTROL form_data["default_location"] = get_test_location().id response = self.client.post(reverse('web.views.subject_add'), data=form_data) @@ -93,6 +82,14 @@ class SubjectsViewTests(TestCase): "prefix should start by L" + " as default location prefix is not defined and subject type is control") + @staticmethod + def add_valid_form_data_for_subject_add(form_data): + form_data["country"] = COUNTRY_AFGHANISTAN_ID + form_data["first_name"] = "John" + form_data["last_name"] = "Doe" + form_data["sex"] = SEX_CHOICES_MALE + form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT + def test_subjects_add_patient(self): form = SubjectAddForm(user=self.user) @@ -101,11 +98,7 @@ class SubjectsViewTests(TestCase): if value is not None: form_data[key] = value - form_data["country"] = "Luxembourg" - form_data["first_name"] = "John" - form_data["last_name"] = "Doe" - form_data["sex"] = SEX_CHOICES_MALE - form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT + self.add_valid_form_data_for_subject_add(form_data) form_data["default_location"] = get_test_location().id response = self.client.post(reverse('web.views.subject_add'), data=form_data) self.assertEqual(response.status_code, 302) @@ -117,6 +110,20 @@ class SubjectsViewTests(TestCase): "prefix should start by P" + " as default location prefix is not defined and subject type is patient") + def test_subjects_add_invalid(self): + + form = SubjectAddForm(user=self.user) + form_data = {} + for key, value in form.initial.items(): + if value is not None: + form_data[key] = value + + self.add_valid_form_data_for_subject_add(form_data) + form_data["country"] = COUNTRY_OTHER_ID + response = self.client.post(reverse('web.views.subject_add'), data=form_data) + + self.assertTrue("Invalid data" in response.content) + def test_subjects_add_with_prefixed_location(self): form = SubjectAddForm(user=self.user) @@ -125,11 +132,7 @@ class SubjectsViewTests(TestCase): if value is not None: form_data[key] = value - form_data["country"] = "Luxembourg" - form_data["first_name"] = "John" - form_data["last_name"] = "Doe" - form_data["sex"] = SEX_CHOICES_MALE - form_data["type"] = SUBJECT_TYPE_CHOICES_PATIENT + self.add_valid_form_data_for_subject_add(form_data) location = get_test_location() location.prefix = 'X' location.save() diff --git a/smash/web/views/subject.py b/smash/web/views/subject.py index 9031c0d52635fad4c8c8dc027cd2883d093886e4..09509ef2af1e53055f848353a924845ead5c4655 100644 --- a/smash/web/views/subject.py +++ b/smash/web/views/subject.py @@ -26,6 +26,9 @@ def subject_add(request): form.save() messages.add_message(request, messages.SUCCESS, 'Subject created') return redirect('web.views.subject_edit', id=form.instance.id) + else: + messages.add_message(request, messages.ERROR, 'Invalid data. Please fix data and try again.') + else: form = SubjectAddForm(user=request.user)