Skip to content

Commit

Permalink
feat: limit users based on alloted facilities
Browse files Browse the repository at this point in the history
  • Loading branch information
kennedykori committed Sep 15, 2021
1 parent 659e71b commit ad74c87
Show file tree
Hide file tree
Showing 9 changed files with 115 additions and 63 deletions.
19 changes: 19 additions & 0 deletions fahari/common/forms/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from .base_forms import BaseModelForm
from .common_forms import (
FacilityAttachmentForm,
FacilityForm,
FacilityUserForm,
OrganisationForm,
SystemForm,
UserFacilityAllotmentForm,
)

__all__ = [
"BaseModelForm",
"FacilityAttachmentForm",
"FacilityForm",
"FacilityUserForm",
"OrganisationForm",
"SystemForm",
"UserFacilityAllotmentForm",
]
24 changes: 24 additions & 0 deletions fahari/common/forms/base_forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit
from django.forms import ModelForm


class BaseModelForm(ModelForm):
"""Base form for the majority of model forms in the project."""

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_method = "post"
self.helper.form_action = ""
self.helper.add_input(Submit("submit", "Save"))
self.helper.html5_required = True

class Meta:
exclude = (
"created",
"updated",
"created_by",
"updated_by",
"organisation",
)
33 changes: 7 additions & 26 deletions fahari/common/forms.py → fahari/common/forms/common_forms.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,18 @@
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Field, Fieldset, Layout, Submit
from django.forms import ModelForm, MultipleChoiceField, TextInput
from crispy_forms.layout import Field, Fieldset, Layout
from django.forms import MultipleChoiceField, TextInput

from .dashboard import get_fahari_facilities_queryset
from .models import (
from ..dashboard import get_fahari_facilities_queryset
from ..models import (
Facility,
FacilityAttachment,
FacilityUser,
Organisation,
System,
UserFacilityAllotment,
)
from .utils import get_constituencies, get_counties, get_sub_counties, get_wards
from .widgets import MultiSearchableComboBox, SearchableComboBox


class BaseModelForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper(self)
self.helper.form_method = "post"
self.helper.form_action = ""
self.helper.add_input(Submit("submit", "Save"))
self.helper.html5_required = True

class Meta:
exclude = (
"created",
"updated",
"created_by",
"updated_by",
"organisation",
)
from ..utils import get_constituencies, get_counties, get_sub_counties, get_wards
from ..widgets import MultiSearchableComboBox, SearchableComboBox
from .base_forms import BaseModelForm


class FacilityForm(BaseModelForm):
Expand Down
Empty file added fahari/common/forms/mixins.py
Empty file.
19 changes: 19 additions & 0 deletions fahari/common/serializers/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""Shared serializer module."""
from .base_serializers import BaseSerializer
from .common_serializers import (
FacilitySerializer,
FacilityUserSerializer,
SystemSerializer,
UserFacilityAllotmentSerializer,
)
from .mixins import AuditFieldsMixin, PartialResponseMixin

__all__ = [
"AuditFieldsMixin",
"BaseSerializer",
"PartialResponseMixin",
"FacilitySerializer",
"FacilityUserSerializer",
"SystemSerializer",
"UserFacilityAllotmentSerializer",
]
20 changes: 20 additions & 0 deletions fahari/common/serializers/base_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
"""Base serializers used in the project."""
import logging

from rest_framework import serializers

from .mixins import AuditFieldsMixin

LOGGER = logging.getLogger(__name__)


class BaseSerializer(AuditFieldsMixin):
"""Base class intended for inheritance by 'regular' app serializers."""

url = serializers.URLField(source="get_absolute_url", read_only=True)

class Meta:
datatables_always_serialize = (
"id",
"url",
)
Original file line number Diff line number Diff line change
@@ -1,26 +1,14 @@
"""Shared serializer mixins."""
"""Common serializers."""
import logging

from rest_framework import serializers

from .mixins import AuditFieldsMixin
from .models import Facility, FacilityUser, System, UserFacilityAllotment
from ..models import Facility, FacilityUser, System, UserFacilityAllotment
from .base_serializers import BaseSerializer

LOGGER = logging.getLogger(__name__)


class BaseSerializer(AuditFieldsMixin):
"""Base class intended for inheritance by 'regular' app serializers."""

url = serializers.URLField(source="get_absolute_url", read_only=True)

class Meta:
datatables_always_serialize = (
"id",
"url",
)


class FacilitySerializer(BaseSerializer):
class Meta(BaseSerializer.Meta):
model = Facility
Expand Down
43 changes: 22 additions & 21 deletions fahari/common/mixins.py → fahari/common/serializers/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,31 @@
LOGGER = logging.getLogger(__name__)


def get_organisation(request, initial_data=None):
"""Determine the organisation based on the user and supplied data."""

user = request.user
organisation = (
initial_data.get("organisation")
if isinstance(initial_data, dict)
else request.data.get("organisation")
)

if organisation:
try:
org = Organisation.objects.get(id=organisation)
except Organisation.DoesNotExist as no_org:
error = {"organisation": "Ensure the organisation provided exists."}
raise exceptions.ValidationError(error) from no_org
return org
else:
return user.organisation


class PartialResponseMixin(object):
"""Mixin that allows API clients to specify fields."""

def strip_fields(self, request, origi_fields):
def strip_fields(self, request, origi_fields): # noqa
"""
Select a subset of fields, determined by the `fields` parameter.
Expand All @@ -35,26 +56,6 @@ def strip_fields(self, request, origi_fields):
return origi_fields


def get_organisation(request, initial_data=None):
"""Determine the organisation based on the user and supplied data."""
user = request.user
organisation = (
initial_data.get("organisation")
if isinstance(initial_data, dict)
else request.data.get("organisation")
)

if organisation:
try:
org = Organisation.objects.get(id=organisation)
except Organisation.DoesNotExist as no_org:
error = {"organisation": "Ensure the organisation provided exists."}
raise exceptions.ValidationError(error) from no_org
return org
else:
return user.organisation


class AuditFieldsMixin(PartialResponseMixin, serializers.ModelSerializer):
"""Mixin for organisation, created, updated, created_by and updated_by."""

Expand Down
2 changes: 1 addition & 1 deletion fahari/templates/common/userfacilityallotment_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
{% endblock title %}
{% block content %}
<a href="{% url 'common:user_facility_allotments' %}">&larr; Back</a>
{% if perms.common.change_facilityuser %}
{% if perms.common.change_userfacilityallotment %}

<div class="row">
<div class="col-xl-10 col-lg-10 col-md-10 col-sm-12">
Expand Down

0 comments on commit ad74c87

Please sign in to comment.