Skip to content

Commit

Permalink
add date and province filter
Browse files Browse the repository at this point in the history
  • Loading branch information
thapaliya19 committed Oct 9, 2023
1 parent 377ee76 commit 81fc6fe
Show file tree
Hide file tree
Showing 96 changed files with 8,866 additions and 809 deletions.
Empty file modified .gitignore
100755 → 100644
Empty file.
Empty file modified .vscode/launch.json
100755 → 100644
Empty file.
9 changes: 7 additions & 2 deletions .vscode/settings.json
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"python.formatting.provider": "black",
"python.formatting.provider": "none",
"python.linting.flake8Enabled": true,
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
Expand All @@ -9,5 +9,10 @@
},
"[html]": {
"editor.formatOnSave": false
}
},
"python.linting.enabled": true,
"[python]": {
"editor.defaultFormatter": "ms-python.python"
},
"python.analysis.typeCheckingMode": "off"
}
Empty file modified README.md
100755 → 100644
Empty file.
Empty file modified address/__init__.py
100755 → 100644
Empty file.
Empty file modified address/admin.py
100755 → 100644
Empty file.
Empty file modified address/apps.py
100755 → 100644
Empty file.
Empty file modified address/forms.py
100755 → 100644
Empty file.
Empty file modified address/migrations/0001_initial.py
100755 → 100644
Empty file.
Empty file.
Empty file modified address/migrations/0003_province_code.py
100755 → 100644
Empty file.
Empty file modified address/migrations/__init__.py
100755 → 100644
Empty file.
Empty file modified address/models.py
100755 → 100644
Empty file.
Empty file modified address/serializers.py
100755 → 100644
Empty file.
Empty file modified address/tests.py
100755 → 100644
Empty file.
Empty file modified address/urls.py
100755 → 100644
Empty file.
Empty file modified address/views.py
100755 → 100644
Empty file.
Empty file modified gunicorn.conf.py
100755 → 100644
Empty file.
Empty file modified manage.py
100755 → 100644
Empty file.
Empty file modified parasite/.gitignore
100755 → 100644
Empty file.
Empty file modified parasite/__init__.py
100755 → 100644
Empty file.
Empty file modified parasite/asgi.py
100755 → 100644
Empty file.
1 change: 1 addition & 0 deletions parasite/settings.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"user",
"annotation",
"view_breadcrumbs",
"bootstrap_daterangepicker"
]

