Skip to content

Commit

Permalink
MIGRATIONS RESET - add locations
Browse files Browse the repository at this point in the history
  • Loading branch information
saxix committed Oct 7, 2024
1 parent 7a0c547 commit b9a24a4
Show file tree
Hide file tree
Showing 47 changed files with 895 additions and 319 deletions.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ dependencies = [
"django-debug-toolbar>=4.4.2",
"django-environ>=0.11.2",
"django-flags>=5.0.13",
"django-mptt>=0.16.0",
"django-regex>=0.5.0",
"django-select2",
"django-smart-admin>=2.6.0",
Expand Down
1 change: 1 addition & 0 deletions src/country_workspace/admin/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .household import HouseholdAdmin # noqa
from .individual import IndividualAdmin # noqa
from .locations import AreaAdmin, AreaTypeAdmin, CountryAdmin # noqa
from .office import CountryOfficeAdmin # noqa
from .program import ProgramAdmin # noqa
from .role import UserRoleAdmin # noqa
Expand Down
64 changes: 64 additions & 0 deletions src/country_workspace/admin/locations.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import logging
from typing import TYPE_CHECKING, Any, List, Tuple

from django.contrib import admin
from django.contrib.admin import ModelAdmin, RelatedFieldListFilter
from django.forms import FileField, FileInput, Form

from adminfilters.autocomplete import AutoCompleteFilter
from adminfilters.filters import NumberFilter
from adminfilters.mixin import AdminFiltersMixin

from country_workspace.models.locations import Area, AreaType, Country

if TYPE_CHECKING:
from django.http import HttpRequest

logger = logging.getLogger(__name__)


class ImportCSVForm(Form):
file = FileField(widget=FileInput(attrs={"accept": "text/csv"}))


@admin.register(Country)
class CountryAdmin(AdminFiltersMixin, admin.ModelAdmin):
list_display = ("name", "short_name", "iso_code2", "iso_code3", "iso_num")
search_fields = ("name", "short_name", "iso_code2", "iso_code3", "iso_num")
raw_id_fields = ("parent",)


@admin.register(AreaType)
class AreaTypeAdmin(AdminFiltersMixin, admin.ModelAdmin):
list_display = ("name", "country", "area_level", "parent")
list_filter = (("country", AutoCompleteFilter), ("area_level", NumberFilter))

search_fields = ("name",)
autocomplete_fields = ("country",)
raw_id_fields = ("country", "parent")


class AreaTypeFilter(RelatedFieldListFilter):
def field_choices(
self, field: Any, request: "HttpRequest", model_admin: ModelAdmin
) -> List[Tuple[str, str]]:
if "area_type__country__exact" not in request.GET:
return []
return AreaType.objects.filter(
country=request.GET["area_type__country__exact"]
).values_list("id", "name")


@admin.register(Area)
class AreaAdmin(AdminFiltersMixin, admin.ModelAdmin):
list_display = (
"name",
"area_type",
"p_code",
)
list_filter = (
("area_type__country", AutoCompleteFilter),
("area_type", AreaTypeFilter),
)
search_fields = ("name", "p_code")
raw_id_fields = ("area_type", "parent")
4 changes: 2 additions & 2 deletions src/country_workspace/admin/office.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from django.contrib import admin

from ..models import CountryOffice
from ..models import Office


@admin.register(CountryOffice)
@admin.register(Office)
class CountryOfficeAdmin(admin.ModelAdmin):
list_display = ("name",)
search_fields = ("name",)
2 changes: 1 addition & 1 deletion src/country_workspace/config/fragments/app.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ANALYST_GROUP_NAME = "Analyst"
NEW_USER_DEFAULT_GROUP = "Default"

TENANT_TENANT_MODEL = "country_workspace.CountryOffice"
TENANT_TENANT_MODEL = "country_workspace.Office"
TENANT_HQ = "= HQ ="
1 change: 1 addition & 0 deletions src/country_workspace/config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
"django.contrib.messages.context_processors.messages",
"social_django.context_processors.backends",
"social_django.context_processors.login_redirect",
"country_workspace.web.context_processors.current_state",
],
"libraries": {
"staticfiles": "django.templatetags.static",
Expand Down
2 changes: 1 addition & 1 deletion src/country_workspace/config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@
urlpatterns = [
path(r"admin/", admin.site.urls),
# path(r"", admin.site.urls),
path(r"", workspace.urls),
path(r"security/", include("unicef_security.urls", namespace="security")),
path(r"social/", include("social_django.urls", namespace="social")),
path(r"accounts/", include("django.contrib.auth.urls")),
path(r"adminactions/", include("adminactions.urls")),
path(r"sentry_debug/", lambda _: 1 / 0),
path(r"__debug__/", include(debug_toolbar.urls)),
path(r"", workspace.urls),
]

if settings.DEBUG:
Expand Down
39 changes: 21 additions & 18 deletions src/country_workspace/management/commands/demo.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import logging
import sys
from pathlib import Path
from random import randint
from typing import Any

from django.conf import settings
Expand All @@ -11,9 +10,6 @@

from hope_flex_fields.models import DataChecker

from country_workspace.models import Household, Individual
from country_workspace.models.program import Program

logger = logging.getLogger(__name__)


Expand All @@ -26,7 +22,7 @@ def handle(self, *args: Any, **options: Any) -> None:

from flags.models import FlagState

from country_workspace.models import CountryOffice, User
from country_workspace.models import Office, User

Site.objects.update_or_create(
pk=settings.SITE_ID,
Expand All @@ -42,7 +38,7 @@ def handle(self, *args: Any, **options: Any) -> None:
name=flag, condition="hostname", value="127.0.0.1,localhost"
)

CountryOffice.objects.get_or_create(
Office.objects.get_or_create(
slug=slugify(
settings.TENANT_HQ,
),
Expand Down Expand Up @@ -183,25 +179,32 @@ def handle(self, *args: Any, **options: Any) -> None:
ds, __ = DataChecker.objects.get_or_create(name="Base Individual")
ds.fieldsets.add(ind_fs)


test_utils_dir = Path(__file__).parent.parent.parent.parent.parent / "tests/extras"
assert test_utils_dir.exists(), str(test_utils_dir.absolute()) + " does not exist"
test_utils_dir = (
Path(__file__).parent.parent.parent.parent.parent / "tests/extras"
)
assert test_utils_dir.exists(), (
str(test_utils_dir.absolute()) + " does not exist"
)
sys.path.append(str(test_utils_dir.absolute()))
from testutils.factories import IndividualFactory, ProgramFactory, CountryOfficeFactory
from testutils.factories import IndividualFactory, OfficeFactory, ProgramFactory

# from faker import Faker
#
# faker = Faker()
for ic in CountryOfficeFactory._COUNTRIES:
co = CountryOfficeFactory(name=ic)
for ic in OfficeFactory._COUNTRIES:
co = OfficeFactory(name=ic)
for ip in [1, 2, 3]:
p = ProgramFactory( name=f"Program {ip} ({co.slug})", country_office=co)
IndividualFactory.create_batch(10,
household__country_office=co,
household__program=p,
country_office=co, program=p)
p = ProgramFactory(name=f"Program {ip} ({co.slug})", country_office=co)
IndividualFactory.create_batch(
10,
household__country_office=co,
household__program=p,
country_office=co,
program=p,
)
# for hx in range(50):

# co, __ = CountryOffice.objects.get_or_create(
# co, __ = Office.objects.get_or_create(
# slug=co, code=co, name=co.capitalize()
# )
# for p in [1, 2, 3]:
Expand Down
6 changes: 3 additions & 3 deletions src/country_workspace/management/commands/upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ def halt(self, e: Exception) -> None: # pragma: no cover
sys.exit(1)

def handle(self, *args: Any, **options: Any) -> None: # noqa
from country_workspace.models import CountryOffice, User
from country_workspace.models import Office, User

self.get_options(options)
if self.verbosity >= 1:
Expand Down Expand Up @@ -164,13 +164,13 @@ def handle(self, *args: Any, **options: Any) -> None: # noqa

echo("Setup base security")
setup_workspace_group()
CountryOffice.objects.get_or_create(
Office.objects.get_or_create(
slug=slugify(
settings.TENANT_HQ,
),
name=settings.TENANT_HQ,
)
# CountryOffice.objects.sync()
# Office.objects.sync()
# TODO: Implement sync for Country Offices
echo(
"Country Offices sync not implemented yet - TODO it !!!",
Expand Down
Loading

0 comments on commit b9a24a4

Please sign in to comment.