From 66ebdb2468665f55c3d2ff1c5d8d7e6225f920c9 Mon Sep 17 00:00:00 2001 From: AnthoniaOkafor Date: Thu, 4 Jun 2020 09:42:50 +0100 Subject: [PATCH 1/5] created responder.html file --- src/templates/responder.html | 99 +++++++++++++++++++ src/usersapp/forms.py | 2 +- .../migrations/0008_auto_20200603_1618.py | 33 +++++++ .../migrations/0009_auto_20200603_1623.py | 23 +++++ src/usersapp/models.py | 9 +- src/usersapp/urls.py | 3 +- src/usersapp/views.py | 13 ++- 7 files changed, 174 insertions(+), 8 deletions(-) create mode 100644 src/templates/responder.html create mode 100644 src/usersapp/migrations/0008_auto_20200603_1618.py create mode 100644 src/usersapp/migrations/0009_auto_20200603_1623.py diff --git a/src/templates/responder.html b/src/templates/responder.html new file mode 100644 index 0000000..4ac3b79 --- /dev/null +++ b/src/templates/responder.html @@ -0,0 +1,99 @@ + + + + + + + Document + + + + + + + + + + +

Accident Information

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in detail %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + +
Accident locationNearest LandmarkDate of AccidentTime of AccidentNumber of vehicles InvolvedVehicle typeOther vehicle (if any)Vehicles Number PlatesVehicles precrash factorsNumber of damaged vehiclesRoad GeometryRoad typeDrivers Precrash factorsCollision typeNumber of victimsNumber of injured Number of deathsCategory of victimsVictims age groupNumber of male victimsNumber of female victimsNumber of child victimsVictims current locationHospital LocationOther Location (if any)More accident info
{{item.accident_location}}{{item.nearest_landmark}}{{item.date_of_accident|date:"Y-m-d"}}{{item.time_of_accident}}{{vehicles_involved}}{{item.vehicle_type}}{{item.other_vehicle_type}}{{item.vehicles_number_plates}}{{item.vehicles_precrash_factors}}{{item.number_of_damaged_vehicles}}{{item.road_geometry}}{{item.road_type}}{{item.drivers_precrash_factors}}{{item.collision_type}}{{item.number_of_victims}}{{item.number_of_injured}}{{item.number_of_deaths}}{{item.category_of_victims}}{{item.victims_age_group}}{{item.number_of_male_victims}}{{item.number_of_female_victims}}{{item.number_of_child_victims}}{{item.victims_current_location}}{{hospital_location}}{{item.other_location}}{{item.more_accident_info}}
+ + + \ No newline at end of file diff --git a/src/usersapp/forms.py b/src/usersapp/forms.py index 8b6f98a..735659a 100644 --- a/src/usersapp/forms.py +++ b/src/usersapp/forms.py @@ -5,7 +5,7 @@ class IncidentForm(ModelForm): class Meta: model = Incident - fields = ['accident_location', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicle_precrash_factors', 'number_of_damaged_vehicles', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] + fields = ['accident_location', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicles_precrash_factors', 'number_of_damaged_vehicles', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] widgets = { 'date_of_accident': DatePickerInput(), # default date-format %m/%d/%Y will be used # 'end_date': DatePickerInput(format='%Y-%m-%d'), # specify date-frmat diff --git a/src/usersapp/migrations/0008_auto_20200603_1618.py b/src/usersapp/migrations/0008_auto_20200603_1618.py new file mode 100644 index 0000000..a90cfae --- /dev/null +++ b/src/usersapp/migrations/0008_auto_20200603_1618.py @@ -0,0 +1,33 @@ +# Generated by Django 3.0.6 on 2020-06-03 15:18 + +from django.db import migrations, models +import multiselectfield.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('usersapp', '0007_auto_20200601_2102'), + ] + + operations = [ + migrations.RemoveField( + model_name='incident', + name='vehicles_number_plates', + ), + migrations.AddField( + model_name='incident', + name='vehicle_number_plate', + field=models.CharField(blank=True, help_text='You can add more than one vehicle number plate seperated by a comma.', max_length=100, null=True), + ), + migrations.AlterField( + model_name='incident', + name='accident_location', + field=models.CharField(choices=[('FCT', 'FCT'), ('Abia', 'Abia'), ('Adamawa', 'Adamawa'), ('Akwa Ibom', 'Akwa Ibom'), ('Anambra', 'Anambra'), ('Bauchi', 'Bauchi'), ('Bayelsa', 'Bayelsa'), ('Benue', 'Benue'), ('Borno', 'Borno'), ('Cross River', 'Cross River'), ('Delta', 'Delta'), ('Ebonyi', 'Ebonyi'), ('Enugu', 'Enugu'), ('Edo', 'Edo'), ('Ekiti', 'Ekiti'), ('Gombe', 'Gombe'), ('Imo', 'Imo'), ('Jigawa', 'Jigawa'), ('Kaduna', 'Kaduna'), ('Kano', 'Kano'), ('Katsina', 'Katsina'), ('Kebbi', 'Kebbi'), ('Kogi', 'Kogi'), ('Kwara', 'Kwara'), ('Lagos', 'Lagos'), ('Nasarawa', 'Nasarawa'), ('Niger', 'Niger'), ('Ogun', 'Ogun'), ('Ondo', 'Ondo'), ('Osun', 'Osun'), ('Oyo', 'Oyo'), ('Plateau', 'Plateau'), ('Rivers', 'Rivers'), ('Sokoto', 'Sokoto'), ('Taraba', 'Taraba'), ('Yobe', 'Yobe'), ('Zamfara', 'Zamfara')], max_length=45), + ), + migrations.AlterField( + model_name='incident', + name='vehicle_type', + field=multiselectfield.db.fields.MultiSelectField(choices=[('Car saloon', 'Car saloon'), ('Microbus', 'Microbus (< 10 seater)'), ('Minibus', 'Minibus (< 15 seater)'), ('Coaster', 'Coaster (< 15 > 35 seater)'), ('Bus', 'Bus (> 35 seater)'), ('Pickup', 'Pickup'), ('SUV', 'SUV (Jeep)'), ('Light lorry', 'Light lorry (< 3.5 t)'), ('Heavy lorry', 'Heavy lorry (> 3.5 t)'), ('Tanker', 'Tanker'), ('Trailer', 'Trailer'), ('Motorcycle', 'Motorcycle'), ('Tricycle', 'Tricycle'), ('Bicycle', 'Bicycle'), ('Unknown', 'Unknown'), ('Other', 'Other')], max_length=50), + ), + ] diff --git a/src/usersapp/migrations/0009_auto_20200603_1623.py b/src/usersapp/migrations/0009_auto_20200603_1623.py new file mode 100644 index 0000000..e174ced --- /dev/null +++ b/src/usersapp/migrations/0009_auto_20200603_1623.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.6 on 2020-06-03 15:23 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('usersapp', '0008_auto_20200603_1618'), + ] + + operations = [ + migrations.RenameField( + model_name='incident', + old_name='vehicle_number_plate', + new_name='vehicles_number_plates', + ), + migrations.RenameField( + model_name='incident', + old_name='vehicle_precrash_factors', + new_name='vehicles_precrash_factors', + ), + ] diff --git a/src/usersapp/models.py b/src/usersapp/models.py index 2cb5dd3..bc16748 100644 --- a/src/usersapp/models.py +++ b/src/usersapp/models.py @@ -9,7 +9,7 @@ ('Coaster', 'Coaster (< 15 > 35 seater)'), ('Bus', 'Bus (> 35 seater)'), ('Pickup', 'Pickup'), - ('SUV', 'SUV (Jeep'), + ('SUV', 'SUV (Jeep)'), ('Light lorry', 'Light lorry (< 3.5 t)'), ('Heavy lorry', 'Heavy lorry (> 3.5 t)'), ('Tanker', 'Tanker'), @@ -148,8 +148,8 @@ class Incident(models.Model) : number_of_vehicles_involved=models.IntegerField(null=False,blank=False, db_column='vehicles involved') vehicle_type=MultiSelectField(choices=VEHICLE_CHOICES,max_length=50,null=False,blank=False) if_other_vehicle_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other vehicle type') - vehicles_number_plates=models.CharField(max_length=100,null=True,blank=True, help_text="You can add more than one vehicle number plate.") - vehicle_precrash_factors=MultiSelectField(choices=VEHICLE_PRECRASH_CHOICES,max_length=50,null=False,blank=False) + vehicles_number_plates=models.CharField(max_length=100,null=True,blank=True, help_text="You can add more than one vehicle number plate seperated by a comma.") + vehicles_precrash_factors=MultiSelectField(choices=VEHICLE_PRECRASH_CHOICES,max_length=50,null=False,blank=False) number_of_damaged_vehicles=models.IntegerField(null=False,blank=False, help_text="Number of damaged vehicles can be zero or more.") road_geometry=models.CharField(choices=GEOMETRY_CHOICES,max_length=30,null=False,blank=False) road_type=models.CharField(choices=ROAD_TYPE_CHOICES,max_length=30,null=False,blank=False) @@ -166,4 +166,5 @@ class Incident(models.Model) : victims_current_location=MultiSelectField(choices=VICTIMS_LOCATIONS,max_length=50,null=True,blank=True,help_text="If no victim, leave box unticked.") if_hospital_specify=models.CharField(max_length=50,null=True,blank=True, db_column='hospital location') if_other_location_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other location') - more_accident_info=models.TextField(blank=True,null=True) \ No newline at end of file + more_accident_info=models.TextField(blank=True,null=True) + objects = models.Manager() \ No newline at end of file diff --git a/src/usersapp/urls.py b/src/usersapp/urls.py index 0c04bf4..3b3ed0f 100644 --- a/src/usersapp/urls.py +++ b/src/usersapp/urls.py @@ -17,10 +17,11 @@ from django.urls import path #connecting incident_create to usersapp -from .views import home, incident_create +from .views import home, incident_create, responder urlpatterns = [ path('', home, name='home'), path('incident/create/', incident_create, name='incident_create'), + path('responder', responder, name='responder'), ] diff --git a/src/usersapp/views.py b/src/usersapp/views.py index e860460..895a3eb 100644 --- a/src/usersapp/views.py +++ b/src/usersapp/views.py @@ -26,8 +26,9 @@ def incident_create(request): messages.info(request, 'Thank you for reporting') return redirect('incident_create') else: - print('unable to submit') - + print('Unable to submit') + messages.info(request, 'Unable to submit, some fields cannot be empty') + #form = IncidentForm() userform = IncidentForm() @@ -37,3 +38,11 @@ def incident_create(request): #'form': form 'form': userform }) + +def responder(request): + detail=Incident.objects.all() + return render(request, + 'responder.html', + { + 'detail': detail + }) \ No newline at end of file From a8b1efdc9ce71364f12acff266460ce69a5bfa50 Mon Sep 17 00:00:00 2001 From: AnthoniaOkafor Date: Sun, 7 Jun 2020 14:10:27 +0100 Subject: [PATCH 2/5] created a filter for response team to filter user's accident report by state or by date --- src/goal3/settings.py | 4 + src/goal3/urls.py | 4 +- src/requirements.txt | Bin 397 -> 932 bytes src/templates/incident_create.html | 37 +-- src/templates/responder.html | 15 +- src/templates/search_responses.html | 27 ++ src/usersapp/filters.py | 24 ++ src/usersapp/forms.py | 2 +- ...ove_incident_number_of_damaged_vehicles.py | 17 ++ src/usersapp/models.py | 283 +++++++++--------- src/usersapp/urls.py | 5 +- src/usersapp/views.py | 21 ++ 12 files changed, 272 insertions(+), 167 deletions(-) create mode 100644 src/templates/search_responses.html create mode 100644 src/usersapp/filters.py create mode 100644 src/usersapp/migrations/0010_remove_incident_number_of_damaged_vehicles.py diff --git a/src/goal3/settings.py b/src/goal3/settings.py index a12710c..47a50ae 100644 --- a/src/goal3/settings.py +++ b/src/goal3/settings.py @@ -48,6 +48,7 @@ 'rest_framework', 'bootstrap4', 'bootstrap_datepicker_plus', + 'tz_detect', ] # Creating Bootstrap4 block and turning jquery to true @@ -55,6 +56,8 @@ 'include_jquery': True, } +import django + MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -63,6 +66,7 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'tz_detect.middleware.TimezoneMiddleware', ] ROOT_URLCONF = 'goal3.urls' diff --git a/src/goal3/urls.py b/src/goal3/urls.py index 7d6cea5..22d19b5 100644 --- a/src/goal3/urls.py +++ b/src/goal3/urls.py @@ -14,9 +14,11 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path, include +from django.urls import path, re_path, include urlpatterns = [ path('', include('usersapp.urls')), path('admin/', admin.site.urls), + #using 're-path' instead of 'url' + re_path(r'^tz_detect/', include('tz_detect.urls')), ] diff --git a/src/requirements.txt b/src/requirements.txt index 644c8b22eb96b1c485b74198f27ca1ff9d760558..44a02412a6353c290c3321b339e9908c3f1390cd 100644 GIT binary patch literal 932 zcma))%~HZZ5QOJ!m5+i&Ku{0fe31|W0)fO3Kh8J&^v>doR+*gF_hmU757tt7v!^RJqevqk&V#CUg_U? zDtZk$=l82t(z}abUs{zRGa_p_*`slCB(m2AkxBQS#mJc)d&oz>`wf>Bd)7?)-c;#D Yb`2i4aJmeVUiZ=OrfN6r?!N2%0_G2llmGw# literal 397 zcmZXQL3YC+3`FQ5^3ylhea+RE1 zr&ZCtc1^>D5jtgh?qVT{7w_GGLOio!D!ZpN8)^Lxy-IrwD^m>gV0fxuwCa&6uJKj+R0()zy5W1Uc#Fy9a=39yRcVO_M#Kjnh@GStPv5@|dny0` diff --git a/src/templates/incident_create.html b/src/templates/incident_create.html index 76dd78f..6cc7a9b 100644 --- a/src/templates/incident_create.html +++ b/src/templates/incident_create.html @@ -3,22 +3,25 @@ {% bootstrap_javascript jquery='full' %} {# Embed Bootstrap JS+jQuery #} -
-

Accident Form

-

It is our collective responsibility to report an accident. By reporting accidents, relevant agencies monitor problems and identify their root causes. Reporting road accidents enable actions to be taken to reduce future ocurrences, and at LifeShield it takes about 5 minutes to report an accident.

-
- {% csrf_token %} - {% bootstrap_form form %} - {{ form.media }} {# Adds date-picker required JS and CSS #} - {% buttons %} - - {% endbuttons %} -
+
+
+

Accident Form

+

It is our collective responsibility to report an accident. By reporting accidents, relevant agencies monitor problems and identify their root causes. Reporting road accidents enable actions to be taken to reduce future ocurrences, and at LifeShield it takes about 5 minutes to report an accident.

+
+ {% csrf_token %} + {% bootstrap_form form %} + {{ form.media }} {# Adds date-picker required JS and CSS #} + {% buttons %} + + {% endbuttons %} +
-
- {% for message in messages %} -

{{message}}

- {% endfor %} -
+
+ {% for message in messages %} +

{{message}}

+ {% endfor %} + +
+
\ No newline at end of file diff --git a/src/templates/responder.html b/src/templates/responder.html index 4ac3b79..3f4875c 100644 --- a/src/templates/responder.html +++ b/src/templates/responder.html @@ -26,11 +26,6 @@ - - - - -

Accident Information

@@ -66,8 +61,13 @@

Accident Information

- + + + @@ -95,5 +95,8 @@

Accident Information

{{item.accident_location}} {{item.nearest_landmark}}{{item.date_of_accident|date:"Y-m-d"}}{{item.date_of_accident|date:"Y-m-d"}} {{item.time_of_accident}}{{vehicles_involved}} {{item.vehicle_type}} {{item.other_vehicle_type}}
+{% load tz_detect %} +{% tz_detect %} + \ No newline at end of file diff --git a/src/templates/search_responses.html b/src/templates/search_responses.html new file mode 100644 index 0000000..41c5e9d --- /dev/null +++ b/src/templates/search_responses.html @@ -0,0 +1,27 @@ +{% load bootstrap4 %} {# import bootstrap4 #} +{% bootstrap_css %} {# Embed Bootstrap CSS #} +{% bootstrap_javascript jquery='full' %} {# Embed Bootstrap JS+jQuery #} + + +
+
+

Accident Search

+
+ {% bootstrap_form filter.form %} + {{ form.media }} {# Adds date-picker required JS and CSS #} + {% buttons %} + + Reset + {% endbuttons %} + + +
+ +
    + {% for response in filter.qs %} +
  • {{ response.accident_location }} - {{ response.nearest_landmark }} - {{ response.time_of_accident }} - {{ response.date_of_accident }} - {{response.vehicles_number_plates}} - {{response.vehicles_precrash_factors}} - {{response.road_geometry}} - {{response.road_type}} - {{response.driver_precrash_factors}} - {{response.collision_type}} - {{response.number_of_victims}} - {{response.number_of_injured}} - {{response.number_of_deaths}} {{response.vehicle_type}}
  • + {% endfor %} +
+ +
+
\ No newline at end of file diff --git a/src/usersapp/filters.py b/src/usersapp/filters.py new file mode 100644 index 0000000..7239ba8 --- /dev/null +++ b/src/usersapp/filters.py @@ -0,0 +1,24 @@ +from .models import Incident +from django.contrib.auth.models import Group +from django import forms +import django_filters + +''' +class ResponsesFilter(django_filters.FilterSet): + class Meta: + model = Incident + fields = ['accident_location', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location'] +''' + +class ResponsesFilter(django_filters.FilterSet): + month_of_accident = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='month') + month_of_accident_gte = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='month__gte') + month_of_accident_lte = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='month__lte') + year_of_accident = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='year') + year_of_accident_gte = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='year__gte') + year_of_accident_lte = django_filters.NumberFilter(field_name='date_of_accident', lookup_expr='year__lte') + #vehicles_precrash_factors = django_filters.CharFilter(lookup_expr='icontains') + class Meta: + model = Incident + #fields = ['accident_location', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'victims_current_location'] + fields = ['accident_location'] diff --git a/src/usersapp/forms.py b/src/usersapp/forms.py index 735659a..07dd1d2 100644 --- a/src/usersapp/forms.py +++ b/src/usersapp/forms.py @@ -5,7 +5,7 @@ class IncidentForm(ModelForm): class Meta: model = Incident - fields = ['accident_location', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicles_precrash_factors', 'number_of_damaged_vehicles', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] + fields = ['accident_location', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] widgets = { 'date_of_accident': DatePickerInput(), # default date-format %m/%d/%Y will be used # 'end_date': DatePickerInput(format='%Y-%m-%d'), # specify date-frmat diff --git a/src/usersapp/migrations/0010_remove_incident_number_of_damaged_vehicles.py b/src/usersapp/migrations/0010_remove_incident_number_of_damaged_vehicles.py new file mode 100644 index 0000000..710ee20 --- /dev/null +++ b/src/usersapp/migrations/0010_remove_incident_number_of_damaged_vehicles.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.6 on 2020-06-07 11:52 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('usersapp', '0009_auto_20200603_1623'), + ] + + operations = [ + migrations.RemoveField( + model_name='incident', + name='number_of_damaged_vehicles', + ), + ] diff --git a/src/usersapp/models.py b/src/usersapp/models.py index bc16748..c11b240 100644 --- a/src/usersapp/models.py +++ b/src/usersapp/models.py @@ -3,157 +3,159 @@ # Create your models here. -VEHICLE_CHOICES = (('Car saloon', 'Car saloon'), - ('Microbus', 'Microbus (< 10 seater)'), - ('Minibus', 'Minibus (< 15 seater)'), - ('Coaster', 'Coaster (< 15 > 35 seater)'), - ('Bus', 'Bus (> 35 seater)'), - ('Pickup', 'Pickup'), - ('SUV', 'SUV (Jeep)'), - ('Light lorry', 'Light lorry (< 3.5 t)'), - ('Heavy lorry', 'Heavy lorry (> 3.5 t)'), - ('Tanker', 'Tanker'), - ('Trailer', 'Trailer'), - ('Motorcycle', 'Motorcycle'), - ('Tricycle', 'Tricycle'), - ('Bicycle', 'Bicycle'), - ('Unknown', 'Unknown'), - ('Other', 'Other')) - -VEHICLE_PRECRASH_CHOICES = (('Tyre burst', 'Tyre burst'), - ('Mechanical deficiency', 'Mechanical deficiency'), - ('Overloaded', 'Overloaded'), - ('Defective light', 'Defective light'), - ('Nothing notable', 'Nothing notable')) - -DRIVER_PRECRASH_CHOICES = (('Nothing notable', 'Nothing notable'), - ('Fatigue/Sleepiness', 'Fatigue/Sleepiness'), - ('Sudden illness', 'Sudden illness'), - ('Speeding', 'Speeding'), - ('Careless overtaking', 'Careless overtaking'), - ('Tailgating', 'Tailgating'), - ('Sudden turn', 'Sudden turn'), - ('risktaking', 'Other calculated risktaking'), - ('phone while driving', 'Use of phone while driving'), - ('Alcohol', 'Influence of alcohol'), - ('Drug', 'Influence of drug'), - ('Other distractions', 'Other distractions/inattentiveness')) - -VICTIM_CATEGORY = (('Driver', 'Driver'), - ('Passenger', 'Passenger'), - ('Motorcycle', 'Motorcyclist'), - ('Tricyclist', 'Tricyclist'), - ('Bicyclist', 'Bicyclist'), - ('Pedestrian', 'Pedestrian')) - -VICTIM_AGE_GROUP= (('Baby', 'Baby'), - ('Toddler', 'Toddler'), - ('Child', 'Child'), - ('Teenager', 'Teenager'), - ('Adult', 'Adult'), - ('Middle aged', 'Middle aged'), - ('Elderly', 'Elderly')) -LOCATIONS = ((1, 'Accident Scene'), - (2, 'Hospital'), - (3, 'Other')) - -LOCATIONS = ((1, 'Accident Scene'), -(2, 'Hospital'), -(3, 'Other')) - - -VICTIMS_LOCATIONS = ((1, 'Accident Scene'), - (2, 'Hospital'), - (3, 'Other')) - -USER_LOCATION = [ - ('FCT', 'FCT'), - ('Abia', 'Abia'), - ('Adamawa', 'Adamawa'), - ('Akwa Ibom', 'Akwa Ibom'), - ('Anambra', 'Anambra'), - ('Bauchi', 'Bauchi'), - ('Bayelsa', 'Bayelsa'), - ('Benue','Benue'), - ('Borno', 'Borno'), - ('Cross River', 'Cross River'), - ('Delta', 'Delta'), - ('Ebonyi', 'Ebonyi'), - ('Enugu', 'Enugu'), - ('Edo', 'Edo'), - ('Ekiti', 'Ekiti'), - ('Gombe', 'Gombe'), - ('Imo', 'Imo'), - ('Jigawa', 'Jigawa'), - ('Kaduna', 'Kaduna'), - ('Kano', 'Kano'), - ('Katsina', 'Katsina'), - ('Kebbi', 'Kebbi'), - ('Kogi', 'Kogi'), - ('Kwara', 'Kwara'), - ('Lagos', 'Lagos'), - ('Nasarawa', 'Nasarawa'), - ('Niger', 'Niger'), - ('Ogun', 'Ogun'), - ('Ondo', 'Ondo'), - ('Osun', 'Osun'), - ('Oyo', 'Oyo'), - ('Plateau', 'Plateau'), - ('Rivers', 'Rivers'), - ('Sokoto', 'Sokoto'), - ('Taraba', 'Taraba'), - ('Yobe', 'Yobe'), - ('Zamfara', 'Zamfara') -] - -GEOMETRY_CHOICES = [ - ('Straight road', 'Straight road'), - ('Curve', 'Curve'), - ('Roundabout', 'Roundabout'), - ('T-junction', 'T-junction'), - ('Y-junction', 'Y-junction'), - ('+-junction', '+-junction'), - ('Bridge', 'Bridge'), - ('Road works', 'Road works'), - ('Other', 'Other') -] - -ROAD_TYPE_CHOICES = [ - ('Dual carriageway', 'Dual carriageway'), - ('Single carriageway', 'Single carriageway'), - ('Expressway', 'Expressway'), - ('Street', 'Street'), - ('Other', 'Other') -] - -COLLISION_CHOICES = [ - ('Mv/mv head on', 'Moving vehicles, head on'), - ('Mv/mv rear end', 'Moving vehicles, rear end'), - ('Mv/mv intersecting', 'Moving vehicles, intersecting'), - ('Mv/mv overtake', 'Moving vehicles, overtake'), - ('Mv/mv turn', 'Moving vehicles, turn'), - ('Single mv hit object', 'Single moving vehicle, hit object'), - ('Single mv run off', 'Single moving vehicle, run off'), - ('Single mv falling off', 'Single moving vehicle, falling off'), - ('Mv/pedestrian', 'Moving vehicle with pedestrian'), - ('Mv/bicyclist', 'Moving vehicle with pedestrian'), - ('Other', 'Other') -] + class Incident(models.Model) : + + VEHICLE_CHOICES = (('Car saloon', 'Car saloon'), + ('Microbus', 'Microbus (< 10 seater)'), + ('Minibus', 'Minibus (< 15 seater)'), + ('Coaster', 'Coaster (< 15 > 35 seater)'), + ('Bus', 'Bus (> 35 seater)'), + ('Pickup', 'Pickup'), + ('SUV', 'SUV (Jeep)'), + ('Light lorry', 'Light lorry (< 3.5 t)'), + ('Heavy lorry', 'Heavy lorry (> 3.5 t)'), + ('Tanker', 'Tanker'), + ('Trailer', 'Trailer'), + ('Motorcycle', 'Motorcycle'), + ('Tricycle', 'Tricycle'), + ('Bicycle', 'Bicycle'), + ('Unknown', 'Unknown'), + ('Other', 'Other')) + + VEHICLE_PRECRASH_CHOICES = (('Tyre burst', 'Tyre burst'), + ('Mechanical deficiency', 'Mechanical deficiency'), + ('Overloaded', 'Overloaded'), + ('Defective light', 'Defective light'), + ('Nothing notable', 'Nothing notable')) + + DRIVER_PRECRASH_CHOICES = (('Nothing notable', 'Nothing notable'), + ('Fatigue/Sleepiness', 'Fatigue/Sleepiness'), + ('Sudden illness', 'Sudden illness'), + ('Speeding', 'Speeding'), + ('Careless overtaking', 'Careless overtaking'), + ('Tailgating', 'Tailgating'), + ('Sudden turn', 'Sudden turn'), + ('risktaking', 'Other calculated risktaking'), + ('phone while driving', 'Use of phone while driving'), + ('Alcohol', 'Influence of alcohol'), + ('Drug', 'Influence of drug'), + ('Other distractions', 'Other distractions/inattentiveness')) + + VICTIM_CATEGORY = (('Driver', 'Driver'), + ('Passenger', 'Passenger'), + ('Motorcycle', 'Motorcyclist'), + ('Tricyclist', 'Tricyclist'), + ('Bicyclist', 'Bicyclist'), + ('Pedestrian', 'Pedestrian')) + + VICTIM_AGE_GROUP= (('Baby', 'Baby'), + ('Toddler', 'Toddler'), + ('Child', 'Child'), + ('Teenager', 'Teenager'), + ('Adult', 'Adult'), + ('Middle aged', 'Middle aged'), + ('Elderly', 'Elderly')) + LOCATIONS = ((1, 'Accident Scene'), + (2, 'Hospital'), + (3, 'Other')) + + LOCATIONS = ((1, 'Accident Scene'), + (2, 'Hospital'), + (3, 'Other')) + + + VICTIMS_LOCATIONS = ((1, 'Accident Scene'), + (2, 'Hospital'), + (3, 'Other')) + + USER_LOCATION = [ + ('FCT', 'FCT'), + ('Abia', 'Abia'), + ('Adamawa', 'Adamawa'), + ('Akwa Ibom', 'Akwa Ibom'), + ('Anambra', 'Anambra'), + ('Bauchi', 'Bauchi'), + ('Bayelsa', 'Bayelsa'), + ('Benue','Benue'), + ('Borno', 'Borno'), + ('Cross River', 'Cross River'), + ('Delta', 'Delta'), + ('Ebonyi', 'Ebonyi'), + ('Enugu', 'Enugu'), + ('Edo', 'Edo'), + ('Ekiti', 'Ekiti'), + ('Gombe', 'Gombe'), + ('Imo', 'Imo'), + ('Jigawa', 'Jigawa'), + ('Kaduna', 'Kaduna'), + ('Kano', 'Kano'), + ('Katsina', 'Katsina'), + ('Kebbi', 'Kebbi'), + ('Kogi', 'Kogi'), + ('Kwara', 'Kwara'), + ('Lagos', 'Lagos'), + ('Nasarawa', 'Nasarawa'), + ('Niger', 'Niger'), + ('Ogun', 'Ogun'), + ('Ondo', 'Ondo'), + ('Osun', 'Osun'), + ('Oyo', 'Oyo'), + ('Plateau', 'Plateau'), + ('Rivers', 'Rivers'), + ('Sokoto', 'Sokoto'), + ('Taraba', 'Taraba'), + ('Yobe', 'Yobe'), + ('Zamfara', 'Zamfara') + ] + + GEOMETRY_CHOICES = [ + ('Straight road', 'Straight road'), + ('Curve', 'Curve'), + ('Roundabout', 'Roundabout'), + ('T-junction', 'T-junction'), + ('Y-junction', 'Y-junction'), + ('+-junction', '+-junction'), + ('Bridge', 'Bridge'), + ('Road works', 'Road works'), + ('Other', 'Other') + ] + + ROAD_TYPE_CHOICES = [ + ('Dual carriageway', 'Dual carriageway'), + ('Single carriageway', 'Single carriageway'), + ('Expressway', 'Expressway'), + ('Street', 'Street'), + ('Other', 'Other') + ] + + COLLISION_CHOICES = [ + ('Mv/mv head on', 'Moving vehicles, head on'), + ('Mv/mv rear end', 'Moving vehicles, rear end'), + ('Mv/mv intersecting', 'Moving vehicles, intersecting'), + ('Mv/mv overtake', 'Moving vehicles, overtake'), + ('Mv/mv turn', 'Moving vehicles, turn'), + ('Single mv hit object', 'Single moving vehicle, hit object'), + ('Single mv run off', 'Single moving vehicle, run off'), + ('Single mv falling off', 'Single moving vehicle, falling off'), + ('Mv/pedestrian', 'Moving vehicle with pedestrian'), + ('Mv/bicyclist', 'Moving vehicle with pedestrian'), + ('Other', 'Other') + ] + accident_location=models.CharField(choices=USER_LOCATION,max_length=45,null=False,blank=False) nearest_landmark=models.CharField(max_length=50,null=True,blank=True, help_text="By landmark we mean somewhere notable such as bustop, market, hotel, hospital etc.") date_of_accident=models.DateField(auto_now=False) time_of_accident=models.TimeField(auto_now=False) - number_of_vehicles_involved=models.IntegerField(null=False,blank=False, db_column='vehicles involved') + number_of_vehicles_involved=models.IntegerField(null=False,blank=False, db_column='vehicles involved', help_text="Number of vehicles can be zero or more.") vehicle_type=MultiSelectField(choices=VEHICLE_CHOICES,max_length=50,null=False,blank=False) if_other_vehicle_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other vehicle type') vehicles_number_plates=models.CharField(max_length=100,null=True,blank=True, help_text="You can add more than one vehicle number plate seperated by a comma.") - vehicles_precrash_factors=MultiSelectField(choices=VEHICLE_PRECRASH_CHOICES,max_length=50,null=False,blank=False) - number_of_damaged_vehicles=models.IntegerField(null=False,blank=False, help_text="Number of damaged vehicles can be zero or more.") + vehicles_precrash_factors=MultiSelectField(choices=VEHICLE_PRECRASH_CHOICES,max_length=50,null=False,blank=False, help_text="This field is required") road_geometry=models.CharField(choices=GEOMETRY_CHOICES,max_length=30,null=False,blank=False) road_type=models.CharField(choices=ROAD_TYPE_CHOICES,max_length=30,null=False,blank=False) - driver_precrash_factors=MultiSelectField(choices=DRIVER_PRECRASH_CHOICES,max_length=50,null=False,blank=False) + driver_precrash_factors=MultiSelectField(choices=DRIVER_PRECRASH_CHOICES,max_length=50,null=False,blank=False, help_text="This field is required") collision_type=models.CharField(choices=COLLISION_CHOICES,max_length=70,null=False,blank=False) number_of_victims=models.IntegerField(null=False,blank=False, help_text="Number of victims can be zero or more.") number_of_injured=models.IntegerField(null=False,blank=False, help_text="Number of injured can be zero or more.") @@ -167,4 +169,5 @@ class Incident(models.Model) : if_hospital_specify=models.CharField(max_length=50,null=True,blank=True, db_column='hospital location') if_other_location_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other location') more_accident_info=models.TextField(blank=True,null=True) + #calling objects used in responder function from views.py objects = models.Manager() \ No newline at end of file diff --git a/src/usersapp/urls.py b/src/usersapp/urls.py index 3b3ed0f..07568f0 100644 --- a/src/usersapp/urls.py +++ b/src/usersapp/urls.py @@ -14,14 +14,15 @@ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.urls import path +from django.urls import path, re_path #connecting incident_create to usersapp -from .views import home, incident_create, responder +from .views import home, incident_create, responder, search_responses urlpatterns = [ path('', home, name='home'), path('incident/create/', incident_create, name='incident_create'), path('responder', responder, name='responder'), + path('search/responses/', search_responses, name='search_responses'), ] diff --git a/src/usersapp/views.py b/src/usersapp/views.py index 895a3eb..ce65a3e 100644 --- a/src/usersapp/views.py +++ b/src/usersapp/views.py @@ -1,9 +1,14 @@ +import pytz +from django.utils import timezone + from django.shortcuts import render, redirect from django.contrib import messages from .forms import IncidentForm from .models import Incident from django.views.decorators.http import require_POST +from .filters import ResponsesFilter + # Create your views here. # add a new view function called incident_create def home (request): @@ -40,9 +45,25 @@ def incident_create(request): }) def responder(request): + #detail=Incident.objects.all().filter(accident_location__exact='Adamawa') detail=Incident.objects.all() return render(request, 'responder.html', { 'detail': detail + }) + + +#datetz = Incident.objects.filter('date_of_accident') +#timetz = Incident.objects.filter('time_of_accident') + + +#writing a function for ResponsesFilter in filters.py +def search_responses(request): + responses = Incident.objects.all() + response_filter = ResponsesFilter(request.GET, queryset=responses) + # has_filter = any(field in request.GET for field in set(response_filter.get_fields())) + return render(request, + 'search_responses.html', + {'filter': response_filter }) \ No newline at end of file From 37a4423c175e4b9ffe710a85576e36d8b2a85bbe Mon Sep 17 00:00:00 2001 From: AnthoniaOkafor Date: Sun, 7 Jun 2020 17:29:40 +0100 Subject: [PATCH 3/5] added validations to models.py --- src/templates/incident_create.html | 2 +- src/usersapp/filters.py | 3 +- src/usersapp/forms.py | 2 +- .../migrations/0011_auto_20200607_1614.py | 65 +++++++++++++++++++ src/usersapp/models.py | 58 ++++++++++++++--- src/usersapp/views.py | 5 +- 6 files changed, 118 insertions(+), 17 deletions(-) create mode 100644 src/usersapp/migrations/0011_auto_20200607_1614.py diff --git a/src/templates/incident_create.html b/src/templates/incident_create.html index 6cc7a9b..d1ea549 100644 --- a/src/templates/incident_create.html +++ b/src/templates/incident_create.html @@ -6,7 +6,7 @@