MIDDLEWARE = [
Expand Down
Empty file modified parasite/urls.py
100755 → 100644
Empty file.
Empty file modified parasite/wsgi.py
100755 → 100644
Empty file.
Empty file modified quality/__init__.py
100755 → 100644
Empty file.
Empty file modified quality/admin.py
100755 → 100644
Empty file.
Empty file modified quality/apps.py
100755 → 100644
Empty file.
Empty file modified quality/migrations/__init__.py
100755 → 100644
Empty file.
Empty file modified quality/models.py
100755 → 100644
Empty file.
Empty file modified quality/tests.py
100755 → 100644
Empty file.
Empty file modified quality/views.py
100755 → 100644
Empty file.
38 changes: 38 additions & 0 deletions requirements.txt
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,40 +1,78 @@
asgiref==3.5.2
asttokens==2.4.0
backcall==0.2.0
black==22.10.0
certifi==2022.9.24
charset-normalizer==2.1.1
click==8.1.3
comm==0.1.4
contourpy==1.1.0
coreapi==2.3.3
coreschema==0.0.4
crispy-bootstrap5==0.7
cycler==0.11.0
debugpy==1.6.7.post1
decorator==5.1.1
Django==4.1.3
django-bootstrap-daterangepicker==1.1.0
django-crispy-forms==1.14.0
django-dynamic-breadcrumbs==0.4.2
django-environ==0.9.0
django-view-breadcrumbs==2.4.1
djangorestframework==3.14.0
drf-yasg==1.21.4
executing==1.2.0
flake8==5.0.4
fonttools==4.42.1
gunicorn==20.1.0
idna==3.4
inflection==0.5.1
ipykernel==6.25.2
ipython==8.15.0
itypes==1.2.0
jedi==0.19.0
Jinja2==3.1.2
jupyter_client==8.3.1
jupyter_core==5.3.1
kiwisolver==1.4.5
MarkupSafe==2.1.1
matplotlib==3.7.2
matplotlib-inline==0.1.6
mccabe==0.7.0
mypy-extensions==0.4.3
nanoid==2.0.0
nest-asyncio==1.5.7
numpy==1.25.2
packaging==21.3
pandas==2.1.0
parso==0.8.3
pathspec==0.10.2
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.3.0
platformdirs==2.5.4
prompt-toolkit==3.0.39
psutil==5.9.5
ptyprocess==0.7.0
pure-eval==0.2.2
pycodestyle==2.9.1
pyflakes==2.5.0
Pygments==2.16.1
pyparsing==3.0.9
python-dateutil==2.8.2
pytz==2022.6
pyzmq==25.1.1
requests==2.28.1
ruamel.yaml==0.17.21
ruamel.yaml.clib==0.2.7
seaborn==0.12.2
six==1.16.0
sqlparse==0.4.3
stack-data==0.6.2
tomli==2.0.1
tornado==6.3.3
traitlets==5.9.0
tzdata==2023.3
uritemplate==4.1.1
urllib3==1.26.12
wcwidth==0.2.6
Empty file modified runserver.sh
100755 → 100644
Empty file.
Empty file modified sample/__init__.py
100755 → 100644
Empty file.
Empty file modified sample/admin.py
100755 → 100644
Empty file.
Empty file modified sample/apps.py
100755 → 100644
Empty file.
Empty file modified sample/const.py
100755 → 100644
Empty file.
29 changes: 29 additions & 0 deletions sample/forms/standard_sample_form.py
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
from datetime import date, timedelta
from django import forms
from django.forms import Form, ModelForm
from django.forms.widgets import DateInput
from bootstrap_daterangepicker import widgets as datepicker_widgets
from bootstrap_daterangepicker import fields as datepicker_fields

from sample.models import Standard
from address.models import Province


class StandardForm(ModelForm):
Expand Down Expand Up @@ -39,3 +43,28 @@ def clean_images(self):
if len(files) != 15:
raise forms.ValidationError("Please upload exactly 15 images.")
return files


class FilterForm(Form):
# Date Range Fields
filter_date_range = datepicker_fields.DateRangeField(
required=False,
input_formats=['%Y-%m-%d'],
widget=datepicker_widgets.DateRangeWidget(
format='%Y-%m-%d',
picker_options={
"ranges": {
"Yesterday": [(date.today() - timedelta(days=1)).strftime('%Y-%m-%d'), (date.today() - timedelta(days=1)).strftime('%Y-%m-%d')],
"Last 7 days": [(date.today() - timedelta(days=7)).strftime('%Y-%m-%d'), date.today().strftime('%Y-%m-%d')],
"Last Month": [(date.today() - timedelta(days=30)).strftime('%Y-%m-%d'), date.today().strftime('%Y-%m-%d')]
}
},
)
)
province = forms.ModelChoiceField(Province.objects.only("name", "code"), widget=forms.widgets.Select(attrs={'class': "form-select"}), required=False)

def __init__(self, default_range: str, province: int, *args, **kwargs):
super(FilterForm, self).__init__(*args, **kwargs)
self.initial['filter_date_range'] = default_range
self.initial['province'] = province

Empty file modified sample/forms/stool_sample_forms.py
100755 → 100644
Empty file.
Empty file modified sample/forms/vegetable_sample_forms.py
100755 → 100644
Empty file.
Empty file modified sample/forms/water_sample_forms.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0001_initial.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0002_alter_slideimage_image.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0003_alter_slideimage_image.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0004_alter_slideimage_image.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0005_slideimage_image_type_s_or_b.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/0006_vegetable_ward_water_ward.py
100755 → 100644
Empty file.
Empty file modified sample/migrations/__init__.py
100755 → 100644
Empty file.
Empty file modified sample/models.py
100755 → 100644
Empty file.
Empty file modified sample/sample_views/__init__.py
100755 → 100644
Empty file.
Empty file modified sample/sample_views/standard_sample_views.py
100755 → 100644
Empty file.
44 changes: 24 additions & 20 deletions sample/sample_views/stool_sample_views.py
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
from typing import Any

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.core.files.images import ImageFile
from django.db.models import Count, Prefetch, Q
from django.db.models.query import QuerySet
from django.db.models import Q
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse_lazy
Expand All @@ -19,10 +16,11 @@

from address.forms import AddressForm
from sample.const import IMAGE_COUNT, IMAGE_TYPE_CHOICES, SLIDE_COUNT
from sample.forms.standard_sample_form import SlideImagesForm
from sample.forms.standard_sample_form import SlideImagesForm, FilterForm
from sample.forms.stool_sample_forms import StoolForm
from sample.models import Slide, SlideImage, Stool
from sample.utils import create_sample_id
import datetime


# Create your views here
Expand All @@ -36,10 +34,11 @@ class StoolListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)

