Skip to content

Commit 6662d0c

Browse files
Merge pull request #29 from unicef/feature/import-data-from-kobo
Feature: Import data from kobo
2 parents 4dbd6e0 + 78bf0e5 commit 6662d0c

40 files changed

+847
-8
lines changed

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ repos:
1818
rev: v0.9.3
1919
hooks:
2020
- id: ruff
21-
- id: ruff-format
2221
args:
23-
- --check
22+
- --fix
23+
- id: ruff-format
2424

2525
- repo: https://github.com/saxix/pch
2626
rev: '0.1'

src/country_workspace/admin/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from .role import UserRoleAdmin # noqa
1717
from .sync import SyncLog # noqa
1818
from .user import UserAdmin # noqa
19+
from country_workspace.contrib.kobo.admin import KoboAsset # noqa
1920

2021
site.register(ContentType, admin_class=ContentTypeAdmin)
2122
site.register(Permission, admin_class=PermissionAdmin)

src/country_workspace/admin/job.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from adminfilters.autocomplete import AutoCompleteFilter, LinkedAutoCompleteFilter
44
from django.contrib import admin
5+
from django.http import HttpRequest
56
from django_celery_boost.admin import CeleryTaskModelAdmin
67

78
from ..models import AsyncJob
@@ -26,5 +27,5 @@ class AsyncJobAdmin(CeleryTaskModelAdmin, BaseModelAdmin):
2627

2728
def get_readonly_fields(self, request: "HttpRequest", obj: "AsyncJob | None" = None) -> Sequence[str]:
2829
if obj:
29-
return ("program", "batch", "owner", "local_status", "type", "action", "sentry_id")
30+
return "program", "batch", "owner", "local_status", "type", "action", "sentry_id"
3031
return super().get_readonly_fields(request, obj)

src/country_workspace/config/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ class Group(Enum):
185185
"AZURE_CLIENT_SECRET": (str, "", "", False, "Azure client secret for SSO"),
186186
"AZURE_TENANT_ID": (str, "", "", False, "Azure tenant ID for SSO"),
187187
"AZURE_CLIENT_KEY": (str, "", "", False, "Azure client key for SSO"),
188+
"KOBO_KF_URL": (str, "", "", False, "Kobo API base URL"),
189+
"KOBO_MASTER_API_TOKEN": (str, "", "", False, "Kobo API master token"),
190+
"KOBO_PROJECT_VIEW_ID": (str, "", "", False, "Kobo project view ID"),
191+
"KOBO_API_TOKEN": (str, "", "", False, "Kobo API token"),
188192
}
189193

190194
env = SmartEnv(**CONFIG)

src/country_workspace/config/fragments/constance.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from .app import AURORA_API_TOKEN, AURORA_API_URL, HOPE_API_TOKEN, HOPE_API_URL, NEW_USER_DEFAULT_GROUP
2+
from .kobo import KOBO_API_TOKEN, KOBO_MASTER_API_TOKEN, KOBO_PROJECT_VIEW_ID, KOBO_KF_URL
23

34
CONSTANCE_BACKEND = "constance.backends.database.DatabaseBackend"
45

@@ -46,8 +47,10 @@
4647
"AURORA_API_URL": (AURORA_API_URL, "Aurora API Server address", str),
4748
"HOPE_API_TOKEN": (HOPE_API_TOKEN, "HOPE API Access Token", "write_only_input"),
4849
"HOPE_API_URL": (HOPE_API_URL, "HOPE API Server address", str),
49-
"KOBO_API_TOKEN": ("", "Kobo API Access Token", "write_only_input"),
50-
"KOBO_API_URL": ("", "Kobo API Server address", str),
50+
"KOBO_API_TOKEN": (KOBO_API_TOKEN, "Kobo API Access Token", "write_only_input"),
51+
"KOBO_MASTER_API_TOKEN": (KOBO_MASTER_API_TOKEN, "Kobo API Master Access Token", "write_only_input"),
52+
"KOBO_PROJECT_VIEW_ID": (KOBO_PROJECT_VIEW_ID, "Kobo Project View ID", str),
53+
"KOBO_KF_URL": (KOBO_KF_URL, "Kobo Server address", str),
5154
"CACHE_TIMEOUT": (86400, "Cache Redis TTL", int),
5255
"CACHE_BY_VERSION": (False, "Invalidate Cache on CW version change", bool),
5356
"CONCURRENCY_GUARD": (
@@ -68,7 +71,9 @@
6871
"HOPE_API_TOKEN",
6972
"HOPE_API_URL",
7073
"KOBO_API_TOKEN",
71-
"KOBO_API_URL",
74+
"KOBO_MASTER_API_TOKEN",
75+
"KOBO_PROJECT_VIEW_ID",
76+
"KOBO_KF_URL",
7277
),
7378
"Data consistency": ("CONCURRENCY_GUARD",),
7479
}
@@ -78,4 +83,5 @@
7883
"AURORA_API_TOKEN": "***",
7984
"HOPE_API_TOKEN": "***",
8085
"KOBO_API_TOKEN": "***",
86+
"KOBO_API_MASTER_TOKEN": "***",
8187
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from .. import env
2+
3+
KOBO_KF_URL = env("KOBO_KF_URL")
4+
KOBO_MASTER_API_TOKEN = env("KOBO_MASTER_API_TOKEN")
5+
KOBO_PROJECT_VIEW_ID = env("KOBO_PROJECT_VIEW_ID")
6+
KOBO_API_TOKEN = env("KOBO_API_TOKEN")

src/country_workspace/config/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@
237237
from .fragments.rest_framework import * # noqa
238238
from .fragments.root import * # noqa
239239
from .fragments.sentry import * # noqa
240+
from .fragments.kobo import * # noqa
240241

241242
# from .fragments.smart_admin import * # noqa
242243
from .fragments.social_auth import * # noqa

src/country_workspace/contrib/kobo/__init__.py

Whitespace-only changes.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Any
2+
3+
from django.contrib import admin
4+
5+
from country_workspace.admin.base import BaseModelAdmin
6+
from country_workspace.models import KoboAsset
7+
8+
9+
@admin.register(KoboAsset)
10+
class KoboAssetAdmin(BaseModelAdmin):
11+
list_display = ("uid", "name")
12+
exclude = ("programs",)
13+
14+
def has_add_permission(self, *args: Any, **kwargs: Any) -> bool:
15+
return False
16+
17+
def has_change_permission(self, *args: Any, **kwargs: Any) -> bool:
18+
return False
19+
20+
def has_delete_permission(self, *args: Any, **kwargs: Any) -> bool:
21+
return False

src/country_workspace/contrib/kobo/api/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)