Accident Form

-

It is our collective responsibility to report an accident. By reporting accidents, relevant agencies monitor problems and identify their root causes. Reporting road accidents enable actions to be taken to reduce future ocurrences, and at LifeShield it takes about 5 minutes to report an accident.

+

It is our collective responsibility to report an accident. By reporting accidents, relevant agencies monitor problems and identify their root causes. Reporting road accidents enable actions to be taken to reduce future ocurrences, and at LifeShield it takes less than 5 minutes to report an accident.

{% csrf_token %} diff --git a/src/usersapp/filters.py b/src/usersapp/filters.py index 7239ba8..d2a0341 100644 --- a/src/usersapp/filters.py +++ b/src/usersapp/filters.py @@ -1,5 +1,4 @@ from .models import Incident -from django.contrib.auth.models import Group from django import forms import django_filters @@ -7,7 +6,7 @@ class ResponsesFilter(django_filters.FilterSet): class Meta: model = Incident - fields = ['accident_location', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location'] + fields = ['accident_location', 'local_government_area', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location'] ''' class ResponsesFilter(django_filters.FilterSet): diff --git a/src/usersapp/forms.py b/src/usersapp/forms.py index 07dd1d2..4ea7fed 100644 --- a/src/usersapp/forms.py +++ b/src/usersapp/forms.py @@ -5,7 +5,7 @@ class IncidentForm(ModelForm): class Meta: model = Incident - fields = ['accident_location', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] + fields = ['accident_location', 'local_government_area', 'nearest_landmark', 'date_of_accident', 'time_of_accident', 'number_of_vehicles_involved', 'vehicle_type', 'if_other_vehicle_specify', 'vehicles_number_plates', 'vehicles_precrash_factors', 'road_geometry', 'road_type', 'driver_precrash_factors', 'collision_type', 'number_of_victims', 'number_of_injured', 'number_of_deaths', 'category_of_victims', 'victims_age_group', 'number_of_male_victims', 'number_of_female_victims', 'number_of_child_victims', 'victims_current_location', 'if_hospital_specify', 'if_other_location_specify', 'more_accident_info'] widgets = { 'date_of_accident': DatePickerInput(), # default date-format %m/%d/%Y will be used # 'end_date': DatePickerInput(format='%Y-%m-%d'), # specify date-frmat diff --git a/src/usersapp/migrations/0011_auto_20200607_1614.py b/src/usersapp/migrations/0011_auto_20200607_1614.py new file mode 100644 index 0000000..0d7af11 --- /dev/null +++ b/src/usersapp/migrations/0011_auto_20200607_1614.py @@ -0,0 +1,65 @@ +# Generated by Django 3.0.6 on 2020-06-07 15:14 + +from django.db import migrations, models +import multiselectfield.db.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('usersapp', '0010_remove_incident_number_of_damaged_vehicles'), + ] + + operations = [ + migrations.AddField( + model_name='incident', + name='local_government_area', + field=models.CharField(db_column='LGA', default=0, max_length=25), + preserve_default=False, + ), + migrations.AlterField( + model_name='incident', + name='driver_precrash_factors', + field=multiselectfield.db.fields.MultiSelectField(choices=[('Nothing notable', 'Nothing notable'), ('Fatigue/Sleepiness', 'Fatigue/Sleepiness'), ('Sudden illness', 'Sudden illness'), ('Speeding', 'Speeding'), ('Careless overtaking', 'Careless overtaking'), ('Tailgating', 'Tailgating'), ('Sudden turn', 'Sudden turn'), ('risktaking', 'Other calculated risktaking'), ('phone while driving', 'Use of phone while driving'), ('Alcohol', 'Influence of alcohol'), ('Drug', 'Influence of drug'), ('Other distractions', 'Other distractions/inattentiveness')], help_text='This field is required', max_length=50), + ), + migrations.AlterField( + model_name='incident', + name='number_of_child_victims', + field=models.PositiveIntegerField(help_text='Number of child victims can be zero or more'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_deaths', + field=models.PositiveIntegerField(help_text='Number of dead can be zero or more.'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_female_victims', + field=models.PositiveIntegerField(help_text='Number of female victims can be zero or more'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_injured', + field=models.PositiveIntegerField(help_text='Number of injured can be zero or more.'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_male_victims', + field=models.PositiveIntegerField(help_text='Number of male victims can be zero or more.'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_vehicles_involved', + field=models.PositiveIntegerField(db_column='vehicles involved', help_text='Number of vehicles can be zero or more.'), + ), + migrations.AlterField( + model_name='incident', + name='number_of_victims', + field=models.PositiveIntegerField(help_text='Number of victims can be zero or more.'), + ), + migrations.AlterField( + model_name='incident', + name='vehicles_precrash_factors', + field=multiselectfield.db.fields.MultiSelectField(choices=[('Tyre burst', 'Tyre burst'), ('Mechanical deficiency', 'Mechanical deficiency'), ('Overloaded', 'Overloaded'), ('Defective light', 'Defective light'), ('Nothing notable', 'Nothing notable')], help_text='This field is required', max_length=50), + ), + ] diff --git a/src/usersapp/models.py b/src/usersapp/models.py index c11b240..b8f7e80 100644 --- a/src/usersapp/models.py +++ b/src/usersapp/models.py @@ -1,5 +1,8 @@ from django.db import models from multiselectfield import MultiSelectField +from django.core.exceptions import ValidationError +import pytz +from datetime import date # Create your models here. @@ -145,10 +148,11 @@ class Incident(models.Model) : ] accident_location=models.CharField(choices=USER_LOCATION,max_length=45,null=False,blank=False) + local_government_area=models.CharField(max_length=25,null=False,blank=False, db_column='LGA') nearest_landmark=models.CharField(max_length=50,null=True,blank=True, help_text="By landmark we mean somewhere notable such as bustop, market, hotel, hospital etc.") date_of_accident=models.DateField(auto_now=False) time_of_accident=models.TimeField(auto_now=False) - number_of_vehicles_involved=models.IntegerField(null=False,blank=False, db_column='vehicles involved', help_text="Number of vehicles can be zero or more.") + number_of_vehicles_involved=models.PositiveIntegerField(null=False,blank=False, db_column='vehicles involved', help_text="Number of vehicles can be zero or more.") vehicle_type=MultiSelectField(choices=VEHICLE_CHOICES,max_length=50,null=False,blank=False) if_other_vehicle_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other vehicle type') vehicles_number_plates=models.CharField(max_length=100,null=True,blank=True, help_text="You can add more than one vehicle number plate seperated by a comma.") @@ -157,17 +161,53 @@ class Incident(models.Model) : road_type=models.CharField(choices=ROAD_TYPE_CHOICES,max_length=30,null=False,blank=False) driver_precrash_factors=MultiSelectField(choices=DRIVER_PRECRASH_CHOICES,max_length=50,null=False,blank=False, help_text="This field is required") collision_type=models.CharField(choices=COLLISION_CHOICES,max_length=70,null=False,blank=False) - number_of_victims=models.IntegerField(null=False,blank=False, help_text="Number of victims can be zero or more.") - number_of_injured=models.IntegerField(null=False,blank=False, help_text="Number of injured can be zero or more.") - number_of_deaths=models.IntegerField(null=False,blank=False, help_text="Number of dead can be zero or more.") + number_of_victims=models.PositiveIntegerField(null=False,blank=False, help_text="Number of victims can be zero or more.") + number_of_injured=models.PositiveIntegerField(null=False,blank=False, help_text="Number of injured can be zero or more.") + number_of_deaths=models.PositiveIntegerField(null=False,blank=False, help_text="Number of dead can be zero or more.") category_of_victims=MultiSelectField(choices=VICTIM_CATEGORY,max_length=40,null=True,blank=True, help_text="If no victim, leave boxes unticked.") victims_age_group=MultiSelectField(choices=VICTIM_AGE_GROUP,max_length=50,null=True,blank=True,help_text="If no victim, leave boxes unticked.") - number_of_male_victims=models.IntegerField(null=False,blank=False, help_text="Number of male victims can be zero or more.") - number_of_female_victims=models.IntegerField(null=False,blank=False, help_text="Number of female victims can be zero or more") - number_of_child_victims=models.IntegerField(null=False,blank=False, help_text="Number of child victims can be zero or more") + number_of_male_victims=models.PositiveIntegerField(null=False,blank=False, help_text="Number of male victims can be zero or more.") + number_of_female_victims=models.PositiveIntegerField(null=False,blank=False, help_text="Number of female victims can be zero or more") + number_of_child_victims=models.PositiveIntegerField(null=False,blank=False, help_text="Number of child victims can be zero or more") victims_current_location=MultiSelectField(choices=VICTIMS_LOCATIONS,max_length=50,null=True,blank=True,help_text="If no victim, leave box unticked.") if_hospital_specify=models.CharField(max_length=50,null=True,blank=True, db_column='hospital location') if_other_location_specify=models.CharField(max_length=50,null=True,blank=True, db_column='other location') more_accident_info=models.TextField(blank=True,null=True) - #calling objects used in responder function from views.py - objects = models.Manager() \ No newline at end of file + #calling objects used in responder and search_responses function from views.py + objects = models.Manager() + + #writing validation function + def clean(self) -> None: + today = date.today() + if self.date_of_accident > today: + raise ValidationError( + 'Date of accident cannot be in the future' + ) + + if self.number_of_injured > self.number_of_victims: + raise ValidationError( + 'Number of injured cannot be greater than number of victims' + ) + if self.number_of_deaths > self.number_of_victims: + raise ValidationError( + 'Number of deaths cannot be greater than number of victims' + ) + + if (self.number_of_injured + self.number_of_deaths) > self.number_of_victims: + raise ValidationError( + 'Number of injured and deaths cannot be greater than number of victims' + ) + + if self.vehicle_type == '': + raise ValidationError( + 'Vehicle type cannot be empty' + ) + + if self.vehicles_precrash_factors == '': + raise ValidationError( + 'Vehicles precrash factors cannot be empty' + ) + if self.driver_precrash_factors == '': + raise ValidationError( + 'Driver precrash factors cannot be empty' + ) \ No newline at end of file diff --git a/src/usersapp/views.py b/src/usersapp/views.py index ce65a3e..c566ec8 100644 --- a/src/usersapp/views.py +++ b/src/usersapp/views.py @@ -32,7 +32,7 @@ def incident_create(request): return redirect('incident_create') else: print('Unable to submit') - messages.info(request, 'Unable to submit, some fields cannot be empty') + #messages.info(request, 'Unable to submit, some fields cannot be empty') #form = IncidentForm() userform = IncidentForm() @@ -54,9 +54,6 @@ def responder(request): }) -#datetz = Incident.objects.filter('date_of_accident') -#timetz = Incident.objects.filter('time_of_accident') - #writing a function for ResponsesFilter in filters.py def search_responses(request): From 3df57b1987626cea20c1022aaec79655e02264b0 Mon Sep 17 00:00:00 2001 From: AnthoniaOkafor Date: Mon, 8 Jun 2020 15:08:54 +0100 Subject: [PATCH 4/5] added more validations --- src/usersapp/models.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/src/usersapp/models.py b/src/usersapp/models.py index b8f7e80..3044518 100644 --- a/src/usersapp/models.py +++ b/src/usersapp/models.py @@ -143,7 +143,8 @@ class Incident(models.Model) : ('Single mv run off', 'Single moving vehicle, run off'), ('Single mv falling off', 'Single moving vehicle, falling off'), ('Mv/pedestrian', 'Moving vehicle with pedestrian'), - ('Mv/bicyclist', 'Moving vehicle with pedestrian'), + ('Mv/motorcyclist', 'Moving vehicle with motorcyclist'), + ('Mv/bicyclist', 'Moving vehicle with bicyclist'), ('Other', 'Other') ] @@ -210,4 +211,32 @@ def clean(self) -> None: if self.driver_precrash_factors == '': raise ValidationError( 'Driver precrash factors cannot be empty' - ) \ No newline at end of file + ) + if self.number_of_male_victims > self.number_of_victims: + raise ValidationError( + 'Number of male victims cannot be greater than number of victims' + ) + if self.number_of_female_victims > self.number_of_victims: + raise ValidationError( + 'Number of female victims cannot be greater than number of victims' + ) + if self.number_of_child_victims > self.number_of_victims: + raise ValidationError( + 'Number of child victims cannot be greater than number of victims' + ) + if (self.number_of_male_victims + self.number_of_female_victims) > self.number_of_victims: + raise ValidationError( + 'Sum of male and female victims cannot be greater than number of victims' + ) + if (self.number_of_male_victims + self.number_of_child_victims) > self.number_of_victims: + raise ValidationError( + 'Sum of male and child victims cannot be greater than number of victims' + ) + if (self.number_of_female_victims + self.number_of_child_victims) > self.number_of_victims: + raise ValidationError( + 'Sum of female and child victims cannot be greater than number of victims' + ) + if (self.number_of_male_victims + self.number_of_female_victims + self.number_of_child_victims) > self.number_of_victims: + raise ValidationError( + 'Sum of male, female and child victims cannot be greater than number of victims' + ) \ No newline at end of file From b677b03e0b11b4df9076f41d93392bc4bf3bb701 Mon Sep 17 00:00:00 2001 From: AnthoniaOkafor Date: Mon, 8 Jun 2020 18:57:40 +0100 Subject: [PATCH 5/5] included a table to display users' responses when filtered --- src/templates/responder.html | 4 -- src/templates/search_responses.html | 79 +++++++++++++++++++++++++---- src/usersapp/views.py | 12 ++++- 3 files changed, 78 insertions(+), 17 deletions(-) diff --git a/src/templates/responder.html b/src/templates/responder.html index 3f4875c..99cb64a 100644 --- a/src/templates/responder.html +++ b/src/templates/responder.html @@ -61,10 +61,6 @@

Accident Information

{{item.accident_location}} {{item.nearest_landmark}} - {{item.date_of_accident|date:"Y-m-d"}} {{item.time_of_accident}} diff --git a/src/templates/search_responses.html b/src/templates/search_responses.html index 41c5e9d..af4a083 100644 --- a/src/templates/search_responses.html +++ b/src/templates/search_responses.html @@ -13,15 +13,72 @@

Accident Search

Reset {% endbuttons %} - - - - -
    - {% for response in filter.qs %} -
  • {{ response.accident_location }} - {{ response.nearest_landmark }} - {{ response.time_of_accident }} - {{ response.date_of_accident }} - {{response.vehicles_number_plates}} - {{response.vehicles_precrash_factors}} - {{response.road_geometry}} - {{response.road_type}} - {{response.driver_precrash_factors}} - {{response.collision_type}} - {{response.number_of_victims}} - {{response.number_of_injured}} - {{response.number_of_deaths}} {{response.vehicle_type}}
  • - {% endfor %} -
- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for item in filter.qs %} + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} +
Accident locationNearest LandmarkDate of AccidentTime of AccidentNumber of vehicles InvolvedVehicle typeOther vehicle (if any)Vehicles Number PlatesVehicles precrash factorsNumber of damaged vehiclesRoad GeometryRoad typeDrivers Precrash factorsCollision typeNumber of victimsNumber of injured Number of deathsCategory of victimsVictims age groupNumber of male victimsNumber of female victimsNumber of child victimsVictims current locationHospital LocationOther Location (if any)More accident info
{{item.accident_location}}{{item.nearest_landmark}}{{item.date_of_accident|date:"Y-m-d"}}{{item.time_of_accident}}{{vehicles_involved}}{{item.vehicle_type}}{{item.other_vehicle_type}}{{item.vehicles_number_plates}}{{item.vehicles_precrash_factors}}{{item.number_of_damaged_vehicles}}{{item.road_geometry}}{{item.road_type}}{{item.drivers_precrash_factors}}{{item.collision_type}}{{item.number_of_victims}}{{item.number_of_injured}}{{item.number_of_deaths}}{{item.category_of_victims}}{{item.victims_age_group}}{{item.number_of_male_victims}}{{item.number_of_female_victims}}{{item.number_of_child_victims}}{{item.victims_current_location}}{{hospital_location}}{{item.other_location}}{{item.more_accident_info}}
-
\ No newline at end of file +
+{% load tz_detect %} +{% tz_detect %} diff --git a/src/usersapp/views.py b/src/usersapp/views.py index c566ec8..98c5c14 100644 --- a/src/usersapp/views.py +++ b/src/usersapp/views.py @@ -6,7 +6,6 @@ from .forms import IncidentForm from .models import Incident from django.views.decorators.http import require_POST - from .filters import ResponsesFilter # Create your views here. @@ -44,6 +43,8 @@ def incident_create(request): 'form': userform }) + +#this function generates users' report responses into a single table def responder(request): #detail=Incident.objects.all().filter(accident_location__exact='Adamawa') detail=Incident.objects.all() @@ -53,9 +54,16 @@ def responder(request): 'detail': detail }) +''' +#getting responders timezone when searching users responses +def convert_to_localtime(utctime): + utc = utctime.replace(tzinfo=pytz.UTC) + localtz = utc.astimezone(timezone.get_current_timezone()) + return localtz +''' -#writing a function for ResponsesFilter in filters.py +#writing a function that would filter fields in ResponsesFilter in filters.py def search_responses(request): responses = Incident.objects.all() response_filter = ResponsesFilter(request.GET, queryset=responses)