context["total_samples"] = Stool.objects.count()
stool_objects = self.object_list
context["total_samples"] = stool_objects.count()
# images uploaded for stool sample, filter all slide images whose slide is a stool sample and has an image
context["total_images_uploaded"] = SlideImage.objects.filter(
~Q(image=""), slide__stool_sample__isnull=False
~Q(image=""), slide__stool_sample__isnull=False, slide__stool_sample__id__in=stool_objects
).count()
# images remaining to upload
context["total_images_remaining"] = (
Expand All @@ -50,27 +49,32 @@ def get_context_data(self, **kwargs):
~Q(image=""),
slide__stool_sample__isnull=False,
approved=True,
slide__stool_sample__id__in=stool_objects
).count()
# total images pending approval
context["total_images_pending_approval"] = (
context["total_images_uploaded"] - context["total_images_approved"]
)
context["sample_type"] = "stool"
default_range = self.start_date + ' - ' + self.end_date
context['filter_form'] = FilterForm(default_range=default_range, province=self.province)
return context

# def get_queryset(self) -> QuerySet[Any]:
# return Stool.objects.annotate(
# total_images=Count(
# Q(
# stool_slides__slide_image__approved=True,
# ),
# ),
# uploaded_images=Count(
# ~Q(
# stool_slides__slide_image__image="",
# )
# ),
# ).order_by("-id")
def get_queryset(self, **kwargs):
queryset = Stool.objects.all()
filter_range = self.request.GET.get('filter_date_range', '')
if filter_range:
self.start_date, self.end_date = filter_range.split(' - ')
print(filter_range.split(' - '))
else:
self.start_date = self.request.GET.get('from', '2020-01-01')
today_date = datetime.datetime.today().strftime('%Y-%m-%d')
self.end_date = self.request.GET.get('to', today_date)
queryset = queryset.filter(date_of_collection__range=[self.start_date, self.end_date])
self.province = self.request.GET.get('province', '')
if self.province:
queryset = queryset.filter(site__district__province__id=self.province)
return queryset


class StoolFormView(
Expand Down
27 changes: 24 additions & 3 deletions sample/sample_views/vegetable_sample_views.py
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.core.files.images import ImageFile
Expand All @@ -16,7 +17,7 @@

from address.forms import AddressForm
from sample.const import IMAGE_COUNT, IMAGE_TYPE_CHOICES, SLIDE_COUNT
from sample.forms.standard_sample_form import SlideImagesForm
from sample.forms.standard_sample_form import SlideImagesForm, FilterForm
from sample.forms.vegetable_sample_forms import VegetableForm
from sample.models import Slide, SlideImage, Vegetable
from sample.utils import create_sample_id
Expand All @@ -33,10 +34,11 @@ class VegetableListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["sample_type"] = "vegetable"
context["total_samples"] = Vegetable.objects.count()

vegetable_objects = self.object_list
context["total_samples"] = vegetable_objects.count()
context["total_images_uploaded"] = SlideImage.objects.filter(
~Q(image=""), slide__vegetable_sample__isnull=False
~Q(image=""), slide__vegetable_sample__isnull=False, slide__vegetable_sample__id__in=vegetable_objects
).count()
# images remaining to upload
context["total_images_remaining"] = (
Expand All @@ -47,13 +49,32 @@ def get_context_data(self, **kwargs):
~Q(image=""),
slide__vegetable_sample__isnull=False,
approved=True,
slide__vegetable_sample__id__in=vegetable_objects
).count()
# total images pending approval
context["total_images_pending_approval"] = (
context["total_images_uploaded"] - context["total_images_approved"]
)
default_range = self.start_date + ' - ' + self.end_date
context['filter_form'] = FilterForm(default_range=default_range, province=self.province)
return context

def get_queryset(self, **kwargs):
queryset = Vegetable.objects.all()
filter_range = self.request.GET.get('filter_date_range', '')
if filter_range:
self.start_date, self.end_date = filter_range.split(' - ')
print(filter_range.split(' - '))
else:
self.start_date = self.request.GET.get('from', '2020-01-01')
today_date = datetime.datetime.today().strftime('%Y-%m-%d')
self.end_date = self.request.GET.get('to', today_date)
queryset = queryset.filter(date_of_collection__range=[self.start_date, self.end_date])
self.province = self.request.GET.get('province', '')
if self.province:
queryset = queryset.filter(site__district__province__id=self.province)
return queryset


class VegetableFormView(
LoginRequiredMixin, PermissionRequiredMixin, CreateBreadcrumbMixin, FormView
Expand Down
30 changes: 26 additions & 4 deletions sample/sample_views/water_sample_views.py
100755 → 100644
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import datetime
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.core.files.images import ImageFile
Expand All @@ -16,7 +17,7 @@

from address.forms import AddressForm
from sample.const import IMAGE_COUNT, IMAGE_TYPE_CHOICES, SLIDE_COUNT
from sample.forms.standard_sample_form import SlideImagesForm
from sample.forms.standard_sample_form import SlideImagesForm, FilterForm
from sample.forms.water_sample_forms import WaterForm
from sample.models import Slide, SlideImage, Water
from sample.utils import create_sample_id
Expand All @@ -25,18 +26,19 @@
# Create your views here
@method_decorator(never_cache, name="dispatch")
class WaterListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
queryset = Water.objects.order_by("-id")
template_name: str = "sample/sample_home.html"
context_object_name = "latest_samples_list"
permission_required = "sample.view_water"

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["sample_type"] = "water"
context["total_samples"] = Water.objects.count()

water_objects = self.object_list
context["total_samples"] = water_objects.count()

context["total_images_uploaded"] = SlideImage.objects.filter(
~Q(image=""), slide__water_sample__isnull=False
~Q(image=""), slide__water_sample__isnull=False, slide__water_sample__id__in=water_objects
).count()
# images remaining to upload
context["total_images_remaining"] = (
Expand All @@ -47,13 +49,33 @@ def get_context_data(self, **kwargs):
~Q(image=""),
slide__water_sample__isnull=False,
approved=True,
slide__water_sample__id__in=water_objects
).count()
# total images pending approval
context["total_images_pending_approval"] = (
context["total_images_uploaded"] - context["total_images_approved"]
)
default_range = self.start_date + ' - ' + self.end_date
context['filter_form'] = FilterForm(default_range=default_range, province=self.province)

return context

def get_queryset(self, **kwargs):
queryset = Water.objects.all()
filter_range = self.request.GET.get('filter_date_range', '')
if filter_range:
self.start_date, self.end_date = filter_range.split(' - ')
print(filter_range.split(' - '))
else:
self.start_date = self.request.GET.get('from', '2020-01-01')
today_date = datetime.datetime.today().strftime('%Y-%m-%d')
self.end_date = self.request.GET.get('to', today_date)
queryset = queryset.filter(date_of_collection__range=[self.start_date, self.end_date])
self.province = self.request.GET.get('province', '')
if self.province:
queryset = queryset.filter(site__district__province__id=self.province)
return queryset


class WaterFormView(
LoginRequiredMixin, PermissionRequiredMixin, CreateBreadcrumbMixin, FormView
Expand Down
Empty file modified sample/serializers.py
100755 → 100644
Empty file.
Empty file modified sample/templates/sample/home.html
100755 → 100644
Empty file.
Empty file modified sample/templates/sample/index.html
100755 → 100644
Empty file.
Empty file modified sample/templates/sample/sample_detail.html
100755 → 100644
Empty file.
Loading

0 comments on commit 81fc6fe

Please sign in to comment.