From ddb230567b2d671446e4b989399595ca03c8827d Mon Sep 17 00:00:00 2001 From: sax Date: Sun, 23 Dec 2018 10:06:29 +0100 Subject: [PATCH 001/122] location endpoints --- .bumpversion.cfg | 26 +++++ .pre-commit-config.yaml | 1 - CHANGES | 6 + Pipfile | 1 + Pipfile.lock | 10 +- docker/.bumpversion.cfg | 13 --- docker/Makefile | 4 +- src/etools_datamart/__init__.py | 2 +- .../api/endpoints/datamart/__init__.py | 1 + .../api/endpoints/datamart/location.py | 37 ++++++ src/etools_datamart/api/urls.py | 1 + .../apps/data/migrations/0001_initial.py | 4 +- .../apps/etl/migrations/0001_initial.py | 4 +- src/etools_datamart/apps/etl/models.py | 10 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...221_1724.py => 0002_auto_20181223_0905.py} | 4 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...221_1724.py => 0002_auto_20181223_0905.py} | 6 +- src/etools_datamart/config/settings.py | 1 + .../migrations/0001_initial.py | 2 +- ...221_1724.py => 0002_auto_20181223_0905.py} | 6 +- .../migrations/0001_initial.py | 2 +- .../test_utilities/factories/common.py | 20 ++-- .../test_utilities/factories/data.py | 3 +- tests/_test_lib/test_utilities/perms.py | 1 + tests/api/test_api_auth_jwt.py | 3 +- tests/api/test_api_common.py | 3 +- tests/api/test_api_data.py | 110 +++++------------- tests/api/test_api_pages.py | 3 +- tests/api/test_api_permission.py | 3 +- tests/api/test_api_system.py | 2 - tests/api/test_system_filters.py | 3 +- tests/conftest.py | 3 + tests/datamart/test_data_admin.py | 3 +- tests/etl/test_etl_admin.py | 3 +- tests/etl/test_etl_tasklog.py | 4 +- tests/etools/test_etools_admin.py | 3 +- tests/exporters/test_exporter_data.py | 3 +- tests/multitenant/test_db.py | 3 +- tests/multitenant/test_schema_selection.py | 3 +- tests/test_commands.py | 3 +- tests/test_subscription.py | 3 +- tests/tracking/test_tracking_log.py | 3 +- tests/tracking/test_tracking_task.py | 3 +- 45 files changed, 182 insertions(+), 153 deletions(-) create mode 100644 .bumpversion.cfg delete mode 100644 docker/.bumpversion.cfg create mode 100644 src/etools_datamart/api/endpoints/datamart/location.py rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20181221_1724.py => 0002_auto_20181223_0905.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20181221_1724.py => 0002_auto_20181223_0905.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20181221_1724.py => 0002_auto_20181223_0905.py} (99%) diff --git a/.bumpversion.cfg b/.bumpversion.cfg new file mode 100644 index 000000000..9e09e473e --- /dev/null +++ b/.bumpversion.cfg @@ -0,0 +1,26 @@ +[bumpversion] +current_version = 1.9 +commit = False +tag = False +allow_dirty = True +parse = (?P\d+) + \.(?P\d+) + ((?P[a-z]+)(?P\d+))? +serialize = + {major}.{minor}{release}{num} + {major}.{minor} + +[bumpversion:part:release] +optional_value = a +first_value = a +values = + a + +[bumpversion:file:CHANGES] +serialize = + {major}.{minor} + +[bumpversion:file:docker/Makefile] + +[bumpversion:file:src/etools_datamart/__init__.py] + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 262a4db9d..66e1f4f90 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -61,4 +61,3 @@ repos: args: - src - tests - stages: [push] diff --git a/CHANGES b/CHANGES index b0d89854f..ceb02566e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +1.9 (dev) +--------- +* WARNINGS: migration reset +* Location endpoint + + 1.8 --- * WARNINGS: migration reset diff --git a/Pipfile b/Pipfile index 5cd7ffc74..798594909 100644 --- a/Pipfile +++ b/Pipfile @@ -56,6 +56,7 @@ django-crispy-forms = "*" django-adminactions = "*" django-dbtemplates = {file = "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz"} django-mptt = "*" +djangorestframework-gis = "*" [dev-packages] "flake8" = ">=3.6.0" diff --git a/Pipfile.lock b/Pipfile.lock index 76e5b6155..3796558c5 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "8832190e1faa25c54328fd0f59bc55c31188ce6291b45d07206e16041494d72a" + "sha256": "a80562227f7016344c9de0148c35992f5777f92eab961210a3454f93427ab7de" }, "pipfile-spec": 6, "requires": { @@ -989,6 +989,14 @@ "index": "pypi", "version": "==2.1.0" }, + "djangorestframework-gis": { + "hashes": [ + "sha256:35527c51e083ccc93f6e6d90a6515c132bbeb2c5648b166ac5b1a48c4ea8e2a4", + "sha256:e645c6c8aedee53ac0a4851abcdf8121fff66813eebae1b040b1ccb941cb248b" + ], + "index": "pypi", + "version": "==0.14" + }, "djangorestframework-jwt": { "hashes": [ "sha256:5efe33032f3a4518a300dc51a51c92145ad95fb6f4b272e5aa24701db67936a7", diff --git a/docker/.bumpversion.cfg b/docker/.bumpversion.cfg deleted file mode 100644 index 794d6d68d..000000000 --- a/docker/.bumpversion.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[bumpversion] -current_version = 1.8 -commit = False -tag = False -allow_dirty = True -parse = (?P\d+)\.(?P.*)a(?P.*) -serialize = - {major}.{minor}a{release} - -[bumpversion:file:Makefile] - -[bumpversion:file:../src/etools_datamart/__init__.py] - diff --git a/docker/Makefile b/docker/Makefile index fae59589b..c1a9e00ca 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.8 +TARGET?=1.9 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart @@ -87,7 +87,7 @@ release: docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest docker push ${DOCKER_IMAGE_NAME}:latest docker push ${DOCKER_IMAGE_NAME}:${TARGET} - bumpversion release + bumpversion --config-file=$$PWD/../.bumpversion.cfg release run: $(MAKE) .run diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 6097faa35..fa3a01eee 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.8' +VERSION = __version__ = '1.9' __author__ = '' diff --git a/src/etools_datamart/api/endpoints/datamart/__init__.py b/src/etools_datamart/api/endpoints/datamart/__init__.py index ac2b0e94b..f3954e5e4 100644 --- a/src/etools_datamart/api/endpoints/datamart/__init__.py +++ b/src/etools_datamart/api/endpoints/datamart/__init__.py @@ -4,3 +4,4 @@ from .famindicator import FAMIndicatorViewSet # noqa from .user import UserStatsViewSet # noqa from .hact import HACTViewSet # noqa +from .location import LocationViewSet # noqa diff --git a/src/etools_datamart/api/endpoints/datamart/location.py b/src/etools_datamart/api/endpoints/datamart/location.py new file mode 100644 index 000000000..923240274 --- /dev/null +++ b/src/etools_datamart/api/endpoints/datamart/location.py @@ -0,0 +1,37 @@ +from rest_framework import serializers +from rest_framework_gis.serializers import GeoFeatureModelSerializer, GeoModelSerializer + +from etools_datamart.api.endpoints import common +from etools_datamart.apps.data import models + + +class LocationSerializerGeoJson(GeoFeatureModelSerializer): + class Meta: + model = models.Location + exclude = ('schema_name', 'tree_id', 'lft', 'rght', 'level', 'source_id') + geo_field = 'geom' + + +class LocationSerializerGIS(GeoModelSerializer): + class Meta: + model = models.Location + exclude = ('schema_name', 'tree_id', 'lft', 'rght', 'level', 'source_id') + + +class LocationSerializer(serializers.ModelSerializer): + class Meta: + model = models.Location + exclude = ('schema_name', 'tree_id', 'lft', 'rght', 'level', 'source_id', + 'geom', 'point', 'latitude', 'longitude') + + +class LocationViewSet(common.DataMartViewSet): + serializer_class = LocationSerializer + queryset = models.Location.objects.all() + filter_fields = ('area_code', 'country_name', 'last_modify_date', + ) + serializers_fieldsets = {'std': None, + 'light': ('country_name', 'area_code', 'p_code', 'name'), + 'gis': LocationSerializerGIS, + 'geo': LocationSerializerGeoJson, + } diff --git a/src/etools_datamart/api/urls.py b/src/etools_datamart/api/urls.py index cd533a209..46ae5d99f 100644 --- a/src/etools_datamart/api/urls.py +++ b/src/etools_datamart/api/urls.py @@ -26,6 +26,7 @@ class ReadOnlyRouter(APIReadOnlyRouter): router.register(r'etools/reports/results', endpoints.ReportsResultViewSet) router.register(r'etools/t2/ftravel', endpoints.FTravelViewSet) router.register(r'etools/tpm/tpmvisit', endpoints.TpmTpmvisitViewSet) +router.register(r'etools/locations', endpoints.LocationViewSet) router.register(r'datamart/pmp-indicators', endpoints.PMPIndicatorsViewSet) router.register(r'datamart/interventions', endpoints.InterventionViewSet) diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index ecb6b6f2e..8ba685386 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -235,7 +235,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, + unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, ), migrations.AlterUniqueTogether( name='famindicator', diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index da78f87ab..81ab2b8a5 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.contrib.postgres.fields.jsonb import django.db.models.deletion @@ -27,7 +27,7 @@ class Migration(migrations.Migration): ('last_changes', models.DateTimeField(help_text='last time data have been changed', null=True)), ('table_name', models.CharField(max_length=200, null=True)), ('results', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)), - ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), + ('content_type', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType')), ], options={ 'get_latest_by': 'last_run', diff --git a/src/etools_datamart/apps/etl/models.py b/src/etools_datamart/apps/etl/models.py index 707fe036d..fdb3c83b8 100644 --- a/src/etools_datamart/apps/etl/models.py +++ b/src/etools_datamart/apps/etl/models.py @@ -17,6 +17,8 @@ def filter_for_models(self, *models): def get_for_model(self, model: DataMartModel): try: return self.get(content_type=ContentType.objects.get_for_model(model)) + except EtlTask.MultipleObjectsReturned: + raise EtlTask.MultipleObjectsReturned(f"MultipleObjectsReturned for model '{model.__name__}'") except EtlTask.DoesNotExist: raise EtlTask.DoesNotExist(f"EtlTask for model '{model.__name__}' does not exists") @@ -31,15 +33,15 @@ def inspect(self): results = {True: 0, False: 0} new = [] for task in tasks: - t, created = self.get_or_create(task=task.name, + t, created = self.get_or_create(content_type=ContentType.objects.get_for_model(task.linked_model), defaults=dict( - content_type=ContentType.objects.get_for_model(task.linked_model), + task=task.name, last_run=None, table_name=task.linked_model._meta.db_table)) results[created] += 1 new.append(t.id) self.exclude(id__in=new).delete() - return results[True], results[False] + return {'created': results[True], 'updated': results[False]} class EtlTask(models.Model): @@ -51,7 +53,7 @@ class EtlTask(models.Model): last_failure = models.DateTimeField(null=True, help_text="last failure execution time") last_changes = models.DateTimeField(null=True, help_text="last time data have been changed") table_name = models.CharField(max_length=200, null=True) - content_type = models.ForeignKey(ContentType, models.CASCADE, null=True) + content_type = models.OneToOneField(ContentType, models.CASCADE, null=True) results = JSONField(blank=True, null=True) diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 0558cfd50..6f789826c 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 0eadffb79..7de336c85 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181221_1724.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181221_1724.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py index 6f2c14da6..fbe00c76c 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181221_1724.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('subscriptions', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index c1e927e9e..9e992803b 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181221_1724.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20181221_1724.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py index 25f348587..30da4eea6 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181221_1724.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('tracking', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 6592c2517..4e054b602 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -287,6 +287,7 @@ 'adminactions', 'unicef_rest_framework.apps.Config', 'rest_framework', + 'rest_framework_gis', 'oauth2_provider', 'social_django', 'rest_framework_social_oauth2', diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 92b4cf6f5..a46d32a69 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20181221_1724.py b/src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py similarity index 99% rename from src/unicef_rest_framework/migrations/0002_auto_20181221_1724.py rename to src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py index 732b34a24..dedf425c4 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20181221_1724.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), + ('contenttypes', '0002_remove_content_type_name'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), ('auth', '0009_alter_user_last_name_max_length'), - ('contenttypes', '0002_remove_content_type_name'), ] operations = [ diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index e1b78c509..b5b5c6522 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-21 17:24 +# Generated by Django 2.1.4 on 2018-12-23 09:05 import django.contrib.auth.models import django.contrib.auth.validators diff --git a/tests/_test_lib/test_utilities/factories/common.py b/tests/_test_lib/test_utilities/factories/common.py index 95665809f..8acfb0fd5 100644 --- a/tests/_test_lib/test_utilities/factories/common.py +++ b/tests/_test_lib/test_utilities/factories/common.py @@ -1,7 +1,8 @@ -import factory from django.contrib.auth.models import Group from django.utils import timezone + +import factory from factory import SubFactory from factory.base import FactoryMetaClass from post_office.models import EmailTemplate @@ -9,7 +10,6 @@ import unicef_rest_framework.models import unicef_security.models -from etools_datamart.apps.etl.models import EtlTask from etools_datamart.apps.security.models import SchemaAccessControl from etools_datamart.apps.subscriptions.models import Subscription from etools_datamart.apps.tracking.models import APIRequestLog @@ -30,14 +30,14 @@ class RegisterModelFactory(factory.DjangoModelFactory, metaclass=AutoRegisterFac pass -class TaskLogFactory(RegisterModelFactory): - elapsed = 10 - last_success = timezone.now() - last_failure = timezone.now() - last_changes = timezone.now() - - class Meta: - model = EtlTask +# class TaskLogFactory(RegisterModelFactory): +# elapsed = 10 +# last_success = timezone.now() +# last_failure = timezone.now() +# last_changes = timezone.now() +# +# class Meta: +# model = EtlTask class APIRequestLogFactory(RegisterModelFactory): diff --git a/tests/_test_lib/test_utilities/factories/data.py b/tests/_test_lib/test_utilities/factories/data.py index 09c0d5908..9661ba1f8 100644 --- a/tests/_test_lib/test_utilities/factories/data.py +++ b/tests/_test_lib/test_utilities/factories/data.py @@ -1,9 +1,10 @@ import random from datetime import datetime -import factory from django.db import connections from django.utils import timezone + +import factory from factory.fuzzy import BaseFuzzyAttribute from test_utilities.factories import today from test_utilities.factories.common import RegisterModelFactory diff --git a/tests/_test_lib/test_utilities/perms.py b/tests/_test_lib/test_utilities/perms.py index 6bb6a4018..9e27d0319 100644 --- a/tests/_test_lib/test_utilities/perms.py +++ b/tests/_test_lib/test_utilities/perms.py @@ -3,6 +3,7 @@ from random import choice from django.contrib.auth.models import Permission + from faker import Faker from .factories import GroupFactory diff --git a/tests/api/test_api_auth_jwt.py b/tests/api/test_api_auth_jwt.py index 07d8d854c..285b96d78 100644 --- a/tests/api/test_api_auth_jwt.py +++ b/tests/api/test_api_auth_jwt.py @@ -1,8 +1,9 @@ from unittest import mock +from django.urls import reverse + import pytest from constance.test import override_config -from django.urls import reverse from test_utilities.factories import UserFactory TOKEN = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9." \ diff --git a/tests/api/test_api_common.py b/tests/api/test_api_common.py index cb9e5de06..6631dc547 100644 --- a/tests/api/test_api_common.py +++ b/tests/api/test_api_common.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from unittest.mock import Mock -import pytest from django.http import Http404 + +import pytest from drf_querystringfilter.exceptions import QueryFilterException from dynamic_serializer.core import InvalidSerializerError from rest_framework.exceptions import AuthenticationFailed, NotAuthenticated, PermissionDenied diff --git a/tests/api/test_api_data.py b/tests/api/test_api_data.py index 709438b3c..7b190c5fb 100644 --- a/tests/api/test_api_data.py +++ b/tests/api/test_api_data.py @@ -1,106 +1,50 @@ # -*- coding: utf-8 -*- import pytest -from django.contrib.contenttypes.models import ContentType -from django.utils import timezone -from test_utilities.factories import (FAMIndicatorFactory, HACTFactory, InterventionFactory, - PMPIndicatorFactory, TaskLogFactory, UserStatsFactory,) +from test_utilities.factories import factories_registry -from etools_datamart.api.endpoints import (FAMIndicatorViewSet, HACTViewSet, InterventionViewSet, - PMPIndicatorsViewSet, UserStatsViewSet,) -from etools_datamart.apps.data.models import FAMIndicator -from etools_datamart.apps.etl.models import EtlTask - -VIEWSETS = [ - FAMIndicatorViewSet, - HACTViewSet, - InterventionViewSet, - PMPIndicatorsViewSet, - UserStatsViewSet, -] +from etools_datamart.api.urls import router FORMATS = (('', 'application/json'), ('csv', 'text/csv; charset=utf-8'), - ('xml', 'application/xml; charset=utf-8'), - ('xhtml', 'text/html; charset=utf-8'), + ('iqy', 'text/plain; charset=utf-8'), ('json', 'application/json'), - ('ms-xml', 'application/xml; charset=utf-8'), ('ms-json', 'application/json'), - ('csv', 'text/csv; charset=utf-8'), + ('ms-xml', 'application/xml; charset=utf-8'), ('pdf', 'application/pdf; charset=utf-8'), - ('xlsx', 'application/xlsx; charset=utf-8'), ('txt', 'text/plain; charset=utf-8'), - ('iqy', 'text/plain; charset=utf-8'), + ('xhtml', 'text/html; charset=utf-8'), + ('xlsx', 'application/xlsx; charset=utf-8'), + ('xml', 'application/xml; charset=utf-8'), ) @pytest.fixture() -def data(db): - EtlTask.objects.inspect() - data = [ - FAMIndicatorFactory(), - HACTFactory(), - InterventionFactory(), - PMPIndicatorFactory(), - UserStatsFactory(), - ] +def data(db, request): + # TIPS: database access is forbidden in pytest_generate_tests + viewset = request.getfixturevalue('viewset') + factory = factories_registry[viewset.serializer_class.Meta.model] + data = (factory(schema_name='bolivia'), + factory(schema_name='chad'), + factory(schema_name='lebanon')) yield [r.delete() for r in data] +def pytest_generate_tests(metafunc, *args): + if 'serializer' in metafunc.fixturenames: + for prefix, viewset, basenametry in router.registry: + if prefix.startswith('datamart/'): + sers = viewset.serializers_fieldsets.keys() + for ser in sers: + metafunc.addcall(funcargs={'viewset': viewset, + 'serializer': ser}, + id=f'{viewset.__name__}-{ser}') + + @pytest.mark.parametrize("action", ['', 'updates/']) -@pytest.mark.parametrize("format,ct", FORMATS) -@pytest.mark.parametrize("viewset", VIEWSETS) -def test_list(client, action, viewset, format, ct, data): +@pytest.mark.parametrize("format,ct", FORMATS, ids=[f[0] for f in FORMATS]) +def test_list(client, action, viewset, format, ct, data, serializer): res = client.get(f"{viewset.get_service().endpoint}{action}?format={format}") assert res.status_code == 200, res assert res.content assert res['Content-Type'] == ct - - -def test_updates(client): - viewset = FAMIndicatorViewSet() - TaskLogFactory(last_changes=timezone.now(), - content_type=ContentType.objects.get_for_model(FAMIndicator)) - - url = f"{viewset.get_service().endpoint}updates/" - res = client.get(url) - assert res.status_code == 200, res - -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_list_json(client, viewset): -# res = client.get(viewset.get_service().endpoint) -# assert res.status_code == 200, res -# assert res.json() -# -# -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_list_csv(client, viewset, data): -# res = client.get(f"{viewset.get_service().endpoint}?format=csv", format='csv') -# assert res.status_code == 200, res -# assert res['Content-Type'] == "text/csv; charset=utf-8" -# -# -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_list_xml(client, viewset): -# res = client.get(f"{viewset.get_service().endpoint}?format=xml", format='xml') -# assert res.status_code == 200, res -# -# -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_list_msxml(client, viewset): -# res = client.get(f"{viewset.get_service().endpoint}?format=ms-xml", format='ms-xml') -# assert res.status_code == 200, res -# -# -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_list_msjson(client, viewset): -# res = client.get(f"{viewset.get_service().endpoint}?format=ms-json", format='ms-json') -# assert res.status_code == 200, res -# assert res.json() -# -# -# @pytest.mark.parametrize("viewset", VIEWSETS) -# def test_updates(client, viewset): -# res = client.get(f"{viewset.get_service().endpoint}/updates/?format=ms-json", format='ms-json') -# assert res.status_code == 200, res -# assert res.json() diff --git a/tests/api/test_api_pages.py b/tests/api/test_api_pages.py index 59d215d9b..0bbd6b2e5 100644 --- a/tests/api/test_api_pages.py +++ b/tests/api/test_api_pages.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -import pytest from django.urls import reverse + +import pytest from test_utilities.factories import InterventionFactory diff --git a/tests/api/test_api_permission.py b/tests/api/test_api_permission.py index 33725c96d..5856dd336 100644 --- a/tests/api/test_api_permission.py +++ b/tests/api/test_api_permission.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -import pytest from django.utils.http import urlquote + +import pytest from rest_framework.test import APIClient from test_utilities.factories import InterventionFactory diff --git a/tests/api/test_api_system.py b/tests/api/test_api_system.py index 5a94b33d0..6c0d2213a 100644 --- a/tests/api/test_api_system.py +++ b/tests/api/test_api_system.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- from rest_framework.reverse import reverse -from test_utilities.factories import TaskLogFactory from etools_datamart.api.urls import router @@ -14,7 +13,6 @@ def pytest_generate_tests(metafunc): def test_list(client, url): - TaskLogFactory() res = client.get(url, HTTP_X_SCHEMA="public") assert res.status_code == 200, res assert res.json() diff --git a/tests/api/test_system_filters.py b/tests/api/test_system_filters.py index f9d3fe4ba..b5e096eb7 100644 --- a/tests/api/test_system_filters.py +++ b/tests/api/test_system_filters.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -import pytest from django.contrib.auth.models import User + +import pytest from rest_framework.test import APIClient from test_utilities.factories import InterventionFactory, SystemFilterFactory, UserAccessControlFactory diff --git a/tests/conftest.py b/tests/conftest.py index 4dff38d6c..22945acef 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,6 +8,8 @@ import pytest from _pytest.fixtures import SubRequest +from etools_datamart.apps.etl.models import EtlTask + def pytest_configure(config): # enable this to remove deprecations @@ -65,6 +67,7 @@ def django_db_setup(request, from etools_datamart.apps.tracking.models import APIRequestLog from test_utilities.factories import UserFactory with django_db_blocker.unblock(): + EtlTask.objects.inspect() Service.objects.load_services() UserAccessControl.objects.all().delete() APIRequestLog.objects.truncate() diff --git a/tests/datamart/test_data_admin.py b/tests/datamart/test_data_admin.py index 6e12afd35..3bbf98f79 100644 --- a/tests/datamart/test_data_admin.py +++ b/tests/datamart/test_data_admin.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from unittest.mock import MagicMock -import pytest from django.contrib import messages from django.contrib.admin.sites import site from django.urls import reverse + +import pytest from strategy_field.utils import fqn from test_utilities.factories import factories_registry, PMPIndicatorFactory from test_utilities.perms import user_grant_permissions diff --git a/tests/etl/test_etl_admin.py b/tests/etl/test_etl_admin.py index f76f03a6b..7d3cb9efa 100644 --- a/tests/etl/test_etl_admin.py +++ b/tests/etl/test_etl_admin.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- -import pytest from django.contrib import messages from django.urls import reverse + +import pytest from django_celery_beat.models import CrontabSchedule, PeriodicTask from etools_datamart.apps.etl.models import EtlTask diff --git a/tests/etl/test_etl_tasklog.py b/tests/etl/test_etl_tasklog.py index 8cee4f6bf..504076abd 100644 --- a/tests/etl/test_etl_tasklog.py +++ b/tests/etl/test_etl_tasklog.py @@ -2,8 +2,6 @@ import pytest from celery.signals import task_postrun -from django.contrib.contenttypes.models import ContentType -from test_utilities.factories import TaskLogFactory from unicef_security.models import User @@ -54,7 +52,7 @@ def test_no_changes(db): def test_manager(db): - TaskLogFactory(content_type=ContentType.objects.get_for_model(HACT)) + # TaskLogFactory(content_type=ContentType.objects.get_for_model(HACT)) assert EtlTask.objects.filter_for_models(HACT) assert EtlTask.objects.get_for_model(HACT) with pytest.raises(EtlTask.DoesNotExist): diff --git a/tests/etools/test_etools_admin.py b/tests/etools/test_etools_admin.py index 156e45e57..4ac13daf5 100644 --- a/tests/etools/test_etools_admin.py +++ b/tests/etools/test_etools_admin.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -import pytest from django.contrib.admin.sites import site from django.db import connections from django.urls import reverse +import pytest + from etools_datamart.apps.etools.models import PartnersPartnerorganization from etools_datamart.apps.multitenant.models import TenantModel diff --git a/tests/exporters/test_exporter_data.py b/tests/exporters/test_exporter_data.py index e4f9934bf..a39e1a057 100644 --- a/tests/exporters/test_exporter_data.py +++ b/tests/exporters/test_exporter_data.py @@ -1,8 +1,9 @@ import io import os -import pytest from django.urls import reverse + +import pytest from rest_framework.test import APIClient from etools_datamart.apps.data.models import UserStats diff --git a/tests/multitenant/test_db.py b/tests/multitenant/test_db.py index d7300178a..ed72a9424 100644 --- a/tests/multitenant/test_db.py +++ b/tests/multitenant/test_db.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- -import pytest from django.db import connections +import pytest + from etools_datamart.apps.etools.models import (ActionPointsActionpoint, AuthGroup, PartnersPartnerorganization, ReportsResult,) diff --git a/tests/multitenant/test_schema_selection.py b/tests/multitenant/test_schema_selection.py index b1b11161d..190ecaa23 100644 --- a/tests/multitenant/test_schema_selection.py +++ b/tests/multitenant/test_schema_selection.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -import pytest from django.db import connections from django.urls import reverse +import pytest + from etools_datamart.apps.multitenant.exceptions import InvalidSchema conn = connections['etools'] diff --git a/tests/test_commands.py b/tests/test_commands.py index 2c4d78465..1a98cd0ad 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -4,11 +4,12 @@ from unittest import mock from unittest.mock import MagicMock -import pytest from django.contrib.auth import get_user_model from django.core.management import call_command from django.db import OperationalError +import pytest + pytestmark = pytest.mark.slow diff --git a/tests/test_subscription.py b/tests/test_subscription.py index a68c12bd7..19266f73e 100644 --- a/tests/test_subscription.py +++ b/tests/test_subscription.py @@ -2,10 +2,11 @@ import json from unittest.mock import MagicMock -import pytest from django.contrib.auth.models import AnonymousUser from django.http import HttpResponse from django.urls import reverse + +import pytest from test_utilities.factories import EmailTemplateFactory, HACTFactory, SubscriptionFactory from unicef_rest_framework.test_utils import user_allow_service diff --git a/tests/tracking/test_tracking_log.py b/tests/tracking/test_tracking_log.py index 201f1c706..0ded82bb9 100644 --- a/tests/tracking/test_tracking_log.py +++ b/tests/tracking/test_tracking_log.py @@ -3,9 +3,10 @@ from time import sleep from unittest.mock import Mock -import pytest from django.contrib.auth.models import AnonymousUser from django.urls import reverse + +import pytest from test_utilities.factories import AdminFactory, UserFactory from etools_datamart.api.endpoints import InterventionViewSet diff --git a/tests/tracking/test_tracking_task.py b/tests/tracking/test_tracking_task.py index 48e66922e..3cc013d89 100644 --- a/tests/tracking/test_tracking_task.py +++ b/tests/tracking/test_tracking_task.py @@ -2,8 +2,9 @@ import datetime from datetime import timedelta -import pytest from django.utils import timezone + +import pytest from test_utilities.factories import APIRequestLogFactory from etools_datamart.apps.tracking.middleware import log_request From 2f5f1d0b5946e5ff90700fc5d75e3b6cdc14f846 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 26 Dec 2018 08:41:14 +0100 Subject: [PATCH 002/122] use fqn as task name --- src/etools_datamart/apps/data/loader.py | 3 ++- .../apps/init/management/commands/init-setup.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index f3e18b1b7..fb01fd9d7 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -103,7 +103,8 @@ class LoaderTask(celery.Task): def __init__(self, loader) -> None: self.loader = loader self.linked_model = loader.model - self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) + self.name = fqn(self.linked_model) + # self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) def run(self, *args, **kwargs): return self.loader.load() diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index d4bfc8c76..d808420bb 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -227,8 +227,8 @@ def handle(self, *args, **options): if options['tasks'] or _all or options['refresh']: midnight, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=0) - CrontabSchedule.objects.get_or_create(hour=[0, 6, 12, 18]) - CrontabSchedule.objects.get_or_create(hour=[0, 12]) + CrontabSchedule.objects.get_or_create(hour='0, 6, 12, 18') + CrontabSchedule.objects.get_or_create(hour='0, 12') IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.HOURS) every_minute, __ = IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.MINUTES) From 02352d0a38dd1575349e3cf1d461b0de43842936 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 26 Dec 2018 09:42:44 +0100 Subject: [PATCH 003/122] updates init-setup logic --- .../init/management/commands/init-setup.py | 128 ++++++++++-------- tests/test_celery.py | 2 +- 2 files changed, 71 insertions(+), 59 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index d808420bb..7eba20397 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -10,7 +10,6 @@ from django.core.management import call_command from django.core.management.base import BaseCommand from django.db import connections -from django.utils.module_loading import import_string from constance import config from django_celery_beat.models import CrontabSchedule, IntervalSchedule, PeriodicTask @@ -104,10 +103,24 @@ def add_arguments(self, parser): help='select all production deployment options') parser.add_argument( - '--no-migrate', - action='store_false', + '--collectstatic', + action='store_true', + dest='collectstatic', + default=False, + help='') + + parser.add_argument( + '--users', + action='store_true', + dest='users', + default=False, + help='') + + parser.add_argument( + '--migrate', + action='store_true', dest='migrate', - default=True, + default=False, help='select all production deployment options') parser.add_argument( @@ -128,43 +141,18 @@ def handle(self, *args, **options): verbosity = options['verbosity'] migrate = options['migrate'] _all = options['all'] + ModelUser = get_user_model() + # interactive = options['interactive'] - self.stdout.write(f"Run collectstatic") - call_command('collectstatic', verbosity=verbosity - 1, interactive=False) + if options['collectstatic'] or _all: + self.stdout.write(f"Run collectstatic") + call_command('collectstatic', verbosity=verbosity - 1, interactive=False) if migrate or _all: self.stdout.write(f"Run migrations") call_command('migrate', verbosity=verbosity - 1) - ModelUser = get_user_model() - if settings.DEBUG: - pwd = '123' - admin = os.environ.get('USER', 'admin') - else: - pwd = os.environ.get('ADMIN_PASSWORD', ModelUser.objects.make_random_password()) - admin = os.environ.get('ADMIN_USERNAME', 'admin') - - self._admin_user, created = ModelUser.objects.get_or_create(username=admin, - defaults={"is_superuser": True, - "is_staff": True, - "password": make_password(pwd)}) - - if created: # pragma: no cover - self.stdout.write(f"Created superuser `{admin}` with password `{pwd}`") - else: # pragma: no cover - self.stdout.write(f"Superuser `{admin}` already exists`.") - - self.stdout.write(f"Create anonymous") - anonymous, created = ModelUser.objects.get_or_create(username='anonymous', - defaults={"is_superuser": False, - "is_staff": False, - "password": make_password(uuid.uuid4())}) - # self.stdout.write(f"Create group `Guest`") - # Group.objects.get_or_create(name='Guests') - # self.stdout.write(f"Create group `Endpoints all access`") - # all_access, __ = Group.objects.get_or_create(name='All endpoints access') - self.stdout.write(f"Create group `Public areas access`") public_areas, __ = Group.objects.get_or_create(name='Public areas access') config.DEFAULT_GROUP = 'Public areas access' @@ -172,6 +160,48 @@ def handle(self, *args, **options): self.stdout.write(f"Create group `Restricted areas access`") restricted_areas, __ = Group.objects.get_or_create(name='Restricted areas access') + if options['users'] or _all: + if settings.DEBUG: + pwd = '123' + admin = os.environ.get('USER', 'admin') + else: + pwd = os.environ.get('ADMIN_PASSWORD', ModelUser.objects.make_random_password()) + admin = os.environ.get('ADMIN_USERNAME', 'admin') + + self._admin_user, created = ModelUser.objects.get_or_create(username=admin, + defaults={"is_superuser": True, + "is_staff": True, + "password": make_password(pwd)}) + + if created: # pragma: no cover + self.stdout.write(f"Created superuser `{admin}` with password `{pwd}`") + else: # pragma: no cover + self.stdout.write(f"Superuser `{admin}` already exists`.") + + self.stdout.write(f"Create anonymous") + anonymous, created = ModelUser.objects.get_or_create(username='anonymous', + defaults={"is_superuser": False, + "is_staff": False, + "password": make_password(uuid.uuid4())}) + + if os.environ.get('AUTOCREATE_USERS'): + self.stdout.write("Found 'AUTOCREATE_USERS' environment variable") + self.stdout.write("Going to create new users") + try: + for entry in os.environ.get('AUTOCREATE_USERS').split('|'): + email, pwd = entry.split(',') + u, created = ModelUser.objects.get_or_create(username=email) + if created: + self.stdout.write(f"Created user {u}") + u.set_password(pwd) + u.save() + u.groups.add(public_areas) + else: # pragma: no cover + self.stdout.write(f"User {u} already exists.") + + except Exception as e: # pragma: no cover + warnings.warn(f"Unable to create default users. {e}") + self.stdout.write(f"Grants all schemas to group `Endpoints all access`") SchemaAccessControl.objects.get_or_create(group=public_areas, schemas=get_everybody_available_areas()) @@ -207,24 +237,6 @@ def handle(self, *args, **options): RedisServer.objects.get_or_create(hostname=spec.hostname, port=int(spec.port)) - if os.environ.get('AUTOCREATE_USERS'): - self.stdout.write("Found 'AUTOCREATE_USERS' environment variable") - self.stdout.write("Going to create new users") - try: - for entry in os.environ.get('AUTOCREATE_USERS').split('|'): - email, pwd = entry.split(',') - u, created = ModelUser.objects.get_or_create(username=email) - if created: - self.stdout.write(f"Created user {u}") - u.set_password(pwd) - u.save() - u.groups.add(public_areas) - else: # pragma: no cover - self.stdout.write(f"User {u} already exists.") - - except Exception as e: # pragma: no cover - warnings.warn(f"Unable to create default users. {e}") - if options['tasks'] or _all or options['refresh']: midnight, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=0) CrontabSchedule.objects.get_or_create(hour='0, 6, 12, 18') @@ -239,12 +251,12 @@ def handle(self, *args, **options): __, is_new = PeriodicTask.objects.get_or_create(task=fqn(task), defaults={'name': task.name, 'crontab': midnight}) - for task in PeriodicTask.objects.all(): - try: - import_string(task.task) - except ImportError: - task.delete() - counters[False] += 1 + + PeriodicTask.objects.get_or_create(task='AAAAAA', + defaults={'name': 'AAAAA', + 'crontab': midnight}) + ret = PeriodicTask.objects.exclude(name__in=list(app.tasks.keys())).delete() + counters[False] = ret['django_celery_beat.PeriodicTask'] EtlTask.objects.inspect() self.stdout.write( diff --git a/tests/test_celery.py b/tests/test_celery.py index 421e8fcc9..f8d97e822 100644 --- a/tests/test_celery.py +++ b/tests/test_celery.py @@ -3,4 +3,4 @@ def test_autodiscover(): ret = app.tasks - assert 'load_data_hact' in ret + assert 'load_data_hact' in ret, ret.keys() From 6b2235e735c75cc544bbbb55009d0f7a866c48b7 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 26 Dec 2018 10:37:09 +0100 Subject: [PATCH 004/122] updates init-setup logic --- .../apps/init/management/commands/init-setup.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index 7eba20397..a4d34257c 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -252,11 +252,8 @@ def handle(self, *args, **options): defaults={'name': task.name, 'crontab': midnight}) - PeriodicTask.objects.get_or_create(task='AAAAAA', - defaults={'name': 'AAAAA', - 'crontab': midnight}) ret = PeriodicTask.objects.exclude(name__in=list(app.tasks.keys())).delete() - counters[False] = ret['django_celery_beat.PeriodicTask'] + counters[False] = ret[1].get('django_celery_beat.PeriodicTask', 0) EtlTask.objects.inspect() self.stdout.write( From 638c7f1e5619772f1e859446638039babd9e4fb0 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 26 Dec 2018 22:46:57 +0100 Subject: [PATCH 005/122] updates etl celery names algo --- src/etools_datamart/apps/data/loader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index fb01fd9d7..bc2503ecc 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -103,8 +103,8 @@ class LoaderTask(celery.Task): def __init__(self, loader) -> None: self.loader = loader self.linked_model = loader.model - self.name = fqn(self.linked_model) - # self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) + # self.name = fqn(self.linked_model) + self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) def run(self, *args, **kwargs): return self.loader.load() From 8867be413d907998faa9637563dcfc112cb46c6c Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 09:15:42 +0100 Subject: [PATCH 006/122] updates GatewayType Loader key --- src/etools_datamart/apps/data/exceptions.py | 7 +++++++ src/etools_datamart/apps/data/loader.py | 18 ++++++++++++++---- .../apps/data/models/location.py | 5 ++++- src/etools_datamart/celery.py | 16 +++++++++------- 4 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 src/etools_datamart/apps/data/exceptions.py diff --git a/src/etools_datamart/apps/data/exceptions.py b/src/etools_datamart/apps/data/exceptions.py new file mode 100644 index 000000000..8a02c50b4 --- /dev/null +++ b/src/etools_datamart/apps/data/exceptions.py @@ -0,0 +1,7 @@ +class LoaderException(Exception): + def __init__(self, message, error=None): + self.message = message + self.error = error + + def __repr__(self): + return str(self.message) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index bc2503ecc..ed9b7837e 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -3,6 +3,7 @@ from django.core.cache import caches from django.db import connections, models +from django.db.transaction import atomic from django.utils import timezone import celery @@ -10,6 +11,7 @@ from redis.exceptions import LockError from strategy_field.utils import fqn, get_attr +from etools_datamart.apps.data.exceptions import LoaderException from etools_datamart.celery import app loadeables = set() @@ -25,10 +27,12 @@ class EtlResult: __slots__ = [CREATED, UPDATED, UNCHANGED] - def __init__(self, updated=0, created=0, unchanged=0, **kwargs): + def __init__(self, updated=0, created=0, unchanged=0, status='SUCCESS', **kwargs): self.created = created self.updated = updated self.unchanged = unchanged + self.status = status + self.error = None def __repr__(self): return repr(self.as_dict()) @@ -39,7 +43,9 @@ def incr(self, counter): def as_dict(self): return {'created': self.created, 'updated': self.updated, - 'unchanged': self.unchanged} + 'unchanged': self.unchanged, + 'status': self.status, + 'error': self.error} def __eq__(self, other): if isinstance(other, EtlResult): @@ -162,8 +168,9 @@ def process(self, filters, values): return op except Exception as e: # pragma: no cover logger.exception(e) - process_exception(e) - raise Exception(f"Error in {self}: {e}") from e + err = process_exception(e) + raise LoaderException(f"Error in {self}: {e}", + err) from e def get_values(self, country, record): ret = {} @@ -233,6 +240,7 @@ def unlock(self): except LockError: pass + @atomic() def load(self, verbosity=0, always_update=False, stdout=None, ignore_dependencies=False, max_records=None, countries=None): have_lock = False @@ -273,6 +281,8 @@ def load(self, verbosity=0, always_update=False, stdout=None, break if stdout: # pragma: no cover stdout.write("\n") + except LoaderException: + raise finally: if have_lock: # pragma: no branch try: diff --git a/src/etools_datamart/apps/data/models/location.py b/src/etools_datamart/apps/data/models/location.py index a560e6400..e030977f2 100644 --- a/src/etools_datamart/apps/data/models/location.py +++ b/src/etools_datamart/apps/data/models/location.py @@ -11,10 +11,13 @@ class GatewayType(DataMartModel): source_id = models.IntegerField(blank=True, null=True) class Meta: - unique_together = ('schema_name', 'name'), ('schema_name', 'admin_level') + unique_together = (('schema_name', 'name'), + ('schema_name', 'admin_level')) class Options: source = LocationsGatewaytype + key = lambda country, record: dict(schema_name=country.schema_name, + name=record.name) mapping = {'source_id': 'id', 'area_code': lambda country, record: country.business_area_code, } diff --git a/src/etools_datamart/celery.py b/src/etools_datamart/celery.py index 7adb66d3c..d88cef8de 100644 --- a/src/etools_datamart/celery.py +++ b/src/etools_datamart/celery.py @@ -80,13 +80,15 @@ def task_postrun_handler(signal, sender, task_id, task, args, kwargs, retval, st if state == 'SUCCESS': try: defs['results'] = retval.as_dict() - if retval.created > 0 or retval.updated > 0: - defs['last_changes'] = timezone.now() - for service in sender.linked_model.linked_services: - service.invalidate_cache() - Subscription.objects.notify(sender.linked_model) - defs['last_success'] = timezone.now() - + if not retval.error: + if retval.created > 0 or retval.updated > 0: + defs['last_changes'] = timezone.now() + for service in sender.linked_model.linked_services: + service.invalidate_cache() + Subscription.objects.notify(sender.linked_model) + defs['last_success'] = timezone.now() + else: + defs['status'] = 'ERROR' except Exception as e: # pragma: no cover logger.error(e) defs['results'] = str(retval) From 40d94af455b687618e1cfa663054ec57ec2c13b1 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 10:55:26 +0100 Subject: [PATCH 007/122] Loader: handle deleted records --- src/etools_datamart/apps/data/loader.py | 66 +++++++++++++------ .../apps/data/migrations/0001_initial.py | 9 ++- src/etools_datamart/apps/data/models/base.py | 13 ++++ src/etools_datamart/apps/data/models/fam.py | 8 +-- src/etools_datamart/apps/data/models/hact.py | 8 +-- src/etools_datamart/apps/data/models/pmp.py | 5 +- src/etools_datamart/apps/data/models/user.py | 7 +- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...223_0905.py => 0002_auto_20181228_0856.py} | 4 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...223_0905.py => 0002_auto_20181228_0856.py} | 4 +- src/etools_datamart/celery.py | 3 + .../migrations/0001_initial.py | 2 +- ...223_0905.py => 0002_auto_20181228_0856.py} | 8 +-- .../migrations/0001_initial.py | 2 +- tests/etl/test_etl_loaders.py | 6 +- 18 files changed, 101 insertions(+), 52 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20181223_0905.py => 0002_auto_20181228_0856.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20181223_0905.py => 0002_auto_20181228_0856.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20181223_0905.py => 0002_auto_20181228_0856.py} (98%) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index ed9b7837e..df8596d62 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -22,17 +22,20 @@ CREATED = 'created' UPDATED = 'updated' UNCHANGED = 'unchanged' +DELETED = 'deleted' class EtlResult: - __slots__ = [CREATED, UPDATED, UNCHANGED] + __slots__ = [CREATED, UPDATED, UNCHANGED, DELETED, 'status', 'context', 'error'] - def __init__(self, updated=0, created=0, unchanged=0, status='SUCCESS', **kwargs): + def __init__(self, updated=0, created=0, unchanged=0, deleted=0, status='SUCCESS', context=None, **kwargs): self.created = created self.updated = updated self.unchanged = unchanged + self.deleted = deleted self.status = status self.error = None + self.context = context or {} def __repr__(self): return repr(self.as_dict()) @@ -40,13 +43,28 @@ def __repr__(self): def incr(self, counter): setattr(self, counter, getattr(self, counter) + 1) + def add(self, counter, value): + setattr(self, counter, getattr(self, counter) + value) + def as_dict(self): return {'created': self.created, 'updated': self.updated, 'unchanged': self.unchanged, + 'deleted': self.deleted, 'status': self.status, 'error': self.error} + def __add__(self, other): + if isinstance(other, EtlResult): + ret = EtlResult(created=self.created + other.created, + updated=self.updated + other.updated, + unchanged=self.unchanged + other.unchanged, + deleted=self.deleted + other.deleted, + context=self.context + ) + return ret + raise ValueError(f"Cannot add EtlREsult with {other}") + def __eq__(self, other): if isinstance(other, EtlResult): other = other.as_dict() @@ -54,7 +72,9 @@ def __eq__(self, other): if isinstance(other, dict): return (self.created == other['created'] and self.updated == other['updated'] and - self.unchanged == other['unchanged']) + self.unchanged == other['unchanged'] and + self.deleted == other['deleted'] + ) return False @@ -130,6 +150,7 @@ def __init__(self) -> None: self.config = None self.tree_parents = [] self.always_update = False + self.seen = [] def __repr__(self): return "<%sLoader>" % self.model._meta.object_name @@ -154,17 +175,18 @@ def contribute_to_class(self, model, name): def process(self, filters, values): try: - existing, created = self.model.objects.get_or_create(**filters, - defaults=values) + record, created = self.model.objects.get_or_create(**filters, + defaults=values) if created: op = CREATED else: - if self.always_update or is_record_changed(existing, values): + if self.always_update or is_record_changed(record, values): op = UPDATED - self.model.objects.update_or_create(**filters, - defaults=values) + record, created = self.model.objects.update_or_create(**filters, + defaults=values) else: op = UNCHANGED + self.seen.append(record.pk) return op except Exception as e: # pragma: no cover logger.exception(e) @@ -172,7 +194,7 @@ def process(self, filters, values): raise LoaderException(f"Error in {self}: {e}", err) from e - def get_values(self, country, record): + def get_values(self, country, record, context): ret = {} for k, v in self.mapping.items(): if v == '__self__': @@ -195,9 +217,10 @@ def get_values(self, country, record): ret[k] = v(country, record) else: ret[k] = get_attr(record, v) + ret['seen'] = context['today'] return ret - def process_post_country(self, country, context): + def post_process_country(self, country, context): for mart, etools in self.tree_parents: kk = self.model.objects.get(schema_name=country.schema_name, source_id=mart) @@ -206,22 +229,27 @@ def process_post_country(self, country, context): kk.save() self.tree_parents = [] - def process_country(self, results: EtlResult, country, context) -> EtlResult: + # delete unseen records + self.model.objects.filter(id__in=self.seen).update(seen=context['today']) + deleted = self.model.objects.exclude(id__in=self.seen).delete()[0] + self.results.deleted += deleted + + def process_country(self, country, context): qs = self.config.queryset() stdout = context['stdout'] max_records = context['max_records'] + self.seen = [] for record in qs.all(): filters = self.config.key(country, record) - values = self.get_values(country, record) + values = self.get_values(country, record, context) op = self.process(filters, values) - results.incr(op) + self.results.incr(op) context['records'] += 1 if stdout: # pragma: no cover stdout.write('.') stdout.flush() if max_records and context['records'] >= max_records: break - return results def get_context(self, **kwargs): context = {} @@ -244,7 +272,7 @@ def unlock(self): def load(self, verbosity=0, always_update=False, stdout=None, ignore_dependencies=False, max_records=None, countries=None): have_lock = False - results = EtlResult() + self.results = EtlResult() lock = locks.lock(self.config.lock_key, timeout=self.config.timeout) try: have_lock = lock.acquire(blocking=False) @@ -270,13 +298,13 @@ def load(self, verbosity=0, always_update=False, stdout=None, max_records=max_records, records=0, stdout=stdout) - + self.results.context = context for country in countries: if stdout: # pragma: no cover stdout.write(f"{country}\n") connection.set_schemas([country.schema_name]) - self.process_country(results, country, context) - self.process_post_country(country, context) + self.process_country(country, context) + self.post_process_country(country, context) if max_records and context['records'] >= max_records: break if stdout: # pragma: no cover @@ -289,4 +317,4 @@ def load(self, verbosity=0, always_update=False, stdout=None, lock.release() except LockError as e: # pragma: no cover logger.warning(e) - return results + return self.results diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 8ba685386..ea05ef610 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -24,6 +24,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('month', month_field.models.MonthField(verbose_name='Month Value')), ('spotcheck_ip_contacted', models.IntegerField(default=0, verbose_name='Spot Check-IP Contacted')), ('spotcheck_report_submitted', models.IntegerField(default=0, verbose_name='Spot Check-Report Submitted')), @@ -55,6 +56,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('name', models.CharField(db_index=True, max_length=64)), ('admin_level', models.SmallIntegerField(blank=True, null=True)), ('source_id', models.IntegerField(blank=True, null=True)), @@ -68,6 +70,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('year', models.IntegerField()), ('microassessments_total', models.IntegerField(default=0, help_text='Total number of completed Microassessments in the business area in the past year')), ('programmaticvisits_total', models.IntegerField(default=0, help_text='Total number of completed Programmatic visits in the business area')), @@ -89,6 +92,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('created', models.DateTimeField(auto_now=True)), ('updated', models.DateTimeField(null=True)), ('document_type', models.CharField(max_length=255, null=True)), @@ -143,6 +147,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('name', models.CharField(max_length=254)), ('latitude', models.FloatField(blank=True, null=True)), ('longitude', models.FloatField(blank=True, null=True)), @@ -172,6 +177,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('vendor_number', models.CharField(db_index=True, max_length=255, null=True)), ('partner_name', models.CharField(db_index=True, max_length=255, null=True)), ('partner_type', models.CharField(db_index=True, max_length=255, null=True)), @@ -214,6 +220,7 @@ class Migration(migrations.Migration): ('schema_name', models.CharField(db_index=True, max_length=63)), ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), ('month', month_field.models.MonthField(verbose_name='Month Value')), ('total', models.IntegerField(default=0, verbose_name='Total users')), ('unicef', models.IntegerField(default=0, verbose_name='UNICEF uswers')), diff --git a/src/etools_datamart/apps/data/models/base.py b/src/etools_datamart/apps/data/models/base.py index d162be924..2d952009a 100644 --- a/src/etools_datamart/apps/data/models/base.py +++ b/src/etools_datamart/apps/data/models/base.py @@ -10,6 +10,18 @@ class DataMartQuerySet(QuerySet): + def get(self, *args, **kwargs): + try: + super(DataMartQuerySet, self).get(*args, **kwargs) + except self.model.DoesNotExist: + raise self.model.DoesNotExist( + "%s matching query does not exist. (%s %s)" % + (self.model._meta.object_name, args, kwargs) + ) + except self.model.MultipleObjectsReturned as e: + raise self.model.MultipleObjectsReturned( + "%s (%s %s) " % (e, args, kwargs) + ) def filter_schemas(self, *schemas): if schemas and schemas[0]: @@ -58,6 +70,7 @@ class DataMartModel(models.Model, metaclass=DataMartModelBase): schema_name = models.CharField(max_length=63, db_index=True) area_code = models.CharField(max_length=10, db_index=True) last_modify_date = models.DateTimeField(blank=True, auto_now=True) + seen = models.DateTimeField(blank=True, null=True) class Meta: abstract = True diff --git a/src/etools_datamart/apps/data/models/fam.py b/src/etools_datamart/apps/data/models/fam.py index 1143a9b6f..08df85eac 100644 --- a/src/etools_datamart/apps/data/models/fam.py +++ b/src/etools_datamart/apps/data/models/fam.py @@ -2,7 +2,7 @@ from month_field.models import MonthField -from etools_datamart.apps.data.loader import EtlResult, Loader +from etools_datamart.apps.data.loader import Loader from etools_datamart.apps.data.models.base import DataMartModel from etools_datamart.apps.etools.models import (AuditAudit, AuditEngagement, AuditMicroassessment, AuditSpecialaudit, AuditSpotcheck,) @@ -10,7 +10,7 @@ class FAMIndicatorLoader(Loader): - def process_country(self, results: EtlResult, country, context): + def process_country(self, country, context): engagements = (AuditSpotcheck, AuditAudit, AuditSpecialaudit, AuditMicroassessment) start_date = context['today'].date() for model in engagements: @@ -30,9 +30,7 @@ def process_country(self, results: EtlResult, country, context): area_code=country.business_area_code, schema_name=country.schema_name), values=values) - results.incr(op) - - return results + self.results.incr(op) class FAMIndicator(DataMartModel): diff --git a/src/etools_datamart/apps/data/models/hact.py b/src/etools_datamart/apps/data/models/hact.py index c5dde2627..154ef70b3 100644 --- a/src/etools_datamart/apps/data/models/hact.py +++ b/src/etools_datamart/apps/data/models/hact.py @@ -3,13 +3,13 @@ from django.db import models from django.utils import timezone -from etools_datamart.apps.data.loader import EtlResult, Loader +from etools_datamart.apps.data.loader import Loader from etools_datamart.apps.data.models.base import DataMartModel from etools_datamart.apps.etools.models import HactAggregatehact class HACTLoader(Loader): - def process_country(self, results: EtlResult, country, context): + def process_country(self, country, context): today = timezone.now() aggregate = HactAggregatehact.objects.get(year=today.year) data = json.loads(aggregate.partner_values) @@ -27,9 +27,7 @@ def process_country(self, results: EtlResult, country, context): country_name=country.name, schema_name=country.schema_name), values=values) - results.incr(op) - - return results + self.results.incr(op) class HACT(DataMartModel): diff --git a/src/etools_datamart/apps/data/models/pmp.py b/src/etools_datamart/apps/data/models/pmp.py index 0e78beb7e..905cc3224 100644 --- a/src/etools_datamart/apps/data/models/pmp.py +++ b/src/etools_datamart/apps/data/models/pmp.py @@ -13,7 +13,7 @@ class PMPIndicatorLoader(Loader): - def process_country(self, results, country, context): + def process_country(self, country, context): for partner in PartnersPartnerorganization.objects.all(): for intervention in PartnersIntervention.objects.filter(agreement__partner=partner): planned_budget = getattr(intervention, @@ -57,8 +57,7 @@ def process_country(self, results, country, context): partner_id=partner.pk, intervention_id=intervention.pk), values=values) - results.incr(op) - return results + self.results.incr(op) class PMPIndicators(DataMartModel): diff --git a/src/etools_datamart/apps/data/models/user.py b/src/etools_datamart/apps/data/models/user.py index 6fcf7fb18..dde3c5a2b 100644 --- a/src/etools_datamart/apps/data/models/user.py +++ b/src/etools_datamart/apps/data/models/user.py @@ -4,7 +4,7 @@ from month_field.models import MonthField -from etools_datamart.apps.data.loader import EtlResult, Loader +from etools_datamart.apps.data.loader import Loader from etools_datamart.apps.data.models.base import DataMartModel from etools_datamart.apps.etools.models import AuthUser @@ -16,7 +16,7 @@ def get_context(self, **kwargs): context.update(kwargs) return context - def process_country(self, results: EtlResult, country, context): + def process_country(self, country, context): first_of_month = context['first_of_month'] base = AuthUser.objects.filter(profile__country=country) values = { @@ -32,8 +32,7 @@ def process_country(self, results: EtlResult, country, context): country_name=country.name, schema_name=country.schema_name, ), values=values) - results.incr(op) - return results + self.results.incr(op) class UserStats(DataMartModel): diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 81ab2b8a5..17310a641 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 6f789826c..60408b8d5 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 7de336c85..d1cd869bf 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py index fbe00c76c..9e73927f6 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181223_0905.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('subscriptions', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('subscriptions', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 9e992803b..2b1ee9e0a 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py index 30da4eea6..763549138 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181223_0905.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('unicef_rest_framework', '0001_initial'), ('tracking', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('unicef_rest_framework', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/celery.py b/src/etools_datamart/celery.py index d88cef8de..6d1f224c8 100644 --- a/src/etools_datamart/celery.py +++ b/src/etools_datamart/celery.py @@ -2,6 +2,8 @@ import os from time import time +from django.db.models import F + from celery import Celery # from celery.contrib.abortable import AbortableTask from celery.signals import task_postrun, task_prerun @@ -51,6 +53,7 @@ def task_prerun_handler(signal, sender, task_id, task, args, kwargs, **kw): from etools_datamart.apps.etl.models import EtlTask from django.utils import timezone defs = {'status': 'RUNNING', + 'code': F('code') + 1, 'last_run': timezone.now()} EtlTask.objects.update_or_create(task=task.name, content_type=ContentType.objects.get_for_model(task.linked_model), diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index a46d32a69..fef226986 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py b/src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py rename to src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py index dedf425c4..606527664 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20181223_0905.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('unicef_rest_framework', '0001_initial'), ('auth', '0009_alter_user_last_name_max_length'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), ] operations = [ @@ -136,7 +136,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'user'), ('service', 'group')}, + unique_together={('service', 'group'), ('service', 'user')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index b5b5c6522..aae8b0d80 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-23 09:05 +# Generated by Django 2.1.4 on 2018-12-28 08:56 import django.contrib.auth.models import django.contrib.auth.validators diff --git a/tests/etl/test_etl_loaders.py b/tests/etl/test_etl_loaders.py index ff5341e75..b2fd311c3 100644 --- a/tests/etl/test_etl_loaders.py +++ b/tests/etl/test_etl_loaders.py @@ -16,10 +16,14 @@ def pytest_generate_tests(metafunc): def test_loader_load(loader, number_of_intervention): + # factory = factories_registry.get(loader.model) + # to_delete = factory() loader.model.objects.truncate() loader.unlock() - loader.load(max_records=2) + ret = loader.load(max_records=2) assert loader.model.objects.count() + assert not loader.model.objects.exclude(seen=ret.context['today']).exists() + # assert not loader.model.objects.filter(id=to_delete.pk).exists() # # def test_load_pmp_indicator(number_of_intervention): From e4b50f220c4204a80f2d271c3056570116badd8e Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 12:23:37 +0100 Subject: [PATCH 008/122] fixes DataMart default manager --- CHANGES | 2 +- src/etools_datamart/apps/data/loader.py | 13 +++++++------ src/etools_datamart/apps/data/models/base.py | 7 +++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index ceb02566e..3438cedb4 100644 --- a/CHANGES +++ b/CHANGES @@ -1,7 +1,7 @@ 1.9 (dev) --------- * WARNINGS: migration reset -* Location endpoint +* Location/GatewayType endpoints 1.8 diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index df8596d62..6fce04bf5 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -229,10 +229,8 @@ def post_process_country(self, country, context): kk.save() self.tree_parents = [] - # delete unseen records + # mark seen records self.model.objects.filter(id__in=self.seen).update(seen=context['today']) - deleted = self.model.objects.exclude(id__in=self.seen).delete()[0] - self.results.deleted += deleted def process_country(self, country, context): qs = self.config.queryset() @@ -269,7 +267,7 @@ def unlock(self): pass @atomic() - def load(self, verbosity=0, always_update=False, stdout=None, + def load(self, *, verbosity=0, always_update=False, stdout=None, ignore_dependencies=False, max_records=None, countries=None): have_lock = False self.results = EtlResult() @@ -292,8 +290,8 @@ def load(self, verbosity=0, always_update=False, stdout=None, 'id', 'last_modify_date']: self.mapping[field.name] = field.name self.mapping.update(self.config.mapping) - - context = self.get_context(today=timezone.now(), + today = timezone.now() + context = self.get_context(today=today, countries=countries, max_records=max_records, records=0, @@ -309,6 +307,9 @@ def load(self, verbosity=0, always_update=False, stdout=None, break if stdout: # pragma: no cover stdout.write("\n") + # deleted = self.model.objects.exclude(seen=today).delete()[0] + # self.results.deleted = deleted + except LoaderException: raise finally: diff --git a/src/etools_datamart/apps/data/models/base.py b/src/etools_datamart/apps/data/models/base.py index 2d952009a..642438161 100644 --- a/src/etools_datamart/apps/data/models/base.py +++ b/src/etools_datamart/apps/data/models/base.py @@ -12,11 +12,10 @@ class DataMartQuerySet(QuerySet): def get(self, *args, **kwargs): try: - super(DataMartQuerySet, self).get(*args, **kwargs) - except self.model.DoesNotExist: + return super(DataMartQuerySet, self).get(*args, **kwargs) + except self.model.DoesNotExist as e: raise self.model.DoesNotExist( - "%s matching query does not exist. (%s %s)" % - (self.model._meta.object_name, args, kwargs) + "%s (%s %s)" % (e, args, kwargs) ) except self.model.MultipleObjectsReturned as e: raise self.model.MultipleObjectsReturned( From 1fcc7f2a6215da88b441fb9681c8a728a842df04 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 12:39:46 +0100 Subject: [PATCH 009/122] updates init-setup --- .../init/management/commands/init-setup.py | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index a4d34257c..fec53c0ff 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -19,6 +19,7 @@ from unicef_rest_framework.models.acl import GroupAccessControl +from etools_datamart.apps.data.loader import loadeables from etools_datamart.apps.etl.models import EtlTask from etools_datamart.apps.security.models import SchemaAccessControl from etools_datamart.celery import app @@ -89,6 +90,12 @@ class Command(BaseCommand): help = "" def add_arguments(self, parser): + parser.add_argument( + '--deploy', + action='store_true', + dest='deploy', + default=False, + help='run deployment related actions') parser.add_argument( '--all', action='store_true', @@ -141,10 +148,11 @@ def handle(self, *args, **options): verbosity = options['verbosity'] migrate = options['migrate'] _all = options['all'] + deploy = options['deploy'] + if deploy: + _all = True ModelUser = get_user_model() - # interactive = options['interactive'] - if options['collectstatic'] or _all: self.stdout.write(f"Run collectstatic") call_command('collectstatic', verbosity=verbosity - 1, interactive=False) @@ -212,8 +220,6 @@ def handle(self, *args, **options): from unicef_rest_framework.models import Service created, deleted, total = Service.objects.load_services() self.stdout.write(f"{total} services found. {created} new. {deleted} deleted") - if os.environ.get('INVALIDATE_CACHE'): - Service.objects.invalidate_cache() for service in Service.objects.all(): GroupAccessControl.objects.get_or_create( @@ -272,18 +278,12 @@ def handle(self, *args, **options): defaults=dict(subject='Dataset changed', content=MAIL, html_content=MAIL_HTML)) - config.CACHE_VERSION = config.CACHE_VERSION + 1 - - # if options['refresh']: - # self.stdout.write("Refreshing datamart...") - # for task in PeriodicTask.objects.all()[1:]: - # try: - # etl = import_string(task.task) - # except ImportError: - # continue - # self.stdout.write(f"Running {task.name}...", ending='\r') - # self.stdout.flush() - # - # etl.apply() - # cost = naturaldelta(app.timers[task.name]) - # self.stdout.write(f"{task.name} excuted in {cost}") + + if options['refresh'] or deploy: + self.stdout.write("Refreshing datamart...") + for loadeable in loadeables: + loadeable.loader.task.delay() + + if deploy: + Service.objects.invalidate_cache() + config.CACHE_VERSION = config.CACHE_VERSION + 1 From afed6d8ece175342403b4ae14c2f7432599bb617 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 12:41:15 +0100 Subject: [PATCH 010/122] updates index_new.html to restore filter when page back --- src/etools_datamart/apps/web/templates/admin/index_new.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/etools_datamart/apps/web/templates/admin/index_new.html b/src/etools_datamart/apps/web/templates/admin/index_new.html index f2fbbb37f..fc18bc64f 100644 --- a/src/etools_datamart/apps/web/templates/admin/index_new.html +++ b/src/etools_datamart/apps/web/templates/admin/index_new.html @@ -46,7 +46,8 @@ } }); }); - }).focus(); + }).trigger('keyup').focus(); + {% endblock %} From 7441925deebda880945424e73585bf5f6e175e7e Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 12:49:31 +0100 Subject: [PATCH 011/122] fixes params handling in APIRequestLog --- src/etools_datamart/apps/tracking/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/etools_datamart/apps/tracking/admin.py b/src/etools_datamart/apps/tracking/admin.py index 62c1dc0c2..e6755d3ba 100644 --- a/src/etools_datamart/apps/tracking/admin.py +++ b/src/etools_datamart/apps/tracking/admin.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- import json import logging +from urllib.parse import urlencode from django.contrib import admin -from django.template.defaultfilters import pluralize, urlencode +from django.template.defaultfilters import pluralize from django.utils.safestring import mark_safe from admin_extra_urls.extras import link From 1adb849cc25b58ac5c7325885a01f6b1fe2b95b9 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 12:57:14 +0100 Subject: [PATCH 012/122] fixes admin APIRequestLog response size display --- src/etools_datamart/apps/tracking/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/etools_datamart/apps/tracking/admin.py b/src/etools_datamart/apps/tracking/admin.py index e6755d3ba..c8bb03264 100644 --- a/src/etools_datamart/apps/tracking/admin.py +++ b/src/etools_datamart/apps/tracking/admin.py @@ -86,7 +86,7 @@ def requestor(self, obj): # event.allow_tags = True def size(self, obj): - mark_safe("{0}".format(humanize_size(obj.response_length))) + return mark_safe("{0}".format(humanize_size(obj.response_length))) size.admin_order_field = 'response_length' size.allow_tags = True From 685c3b4a344ce5ddc2de227dcbbca5a7d058ba25 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 28 Dec 2018 13:28:19 +0100 Subject: [PATCH 013/122] avoid logging api index page --- src/etools_datamart/apps/tracking/middleware.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/etools_datamart/apps/tracking/middleware.py b/src/etools_datamart/apps/tracking/middleware.py index 8fa3dd76c..7c4cd2a7e 100644 --- a/src/etools_datamart/apps/tracking/middleware.py +++ b/src/etools_datamart/apps/tracking/middleware.py @@ -103,7 +103,7 @@ def record_to_kwargs(request, response): media_type = response['Content-Type'].split(';')[0] view = api_info.get('view', None) if not view: # pragma: no cover - return {} + return None viewset = fqn(view) service = api_info.get("service") from unicef_rest_framework.utils import get_ident @@ -126,10 +126,9 @@ def record_to_kwargs(request, response): # class AsyncLogger(AsyncQueue): def _process(self, record): - # import requests - # payload = 'v=1&t=event&tid=UA-XXXXXY&cid=555&ec=video&ea=play&el=holiday&ev=300' - # r = requests.post('http://www.google-analytics.com/collect', data=payload) - log_request(**record_to_kwargs(**record)) + values = record_to_kwargs(**record) + if values: + log_request(**values) class StatsMiddleware(object): @@ -138,7 +137,9 @@ def __init__(self, get_response): def log(self, request, response): try: - log_request(**record_to_kwargs(request, response)) + values = record_to_kwargs(request, response) + if values: + log_request(**values) except Exception as e: # pragma: no cover logger.exception(e) From aa3f49e0ca350ddc0a5dd2391bf11cd83e411ed9 Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 29 Dec 2018 00:55:29 +0100 Subject: [PATCH 014/122] fixes tests --- .../apps/init/management/commands/init-setup.py | 6 ++++-- src/etools_datamart/celery.py | 4 ---- tests/conftest.py | 13 ++++++++++--- tests/etl/test_etl_result.py | 15 ++++++++++----- tox.ini | 1 + 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index fec53c0ff..9c4582b44 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -3,6 +3,7 @@ import warnings from urllib.parse import urlparse +from django.apps import apps from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.hashers import make_password @@ -281,8 +282,9 @@ def handle(self, *args, **options): if options['refresh'] or deploy: self.stdout.write("Refreshing datamart...") - for loadeable in loadeables: - loadeable.loader.task.delay() + for model_name in loadeables: + model = apps.get_model(model_name) + model.loader.task.delay() if deploy: Service.objects.invalidate_cache() diff --git a/src/etools_datamart/celery.py b/src/etools_datamart/celery.py index 6d1f224c8..c42cfb3d5 100644 --- a/src/etools_datamart/celery.py +++ b/src/etools_datamart/celery.py @@ -2,10 +2,7 @@ import os from time import time -from django.db.models import F - from celery import Celery -# from celery.contrib.abortable import AbortableTask from celery.signals import task_postrun, task_prerun from celery.utils.log import get_task_logger from kombu import Exchange, Queue @@ -53,7 +50,6 @@ def task_prerun_handler(signal, sender, task_id, task, args, kwargs, **kw): from etools_datamart.apps.etl.models import EtlTask from django.utils import timezone defs = {'status': 'RUNNING', - 'code': F('code') + 1, 'last_run': timezone.now()} EtlTask.objects.update_or_create(task=task.name, content_type=ContentType.objects.get_for_model(task.linked_model), diff --git a/tests/conftest.py b/tests/conftest.py index 22945acef..f50a4d0c5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,5 @@ import os +import sys import tempfile import uuid import warnings @@ -25,7 +26,13 @@ def pytest_configure(config): @pytest.fixture(scope="session") def disable_migration_signals(request): - return request.config.getvalue("disable_migration_signals") + return request.config.option.disable_migration_signals + # FIXME: pdb + # import pdb; pdb.set_trace() + # if 'disable_migration_signals' in request.config.items(): + # return request.config.getvalue("disable_migration_signals") + # + # return request.config.inicfg.get('disable_migration_signals') == 'true' def pytest_addoption(parser): @@ -48,8 +55,8 @@ def django_db_setup(request, django_db_createdb, django_db_modify_db_settings, disable_migration_signals): - # never touch etools DB - if disable_migration_signals: + if not django_db_createdb and django_db_keepdb and disable_migration_signals: + sys.stdout.write("Warning pre/post migrate signals have been dosabled\n") import django.core.management.commands.migrate django.core.management.commands.migrate.emit_pre_migrate_signal = MagicMock() django.core.management.commands.migrate.emit_post_migrate_signal = MagicMock() diff --git a/tests/etl/test_etl_result.py b/tests/etl/test_etl_result.py index b3b56b404..234784d35 100644 --- a/tests/etl/test_etl_result.py +++ b/tests/etl/test_etl_result.py @@ -11,11 +11,11 @@ def test_result_ne(): def test_result_eq_dict(): - assert EtlResult() == {'created': 0, 'updated': 0, 'unchanged': 0} + assert EtlResult() == {'created': 0, 'updated': 0, 'unchanged': 0, 'deleted': 0} def test_result_ne_dict(): - assert not EtlResult() == {'created': 1, 'updated': 1, 'unchanged': 1} + assert not EtlResult() == {'created': 1, 'updated': 1, 'unchanged': 1, 'deleted': 0} def test_result_ne_other(): @@ -25,7 +25,8 @@ def test_result_ne_other(): def test_encoder(): e = EtlEncoder() assert e.encode( - EtlResult(1, 1, 1)) == '{"__type__": "__EtlResult__", "data": {"created": 1, "updated": 1, "unchanged": 1}}' + EtlResult(1, 1, 1)) == '{"__type__": "__EtlResult__", ' \ + '"data": {"created": 1, "updated": 1, "unchanged": 1, "deleted": 0, "status": "SUCCESS", "error": null}}' def test_encoder2(): @@ -42,12 +43,16 @@ def test_decode2(): assert etl_decoder({"__type__": "__EtlResult__", "data": {"created": 1, "updated": 1, - "unchanged": 1}}) == EtlResult(1, 1, 1) + "unchanged": 1, + "deleted": 0, + "status": "SUCCESS", + "error": None}}) == EtlResult(1, 1, 1) def test_dumps(): assert etl_dumps( - EtlResult(1, 1, 1)) == '{"__type__": "__EtlResult__", "data": {"created": 1, "updated": 1, "unchanged": 1}}' + EtlResult(1, 1, + 1)) == '{"__type__": "__EtlResult__", "data": {"created": 1, "updated": 1, "unchanged": 1, "deleted": 0, "status": "SUCCESS", "error": null}}' def test_dumps2(): diff --git a/tox.ini b/tox.ini index 96fe7a601..13384661a 100644 --- a/tox.ini +++ b/tox.ini @@ -4,6 +4,7 @@ python_paths = ./tests/_test_lib ./src/ ;DJANGO_SETTINGS_MODULE = etools_datamart.config.settings DJANGO_SETTINGS_MODULE = settings_test django_find_project = false +;disable_migration_signals = true addopts = -v --reuse-db From 9f8134c01ebe15852a3ce1cf1ed7a98c0bee061b Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 29 Dec 2018 19:37:50 +0100 Subject: [PATCH 015/122] minor UI improvements --- src/etools_datamart/apps/data/admin.py | 2 +- src/etools_datamart/apps/data/loader.py | 16 -- src/etools_datamart/apps/etl/admin.py | 11 +- src/etools_datamart/apps/etl/models.py | 10 - src/etools_datamart/apps/web/static/style.css | 261 +++++++++++------- .../apps/web/static/style.css.map | 8 +- .../apps/web/static/style.scss | 24 +- .../apps/web/templates/admin/base_site.html | 4 +- 8 files changed, 200 insertions(+), 136 deletions(-) diff --git a/src/etools_datamart/apps/data/admin.py b/src/etools_datamart/apps/data/admin.py index adf0d3918..02c729ffd 100644 --- a/src/etools_datamart/apps/data/admin.py +++ b/src/etools_datamart/apps/data/admin.py @@ -105,7 +105,7 @@ def queue(self, request): def refresh(self, request): try: start = time() - self.model.loader.load() + self.model.loader.task.apply() stop = time() duration = stop - start self.message_user(request, "Data loaded in %s" % naturaldelta(duration), messages.SUCCESS) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 6fce04bf5..5358b43e8 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -129,23 +129,13 @@ class LoaderTask(celery.Task): def __init__(self, loader) -> None: self.loader = loader self.linked_model = loader.model - # self.name = fqn(self.linked_model) self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) def run(self, *args, **kwargs): return self.loader.load() -# def get_or_fail(Model, **kwargs): -# try: -# Model.objects.get(**kwargs) -# except Model.DoesNotExist: -# raise Model.DoesNotExist(f"Unable to get {Model.__name__} using {kwargs}") - - class Loader: - # __slots__ = ['model', 'config', 'mapping', 'task', 'tree_parents', 'always_update'] - def __init__(self) -> None: self.config = None self.tree_parents = [] @@ -167,12 +157,6 @@ def contribute_to_class(self, model, name): setattr(model, name, self) - # def deconstruct(self): - # return [] - # - # def check(self, **kwargs): - # return [] - def process(self, filters, values): try: record, created = self.model.objects.get_or_create(**filters, diff --git a/src/etools_datamart/apps/etl/admin.py b/src/etools_datamart/apps/etl/admin.py index 0dfeb5602..b8bf005ad 100644 --- a/src/etools_datamart/apps/etl/admin.py +++ b/src/etools_datamart/apps/etl/admin.py @@ -4,6 +4,7 @@ from django.http import HttpResponseRedirect from django.urls import reverse from django.utils.html import format_html +from django.utils.safestring import mark_safe from admin_extra_urls.extras import action, ExtraUrlMixin, link from admin_extra_urls.mixins import _confirm_action @@ -19,13 +20,21 @@ @register(models.EtlTask) class EtlTaskAdmin(ExtraUrlMixin, admin.ModelAdmin): - list_display = ('task', 'last_run', 'status', 'time', + list_display = ('task', 'last_run', '_status', 'time', 'last_success', 'last_failure', 'locked', 'data', 'scheduling', 'unlock_task', 'queue_task') date_hierarchy = 'last_run' actions = [mass_update, ] + def _status(self, obj): + cls = obj.status.lower() + if obj.status == 'SUCCESS': + pass + return mark_safe('%s' % (cls, obj.status)) + + _status.verbse_name = 'status' + def scheduling(self, obj): opts = PeriodicTask._meta if obj.periodic_task: diff --git a/src/etools_datamart/apps/etl/models.py b/src/etools_datamart/apps/etl/models.py index fdb3c83b8..02c7fc8f2 100644 --- a/src/etools_datamart/apps/etl/models.py +++ b/src/etools_datamart/apps/etl/models.py @@ -22,12 +22,6 @@ def get_for_model(self, model: DataMartModel): except EtlTask.DoesNotExist: raise EtlTask.DoesNotExist(f"EtlTask for model '{model.__name__}' does not exists") - # def get_for_task(self, task: ETLTask): - # return self.get_or_create(task=task.name, - # defaults=dict(content_type=ContentType.objects.get_for_model(task.linked_model), - # last_run=None, - # table_name=task.linked_model._meta.db_table))[0] - def inspect(self): tasks = app.get_all_etls() results = {True: 0, False: 0} @@ -65,10 +59,6 @@ class Meta: def __str__(self): return f"{self.task} {self.status}" - # @cached_property - # def lock_key(self): - # return f"{self.task}-lock" - @cached_property def loader(self): try: diff --git a/src/etools_datamart/apps/web/static/style.css b/src/etools_datamart/apps/web/static/style.css index 3dc611649..d3f4e47a1 100644 --- a/src/etools_datamart/apps/web/static/style.css +++ b/src/etools_datamart/apps/web/static/style.css @@ -1,21 +1,43 @@ * { - margin: 0px; - padding: 0px; - box-sizing: border-box; } + margin: 0; + padding: 0; + box-sizing: border-box; +} + +.success { + color: #00b600; +} + +.failure { + color: #d2625d; +} + +.error { + color: #d2625d; +} + +.results .success, .results .error, .results .failure { + font-weight: bold; +} body, html { height: 50%; - font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; } - body a, html a { - color: black; } - body a:hover, html a:hover { - color: black; } - body span.str, html span.str { - color: black; } + font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; +} +body a, html a { + color: black; +} +body a:hover, html a:hover { + color: black; +} +body span.str, html span.str { + color: black; +} .limiter { width: 100%; - margin: 0 auto; } + margin: 0 auto; +} .master-container { width: 100%; @@ -28,7 +50,8 @@ body, html { flex-wrap: wrap; justify-content: center; align-items: center; - padding: 15px; } + padding: 15px; +} .box { width: 1170px; @@ -41,42 +64,53 @@ body, html { display: flex; flex-wrap: wrap; align-items: stretch; - flex-direction: row-reverse; } + flex-direction: row-reverse; +} .right { width: 50%; - flex-wrap: wrap; } - .right form { - padding: 100px 0 0 65px; } - .right .center { - width: 100%; - text-align: center; } - .right h1 { - width: 100%; - font-size: 24pt; - text-align: center; } - .right h2 { - font-size: 14pt; } + flex-wrap: wrap; +} +.right form { + padding: 100px 0 0 65px; +} +.right .center { + width: 100%; + text-align: center; +} +.right h1 { + width: 100%; + font-size: 24pt; + text-align: center; +} +.right h2 { + font-size: 14pt; +} ul.index-menu { padding: 20px 0 0 65px; list-style: none; - font-size: 18pt; } - ul.index-menu a { - color: #2090F8; - text-transform: none; - text-decoration: none; } - ul.index-menu li.menu-sep { - width: 100%; - font-size: 2px; } + font-size: 18pt; +} +ul.index-menu a { + color: #2090F8; + text-transform: none; + text-decoration: none; +} +ul.index-menu li.menu-sep { + width: 100%; + font-size: 2px; +} .h10 { display: block; - height: 10px; } + height: 10px; +} .h30 { display: block; - height: 30px; } + height: 30px; +} /* [ login more ]*/ .left { @@ -85,15 +119,18 @@ ul.index-menu { background-size: cover; background-position: center; position: relative; - z-index: 1; } + z-index: 1; +} .m-b-20 { - margin-bottom: 20px; } + margin-bottom: 20px; +} .wrap-input100 { width: 100%; position: relative; - border: 1px solid #e6e6e6; } + border: 1px solid #e6e6e6; +} .input100 { display: block; @@ -102,10 +139,12 @@ ul.index-menu { font-size: 18px; color: #666666; line-height: 1.2; - padding: 0 25px; } + padding: 0 25px; +} input.input100 { - height: 55px; } + height: 55px; +} /*[ Button ]*/ .container-login100-form-btn { @@ -115,7 +154,8 @@ input.input100 { display: -ms-flexbox; display: flex; flex-wrap: wrap; - justify-content: center; } + justify-content: center; +} .login100-form-btn { display: -webkit-box; @@ -137,84 +177,109 @@ input.input100 { -webkit-transition: all 0.4s; -o-transition: all 0.4s; -moz-transition: all 0.4s; - transition: all 0.4s; } + transition: all 0.4s; +} .login100-form-btn:hover { - background: #333333; } + background: #333333; +} /* [ Responsive ]*/ .navbar { border-top: none; background: #2090F8; - color: black; } - .navbar a.navbar-brand { - color: white; } + color: black; +} +.navbar a.navbar-brand { + color: white; +} .rounded { -webkit-border-radius: 20px; -moz-border-radius: 20px; - border-radius: 20px; } + border-radius: 20px; +} .monitor .menubar, .profile .menubar { - padding: 10px; } - .monitor .menubar a, .profile .menubar a { - text-transform: none; - color: #2090F8; } - .monitor .menubar a:visited, .profile .menubar a:visited { - text-transform: none; } + padding: 10px; +} +.monitor .menubar a, .profile .menubar a { + text-transform: none; + color: #2090F8; +} +.monitor .menubar a:visited, .profile .menubar a:visited { + text-transform: none; +} .monitor #monitor, .profile #monitor { width: 100%; - padding: 30px; } - .monitor #monitor .SUCCESS, .profile #monitor .SUCCESS { - color: #00b200; - font-weight: bold; } - .monitor #monitor .row, .profile #monitor .row { - width: 100%; - padding: 5px; } - .monitor #monitor .row.header, .profile #monitor .row.header { - font-weight: bold; } - .monitor #monitor .row.odd, .profile #monitor .row.odd { - background-color: #eeeeee; } - .monitor #monitor .col, .profile #monitor .col { - display: inline-block; } - .monitor #monitor .col.task, .profile #monitor .col.task { - width: 30%; } - .monitor #monitor .col.last_run, .profile #monitor .col.last_run { - width: 200px; } - .monitor #monitor .col.last_changes, .profile #monitor .col.last_changes { - width: 200px; } - .monitor #monitor .col.status, .profile #monitor .col.status { - width: 120px; } - .monitor #monitor .col.subscription, .profile #monitor .col.subscription { - width: 180px; } + padding: 30px; +} +.monitor #monitor .SUCCESS, .profile #monitor .SUCCESS { + color: #00b200; + font-weight: bold; +} +.monitor #monitor .row, .profile #monitor .row { + width: 100%; + padding: 5px; +} +.monitor #monitor .row.header, .profile #monitor .row.header { + font-weight: bold; +} +.monitor #monitor .row.odd, .profile #monitor .row.odd { + background-color: #eeeeee; +} +.monitor #monitor .col, .profile #monitor .col { + display: inline-block; +} +.monitor #monitor .col.task, .profile #monitor .col.task { + width: 30%; +} +.monitor #monitor .col.last_run, .profile #monitor .col.last_run { + width: 200px; +} +.monitor #monitor .col.last_changes, .profile #monitor .col.last_changes { + width: 200px; +} +.monitor #monitor .col.status, .profile #monitor .col.status { + width: 120px; +} +.monitor #monitor .col.subscription, .profile #monitor .col.subscription { + width: 180px; +} .profile #areas, .profile #services, .profile #password { margin-right: 20px; padding: 10px; position: relative; - display: inline-block; } - .profile #areas h1, .profile #services h1, .profile #password h1 { - font-size: 14pt; - margin-bottom: 5px; } - .profile #areas ul, .profile #areas form, .profile #services ul, .profile #services form, .profile #password ul, .profile #password form { - border: 1px solid #cfcfcf; - overflow-y: scroll; - width: 300px; - height: 400px; } + display: inline-block; +} +.profile #areas h1, .profile #services h1, .profile #password h1 { + font-size: 14pt; + margin-bottom: 5px; +} +.profile #areas ul, .profile #areas form, .profile #services ul, .profile #services form, .profile #password ul, .profile #password form { + border: 1px solid #cfcfcf; + overflow-y: scroll; + width: 300px; + height: 400px; +} .profile #password .message { margin: 20px; - text-align: left; } - .profile #password .message .password { - text-align: center; - margin: 20px; - padding: 20px; - font-family: monospace; - font-size: 20px; - border: 1px solid grey; } + text-align: left; +} +.profile #password .message .password { + text-align: center; + margin: 20px; + padding: 20px; + font-family: monospace; + font-size: 20px; + border: 1px solid grey; +} .profile #password form { width: 400px; overflow-y: auto; - text-align: center; } + text-align: center; +} .profile #password .btn { justify-content: center; align-items: center; @@ -222,7 +287,7 @@ input.input100 { height: 40px; border-radius: 3px; font-size: 12px; - color: #0; + color: black; line-height: 1.2; text-transform: uppercase; letter-spacing: 1px; @@ -230,9 +295,11 @@ input.input100 { -o-transition: all 0.4s; -moz-transition: all 0.4s; transition: all 0.4s; - cursor: pointer; } + cursor: pointer; +} .profile #password .btn-submit { background: #2090F8; - color: #fff; } + color: #fff; +} /*# sourceMappingURL=style.css.map */ diff --git a/src/etools_datamart/apps/web/static/style.css.map b/src/etools_datamart/apps/web/static/style.css.map index be77e013e..f0ed5652e 100644 --- a/src/etools_datamart/apps/web/static/style.css.map +++ b/src/etools_datamart/apps/web/static/style.css.map @@ -1,7 +1 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["style.scss"], -"names": [], -"file": "style.css" -} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AACA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAKJ;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EAMA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAcF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAaF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAyCA;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIA;EACE;;AAEA;EAKE;EACA;;AALA;EACE;;AAQN;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAQJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAQN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;;AAEA;EACE;EAEA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA","file":"style.css"} \ No newline at end of file diff --git a/src/etools_datamart/apps/web/static/style.scss b/src/etools_datamart/apps/web/static/style.scss index d13f17d40..7e029a269 100644 --- a/src/etools_datamart/apps/web/static/style.scss +++ b/src/etools_datamart/apps/web/static/style.scss @@ -1,10 +1,28 @@ * { - margin: 0px; - padding: 0px; + margin: 0; + padding: 0; box-sizing: border-box; } +.success { + color: #00b600; +} + +.failure { + color: #d2625d; +} + +.error { + color: #d2625d; +} + +.results { + .success, .error, .failure { + font-weight: bold; + } +} + body, html { height: 50%; font-family: "Lato", "Helvetica Neue", Helvetica, Arial, sans-serif; @@ -385,7 +403,7 @@ input.input100 { border-radius: 3px; font-size: 12px; //background: #2090F8; - color: #0; + color: black; line-height: 1.2; text-transform: uppercase; letter-spacing: 1px; diff --git a/src/etools_datamart/apps/web/templates/admin/base_site.html b/src/etools_datamart/apps/web/templates/admin/base_site.html index d2b61e282..e18070374 100644 --- a/src/etools_datamart/apps/web/templates/admin/base_site.html +++ b/src/etools_datamart/apps/web/templates/admin/base_site.html @@ -1,7 +1,9 @@ -{% extends "admin/base.html" %} +{% extends "admin/base.html" %}{% load static datamart %} {% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %} {% block extrastyle %} + + {% if config.ANALYTICS_CODE %} diff --git a/src/unicef_rest_framework/tasks.py b/src/unicef_rest_framework/tasks.py index 073963971..090183aaf 100644 --- a/src/unicef_rest_framework/tasks.py +++ b/src/unicef_rest_framework/tasks.py @@ -9,3 +9,11 @@ def invalidate_cache(service_id): service.invalidate_cache() return {"cache_versipn": service.cache_version, "service": service.name} + + +@default_app.task() +def preload(service_id, querystring): + service = Service.objects.get(service_id) + service.invalidate_cache() + return {"cache_versipn": service.cache_version, + "service": service.name} From bb69d60227769265a0334b2a10aecdc59e9af9a4 Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 29 Dec 2018 21:54:44 +0100 Subject: [PATCH 017/122] add preloading capabilities --- .../init/management/commands/init-setup.py | 8 +++--- .../apps/web/static/dm-admin.css | 2 +- .../apps/web/static/dm-admin.scss | 2 +- src/etools_datamart/config/settings.py | 16 +++++++++++- src/unicef_rest_framework/apps.py | 1 + src/unicef_rest_framework/handlers.py | 25 +++++++++++++++++++ src/unicef_rest_framework/tasks.py | 22 ++++++++++++---- src/unicef_rest_framework/views.py | 1 + 8 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 src/unicef_rest_framework/handlers.py diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index 9c4582b44..223e5a512 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -199,11 +199,13 @@ def handle(self, *args, **options): try: for entry in os.environ.get('AUTOCREATE_USERS').split('|'): email, pwd = entry.split(',') - u, created = ModelUser.objects.get_or_create(username=email) + u, created = ModelUser.objects.get_or_create(username=email, + defaults={"is_superuser": False, + "is_staff": False, + "password": make_password(pwd)}) + if created: self.stdout.write(f"Created user {u}") - u.set_password(pwd) - u.save() u.groups.add(public_areas) else: # pragma: no cover self.stdout.write(f"User {u} already exists.") diff --git a/src/etools_datamart/apps/web/static/dm-admin.css b/src/etools_datamart/apps/web/static/dm-admin.css index 1b8a761a6..01faef5d2 100644 --- a/src/etools_datamart/apps/web/static/dm-admin.css +++ b/src/etools_datamart/apps/web/static/dm-admin.css @@ -10,7 +10,7 @@ color: #d2625d; } -.results .success, .results .error, .results .failure { +.results .success, .results .error, .results .failure, .results .running { font-weight: bold; } diff --git a/src/etools_datamart/apps/web/static/dm-admin.scss b/src/etools_datamart/apps/web/static/dm-admin.scss index 53153f1ef..278e8f3d9 100644 --- a/src/etools_datamart/apps/web/static/dm-admin.scss +++ b/src/etools_datamart/apps/web/static/dm-admin.scss @@ -11,7 +11,7 @@ } .results { - .success, .error, .failure { + .success, .error, .failure, .running { font-weight: bold; } } diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 4e054b602..2026c16cb 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -30,7 +30,7 @@ CELERY_RESULT_BACKEND=(str, 'redis://127.0.0.1:6379/3'), CELERY_ALWAYS_EAGER=(bool, False), CSRF_COOKIE_SECURE=(bool, True), - DATABASE_URL=(str, "postgres://postgres:@127.0.0.1:5432/etools_datamart"), + DATABASE_URL=(str, "postgis://postgres:@127.0.0.1:5432/etools_datamart"), DATABASE_URL_ETOOLS=(str, "postgis://postgres:@127.0.0.1:15432/etools"), DEBUG=(bool, False), MEDIA_ROOT=(str, '/tmp/media'), @@ -43,6 +43,7 @@ SESSION_COOKIE_SECURE=(bool, True), STATIC_ROOT=(str, '/tmp/static'), STATIC_URL=(str, '/dm-static/'), + SYSTEM_PASSWORD=(str, ''), X_FRAME_OPTIONS=(str, 'DENY'), AZURE_CLIENT_ID=(str, ''), @@ -287,6 +288,7 @@ 'adminactions', 'unicef_rest_framework.apps.Config', 'rest_framework', + 'rest_framework.authtoken', 'rest_framework_gis', 'oauth2_provider', 'social_django', @@ -376,6 +378,18 @@ # django-constance CONSTANCE_BACKEND = 'constance.backends.database.DatabaseBackend' CONSTANCE_ADDITIONAL_FIELDS = { + # 'read_only_text': ['django.forms.fields.CharField', { + # 'required': False, + # 'widget': 'etools_datamart.libs.constance.ObfuscatedInput', + # }], + # 'write_only_text': ['django.forms.fields.CharField', { + # 'required': False, + # 'widget': 'etools_datamart.libs.constance.WriteOnlyTextarea', + # }], + # 'write_only_input': ['django.forms.fields.CharField', { + # 'required': False, + # 'widget': 'etools_datamart.libs.constance.WriteOnlyInput', + # }], 'select_group': ['etools_datamart.libs.constance.GroupChoiceField', { 'required': False, 'widget': 'etools_datamart.libs.constance.GroupChoice', diff --git a/src/unicef_rest_framework/apps.py b/src/unicef_rest_framework/apps.py index 6971b6413..a9f0724ae 100644 --- a/src/unicef_rest_framework/apps.py +++ b/src/unicef_rest_framework/apps.py @@ -8,3 +8,4 @@ class Config(AppConfig): def ready(self): from . import tasks # noqa + from . import handlers # noqa diff --git a/src/unicef_rest_framework/handlers.py b/src/unicef_rest_framework/handlers.py new file mode 100644 index 000000000..f7df4a80f --- /dev/null +++ b/src/unicef_rest_framework/handlers.py @@ -0,0 +1,25 @@ +import os + +from django.contrib.auth import get_user_model +from django.db.models.signals import post_migrate +from django.dispatch import receiver + +# +# @receiver(config_updated) +# def constance_updated(sender, key, old_value, new_value, **kwargs): +# if key == 'SYSTEM_PASSWORD': +# +# print(sender, key, old_value, new_value) + + +@receiver(post_migrate) +def create_system_user(app_config, **kwargs): + from rest_framework.authtoken.models import Token + + uname = os.environ.get('SYSTEM_USER', 'system') + ModelUser = get_user_model() + user, __ = ModelUser.objects.get_or_create(username=uname, + defaults={"is_superuser": True, + "is_staff": False}) + + Token.objects.get_or_create(user=user) diff --git a/src/unicef_rest_framework/tasks.py b/src/unicef_rest_framework/tasks.py index 090183aaf..c2709782e 100644 --- a/src/unicef_rest_framework/tasks.py +++ b/src/unicef_rest_framework/tasks.py @@ -1,7 +1,15 @@ +import logging + +from django.conf import settings +from django.contrib.auth import get_user_model + +import requests from celery.app import default_app from unicef_rest_framework.models import Service +logger = logging.getLogger(__name__) + @default_app.task() def invalidate_cache(service_id): @@ -12,8 +20,12 @@ def invalidate_cache(service_id): @default_app.task() -def preload(service_id, querystring): - service = Service.objects.get(service_id) - service.invalidate_cache() - return {"cache_versipn": service.cache_version, - "service": service.name} +def preload(path): + User = get_user_model() + user = User.objects.get(username='system') + target = "%s%s" % (settings.ABSOLUTE_BASE_URL, path) + logger.info(f'Preloading {target}') + assert path.startswith('/') + response = requests.get(target, + headers={'Authorization': 'Token %s' % user.auth_token}) + return response.headers diff --git a/src/unicef_rest_framework/views.py b/src/unicef_rest_framework/views.py index 4b97e09ad..1e69ef74b 100644 --- a/src/unicef_rest_framework/views.py +++ b/src/unicef_rest_framework/views.py @@ -45,6 +45,7 @@ class URFReadOnlyModelViewSet(DynamicSerializerMixin, viewsets.ReadOnlyModelView authentication_classes = (SessionAuthentication, IPBasedAuthentication, + TokenAuthentication, JWTAuthentication, BasicAuthentication, TokenAuthentication, From 96730933a98f63ce2973531e6f9b6e82c1ab81e5 Mon Sep 17 00:00:00 2001 From: sax Date: Sun, 30 Dec 2018 13:45:48 +0100 Subject: [PATCH 018/122] updats init-setup logic --- .../init/management/commands/init-setup.py | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index 223e5a512..99d1ffe4c 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -16,14 +16,12 @@ from django_celery_beat.models import CrontabSchedule, IntervalSchedule, PeriodicTask from post_office.models import EmailTemplate from redisboard.models import RedisServer -from strategy_field.utils import fqn from unicef_rest_framework.models.acl import GroupAccessControl from etools_datamart.apps.data.loader import loadeables from etools_datamart.apps.etl.models import EtlTask from etools_datamart.apps.security.models import SchemaAccessControl -from etools_datamart.celery import app MAIL = r"""Dear {{user.label}}, @@ -254,19 +252,25 @@ def handle(self, *args, **options): every_minute, __ = IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.MINUTES) - tasks = app.get_all_etls() + # tasks = app.get_all_etls() counters = {True: 0, False: 0} - for task in tasks: - __, is_new = PeriodicTask.objects.get_or_create(task=fqn(task), - defaults={'name': task.name, + loaders = [] + for loadeable in loadeables: + model = apps.get_model(loadeable) + loaders.append(loadeable) + __, is_new = PeriodicTask.objects.get_or_create(task=model.loader.task.name, + defaults={'name': loadeable, 'crontab': midnight}) + if is_new: + self.stdout.write(f"NEW task {model.loader.task.name} scheduled at {midnight}") - ret = PeriodicTask.objects.exclude(name__in=list(app.tasks.keys())).delete() - counters[False] = ret[1].get('django_celery_beat.PeriodicTask', 0) + ret = PeriodicTask.objects.filter(name__startswith='data.').exclude(name__in=loaders).delete() + counters[False] = ret[0] EtlTask.objects.inspect() self.stdout.write( - f"{PeriodicTask.objects.count()} tasks found. {counters[True]} new. {counters[False]} deleted") + f"{PeriodicTask.objects.filter(name__startswith='data.').count()} " + f"periodic task found. {counters[True]} new. {counters[False]} deleted") PeriodicTask.objects.get_or_create(task='send_queued_mail', defaults={'name': 'process mail queue', From 604bad2914e59a48f4148d21b8817031e9238282 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 31 Dec 2018 12:10:50 +0100 Subject: [PATCH 019/122] fixes security ACL check --- .../apps/data/migrations/0001_initial.py | 2 +- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...228_0856.py => 0002_auto_20181231_1024.py} | 2 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...228_0856.py => 0002_auto_20181231_1024.py} | 6 +-- .../migrations/0001_initial.py | 6 +-- ...228_0856.py => 0002_auto_20181231_1024.py} | 8 ++-- src/unicef_rest_framework/models/acl.py | 2 +- src/unicef_rest_framework/permissions.py | 41 ++++++++++--------- .../migrations/0001_initial.py | 2 +- 12 files changed, 40 insertions(+), 37 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20181228_0856.py => 0002_auto_20181231_1024.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20181228_0856.py => 0002_auto_20181231_1024.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20181228_0856.py => 0002_auto_20181231_1024.py} (98%) diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index ea05ef610..05f5dbb84 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 17310a641..f85895649 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 60408b8d5..971c7f190 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index d1cd869bf..a7f29832f 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py index 9e73927f6..dc0e20aa6 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181228_0856.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.db.models.deletion from django.conf import settings diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 2b1ee9e0a..58e4762fa 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py index 763549138..4c32ed044 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181228_0856.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), - ('tracking', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tracking', '0001_initial'), + ('unicef_rest_framework', '0001_initial'), ] operations = [ diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index fef226986..bc12b5a00 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import uuid @@ -45,7 +45,7 @@ class Migration(migrations.Migration): ('last_modify_date', models.DateTimeField(auto_now=True)), ('rate', models.CharField(default='*', max_length=50)), ('serializers', django.contrib.postgres.fields.ArrayField(base_field=unicef_rest_framework.models.acl.SerializerField(max_length=200), blank=True, default=unicef_rest_framework.models.acl.default_serializer, size=None)), - ('policy', models.IntegerField(choices=[(0, 'Forbid'), (1, 'Grant'), (2, 'Default')])), + ('policy', models.IntegerField(choices=[(0, 'Forbid'), (1, 'Grant'), (2, 'Default')], db_index=True)), ], options={ 'verbose_name': 'Group ACL', @@ -112,7 +112,7 @@ class Migration(migrations.Migration): ('last_modify_date', models.DateTimeField(auto_now=True)), ('rate', models.CharField(default='*', max_length=50)), ('serializers', django.contrib.postgres.fields.ArrayField(base_field=unicef_rest_framework.models.acl.SerializerField(max_length=200), blank=True, default=unicef_rest_framework.models.acl.default_serializer, size=None)), - ('policy', models.IntegerField(choices=[(0, 'Forbid'), (1, 'Grant'), (2, 'Default')])), + ('policy', models.IntegerField(choices=[(0, 'Forbid'), (1, 'Grant'), (2, 'Default')], db_index=True)), ], options={ 'verbose_name': 'User ACL', diff --git a/src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py b/src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py rename to src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py index 606527664..0573eb4ba 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20181228_0856.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), - ('auth', '0009_alter_user_last_name_max_length'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('auth', '0009_alter_user_last_name_max_length'), ('contenttypes', '0002_remove_content_type_name'), + ('unicef_rest_framework', '0001_initial'), ] operations = [ @@ -136,7 +136,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'group'), ('service', 'user')}, + unique_together={('service', 'user'), ('service', 'group')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_rest_framework/models/acl.py b/src/unicef_rest_framework/models/acl.py index 3ef6be06f..d4f8e5f35 100644 --- a/src/unicef_rest_framework/models/acl.py +++ b/src/unicef_rest_framework/models/acl.py @@ -39,7 +39,7 @@ class AbstractAccessControl(MasterDataModel): serializers = ArrayField(SerializerField(), default=default_serializer, blank=True) - policy = models.IntegerField(choices=POLICIES) + policy = models.IntegerField(choices=POLICIES, db_index=True) class Meta: abstract = True diff --git a/src/unicef_rest_framework/permissions.py b/src/unicef_rest_framework/permissions.py index b4d24058c..21e7bae6e 100644 --- a/src/unicef_rest_framework/permissions.py +++ b/src/unicef_rest_framework/permissions.py @@ -6,7 +6,7 @@ from strategy_field.utils import fqn from unicef_rest_framework.acl import ACL_ACCESS_OPEN -from unicef_rest_framework.models import UserAccessControl +from unicef_rest_framework.models import Service, UserAccessControl from unicef_rest_framework.models.acl import AbstractAccessControl, GroupAccessControl logger = logging.getLogger(__name__) @@ -15,13 +15,13 @@ class ServicePermission(BasePermission): # serializer_field = "-serializer" - def get_acl(self, request, view): + def get_acl(self, request, service: Service): try: - return UserAccessControl.objects.get(service__viewset=fqn(view), - user=request.user) + return UserAccessControl.objects.filter(service=service, + user=request.user).order_by('-policy') except UserAccessControl.DoesNotExist: - return GroupAccessControl.objects.get(service__viewset=fqn(view), - group__user=request.user) + return GroupAccessControl.objects.filter(service=service, + group__user=request.user).order_by('-policy') def has_permission(self, request, view): if request.user.is_superuser: @@ -29,24 +29,27 @@ def has_permission(self, request, view): if not request.user.is_authenticated: return False - try: - acl = self.get_acl(request, view) + service = view.get_service() + if service.access == ACL_ACCESS_OPEN: + return True - if acl.policy == AbstractAccessControl.POLICY_DENY: - logger.error(f"Access denied for user '{request.user}' to '{fqn(view)}'") - raise PermissionDenied + try: + acls = self.get_acl(request, service) + if not acls: + return False + for acl in acls: + if acl.policy == AbstractAccessControl.POLICY_DENY: + logger.error(f"Access denied for user '{request.user}' to '{fqn(view)}'") + raise PermissionDenied - requested_serializer = request.GET.get(view.serializer_field_param, "std") + requested_serializer = request.GET.get(view.serializer_field_param, "std") - if (requested_serializer not in acl.serializers) and ("*" not in acl.serializers): - logger.error( - f"Forbidden serialiser '{requested_serializer}' for user '{request.user}' to '{fqn(view)}'") - raise PermissionDenied(f"Forbidden serializer '{requested_serializer}'") + if (requested_serializer not in acl.serializers) and ("*" not in acl.serializers): + logger.error( + f"Forbidden serialiser '{requested_serializer}' for user '{request.user}' to '{fqn(view)}'") + raise PermissionDenied(f"Forbidden serializer '{requested_serializer}'") return True except (GroupAccessControl.DoesNotExist): - service = view.get_service() - if service.access == ACL_ACCESS_OPEN: - return True logger.error(f"User '{request.user}' does not have grants for '{fqn(view)}'") return False diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index aae8b0d80..39a64958f 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-28 08:56 +# Generated by Django 2.1.4 on 2018-12-31 10:24 import django.contrib.auth.models import django.contrib.auth.validators From b5e6f64a6e41ca76b152c73c46c5bffbf97f44f1 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 4 Jan 2019 16:40:46 +0100 Subject: [PATCH 020/122] updates dependencies --- Pipfile.lock | 196 +++++++++++++++++++++++++++------------------------ 1 file changed, 105 insertions(+), 91 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 3796558c5..63ceb12f3 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -215,10 +215,10 @@ }, "azure-mgmt-containerregistry": { "hashes": [ - "sha256:09f1554da5a86f645fe816620223f93000bcbc5cbfb92e210077e3c5cdaf0b95", - "sha256:75cd215bbf2e3254b2e03eb0b4efc047aac85c79d3527aeb2aa6059e784b7ed0" + "sha256:4d31588ca5c5258b4a595e3de400994c7f6fff3b84faccf9b8a0ff6b583eba63", + "sha256:5630c31f2ae65e7cbf4df82f7b7817d017f2c0fab42ab1b253f38336a67f9dec" ], - "version": "==2.5.0" + "version": "==2.6.0" }, "azure-mgmt-containerservice": { "hashes": [ @@ -490,10 +490,10 @@ }, "azure-mgmt-resource": { "hashes": [ - "sha256:2e83289369be88d0f06792118db5a7d4ed7150f956aaae64c528808da5518d7f", - "sha256:8dcd62521482f04fb0927ee4800ef6ab3ac99a9158005d552a7c10f9c756cd8c" + "sha256:56c7d4e8d6854212977477272c600ab1d2c535de2a86095b56e948b06eb6d539", + "sha256:aef8573066026db04ed3e7c5e727904e42f6462b6421c2e8a3646e4c4f8128be" ], - "version": "==2.0.0" + "version": "==2.1.0" }, "azure-mgmt-scheduler": { "hashes": [ @@ -753,11 +753,11 @@ }, "django": { "hashes": [ - "sha256:068d51054083d06ceb32ce02b7203f1854256047a0d58682677dd4f81bceabd7", - "sha256:55409a056b27e6d1246f19ede41c6c610e4cab549c005b62cbeefabc6433356b" + "sha256:a32c22af23634e1d11425574dce756098e015a165be02e4690179889b207c7a8", + "sha256:d6393918da830530a9516bbbcbf7f1214c3d733738779f06b0f649f49cc698c3" ], "index": "pypi", - "version": "==2.1.4" + "version": "==2.1.5" }, "django-adminactions": { "hashes": [ @@ -1049,11 +1049,11 @@ "validation" ], "hashes": [ - "sha256:9ee2072fb84ec60d951fa105e6926cf16e332973ba20ab2e3962fd9445cfd102", - "sha256:b0d5304cd2180699980fc8336edb5bfb774bbdfb79760376ed69538bf49cdcb2" + "sha256:89c84779fb4bfe9c0704bdd40ad70b91fff13fa202696ce580de1c8615414f88", + "sha256:c37adfd3859d04827f971098227a54ef7229a79860860dae7b41abdc17e4e8cf" ], "index": "pypi", - "version": "==1.11.1" + "version": "==1.12.1" }, "et-xmlfile": { "hashes": [ @@ -1154,10 +1154,10 @@ }, "kombu": { "hashes": [ - "sha256:52763f41077e25fe7e2f17b8319d8a7b7ab953a888c49d9e4e0464fceb716896", - "sha256:9bf7d37b93249b76a03afb7bbcf7149a358b6079ca2431e725414b1caa10922c" + "sha256:1ef049243aa05f29e988ab33444ec7f514375540eaa8e0b2e1f5255e81c5e56d", + "sha256:3c9dca2338c5d893f30c151f5d29bfb81196748ab426d33c362ab51f1e8dbf78" ], - "version": "==4.2.2" + "version": "==4.2.2.post1" }, "markupsafe": { "hashes": [ @@ -1228,38 +1228,38 @@ }, "pillow": { "hashes": [ - "sha256:00203f406818c3f45d47bb8fe7e67d3feddb8dcbbd45a289a1de7dd789226360", - "sha256:0616f800f348664e694dddb0b0c88d26761dd5e9f34e1ed7b7a7d2da14b40cb7", - "sha256:1f7908aab90c92ad85af9d2fec5fc79456a89b3adcc26314d2cde0e238bd789e", - "sha256:2ea3517cd5779843de8a759c2349a3cd8d3893e03ab47053b66d5ec6f8bc4f93", - "sha256:48a9f0538c91fc136b3a576bee0e7cd174773dc9920b310c21dcb5519722e82c", - "sha256:5280ebc42641a1283b7b1f2c20e5b936692198b9dd9995527c18b794850be1a8", - "sha256:5e34e4b5764af65551647f5cc67cf5198c1d05621781d5173b342e5e55bf023b", - "sha256:63b120421ab85cad909792583f83b6ca3584610c2fe70751e23f606a3c2e87f0", - "sha256:696b5e0109fe368d0057f484e2e91717b49a03f1e310f857f133a4acec9f91dd", - "sha256:870ed021a42b1b02b5fe4a739ea735f671a84128c0a666c705db2cb9abd528eb", - "sha256:916da1c19e4012d06a372127d7140dae894806fad67ef44330e5600d77833581", - "sha256:9303a289fa0811e1c6abd9ddebfc770556d7c3311cb2b32eff72164ddc49bc64", - "sha256:9577888ecc0ad7d06c3746afaba339c94d62b59da16f7a5d1cff9e491f23dace", - "sha256:987e1c94a33c93d9b209315bfda9faa54b8edfce6438a1e93ae866ba20de5956", - "sha256:99a3bbdbb844f4fb5d6dd59fac836a40749781c1fa63c563bc216c27aef63f60", - "sha256:99db8dc3097ceafbcff9cb2bff384b974795edeb11d167d391a02c7bfeeb6e16", - "sha256:a5a96cf49eb580756a44ecf12949e52f211e20bffbf5a95760ac14b1e499cd37", - "sha256:aa6ca3eb56704cdc0d876fc6047ffd5ee960caad52452fbee0f99908a141a0ae", - "sha256:aade5e66795c94e4a2b2624affeea8979648d1b0ae3fcee17e74e2c647fc4a8a", - "sha256:b78905860336c1d292409e3df6ad39cc1f1c7f0964e66844bbc2ebfca434d073", - "sha256:b92f521cdc4e4a3041cc343625b699f20b0b5f976793fb45681aac1efda565f8", - "sha256:bfde84bbd6ae5f782206d454b67b7ee8f7f818c29b99fd02bf022fd33bab14cb", - "sha256:c2b62d3df80e694c0e4a0ed47754c9480521e25642251b3ab1dff050a4e60409", - "sha256:c5e2be6c263b64f6f7656e23e18a4a9980cffc671442795682e8c4e4f815dd9f", - "sha256:c99aa3c63104e0818ec566f8ff3942fb7c7a8f35f9912cb63fd8e12318b214b2", - "sha256:dae06620d3978da346375ebf88b9e2dd7d151335ba668c995aea9ed07af7add4", - "sha256:db5499d0710823fa4fb88206050d46544e8f0e0136a9a5f5570b026584c8fd74", - "sha256:f36baafd82119c4a114b9518202f2a983819101dcc14b26e43fc12cbefdce00e", - "sha256:f52b79c8796d81391ab295b04e520bda6feed54d54931708872e8f9ae9db0ea1", - "sha256:ff8cff01582fa1a7e533cb97f628531c4014af4b5f38e33cdcfe5eec29b6d888" - ], - "version": "==5.3.0" + "sha256:0cd42fe2d99ec6ce23aaf00947a7b7956ad2ed4b1695fd37545c3b8eae06d95a", + "sha256:137bed8972089d65da63fb79b4949b0f2b99e9a58f1b494e82be43ba8b0f4226", + "sha256:14eb2b2e4f2a14f5c89fd0edf55c5af0bf1a40fdf3838d81867f26f131cd557d", + "sha256:1fc43ce8c4fa3754222cd6831d599ad17ca2fc9868d2fb52f4e5362dfbfaf379", + "sha256:26dfeee23a86dad6277a63d18f61f53b957cb2cd3506dbbd74b88ba2fa65b3b1", + "sha256:2e0e582942e025cc58f669499a8e0bffde5bcc8d42b65729f294c1dac54e4672", + "sha256:3bb8dd3ce101dd8b0b37eaae924a5bb93abb6ffdd034bf68a066a808e11768ab", + "sha256:3f07da3874f0b085421f1d4f979785131aa9d497501d8610d82f7378b33858f8", + "sha256:429b2b5ae5f57f8fd9ec2e012c1e7b342ff10f1a8977dc291976b9a3b4c096e1", + "sha256:4a000fdd89d77b6b675de27e1ab91c6fba517c08f19ee83e6716b78930634e04", + "sha256:4ccbe7cce6156391a3ecf447c79a7d4a1a0ecd3de79bdec9ca5e4f7242a306d1", + "sha256:4d08034196db41acb7392e4fccfc0448e7a87192c41d3011ad4093eac2c31ffd", + "sha256:6b202b1cb524bc76ed52a7eb0314f4b0a0497c7cceb9a93539b5a25800e1f2b6", + "sha256:8563b56fa7c34f1606848c2143ea67d27cf225b9726a1b041c3d27cf85e46edc", + "sha256:86d7421e8803d7bae2e594765c378a867b629d46b32fbfe5ed9fd95b30989feb", + "sha256:8d4bddedcb4ab99131d9705a75720efc48b3d006122dae1a4cc329496ac47c9a", + "sha256:a4929c6de9590635c34533609402c9da12b22bfc2feb8c0c4f38c39bab48a9ad", + "sha256:b0736e21798448cee3e663c0df7a6dfa83d805b3f3a45e67f7457a2f019e5fca", + "sha256:b669acba91d47395de84c9ca52a7ad393b487e5ae2e20b9b2790b22a57d479fa", + "sha256:bba993443921f2d077195b425a3283357f52b07807d53704610c1249d20b183a", + "sha256:bdf706a93d00547c9443b2654ae424fd54d5dece4bc4333e7035740aeb7a7cea", + "sha256:c5aa93e55175b9cde95279ccd03c93d218976b376480222d37be41d2c9c54510", + "sha256:cc11fd997d8ad71bb0412e983b711e49639c2ddba9b9dce04d4bdab575fe5f84", + "sha256:d584f1c33995c3dc16a35e30ef43e0881fa0d085f0fef29cebf154ffb5643363", + "sha256:d88f54bdefb7ddccb68efdd710d689aa6a09b875cc3e44b7e81ef54e0751e3a7", + "sha256:de0d323072be72fa4d74f4e013cd594e3f8ee03b2e0eac5876a3249fa076ef7b", + "sha256:f139c963c6679d236b2c45369524338eabd36a853fe23abd39ba246ab0a75aec", + "sha256:f41c0bf667c4c1c30b873eaa8d6bb894f6d721b3e38e9c993bddd1263c02fb1f", + "sha256:fbd0ea468b4ec04270533bf5206f1cd57746fcf226520bb133318fa276de2644", + "sha256:fe2d2850521c467c915ff0a6e27dc64c3c04c2f66612e0072672bd1bd4854b61" + ], + "version": "==5.4.0" }, "psutil": { "hashes": [ @@ -1457,30 +1457,30 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:013ae9f361cc491f491bf42070a855304a2af08d8bae30286da3c0df9a534d48", - "sha256:1890548aeeb0486892a316292bfa4041a7322c0f8047b0b30efa3c1aa2041d10", - "sha256:203d03410fa1bc5e16e587597919c3b5b25134f77a3480504ecc37ac5f80bc0c", - "sha256:22de3967f810236f0a7012d8f61465eb4f8775c9ea2c26352126d12d53dc171b", - "sha256:2a8e57c9ada267713eea270c3e7027372fe3dbcdad896447bd040381ab4194a7", - "sha256:3ef17bf29cc5b0c261e73a8f414e8cc097568095caca4e81a33d85d01f09a255", - "sha256:54ed540886773f23213b9af3b96a5d56289bec49a20cafa967aee4f2d4a5bac6", - "sha256:667b9cd5722b8f5e67d7b8858ed0cf0e91341a022805133416017a32a9b0c731", - "sha256:6cbe7273a2e7667cd2ca7b12bec1c715a8259ad80f09c6f12c378f664d29fa5e", - "sha256:7615753d902daa884efbabcfa794e6452f7a2da70eb614bf4b6c1bdf294a351e", - "sha256:95a82a2818b7e9c288dd5b4f18cea8e3e265cbcc3f6f9a59aa1bb8c7148f7554", - "sha256:9642484f4d669337894e2b5503df6b01b64ae063fe2d335b5352a1baefb16245", - "sha256:a6bedf2118add5143c9a5b36add2ed6d761831494923a0fca7a0d71b3abdaea5", - "sha256:a798ab6e524fe378f9c671e47cb6ba8c8448a05b98f3191cd513a420f0ca72cc", - "sha256:bc063dec1ab6701498a71e6e8c66851d0cdd2ed4037f96e0d162b649a891c3a2", - "sha256:c32261177f6f78a706fc850b3c7537ec9d3c56bb951801c7da2a1743388a8f22", - "sha256:c4d08d4dbb433917ca5a9cdfba79df4fb80bfc88292ca4c8ef68091ee2b86798", - "sha256:db0e164fced130cd379b9610e3eb20f9d4caca8ceee69c6860ea6d9c3ab6fed4", - "sha256:dbce257cd2c7e15c8e55609955788533091e2895af027a7753100aaab8530601", - "sha256:ec74a3893fb4078fc86b85814db980a1fa2ed43141095ac9faab76828ffe7326", - "sha256:ecc9d9e81567452244c3e3b2a1032de4626ae79743426aa6372c7ec3f88917f8", - "sha256:f29fecbe81a6e1648ae60fe5c0662805de05c205b2d0f5662e8da72aee1a40dd" - ], - "version": "==0.15.81" + "sha256:12ddf4dd68ad854c9a1a4843ad364f60f9215f87c85f940bced7d33887f273c8", + "sha256:180b384142a9c0af4a8cfb7df6f0224f2038babc68fcae0b15668c68098b923d", + "sha256:20aed6afc0e35ff0e68cd7266a73119b51d45d2f98d4ad00119f92a44aefa814", + "sha256:23a435391af43dea8e82c3f969134fefce639470bcae8cdf9e632946608819ff", + "sha256:3c4c10a597fbaaf12b1120e32a73761df3c3f27112215137d600760a1d1850c9", + "sha256:3dc6f3f1e5c8c7df29bf0efb24529d4c58a6a2a51d5d871a926e8fc38a352a5a", + "sha256:519aae4b1a37bec1ef7601f8234b03a4f2da7d096b23e4fdc0c3c9fecb423683", + "sha256:665b38b85201cb5f193539d4220bec9c28f47b04f88f7e32e3f452ca7fd65197", + "sha256:6adc866a972f5597df2776897af7ebae7d395e764b835c3261098a004fee0435", + "sha256:70b19f2c0d16a032f1a956c9fc1dfd17146107cb2db9b06e97a79fa4afa96787", + "sha256:7103b3f261d506b27d77e73cf825cba0271b3b10db626eb05708ce94a8d19df8", + "sha256:840596f45d64b021294868e1c9fc1f863dc370eacaf7ca28c0acafdabf6c637a", + "sha256:8516aab859b31e1053b1579f4eb5d3012401ff96a09cd06b44608879612fd64e", + "sha256:8fce1f436bf85b7f1eebacd8441842508ee8c462665f4de5b18363f5471f9ebe", + "sha256:a3e7c6ef13a70759b61b970ba628d140dc3824909e87698290fb51a93ccfb189", + "sha256:a5a04f13bc9c2a0623cf9626bf56c459ed9074bdef6c478a7fc3176891a69b70", + "sha256:c21362219524b81847a1da793d0d6bfdbb6276fae25415b1e491fb70f90ee84e", + "sha256:c461e5caa8e71715f2fc69481f7133cfd957aeecff022e8e773896a014d4e99b", + "sha256:d6e07b58cf9c16fc48eaf809082f81b182c77583fd2e88eb20290c57742cd38e", + "sha256:d6fc12a7061f2337eb487921476d6973519eec1dd64235db2ee9df408136dc86", + "sha256:f82ad2586515ba794f64883e37f76a8d8d42f8d4e4f97fcfbd9da9a37e6d3ed9", + "sha256:fc4e715ab8aea3e54df56a5c053784d7c2992339222da4a45c6b31249a42915c" + ], + "version": "==0.15.83" }, "six": { "hashes": [ @@ -1638,11 +1638,11 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:194ec62a25438adcb3fdb06378b26559eda1ea8a747367d34c33cef9c7f48d57", - "sha256:90f8e61121d6ae58362ce3bed8cd997efb00c914eae0ff3d363c32f9a9822d10", - "sha256:f0abd31228055d698bb392a826528ea08ebb9959e6bea17c606fd9c9009db938" + "sha256:1ed70a0e99742653953d68462378a1a8eb65dca5f7c8fa44a05a2a0b3545df67", + "sha256:6a7f5e0efc563cd1ffeefba6d528b97aa0d313c02dd126ba6c455e5fe5bd48eb", + "sha256:e394827904cc4923f443e8dd2e9968343669c8e1ad7a8d62d7541e780884acb8" ], - "version": "==4.6.3" + "version": "==4.7.0" }, "bumpversion": { "hashes": [ @@ -1815,10 +1815,10 @@ }, "identify": { "hashes": [ - "sha256:5e956558a9a1e3b3891d7c6609fc9709657a11878af288ace484d1a46a93922b", - "sha256:623086059219cc7b86c77a3891f3700cb175d4ce02b8fb8802b047301d71e783" + "sha256:08826e68e39e7de53cc2ddd8f6228a4e463b4bacb20565e5301c3ec690e68d27", + "sha256:2364e24a7699fea0dc910e90740adbab43eef3746eeea4e016029c34123ce66d" ], - "version": "==1.1.7" + "version": "==1.1.8" }, "idna": { "hashes": [ @@ -1829,10 +1829,10 @@ }, "importlib-metadata": { "hashes": [ - "sha256:28fba9f65e5415a691dd254cdb602bcc4d6f738e68407ad251651db358b63bcf", - "sha256:4a545e6125dc72b4ad98201ea3f40f92e8126e3a19667352b3a134d22b8bc74f" + "sha256:a17ce1a8c7bff1e8674cb12c992375d8d0800c9190177ecf0ad93e0097224095", + "sha256:b50191ead8c70adfa12495fba19ce6d75f2e0275c14c5a7beb653d6799b512bd" ], - "version": "==0.7" + "version": "==0.8" }, "importlib-resources": { "hashes": [ @@ -1882,11 +1882,11 @@ }, "more-itertools": { "hashes": [ - "sha256:c187a73da93e7a8acc0001572aebc7e3c69daf7bf6881a2cea10650bd4420092", - "sha256:c476b5d3a34e12d40130bc2f935028b5f636df8f372dc2c1c01dc19681b2039e", - "sha256:fcbfeaea0be121980e15bc97b3817b5202ca73d0eae185b4550cbfce2a3ebb3d" + "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", + "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", + "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" ], - "version": "==4.3.0" + "version": "==5.0.0" }, "multidict": { "hashes": [ @@ -2118,6 +2118,13 @@ ], "version": "==1.12.0" }, + "soupsieve": { + "hashes": [ + "sha256:638535780f7b966411123d56eb3b89cd1d2e42d707270c6d7d053c7720a238f3", + "sha256:cb61b59c55f9f6e91928a03fe4b500ac1fcef6f8e68082a630db098ab33e2126" + ], + "version": "==1.6.2" + }, "text-unidecode": { "hashes": [ "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", @@ -2156,10 +2163,10 @@ }, "virtualenv": { "hashes": [ - "sha256:686176c23a538ecc56d27ed9d5217abd34644823d6391cbeb232f42bf722baad", - "sha256:f899fafcd92e1150f40c8215328be38ff24b519cd95357fa6e78e006c7638208" + "sha256:34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", + "sha256:fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd" ], - "version": "==16.1.0" + "version": "==16.2.0" }, "waitress": { "hashes": [ @@ -2177,10 +2184,10 @@ }, "webob": { "hashes": [ - "sha256:a48315158db05df0c47fbdd061b57ba0ba85bdd0b6ea9dca87511b4b7c798e99", - "sha256:fc8c466af474e2e2775f1aef7afb902ed8b82e597eb0b13624818a34e8bfe720" + "sha256:05aaab7975e0ee8af2026325d656e5ce14a71f1883c52276181821d6d5bf7086", + "sha256:36db8203c67023d68c1b00208a7bf55e3b10de2aa317555740add29c619de12b" ], - "version": "==1.8.4" + "version": "==1.8.5" }, "websocket-client": { "hashes": [ @@ -2232,6 +2239,13 @@ ], "markers": "python_version >= '3.4'", "version": "==1.3.0" + }, + "zipp": { + "hashes": [ + "sha256:55ca87266c38af6658b84db8cfb7343cdb0bf275f93c7afaea0d8e7a209c7478", + "sha256:682b3e1c62b7026afe24eadf6be579fb45fec54c07ea218bded8092af07a68c4" + ], + "version": "==0.3.3" } } } From 881f0480255ad9a134446ce7fb56146036790192 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 4 Jan 2019 19:43:08 +0100 Subject: [PATCH 021/122] add action to queue multiple tasks --- src/etools_datamart/apps/etl/admin.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/etools_datamart/apps/etl/admin.py b/src/etools_datamart/apps/etl/admin.py index b8bf005ad..b58338968 100644 --- a/src/etools_datamart/apps/etl/admin.py +++ b/src/etools_datamart/apps/etl/admin.py @@ -18,6 +18,14 @@ from . import models +def queue(modeladmin, request, queryset): + count = len(queryset) + for obj in queryset: + task = app.tasks.get(obj.task) + task.delay() + modeladmin.message_user(request, f"{count} tasks queued", messages.SUCCESS) + + @register(models.EtlTask) class EtlTaskAdmin(ExtraUrlMixin, admin.ModelAdmin): list_display = ('task', 'last_run', '_status', 'time', @@ -25,7 +33,7 @@ class EtlTaskAdmin(ExtraUrlMixin, admin.ModelAdmin): 'data', 'scheduling', 'unlock_task', 'queue_task') date_hierarchy = 'last_run' - actions = [mass_update, ] + actions = [mass_update, queue] def _status(self, obj): cls = obj.status.lower() From a61311976913d016eefb9784c53d7084d573c0bf Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 5 Jan 2019 05:54:06 +0100 Subject: [PATCH 022/122] updates --- .bumpversion.cfg | 6 ++---- CHANGES | 1 + docker/Makefile | 12 ++++++------ src/etools_datamart/__init__.py | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 9e09e473e..a50464dab 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,11 +1,9 @@ [bumpversion] -current_version = 1.9 +current_version = 1.9a2 commit = False tag = False allow_dirty = True -parse = (?P\d+) - \.(?P\d+) - ((?P[a-z]+)(?P\d+))? +parse = (?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? serialize = {major}.{minor}{release}{num} {major}.{minor} diff --git a/CHANGES b/CHANGES index 3438cedb4..e003205ad 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,7 @@ --------- * WARNINGS: migration reset * Location/GatewayType endpoints +* add action to queue multiple tasks 1.8 diff --git a/docker/Makefile b/docker/Makefile index c1a9e00ca..58bd59607 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9 +TARGET?=1.9a2 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart @@ -83,11 +83,11 @@ local: $(MAKE) .run release: - @echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin - docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest - docker push ${DOCKER_IMAGE_NAME}:latest - docker push ${DOCKER_IMAGE_NAME}:${TARGET} - bumpversion --config-file=$$PWD/../.bumpversion.cfg release +# @echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin +# docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest +# docker push ${DOCKER_IMAGE_NAME}:latest +# docker push ${DOCKER_IMAGE_NAME}:${TARGET} + cd .. && bumpversion --config-file=.bumpversion.cfg num run: $(MAKE) .run diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index fa3a01eee..35e468e4d 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9' +VERSION = __version__ = '1.9a2' __author__ = '' From 47b3f2174c373d4a1b9c226fee1afb489fd265c3 Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 5 Jan 2019 06:01:36 +0100 Subject: [PATCH 023/122] update bumpversion strategy --- .bumpversion.cfg | 2 ++ docker/Makefile | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index a50464dab..e0e3d8935 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -21,4 +21,6 @@ serialize = [bumpversion:file:docker/Makefile] [bumpversion:file:src/etools_datamart/__init__.py] +serialize = + {major}.{minor}{release}{num} diff --git a/docker/Makefile b/docker/Makefile index 58bd59607..97735ec11 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -83,11 +83,11 @@ local: $(MAKE) .run release: -# @echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin -# docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest -# docker push ${DOCKER_IMAGE_NAME}:latest -# docker push ${DOCKER_IMAGE_NAME}:${TARGET} - cd .. && bumpversion --config-file=.bumpversion.cfg num + @echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin + docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest + docker push ${DOCKER_IMAGE_NAME}:latest + docker push ${DOCKER_IMAGE_NAME}:${TARGET} + cd .. && bumpversion --tag --config-file=.bumpversion.cfg num run: $(MAKE) .run From 88378ed967e8cded8526e16bb4e9f94cb293e871 Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 5 Jan 2019 17:12:31 +0100 Subject: [PATCH 024/122] fixes tests and freeze datetime --- Pipfile | 2 +- Pipfile.lock | 33 +++++++++++++++++++++++---------- tests/etl/test_etl_loaders.py | 9 ++++++--- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Pipfile b/Pipfile index 798594909..368e05669 100644 --- a/Pipfile +++ b/Pipfile @@ -10,7 +10,7 @@ celery = "*" coreapi = "*" django = ">=2.1.4" django-adminfilters = ">=1.1" -django-celery-beat = "==1.1.1" +django-celery-beat = "==1.4.0" django-concurrency = "*" django-constance = "*" django-cors-headers = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 63ceb12f3..29c8af3a8 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a80562227f7016344c9de0148c35992f5777f92eab961210a3454f93427ab7de" + "sha256": "986bb114ad0fafa97bd413df0f19e83a6b29a5bef1af4f7f1729d9bad5ed96c9" }, "pipfile-spec": 6, "requires": { @@ -194,10 +194,10 @@ }, "azure-mgmt-compute": { "hashes": [ - "sha256:5b0c2390af3e29d910e3d6e7a72b0be59d6e15933740dd193129217c000e4fed", - "sha256:8982944ae9022e4999d152356c236c9ff3df0c6024b97f4ef3a4cdef6c01eb62" + "sha256:356219a354140ea26e6b4f4be4f855f1ffaf63af60de24cd2ca335b4ece9db00", + "sha256:3c6dddd3cb971092ed86d5825475f915561b62eae3a516e990fc2fb3fea54fcc" ], - "version": "==4.3.1" + "version": "==4.4.0" }, "azure-mgmt-consumption": { "hashes": [ @@ -789,11 +789,11 @@ }, "django-celery-beat": { "hashes": [ - "sha256:1f770a936f070fd6b2ceac123ef4951fbe9e941e39b52ae9eea5ac0efe57d51d", - "sha256:d40e2c48aeed7043fff6064f53bc157f6a1f55b45d984eb2b52bf1b88ae96026" + "sha256:3c2c22647455be5503aca7450db64ea53acacee2d0aef3d7ac49aa3ef3845724", + "sha256:bfc22dad2884524697e1fcdfa63c0555a65151a97902c3045cd2cf7bf63970e4" ], "index": "pypi", - "version": "==1.1.1" + "version": "==1.4.0" }, "django-celery-email": { "hashes": [ @@ -975,6 +975,13 @@ "index": "pypi", "version": "==1.3.2" }, + "django-timezone-field": { + "hashes": [ + "sha256:7d7a37cfeacec5b1e81cd2f0aa334d46ebaa369cd516028579ed343cbc676c38", + "sha256:d9fdab77c443b78c362ffaeb50fe7d7b54692c89aaae8ca1cae67848139b82ac" + ], + "version": "==3.0" + }, "djangorestframework": { "hashes": [ "sha256:607865b0bb1598b153793892101d881466bd5a991de12bd6229abb18b1c86136", @@ -1338,6 +1345,12 @@ ], "version": "==1.26.0" }, + "python-crontab": { + "hashes": [ + "sha256:91ce4b245ee5e5c117aa0b21b485bc43f2d80df854a36e922b707643f50d7923" + ], + "version": "==2.3.6" + }, "python-dateutil": { "hashes": [ "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", @@ -1668,10 +1681,10 @@ }, "cfgv": { "hashes": [ - "sha256:73f48a752bd7aab103c4b882d6596c6360b7aa63b34073dd2c35c7b4b8f93010", - "sha256:d1791caa9ff5c0c7bce80e7ecc1921752a2eb7c2463a08ed9b6c96b85a2f75aa" + "sha256:4e9f92594621a43304928415936a0da1b8d3ced23b0ca8c38e9865343920143c", + "sha256:f2756f6dc1af3762a996b39f20c28b4731b6006e992017442a5fc93e81650791" ], - "version": "==1.1.0" + "version": "==1.3.0" }, "chardet": { "hashes": [ diff --git a/tests/etl/test_etl_loaders.py b/tests/etl/test_etl_loaders.py index b2fd311c3..c8970abd4 100644 --- a/tests/etl/test_etl_loaders.py +++ b/tests/etl/test_etl_loaders.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- from django.apps import apps +from freezegun import freeze_time + from etools_datamart.apps.data.loader import loadeables @@ -18,9 +20,10 @@ def pytest_generate_tests(metafunc): def test_loader_load(loader, number_of_intervention): # factory = factories_registry.get(loader.model) # to_delete = factory() - loader.model.objects.truncate() - loader.unlock() - ret = loader.load(max_records=2) + with freeze_time("2018-12-31"): + loader.model.objects.truncate() + loader.unlock() + ret = loader.load(max_records=2) assert loader.model.objects.count() assert not loader.model.objects.exclude(seen=ret.context['today']).exists() # assert not loader.model.objects.filter(id=to_delete.pk).exists() From f1da2489614bfd58c463343827f25c16d1569eda Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 12:21:50 +0100 Subject: [PATCH 025/122] removes 'domain_url' field from UserCountry --- src/etools_datamart/apps/etools/models/public.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/etools_datamart/apps/etools/models/public.py b/src/etools_datamart/apps/etools/models/public.py index 2db97b1a6..af8f5f943 100644 --- a/src/etools_datamart/apps/etools/models/public.py +++ b/src/etools_datamart/apps/etools/models/public.py @@ -873,7 +873,6 @@ class Meta: class UsersCountry(models.Model): - domain_url = models.CharField(unique=True, max_length=128) schema_name = models.CharField(unique=True, max_length=63) name = models.CharField(max_length=100) business_area_code = models.CharField(max_length=10) From bedb0e164535b3bf3b6bfc3e8f7c0a729f345625 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 14:58:00 +0100 Subject: [PATCH 026/122] updates ORM to new eTools schema --- CHANGES | 2 +- db/update_etools_schema.sh | 6 +- .../apps/etools/models/public.py | 13 + .../apps/etools/models/tenant.py | 52 +- .../multitenant/postgresql/public.sqldump | Bin 4048380 -> 4051721 bytes .../apps/multitenant/postgresql/tenant.sql | 1913 +++++------------ 6 files changed, 607 insertions(+), 1379 deletions(-) diff --git a/CHANGES b/CHANGES index e003205ad..d2269b2ec 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,7 @@ * WARNINGS: migration reset * Location/GatewayType endpoints * add action to queue multiple tasks - +* updates schema to eTools 1.8 --- diff --git a/db/update_etools_schema.sh b/db/update_etools_schema.sh index 7a830f219..4d0f2c12b 100755 --- a/db/update_etools_schema.sh +++ b/db/update_etools_schema.sh @@ -40,11 +40,11 @@ help (){ exit 1 } -RESTORE=1 -OBFUSCATE=1 +RESTORE=0 +OBFUSCATE=0 +PASSWORD=0 DUMP=1 MOVE=1 -PASSWORD=1 SUMMARY=1 CLEAN=1 INSPECT=1 diff --git a/src/etools_datamart/apps/etools/models/public.py b/src/etools_datamart/apps/etools/models/public.py index af8f5f943..f15364940 100644 --- a/src/etools_datamart/apps/etools/models/public.py +++ b/src/etools_datamart/apps/etools/models/public.py @@ -9,6 +9,16 @@ from django.db import models +class EquitrackDomain(models.Model): + domain = models.CharField(unique=True, max_length=253) + is_primary = models.BooleanField() + tenant = models.ForeignKey('UsersCountry', models.DO_NOTHING, related_name='userscountry_EquiTrack_domain_tenant_id') + + class Meta: + managed = False + db_table = 'EquiTrack_domain' + + class AccountEmailaddress(models.Model): email = models.CharField(unique=True, max_length=254) verified = models.BooleanField() @@ -149,6 +159,7 @@ class DjangoCeleryBeatCrontabschedule(models.Model): day_of_week = models.CharField(max_length=64) day_of_month = models.CharField(max_length=124) month_of_year = models.CharField(max_length=64) + timezone = models.CharField(max_length=63) class Meta: managed = False @@ -181,6 +192,8 @@ class DjangoCeleryBeatPeriodictask(models.Model): crontab = models.ForeignKey(DjangoCeleryBeatCrontabschedule, models.DO_NOTHING, related_name='djangocelerybeatcrontabschedule_django_celery_beat_periodictask_crontab_id', blank=True, null=True) interval = models.ForeignKey(DjangoCeleryBeatIntervalschedule, models.DO_NOTHING, related_name='djangocelerybeatintervalschedule_django_celery_beat_periodictask_interval_id', blank=True, null=True) solar = models.ForeignKey('DjangoCeleryBeatSolarschedule', models.DO_NOTHING, related_name='djangocelerybeatsolarschedule_django_celery_beat_periodictask_solar_id', blank=True, null=True) + one_off = models.BooleanField() + start_time = models.DateTimeField(blank=True, null=True) class Meta: managed = False diff --git a/src/etools_datamart/apps/etools/models/tenant.py b/src/etools_datamart/apps/etools/models/tenant.py index 0d2d50f5a..97ca83e13 100644 --- a/src/etools_datamart/apps/etools/models/tenant.py +++ b/src/etools_datamart/apps/etools/models/tenant.py @@ -118,6 +118,7 @@ class AttachmentsAttachmentflat(models.TenantModel): agreement_reference_number = models.CharField(max_length=100) object_link = models.CharField(max_length=200) source = models.CharField(max_length=150) + pd_ssfa = models.IntegerField(blank=True, null=True) class Meta: managed = False @@ -652,6 +653,7 @@ class PartnersAssessment(models.TenantModel): requesting_officer = models.ForeignKey('AuthUser', models.DO_NOTHING, related_name='authuser_partners_assessment_requesting_officer_id', blank=True, null=True) created = models.DateTimeField() modified = models.DateTimeField() + active = models.BooleanField() class Meta: managed = False @@ -798,6 +800,7 @@ class PartnersInterventionattachment(models.TenantModel): type = models.ForeignKey(PartnersFiletype, models.DO_NOTHING, related_name='partnersfiletype_partners_interventionattachment_type_id') created = models.DateTimeField() modified = models.DateTimeField() + active = models.BooleanField() class Meta: managed = False @@ -873,27 +876,6 @@ class Meta: unique_together = (('indicator', 'interventionresultlink'),) -class PartnersInterventionsectorlocationlink(models.TenantModel): - intervention = models.ForeignKey(PartnersIntervention, models.DO_NOTHING, related_name='partnersintervention_partners_interventionsectorlocationlink_intervention_id') - sector = models.ForeignKey('ReportsSector', models.DO_NOTHING, related_name='reportssector_partners_interventionsectorlocationlink_sector_id') - created = models.DateTimeField() - modified = models.DateTimeField() - - class Meta: - managed = False - db_table = 'partners_interventionsectorlocationlink' - - -class PartnersInterventionsectorlocationlinkLocations(models.TenantModel): - interventionsectorlocationlink = models.ForeignKey(PartnersInterventionsectorlocationlink, models.DO_NOTHING, related_name='partnersinterventionsectorlocationlink_partners_interventionsectorlocationlink_locations_interventionsectorlocationlink_id') - location = models.ForeignKey(LocationsLocation, models.DO_NOTHING, related_name='locationslocation_partners_interventionsectorlocationlink_locations_location_id') - - class Meta: - managed = False - db_table = 'partners_interventionsectorlocationlink_locations' - unique_together = (('interventionsectorlocationlink', 'location'),) - - class PartnersPartnerorganization(models.TenantModel): partner_type = models.CharField(max_length=50) name = models.CharField(max_length=255) @@ -1301,34 +1283,6 @@ class Meta: db_table = 't2f_expense' -class T2FInvoice(models.TenantModel): - reference_number = models.CharField(unique=True, max_length=32) - business_area = models.CharField(max_length=32) - vendor_number = models.CharField(max_length=32) - amount = models.DecimalField(max_digits=20, decimal_places=4) - status = models.CharField(max_length=16) - vision_fi_id = models.CharField(max_length=16) - currency = models.ForeignKey('PublicsCurrency', models.DO_NOTHING, related_name='publicscurrency_t2f_invoice_currency_id') - travel = models.ForeignKey('T2FTravel', models.DO_NOTHING, related_name='t2ftravel_t2f_invoice_travel_id') - messages = models.TextField() # This field type is a guess. - - class Meta: - managed = False - db_table = 't2f_invoice' - - -class T2FInvoiceitem(models.TenantModel): - amount = models.DecimalField(max_digits=20, decimal_places=10) - fund = models.ForeignKey('PublicsFund', models.DO_NOTHING, related_name='publicsfund_t2f_invoiceitem_fund_id', blank=True, null=True) - grant = models.ForeignKey('PublicsGrant', models.DO_NOTHING, related_name='publicsgrant_t2f_invoiceitem_grant_id', blank=True, null=True) - invoice = models.ForeignKey(T2FInvoice, models.DO_NOTHING, related_name='t2finvoice_t2f_invoiceitem_invoice_id') - wbs = models.ForeignKey('PublicsWbs', models.DO_NOTHING, related_name='publicswbs_t2f_invoiceitem_wbs_id', blank=True, null=True) - - class Meta: - managed = False - db_table = 't2f_invoiceitem' - - class T2FItineraryitem(models.TenantModel): origin = models.CharField(max_length=255) destination = models.CharField(max_length=255) diff --git a/src/etools_datamart/apps/multitenant/postgresql/public.sqldump b/src/etools_datamart/apps/multitenant/postgresql/public.sqldump index a94c373257496286f91b959306475dd869a4f132..be474650d82d82aad09eee4524d5ddfff118974b 100644 GIT binary patch delta 64304 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%0AVu&ml6;o;Pqgdpzq))}x-hyPr- z*EJb0eF+dy8K(};co8m71gVg{D0WR+OFt5dFmf`z&_$}A{lP@ijH&cg7pZyzhY(4F zro&mJthpxdWf*}JQquEgL&aJ6hKKNU2HhP`zv4bFoc<9c5VNkSD|u$+WXKVMk8+@1 zvmmhUE>CAuHCai);J_&RfBvF6SaL|c2)VQANqB-Zcd#);(sl?)717d!RE;H(I&}5L zl$;tumw9vxSMO?_HJ$+B5T4J6Y6fYnJPY_#)kI_cOu{hhlBH~(>kA4Mga%;}3Bd}n z4B|IBga(V~DAz#LihC*vLRgRswx1$rnvkuT?nxoYTzHp9S9H;;Z=bVBv<{*B5(o>y z{iec)bR~vXm{UaWJeWfmwAnDKn|{I=U)G(D)ymBm}!I zMM8MEo-X4SK_DTBYQf+H=TQ7c+E4gp1Kk9h%{Us)&Z(8eHUgm8D5N;)5qNPmv^z+& z7U9Mw`UlrQ)cx)u(TaBvoSTKpZlxoHf-Q8kix0K5|4zcL!yVmqDa;z+%5{v?5!gzO#kL8=xj>0bCmp5`yA6X-Yz%_5B2 zMK5r1qTWO&NwhYh;U0RwYmL;jXGpZ1uBQ0m4WZXwx`zuvtp@)hAV4Z{6$v5v_d+G0 zi8#DYLNMuSiaB2;&~Kes2tVt>`Ur3TpsVA_&?J!EB!O9keh28Ac*j7{1}m+P2IL-H3@@*7f&`7<(;LIgkERB zP?Jq1F_e=P(a_iQ4ne~JDguaP!^Q1>fLl=L49 ze-^rQ!4JsUIbrl=msDz#20aM05SbB$%8!6Lfqqx%hq!mO^711gn1piI=$@`M#X-HA zjKKgBh(#BN%3p(b<~P^r7nlw8G=`E8Y(m^kx&f8~O{!rSiIx)<|4kQDmXFgEu8ASg zLVPzTe#JuYxedmO!nq~@wKxgEB#in8{57)hXj2mt-P1zkfX*U*S0Y+4-G#t)452pN zl1LCHT{9`0u;3oO60ahdgrb}|I88QTSrU{*mnK3XfPzA-4+=Tbz?3AxfXO1IO7?w3 zoAH=58ImRv0ta^?DXsDGW4H?`)1t{{v=ShURyYqu2q~Mf)l+%`C71W%OgQ%aKYvjf z8Fmt|U9^7`U3FY5_M#ng67jsP# z4hQNKk|Gn)j<+s#s`10tCLov%!qazjZM>H?v~@|eCZYES`WqLmdLuR<(OQH*KNhZ| z#$B69qP6Ml==et%_0x515p?1+?I(HHh3`Mp#qp-bo?vZ0W+M_b2X|93AM@E4m-mj- zIAog=5TM^AISsQr#kh8(Ci}7l3Bm+YCS_lqqM0&ydNoOxtw<0Sp*+h3W1-UIT6Q4O z+Q8LS#lFN=Qn1|#$7C@2uqp$JnEnS7bt3d$s?cWHMLpiRfY`68!z zmhfZnHJ{UDcV?4N#7{LtS@$p$7s!MN2mG0$uHmU|hyDZ{u}p- znw6V8F3E(VYpy2Q;Y(O-}Cu5(Fn?lw}IAnAnwDw-#iPTM(N;x*ABe*}IivD!ArU ztrwS&AWXV6xlDQ*3%1?+6s9T0(R>(q841UtYf^}V04EN8F+$b&s|Kb!9wjb4#c7~d zkf3d%Br8eAdSSN-w!Gq9!0t&-GdQOo6x5sGYp?onvCnMBw9|0tISMyiIZ9^w-aa~N+?6Dsa^~1Nmb4l z0nQifmeXch?94akiqZtX!vw!);paki6W{p<&`DXxbhB>`nKt+OS#pk)B`pU8EP_~LR598BbH!L zC9-X$$+A8|LIs0eg^JqOWITjtHJA`Q;Tpuf1VjiQ(xVf1*?93z6^X8R!xZG#2bW{s z0~YFI-(wTdu38L_r$GIr@COOn1Yr#lblXUn{-*FgfsTC3ymg25Cke{}OWDv0Ardil z82r-0X^89G=&Xe#=V8uh`d`z7EZol3x=bpnzF^Yi59=RvZT9Vgr9sxtZROK*aCQOLfp& zd3b~hQ`&;`$nH)p&QlVOML5=u!Om7~A%f>5S{sxUInj=ZMwSlDQ@kK*%l88bfz!da z4SYOGqfs5f8V8dc*I$8Z=E^43)FAjo0E8P4l#l?xIh`3+Fmz%VyviCF%1wx}(P4wK z+Ttrf7bbqi&z%`OuNpTpLqf0!ySuo215h4awYFX)TANU`D^uLnullm&L!#w`tZvY6 zE9t0mXv!uO`5#)N39i*%aP^mppF^#(lJIvovFGhO*=$yO)^}MbZ75tJd-<_J)ioj3 zI5-@)ZQrYV&n^l2j0XDbK^=Q_@06mUNI>hSGs#p%bP7;QYySD`fKuFfi?0M|2atxx z=@P#-yn$W%Wc3-?zI*5PHhbr+E}c4~B72yGW?EJ>4LS12^i3PrZct0#abW*0UGzyZ zHA;QY#FqSjVM~LQ>cXpJCt(>3L;6o#MmCnLrC)@LJywOf5c}aRn5sLq9AedZPgJ z-pa0q7heAF0CTKywb|0w4vu;+EAmM>P^H z_#a?*p~b_XqN8CbC@d(wz)`QfA73~_sC~w?$ zjr+eRiPVN}|H$BM2@Pp~0;%{010lSLLef~qL$Ofonn>aSBm}6HB_g1cPUQInytX6j@HzXxh@CX;Y%Xwekrjv~ey z7x6R_Da4bCVjM7yF$hnlGJ#l?Xi%n;P@oQki1K_o%xa72%spj7HKqCI5kTN3rI#XP zPtE{e&HNe6-^!-ZI#o$1Mq$HD*M-BbpiLTD|N) ztPh&HkU8g$|9k=j)QwFL2Hd&@CvM;0m_S}cmwtbA6%#FfWdb!{ z39h5*%iwS>=qp-nW^k0{t^^5#W}G5n8pnSDi3vMuzltd)b(OgSzDu9C++~PrfcBDr zIH6z#W5YXEL;DAb)&X&FFcZa5gWs4dco=E}YCi!13VFjY60o+@IOPwKXpQ0&#G{z@ zuvf0FE|gC-1BXcV4* z!hs}dh>X_57k)qsi?>T5D4z+!`7xRp=_@2GL~R9z#Mo$*v61l+#%^F}%#|j#`6>y? z24)5X11F-gPLTFCer$2nb|=^}Y5Qq^@prqGwb!7YBca-P_|67DeYOXxu!*^&OuObu z;%^cJ2dk%i`ojzD*$hV7sLiew)Wl5RB0#|-vkZl%383#_t^(2U%dn%Rffj6mC;w=H z*@(GR`>W2AppEkMMG0|R3pJN!p!Y}+CS6H6j9LnwKDiA>DzPXj9f?KwUP%#@xgFLA z_)HMPtwWICc4ipnSZ(#+Cv|83Pj~*Pbqc)ql)r>0L+UAa2lP~K2eZl@{=X!A3v8Eu zN2!u1XD0||rJXJ-UmFnphJ<5PaD;`s3SWyfMRlK$AZ$=84p@mn2aRk5ir&MV#UoPt zo1c@p`YXlemA@~1|Ekq>JVDgN$+Vi{{HZoDUYR*Qibi4?{f{#H@Jy(OQ-lPU3 z`k#J`+3BwTK=&XPgFzU59Ns7tT1}XI5Q)}^fHnsGb%MF)jy{+~Z<6W#PvNsk`$eE| z61`bhMhdmBbsC&wvQE){4k&_zV9}Kj5zwPEa2efr#ueeCc`b<~p;+PLi6V;QFEA6o zoMoQ7<0XoO0v|b$P`;dFilF-Eu(hQfQ7j3?t}8B~96JvO7=NDm2d|9!JdGovaKhRP zU|?ZdwaYf1L<`FB0vL_qmzdY?=t~jkjRqn8GE)Ngt;rN9L!vbzpiM-(t}q{!zBTm8 zBzhBSe-rKuY1d%#{H`%)<>zotlPOS+1cKV#gu|rVb>=eWK|S{=Byx+)!?YW~Lz^4S zad#l)Ng!}}xryENTJ{YDQg~$m(g-yFZ|15Z$C}}rN%Ur2f}GEwzvzRe-G)(|xy8K1 zqfm=QO{;A5(pT{;(3+( z5MBbLXSKAgU~mFvAX@(rY^W*^nQh84X`UGBk$_Do`4RR8YLf{XlSs{wZU$duDuy~d zW-ck6Ycc_vkq|7X?-S-TCRI;JTN0@i9eW1j-tm;Vs?ckE=87Jc~_Op1g4a39K;4B~n5 z9TPC;U#h71dnLj{`;DX@NbqKeQvvvrLY=n^t^uZvVjn?*u)t+aivM2!4jwX<1=qxX zk0e1@At6VEK*66s zIt*3%0)|WAXXd&xG)bDeJz4ycr46pmBSDB| zmqZAZ-GcU6;p@%f<<`V#|4M@4gmfP^$VIDm4X-58IuOvtqqap^Z?vumdq+`L8n0?T z0mNoNDSm7z;b~E}h>HvL$+3Y10L44}*m7=Z*OF*W0>oMu2F|PHbPI`A)MXIqTtY|- zWL>&U|lmQ}%m{3I4f|7juikRWU* zGnB>GN6nY0_LE3C;d&U0<4QP91oHtBtpfpVG%`f6_=2RN-$$SauX>$GHXRFqhVNq} zS|cimVs9#YSQAowl0<3(b4mI>)uU)ud0NrN+MXgIhz6I0;2+CgmU+-3oF*YyFhbur zP*IiR*i-IcZjxZEVg{!TBIqHU87d9Mv)G@n4PySAgd^4|EyTI4XK_ZU7Uv8JNBk;= zg!423hSey6{mb33&XQm_3=>xZV1^~SpX9$tFb+5eByR4MfD~vj7m6c8DfrC$-4g6x zcYIwT0D|+qoD7)P6rAswrC2{9pp;98Xhq;Y3CswG9fTl9px&j~Te1e$Mj$^TA(+wF zB=#I8Rhz3XNTiUfQifITliE<@mn2fFNE(4oe#0tv4K4j+61`2hUY5n-GTKn(wbL*cf-kt4sWU z;(t;4T{e_TKxuuz_Pj}X)JAn{u`#tYr2n6))>=L>`ppKcrKZW^`h2#-tn+}Oe=Y1d z$jyw2iwQZ~EyYsNLRF4s=^7>j{+2p~Aj@(5+IZhU5}sApsIZu}u&n}ngaTBM85X#6 zKy6}-s+QYO0;-e`4TYB@(BR5!1yp4kXrte*u`wvH9~~gHtIYOu zbCsDcCR9#k&x@=VmUniIL9I7}38-*_6rzTqqSe@MkZ*P1e?)zme-D0rNRaR;o$V#| zhQF%)pQ_U8-oi<}S#_<%0>(+`hw7|VfR1*<2K@@ECLFgI0o7p;{A;rJ-OPsiHWfxf zQuwo=r?p|P6&(x{ar6;PL|S#0L%$4x`?T~AaUWQJlzEV?jRI@14PF1x7RI6#CCyl3 z+;d=smz(Kz*h(}Y;k-boU8@MCCVDcGgan@-ug`h_(pMx;R*HA9Rez(I;=MOR%;G<^nBM6fntCyATQwJosD z*G3b@l8_<2TPoEV*NojD;bFx96^3P1p@~k6C*Xmr*CK|-6+>d>Oaa2wMvJKU``~ui zh6<|MXws8Vt-3a1`N~vuw-ub2lDLk10OI=R20BB4-1#qy9bLTr0>5r~%&K0qf=!++paM$k6| zR4APCr30G={FzLy8g}^b*F-mzAR$?yu!C49QGhy$EbO8GImu)mH9bu1SB}NO!oAJ_x|4P?U#IzA{Ah zvx$`iC|Y^?n{-)}@)MhaVB#WBZOS7C>95nieBkCHXu(aoqyYbz_VwO0u^tveZ=ivs z-cnG`IH(~y-NPdSjY@?BKH5o0Rs=}N zLiP;ynYh-VHY6nv5C6(vG+DSA1UR@#$+e1v!#o=eYRnA!Uk0?{T8ElV)VP6AlW|xY$;^o)8Qm2vttwQQDHW&mQl7p48nQ^Hr zO)y0j_egew0Rd7;RBJVk3=!3OAwhtJ$X_e_t81+GS9cgk**KWw?~%H|SLzkjBGn*`Guv zO?Wyjm|M*ivKj%}WDsVoXJ1N8Vxe;x7@8=I>Les9RCJQ+G2Yz3KL7ftHPsnw5&+@6 zsVi4lOxYy+=CBRSS+MA6E|fJ$fZ&_kA}MvG66ySFi#HE3vPm26t@zm^@+N4gbg0NjOu)ZRR%BR8$*{w@Jfy*|M=4(hm<%~j=qwE@SRqzcQ>fkBDsc}s-B_Y}1 z7#B;SAt;6BB{Vq3GNN&SE9gTxIt5kp7~hzH3OCZWa!`R(RBr1Dwupp^1;;gfO^iVk z66$|>4HU|sW?zUi;LxI~qYoOnN9CYy(|>ps3)dAB7M^8q1GEuu9=i?u5i|_9BthFi zq~K}4yzuWi)(52Bg6q#f5jH%p>OIt)0BAI#4VT%=DYEY+_qi1rb-4FS$#6pr0xKZsJTwJ4kZ13&#K`|hg>S`&WJmC!F7 zOaH0pCYE6H7QQ@_M9yMWh6IZ!?^bR2!FMERQTO982C2GRAe!nqHC2?pBNrA2)` z=uE)38wC))Pi~OZWl1`bkZb}}p%Yy{+GW&Aa7O|XRQRkW7iatU9!ds^PHADyd+7;G z>z>j=XOW<7U^Gjm?f&_MpJ%Xy1PM@5t}*cc|LLR~p%XZ{nz@R?g$crE_UczRkHet8 zfp#aM+Q5_+>$`1!?(x_So?6}ZbdLvO2vwY2b=uJNHXyW38IM&WG_J7a|UF->C(w7^N#J^%TEWNt~h^t($?_4u{-l zqCZWz=O6XL+atQ{ma=xseBI0O4f4iqUfB8K%8bsr$;cWcj>a%V?U z=79r$o$dVSU6Zq!L$l8&*Gft{neG^LWa@20SC9B9VNpYp!ygV^b$ECN`^|+qiK&ZY z0unu@acP^Lec2P#p-OnMUR}GC_$%jL!r#r(y((tjPP#kXr}3=J$O`}T|J-5O{dqm7 zyc#&>MW>V+A7=d+V7mLZ#o4E^`{H}9>M-Ni;g+bkecDz_i5?RlS?2xu-+kUcxm4{ym!3u63}=^@8Mz{Nclg-rZWTcno7XIcELn9%Z@dA z-d~Ylx?!)+pJy+f*lES4sDru{+h@MW4RsW`zozsVOUKO2T7!L8d^_gdH+NPp2`D?T zZiU2z-Tgz8mNq}_NZP#Vw&TUp?P;ZV?XOp|^}f`732hI*JiB-AsY&hrsJrb@%B#~S zUTq9N)xXK0I+Fi>q%6zuLNUivugGRJYK(TE8(g>NaxBlgyob)Hf@qHnBZ@zJ2?)cV4e=4fqH< zN~iOtbPvUCnuP*ym5D&Jih4ArA1_B!x9TJ4r^^M#*P}H>KVL3%@bmb^lYY5e_!Q#d zr>FJ^MJ*n4XzP>4hbj%{+BE3WyV8-hb?e5A3vO!M7V=Y>)(uwpWij0vf4|_&=VN_8 z`weA(rltNU-RtG!H`_em#}j_M;Kv(&eBh@D{1k;BU-fS*A434)(s_z8iZ zQ1~eZKVk3_4nGm_6A3?2@DmL`G4K;BY_`Q6Fwy@mA3vgd9Q?!!Bf9HrhSKkr3;Rdt z<2m}na^cQq{c@WAB#*YVPE;{%iij#^?Si9IZ*46$?#-vrU8~t{?DBQCjYpP*`>`SV zGw9e>eTkesAK$;eemynk!#^MPR1rSyp1J?}k@%gCRp+Z(7k1lz{>jo}xnDj^%lUlw z;riS!`*sf>d2__zp&L?LFYeiWa+706+kg3d|8g!{ops<^yc!$XwQFAbTywWZyvn3>2fEkm9x0Vsr%EaHXYG> z{M)(ItIQ#v(!&}~m%s?PuNh3ny0hVT4-#qMkNHqCy& z{ad^6L$8cm{C8d}Ua#wWua+%`4GLfNP4S~$o(G5Ao{>C{dh9{hUNL>i%*XBewM|&o zYj)?Wc{RJen^mgk$e$J+pSL@#Z`Cs~0Xg>Ig-;g->}W%uIvcrrQ1s$1&s!b7Q?FTt zkvEfB!#m4K9_xZ*Mp6?-EDi`oHh?&{(who&#@+ zA6htm)8hK88s&t&diCwv{2{vPKm2)XSJ@F;K3~o%6;Z2a-^j81o9yp4Ao$96V>hfk zwY=G{X*=x=k{VsCe!crI_sY+B`u+7D9(N{jZPWSG)Sq*wY`)3)RBqAok9V^=RX>$A zy27;vj!s)C!;Ufs+TLh9tJm`6=dH^>UK4)z{>P=`c&@bLRsGuc8d;01$~m>P%s(p~ zp*%mge}nV@%k(vacfAbAKb|quBjY05Cq8Jvr4p})Jn>7bIj3`#BUhVjtd^X5_9kEX=B?y{jQ`{+On_bkM8h%-j8- z*B=ijtverRY@fKqwC{WW0cE^~#a8UwWP8&O@hPKs6~A@FRbiNs-pVhms z@l?IPm!7V5?NDmY$t%+zpWCn{ze-GxhEErJFX&t88+(J>%=w9qm)%;0uG*3xJmNv6 z7Y7HQt(y1yq!BHyFPt?eXF~s#?G{JY`}n4jzUReCuMgf?eynoR@^ZH?#tv{C{{A|u zMb+=Hdw8==$WPos01cSw76 z>3x;{V~J~&1g$QGUbcwhG-{_Cm>yI1=I5`H4< zWBn#6f!^IZ9}YcGdqnryKaIJUvT);q-#okT%Bk4(OWW3ad{f(0)a|<+&dl!EaZQIE zo$l8A((wAKS^xGMA6GJM#mKhlJuWp}f2)g6&BQGi*F1aFJfP9}mG3r88Bla-k;AKf zhJMVe5i_Ot60bwg88-U*!S5d==O4^C(5kn7>)?Q;AA9wypI+^Gfbr9sn;qx$n!4`Q z?AUt~d)+EMz0su}Ioq8V-*#p)JNdU*G3Zw5;A0P`TVpT3-FCaxVy|ZTlaHB>=-1tB z6|(g6n+rF0wwpI?dD{59sQr)MJ&60^UbSsS|GYl0{ZDI`-mE%#!;aZ4E*9O<;>Y0V zPP+#@9x@=MMy;Uen_cQMTaQ(rQ09l#pDvYZaOOA9%gt{7*1A)tadlet>G|D+`#B4a z47#~8BC*>P&)^3uGFqPR$sTx8@aR^B;{F|L#=R7-?QZqxSfjclj;wkc*W-<$$Fhvt zKMM613B{sXbu{+)?ZowU)(2r%4yM-$rM2O)FbUQIbWf2r<6`^gn@9)!f9OXJFy9=Cbt-kK4|e*SQ+ zMV>Lc)0Bo?M~pqRIgL%Ox$w15KuE{PL8nSbG-==QY)bB^HcdVIRcc=l{WSUCk9h-m zzdfm4zf5^>J3Z|DV^8O>&eyNpIl3&hez@()w))no+@rmtwmu39zv^v&y8O)kwfFoZ zdVSOto%UDHWo(IUIe$D{+T=moZaX9D?essgIqXXFUEQq9>*fFPbmjDzOwYB};GE}w zpI+2`NO8J)>YR_mJ$~$Prbf>$qifV!@V-(1dt(w`pEot`a3T3^-Fam$Hcg(ARJ-e# znKibzIr#QyV)ntLx~R@xzbVa|{Z>Bg&+jT!-`VN6^%3<>{Wvb?RNBqjEiJv{a+2#Y z+XE+8_|$gb)~1uZ$3}fL*EuwI&*+} zgO}6ts?M7lojA>}$HcSu_niD@Z*RZm9p=-U-`rhqI8=M(snlCzV=Z}oz8org=0!`} zh9MVsmg!Zoe<)Z_?ADf<2dEAeydOfB$bj;nKb!LVC=Rs%g zZC;jFA-?R%{(b#!Js6%{a$eWfD|fFAtu@CSbbs@bA$%*pCy)R9V{W_9(hV2<)|gt@ zr9)$<^P;{)g__I$x)xJ;)B5Nc%^p7A*PurJ&4PAicA%qUPp^Y=5;KdnxNu<6gg-8n zbv_={@9&yPQ`Y{Ra5|^sdhS%ryP&J%LS}p%+NFE<<6FK7s^w8`RpROPT{lf1RJZ!+ zhrZ)8za6-%QN7g_`j_|KzkKD7%dQ2p6PM?;3Tx%@_}__3<^}jx-IH`M==APp?Dkh4 z-uzJKcVz<)ubzH?$1N(WW$MHi`(KWWtyyZr<~zssr(eC*{NoRsdiD*!Q~dUmJ~_$h ziNhZ`CgjaAzTeVmOI~c}Q$3nqm>+RT7rXz|F3PiSkICN-eceC*Q&isyZiw$o^+-!_2b z{A^|4HUDg5EDc%4z8gz+Qm9B-vopw+FxDY^_Ut4-jBLe-q-+h5Lb9(RTlSgk&pglb zfAM*Dzq-%4?(;p@Id{`N0+fT$+4!&`RwY53k4!e*)+o%?%dR=r)#}}YYu*e!Sofhs zv`p(Z)DQy;?^5_}H@oq0=TjlYO_;910lER|AIjxr(G!5LGG=x9IWeTDmscLNdsFdt zo)g`1@b75VIa7ri8a)H`%X@X&J%8Ue`ltDD?SQ{BHSz5VK5rHI{HH&|FfD>2O@|hy zZ8KWkzgZAFJ+Ee;u--SZ=`0+K8ndb&Mhlqm+Cvv%3xR)&J*gCRgyTEL1yw7@?L7oo zQF;M>({hj!OI^Xy*+4&xWoGmhl{rpj<8n^#5tDm_V?uNB8_M|KTKZRnK=_; z5dChU#_Mo=u!bfNbmaZFd@250n8yDPZN4skb$|-Q*>>?S(E&6dPG^Y!-DT1*zMPA3 z{_g-Ch#Q{Z*Me&fCI!~-$GSr04@;s zyA4V~4nRQM)_bVH58xjV$C569Zv=Qi+>{QiNg3b+ap`E7tS|rtarjp--%>yTj8oAQ zBoQJJCJ`aIhEvglYsLUVATIn1T%QsUAsrure+2+Ih|3*@FHrzuATDeSUP2CtgE+o% zxFjtg3FeqB!dn3Zm_xq=HwR=uoc$7T%LF9n9js{c8IOdI9P6xHf$U7+q(xV!Rmjb&y=os zCxW3e7M-zNX}^$X>}bX`Ji4BetdgpaUwU|F(Y;zdtd8`Av8)07MyR zIO;z_8kZ*3yV$HmzTrSbr8Esh_>@C}%0&>vF*46i3?5Ht8Be;RYuq%Jv3t!n;{7wi zbG1Qv`&nl{?1oQiSvNd@i*65UsEe#8RQYl-9} zgpZ+Jn*9l5?toN-s7>p#e;k`J1lEA|nIQq~WOqE>>vH+6SrjG!L4H;eZo? zm7KdQgiJ$LUotdCr4qgwE8i9R^sZOZOlovDC4B{jn(uOF(cixZjj1gm=45;EOvrD@ zig#qUm?ZW?Uet*>{-zO!F#pPxVfN&u$4h8UasT3+p;s%!K033%1C%#S|D?pX0_95WT3QigQ)17nc%XoG{l2!$z*dQFZj# zfp_mu`IzX6hb;8=UMY%fnLf-P0`gITu|MaDvvJcD1|L8ye4lD?#ot`qYlC8Tyme$v zQ(G5};<-v*-JeAs#m91_&(3DdpPE^Bo@!P3wumNQ;emM3SjEJPl^^r#uFhMs?(g3TquUdnsv=!7|;?I6C9Rv~VR$#PyXju4MYZdBY0cD9)1 zvvsQu<*(}b{FZC>^9i2p`ou9Ksh4JMJYtOoNaJ<-15=HajZ=xa*M5$(tA!j6s+m;+ zY@EsU-=GD2g}QjGcpMAC*xxsUP;iAo{>aE};^}1sBzNgs=JT|!A<$M}fa(V2jekPX z!*&%^9PVyUhqI-b7Gh5BIO}McKUPmZ*frMsOdKtzmU>nj zEtoEw-mJ8}D6CX@XI^ejU3t~BTR0Ae{$--m*n97Tu0V^Q5%ZRvaUik8KrT)`_muEQ zeGUT|YH6d4kW8Y>Jn$#3z2W{ zvd3tO6PjU~m!xPwz2^{0XI9;ZWZPxJH*{a0`q^q^PKEmBZzrwtjvvled#I^6rL-R90y6&FSKzU$)@F|+jgj?8*zZ+vdp_yMq6 zJ)3@HCbWslMRgt{1nxn`!8>2lqAaR$yz$beGrG3AQSr1(*P6dGYsKX_L9D+l9(|}O z^4toWPKUaEH7(&8#+oLzOf2sng5hI;SqzMgS_V&-YryHiH1?3Q&ho4TJyA4Z>Q(QE zl3OK=s5i5JAOASqT6Au1VB7?s8?W9#L0ixHNq zOkX5yZu^ZMoq5}O(>XGNno-jtH?C0cztrU}n(cND*J*NXP>j>0$jf9qG!n&mr>pG( zK(~wE{E+0kYKI4$1vUrD=+XokeM3%!i!R`ByL&#{w@ExOGT;relp0cXk6%#wPfAw} z%1<`c%*CcZzEo;7(!?ktFTC)=F}JPw(qhG)b~gOe!tVg-6Kt`J#aC*_tc)i=s1eWV z7{AS7L%cjjhcs^|n?6RaeRY-E7aG~we^fpg8Rf%_@EBQ9#0$Dupi|Y@@2hwz?gIiP z2!;r5t>4o_DU!z!Qc2bn%C1szBKj)jBEb_sb9FU1U$e;6j1VJDXmtTwU< z$1%Gb#?m@gz(G*!6e!5#3&^g*7EWwVEQfl^KiI?FPCEIE^S6v-<)h3qy1F9yD$B^a zZ?%0r!V}-(trLa5Nn+kgsgI0gpE%^z3%+-J8H zUJR@CNYl+Vw?ZJKr(K%J!J5&Za{2I@mf*jD9fJ{!GjuPq~KFq&?? zubEa|{Ze{$)sDRIsG3_V3}I-)J8GM_)7x+Pax0TQ%|H{aoqyr6doMTm^aq^|2B|6I z{>53KlX7*#7e!Nf?Q!Ma%F}@fE#a)I$|d>lQV|I#O@ZP3I9}6MHr?*CYvF%icc3g; zSXf!|RWu(z>W&m%Q1hJlZdtj;A%lRg` zQeVqq#$h56-D8#JQ(2*RJe&+l*qFWudq(BP=r(%CxNk{n1ZW~G7gm4X-gFy(&*GbV z1<6_~CcEe}TRd=!+OiyMNbggu&@(Bm9Spt88Bi!Gf8)`%&fs8()S*XM#`kLeP~`WV zlu-5Jn;~^=*BDwNu8nc!c9umKI4K;jJ$Utbuh(WJ86B^kSvos>nQkfV=u!8|^SvHo zKpL;iGX>fA#3AC5*H*36z@eWMqsR3wam@!Gm8bMxbgM7wXsHY@ea)q$nlnLYu&G*5648fF}iHG z&J}UeGK4;Jdq&1^VTCfmuG7%J&WW>qb{@AbPtD){L)}90X`r3X-?LjdU|AYD2aSd|uvAP^w%fTc-Q zqzOTafRs=KrGxaA|LkqyyEk{w|2rq1d|~IeyR);iJF_!$r>=Uzyq)%fNo`iY?kCNd zVkSO-VHgwq&q@9hK>kyd{HFx@PayfvkU6R4{Ks_@;@GatTva;R0w{tTkICEL#WRF!+s|elPv)Cw__f ztFnZc{7(XKdL;n6+vD&RFWj4n?@npqG{vCDgSbd^wFc`ilwVXrI9lYMkn8WqSu7r5 zSyBZ1gVfcXz~ki4Hu$q!oI9DD^uHbye77kIW%pyvzQV=6X5xDqw{%)e31UkjJ=ov3 zuXtfb9Ys!11iMfi17gb7KKT};4K!fO*j=4&MuagDf4?C^{CCp z2{X#Xpv;bpG@wcmLzKbTHG}C#>B@ILq6HJ%pVGpKnta5Xh1{bhgp*HV#K~WZEFxq^ zZI@TiE6iyd!7j-XPW=}t%#Pln48y4zMmnVv-{_cmta*TO3pc7+hK&$Dj(cYwNNMFu zix16Tye^v}*rkMNk;1x!-O9K;nsE)H;0X&8^VDgQt&*9A9@k-0(7G;6jPO2bqynlH z!LN-$J?K;!Hqmz?Ih-*MrZn?0rET(DtQJuamt~>-b=fMg@FMRkTdWqX;0>Vx4liqA z;)haNcuXbH{-2m|-_>$w8S^mXmR{ef^0E1Y3+WZXE|<3Np^w>k^tumlr$dEV5_hZ? zhlb_DX~^*vH!!gy3|n|DcA=8REToi{1Tw=CE;OpVNm?af)T!|i>R^Ucc zknN^0#LQtMg)rx{_%W1*E|Xboi1yWE16DM0Lm|Znkh^@L=UJWa%-IR%7SBZNN z&8`pgim$d(=8M&)8PYgPhi+36V&-z;LU8qXraC%RlZg;4AC*MG*-WsnS9MU8-`5xy z|BW$%-EK+|5q!;RS`}tl1tPhtvwX{H6%qdiTgs{x*6|cj-__cmGw~BBEj*_3Vz(%5 z6O43Jol^OI6G{C^TBtL1UnvWvmDGvG;0}SQ=M*B(MvAPM{T*A(*RS43tZ;W?AX@(& zn;`tx*DJJdINUsmg5i7Iuy+2Kh{{|ejp?h#_m!2>O7LU~o)->zSg9nT;(!p}&rJfD z_$kJ%oi?d;II6S+Mj!BLD<*a-rMXjh+`8lfALB>b7x!g0Rh5uU)R1el(5ZGzr0~3T zakZ6@+0$AS zxvipv%vS!w+g1li-@L_Yv!P{!m#=$hj>*jiC5E&g0l0UqZ{DBO=2QZ+Ifz=YAC=^sMd`I@c)SJNZRLCVrkVg4bq>mk`ow zMhi<<#t5_f13#-wt0fpKvRPR+rsM)QA(Ce}|NZwY?3$> zlrA2ZupjMOE&M$N*JBD7n)QzKRUF{Qn13*CX!SK6n8C&`q_iNm6!QfihV}uMg(8FB zkYSRG#kCia>}GM4a~-@;eTc|DGEnWsa}fpIYYG+S42$r6GPD#EyV$s)%_dwMo+xAw zd#`jq_H88VlbCdUxNId_9a>GggaYX>#iB=F@(Dh_ktZ1QQc6qTqfuWo=1k)jcHg)$ zWt1b!A6I_`w6)j;%yAX$DtLUWi-rdV;3{=%PB3Ka2C|YT&!=`H$h_WWL+3b zB)e7YTryniVlG-RPxzTI&H_Ww%Fzl+2X2(Pg^Lq{CKd6yCSGRDD~;Pae3r?dN; zQDNWoGo)*fOs7^OuBHHcVGDJc7v;M-qYWGXlW{{QECMtHlXp&GU&ib*O#B*3V~?pU zY3#c?r>r<&IDws#DZO1jfollj2@ITaYER&`#=tILr+KxR_;r*Pc2gC2!ex$NY zPSH-@AuUrXx-E-{Q+onuQDB|I((jXfy}naC6jrCC;&&?Y|A)eTt>CSvpt`}9NF2t; z`wssQ!${MGC(zD=+k3aaf*+ORL^C8+Yuno8n<2W}(xMg?!Uj`sXu=TqAy#R_C`L z#RC|G&80nneH3Wn^r|OGTPO|S`~feWu;Hh0;r;4o>cog?vqv(7Q`d-wFziZ~Rwr&X z2KHLO9q{Nl7w)sJg=_paN=v&bnzW4YrLW_Zxx2)pb+0t{)mh?=lgwQ!nV5p>Te%*w zvD*z>fCEIBu_;1G&%UG1n~3GUEaI|@6y|PPOa4x})r#c~3aBrAb3A9>Y23o<%i0={ zKT)#C`^AZ(;K2+p+}oBdck9+_!Cf@a9K3}w@20g_wnIJn+|t%RATb!cfhU2G-9$J%9Lt%dcnDrM61$`P?g$+-FM zielX8-dK(sgL-@`uAXGfztdXGx)zc@Q6gSPiSCaQE?iff#kzNr6BInOD}{~qUB9u9 zF`qPU=JoCUTU}M@wd7d-swO-P5PttVT&Q|mQHQ#Rk{lX#{6A|L^C`m?HVeAem`x(; z27T+#B%|QRT(P-#3JFc`Y$JjT*FE{=`A$GadF@^JAea190tP`7p~m* z7c39N1q0hydRh7XLxw8b#H$tBGn7uzxKuXW=XunaHJ>$ZX7y!0QANlr>c?q4UcKA?1bQGxiEZcu$f^N22MU!XcjeQgj)E z!trVqa8a3~M*?r`V{F-2so?UVX7ZOl< zQ#MF+0tp@0L<_U?g2dJ+x-b((Xa&bRx5O!sAdP4HB4rT1rSB#%=D%nyYUL%1TbsAo zERy|lN)qUr&ET1oJWDoCCnGYW!VJ?<8H84dFBx}XN5?Ayqd&VBg!ePdL?-q!rL6<4 z=b1S1kl%RTjIudKv^F^yoTy;`kjA!wXJid)vuK6&3I!geRbpfCK0jtS6MvP`&I`}l zrvkYMobJyQk~JTUfIQNjmPP>EU367chLLGyH`f^1f!7vh$}r|@v?lk9Fv|T8IwcZ& zM(UK@|4_xEjI8l&7Olu$r@@94V^Wy-81O<|NA7pX!ukr?$%Rn@}LQ+Dg&@KeU zCo=M%G9#Hl)Y{A_YQ(A)+B=l7;eBSNHe;>92lc-cgq zlR!)==W+fh`*XGs+8NJmAqiGa8V`#N(h!%swXmKT1=(DH)yO_ypA1!W2ToQ<;*&*l7@yQkDrq z3CUbBlxAVXH3W%~-hM8N{-SDVtd)@iGHklnpQn@_ak`CZ!o)tKH1VKjPOx6ct&qIL zNu$Xv$CX&%fI+r*Frx3Ag_HDTP$YXr@&uww?b&i@w388^37s%pt=@ia*rnZKF_i`n z3_6v{mByJahGWbxD6R26H`9iRe@SWLGL=PLDsagt+Y7gncB7e+(p+YHnSaTe0zc)) zovZTrzpTJPa208NB!Dra3hkL_1g*;ocQ%EfR}7ngzN)Hf7Q5DPdqo)wK2?<&#F$?j zH?iU_)tP8z14}PDxvFaL)sQ$2cNg7*&KnA-%M^m<)Mi5QzM9M?#{AZ}sSVGp4X>&S zV?@8xHECm9_(;8l=-zbR(GYX$Fb^5?d*dc{bgBac0*Noa5%rkYYVXAVbUh1M>ocM+ zj!awYd&;B0+Ds9sO8^^wyL?;6b#-Y{BjByVR3o%y$*aUp231eo=ETt*V`-G{gtbs%FP2H4w@7I(O zT?V9gt>keONGBZ4%hFgg{;3&AU@ULk)M-Ua)7UaNtwsK|OnMpmTN(nK#HG=`mW*f^ zl5uGLpneo^JD7L_BKRnLs1=jQnF~>xq6`mP7N@phN;C2P#_b>kv@C%vCHyMBz{i!kL|zdQ5x~N@Fja zY=o)E(ts<9inoJ_!|_&;FryqgnacE$ev9eCh`xFePo)0vZ`a}Y(R_TeCehS+NW6VI4S(3-3o$b>MlB`Hn3C}=Pfg&quIU&EEQgkk1koTD2K?IyMtY|Op1LG`d|w*(n{KQXRT;&I&LkMT?l~%g(i1${k)Fa( z+!(k{K~G}j8tFr{1RqFUOdg}2yDshRIFf>n$7C?$S#uPvN!&MJo)e)UI$?I(NcN%F zr>Mk6jhAKx^5W87dZUd&ZFtNCCWVcUp)_%W!(rS6CIVTeFabi=H4;Z3gZfT^D`ut1 z(!oLo)VyOP`$%F!dSIhAS2#>W~ru{%vAP!}5?hBK#uMmNV%n&Q3F z^Dk#Ef!qoni{m49+pq9%D0QZ4x9Q%i;*F6VsK#vA9SO4-@ey4V0kS)u$Wc>uXES0r z6-by{>k&(!z}jGYB!v2fqH1%Py!b>)ODD)8X}P-pTt<`#Fx=dd;r5@j1SvP{S1C%*c+hvubjDoTxQPp!f5`XINRM65)b14@jaw^}rZpd4 zHf=78LrOGpx?Oe)JamN=j=;wkGbKe{S0i~MCO@FC!f#sT%ut}LU|~YWNGz_llt~n^ zs*o%W6-#?vW+_-Uyf9O~8o_|PRt3bXz2DX_T;$w`p0KrA$V@Bj*y z2k-rfDJM$@ao-l!NgyFgCm}0V|LlD0T zrDaf23X~NT6om6f;g?xVm@+pwtfgIJwPY0sbZ)<^*2lzs`{xOo4Zp%82k7qTQRRLsgeS=a>zl zU^%6b|0HyJ4-LtqgPv) zTXF|BRfKhZ%uq@PZXCOf>7Yy-q9){JwrTZ57zKnxlR|ViK8cxN6-v<-R-0B^gj1kM zyeGtKWBU$9N^bz(*%Xxxd5D_b8DR|NwBV6DWz!l!;4o08rj_7G3Wyc&-^El@CS_M8 z*shh}C<=%T4v(}AY%EIO1j5^FDXd{mHd~m)6(=G~HWP=kSVr}2Pc^_EG^ShC{RwkDTnz|VK=<* z$sjK6ZKON}#D!b_kuT&fRmgS5Y$^rB4SqusKZ)k$F<}dy!Y<9b35g_rXC$)_md~XM zgU(v5KmqpPptJI&mw>1&*IAhrDIi|l{9L{wg5(~BPg-W%j6r}Z3e}v+M`QeFKD*rN z!s+ZjI|WNL3n0o6r(TeC0$fDgs%*NovgxE?kyAnp4XhFjt_ty#xOkCyO!i<+096k` zxAqWpQ$Qigl~{ZskJ(5B^9{vSF3DGDSOvGL$=zD}#Y4e#;Ec^4+85dvyv3=yhS-`B1@fH2}Z4map1X zOVO&c6l+l6Jh=T0S+2;$R2F-*EUrZX@#0N4Wfp@#sV1UTXCl@%1_4JbJj-kXZ)Wvd zObLZaswoJ8W}3^?M-(g)azKK>=GTJ5bj|Jj39441)vINC9SWWe=l$~mh$`GVv#>4& z#Ex6vkfH){wnxUkGhCTHuAjGRvs~H=KV2g>dp z6f76SYXeqk-0v;pl@*c=67!|=!=^J7TT!swaFY{5J_@~;@4O(Qs-*g1opoTe7P$meqnchOmlr$>vnIf-VR03knEvZHmvk5hYp4H9`iY zZUtRhM{a87LRD0B>OAYK!!E)mLk*svXCj(M7v@R8|7X`!x*H7~Jh?_*S((?;& z+oj5;E~&0J1W$FNfLG7JbpB4ioTrO5T6fRNXH@d5I+IbW-)Mx@Q9mF>P1Ebvp3 zXS^`nAx>U7n4DW(Ik)!0*UuQsX2C1sW!WYmDz|mkV}A;W6+cdpL0kZ$vRP*>I!S3a zu}mEKk0rk>8#1DMrr_+Y}>GT3RP7jDxq>{Ec&Sw+eq$Dwq)22#pKaeH=uN(t^gi;nYAkw;!g~SJ*ZL&E9Ni}D!I$N19F#53#9T`JtWghtQZ1RirBP2C{r~z zpz;dw|HPnv=ie;bsCz{0nwKt%$2}|FZ5tIyS zS^-QwnKR3~%Tyf=sKhKBF{YeQ$*aCwp-MBPf`l1S)etIqL#^H-_tnLK%7LC$V#QP; zLM5x1o4aJHFAS+5K_wKS%F43aWW$sFcehOXr4gx;xPnqG%DzxcO}5zFB#EKj4XEK> zA!dl6eIF3Z9Qw0vvP9g|fLKlOK<%xHwAo}slAW0$Q};HaMt@qBU1gIkNA{N=WvV^~ zRBl9)EzoFNKBwdj>8@W&8g73h(*H?dK#_K7%oV{RlO<`yu@nhnfB}RjKgr-TN&PAI zAp6TnnRbu?ts4K2+B#Hj$rd0x?+=-Jun{$a0R6J)twT9aY&KcAhM$v3hZam~w;_nR zPD0;1RhG%t4;yn{CLL}-3YH;w=OAbrHBVxjLF|`o>#$9(%akJxDAfpOl;cvxQZ{nf zfEzOPXd`MRLK*dT=Tpl^MMs4?!+;vzZlt(kbg;C_Y1xorTi=!Y9&1ERLX8JVN1{!x zGsFIKU#1#wK;=zjHpSF<`9{uvT4B1O06o5bhZJN6+x(DEc&IiB<^8wotG8b>4ViJ(&u8t zmT)I90rhIghNHJN*bLH57~BfAj)50abeB>+S4^%U?W8556v&LvGG#^!gB zC(Uw~}M6BIG;db!k*KC!xpG3G-^D8FN zD(S$XPy~gYsWjHkw7Aq*$;vG$ZFlHxoJ^t1&kd3&AmKI&z3u=*JKl;NsWjHIAXtTm z(!8WG$fm>s;;t`>(!wE<`=8b-BlKZf5`dD`JkKR;pjrBN{TX^ zimJC^#heI0(j|C?LYul^L_yx=9tB4`tuSd+ko%aUG|{eL_W{|xmV zA^A_tVJ9Qeu1(~6lFC(;FmADoqYKrEl12hqR>?%hs-oaD7&~NT6+*Q-DOyFJc@-^@ zL3&h*wBmO=u~Xzebcs?iQe#+yeM%FpS~H8&sU=~Z?95J68fxbqD`F{GKk{Lq&-ICu z$JbS5urAjoUTOkaBWvW&oZ3+(NKGJcY>72!V#!hUp5?H@6AeY?4-=T)}uU_f?_vS z663D{MS4226aX-s0^r0O`mx;@GH=qi_Rt+kA$6NPBw*W(x;_SWcww1kU`*pfoCn!&itJb9lGJna(hrQkVDO(Zlx zAsjJA@Z!fmurt-kXqV?0h0<IO+wX{uqAQv#ca9=SPxzeRAuzxZ<@pC zcShJbE}WvegdWmI0tjuF`fv4l3|#8w_@@^#an6ezo?0)avR6^0{M z$(JB9AnmDrfr8>Rl@qf&2CinM+8ZEBx=5W%6ac*MCpqQ>cDn4Q&7VN7F{RaoW7o1$ zu?Iq`mBQ;3QV*W7PJZeyi1em0DLn0-$YR@xya!TU4A3nKsSS7BAa6Kevo7T44u#YK zYL#Sw6wPMc%D&UZ`P`=fxJ(uTfB+x@jrkr9yM}Y%oP(s5Fmw;`p=eeYJ{-kvW>-iz zNvjV1AqCxIg1QJWydd8P!_zAKr^Wz~$^#!L`GQZutG2LGRWHIJ?M4121;J*riU=s} zM=k(IZDXYxMFqjUqrf;!E|SxNGcfy+!f0KR3bWS8&T>N-RwWT2XoqYe!3cB!eiQ%? z=nSY)UlY~b#fIR$JK0v^IN%bZ20+1Y8a3u`4Ct`n=DXR^>SVN}g(;*qQ!Q~Uxb7Z# zVL|3~ofo4ZIB@n})xNRnf~`U*q%KpP57K>_?w1b;(0C3dDnkz#MgjDK0ZGz*Q1&lS z+|PB8l?t+x1=8M;qK#qTw%$_88UmO#B3tVc1myz#;cuE%GE-3PIP(y@NQ5Ii)^46S z3aJwhIL!X4F0hs~kwOYboS0@b{V3Z@1<-2JWD0=SR6_)4a-3~$2vE@&0IuQnNO^oQ zsR+&P$4B6x6Rh-A0pNo!pQthg%8uupWUq;%fZd{orRhQJ6c8uQKE)1GrlRvBIVq%W z)8{DhIFpFSo@UpI2q3F!U>p3V5r?uAEHCIGNZLX{e}Z!(?EvS8GtcH<$#sEtDaKH6 zCAW$BUjSuS=cRqG@KONmrWz#0%8j$n=bII}#Hy+k1Sj132m*R^kxj(IF0y^pRZ?ti zs}8UZ1<;LhM}dk=IK>pfy)Vhz5V#G=ZX}2Y-eYu;cJ(Q6UQ;7T{3?x#_u&Ij&}crG zAP3?_SJ);B$8>l#jqyBS(2I#=RdU&S3V_aCSepW1hvg@qBmjVDeD4}7)ujPVr9){% zL2(irdmMzA_PoL7$>+K*ckELNfExUh2|K6+DimsxcV$d(i=FD`zI zm1?BIJakE7?TtwxS;mXvr}Je|`af`21uMOx$W*f4N|Yx2rrBK`DS&o}dIrEaG^iJB zuQA2oOz1xYX1HcLpM-v_!$qL0^50UCeL8DXc&F{7E2R&o$wrdWQib4Mg>aucY>YT& z&}q7Kv@a9T>8gkHqL7l~j?~M?rS9k7W%LnuNWQ?3;cG8+Lnx#k(`RBSc$D)LicVg7%&rz02$~(Xm%Pb!sb#~B0U_Xc z|9|ak~3P#X8Zaj zJ4FNmGufkrIseaZnq4rF0t^D803!g7LFsQ;9*=#UuWfX115=FQ;DwxZDur+ZXLShQQxF_@BG0K#FjN49E*huaq>X|K5mVuEuo-z zOl}n=8u#(%>WESdk>9H4Sr3?L34!flmfOWswi1h(-?@)M>M&Im6Zbwn z$cG_ED3o^i{2Opcq(^ab4qrkTS5EqeUrKVDrDNEp`#9=WN*69u1+@!&K9rN*`hfR3 z6ih+!z)865ITMSkhI6$Qanq#%?lDGiS@5O^PRb%9oojCr`zWL~cpie}KMQIa%@xD# zqhzUt%mS-&{m}#NqyRebk!ViJbRlEW>gWR$QWuOxtZTh5mP^1Nn>pphPKgW6U-(}s zFdkEVDF+c?Bx8$Iu-3XJ4jUu5Ex2zyH(Oi^n1jw|d6YtGg9kB~Lw!^{3DQJ=pF|`s znM*~TQ<)Oz_j>R};e-Tmx5K|GwcK^^Cn)d^ct#+3jA+RTz7PsehTG&)KfX9_lgu?$ z$E(#DITSz_Z2bQP#L=bYlYq=!i}eQu%VX+Huu9=IWw>9&(SYi(sTpiK2kcp6EXYQ$ zCt@MMipP)2aZ-|!lK^VYhCeAVHd8Y&*`&JF^U8Azl$S)u`FhI7PfH8+nG)0!13E0z;nlAq-hc=|tllT--Lhd`1!|t$XMW12$C%s%@oa*5eZ@5jD6Z(XL z)eis_U!^|N^d$w57;hwNRRlx; z7>vLND~G*w_JEGcYyo8fgKBUWW6d8xf{SAeZcl26Sy`N#$Bq3Cne3D!xn zP#cT???Fv&hk~nBFB}EeZtAGP{iQY+gKO00GQ_!DNr@NFKQUe#GX%adc`A~R zLEqQqB5|cUoMcUd4C!3A?vi~bZik^?)Oxs%l+!|N! z^0iPl{H8gy zVkppFus{9>+7Hk8gpjOv@kMdVW?Zl$ zk2-e6QeeoldEWs{GXA+aC%qTJrA+6RO`ssSasQV2){UI`kiWmJ6jHCL8%cIypX66d3ZVKwvPy zbWoQ`Ylc^&AUMJ4Bi6#67w8v^PEKI_uzy!BRKy~@)gD~+jImr+-0TZZiq9b;r`lCI zw{imth#fQCWE+q4uT|o;D5Or@=POPMUL@r@?O;z4)mymfMP#^^)yVn1_zE1%(v8R*gFK<>Jw!K3o8* z+=qK9ZxWr)x)lY*i97Vo_eSVQ+fYbJNFtNY#jifvk5hz5=k0Ds0r29y{&L^2{yNh1 z|A{+*OdPKip6&I5`HmhA;>6FlfFDffb{$|$2_aGz^mq^`m~RJj(P+p3xGC2B9yWRI z5cu>_&9Aw_+xJdQ%@K#xX(+C4LZlfQJXkIw#vLhi&sE-8N!QmowwlPRPw zRB<#Xez2jSKY!oaTVSMbkV}u6jHB{XOBcHzU59!E3S{!-D*q?e)uGa_YFr7>Klko zOyk}tqu06_wo^c?=>2r=iA<>r+1){*v=Pd1RCOkI#)y0$h1`zv=5VEP&sm(GEG7Cl z*!>iGheUsPHYWxC1MhWlvVjJsL6amq~++FRXi3Wn2^AOxpJp@nID5%kwW?z+4ddVd}T#AQkZkZ9CwF;@gdF6RC=0=Y{8 zf#Q1NNIqGjn3(zq&qow`I9W(|Wf+>hRN8953SE5WV+w#5iX(^s*_oX9L0s4?I)Ep} z0OSE>nXKXp>iZdmRQvz}8GQUo_)co!6`Yu7SrE!|3W^QtCW7uRM@i)sG>q326o;}BS69JK&sxQaAAN@%(={vysat zeZbz*^--MChYe+Jfj4CUf~;>0kd?P_;K3vRxAZ1%wGm_x1rluG&FXunel#U0qz;JA zf*Hr6X+ADj>05gnDoFuwVwg^na_Hzh#NiZD7vV%an%Rqok2!3UgphDk+kFHD!;Rrn z0Ll}Po-~p|>H$w4Og#nf*{(Vh^$7741TWgcK^qQ$-7cE(GY-M^PWjs*g;m-$GJ%K=$I6802)UZr`wo37Rs)4MdY(=5; zpniWy=P#^}&NJJZLg_VyiR*I)4#;_@x&34x7KHJcAqM$0w}_E&7BE(x;l$b*1z~(n z!LUjg)^mX2J1a#J63%NidK(Ic4Xr)Li8YG~qHIf{w8OV1)N7)y&rTFd2i$rg4mt{5 zKF|F_m}E5p<&f5NjABsblffOKRAZ zRp(m%ih@8YF%tw-=?WNe|6P_mgJdGwW2QR=#S7m}6H!K91%+JeDkpwQq#%?Y#whUN zH~6AE8Oy|6?x}pL=!Vgo0${}(u5nV99*B{Sv=4>Uh96w#q(aSvRQp2HmqH3U?mFDe z7R5q}M(3N{eMOYC7++H`piqPuQ!dOt6@dERf-A}TzZKUugq3UFIfhb@TpuF6zr~5w z3*dI70~uiqf|lHcbEDor+$DJxbYbBmjfvsKAoDJSmi7CW6RXXTzO}M6%9tGOzXyHi z+#$EJJDm6pURV$v!f0azo1F|m_HgSd$51HYE%Gj$c7NSdom0Aw$5F`LV0c16JPLjV zhG)(Lm_q0S$vV@e40jwO-e5oqHhxJr(A#EIpdU@Ph# z38qs}tO`o*V?bH=n7b)Uf(~U41;vJbc_KN;;Y`uJ7tEzl!iVL^*_QZ}i(K%O`-5~| z5X5{6gu|3VAab8^DeA2iypV5TRXRPBxB{!98`TdKNGIz1TsbP>1w^wemr*EPP!eY& z4_~9Z^aA={^Fo>uyv6ClyH`?B+$j4c_g-2FeRTIa3Z(}Xe*@dmiTF(tU+%@E}rfo8vjdAEP7obmb~=j{{_E9&u1x?RE3tu88f7lqOWo{q#g z;QPt?-1mpWap7J1}2RTRqaf07j3{cKxzzrnYQL`6- zjTg=HL8x3l65H3@^GCV2nDa^dSno3!q9R^)dy8qz(}j3@B1i3UF12kV`?Zp?yVo zCHg@}d5uD8Hzks&+b~qUC`d?=qP*;1*9YBRr=XBqu82~#7%x8+=mGww0FbX3ivXSf z8<9co%#MpHhc!x%i{?LHsj$7uvPf*?nUO$e=AlVq+6ftq|CT zYzQy=y7d9E4=5;B83i{f!7FdsdW8Qd2sVg5fC$)F)FBjZd}~Vb;uA1Pmd>;JoPuIk zP?m%N%EM4zd{6?m>QLTOP#ma#1YZVQ!gz9*C?7h*?eJla@=|=Mr2*8}{5_fvz~4sa?{i&{X<-VM2h;@wnI@yAH$cNT z8Vx>T&diJE11yQo30H&yMKq5HwJ;V046gFQXh~u4qKu5?ugQn54zHLop4)=v#POnK z*$GBs*IXBhQz)&bN^o}>JgD2iL1|y~AKdTjfy2}Cqf*n{Ry$;9ec9FR{L=Ylx2|q9 zU;xIGo+RR02wE5L}`$<$_djFzhbH%TX`-xXL7BTDJ#ojoH;8V){yH zUcScb0g@>IUI`!^)hf&TqoQSb<@%#@aoUVgAf2WX8Adr=tsJig66@kt?Gyx%X9;0* z3akvv&5Nrx7_NIcmOibnFFd#iYN>fnCH^4-OKBxdFjVkb>g$jB?$B!};6bHE! zkY(9c5u&#zO@J3E*mfnz|J^SiY&yJ(6g-!yqJ#%Au*Fe)Wxg1`Qi)gd0d-haC|KmQ z7DG>~T6o!J)5n`urvP|RE2|`}ut#*!nsq3YUX*5&&SXNVyvJ^f(X-4^xnyf?neO7#fCPb01$~10Xn$h%qZ{XMOQn_ zK!?(lg5p4xJp2_|o9g^l%_x*mjnT^&6LlJ-x9Lb*Q%GH=aAF|utpfG6mQ>*nlI{tH z_Wtl01;Z`HqFky9cmG{grNfS}P>Zqle=uOXNd1r|pfQ zAgiW@TId+c>GS1K({3R357)wJJG&1XiY$HD6zLyeC5kWjif@RH*5fzBG%QLUB*Y4; zeQSA~M(Nvy_txiGm_|Vy(U-&RWDEsKA)g^;Fk1;_HRe-sS|dJ-0q%TIWmu_nqYq2% zNP%@pu$6H}6F!$Lom$xxhNsL~=Y8sGjOehUN-g>F`1q&%e=x#=@bp2Oohf)OQxg)y ziX)oyXJCK@Pg!fwbTI~WS}_bTge*z{>#HAIcM6otltzN?lJKh5d?X9pgRiH^rAXAz z;OfKpzBERJyaT2U?`I$}`tqe;P@p`JcRXe;TNW@RMu)Oay2z3N6jbLcL+}?A9fgl(+7!4)TyStL3oQg6Yc9xKMF9U`K$a9tLmY#L*XPGI}Fw| zc?iFQh;@OTXj2>p8Fym02O_W$WUV>aOXA8FX4uvgxhI=b*ZO5L~a-ka0CU` zX{v*QZ?RE0coM&jAm*Qc`R9Y~3OL*t5uzn)iioK1R6a#qe%x&e-woJV;9BdjM^mtI z(Qo+^hDcf)YLqdO2b-t!R{*Kt`D&5I(vYgn)^#nS4c5c`jdx zXe$S*IS;-RUwIDS)ksO{;KxwlT_QXwV~0l19R12kL;w83MbY7=(E~|EG~S z>T2C}qd>V#ourFdJ0u;nYFancT2};IcS#v-}}m&=6V(JRCwuV6&&kvEZo z=!Vi0P@@lm8lYYvf_i~rXx1veyu{v$tN1lW?A3*AOfc>RN-%%W3$FGPUxaL7yDDSg z#WSi+IE4c1##7hww+%4%9 zQc&F}Z4+M_SKi3q2RxVhU2OP>tukSq)i~7{&jmreoA}~{cP>@V^G{73)N~3I)TQ;o z1rRom`fYTG!ca%0wcn>1LqX1SW2w?!(QW)ivKj@>Q;Rr*g6IaLjFivAP(JS*L4>bN zNCE;e3F>d!7>Ak0h#ni1E9z5(D~reO=Tsnf0FvZZO>zjCP*|$-nq*QC;e;29O<}+DqA$v=)=vMR z&X?}Ne2Fn4(03FIY~l2aa6-Zu;oI5rV%yc)8oH8QODTxz7@@+}J2LA65w(wvi;WTC zu#m?H1;t(gqC?#^kmRY1RyW3#6hybFOMXEoQXHxXUU!WzOy&>fjXZz#`vCeXPs@$5 z;b?-weNeFrL&YxQFD%Gv)dwXkqaeCvM6m`Ks__r_2Xe20uLJx8;3iZUuU+H;?`;bC`q4wOkj7kqtm!;i*zUK<8HD=bh!S9v{DHU-KJcVsBq z6N8&R;{PSOSiK2?wp?d`+`$FiFAnTD2Q&{^cDX%+36}&{zH#G z++edY6dYY*wJHl<^9Bx~dhlwc4oUq4fxcYTCJG{)9Hjo02j%1`tQ`HG$7JUfxa`^+ z%|>Hv(bxh(Dg_m&{iJ0=?`Fepf@)L_>2Hrl^PSM%mD1lr&?Clgf>FoXyXpo?$D}MG zDLaL8S-+Dol>*mL=W1JTj0lHc9SJeU&u=+MMS)AHL(HNey0`iJk$c|%56NeY1c%;d zYGJH!+`h0Mxl9+ldRoJF3k8;3&q=HShB8<84H31Pc$+aIoO}&X7aJdj|0?Eph%5`R zRX&~6%dS4OU@HZYe4|c8d=n%h7W8VTN8E0V2!>ZZu_zUSqErEBMoGVD+_Z$>bfO3f z8m%r408_BNI4%_Av3$X6u7zSu&Med`%CA4`&O*x$B}B5`Ec`6WuRX(7&B85W{1z5s zt7qYdiGIZrm?ijKZNCLtx~c(-Pu6?8jO7)xm^SEL&fiOxZ?RFucY^Or~Lr z)-O6X^TzhDNiW`oZe7Rs;8$&MZ9dvHycl0H!H#kdC6vmjnfK)M-i*<&p8vNoZ$!^G zqf1ZQJOAqNL9O~v>{aE|*ZnVdPwn*n&8&>~w^yfidVgTgp50IORQ>tl()Br89rf1U zdbTkm@5%j>OnKQO|SJoI$x)SU9CFC1Hu(QNBKPrEN$yJuUSxBnf#|4q+!R~mNeIl!_sV8HE8 zU$#AV$eKEMOIprS)8xMQ9tQTSadl_Qw1+X3)^&N(YGdG+uOr+0cX}AS%KmPAR@Tou z16$9Z{rBc!Qwu+7u;BRE=j^zZEgLjHGGycSN+B(_HQL;-S@M=qjRa@SkDA_Yk~VGV zvYs<1XT(fB@#4hfj+MssxKs4%&KWtIhpqc^P?^-&n&~eBgc-%(uPW}}^YU*yKALf1 zRA|Mv=T3&S7}dSixk?wmtyA09XhD-JgLiw*KHn9PGrabzpM%d`sgcqtebBb%C^@Uo z#BOybUmqA$_C9)Abz_qOCAtN9M{jxd-NbEaH{Jx_JW=OjPMOvz8G$24to-bJHB(Zx zTaRnZtIpXCp?eDV|>9=fal zR`$P-7j4KqvUKS$Cl6grUo;^utHSkBN3F~M$*vXKfAu2kCDV78LvK`il+wu6a>2{> zXvn!~|9$P-LW2IqFwcv-g1?XpL{ zS>1=lv!;0a&V60&MWKY`#rKc6>fa^n2O>4}*=idQK=^X9q=OTKtr@1qqBZ+#cs z|7eS)-HttLH}8+HqDJkk_E+BdgKKfP$ipK!;`k16|PT<>2O4R=&5(z<<{sWk@2y}D7gS7Oe!Uu$GN{It=rnsvRc zHs%y9^L}K??5%y4y#8X)>05E3r^BDzo4I4rm%APwTQRnbC9OtkyMwp(EHu}wP%(4Z z(TL(L(mkj9jNZHbKrX-O+2R}D^2u+{y_k`aYDpN;cXa%YkGjQ1uf==Tbr7a@eB5@g zYxXw}tIlj+<(r8|hg@^``G3B={ngf!+NOTmA?eW1&wl>(Y2Wsvw}nmav1i@9e#7sr zZCbWj=i`h2iwx{JdDS;R*Gf1(xoGchV?$r99GkOw+HK4GO64O0c*o{1i`-bbXG^1x zYJZJBZF{2C_$^m57W?uxtWTR9zaiGt<;k>hjjYzsvM+BMv?}kX{;eCm*iOiOJ zHzYXkul@7!W`0G;Uwu9s_I#cHn%-yLoV)KbN&+^sBFdn6e4)>% z&CE|$|E$wHAD5hZYw+P8X7+vCVc_~4F15{}ucEpI|CzpiYV*92_tHCUJl?%!=E47t zZLDn{98~S;vP*uq9v-iJ;M}S7#6#yVH_Ey-#gP=O%K^pk1PD_^y;j;PWFqT zou3a_9PDpRp7pAI|FnwFzgqKSjc%<+1#KM}>HK5$%Kd+pIr&$SVih+Qq|CB7cwz9PsYFcYU`SG45m2+nd4IeqC+0G-At}gZE)f@aIVcOjx<1bX- z+`r#{ga25%Dlq27rB%`O&Cfg6>hOHZw0;v74n6(v_0PWcFX|dIcH(b$oGsY79Wt&z zYhM0YqN7vMGM)VYZWs7qU8gP4Ez7jIKD1SX;^oGli=Mi7*nplVx9kpPmd7_9v-_Lc z+5axzx_RI7djkeuYDw`x+ww@pg5d@}ChoBuwKyjkkZKT97UC?4GmXWX3F^Hqg~=XdwH61Hve+`kw4 z6{^uAcjNQ%6XuS(biZ4bT?aBV;ttksy=}<2Hk(df&;GZif8NfXPusOfj0WqT4ePQx>3n+Ujq@(w{rjVyf8HF|`ACrpeZFW~x9h$67oP9*3`m}L z=v>{9o*A1yU({pf+bR7HPHiye=gnIj-P_Nfvf`WYvmyU(w6{CFvvktGgD2G~S88Xc zlvS-`cSKC++VV{87X1seAGd5)F>w7iLq>jl>bQTQWoh$n1oTWxWjnrRCp7%ItuJiK z&DMvXUVc0_J1hRzNN8r;e$1aVrk|FL>ZkcgBLukQ&d;b(hUgV~fl3*GF5jE>#M}ldiYkdi&RmsLL;cOCJo`doAW`%fr5vU*?_|w>o4+sn>hY z2UpoM&9(M=m7A@~6yALIUiU@GpZu}wWm$8|C!767S9@A}N&nR`=fBrqZ<& zU)8=_p-s<>Ib~*L2S1*ZUiEF$ZLB$|-DzO`~^j=RY>_d7N`7~cDQ(N$?bA3Psi`c0L0LZdPx7GJKDad_0+M}MgJHQ|X&HW!Pua zm)kof|2MT)rNvL%{dT3_slB0f%kCY+m#=>?busfM#LQN$-~QdPLg$7Lui7?u%&R9g z&-~J8w|vq4gj^__png$)QK;^zgz9Y5EIj^H!i_+-c^2+*Ibla(wq+JdzMXK2ZJmXm z-%hBL%zmDQs|F@sE5f$T!g1k=Ytz{F@?E=Q7QQ(+@!uwFS{6QeAhD`H+a(JZJ(|cd z>=#)$_@i%);AdBs^X9qy@%PA*Vc2E}HottulV+Uv9Wj9kY8FpwE zu5&A;auIfT7W(>8%1(A<7P34}X~~Yx!V@2-Jojfavhe6vDRWqMY!(WBo6?URpM}Q0 zP1%|;k#J;nAh}}CZ{K!Mbi)#3mZt5G*|n)o{mYYI6pmf6>C~o=q9?yw-XnA3hzUK4 z1&q9zR&(&s8?6WLNGj80!RCcovv&J>m5K13zPoV$&Fi-YKH9x><;%-2 z^zXE7ptx4>lDn&4M=Qgo*dpM<^Wwrk^4pXu8WKKYkIrroFW_J3n9#N-9#q_JnKW}0sO zUa4ZU*)JdFy?4E8T_HHi@oeqIdO1B7)V@);=)^kQ@coOv_62gcp6-mFK6Y&9KY|Li zh$?j}v-bIi+bfOCJ=4vU@nys5nd3_ZCYX~B#V&7HB;;C?>tpJ67*gu1lz`q%PX4`o z&&G%qBXA}6vCDs*zf@=FgT!~MQ{SxKzw%wlQs=wG*1mPN(2k>n8-G#MT(@YEK4%YqIc}=oFz5R-LCro&DgBA5RAy?1 zGcd|AGVSwSXhh3jGrik>J=Zq9R&`Iigk4ct&+lz<@7mpH?21-%C*)a2B{=;TWb@-0O=vbNS z!`WWPi`u=^w#gTNk<1cM_*d@ ze*q2(@$~^?KEa`a`aO|C+RQyXK0ivpl8DGezLu~nH3u2hdss9t)!nlG*3{cb1nE9u z5UTayWH_9JzaZoz3HLBZ)PGaM$sfo4C{xX^8%vw$v?}dvR*_y%P}?iu_X}_Eh^|yaep50pIaWpCjTRSrX&NLe9WmH%n{wI3ZqoXCU) zN`5Fd%ashk*X`={M-RZjHvkV-i1>IxLXzf0btewsmqeY60U`JxnH{Dwj}aV7&T=(v zn(J~A3m1l^iRt**hJOo;@mt|S^Al)@pg3WSf(B7prl{W9moE;&Nc{?{db9coih4kQ z+>UQ-&H`;!C>X-p6>uRa;UGM9U#@qRhZqkF$i0vi6m%@^+pc|EQ)laDZu?^J#t(ls zJ!*HVe|RbUVlbfV#T~uOk+l6Gq^gr zw%!q{2C05`X19b?F+h!bOvk-7tTHHxMY4z`ydyOSmv;VjH7_?!#Pc1~plV4~$auTb z)?`DhwlM4S)6=7IKPsYXgjBCcXh&#PNYlT@x}L}TeaAGYS`two$yh;LB9fjOPE!p( z;aH{`eh13Q%zuhu!tVPu4(ZhcdUbGoVnwPB$G~+@DB$U>S7AY+`ax3N6A2Qt+Cih2f)X<)(#p&Wfz)n04u8nQv0!+JeBAf8BNDpY^J!w9 z#B`MZl|I4<%tB&xQ*EN{gXI}8rx(6~z{FJqN+HhRun66sc`yM;X@@4NZxgzl(5&uH zXXmHphw2>bzxI*dujLzP2P-CI$Dv$vf!n_C{4!CeGKnNj6h53E%FPNH8o+D0d5VS$ z%QVnhvVX0B5c0MsS!;z~5{XJh36N}OO>N|bW|ef>63hG5L%Hc0Xm%dZ%kkk70M_PW ziKU)sFye7+uB1Bp^u8Y@p$vjwikAnH^D=<`nHJ?!wQXYcqUUP*xI=@G+S=2F;E==P{vIEw zbWH_M6(f{)h2{+}bf>a-D3=jbienJDPY@>42VF`6gHUyPB01aoFt6G*`%?<-Zw$>N z7Jq{yfMDI`5cq*6^aIVS#Au8m26!Sin(=}anP+PHz2%?vyxGSFWS*<(lMc;-sX^#1 zjI_3P(tnVpU`bA3A|M(y1)*6XUnjEVb`im}HO=tJ^|8^A3`toPPBtc>f>WoT%S7N) zxeKNA10i(svTRPnuU;PN<~i14d9J2UJAX7J?V&2PM{lZoC+=+E^yWi9CIKkIiE)@2 zg$J2gW@iuazmHy6g+qJKs@hcF z%F*-v^V>))|4#AE{Kc#WSMRS(&gJy20B5;1nv7W>7H1#o1ss(N@P`J}v%zUvr{CJsYfT189B;3d}z)oaVU{J3;R-4##%&;`^ z$rFfx*46-W!ovXR)9FP&7{n+^%_q#spp}^AM0x|y5B0i!epcZmcCV*>Kz}c<4wpFG zF;Hc;u)2Z>>f=m<@9INh{Gv(^C=$je#7}~=Y6zWcx6Ll1G0oAR*O#-g(U;_JC0WOg z0#S8edVX$h$(e7;t5G%l7q#tZsB=tB-n1maD7Sk+1;YrjUn&;zKv1*I?PK*CgP?g9 zfu{%#myJT&(btaLO{$yQ-hV)#urQIHsmNAjRv^%T_N#KUjOfJjG<6#&g2NfKzZr&6 zm@wR)B}`1c!ALjlM9wgwnF>3xS-zqz?fW7+urw@9d_H#LN-Usr7nMJ$Zyks$5%gmT zNLU4pWWz0k$gKFL-R-q{sv^0^ur%?-6GVn+Mhj~DA0onV^2=%O_d^e7 zewvr_?~z%u=NecYTF(SLFzN3*Al2%5V3QOuN-5@PUotb-AUVsK^qbr7@d#mgCiw&k zhlXgRFH3q@!ll#e&wr^b#34;ups6pN%)Csb_d24&$OS~H?$6Y02a>Z)Qop@x^buObCLPn@Ye^j9B7gNBMpzi&%`OwZhE#<3 zwE={enFR`(eeYi$%KL5fQds8!3r;NuM#tG_h#jR%)H>K_uiwqptDw6-QLQT zzd(7D!*iQZ7v_kk4uYW>MdmBYjB|Id(VH)ZWzcwnz|hsdb+A3_zrUwyO3X#_Si`hR zR%8|$;I};bd)@=+?(ccPG&okR<8E-&Y?t=`OgcEZcTl%^Fl#SWq;ec3oTi3KE=vBt z{H(Ie^poZ0N4beMl#Xlqu?|hb)umCmyQDfY;4t2NO_V282$H_Lgt}4{vfqCD2apAF z0000000031hpe~P2P&Bc0*S1bp~fH>0*b7+j1DR<3j&O+hrJmphrJmqhrJmrhrJms zhrJmthrJmuhrJmvhrJmwhrJmxhrJmyhrJmzhrJm!hrJm#hrJm$hrJm%hrJm&hrJm( jx4juV;T{5wtcRdDJBOe+Jhz}YJwliQkgT`l&^;vrrJr6m diff --git a/src/etools_datamart/apps/multitenant/postgresql/tenant.sql b/src/etools_datamart/apps/multitenant/postgresql/tenant.sql index c3d2758b1..94e1b94c0 100644 --- a/src/etools_datamart/apps/multitenant/postgresql/tenant.sql +++ b/src/etools_datamart/apps/multitenant/postgresql/tenant.sql @@ -263,7 +263,8 @@ CREATE TABLE [[schema]].attachments_attachmentflat ( filename character varying(1024) NOT NULL, agreement_reference_number character varying(100) NOT NULL, object_link character varying(200) NOT NULL, - source character varying(150) NOT NULL + source character varying(150) NOT NULL, + pd_ssfa integer ); @@ -1529,7 +1530,8 @@ CREATE TABLE [[schema]].partners_assessment ( partner_id integer NOT NULL, requesting_officer_id integer, created timestamp with time zone NOT NULL, - modified timestamp with time zone NOT NULL + modified timestamp with time zone NOT NULL, + active boolean NOT NULL ); @@ -1901,7 +1903,8 @@ CREATE TABLE [[schema]].partners_interventionattachment ( intervention_id integer NOT NULL, type_id integer NOT NULL, created timestamp with time zone NOT NULL, - modified timestamp with time zone NOT NULL + modified timestamp with time zone NOT NULL, + active boolean NOT NULL ); @@ -2096,68 +2099,6 @@ CREATE SEQUENCE [[schema]].partners_interventionresultlink_ram_indicators_id_seq ALTER SEQUENCE [[schema]].partners_interventionresultlink_ram_indicators_id_seq OWNED BY [[schema]].partners_interventionresultlink_ram_indicators.id; --- --- Name: partners_interventionsectorlocationlink; Type: TABLE; Schema: [[schema]]; Owner: - --- - -CREATE TABLE [[schema]].partners_interventionsectorlocationlink ( - id integer NOT NULL, - intervention_id integer NOT NULL, - sector_id integer NOT NULL, - created timestamp with time zone NOT NULL, - modified timestamp with time zone NOT NULL -); - - --- --- Name: partners_interventionsectorlocationlink_id_seq; Type: SEQUENCE; Schema: [[schema]]; Owner: - --- - -CREATE SEQUENCE [[schema]].partners_interventionsectorlocationlink_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: partners_interventionsectorlocationlink_id_seq; Type: SEQUENCE OWNED BY; Schema: [[schema]]; Owner: - --- - -ALTER SEQUENCE [[schema]].partners_interventionsectorlocationlink_id_seq OWNED BY [[schema]].partners_interventionsectorlocationlink.id; - - --- --- Name: partners_interventionsectorlocationlink_locations; Type: TABLE; Schema: [[schema]]; Owner: - --- - -CREATE TABLE [[schema]].partners_interventionsectorlocationlink_locations ( - id integer NOT NULL, - interventionsectorlocationlink_id integer NOT NULL, - location_id integer NOT NULL -); - - --- --- Name: partners_interventionsectorlocationlink_locations_id_seq; Type: SEQUENCE; Schema: [[schema]]; Owner: - --- - -CREATE SEQUENCE [[schema]].partners_interventionsectorlocationlink_locations_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: partners_interventionsectorlocationlink_locations_id_seq; Type: SEQUENCE OWNED BY; Schema: [[schema]]; Owner: - --- - -ALTER SEQUENCE [[schema]].partners_interventionsectorlocationlink_locations_id_seq OWNED BY [[schema]].partners_interventionsectorlocationlink_locations.id; - - -- -- Name: partners_partnerorganization; Type: TABLE; Schema: [[schema]]; Owner: - -- @@ -3176,76 +3117,6 @@ CREATE SEQUENCE [[schema]].t2f_expense_id_seq ALTER SEQUENCE [[schema]].t2f_expense_id_seq OWNED BY [[schema]].t2f_expense.id; --- --- Name: t2f_invoice; Type: TABLE; Schema: [[schema]]; Owner: - --- - -CREATE TABLE [[schema]].t2f_invoice ( - id integer NOT NULL, - reference_number character varying(32) NOT NULL, - business_area character varying(32) NOT NULL, - vendor_number character varying(32) NOT NULL, - amount numeric(20,4) NOT NULL, - status character varying(16) NOT NULL, - vision_fi_id character varying(16) NOT NULL, - currency_id integer NOT NULL, - travel_id integer NOT NULL, - messages text[] NOT NULL -); - - --- --- Name: t2f_invoice_id_seq; Type: SEQUENCE; Schema: [[schema]]; Owner: - --- - -CREATE SEQUENCE [[schema]].t2f_invoice_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: t2f_invoice_id_seq; Type: SEQUENCE OWNED BY; Schema: [[schema]]; Owner: - --- - -ALTER SEQUENCE [[schema]].t2f_invoice_id_seq OWNED BY [[schema]].t2f_invoice.id; - - --- --- Name: t2f_invoiceitem; Type: TABLE; Schema: [[schema]]; Owner: - --- - -CREATE TABLE [[schema]].t2f_invoiceitem ( - id integer NOT NULL, - amount numeric(20,10) NOT NULL, - fund_id integer, - grant_id integer, - invoice_id integer NOT NULL, - wbs_id integer -); - - --- --- Name: t2f_invoiceitem_id_seq; Type: SEQUENCE; Schema: [[schema]]; Owner: - --- - -CREATE SEQUENCE [[schema]].t2f_invoiceitem_id_seq - START WITH 1 - INCREMENT BY 1 - NO MINVALUE - NO MAXVALUE - CACHE 1; - - --- --- Name: t2f_invoiceitem_id_seq; Type: SEQUENCE OWNED BY; Schema: [[schema]]; Owner: - --- - -ALTER SEQUENCE [[schema]].t2f_invoiceitem_id_seq OWNED BY [[schema]].t2f_invoiceitem.id; - - -- -- Name: t2f_itineraryitem_airlines; Type: TABLE; Schema: [[schema]]; Owner: - -- @@ -4250,20 +4121,6 @@ ALTER TABLE ONLY [[schema]].partners_interventionresultlink ALTER COLUMN id SET ALTER TABLE ONLY [[schema]].partners_interventionresultlink_ram_indicators ALTER COLUMN id SET DEFAULT nextval('[[schema]].partners_interventionresultlink_ram_indicators_id_seq'::regclass); --- --- Name: partners_interventionsectorlocationlink id; Type: DEFAULT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink ALTER COLUMN id SET DEFAULT nextval('[[schema]].partners_interventionsectorlocationlink_id_seq'::regclass); - - --- --- Name: partners_interventionsectorlocationlink_locations id; Type: DEFAULT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink_locations ALTER COLUMN id SET DEFAULT nextval('[[schema]].partners_interventionsectorlocationlink_locations_id_seq'::regclass); - - -- -- Name: partners_partnerorganization id; Type: DEFAULT; Schema: [[schema]]; Owner: - -- @@ -4460,20 +4317,6 @@ ALTER TABLE ONLY [[schema]].t2f_deduction ALTER COLUMN id SET DEFAULT nextval('[ ALTER TABLE ONLY [[schema]].t2f_expense ALTER COLUMN id SET DEFAULT nextval('[[schema]].t2f_expense_id_seq'::regclass); --- --- Name: t2f_invoice id; Type: DEFAULT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoice ALTER COLUMN id SET DEFAULT nextval('[[schema]].t2f_invoice_id_seq'::regclass); - - --- --- Name: t2f_invoiceitem id; Type: DEFAULT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem ALTER COLUMN id SET DEFAULT nextval('[[schema]].t2f_invoiceitem_id_seq'::regclass); - - -- -- Name: t2f_itineraryitem id; Type: DEFAULT; Schema: [[schema]]; Owner: - -- @@ -5213,542 +5056,542 @@ INSERT INTO [[schema]].attachments_attachment VALUES (451, '2018-03-30 16:43:09. -- Data for Name: attachments_attachmentflat; Type: TABLE DATA; Schema: [[schema]]; Owner: - -- -INSERT INTO [[schema]].attachments_attachmentflat VALUES (533, '', '', '', '', '', '/api/v2/attachments/file/533/', 'Susan Govedi', '13 Sep 2018', 533, 'Concern_Umbrella_PCAKCO-Concern-15-04.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (538, '', '', '', '', '', '/api/v2/attachments/file/538/', 'Florian Rabenstein', '13 Sep 2018', 538, 'WVI_Umbrella_PCA_Kir3BaS.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (579, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Signed Agreement', '/api/v2/attachments/file/579/', '', '15 Sep 2018', 579, '', 'KEN/PCA2018208', '/api/v2/agreements/208/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (574, 'CHILDFUND KENYA', 'Civil Society Organization', '2500228337', '', 'Signed Agreement', '/api/v2/attachments/file/574/', '', '14 Sep 2018', 574, '', 'KEN/PCA2013198', '/api/v2/agreements/198/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (487, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/487/', '', '13 Aug 2018', 487, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (488, 'LIFESKILLS PROMOTERS (LISP)', 'Civil Society Organization', '2500233203', '', 'Signed Agreement', '/api/v2/attachments/file/488/', '', '18 Aug 2018', 488, 'Annex_C_PCA_KCO_LISP_EDU_2016_-_024.pdf', 'KEN/PCA2016131', '/api/v2/agreements/131/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (465, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/465/', '', '13 Jun 2018', 465, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (500, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', '', 'Signed Agreement', '/api/v2/attachments/file/500/', '', '29 Aug 2018', 500, 'KCO-WOKIKE-15-004.pdf', 'KEN/PCA2018143', '/api/v2/agreements/143/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (36, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/36/', '', '29 Mar 2018', 36, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (42, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/42/', '', '29 Mar 2018', 42, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (44, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/44/', '', '29 Mar 2018', 44, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (47, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/47/', '', '29 Mar 2018', 47, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (49, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/49/', '', '29 Mar 2018', 49, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (50, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/50/', '', '29 Mar 2018', 50, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (467, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/467/', '', '15 Jun 2018', 467, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (55, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/55/', '', '29 Mar 2018', 55, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (66, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/66/', '', '29 Mar 2018', 66, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (65, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/65/', '', '29 Mar 2018', 65, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (471, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/471/', '', '05 Jul 2018', 471, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (466, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/466/', '', '14 Jun 2018', 466, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (100, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/100/', '', '29 Mar 2018', 100, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (453, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/453/', '', '10 Apr 2018', 453, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (470, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/470/', '', '28 Jun 2018', 470, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (125, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/125/', '', '29 Mar 2018', 125, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (136, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/136/', '', '29 Mar 2018', 136, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (167, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/167/', '', '29 Mar 2018', 167, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (469, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/469/', '', '27 Jun 2018', 469, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (187, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/187/', '', '29 Mar 2018', 187, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (233, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/233/', '', '29 Mar 2018', 233, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (249, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/249/', '', '29 Mar 2018', 249, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (308, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/308/', '', '29 Mar 2018', 308, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (322, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/322/', '', '29 Mar 2018', 322, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (463, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/463/', '', '02 Jun 2018', 463, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (464, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/464/', '', '10 Jun 2018', 464, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (462, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/462/', '', '01 Jun 2018', 462, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (490, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/490/', '', '28 Aug 2018', 490, '', 'KEN/SSFA2018139', '/api/v2/agreements/139/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (501, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', '', 'Signed Agreement', '/api/v2/attachments/file/501/', '', '30 Aug 2018', 501, 'ICL_UNICEF_PCA.docx', 'KEN/PCA2017153', '/api/v2/agreements/153/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (502, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', '', 'Signed Agreement', '/api/v2/attachments/file/502/', '', '30 Aug 2018', 502, 'KCO-ICL-17-035.pdf', 'KEN/PCA2018149', '/api/v2/agreements/149/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (503, 'SAVE THE CHILDREN INTERNATIONAL', 'Civil Society Organization', '2500224418', '', 'Signed Agreement', '/api/v2/attachments/file/503/', '', '30 Aug 2018', 503, 'KCO-SCI-15-013.pdf', 'KEN/PCA2018148', '/api/v2/agreements/148/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (529, 'KENYA PAEDIATRIC RESEARCH CONSORTIUM KPA UNICEF KEPRECON MNCH PROJECT', 'Civil Society Organization', '2500237203', '', 'Signed Agreement', '/api/v2/attachments/file/529/', '', '01 Sep 2018', 529, '', 'KEN/PCA2018164', '/api/v2/agreements/164/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (507, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', 'KEN/PCA2018134/PD201888', 'Signed PD/SSFA', '/api/v2/attachments/file/507/', '', '30 Aug 2018', 507, 'Annex_C_KCO-WVK-15-003_CP-10.pdf', 'KEN/PCA2018134', '/api/v2/interventions/88/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (508, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', 'KEN/PCA2018143/PD201887', 'Signed PD/SSFA', '/api/v2/attachments/file/508/', '', '30 Aug 2018', 508, 'wokike_PD.pdf', 'KEN/PCA2018143', '/api/v2/interventions/87/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (530, 'KENYA PAEDIATRIC RESEARCH CONSORTIUM KPA UNICEF KEPRECON MNCH PROJECT', 'Civil Society Organization', '2500237203', '', 'Signed Agreement', '/api/v2/attachments/file/530/', '', '01 Sep 2018', 530, 'Umbrella_PCA_KCO-KEPRECON-17-043.pdf', 'KEN/PCA2017163', '/api/v2/agreements/163/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (518, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/518/', '', '31 Aug 2018', 518, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (580, '', '', '', '', '', '/api/v2/attachments/file/580/', 'Nelly Kasina', '19 Sep 2018', 580, 'Umbrella_PCA_Oxfam.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (31, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/31/', '', '29 Mar 2018', 31, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (491, 'PLAN INTERNATIONAL', 'Civil Society Organization', '2500212836', '', 'Signed Agreement', '/api/v2/attachments/file/491/', '', '28 Aug 2018', 491, '', 'KEN/SSFA2018138', '/api/v2/agreements/138/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (32, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/32/', '', '29 Mar 2018', 32, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (511, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', '', 'Signed Agreement', '/api/v2/attachments/file/511/', '', '31 Aug 2018', 511, 'Umbrella_PCA_Oxfam.pdf', 'KEN/PCA2018162', '/api/v2/agreements/162/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (512, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', '', 'Signed Agreement', '/api/v2/attachments/file/512/', '', '31 Aug 2018', 512, 'Umbrella_PCA_KCO-FCA-16-032__WASH-02.pdf', 'KEN/PCA2018159', '/api/v2/agreements/159/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (514, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', '', 'Signed Agreement', '/api/v2/attachments/file/514/', '', '31 Aug 2018', 514, 'Umbrella_PCA_KCO-ICS-17-044.pdf', 'KEN/PCA2017156', '/api/v2/agreements/156/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (515, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', '', 'Signed Agreement', '/api/v2/attachments/file/515/', '', '31 Aug 2018', 515, 'Umbrella_PCA_KCO-NRC-16-018_Education_-01.pdf', 'KEN/PCA2016155', '/api/v2/agreements/155/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (506, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', 'KEN/PCA2017153/PD201790', 'Signed PD/SSFA', '/api/v2/attachments/file/506/', '', '30 Aug 2018', 506, 'Annex_C_Dj8t0mw.pdf', 'KEN/PCA2017153', '/api/v2/interventions/90/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (520, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', 'KEN/PCA2018162/PD2018104', 'Signed PD/SSFA', '/api/v2/attachments/file/520/', '', '31 Aug 2018', 520, 'OXFAM_Turkana_PCA_CMaj7gJ.pdf', 'KEN/PCA2018162', '/api/v2/interventions/104/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (45, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/45/', '', '29 Mar 2018', 45, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (521, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', 'KEN/PCA2018159/PD2018100', 'Signed PD/SSFA', '/api/v2/attachments/file/521/', '', '31 Aug 2018', 521, 'FCA_PCA.pdf', 'KEN/PCA2018159', '/api/v2/interventions/100/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (492, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', '', 'Signed Agreement', '/api/v2/attachments/file/492/', '', '28 Aug 2018', 492, 'KCO-LWF-15-002.pdf', 'KEN/PCA2018135', '/api/v2/agreements/135/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (493, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Signed Agreement', '/api/v2/attachments/file/493/', '', '28 Aug 2018', 493, 'KCO-WVK-15-003.pdf', 'KEN/PCA2018134', '/api/v2/agreements/134/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (18, 'UNIVERSITY OF NAIROBI C4DLAB', 'Government', '2500235241', '', 'Signed Agreement', '/api/v2/attachments/file/18/', '', '29 Mar 2018', 18, '', '', '/api/v2/agreements/15/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (22, 'CARE CANADA', 'Civil Society Organization', '2500215869', '', 'Signed Agreement', '/api/v2/attachments/file/22/', '', '29 Mar 2018', 22, '', '', '/api/v2/agreements/11/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (46, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/46/', '', '29 Mar 2018', 46, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (51, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/51/', '', '29 Mar 2018', 51, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (53, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/53/', '', '29 Mar 2018', 53, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (57, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/57/', '', '29 Mar 2018', 57, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (85, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/85/', '', '29 Mar 2018', 85, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (90, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/90/', '', '29 Mar 2018', 90, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (92, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/92/', '', '29 Mar 2018', 92, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (94, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/94/', '', '29 Mar 2018', 94, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (96, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/96/', '', '29 Mar 2018', 96, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (473, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/473/', '', '18 Jul 2018', 473, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (122, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/122/', '', '29 Mar 2018', 122, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (177, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/177/', '', '29 Mar 2018', 177, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (455, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/455/', '', '18 Apr 2018', 455, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (458, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/458/', '', '27 Apr 2018', 458, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (456, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/456/', '', '18 Apr 2018', 456, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (532, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/532/', '', '03 Sep 2018', 532, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (524, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', 'KEN/PCA2017156/PD201795', 'Signed PD/SSFA', '/api/v2/attachments/file/524/', '', '31 Aug 2018', 524, 'Annex_C_KCO-ICS-17-044__HIV_AIDS_01.pdf', 'KEN/PCA2017156', '/api/v2/interventions/95/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (525, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', 'KEN/PCA201714/PD201894', 'Signed PD/SSFA', '/api/v2/attachments/file/525/', '', '31 Aug 2018', 525, 'TDH_Garissa_PCA.pdf', 'KEN/PCA201779', '/api/v2/interventions/94/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (526, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', 'KEN/PCA2016155/PD201892', 'Signed PD/SSFA', '/api/v2/attachments/file/526/', '', '31 Aug 2018', 526, 'NRC_Mandera_PCA.pdf', 'KEN/PCA2016155', '/api/v2/interventions/92/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (527, 'CENTRE FOR REGENERATION AND EMPOWERMENT OF AFRICA THROUGH AFRICA CREATA', 'Civil Society Organization', '2500238996', 'KEN/SSFA2018154', 'Signed PD/SSFA', '/api/v2/attachments/file/527/', '', '31 Aug 2018', 527, 'CREATA_SSFA.pdf', 'KEN/SSFA2018154', '/api/v2/interventions/91/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (517, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/517/', '', '31 Aug 2018', 517, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (481, 'HELPAGE INTERNATIONAL', 'Civil Society Organization', '2500238632', '', 'Signed Agreement', '/api/v2/attachments/file/481/', '', '28 Jul 2018', 481, '', 'KEN/SSFA2018128', '/api/v2/agreements/128/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (58, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/58/', '', '29 Mar 2018', 58, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (59, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/59/', '', '29 Mar 2018', 59, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (60, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/60/', '', '29 Mar 2018', 60, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (534, '', '', '', '', '', '/api/v2/attachments/file/534/', 'Susan Govedi', '13 Sep 2018', 534, 'Concern_Umbrella_PCAKCO-Concern-15-04_H0pj21t.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (594, 'ST PETERS COMMUNITY NETWORK SAPCONE', 'Civil Society Organization', '2500236585', '', 'Signed Agreement', '/api/v2/attachments/file/594/', '', '05 Oct 2018', 594, '', 'KEN/PCA2018224', '/api/v2/agreements/224/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (67, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/67/', '', '29 Mar 2018', 67, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (69, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/69/', '', '29 Mar 2018', 69, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (70, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/70/', '', '29 Mar 2018', 70, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (71, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/71/', '', '29 Mar 2018', 71, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (74, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/74/', '', '29 Mar 2018', 74, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (76, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/76/', '', '29 Mar 2018', 76, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (83, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/83/', '', '29 Mar 2018', 83, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (86, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/86/', '', '29 Mar 2018', 86, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (87, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/87/', '', '29 Mar 2018', 87, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (88, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/88/', '', '29 Mar 2018', 88, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (99, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/99/', '', '29 Mar 2018', 99, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (104, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/104/', '', '29 Mar 2018', 104, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (106, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/106/', '', '29 Mar 2018', 106, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (109, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/109/', '', '29 Mar 2018', 109, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (110, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/110/', '', '29 Mar 2018', 110, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (111, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/111/', '', '29 Mar 2018', 111, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (114, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/114/', '', '29 Mar 2018', 114, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (115, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/115/', '', '29 Mar 2018', 115, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (116, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/116/', '', '29 Mar 2018', 116, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (118, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/118/', '', '29 Mar 2018', 118, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (454, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/454/', '', '12 Apr 2018', 454, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (119, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/119/', '', '29 Mar 2018', 119, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (121, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/121/', '', '29 Mar 2018', 121, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (130, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/130/', '', '29 Mar 2018', 130, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (131, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/131/', '', '29 Mar 2018', 131, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (133, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/133/', '', '29 Mar 2018', 133, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (134, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/134/', '', '29 Mar 2018', 134, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (144, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/144/', '', '29 Mar 2018', 144, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (165, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/165/', '', '29 Mar 2018', 165, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (189, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/189/', '', '29 Mar 2018', 189, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (215, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/215/', '', '29 Mar 2018', 215, 'Annex_E_fWKeHT8.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (499, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', 'KCO/SSFA/UON/2311232/PD201778', 'Signed PD/SSFA', '/api/v2/attachments/file/499/', '', '28 Aug 2018', 499, 'Annex_C_KCO-WVK-16-003_CP-06.pdf', 'KEN/PCA20186', '/api/v2/interventions/78/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (509, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', 'KEN/PCA2018135/PD201879', 'PRC Review', '/api/v2/attachments/file/509/', '', '30 Aug 2018', 509, 'ANNEX_G_KCO-LWF-15-002_CP-03.pdf', 'KEN/PCA2018135', '/api/v2/interventions/79/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (510, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', 'KEN/PCA2018135/PD201879', 'Signed PD/SSFA', '/api/v2/attachments/file/510/', '', '30 Aug 2018', 510, 'Annex_C_KCO-LWF-15-002_CP-03.pdf', 'KEN/PCA2018135', '/api/v2/interventions/79/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (519, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/519/', '', '31 Aug 2018', 519, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (522, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', 'KEN/PCA2018157/PD201896', 'Signed PD/SSFA', '/api/v2/attachments/file/522/', '', '31 Aug 2018', 522, 'GAA_PCA.pdf', 'KEN/PCA2018157', '/api/v2/interventions/96/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (505, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', 'KEN/PCA2017153/PD201790', 'PRC Review', '/api/v2/attachments/file/505/', '', '30 Aug 2018', 505, 'Annex_G_KCO-ICL-17-035__HIVAIDS-01.pdf', 'KEN/PCA2017153', '/api/v2/interventions/90/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (477, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Signed Agreement', '/api/v2/attachments/file/477/', '', '27 Jul 2018', 477, 'LVCT_18_-_22_PCA.pdf', 'KEN/PCA2018127', '/api/v2/agreements/127/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (75, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/75/', '', '29 Mar 2018', 75, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (77, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/77/', '', '29 Mar 2018', 77, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (78, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/78/', '', '29 Mar 2018', 78, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (79, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/79/', '', '29 Mar 2018', 79, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (80, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/80/', '', '29 Mar 2018', 80, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (81, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/81/', '', '29 Mar 2018', 81, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (82, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/82/', '', '29 Mar 2018', 82, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (535, '', '', '', '', '', '/api/v2/attachments/file/535/', 'Susan Govedi', '13 Sep 2018', 535, 'Concern_Umbrella_PCAKCO-Concern-15-04_zJ7bTei.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (103, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/103/', '', '29 Mar 2018', 103, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (112, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/112/', '', '29 Mar 2018', 112, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (135, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/135/', '', '29 Mar 2018', 135, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (137, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/137/', '', '29 Mar 2018', 137, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (142, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/142/', '', '29 Mar 2018', 142, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (154, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/154/', '', '29 Mar 2018', 154, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (155, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/155/', '', '29 Mar 2018', 155, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (160, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/160/', '', '29 Mar 2018', 160, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (161, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/161/', '', '29 Mar 2018', 161, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (164, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/164/', '', '29 Mar 2018', 164, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (168, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/168/', '', '29 Mar 2018', 168, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (169, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/169/', '', '29 Mar 2018', 169, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (170, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/170/', '', '29 Mar 2018', 170, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (174, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/174/', '', '29 Mar 2018', 174, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (180, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/180/', '', '29 Mar 2018', 180, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (181, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/181/', '', '29 Mar 2018', 181, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (183, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/183/', '', '29 Mar 2018', 183, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (184, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/184/', '', '29 Mar 2018', 184, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (185, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/185/', '', '29 Mar 2018', 185, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (186, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/186/', '', '29 Mar 2018', 186, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (191, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/191/', '', '29 Mar 2018', 191, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (211, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/211/', '', '29 Mar 2018', 211, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (214, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/214/', '', '29 Mar 2018', 214, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (228, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/228/', '', '29 Mar 2018', 228, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (231, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/231/', '', '29 Mar 2018', 231, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (232, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/232/', '', '29 Mar 2018', 232, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (40, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/40/', '', '29 Mar 2018', 40, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (126, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/126/', '', '29 Mar 2018', 126, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (127, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/127/', '', '29 Mar 2018', 127, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (129, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/129/', '', '29 Mar 2018', 129, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (139, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/139/', '', '29 Mar 2018', 139, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (148, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/148/', '', '29 Mar 2018', 148, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (151, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/151/', '', '29 Mar 2018', 151, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (153, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/153/', '', '29 Mar 2018', 153, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (158, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/158/', '', '29 Mar 2018', 158, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (162, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/162/', '', '29 Mar 2018', 162, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (163, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/163/', '', '29 Mar 2018', 163, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (173, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/173/', '', '29 Mar 2018', 173, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (203, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/203/', '', '29 Mar 2018', 203, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (204, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/204/', '', '29 Mar 2018', 204, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (205, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/205/', '', '29 Mar 2018', 205, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (207, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/207/', '', '29 Mar 2018', 207, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (208, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/208/', '', '29 Mar 2018', 208, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (209, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/209/', '', '29 Mar 2018', 209, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (212, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/212/', '', '29 Mar 2018', 212, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (213, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/213/', '', '29 Mar 2018', 213, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (218, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/218/', '', '29 Mar 2018', 218, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (220, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/220/', '', '29 Mar 2018', 220, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (229, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/229/', '', '29 Mar 2018', 229, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (227, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/227/', '', '29 Mar 2018', 227, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (230, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/230/', '', '29 Mar 2018', 230, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (234, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/234/', '', '29 Mar 2018', 234, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (540, '', '', '', '', '', '/api/v2/attachments/file/540/', 'Rathigadevi Veluppillai', '13 Sep 2018', 540, '1_FCA_Umbrella_PCA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (610, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/610/', '', '25 Oct 2018', 610, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (239, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/239/', '', '29 Mar 2018', 239, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (250, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/250/', '', '29 Mar 2018', 250, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (459, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/459/', '', '30 Apr 2018', 459, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (277, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/277/', '', '29 Mar 2018', 277, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (278, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/278/', '', '29 Mar 2018', 278, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (279, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/279/', '', '29 Mar 2018', 279, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (281, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/281/', '', '29 Mar 2018', 281, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (283, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/283/', '', '29 Mar 2018', 283, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (284, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/284/', '', '29 Mar 2018', 284, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (43, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/43/', '', '29 Mar 2018', 43, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (176, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/176/', '', '29 Mar 2018', 176, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (194, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/194/', '', '29 Mar 2018', 194, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (196, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/196/', '', '29 Mar 2018', 196, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (197, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/197/', '', '29 Mar 2018', 197, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (200, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/200/', '', '29 Mar 2018', 200, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (202, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/202/', '', '29 Mar 2018', 202, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (219, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/219/', '', '29 Mar 2018', 219, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (223, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/223/', '', '29 Mar 2018', 223, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (222, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/222/', '', '29 Mar 2018', 222, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (248, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/248/', '', '29 Mar 2018', 248, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (252, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/252/', '', '29 Mar 2018', 252, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (254, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/254/', '', '29 Mar 2018', 254, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (256, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/256/', '', '29 Mar 2018', 256, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (257, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/257/', '', '29 Mar 2018', 257, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (258, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/258/', '', '29 Mar 2018', 258, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (260, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/260/', '', '29 Mar 2018', 260, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (261, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/261/', '', '29 Mar 2018', 261, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (262, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/262/', '', '29 Mar 2018', 262, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (264, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/264/', '', '29 Mar 2018', 264, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (267, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/267/', '', '29 Mar 2018', 267, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (268, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/268/', '', '29 Mar 2018', 268, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (274, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/274/', '', '29 Mar 2018', 274, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (275, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/275/', '', '29 Mar 2018', 275, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (282, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/282/', '', '29 Mar 2018', 282, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (286, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/286/', '', '29 Mar 2018', 286, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (287, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/287/', '', '29 Mar 2018', 287, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (291, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/291/', '', '29 Mar 2018', 291, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (295, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/295/', '', '29 Mar 2018', 295, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (317, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/317/', '', '29 Mar 2018', 317, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (326, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/326/', '', '29 Mar 2018', 326, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (328, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/328/', '', '29 Mar 2018', 328, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (329, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/329/', '', '29 Mar 2018', 329, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (330, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/330/', '', '29 Mar 2018', 330, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (333, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/333/', '', '29 Mar 2018', 333, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (358, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Assessment Report', '/api/v2/attachments/file/358/', '', '29 Mar 2018', 358, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (143, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/143/', '', '29 Mar 2018', 143, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (353, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Assessment Report', '/api/v2/attachments/file/353/', '', '29 Mar 2018', 353, '7._UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_TDH_Final_301015.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (348, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Assessment Report', '/api/v2/attachments/file/348/', '', '29 Mar 2018', 348, '2015_Audit_Report.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (611, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/611/', '', '25 Oct 2018', 611, 'EDU-ART_Kes4369913.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (592, '', '', '', '', '', '/api/v2/attachments/file/592/', 'Rommanah Somba', '03 Oct 2018', 592, 'TEFA_PCA_2018.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (618, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/618/', '', '25 Oct 2018', 618, 'Liquidation_-_4610969.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (244, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/244/', '', '29 Mar 2018', 244, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (245, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/245/', '', '29 Mar 2018', 245, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (246, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/246/', '', '29 Mar 2018', 246, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (253, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/253/', '', '29 Mar 2018', 253, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (265, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/265/', '', '29 Mar 2018', 265, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (266, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/266/', '', '29 Mar 2018', 266, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (271, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/271/', '', '29 Mar 2018', 271, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (272, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/272/', '', '29 Mar 2018', 272, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (273, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/273/', '', '29 Mar 2018', 273, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (293, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/293/', '', '29 Mar 2018', 293, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (300, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/300/', '', '29 Mar 2018', 300, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (301, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/301/', '', '29 Mar 2018', 301, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (303, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/303/', '', '29 Mar 2018', 303, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (304, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/304/', '', '29 Mar 2018', 304, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (305, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/305/', '', '29 Mar 2018', 305, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (307, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/307/', '', '29 Mar 2018', 307, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (310, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/310/', '', '29 Mar 2018', 310, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (311, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/311/', '', '29 Mar 2018', 311, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (313, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/313/', '', '29 Mar 2018', 313, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (315, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/315/', '', '29 Mar 2018', 315, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (316, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/316/', '', '29 Mar 2018', 316, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (320, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/320/', '', '29 Mar 2018', 320, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (324, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/324/', '', '29 Mar 2018', 324, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (325, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/325/', '', '29 Mar 2018', 325, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (334, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/334/', '', '29 Mar 2018', 334, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (4, 'BBC MEDIA ACTION', 'Civil Society Organization', '2500234729', '', 'Signed Agreement', '/api/v2/attachments/file/4/', '', '29 Mar 2018', 4, 'PCA-BBC-16-020_NUT_demIBJ8.pdf', 'KEN/PCA201786', '/api/v2/agreements/86/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (341, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Assessment Report', '/api/v2/attachments/file/341/', '', '29 Mar 2018', 341, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (342, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Assessment Report', '/api/v2/attachments/file/342/', '', '29 Mar 2018', 342, 'AMREF_UNICEF_Microasses_MhHoxth.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (343, 'CHILDLINE KENYA', 'Civil Society Organization', '2500223509', '', 'Assessment Report', '/api/v2/attachments/file/343/', '', '29 Mar 2018', 343, 'UNICEF_Micro_Assessment__3Zw0DFk.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (344, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Assessment Report', '/api/v2/attachments/file/344/', '', '29 Mar 2018', 344, 'UNICEF_Micro_Assessment__jLp4s6s.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (345, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Assessment Report', '/api/v2/attachments/file/345/', '', '29 Mar 2018', 345, 'UNICEF_Micro_Assessment__PnZmAKw.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (351, 'SUSTAINABLE AID IN AFRICA', 'Civil Society Organization', '2500219460', '', 'Assessment Report', '/api/v2/attachments/file/351/', '', '29 Mar 2018', 351, 'UNICEF_Micro_Assessment__quOhWUA.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (352, 'KANACHO NOMADIC EDUCATIONAL FOUNDATION', 'Civil Society Organization', '2500235346', '', 'Assessment Report', '/api/v2/attachments/file/352/', '', '29 Mar 2018', 352, 'UNICEF_Micro_Assessment_dUwbBYx.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (354, 'BBC MEDIA ACTION', 'Civil Society Organization', '2500234729', '', 'Assessment Report', '/api/v2/attachments/file/354/', '', '29 Mar 2018', 354, 'UNICEF_Micro-assessment_final_report_-_BBCMA-K.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (355, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Assessment Report', '/api/v2/attachments/file/355/', '', '29 Mar 2018', 355, 'UNICEF_Micro_Assessment_Final_Report_-_Windle_Trust_Kenya.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (357, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Assessment Report', '/api/v2/attachments/file/357/', '', '29 Mar 2018', 357, 'UNICEF_Micro_Assessment_Final_Report_-_Women_Educational_Researchers_of_Kenya.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (359, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Assessment Report', '/api/v2/attachments/file/359/', '', '29 Mar 2018', 359, 'World_Vision_Kenya_UNICEF_Microassessment_report_-_Final.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (105, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/105/', '', '29 Mar 2018', 105, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (346, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', '', 'Assessment Report', '/api/v2/attachments/file/346/', '', '29 Mar 2018', 346, 'UNICEF_Micro_Assessment_Fin_2xzMTuw.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (536, '', '', '', '', '', '/api/v2/attachments/file/536/', 'Susan Govedi', '13 Sep 2018', 536, 'Concern_Umbrella_PCAKCO-Concern-15-04_Nip0Q7D.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (612, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/612/', '', '25 Oct 2018', 612, 'Liquidation_-_3462917.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (623, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'FACE form', '/api/v2/attachments/file/623/', '', '26 Oct 2018', 623, 'FACE_forms.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (619, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'FACE form', '/api/v2/attachments/file/619/', '', '25 Oct 2018', 619, 'FACE_forms.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (360, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', '', 'Agreement Amendment', '/api/v2/attachments/file/360/', '', '29 Mar 2018', 360, 'Umbrella_PCA_KCO-FHK-2015-Nut-005.pdf', '', '/api/v2/partners/1/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (365, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'PRC Review', '/api/v2/attachments/file/365/', '', '29 Mar 2018', 365, 'Annex_G_-_WERK.pdf', 'KEN/PCA201763', '/api/v2/interventions/35/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (366, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Signed PD/SSFA', '/api/v2/attachments/file/366/', '', '29 Mar 2018', 366, 'Annex_C_Education-01.pdf', 'KEN/PCA201763', '/api/v2/interventions/35/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (296, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/296/', '', '29 Mar 2018', 296, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (298, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/298/', '', '29 Mar 2018', 298, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (299, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/299/', '', '29 Mar 2018', 299, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (309, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/309/', '', '29 Mar 2018', 309, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (439, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/439/', '', '30 Mar 2018', 439, 'Annex_C_Education-01.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (440, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/440/', '', '30 Mar 2018', 440, 'Annex_G_-_WERK.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (441, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/441/', '', '30 Mar 2018', 441, 'THE_WERK_REGISTRATION_CERTIFICATE_-_151025.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (347, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Assessment Report', '/api/v2/attachments/file/347/', '', '29 Mar 2018', 347, 'UNICEF_Micro_Assessment_gK7sYIc.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (5, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/5/', '', '29 Mar 2018', 5, 'Umbrella_PCA.pdf', 'KEN/PCA201783', '/api/v2/agreements/83/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (541, '', '', '', '', '', '/api/v2/attachments/file/541/', 'Rathigadevi Veluppillai', '13 Sep 2018', 541, '1_FCA_Umbrella_PCA_SmxCsTU.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (613, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/613/', '', '25 Oct 2018', 613, 'Liquidation_-_6262432.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (598, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/598/', '', '11 Oct 2018', 598, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (620, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/620/', '', '25 Oct 2018', 620, 'Spot_checks.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (624, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/624/', '', '26 Oct 2018', 624, 'KEPI_Kakamega.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (621, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/621/', '', '25 Oct 2018', 621, 'UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_County_director_of_Education_Lodwar-Final.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (145, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/145/', '', '29 Mar 2018', 145, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (193, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/193/', '', '29 Mar 2018', 193, 'Annex_E_KRCS.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (195, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/195/', '', '29 Mar 2018', 195, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (237, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/237/', '', '29 Mar 2018', 237, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (240, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/240/', '', '29 Mar 2018', 240, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (241, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/241/', '', '29 Mar 2018', 241, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (336, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/336/', '', '29 Mar 2018', 336, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (338, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/338/', '', '29 Mar 2018', 338, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (339, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/339/', '', '29 Mar 2018', 339, 'Annex_E_Childline.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (6, 'INTERNATIONAL MEDICAL CORPS, KENYA', 'Civil Society Organization', '2500218799', '', 'Signed Agreement', '/api/v2/attachments/file/6/', '', '29 Mar 2018', 6, 'Umbrella_PCA_KCO-IMC-15-010_39i9UBk.pdf', 'KEN/PCA201782', '/api/v2/agreements/82/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (468, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/468/', '', '22 Jun 2018', 468, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (35, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/35/', '', '29 Mar 2018', 35, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (37, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/37/', '', '29 Mar 2018', 37, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (56, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/56/', '', '29 Mar 2018', 56, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (452, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/452/', '', '10 Apr 2018', 452, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (62, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/62/', '', '29 Mar 2018', 62, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (89, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/89/', '', '29 Mar 2018', 89, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (95, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/95/', '', '29 Mar 2018', 95, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (102, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/102/', '', '29 Mar 2018', 102, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (484, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/484/', '', '04 Aug 2018', 484, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (123, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/123/', '', '29 Mar 2018', 123, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (140, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/140/', '', '29 Mar 2018', 140, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (141, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/141/', '', '29 Mar 2018', 141, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (146, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/146/', '', '29 Mar 2018', 146, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (147, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/147/', '', '29 Mar 2018', 147, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (575, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Signed Agreement', '/api/v2/attachments/file/575/', '', '14 Sep 2018', 575, '', 'KEN/PCA2018190', '/api/v2/agreements/190/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (52, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/52/', '', '29 Mar 2018', 52, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (547, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Signed Agreement', '/api/v2/attachments/file/547/', 'Constance Rose Ngoto', '13 Sep 2018', 547, '', 'KEN/PCA2018187', '/api/v2/agreements/187/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (614, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/614/', '', '25 Oct 2018', 614, 'Liquidation_-_10783394.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (622, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/622/', '', '25 Oct 2018', 622, 'DCT_Report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (625, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/625/', '', '26 Oct 2018', 625, 'UN_Micro_-_Assessment_Final_Report_for_Kakamega_County_Health_Office.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (251, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/251/', '', '29 Mar 2018', 251, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (288, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/288/', '', '29 Mar 2018', 288, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (289, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/289/', '', '29 Mar 2018', 289, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (297, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/297/', '', '29 Mar 2018', 297, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (485, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/485/', '', '04 Aug 2018', 485, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (314, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/314/', '', '29 Mar 2018', 314, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (337, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/337/', '', '29 Mar 2018', 337, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (20, 'AFRICAN DEVELOPMENT AND EMERGENCY ORGANIZATION', 'Civil Society Organization', '2500215865', '', 'Signed Agreement', '/api/v2/attachments/file/20/', '', '29 Mar 2018', 20, '', '', '/api/v2/agreements/13/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (21, 'AFRICAN DEVELOPMENT AND EMERGENCY ORGANIZATION', 'Civil Society Organization', '2500215865', '', 'Signed Agreement', '/api/v2/attachments/file/21/', '', '29 Mar 2018', 21, '', '', '/api/v2/agreements/12/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (27, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Signed Agreement', '/api/v2/attachments/file/27/', '', '29 Mar 2018', 27, 'WVK_Umbrella_PCA.pdf', '', '/api/v2/agreements/6/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (478, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', '', 'Signed Agreement', '/api/v2/attachments/file/478/', '', '27 Jul 2018', 478, 'Umbrella_PCA_KCO-ICS-17-044.pdf', 'KEN/PCA2018126', '/api/v2/agreements/126/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (475, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', '', 'Signed Agreement', '/api/v2/attachments/file/475/', '', '24 Jul 2018', 475, 'Umbrella_PCA_KCO-ADRA-16-021.pdf', 'KEN/PCA2018124', '/api/v2/agreements/124/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (7, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/7/', '', '29 Mar 2018', 7, 'Umbrella_PCA_KCO-TDH-2015-008-CP-02_9jg1ZnZ.pdf', 'KEN/PCA201779', '/api/v2/agreements/79/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (9, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', '', 'Signed Agreement', '/api/v2/attachments/file/9/', '', '29 Mar 2018', 9, 'WOKIKE_Umbrella_PCA.pdf', 'KEN/SSFA201773', '/api/v2/agreements/73/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (12, 'CISP COMITATO INTERNAZIONALE PER LO SVILILUPPO DEI POPOLI', 'Civil Society Organization', '2500213532', '', 'Signed Agreement', '/api/v2/attachments/file/12/', '', '29 Mar 2018', 12, 'CISP_Umbrella_PCA.pdf', 'KEN/PCA201769', '/api/v2/agreements/69/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (13, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Signed Agreement', '/api/v2/attachments/file/13/', '', '29 Mar 2018', 13, 'Umbrella_PCA.pdf', 'KEN/PCA201768', '/api/v2/agreements/68/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (171, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/171/', '', '29 Mar 2018', 171, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (175, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/175/', '', '29 Mar 2018', 175, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (188, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/188/', '', '29 Mar 2018', 188, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (198, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/198/', '', '29 Mar 2018', 198, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (225, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/225/', '', '29 Mar 2018', 225, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (242, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/242/', '', '29 Mar 2018', 242, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (482, 'HELPAGE INTERNATIONAL', 'Civil Society Organization', '2500238632', 'KEN/SSFA2018128', 'Signed PD/SSFA', '/api/v2/attachments/file/482/', '', '28 Jul 2018', 482, 'Helpage_International_SSFA.pdf', 'KEN/SSFA2018128', '/api/v2/interventions/72/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (479, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', 'KEN/PCA2018124/PD201870', 'PRC Review', '/api/v2/attachments/file/479/', '', '27 Jul 2018', 479, 'ANNEX_G_KCO-ADRA-16-021_CP-02.pdf', 'KEN/PCA2018124', '/api/v2/interventions/70/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (381, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', 'KEN/PCA201713/TempRef:25', 'Signed PD/SSFA', '/api/v2/attachments/file/381/', '', '29 Mar 2018', 381, 'FHK_Annex_C_SbYIccl.pdf', 'KEN/PCA201776', '/api/v2/interventions/25/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (14, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Signed Agreement', '/api/v2/attachments/file/14/', '', '29 Mar 2018', 14, 'Concern_Umbrella_PCA-Concern-1_wy4NcMR.pdf', 'KEN/PCA201765', '/api/v2/agreements/65/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (15, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Signed Agreement', '/api/v2/attachments/file/15/', '', '29 Mar 2018', 15, 'Umbrella_PCA_IJXA9Q7.pdf', 'KEN/PCA201763', '/api/v2/agreements/63/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (16, 'CHILDLINE KENYA', 'Civil Society Organization', '2500223509', '', 'Signed Agreement', '/api/v2/attachments/file/16/', '', '29 Mar 2018', 16, 'Umbrella_PCA_Childline.pdf', 'KEN/PCA201758', '/api/v2/agreements/58/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (17, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Signed Agreement', '/api/v2/attachments/file/17/', '', '29 Mar 2018', 17, 'AMREF_PCA_KOC_AMREF_16_028_CP_kun3Uzq.pdf', 'KEN/PCA201749', '/api/v2/agreements/49/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (537, '', '', '', '', '', '/api/v2/attachments/file/537/', 'Florian Rabenstein', '13 Sep 2018', 537, 'WVI_Umbrella_PCA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (591, 'CATHOLIC RELIEF SERVICES', 'Civil Society Organization', '2500218269', '', 'Signed Agreement', '/api/v2/attachments/file/591/', '', '21 Sep 2018', 591, '', 'KEN/PCA2018221', '/api/v2/agreements/221/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (48, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/48/', '', '29 Mar 2018', 48, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (73, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/73/', '', '29 Mar 2018', 73, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (457, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/457/', '', '19 Apr 2018', 457, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (156, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/156/', '', '29 Mar 2018', 156, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (460, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/460/', '', '11 May 2018', 460, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (319, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/319/', '', '29 Mar 2018', 319, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (461, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/461/', '', '27 May 2018', 461, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (489, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/489/', '', '28 Aug 2018', 489, '', 'KEN/SSFA2018140', '/api/v2/agreements/140/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (494, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', 'KEN/PCA201703/PD201685', 'Signed PD/SSFA', '/api/v2/attachments/file/494/', '', '28 Aug 2018', 494, 'Annex_C_KCO_-AMREF-16-028_CP-01.pdf', 'KEN/PCA201749', '/api/v2/interventions/85/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (483, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/483/', '', '03 Aug 2018', 483, 'KCO-TDH-15-008.pdf', 'KEN/PCA2018129', '/api/v2/agreements/129/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (513, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', '', 'Signed Agreement', '/api/v2/attachments/file/513/', '', '31 Aug 2018', 513, 'Umbrella_PCA_GAA.pdf', 'KEN/PCA2018157', '/api/v2/agreements/157/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (516, 'CENTRE FOR REGENERATION AND EMPOWERMENT OF AFRICA THROUGH AFRICA CREATA', 'Civil Society Organization', '2500238996', '', 'Signed Agreement', '/api/v2/attachments/file/516/', '', '31 Aug 2018', 516, '', 'KEN/SSFA2018154', '/api/v2/agreements/154/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (68, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/68/', '', '29 Mar 2018', 68, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (93, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/93/', '', '29 Mar 2018', 93, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (152, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/152/', '', '29 Mar 2018', 152, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (474, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/474/', '', '20 Jul 2018', 474, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (523, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', 'KEN/PCA2017156/PD201795', 'PRC Review', '/api/v2/attachments/file/523/', '', '31 Aug 2018', 523, 'Annex_G_KCO-ICS-17-044__HIV_AIDS-01.pdf', 'KEN/PCA2017156', '/api/v2/interventions/95/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (63, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/63/', '', '29 Mar 2018', 63, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (64, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/64/', '', '29 Mar 2018', 64, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (72, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/72/', '', '29 Mar 2018', 72, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (84, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/84/', '', '29 Mar 2018', 84, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (91, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/91/', '', '29 Mar 2018', 91, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (107, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/107/', '', '29 Mar 2018', 107, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (113, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/113/', '', '29 Mar 2018', 113, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (117, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/117/', '', '29 Mar 2018', 117, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (120, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/120/', '', '29 Mar 2018', 120, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (132, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/132/', '', '29 Mar 2018', 132, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (150, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/150/', '', '29 Mar 2018', 150, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (498, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', 'KEN/PCA2018129/PD201880', 'Signed PD/SSFA', '/api/v2/attachments/file/498/', '', '28 Aug 2018', 498, 'Annex_C_KCO-TDH-15-008_CP-06.pdf', 'KEN/PCA2018129', '/api/v2/interventions/80/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (531, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', 'KEN/PCA2018157/PD2018109', 'Signed PD/SSFA', '/api/v2/attachments/file/531/', '', '01 Sep 2018', 531, 'Welthungerhilfe_Tana_River_PCA.pdf', 'KEN/PCA2018157', '/api/v2/interventions/109/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (98, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/98/', '', '29 Mar 2018', 98, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (24, 'CARE INTERNATIONAL IN KENYA', 'Civil Society Organization', '2500228662', '', 'Signed Agreement', '/api/v2/attachments/file/24/', '', '29 Mar 2018', 24, '', 'KEN/PCA20169', '/api/v2/agreements/9/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (25, 'CARITAS SWITZERLAND', 'Civil Society Organization', '2500213527', '', 'Signed Agreement', '/api/v2/attachments/file/25/', '', '29 Mar 2018', 25, '', 'KEN/PCA20168', '/api/v2/agreements/8/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (26, 'INTERNATIONAL RESCUE COMMITTEE', 'Civil Society Organization', '2500218805', '', 'Signed Agreement', '/api/v2/attachments/file/26/', '', '29 Mar 2018', 26, 'IRC_Umbrella_PCA.pdf', 'KEN/PCA20167', '/api/v2/agreements/7/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (28, 'Turkana Education For All ', 'Civil Society Organization', '', '', 'Signed Agreement', '/api/v2/attachments/file/28/', '', '29 Mar 2018', 28, '', 'KEN/PCA20165', '/api/v2/agreements/5/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (30, 'Kenya Primary Headteachers Association', 'Civil Society Organization', '', '', 'Signed Agreement', '/api/v2/attachments/file/30/', '', '29 Mar 2018', 30, '', 'KEN/PCA20151', '/api/v2/agreements/1/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (33, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/33/', '', '29 Mar 2018', 33, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (34, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/34/', '', '29 Mar 2018', 34, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (38, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/38/', '', '29 Mar 2018', 38, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (41, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/41/', '', '29 Mar 2018', 41, 'Annex_E_V8hksow.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (54, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/54/', '', '29 Mar 2018', 54, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (101, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/101/', '', '29 Mar 2018', 101, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (108, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/108/', '', '29 Mar 2018', 108, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (138, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/138/', '', '29 Mar 2018', 138, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (157, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/157/', '', '29 Mar 2018', 157, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (166, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/166/', '', '29 Mar 2018', 166, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (172, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/172/', '', '29 Mar 2018', 172, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (182, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/182/', '', '29 Mar 2018', 182, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (190, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/190/', '', '29 Mar 2018', 190, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (216, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/216/', '', '29 Mar 2018', 216, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (235, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/235/', '', '29 Mar 2018', 235, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (128, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/128/', '', '29 Mar 2018', 128, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (149, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/149/', '', '29 Mar 2018', 149, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (159, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/159/', '', '29 Mar 2018', 159, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (179, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/179/', '', '29 Mar 2018', 179, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (206, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/206/', '', '29 Mar 2018', 206, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (210, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/210/', '', '29 Mar 2018', 210, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (221, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/221/', '', '29 Mar 2018', 221, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (236, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/236/', '', '29 Mar 2018', 236, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (238, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/238/', '', '29 Mar 2018', 238, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (276, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/276/', '', '29 Mar 2018', 276, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (280, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/280/', '', '29 Mar 2018', 280, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (335, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/335/', '', '29 Mar 2018', 335, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (178, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/178/', '', '29 Mar 2018', 178, 'Annex_E_bFGgaL1.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (201, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/201/', '', '29 Mar 2018', 201, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (224, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/224/', '', '29 Mar 2018', 224, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (255, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/255/', '', '29 Mar 2018', 255, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (259, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/259/', '', '29 Mar 2018', 259, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (263, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/263/', '', '29 Mar 2018', 263, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (269, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/269/', '', '29 Mar 2018', 269, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (285, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/285/', '', '29 Mar 2018', 285, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (292, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/292/', '', '29 Mar 2018', 292, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (327, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/327/', '', '29 Mar 2018', 327, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (332, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/332/', '', '29 Mar 2018', 332, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (3, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Signed Agreement', '/api/v2/attachments/file/3/', '', '29 Mar 2018', 3, 'Umbrella_PCA_epVPDP8.pdf', 'KEN/PCA201788', '/api/v2/agreements/88/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (226, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/226/', '', '29 Mar 2018', 226, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (247, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/247/', '', '29 Mar 2018', 247, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (270, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/270/', '', '29 Mar 2018', 270, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (290, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/290/', '', '29 Mar 2018', 290, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (302, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/302/', '', '29 Mar 2018', 302, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (306, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/306/', '', '29 Mar 2018', 306, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (312, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/312/', '', '29 Mar 2018', 312, 'Annex_E_LWu7qfG.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (323, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/323/', '', '29 Mar 2018', 323, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (340, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/340/', '', '29 Mar 2018', 340, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (615, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/615/', '', '25 Oct 2018', 615, 'ART_DCT_report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (349, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Assessment Report', '/api/v2/attachments/file/349/', '', '29 Mar 2018', 349, 'UNICEF_Micro-assessment__bCW3eMJ.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (356, 'ASSOCIAZIONE VOLONTARI PER IL SERVIZIO INTERNAZIONALE', 'Civil Society Organization', '2500215868', '', 'Assessment Report', '/api/v2/attachments/file/356/', '', '29 Mar 2018', 356, 'UNICEF_Micro_Assessment_Final_Report_-_Avsi_Foundation_in_Kenya.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (380, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', 'KEN/PCA201713/TempRef:25', 'PRC Review', '/api/v2/attachments/file/380/', '', '29 Mar 2018', 380, 'Annex_G_KCO-FHK-15-005__Nut_01_Amendment_1.pdf', 'KEN/PCA201776', '/api/v2/interventions/25/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (321, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/321/', '', '29 Mar 2018', 321, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (544, '', '', '', '', '', '/api/v2/attachments/file/544/', 'Rommanah Somba', '13 Sep 2018', 544, 'Annex_C_WERK_xgOtiwa.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (626, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/626/', '', '26 Oct 2018', 626, 'DCT_Report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (350, 'CISP COMITATO INTERNAZIONALE PER LO SVILILUPPO DEI POPOLI', 'Civil Society Organization', '2500213532', '', 'Assessment Report', '/api/v2/attachments/file/350/', '', '29 Mar 2018', 350, 'UNICEF_Micro-assessment__jkzVimc.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (616, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/616/', '', '25 Oct 2018', 616, 'ART_-_Spot_check.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (217, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/217/', '', '29 Mar 2018', 217, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (318, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/318/', '', '29 Mar 2018', 318, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (61, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/61/', '', '29 Mar 2018', 61, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (97, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/97/', '', '29 Mar 2018', 97, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (124, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/124/', '', '29 Mar 2018', 124, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (472, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/472/', '', '06 Jul 2018', 472, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (199, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/199/', '', '29 Mar 2018', 199, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (243, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/243/', '', '29 Mar 2018', 243, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (294, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/294/', '', '29 Mar 2018', 294, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (595, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/595/', '', '05 Oct 2018', 595, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (480, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', 'KEN/PCA2018124/PD201870', 'Signed PD/SSFA', '/api/v2/attachments/file/480/', '', '27 Jul 2018', 480, 'Annex_C_KCO-ADRA-16-021_CP-02.pdf', 'KEN/PCA2018124', '/api/v2/interventions/70/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (2, 'ASSOCIAZIONE VOLONTARI PER IL SERVIZIO INTERNAZIONALE', 'Civil Society Organization', '2500215868', '', 'Signed Agreement', '/api/v2/attachments/file/2/', '', '29 Mar 2018', 2, 'AVSI_Umbrella_PCA_qG41258.pdf', 'KEN/SSFA201790', '/api/v2/agreements/90/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (8, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', '', 'Signed Agreement', '/api/v2/attachments/file/8/', '', '29 Mar 2018', 8, 'Umbrella_PCA_KCO-FHK-2015-Nut-005_mPmE6CV.pdf', 'KEN/PCA201776', '/api/v2/agreements/76/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (10, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Signed Agreement', '/api/v2/attachments/file/10/', '', '29 Mar 2018', 10, 'LVCT_Health_umbrella_PCA__iUvpg31.pdf', 'KEN/PCA201772', '/api/v2/agreements/72/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (11, 'KANACHO NOMADIC EDUCATIONAL FOUNDATION', 'Civil Society Organization', '2500235346', '', 'Signed Agreement', '/api/v2/attachments/file/11/', '', '29 Mar 2018', 11, 'Umbrella_PCA_KCO-KNEF-16-025__a7FUKj4.pdf', 'KEN/PCA201770', '/api/v2/agreements/70/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (19, 'MERLIN KENYA', 'Civil Society Organization', '2500206014', '', 'Signed Agreement', '/api/v2/attachments/file/19/', '', '29 Mar 2018', 19, '', 'KEN/PCA201614', '/api/v2/agreements/14/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (23, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '1900705039', '', 'Signed Agreement', '/api/v2/attachments/file/23/', '', '29 Mar 2018', 23, '', 'KEN/PCA201610', '/api/v2/agreements/10/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (39, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/39/', '', '29 Mar 2018', 39, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (548, 'RURAL ORGANIZATION FOR ADVOCACY AND DEVELOPMENT ROAD', 'Civil Society Organization', '2500231772', '', 'Signed Agreement', '/api/v2/attachments/file/548/', 'Rommanah Somba', '13 Sep 2018', 548, '', 'KEN/PCA2018192', '/api/v2/agreements/192/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (539, '', '', '', '', '', '/api/v2/attachments/file/539/', 'Constance Rose Ngoto', '13 Sep 2018', 539, 'ACF_Umbrella_PCA_2015.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (582, '', '', '', '', '', '/api/v2/attachments/file/582/', 'Nelly Kasina', '19 Sep 2018', 582, 'Umbrella_PCA_GAA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (542, '', '', '', '', '', '/api/v2/attachments/file/542/', 'Rathigadevi Veluppillai', '13 Sep 2018', 542, '1_FCA_Umbrella_PCA_Xk3hqZ3.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (546, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/PD201635-1', '', '/api/v2/attachments/file/546/', 'Rommanah Somba', '13 Sep 2018', 546, 'Annex_G_KCO-WERK-16-029_Edu_-01_Ext_2.pdf', 'KEN/PCA201763', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (593, 'TURKANA EDUCATION FOR ALL', 'Civil Society Organization', '2500220025', '', 'Signed Agreement', '/api/v2/attachments/file/593/', 'Rommanah Somba', '03 Oct 2018', 593, 'TEFA_PCA_2018_7DfuPLj.pdf', 'KEN/PCA20185', '/api/v2/agreements/5/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (192, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/192/', '', '29 Mar 2018', 192, 'Annex_E_KEPSA.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (587, '', '', '', '', '', '/api/v2/attachments/file/587/', 'Nelly Kasina', '19 Sep 2018', 587, 'Umbrella_PCA_PLAN_mO5v0hP.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (588, 'POPULATION SERVICES KENYA', 'Civil Society Organization', '2500233671', '', 'Signed Agreement', '/api/v2/attachments/file/588/', '', '20 Sep 2018', 588, '', 'KEN/PCA2018218', '/api/v2/agreements/218/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (549, '', '', '', '', '', '/api/v2/attachments/file/549/', 'Rommanah Somba', '13 Sep 2018', 549, 'KCO-ROAD-16-033_PtWeNeR.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (550, '', '', '', '', '', '/api/v2/attachments/file/550/', 'Rommanah Somba', '13 Sep 2018', 550, 'KCO-ROAD-16-033_sV8TJZI.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (551, '', '', '', '', '', '/api/v2/attachments/file/551/', 'Rommanah Somba', '13 Sep 2018', 551, 'KCO-ROAD-16-033_LMxOFxc.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (552, '', '', '', '', '', '/api/v2/attachments/file/552/', 'Rommanah Somba', '13 Sep 2018', 552, 'KCO-ROAD-16-033_daGLMZ7.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (553, '', '', '', '', '', '/api/v2/attachments/file/553/', 'Rommanah Somba', '13 Sep 2018', 553, 'KCO-ROAD-16-033_xHfk6lN.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (599, 'ANNOS ONE FINE DAY', 'Civil Society Organization', '2500239296', '', 'Signed Agreement', '/api/v2/attachments/file/599/', '', '12 Oct 2018', 599, '', 'KEN/PCA2018225', '/api/v2/agreements/225/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (554, '', '', '', '', '', '/api/v2/attachments/file/554/', 'Rommanah Somba', '13 Sep 2018', 554, 'KCO-ROAD-16-033_AUsY6zn.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (555, '', '', '', '', '', '/api/v2/attachments/file/555/', 'Rommanah Somba', '13 Sep 2018', 555, 'KCO-ROAD-16-033_955qoFq.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (556, '', '', '', '', '', '/api/v2/attachments/file/556/', 'Rommanah Somba', '13 Sep 2018', 556, 'KCO-ROAD-16-033_0XhmgkR.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (557, '', '', '', '', '', '/api/v2/attachments/file/557/', 'Rommanah Somba', '13 Sep 2018', 557, 'KCO-ROAD-16-033_e6MuBFx.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (558, '', '', '', '', '', '/api/v2/attachments/file/558/', 'Rommanah Somba', '13 Sep 2018', 558, 'KCO-ROAD-16-033_p8HxZka.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (583, '', '', '', '', '', '/api/v2/attachments/file/583/', 'Nelly Kasina', '19 Sep 2018', 583, 'Umbrella_PCA_GAA_N2NHZh2.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (560, '', '', '', '', '', '/api/v2/attachments/file/560/', 'Rommanah Somba', '13 Sep 2018', 560, 'KCO-ROAD-16-033_oRL4okW.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (572, 'AGA KHAN FOUNDATION', 'Civil Society Organization', '2500236853', '', 'Signed Agreement', '/api/v2/attachments/file/572/', 'Rommanah Somba', '13 Sep 2018', 572, '', 'KEN/PCA2018207', '/api/v2/agreements/207/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (561, '', '', '', '', '', '/api/v2/attachments/file/561/', 'Rommanah Somba', '13 Sep 2018', 561, 'KCO-ROAD-16-033_B7GUn50.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (562, '', '', '', '', '', '/api/v2/attachments/file/562/', 'Rommanah Somba', '13 Sep 2018', 562, 'KCO-ROAD-16-033_9fQyusQ.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (589, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/589/', '', '20 Sep 2018', 589, '', 'KEN/PCA2018217', '/api/v2/agreements/217/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (564, '', '', '', '', '', '/api/v2/attachments/file/564/', 'Rathigadevi Veluppillai', '13 Sep 2018', 564, 'Childfund_PD.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (559, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Signed Agreement', '/api/v2/attachments/file/559/', 'Rommanah Somba', '13 Sep 2018', 559, '', 'KEN/PCA2018199', '/api/v2/agreements/199/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (565, '', '', '', '', '', '/api/v2/attachments/file/565/', 'Rathigadevi Veluppillai', '13 Sep 2018', 565, 'Childfund_PD_UpdvQgy.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (563, 'TURKANA EDUCATION FOR ALL', 'Civil Society Organization', '2500220025', '', 'Signed Agreement', '/api/v2/attachments/file/563/', 'Rathigadevi Veluppillai', '13 Sep 2018', 563, '', 'KEN/PCA2018186', '/api/v2/agreements/186/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (566, '', '', '', '', '', '/api/v2/attachments/file/566/', 'Rathigadevi Veluppillai', '13 Sep 2018', 566, 'Childfund_PD_nHCjOJr.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (576, 'ACAKORO COMMUNITY BASED ORGANIZATION', 'Civil Society Organization', '2500238610', '', 'Signed Agreement', '/api/v2/attachments/file/576/', '', '14 Sep 2018', 576, '', 'KEN/SSFA2018185', '/api/v2/agreements/185/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (567, '', '', '', '', '', '/api/v2/attachments/file/567/', 'Rathigadevi Veluppillai', '13 Sep 2018', 567, 'Childfund_PD_xUleOkM.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (568, '', '', '', '', '', '/api/v2/attachments/file/568/', 'Rathigadevi Veluppillai', '13 Sep 2018', 568, 'Childfund_PD_mAYTwdm.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (577, 'KENYA PRIVATE SECTOR ALLIANCE', 'Civil Society Organization', '2500222950', '', 'Signed Agreement', '/api/v2/attachments/file/577/', '', '14 Sep 2018', 577, '', 'KEN/PCA2018184', '/api/v2/agreements/184/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (569, '', '', '', '', '', '/api/v2/attachments/file/569/', 'Rathigadevi Veluppillai', '13 Sep 2018', 569, 'Childfund_PD_UwnIwnm.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (570, '', '', '', '', '', '/api/v2/attachments/file/570/', 'Rathigadevi Veluppillai', '13 Sep 2018', 570, 'Childfund_PD_aRdLwHG.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (545, 'KENYA PRIVATE SECTOR ALLIANCE', 'Civil Society Organization', '2500222950', '', 'Signed Agreement', '/api/v2/attachments/file/545/', 'Constance Rose Ngoto', '13 Sep 2018', 545, '', 'KEN/PCA2018183', '/api/v2/agreements/183/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (543, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Signed Agreement', '/api/v2/attachments/file/543/', 'Rommanah Somba', '13 Sep 2018', 543, '', 'KEN/PCA2018182', '/api/v2/agreements/182/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (571, '', '', '', '', '', '/api/v2/attachments/file/571/', 'Rathigadevi Veluppillai', '13 Sep 2018', 571, 'Childfund_PD_fPZpJTk.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (573, '', '', '', '', '', '/api/v2/attachments/file/573/', 'Rommanah Somba', '13 Sep 2018', 573, 'KCO-AKF-17-026_1q9oEjZ.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (504, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Signed Agreement', '/api/v2/attachments/file/504/', '', '30 Aug 2018', 504, 'Umbrella_PCA_AmuitDF.pdf', 'KEN/PCA2016145', '/api/v2/agreements/145/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (486, 'WAJIR SOUTH DEVELOPMENT ASSOCIATION WASDA KENYA', 'Civil Society Organization', '2500234097', '', 'Signed Agreement', '/api/v2/attachments/file/486/', '', '08 Aug 2018', 486, '', 'KEN/SSFA2018130', '/api/v2/agreements/130/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (590, 'INTERNATIONAL RESCUE COMMITTEE', 'Civil Society Organization', '2500218805', '', 'Signed Agreement', '/api/v2/attachments/file/590/', '', '20 Sep 2018', 590, '', 'KEN/PCA2018216', '/api/v2/agreements/216/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (586, 'PLAN INTERNATIONAL', 'Civil Society Organization', '2500212836', '', 'Signed Agreement', '/api/v2/attachments/file/586/', 'Nelly Kasina', '19 Sep 2018', 586, '', 'KEN/PCA2018214', '/api/v2/agreements/214/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (585, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', '', 'Signed Agreement', '/api/v2/attachments/file/585/', 'Nelly Kasina', '19 Sep 2018', 585, '', 'KEN/PCA2018213', '/api/v2/agreements/213/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (584, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', '', 'Signed Agreement', '/api/v2/attachments/file/584/', 'Nelly Kasina', '19 Sep 2018', 584, '', 'KEN/PCA2018212', '/api/v2/agreements/212/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (581, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', '', 'Signed Agreement', '/api/v2/attachments/file/581/', 'Nelly Kasina', '19 Sep 2018', 581, '', 'KEN/PCA2018209', '/api/v2/agreements/209/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (578, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Signed Agreement', '/api/v2/attachments/file/578/', '', '14 Sep 2018', 578, '', 'KEN/PCA2018169', '/api/v2/agreements/169/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (331, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/331/', '', '29 Mar 2018', 331, 'Annex_E_WASDA.pdf', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (596, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/596/', '', '05 Oct 2018', 596, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (597, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/597/', '', '05 Oct 2018', 597, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (528, 'NATIONAL EMPOWERMENT NETWORK OF PEOPLE LIVING WITH HIV AIDS IN KENYA', 'Civil Society Organization', '2500230697', '', 'Signed Agreement', '/api/v2/attachments/file/528/', '', '01 Sep 2018', 528, '', 'KEN/SSFA2018165', '/api/v2/agreements/165/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (601, '', '', '', '', '', '/api/v2/attachments/file/601/', 'Joy Nafungo', '17 Oct 2018', 601, 'Scanned_Child_Fund_Umbrella_PCA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (602, '', '', '', '', '', '/api/v2/attachments/file/602/', 'Joy Nafungo', '17 Oct 2018', 602, 'Scanned_Child_Fund_Umbrella_PCA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (600, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/600/', '', '17 Oct 2018', 600, '', '', '', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (603, '', '', '', '', '', '/api/v2/attachments/file/603/', 'Joy Nafungo', '18 Oct 2018', 603, 'Scanned_Waldorf_PCA.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (605, '', '', '', '', '', '/api/v2/attachments/file/605/', 'Joy Nafungo', '18 Oct 2018', 605, 'Scanned_Waldorf_PCA_AlHpH4K.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (604, 'WALDORF KAKUMA AGENCIES', 'Civil Society Organization', '2500237248', '', 'Signed Agreement', '/api/v2/attachments/file/604/', 'Joy Nafungo', '18 Oct 2018', 604, '', 'KEN/PCA2018227', '/api/v2/agreements/227/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (606, '', '', '', '', '', '/api/v2/attachments/file/606/', 'Joy Nafungo', '18 Oct 2018', 606, 'Scanned_Waldorf_PCA_lxYyHmS.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (609, 'WALDORF KAKUMA AGENCIES', 'Civil Society Organization', '2500237248', '', 'Signed Agreement', '/api/v2/attachments/file/609/', 'Joy Nafungo', '18 Oct 2018', 609, '', 'KEN/PCA2018226', '/api/v2/agreements/226/', 'Partnership Management Portal'); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (607, '', '', '', '', '', '/api/v2/attachments/file/607/', 'Joy Nafungo', '18 Oct 2018', 607, 'Scanned_Waldorf_PCA_J0TpY3J.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (608, '', '', '', '', '', '/api/v2/attachments/file/608/', 'Joy Nafungo', '18 Oct 2018', 608, 'Scanned_Waldorf_PCA_2EyUK31.pdf', '', '', ''); -INSERT INTO [[schema]].attachments_attachmentflat VALUES (617, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/617/', '', '25 Oct 2018', 617, 'UNICEF_Micro_Assessment_Final_Report_-_African_Rangeland_Trust.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)'); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (533, '', '', '', '', '', '/api/v2/attachments/file/533/', 'Susan Govedi', '13 Sep 2018', 533, 'Concern_Umbrella_PCAKCO-Concern-15-04.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (538, '', '', '', '', '', '/api/v2/attachments/file/538/', 'Florian Rabenstein', '13 Sep 2018', 538, 'WVI_Umbrella_PCA_Kir3BaS.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (579, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Signed Agreement', '/api/v2/attachments/file/579/', '', '15 Sep 2018', 579, '', 'KEN/PCA2018208', '/api/v2/agreements/208/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (574, 'CHILDFUND KENYA', 'Civil Society Organization', '2500228337', '', 'Signed Agreement', '/api/v2/attachments/file/574/', '', '14 Sep 2018', 574, '', 'KEN/PCA2013198', '/api/v2/agreements/198/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (487, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/487/', '', '13 Aug 2018', 487, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (488, 'LIFESKILLS PROMOTERS (LISP)', 'Civil Society Organization', '2500233203', '', 'Signed Agreement', '/api/v2/attachments/file/488/', '', '18 Aug 2018', 488, 'Annex_C_PCA_KCO_LISP_EDU_2016_-_024.pdf', 'KEN/PCA2016131', '/api/v2/agreements/131/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (465, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/465/', '', '13 Jun 2018', 465, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (500, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', '', 'Signed Agreement', '/api/v2/attachments/file/500/', '', '29 Aug 2018', 500, 'KCO-WOKIKE-15-004.pdf', 'KEN/PCA2018143', '/api/v2/agreements/143/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (36, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/36/', '', '29 Mar 2018', 36, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (42, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/42/', '', '29 Mar 2018', 42, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (44, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/44/', '', '29 Mar 2018', 44, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (47, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/47/', '', '29 Mar 2018', 47, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (49, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/49/', '', '29 Mar 2018', 49, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (50, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/50/', '', '29 Mar 2018', 50, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (467, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/467/', '', '15 Jun 2018', 467, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (55, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/55/', '', '29 Mar 2018', 55, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (66, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/66/', '', '29 Mar 2018', 66, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (65, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/65/', '', '29 Mar 2018', 65, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (471, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/471/', '', '05 Jul 2018', 471, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (466, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/466/', '', '14 Jun 2018', 466, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (100, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/100/', '', '29 Mar 2018', 100, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (453, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/453/', '', '10 Apr 2018', 453, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (470, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/470/', '', '28 Jun 2018', 470, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (125, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/125/', '', '29 Mar 2018', 125, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (136, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/136/', '', '29 Mar 2018', 136, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (167, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/167/', '', '29 Mar 2018', 167, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (469, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/469/', '', '27 Jun 2018', 469, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (187, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/187/', '', '29 Mar 2018', 187, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (233, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/233/', '', '29 Mar 2018', 233, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (249, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/249/', '', '29 Mar 2018', 249, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (308, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/308/', '', '29 Mar 2018', 308, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (322, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/322/', '', '29 Mar 2018', 322, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (463, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/463/', '', '02 Jun 2018', 463, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (464, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/464/', '', '10 Jun 2018', 464, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (462, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/462/', '', '01 Jun 2018', 462, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (490, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/490/', '', '28 Aug 2018', 490, '', 'KEN/SSFA2018139', '/api/v2/agreements/139/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (501, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', '', 'Signed Agreement', '/api/v2/attachments/file/501/', '', '30 Aug 2018', 501, 'ICL_UNICEF_PCA.docx', 'KEN/PCA2017153', '/api/v2/agreements/153/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (502, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', '', 'Signed Agreement', '/api/v2/attachments/file/502/', '', '30 Aug 2018', 502, 'KCO-ICL-17-035.pdf', 'KEN/PCA2018149', '/api/v2/agreements/149/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (503, 'SAVE THE CHILDREN INTERNATIONAL', 'Civil Society Organization', '2500224418', '', 'Signed Agreement', '/api/v2/attachments/file/503/', '', '30 Aug 2018', 503, 'KCO-SCI-15-013.pdf', 'KEN/PCA2018148', '/api/v2/agreements/148/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (529, 'KENYA PAEDIATRIC RESEARCH CONSORTIUM KPA UNICEF KEPRECON MNCH PROJECT', 'Civil Society Organization', '2500237203', '', 'Signed Agreement', '/api/v2/attachments/file/529/', '', '01 Sep 2018', 529, '', 'KEN/PCA2018164', '/api/v2/agreements/164/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (507, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', 'KEN/PCA2018134/PD201888', 'Signed PD/SSFA', '/api/v2/attachments/file/507/', '', '30 Aug 2018', 507, 'Annex_C_KCO-WVK-15-003_CP-10.pdf', 'KEN/PCA2018134', '/api/v2/interventions/88/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (508, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', 'KEN/PCA2018143/PD201887', 'Signed PD/SSFA', '/api/v2/attachments/file/508/', '', '30 Aug 2018', 508, 'wokike_PD.pdf', 'KEN/PCA2018143', '/api/v2/interventions/87/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (530, 'KENYA PAEDIATRIC RESEARCH CONSORTIUM KPA UNICEF KEPRECON MNCH PROJECT', 'Civil Society Organization', '2500237203', '', 'Signed Agreement', '/api/v2/attachments/file/530/', '', '01 Sep 2018', 530, 'Umbrella_PCA_KCO-KEPRECON-17-043.pdf', 'KEN/PCA2017163', '/api/v2/agreements/163/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (518, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/518/', '', '31 Aug 2018', 518, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (580, '', '', '', '', '', '/api/v2/attachments/file/580/', 'Nelly Kasina', '19 Sep 2018', 580, 'Umbrella_PCA_Oxfam.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (31, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/31/', '', '29 Mar 2018', 31, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (491, 'PLAN INTERNATIONAL', 'Civil Society Organization', '2500212836', '', 'Signed Agreement', '/api/v2/attachments/file/491/', '', '28 Aug 2018', 491, '', 'KEN/SSFA2018138', '/api/v2/agreements/138/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (32, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/32/', '', '29 Mar 2018', 32, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (511, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', '', 'Signed Agreement', '/api/v2/attachments/file/511/', '', '31 Aug 2018', 511, 'Umbrella_PCA_Oxfam.pdf', 'KEN/PCA2018162', '/api/v2/agreements/162/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (512, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', '', 'Signed Agreement', '/api/v2/attachments/file/512/', '', '31 Aug 2018', 512, 'Umbrella_PCA_KCO-FCA-16-032__WASH-02.pdf', 'KEN/PCA2018159', '/api/v2/agreements/159/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (514, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', '', 'Signed Agreement', '/api/v2/attachments/file/514/', '', '31 Aug 2018', 514, 'Umbrella_PCA_KCO-ICS-17-044.pdf', 'KEN/PCA2017156', '/api/v2/agreements/156/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (515, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', '', 'Signed Agreement', '/api/v2/attachments/file/515/', '', '31 Aug 2018', 515, 'Umbrella_PCA_KCO-NRC-16-018_Education_-01.pdf', 'KEN/PCA2016155', '/api/v2/agreements/155/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (506, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', 'KEN/PCA2017153/PD201790', 'Signed PD/SSFA', '/api/v2/attachments/file/506/', '', '30 Aug 2018', 506, 'Annex_C_Dj8t0mw.pdf', 'KEN/PCA2017153', '/api/v2/interventions/90/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (520, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', 'KEN/PCA2018162/PD2018104', 'Signed PD/SSFA', '/api/v2/attachments/file/520/', '', '31 Aug 2018', 520, 'OXFAM_Turkana_PCA_CMaj7gJ.pdf', 'KEN/PCA2018162', '/api/v2/interventions/104/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (45, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/45/', '', '29 Mar 2018', 45, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (521, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', 'KEN/PCA2018159/PD2018100', 'Signed PD/SSFA', '/api/v2/attachments/file/521/', '', '31 Aug 2018', 521, 'FCA_PCA.pdf', 'KEN/PCA2018159', '/api/v2/interventions/100/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (492, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', '', 'Signed Agreement', '/api/v2/attachments/file/492/', '', '28 Aug 2018', 492, 'KCO-LWF-15-002.pdf', 'KEN/PCA2018135', '/api/v2/agreements/135/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (493, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Signed Agreement', '/api/v2/attachments/file/493/', '', '28 Aug 2018', 493, 'KCO-WVK-15-003.pdf', 'KEN/PCA2018134', '/api/v2/agreements/134/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (18, 'UNIVERSITY OF NAIROBI C4DLAB', 'Government', '2500235241', '', 'Signed Agreement', '/api/v2/attachments/file/18/', '', '29 Mar 2018', 18, '', '', '/api/v2/agreements/15/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (22, 'CARE CANADA', 'Civil Society Organization', '2500215869', '', 'Signed Agreement', '/api/v2/attachments/file/22/', '', '29 Mar 2018', 22, '', '', '/api/v2/agreements/11/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (46, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/46/', '', '29 Mar 2018', 46, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (51, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/51/', '', '29 Mar 2018', 51, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (53, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/53/', '', '29 Mar 2018', 53, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (57, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/57/', '', '29 Mar 2018', 57, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (85, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/85/', '', '29 Mar 2018', 85, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (90, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/90/', '', '29 Mar 2018', 90, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (92, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/92/', '', '29 Mar 2018', 92, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (94, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/94/', '', '29 Mar 2018', 94, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (96, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/96/', '', '29 Mar 2018', 96, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (473, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/473/', '', '18 Jul 2018', 473, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (122, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/122/', '', '29 Mar 2018', 122, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (177, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/177/', '', '29 Mar 2018', 177, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (455, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/455/', '', '18 Apr 2018', 455, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (458, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/458/', '', '27 Apr 2018', 458, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (456, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/456/', '', '18 Apr 2018', 456, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (532, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/532/', '', '03 Sep 2018', 532, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (524, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', 'KEN/PCA2017156/PD201795', 'Signed PD/SSFA', '/api/v2/attachments/file/524/', '', '31 Aug 2018', 524, 'Annex_C_KCO-ICS-17-044__HIV_AIDS_01.pdf', 'KEN/PCA2017156', '/api/v2/interventions/95/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (525, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', 'KEN/PCA201714/PD201894', 'Signed PD/SSFA', '/api/v2/attachments/file/525/', '', '31 Aug 2018', 525, 'TDH_Garissa_PCA.pdf', 'KEN/PCA201779', '/api/v2/interventions/94/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (526, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', 'KEN/PCA2016155/PD201892', 'Signed PD/SSFA', '/api/v2/attachments/file/526/', '', '31 Aug 2018', 526, 'NRC_Mandera_PCA.pdf', 'KEN/PCA2016155', '/api/v2/interventions/92/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (527, 'CENTRE FOR REGENERATION AND EMPOWERMENT OF AFRICA THROUGH AFRICA CREATA', 'Civil Society Organization', '2500238996', 'KEN/SSFA2018154', 'Signed PD/SSFA', '/api/v2/attachments/file/527/', '', '31 Aug 2018', 527, 'CREATA_SSFA.pdf', 'KEN/SSFA2018154', '/api/v2/interventions/91/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (517, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/517/', '', '31 Aug 2018', 517, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (481, 'HELPAGE INTERNATIONAL', 'Civil Society Organization', '2500238632', '', 'Signed Agreement', '/api/v2/attachments/file/481/', '', '28 Jul 2018', 481, '', 'KEN/SSFA2018128', '/api/v2/agreements/128/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (58, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/58/', '', '29 Mar 2018', 58, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (59, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/59/', '', '29 Mar 2018', 59, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (60, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/60/', '', '29 Mar 2018', 60, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (534, '', '', '', '', '', '/api/v2/attachments/file/534/', 'Susan Govedi', '13 Sep 2018', 534, 'Concern_Umbrella_PCAKCO-Concern-15-04_H0pj21t.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (594, 'ST PETERS COMMUNITY NETWORK SAPCONE', 'Civil Society Organization', '2500236585', '', 'Signed Agreement', '/api/v2/attachments/file/594/', '', '05 Oct 2018', 594, '', 'KEN/PCA2018224', '/api/v2/agreements/224/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (67, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/67/', '', '29 Mar 2018', 67, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (69, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/69/', '', '29 Mar 2018', 69, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (70, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/70/', '', '29 Mar 2018', 70, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (71, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/71/', '', '29 Mar 2018', 71, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (74, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/74/', '', '29 Mar 2018', 74, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (76, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/76/', '', '29 Mar 2018', 76, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (83, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/83/', '', '29 Mar 2018', 83, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (86, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/86/', '', '29 Mar 2018', 86, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (87, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/87/', '', '29 Mar 2018', 87, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (88, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/88/', '', '29 Mar 2018', 88, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (99, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/99/', '', '29 Mar 2018', 99, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (104, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/104/', '', '29 Mar 2018', 104, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (106, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/106/', '', '29 Mar 2018', 106, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (109, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/109/', '', '29 Mar 2018', 109, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (110, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/110/', '', '29 Mar 2018', 110, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (111, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/111/', '', '29 Mar 2018', 111, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (114, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/114/', '', '29 Mar 2018', 114, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (115, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/115/', '', '29 Mar 2018', 115, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (116, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/116/', '', '29 Mar 2018', 116, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (118, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/118/', '', '29 Mar 2018', 118, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (454, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/454/', '', '12 Apr 2018', 454, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (119, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/119/', '', '29 Mar 2018', 119, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (121, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/121/', '', '29 Mar 2018', 121, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (130, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/130/', '', '29 Mar 2018', 130, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (131, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/131/', '', '29 Mar 2018', 131, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (133, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/133/', '', '29 Mar 2018', 133, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (134, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/134/', '', '29 Mar 2018', 134, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (144, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/144/', '', '29 Mar 2018', 144, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (165, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/165/', '', '29 Mar 2018', 165, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (189, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/189/', '', '29 Mar 2018', 189, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (215, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/215/', '', '29 Mar 2018', 215, 'Annex_E_fWKeHT8.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (499, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', 'KCO/SSFA/UON/2311232/PD201778', 'Signed PD/SSFA', '/api/v2/attachments/file/499/', '', '28 Aug 2018', 499, 'Annex_C_KCO-WVK-16-003_CP-06.pdf', 'KEN/PCA20186', '/api/v2/interventions/78/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (509, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', 'KEN/PCA2018135/PD201879', 'PRC Review', '/api/v2/attachments/file/509/', '', '30 Aug 2018', 509, 'ANNEX_G_KCO-LWF-15-002_CP-03.pdf', 'KEN/PCA2018135', '/api/v2/interventions/79/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (510, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', 'KEN/PCA2018135/PD201879', 'Signed PD/SSFA', '/api/v2/attachments/file/510/', '', '30 Aug 2018', 510, 'Annex_C_KCO-LWF-15-002_CP-03.pdf', 'KEN/PCA2018135', '/api/v2/interventions/79/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (519, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/519/', '', '31 Aug 2018', 519, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (522, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', 'KEN/PCA2018157/PD201896', 'Signed PD/SSFA', '/api/v2/attachments/file/522/', '', '31 Aug 2018', 522, 'GAA_PCA.pdf', 'KEN/PCA2018157', '/api/v2/interventions/96/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (505, 'I CHOOSE LIFE AFRICA', 'Civil Society Organization', '2500236936', 'KEN/PCA2017153/PD201790', 'PRC Review', '/api/v2/attachments/file/505/', '', '30 Aug 2018', 505, 'Annex_G_KCO-ICL-17-035__HIVAIDS-01.pdf', 'KEN/PCA2017153', '/api/v2/interventions/90/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (477, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Signed Agreement', '/api/v2/attachments/file/477/', '', '27 Jul 2018', 477, 'LVCT_18_-_22_PCA.pdf', 'KEN/PCA2018127', '/api/v2/agreements/127/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (75, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/75/', '', '29 Mar 2018', 75, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (77, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/77/', '', '29 Mar 2018', 77, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (78, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/78/', '', '29 Mar 2018', 78, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (79, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/79/', '', '29 Mar 2018', 79, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (80, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/80/', '', '29 Mar 2018', 80, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (81, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/81/', '', '29 Mar 2018', 81, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (82, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/82/', '', '29 Mar 2018', 82, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (535, '', '', '', '', '', '/api/v2/attachments/file/535/', 'Susan Govedi', '13 Sep 2018', 535, 'Concern_Umbrella_PCAKCO-Concern-15-04_zJ7bTei.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (103, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/103/', '', '29 Mar 2018', 103, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (112, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/112/', '', '29 Mar 2018', 112, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (135, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/135/', '', '29 Mar 2018', 135, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (137, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/137/', '', '29 Mar 2018', 137, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (142, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/142/', '', '29 Mar 2018', 142, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (154, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/154/', '', '29 Mar 2018', 154, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (155, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/155/', '', '29 Mar 2018', 155, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (160, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/160/', '', '29 Mar 2018', 160, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (161, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/161/', '', '29 Mar 2018', 161, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (164, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/164/', '', '29 Mar 2018', 164, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (168, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/168/', '', '29 Mar 2018', 168, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (169, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/169/', '', '29 Mar 2018', 169, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (170, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/170/', '', '29 Mar 2018', 170, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (174, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/174/', '', '29 Mar 2018', 174, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (180, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/180/', '', '29 Mar 2018', 180, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (181, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/181/', '', '29 Mar 2018', 181, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (183, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/183/', '', '29 Mar 2018', 183, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (184, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/184/', '', '29 Mar 2018', 184, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (185, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/185/', '', '29 Mar 2018', 185, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (186, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/186/', '', '29 Mar 2018', 186, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (191, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/191/', '', '29 Mar 2018', 191, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (211, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/211/', '', '29 Mar 2018', 211, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (214, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/214/', '', '29 Mar 2018', 214, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (228, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/228/', '', '29 Mar 2018', 228, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (231, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/231/', '', '29 Mar 2018', 231, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (232, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/232/', '', '29 Mar 2018', 232, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (40, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/40/', '', '29 Mar 2018', 40, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (126, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/126/', '', '29 Mar 2018', 126, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (127, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/127/', '', '29 Mar 2018', 127, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (129, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/129/', '', '29 Mar 2018', 129, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (139, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/139/', '', '29 Mar 2018', 139, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (148, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/148/', '', '29 Mar 2018', 148, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (151, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/151/', '', '29 Mar 2018', 151, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (153, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/153/', '', '29 Mar 2018', 153, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (158, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/158/', '', '29 Mar 2018', 158, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (162, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/162/', '', '29 Mar 2018', 162, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (163, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/163/', '', '29 Mar 2018', 163, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (173, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/173/', '', '29 Mar 2018', 173, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (203, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/203/', '', '29 Mar 2018', 203, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (204, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/204/', '', '29 Mar 2018', 204, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (205, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/205/', '', '29 Mar 2018', 205, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (207, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/207/', '', '29 Mar 2018', 207, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (208, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/208/', '', '29 Mar 2018', 208, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (209, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/209/', '', '29 Mar 2018', 209, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (212, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/212/', '', '29 Mar 2018', 212, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (213, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/213/', '', '29 Mar 2018', 213, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (218, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/218/', '', '29 Mar 2018', 218, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (220, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/220/', '', '29 Mar 2018', 220, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (229, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/229/', '', '29 Mar 2018', 229, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (227, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/227/', '', '29 Mar 2018', 227, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (230, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/230/', '', '29 Mar 2018', 230, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (234, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/234/', '', '29 Mar 2018', 234, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (540, '', '', '', '', '', '/api/v2/attachments/file/540/', 'Rathigadevi Veluppillai', '13 Sep 2018', 540, '1_FCA_Umbrella_PCA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (610, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/610/', '', '25 Oct 2018', 610, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (239, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/239/', '', '29 Mar 2018', 239, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (250, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/250/', '', '29 Mar 2018', 250, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (459, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/459/', '', '30 Apr 2018', 459, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (277, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/277/', '', '29 Mar 2018', 277, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (278, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/278/', '', '29 Mar 2018', 278, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (279, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/279/', '', '29 Mar 2018', 279, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (281, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/281/', '', '29 Mar 2018', 281, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (283, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/283/', '', '29 Mar 2018', 283, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (284, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/284/', '', '29 Mar 2018', 284, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (43, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/43/', '', '29 Mar 2018', 43, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (176, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/176/', '', '29 Mar 2018', 176, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (194, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/194/', '', '29 Mar 2018', 194, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (196, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/196/', '', '29 Mar 2018', 196, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (197, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/197/', '', '29 Mar 2018', 197, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (200, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/200/', '', '29 Mar 2018', 200, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (202, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/202/', '', '29 Mar 2018', 202, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (219, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/219/', '', '29 Mar 2018', 219, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (223, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/223/', '', '29 Mar 2018', 223, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (222, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/222/', '', '29 Mar 2018', 222, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (248, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/248/', '', '29 Mar 2018', 248, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (252, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/252/', '', '29 Mar 2018', 252, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (254, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/254/', '', '29 Mar 2018', 254, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (256, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/256/', '', '29 Mar 2018', 256, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (257, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/257/', '', '29 Mar 2018', 257, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (258, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/258/', '', '29 Mar 2018', 258, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (260, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/260/', '', '29 Mar 2018', 260, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (261, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/261/', '', '29 Mar 2018', 261, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (262, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/262/', '', '29 Mar 2018', 262, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (264, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/264/', '', '29 Mar 2018', 264, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (267, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/267/', '', '29 Mar 2018', 267, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (268, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/268/', '', '29 Mar 2018', 268, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (274, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/274/', '', '29 Mar 2018', 274, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (275, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/275/', '', '29 Mar 2018', 275, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (282, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/282/', '', '29 Mar 2018', 282, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (286, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/286/', '', '29 Mar 2018', 286, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (287, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/287/', '', '29 Mar 2018', 287, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (291, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/291/', '', '29 Mar 2018', 291, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (295, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/295/', '', '29 Mar 2018', 295, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (317, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/317/', '', '29 Mar 2018', 317, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (326, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/326/', '', '29 Mar 2018', 326, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (328, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/328/', '', '29 Mar 2018', 328, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (329, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/329/', '', '29 Mar 2018', 329, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (330, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/330/', '', '29 Mar 2018', 330, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (333, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/333/', '', '29 Mar 2018', 333, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (358, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Assessment Report', '/api/v2/attachments/file/358/', '', '29 Mar 2018', 358, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (143, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/143/', '', '29 Mar 2018', 143, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (353, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Assessment Report', '/api/v2/attachments/file/353/', '', '29 Mar 2018', 353, '7._UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_TDH_Final_301015.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (348, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Assessment Report', '/api/v2/attachments/file/348/', '', '29 Mar 2018', 348, '2015_Audit_Report.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (611, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/611/', '', '25 Oct 2018', 611, 'EDU-ART_Kes4369913.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (592, '', '', '', '', '', '/api/v2/attachments/file/592/', 'Rommanah Somba', '03 Oct 2018', 592, 'TEFA_PCA_2018.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (618, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/618/', '', '25 Oct 2018', 618, 'Liquidation_-_4610969.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (244, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/244/', '', '29 Mar 2018', 244, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (245, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/245/', '', '29 Mar 2018', 245, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (246, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/246/', '', '29 Mar 2018', 246, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (253, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/253/', '', '29 Mar 2018', 253, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (265, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/265/', '', '29 Mar 2018', 265, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (266, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/266/', '', '29 Mar 2018', 266, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (271, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/271/', '', '29 Mar 2018', 271, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (272, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/272/', '', '29 Mar 2018', 272, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (273, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/273/', '', '29 Mar 2018', 273, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (293, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/293/', '', '29 Mar 2018', 293, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (300, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/300/', '', '29 Mar 2018', 300, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (301, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/301/', '', '29 Mar 2018', 301, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (303, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/303/', '', '29 Mar 2018', 303, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (304, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/304/', '', '29 Mar 2018', 304, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (305, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/305/', '', '29 Mar 2018', 305, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (307, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/307/', '', '29 Mar 2018', 307, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (310, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/310/', '', '29 Mar 2018', 310, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (311, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/311/', '', '29 Mar 2018', 311, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (313, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/313/', '', '29 Mar 2018', 313, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (315, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/315/', '', '29 Mar 2018', 315, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (316, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/316/', '', '29 Mar 2018', 316, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (320, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/320/', '', '29 Mar 2018', 320, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (324, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/324/', '', '29 Mar 2018', 324, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (325, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/325/', '', '29 Mar 2018', 325, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (334, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/334/', '', '29 Mar 2018', 334, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (4, 'BBC MEDIA ACTION', 'Civil Society Organization', '2500234729', '', 'Signed Agreement', '/api/v2/attachments/file/4/', '', '29 Mar 2018', 4, 'PCA-BBC-16-020_NUT_demIBJ8.pdf', 'KEN/PCA201786', '/api/v2/agreements/86/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (341, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Assessment Report', '/api/v2/attachments/file/341/', '', '29 Mar 2018', 341, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (342, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Assessment Report', '/api/v2/attachments/file/342/', '', '29 Mar 2018', 342, 'AMREF_UNICEF_Microasses_MhHoxth.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (343, 'CHILDLINE KENYA', 'Civil Society Organization', '2500223509', '', 'Assessment Report', '/api/v2/attachments/file/343/', '', '29 Mar 2018', 343, 'UNICEF_Micro_Assessment__3Zw0DFk.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (344, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Assessment Report', '/api/v2/attachments/file/344/', '', '29 Mar 2018', 344, 'UNICEF_Micro_Assessment__jLp4s6s.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (345, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Assessment Report', '/api/v2/attachments/file/345/', '', '29 Mar 2018', 345, 'UNICEF_Micro_Assessment__PnZmAKw.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (351, 'SUSTAINABLE AID IN AFRICA', 'Civil Society Organization', '2500219460', '', 'Assessment Report', '/api/v2/attachments/file/351/', '', '29 Mar 2018', 351, 'UNICEF_Micro_Assessment__quOhWUA.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (352, 'KANACHO NOMADIC EDUCATIONAL FOUNDATION', 'Civil Society Organization', '2500235346', '', 'Assessment Report', '/api/v2/attachments/file/352/', '', '29 Mar 2018', 352, 'UNICEF_Micro_Assessment_dUwbBYx.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (354, 'BBC MEDIA ACTION', 'Civil Society Organization', '2500234729', '', 'Assessment Report', '/api/v2/attachments/file/354/', '', '29 Mar 2018', 354, 'UNICEF_Micro-assessment_final_report_-_BBCMA-K.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (355, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Assessment Report', '/api/v2/attachments/file/355/', '', '29 Mar 2018', 355, 'UNICEF_Micro_Assessment_Final_Report_-_Windle_Trust_Kenya.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (357, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Assessment Report', '/api/v2/attachments/file/357/', '', '29 Mar 2018', 357, 'UNICEF_Micro_Assessment_Final_Report_-_Women_Educational_Researchers_of_Kenya.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (359, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Assessment Report', '/api/v2/attachments/file/359/', '', '29 Mar 2018', 359, 'World_Vision_Kenya_UNICEF_Microassessment_report_-_Final.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (105, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/105/', '', '29 Mar 2018', 105, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (346, 'LUTHERAN WORLD FEDERATION', 'Civil Society Organization', '2500205988', '', 'Assessment Report', '/api/v2/attachments/file/346/', '', '29 Mar 2018', 346, 'UNICEF_Micro_Assessment_Fin_2xzMTuw.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (536, '', '', '', '', '', '/api/v2/attachments/file/536/', 'Susan Govedi', '13 Sep 2018', 536, 'Concern_Umbrella_PCAKCO-Concern-15-04_Nip0Q7D.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (612, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/612/', '', '25 Oct 2018', 612, 'Liquidation_-_3462917.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (623, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'FACE form', '/api/v2/attachments/file/623/', '', '26 Oct 2018', 623, 'FACE_forms.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (619, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'FACE form', '/api/v2/attachments/file/619/', '', '25 Oct 2018', 619, 'FACE_forms.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (360, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', '', 'Agreement Amendment', '/api/v2/attachments/file/360/', '', '29 Mar 2018', 360, 'Umbrella_PCA_KCO-FHK-2015-Nut-005.pdf', '', '/api/v2/partners/1/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (365, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'PRC Review', '/api/v2/attachments/file/365/', '', '29 Mar 2018', 365, 'Annex_G_-_WERK.pdf', 'KEN/PCA201763', '/api/v2/interventions/35/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (366, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Signed PD/SSFA', '/api/v2/attachments/file/366/', '', '29 Mar 2018', 366, 'Annex_C_Education-01.pdf', 'KEN/PCA201763', '/api/v2/interventions/35/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (296, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/296/', '', '29 Mar 2018', 296, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (298, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/298/', '', '29 Mar 2018', 298, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (299, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/299/', '', '29 Mar 2018', 299, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (309, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/309/', '', '29 Mar 2018', 309, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (439, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/439/', '', '30 Mar 2018', 439, 'Annex_C_Education-01.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (440, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/440/', '', '30 Mar 2018', 440, 'Annex_G_-_WERK.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (441, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/TempRef:35', 'Correspondence', '/api/v2/attachments/file/441/', '', '30 Mar 2018', 441, 'THE_WERK_REGISTRATION_CERTIFICATE_-_151025.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (347, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Assessment Report', '/api/v2/attachments/file/347/', '', '29 Mar 2018', 347, 'UNICEF_Micro_Assessment_gK7sYIc.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (5, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/5/', '', '29 Mar 2018', 5, 'Umbrella_PCA.pdf', 'KEN/PCA201783', '/api/v2/agreements/83/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (541, '', '', '', '', '', '/api/v2/attachments/file/541/', 'Rathigadevi Veluppillai', '13 Sep 2018', 541, '1_FCA_Umbrella_PCA_SmxCsTU.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (613, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/613/', '', '25 Oct 2018', 613, 'Liquidation_-_6262432.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (598, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/598/', '', '11 Oct 2018', 598, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (620, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/620/', '', '25 Oct 2018', 620, 'Spot_checks.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (624, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/624/', '', '26 Oct 2018', 624, 'KEPI_Kakamega.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (621, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/621/', '', '25 Oct 2018', 621, 'UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_County_director_of_Education_Lodwar-Final.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (145, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/145/', '', '29 Mar 2018', 145, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (193, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/193/', '', '29 Mar 2018', 193, 'Annex_E_KRCS.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (195, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/195/', '', '29 Mar 2018', 195, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (237, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/237/', '', '29 Mar 2018', 237, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (240, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/240/', '', '29 Mar 2018', 240, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (241, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/241/', '', '29 Mar 2018', 241, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (336, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/336/', '', '29 Mar 2018', 336, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (338, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/338/', '', '29 Mar 2018', 338, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (339, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/339/', '', '29 Mar 2018', 339, 'Annex_E_Childline.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (6, 'INTERNATIONAL MEDICAL CORPS, KENYA', 'Civil Society Organization', '2500218799', '', 'Signed Agreement', '/api/v2/attachments/file/6/', '', '29 Mar 2018', 6, 'Umbrella_PCA_KCO-IMC-15-010_39i9UBk.pdf', 'KEN/PCA201782', '/api/v2/agreements/82/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (468, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/468/', '', '22 Jun 2018', 468, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (35, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/35/', '', '29 Mar 2018', 35, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (37, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/37/', '', '29 Mar 2018', 37, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (56, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/56/', '', '29 Mar 2018', 56, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (452, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/452/', '', '10 Apr 2018', 452, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (62, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/62/', '', '29 Mar 2018', 62, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (89, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/89/', '', '29 Mar 2018', 89, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (95, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/95/', '', '29 Mar 2018', 95, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (102, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/102/', '', '29 Mar 2018', 102, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (484, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/484/', '', '04 Aug 2018', 484, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (123, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/123/', '', '29 Mar 2018', 123, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (140, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/140/', '', '29 Mar 2018', 140, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (141, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/141/', '', '29 Mar 2018', 141, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (146, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/146/', '', '29 Mar 2018', 146, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (147, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/147/', '', '29 Mar 2018', 147, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (575, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Signed Agreement', '/api/v2/attachments/file/575/', '', '14 Sep 2018', 575, '', 'KEN/PCA2018190', '/api/v2/agreements/190/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (52, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/52/', '', '29 Mar 2018', 52, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (547, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '2500220645', '', 'Signed Agreement', '/api/v2/attachments/file/547/', 'Constance Rose Ngoto', '13 Sep 2018', 547, '', 'KEN/PCA2018187', '/api/v2/agreements/187/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (614, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'FACE form', '/api/v2/attachments/file/614/', '', '25 Oct 2018', 614, 'Liquidation_-_10783394.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (622, 'COUNTY DIRECTOR OF EDUCATION', 'Government', '2500230875', '', 'Other', '/api/v2/attachments/file/622/', '', '25 Oct 2018', 622, 'DCT_Report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F8%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (625, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/625/', '', '26 Oct 2018', 625, 'UN_Micro_-_Assessment_Final_Report_for_Kakamega_County_Health_Office.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (251, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/251/', '', '29 Mar 2018', 251, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (288, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/288/', '', '29 Mar 2018', 288, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (289, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/289/', '', '29 Mar 2018', 289, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (297, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/297/', '', '29 Mar 2018', 297, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (485, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/485/', '', '04 Aug 2018', 485, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (314, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/314/', '', '29 Mar 2018', 314, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (337, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/337/', '', '29 Mar 2018', 337, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (20, 'AFRICAN DEVELOPMENT AND EMERGENCY ORGANIZATION', 'Civil Society Organization', '2500215865', '', 'Signed Agreement', '/api/v2/attachments/file/20/', '', '29 Mar 2018', 20, '', '', '/api/v2/agreements/13/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (21, 'AFRICAN DEVELOPMENT AND EMERGENCY ORGANIZATION', 'Civil Society Organization', '2500215865', '', 'Signed Agreement', '/api/v2/attachments/file/21/', '', '29 Mar 2018', 21, '', '', '/api/v2/agreements/12/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (27, 'WORLD VISION KENYA', 'Civil Society Organization', '2500205993', '', 'Signed Agreement', '/api/v2/attachments/file/27/', '', '29 Mar 2018', 27, 'WVK_Umbrella_PCA.pdf', '', '/api/v2/agreements/6/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (478, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', '', 'Signed Agreement', '/api/v2/attachments/file/478/', '', '27 Jul 2018', 478, 'Umbrella_PCA_KCO-ICS-17-044.pdf', 'KEN/PCA2018126', '/api/v2/agreements/126/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (475, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', '', 'Signed Agreement', '/api/v2/attachments/file/475/', '', '24 Jul 2018', 475, 'Umbrella_PCA_KCO-ADRA-16-021.pdf', 'KEN/PCA2018124', '/api/v2/agreements/124/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (7, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/7/', '', '29 Mar 2018', 7, 'Umbrella_PCA_KCO-TDH-2015-008-CP-02_9jg1ZnZ.pdf', 'KEN/PCA201779', '/api/v2/agreements/79/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (9, 'WOMANKIND KENYA WOKIKE', 'Civil Society Organization', '2500233142', '', 'Signed Agreement', '/api/v2/attachments/file/9/', '', '29 Mar 2018', 9, 'WOKIKE_Umbrella_PCA.pdf', 'KEN/SSFA201773', '/api/v2/agreements/73/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (12, 'CISP COMITATO INTERNAZIONALE PER LO SVILILUPPO DEI POPOLI', 'Civil Society Organization', '2500213532', '', 'Signed Agreement', '/api/v2/attachments/file/12/', '', '29 Mar 2018', 12, 'CISP_Umbrella_PCA.pdf', 'KEN/PCA201769', '/api/v2/agreements/69/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (13, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Signed Agreement', '/api/v2/attachments/file/13/', '', '29 Mar 2018', 13, 'Umbrella_PCA.pdf', 'KEN/PCA201768', '/api/v2/agreements/68/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (171, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/171/', '', '29 Mar 2018', 171, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (175, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/175/', '', '29 Mar 2018', 175, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (188, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/188/', '', '29 Mar 2018', 188, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (198, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/198/', '', '29 Mar 2018', 198, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (225, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/225/', '', '29 Mar 2018', 225, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (242, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/242/', '', '29 Mar 2018', 242, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (482, 'HELPAGE INTERNATIONAL', 'Civil Society Organization', '2500238632', 'KEN/SSFA2018128', 'Signed PD/SSFA', '/api/v2/attachments/file/482/', '', '28 Jul 2018', 482, 'Helpage_International_SSFA.pdf', 'KEN/SSFA2018128', '/api/v2/interventions/72/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (479, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', 'KEN/PCA2018124/PD201870', 'PRC Review', '/api/v2/attachments/file/479/', '', '27 Jul 2018', 479, 'ANNEX_G_KCO-ADRA-16-021_CP-02.pdf', 'KEN/PCA2018124', '/api/v2/interventions/70/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (381, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', 'KEN/PCA201713/TempRef:25', 'Signed PD/SSFA', '/api/v2/attachments/file/381/', '', '29 Mar 2018', 381, 'FHK_Annex_C_SbYIccl.pdf', 'KEN/PCA201776', '/api/v2/interventions/25/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (14, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Signed Agreement', '/api/v2/attachments/file/14/', '', '29 Mar 2018', 14, 'Concern_Umbrella_PCA-Concern-1_wy4NcMR.pdf', 'KEN/PCA201765', '/api/v2/agreements/65/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (15, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Signed Agreement', '/api/v2/attachments/file/15/', '', '29 Mar 2018', 15, 'Umbrella_PCA_IJXA9Q7.pdf', 'KEN/PCA201763', '/api/v2/agreements/63/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (16, 'CHILDLINE KENYA', 'Civil Society Organization', '2500223509', '', 'Signed Agreement', '/api/v2/attachments/file/16/', '', '29 Mar 2018', 16, 'Umbrella_PCA_Childline.pdf', 'KEN/PCA201758', '/api/v2/agreements/58/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (17, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', '', 'Signed Agreement', '/api/v2/attachments/file/17/', '', '29 Mar 2018', 17, 'AMREF_PCA_KOC_AMREF_16_028_CP_kun3Uzq.pdf', 'KEN/PCA201749', '/api/v2/agreements/49/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (537, '', '', '', '', '', '/api/v2/attachments/file/537/', 'Florian Rabenstein', '13 Sep 2018', 537, 'WVI_Umbrella_PCA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (591, 'CATHOLIC RELIEF SERVICES', 'Civil Society Organization', '2500218269', '', 'Signed Agreement', '/api/v2/attachments/file/591/', '', '21 Sep 2018', 591, '', 'KEN/PCA2018221', '/api/v2/agreements/221/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (48, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/48/', '', '29 Mar 2018', 48, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (73, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/73/', '', '29 Mar 2018', 73, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (457, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/457/', '', '19 Apr 2018', 457, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (156, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/156/', '', '29 Mar 2018', 156, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (460, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/460/', '', '11 May 2018', 460, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (319, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/319/', '', '29 Mar 2018', 319, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (461, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/461/', '', '27 May 2018', 461, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (489, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/489/', '', '28 Aug 2018', 489, '', 'KEN/SSFA2018140', '/api/v2/agreements/140/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (494, 'AMREF HEALTH AFRICA IN KENYA', 'Civil Society Organization', '2500233816', 'KEN/PCA201703/PD201685', 'Signed PD/SSFA', '/api/v2/attachments/file/494/', '', '28 Aug 2018', 494, 'Annex_C_KCO_-AMREF-16-028_CP-01.pdf', 'KEN/PCA201749', '/api/v2/interventions/85/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (483, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', '', 'Signed Agreement', '/api/v2/attachments/file/483/', '', '03 Aug 2018', 483, 'KCO-TDH-15-008.pdf', 'KEN/PCA2018129', '/api/v2/agreements/129/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (513, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', '', 'Signed Agreement', '/api/v2/attachments/file/513/', '', '31 Aug 2018', 513, 'Umbrella_PCA_GAA.pdf', 'KEN/PCA2018157', '/api/v2/agreements/157/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (516, 'CENTRE FOR REGENERATION AND EMPOWERMENT OF AFRICA THROUGH AFRICA CREATA', 'Civil Society Organization', '2500238996', '', 'Signed Agreement', '/api/v2/attachments/file/516/', '', '31 Aug 2018', 516, '', 'KEN/SSFA2018154', '/api/v2/agreements/154/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (68, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/68/', '', '29 Mar 2018', 68, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (93, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/93/', '', '29 Mar 2018', 93, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (152, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/152/', '', '29 Mar 2018', 152, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (474, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/474/', '', '20 Jul 2018', 474, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (523, 'INVESTING IN CHILDREN AND THEIR SOCIETIES', 'Civil Society Organization', '2500237159', 'KEN/PCA2017156/PD201795', 'PRC Review', '/api/v2/attachments/file/523/', '', '31 Aug 2018', 523, 'Annex_G_KCO-ICS-17-044__HIV_AIDS-01.pdf', 'KEN/PCA2017156', '/api/v2/interventions/95/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (63, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/63/', '', '29 Mar 2018', 63, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (64, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/64/', '', '29 Mar 2018', 64, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (72, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/72/', '', '29 Mar 2018', 72, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (84, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/84/', '', '29 Mar 2018', 84, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (91, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/91/', '', '29 Mar 2018', 91, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (107, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/107/', '', '29 Mar 2018', 107, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (113, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/113/', '', '29 Mar 2018', 113, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (117, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/117/', '', '29 Mar 2018', 117, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (120, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/120/', '', '29 Mar 2018', 120, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (132, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/132/', '', '29 Mar 2018', 132, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (150, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/150/', '', '29 Mar 2018', 150, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (498, 'TERRE DES HOMMES FOUNDATION', 'Civil Society Organization', '2500223544', 'KEN/PCA2018129/PD201880', 'Signed PD/SSFA', '/api/v2/attachments/file/498/', '', '28 Aug 2018', 498, 'Annex_C_KCO-TDH-15-008_CP-06.pdf', 'KEN/PCA2018129', '/api/v2/interventions/80/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (531, 'WELTHUNGERHILFE KENYA', 'Civil Society Organization', '2500236885', 'KEN/PCA2018157/PD2018109', 'Signed PD/SSFA', '/api/v2/attachments/file/531/', '', '01 Sep 2018', 531, 'Welthungerhilfe_Tana_River_PCA.pdf', 'KEN/PCA2018157', '/api/v2/interventions/109/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (98, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/98/', '', '29 Mar 2018', 98, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (24, 'CARE INTERNATIONAL IN KENYA', 'Civil Society Organization', '2500228662', '', 'Signed Agreement', '/api/v2/attachments/file/24/', '', '29 Mar 2018', 24, '', 'KEN/PCA20169', '/api/v2/agreements/9/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (25, 'CARITAS SWITZERLAND', 'Civil Society Organization', '2500213527', '', 'Signed Agreement', '/api/v2/attachments/file/25/', '', '29 Mar 2018', 25, '', 'KEN/PCA20168', '/api/v2/agreements/8/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (26, 'INTERNATIONAL RESCUE COMMITTEE', 'Civil Society Organization', '2500218805', '', 'Signed Agreement', '/api/v2/attachments/file/26/', '', '29 Mar 2018', 26, 'IRC_Umbrella_PCA.pdf', 'KEN/PCA20167', '/api/v2/agreements/7/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (28, 'Turkana Education For All ', 'Civil Society Organization', '', '', 'Signed Agreement', '/api/v2/attachments/file/28/', '', '29 Mar 2018', 28, '', 'KEN/PCA20165', '/api/v2/agreements/5/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (30, 'Kenya Primary Headteachers Association', 'Civil Society Organization', '', '', 'Signed Agreement', '/api/v2/attachments/file/30/', '', '29 Mar 2018', 30, '', 'KEN/PCA20151', '/api/v2/agreements/1/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (33, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/33/', '', '29 Mar 2018', 33, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (34, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/34/', '', '29 Mar 2018', 34, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (38, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/38/', '', '29 Mar 2018', 38, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (41, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/41/', '', '29 Mar 2018', 41, 'Annex_E_V8hksow.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (54, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/54/', '', '29 Mar 2018', 54, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (101, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/101/', '', '29 Mar 2018', 101, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (108, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/108/', '', '29 Mar 2018', 108, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (138, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/138/', '', '29 Mar 2018', 138, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (157, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/157/', '', '29 Mar 2018', 157, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (166, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/166/', '', '29 Mar 2018', 166, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (172, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/172/', '', '29 Mar 2018', 172, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (182, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/182/', '', '29 Mar 2018', 182, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (190, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/190/', '', '29 Mar 2018', 190, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (216, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/216/', '', '29 Mar 2018', 216, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (235, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/235/', '', '29 Mar 2018', 235, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (128, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/128/', '', '29 Mar 2018', 128, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (149, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/149/', '', '29 Mar 2018', 149, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (159, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/159/', '', '29 Mar 2018', 159, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (179, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/179/', '', '29 Mar 2018', 179, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (206, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/206/', '', '29 Mar 2018', 206, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (210, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/210/', '', '29 Mar 2018', 210, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (221, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/221/', '', '29 Mar 2018', 221, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (236, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/236/', '', '29 Mar 2018', 236, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (238, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/238/', '', '29 Mar 2018', 238, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (276, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/276/', '', '29 Mar 2018', 276, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (280, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/280/', '', '29 Mar 2018', 280, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (335, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/335/', '', '29 Mar 2018', 335, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (178, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/178/', '', '29 Mar 2018', 178, 'Annex_E_bFGgaL1.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (201, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/201/', '', '29 Mar 2018', 201, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (224, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/224/', '', '29 Mar 2018', 224, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (255, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/255/', '', '29 Mar 2018', 255, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (259, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/259/', '', '29 Mar 2018', 259, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (263, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/263/', '', '29 Mar 2018', 263, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (269, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/269/', '', '29 Mar 2018', 269, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (285, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/285/', '', '29 Mar 2018', 285, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (292, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/292/', '', '29 Mar 2018', 292, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (327, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/327/', '', '29 Mar 2018', 327, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (332, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/332/', '', '29 Mar 2018', 332, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (3, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Signed Agreement', '/api/v2/attachments/file/3/', '', '29 Mar 2018', 3, 'Umbrella_PCA_epVPDP8.pdf', 'KEN/PCA201788', '/api/v2/agreements/88/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (226, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/226/', '', '29 Mar 2018', 226, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (247, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/247/', '', '29 Mar 2018', 247, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (270, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/270/', '', '29 Mar 2018', 270, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (290, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/290/', '', '29 Mar 2018', 290, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (302, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/302/', '', '29 Mar 2018', 302, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (306, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/306/', '', '29 Mar 2018', 306, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (312, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/312/', '', '29 Mar 2018', 312, 'Annex_E_LWu7qfG.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (323, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/323/', '', '29 Mar 2018', 323, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (340, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/340/', '', '29 Mar 2018', 340, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (615, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/615/', '', '25 Oct 2018', 615, 'ART_DCT_report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (349, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Assessment Report', '/api/v2/attachments/file/349/', '', '29 Mar 2018', 349, 'UNICEF_Micro-assessment__bCW3eMJ.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (356, 'ASSOCIAZIONE VOLONTARI PER IL SERVIZIO INTERNAZIONALE', 'Civil Society Organization', '2500215868', '', 'Assessment Report', '/api/v2/attachments/file/356/', '', '29 Mar 2018', 356, 'UNICEF_Micro_Assessment_Final_Report_-_Avsi_Foundation_in_Kenya.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (380, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', 'KEN/PCA201713/TempRef:25', 'PRC Review', '/api/v2/attachments/file/380/', '', '29 Mar 2018', 380, 'Annex_G_KCO-FHK-15-005__Nut_01_Amendment_1.pdf', 'KEN/PCA201776', '/api/v2/interventions/25/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (321, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/321/', '', '29 Mar 2018', 321, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (544, '', '', '', '', '', '/api/v2/attachments/file/544/', 'Rommanah Somba', '13 Sep 2018', 544, 'Annex_C_WERK_xgOtiwa.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (626, 'KEPI KAKAMEGA CENTRAL', 'Government', '2500228575', '', 'Other', '/api/v2/attachments/file/626/', '', '26 Oct 2018', 626, 'DCT_Report.xlsx', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F9%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (350, 'CISP COMITATO INTERNAZIONALE PER LO SVILILUPPO DEI POPOLI', 'Civil Society Organization', '2500213532', '', 'Assessment Report', '/api/v2/attachments/file/350/', '', '29 Mar 2018', 350, 'UNICEF_Micro-assessment__jkzVimc.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (616, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/616/', '', '25 Oct 2018', 616, 'ART_-_Spot_check.zip', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (217, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/217/', '', '29 Mar 2018', 217, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (318, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/318/', '', '29 Mar 2018', 318, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (61, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/61/', '', '29 Mar 2018', 61, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (97, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/97/', '', '29 Mar 2018', 97, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (124, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/124/', '', '29 Mar 2018', 124, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (472, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/472/', '', '06 Jul 2018', 472, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (199, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/199/', '', '29 Mar 2018', 199, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (243, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/243/', '', '29 Mar 2018', 243, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (294, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/294/', '', '29 Mar 2018', 294, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (595, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/595/', '', '05 Oct 2018', 595, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (480, 'ADVENTIST DEV AND RELIEF AGENCY KENYA ADRA KENYA', 'Civil Society Organization', '2500223082', 'KEN/PCA2018124/PD201870', 'Signed PD/SSFA', '/api/v2/attachments/file/480/', '', '27 Jul 2018', 480, 'Annex_C_KCO-ADRA-16-021_CP-02.pdf', 'KEN/PCA2018124', '/api/v2/interventions/70/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (2, 'ASSOCIAZIONE VOLONTARI PER IL SERVIZIO INTERNAZIONALE', 'Civil Society Organization', '2500215868', '', 'Signed Agreement', '/api/v2/attachments/file/2/', '', '29 Mar 2018', 2, 'AVSI_Umbrella_PCA_qG41258.pdf', 'KEN/SSFA201790', '/api/v2/agreements/90/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (8, 'FOOD FOR THE HUNGRY INTERNATIONAL', 'Civil Society Organization', '2500205998', '', 'Signed Agreement', '/api/v2/attachments/file/8/', '', '29 Mar 2018', 8, 'Umbrella_PCA_KCO-FHK-2015-Nut-005_mPmE6CV.pdf', 'KEN/PCA201776', '/api/v2/agreements/76/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (10, 'LVCT HEALTH', 'Civil Society Organization', '2500228916', '', 'Signed Agreement', '/api/v2/attachments/file/10/', '', '29 Mar 2018', 10, 'LVCT_Health_umbrella_PCA__iUvpg31.pdf', 'KEN/PCA201772', '/api/v2/agreements/72/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (11, 'KANACHO NOMADIC EDUCATIONAL FOUNDATION', 'Civil Society Organization', '2500235346', '', 'Signed Agreement', '/api/v2/attachments/file/11/', '', '29 Mar 2018', 11, 'Umbrella_PCA_KCO-KNEF-16-025__a7FUKj4.pdf', 'KEN/PCA201770', '/api/v2/agreements/70/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (19, 'MERLIN KENYA', 'Civil Society Organization', '2500206014', '', 'Signed Agreement', '/api/v2/attachments/file/19/', '', '29 Mar 2018', 19, '', 'KEN/PCA201614', '/api/v2/agreements/14/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (23, 'ACTION AGAINST HUNGER', 'Civil Society Organization', '1900705039', '', 'Signed Agreement', '/api/v2/attachments/file/23/', '', '29 Mar 2018', 23, '', 'KEN/PCA201610', '/api/v2/agreements/10/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (39, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/39/', '', '29 Mar 2018', 39, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (548, 'RURAL ORGANIZATION FOR ADVOCACY AND DEVELOPMENT ROAD', 'Civil Society Organization', '2500231772', '', 'Signed Agreement', '/api/v2/attachments/file/548/', 'Rommanah Somba', '13 Sep 2018', 548, '', 'KEN/PCA2018192', '/api/v2/agreements/192/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (539, '', '', '', '', '', '/api/v2/attachments/file/539/', 'Constance Rose Ngoto', '13 Sep 2018', 539, 'ACF_Umbrella_PCA_2015.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (582, '', '', '', '', '', '/api/v2/attachments/file/582/', 'Nelly Kasina', '19 Sep 2018', 582, 'Umbrella_PCA_GAA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (542, '', '', '', '', '', '/api/v2/attachments/file/542/', 'Rathigadevi Veluppillai', '13 Sep 2018', 542, '1_FCA_Umbrella_PCA_Xk3hqZ3.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (546, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', 'KEN/PCA201705/PD201635-1', '', '/api/v2/attachments/file/546/', 'Rommanah Somba', '13 Sep 2018', 546, 'Annex_G_KCO-WERK-16-029_Edu_-01_Ext_2.pdf', 'KEN/PCA201763', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (593, 'TURKANA EDUCATION FOR ALL', 'Civil Society Organization', '2500220025', '', 'Signed Agreement', '/api/v2/attachments/file/593/', 'Rommanah Somba', '03 Oct 2018', 593, 'TEFA_PCA_2018_7DfuPLj.pdf', 'KEN/PCA20185', '/api/v2/agreements/5/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (192, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/192/', '', '29 Mar 2018', 192, 'Annex_E_KEPSA.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (587, '', '', '', '', '', '/api/v2/attachments/file/587/', 'Nelly Kasina', '19 Sep 2018', 587, 'Umbrella_PCA_PLAN_mO5v0hP.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (588, 'POPULATION SERVICES KENYA', 'Civil Society Organization', '2500233671', '', 'Signed Agreement', '/api/v2/attachments/file/588/', '', '20 Sep 2018', 588, '', 'KEN/PCA2018218', '/api/v2/agreements/218/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (549, '', '', '', '', '', '/api/v2/attachments/file/549/', 'Rommanah Somba', '13 Sep 2018', 549, 'KCO-ROAD-16-033_PtWeNeR.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (550, '', '', '', '', '', '/api/v2/attachments/file/550/', 'Rommanah Somba', '13 Sep 2018', 550, 'KCO-ROAD-16-033_sV8TJZI.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (551, '', '', '', '', '', '/api/v2/attachments/file/551/', 'Rommanah Somba', '13 Sep 2018', 551, 'KCO-ROAD-16-033_LMxOFxc.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (552, '', '', '', '', '', '/api/v2/attachments/file/552/', 'Rommanah Somba', '13 Sep 2018', 552, 'KCO-ROAD-16-033_daGLMZ7.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (553, '', '', '', '', '', '/api/v2/attachments/file/553/', 'Rommanah Somba', '13 Sep 2018', 553, 'KCO-ROAD-16-033_xHfk6lN.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (599, 'ANNOS ONE FINE DAY', 'Civil Society Organization', '2500239296', '', 'Signed Agreement', '/api/v2/attachments/file/599/', '', '12 Oct 2018', 599, '', 'KEN/PCA2018225', '/api/v2/agreements/225/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (554, '', '', '', '', '', '/api/v2/attachments/file/554/', 'Rommanah Somba', '13 Sep 2018', 554, 'KCO-ROAD-16-033_AUsY6zn.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (555, '', '', '', '', '', '/api/v2/attachments/file/555/', 'Rommanah Somba', '13 Sep 2018', 555, 'KCO-ROAD-16-033_955qoFq.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (556, '', '', '', '', '', '/api/v2/attachments/file/556/', 'Rommanah Somba', '13 Sep 2018', 556, 'KCO-ROAD-16-033_0XhmgkR.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (557, '', '', '', '', '', '/api/v2/attachments/file/557/', 'Rommanah Somba', '13 Sep 2018', 557, 'KCO-ROAD-16-033_e6MuBFx.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (558, '', '', '', '', '', '/api/v2/attachments/file/558/', 'Rommanah Somba', '13 Sep 2018', 558, 'KCO-ROAD-16-033_p8HxZka.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (583, '', '', '', '', '', '/api/v2/attachments/file/583/', 'Nelly Kasina', '19 Sep 2018', 583, 'Umbrella_PCA_GAA_N2NHZh2.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (560, '', '', '', '', '', '/api/v2/attachments/file/560/', 'Rommanah Somba', '13 Sep 2018', 560, 'KCO-ROAD-16-033_oRL4okW.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (572, 'AGA KHAN FOUNDATION', 'Civil Society Organization', '2500236853', '', 'Signed Agreement', '/api/v2/attachments/file/572/', 'Rommanah Somba', '13 Sep 2018', 572, '', 'KEN/PCA2018207', '/api/v2/agreements/207/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (561, '', '', '', '', '', '/api/v2/attachments/file/561/', 'Rommanah Somba', '13 Sep 2018', 561, 'KCO-ROAD-16-033_B7GUn50.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (562, '', '', '', '', '', '/api/v2/attachments/file/562/', 'Rommanah Somba', '13 Sep 2018', 562, 'KCO-ROAD-16-033_9fQyusQ.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (589, 'KENYA RED CROSS SOCIETY', 'Civil Society Organization', '2500206002', '', 'Signed Agreement', '/api/v2/attachments/file/589/', '', '20 Sep 2018', 589, '', 'KEN/PCA2018217', '/api/v2/agreements/217/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (564, '', '', '', '', '', '/api/v2/attachments/file/564/', 'Rathigadevi Veluppillai', '13 Sep 2018', 564, 'Childfund_PD.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (559, 'WINDLE INTERNATIONAL KENYA', 'Civil Society Organization', '2500231115', '', 'Signed Agreement', '/api/v2/attachments/file/559/', 'Rommanah Somba', '13 Sep 2018', 559, '', 'KEN/PCA2018199', '/api/v2/agreements/199/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (565, '', '', '', '', '', '/api/v2/attachments/file/565/', 'Rathigadevi Veluppillai', '13 Sep 2018', 565, 'Childfund_PD_UpdvQgy.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (563, 'TURKANA EDUCATION FOR ALL', 'Civil Society Organization', '2500220025', '', 'Signed Agreement', '/api/v2/attachments/file/563/', 'Rathigadevi Veluppillai', '13 Sep 2018', 563, '', 'KEN/PCA2018186', '/api/v2/agreements/186/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (566, '', '', '', '', '', '/api/v2/attachments/file/566/', 'Rathigadevi Veluppillai', '13 Sep 2018', 566, 'Childfund_PD_nHCjOJr.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (576, 'ACAKORO COMMUNITY BASED ORGANIZATION', 'Civil Society Organization', '2500238610', '', 'Signed Agreement', '/api/v2/attachments/file/576/', '', '14 Sep 2018', 576, '', 'KEN/SSFA2018185', '/api/v2/agreements/185/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (567, '', '', '', '', '', '/api/v2/attachments/file/567/', 'Rathigadevi Veluppillai', '13 Sep 2018', 567, 'Childfund_PD_xUleOkM.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (568, '', '', '', '', '', '/api/v2/attachments/file/568/', 'Rathigadevi Veluppillai', '13 Sep 2018', 568, 'Childfund_PD_mAYTwdm.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (577, 'KENYA PRIVATE SECTOR ALLIANCE', 'Civil Society Organization', '2500222950', '', 'Signed Agreement', '/api/v2/attachments/file/577/', '', '14 Sep 2018', 577, '', 'KEN/PCA2018184', '/api/v2/agreements/184/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (569, '', '', '', '', '', '/api/v2/attachments/file/569/', 'Rathigadevi Veluppillai', '13 Sep 2018', 569, 'Childfund_PD_UwnIwnm.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (570, '', '', '', '', '', '/api/v2/attachments/file/570/', 'Rathigadevi Veluppillai', '13 Sep 2018', 570, 'Childfund_PD_aRdLwHG.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (545, 'KENYA PRIVATE SECTOR ALLIANCE', 'Civil Society Organization', '2500222950', '', 'Signed Agreement', '/api/v2/attachments/file/545/', 'Constance Rose Ngoto', '13 Sep 2018', 545, '', 'KEN/PCA2018183', '/api/v2/agreements/183/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (543, 'WOMEN EDUCATIONAL RESEARCHERS OF KENYA', 'Civil Society Organization', '2500233665', '', 'Signed Agreement', '/api/v2/attachments/file/543/', 'Rommanah Somba', '13 Sep 2018', 543, '', 'KEN/PCA2018182', '/api/v2/agreements/182/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (571, '', '', '', '', '', '/api/v2/attachments/file/571/', 'Rathigadevi Veluppillai', '13 Sep 2018', 571, 'Childfund_PD_fPZpJTk.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (573, '', '', '', '', '', '/api/v2/attachments/file/573/', 'Rommanah Somba', '13 Sep 2018', 573, 'KCO-AKF-17-026_1q9oEjZ.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (504, 'FRANCIS XAVIER PROJECT', 'Civil Society Organization', '2500235580', '', 'Signed Agreement', '/api/v2/attachments/file/504/', '', '30 Aug 2018', 504, 'Umbrella_PCA_AmuitDF.pdf', 'KEN/PCA2016145', '/api/v2/agreements/145/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (486, 'WAJIR SOUTH DEVELOPMENT ASSOCIATION WASDA KENYA', 'Civil Society Organization', '2500234097', '', 'Signed Agreement', '/api/v2/attachments/file/486/', '', '08 Aug 2018', 486, '', 'KEN/SSFA2018130', '/api/v2/agreements/130/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (590, 'INTERNATIONAL RESCUE COMMITTEE', 'Civil Society Organization', '2500218805', '', 'Signed Agreement', '/api/v2/attachments/file/590/', '', '20 Sep 2018', 590, '', 'KEN/PCA2018216', '/api/v2/agreements/216/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (586, 'PLAN INTERNATIONAL', 'Civil Society Organization', '2500212836', '', 'Signed Agreement', '/api/v2/attachments/file/586/', 'Nelly Kasina', '19 Sep 2018', 586, '', 'KEN/PCA2018214', '/api/v2/agreements/214/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (585, 'FINN CHURCH AID', 'Civil Society Organization', '2500206025', '', 'Signed Agreement', '/api/v2/attachments/file/585/', 'Nelly Kasina', '19 Sep 2018', 585, '', 'KEN/PCA2018213', '/api/v2/agreements/213/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (584, 'NORWEGIAN REFUGEE COUNCIL', 'Civil Society Organization', '2500217623', '', 'Signed Agreement', '/api/v2/attachments/file/584/', 'Nelly Kasina', '19 Sep 2018', 584, '', 'KEN/PCA2018212', '/api/v2/agreements/212/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (581, 'OXFAM KENYA', 'Civil Society Organization', '2500219188', '', 'Signed Agreement', '/api/v2/attachments/file/581/', 'Nelly Kasina', '19 Sep 2018', 581, '', 'KEN/PCA2018209', '/api/v2/agreements/209/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (578, 'CONCERN WORLDWIDE', 'Civil Society Organization', '2500218361', '', 'Signed Agreement', '/api/v2/attachments/file/578/', '', '14 Sep 2018', 578, '', 'KEN/PCA2018169', '/api/v2/agreements/169/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (331, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/331/', '', '29 Mar 2018', 331, 'Annex_E_WASDA.pdf', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (596, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/596/', '', '05 Oct 2018', 596, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (597, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/597/', '', '05 Oct 2018', 597, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (528, 'NATIONAL EMPOWERMENT NETWORK OF PEOPLE LIVING WITH HIV AIDS IN KENYA', 'Civil Society Organization', '2500230697', '', 'Signed Agreement', '/api/v2/attachments/file/528/', '', '01 Sep 2018', 528, '', 'KEN/SSFA2018165', '/api/v2/agreements/165/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (601, '', '', '', '', '', '/api/v2/attachments/file/601/', 'Joy Nafungo', '17 Oct 2018', 601, 'Scanned_Child_Fund_Umbrella_PCA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (602, '', '', '', '', '', '/api/v2/attachments/file/602/', 'Joy Nafungo', '17 Oct 2018', 602, 'Scanned_Child_Fund_Umbrella_PCA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (600, '', '', '', '', 'Core Values Assessment', '/api/v2/attachments/file/600/', '', '17 Oct 2018', 600, '', '', '', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (603, '', '', '', '', '', '/api/v2/attachments/file/603/', 'Joy Nafungo', '18 Oct 2018', 603, 'Scanned_Waldorf_PCA.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (605, '', '', '', '', '', '/api/v2/attachments/file/605/', 'Joy Nafungo', '18 Oct 2018', 605, 'Scanned_Waldorf_PCA_AlHpH4K.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (604, 'WALDORF KAKUMA AGENCIES', 'Civil Society Organization', '2500237248', '', 'Signed Agreement', '/api/v2/attachments/file/604/', 'Joy Nafungo', '18 Oct 2018', 604, '', 'KEN/PCA2018227', '/api/v2/agreements/227/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (606, '', '', '', '', '', '/api/v2/attachments/file/606/', 'Joy Nafungo', '18 Oct 2018', 606, 'Scanned_Waldorf_PCA_lxYyHmS.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (609, 'WALDORF KAKUMA AGENCIES', 'Civil Society Organization', '2500237248', '', 'Signed Agreement', '/api/v2/attachments/file/609/', 'Joy Nafungo', '18 Oct 2018', 609, '', 'KEN/PCA2018226', '/api/v2/agreements/226/', 'Partnership Management Portal', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (607, '', '', '', '', '', '/api/v2/attachments/file/607/', 'Joy Nafungo', '18 Oct 2018', 607, 'Scanned_Waldorf_PCA_J0TpY3J.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (608, '', '', '', '', '', '/api/v2/attachments/file/608/', 'Joy Nafungo', '18 Oct 2018', 608, 'Scanned_Waldorf_PCA_2EyUK31.pdf', '', '', '', NULL); +INSERT INTO [[schema]].attachments_attachmentflat VALUES (617, 'AFRICAN RANGELANDS', 'Civil Society Organization', '2500234724', '', 'Other', '/api/v2/attachments/file/617/', '', '25 Oct 2018', 617, 'UNICEF_Micro_Assessment_Final_Report_-_African_Rangeland_Trust.pdf', '', 'https://etools.unicef.org/login/?next=%2Fusers%2Fapi%2Fchangecountry%2F%3Fcountry%3D5%26next%3D%252Fap%252Faudits%252F7%252Foverview', 'Financial Assurance (FAM)', NULL); -- @@ -6322,6 +6165,25 @@ INSERT INTO [[schema]].django_migrations VALUES (419, 'django_celery_beat', '000 INSERT INTO [[schema]].django_migrations VALUES (420, 'django_celery_beat', '0006_auto_20180210_1226', '2018-03-15 16:44:51.009345+00'); INSERT INTO [[schema]].django_migrations VALUES (421, 'django_celery_results', '0001_initial', '2018-03-15 16:44:51.063593+00'); INSERT INTO [[schema]].django_migrations VALUES (422, 'drfpasswordless', '0001_initial', '2018-03-15 16:44:51.559508+00'); +INSERT INTO [[schema]].django_migrations VALUES (625, 'EquiTrack', '0001_initial', '2019-01-07 13:27:29.99044+00'); +INSERT INTO [[schema]].django_migrations VALUES (626, 'attachments', '0013_attachmentflat_pd_ssfa', '2019-01-07 13:27:30.052961+00'); +INSERT INTO [[schema]].django_migrations VALUES (627, 'audit', '0012_auto_20181229_0249', '2019-01-07 13:27:30.14846+00'); +INSERT INTO [[schema]].django_migrations VALUES (628, 'auth', '0009_alter_user_last_name_max_length', '2019-01-07 13:27:30.198427+00'); +INSERT INTO [[schema]].django_migrations VALUES (629, 'django_celery_beat', '0006_auto_20180322_0932', '2019-01-07 13:27:30.28816+00'); +INSERT INTO [[schema]].django_migrations VALUES (630, 'django_celery_beat', '0007_auto_20180521_0826', '2019-01-07 13:27:30.348483+00'); +INSERT INTO [[schema]].django_migrations VALUES (631, 'django_celery_beat', '0008_auto_20180914_1922', '2019-01-07 13:27:30.450293+00'); +INSERT INTO [[schema]].django_migrations VALUES (632, 'locations', '0005_auto_20181206_1127', '2019-01-07 13:27:30.516465+00'); +INSERT INTO [[schema]].django_migrations VALUES (633, 'partners', '0028_auto_20181108_1503', '2019-01-07 13:27:31.252504+00'); +INSERT INTO [[schema]].django_migrations VALUES (634, 'partners', '0029_interventionattachment_active', '2019-01-07 13:27:31.428648+00'); +INSERT INTO [[schema]].django_migrations VALUES (635, 'partners', '0030_assessment_active', '2019-01-07 13:27:31.566373+00'); +INSERT INTO [[schema]].django_migrations VALUES (636, 'permissions2', '0003_auto_20181229_0249', '2019-01-07 13:27:31.604387+00'); +INSERT INTO [[schema]].django_migrations VALUES (637, 'post_office', '0007_auto_20170731_1342', '2019-01-07 13:27:31.648863+00'); +INSERT INTO [[schema]].django_migrations VALUES (638, 'reports', '0014_auto_20181229_0249', '2019-01-07 13:27:31.826778+00'); +INSERT INTO [[schema]].django_migrations VALUES (639, 't2f', '0009_auto_20181227_0815', '2019-01-07 13:27:31.923947+00'); +INSERT INTO [[schema]].django_migrations VALUES (640, 't2f', '0010_auto_20181229_0249', '2019-01-07 13:27:32.247947+00'); +INSERT INTO [[schema]].django_migrations VALUES (641, 't2f', '0011_auto_20190102_1919', '2019-01-07 13:27:33.856841+00'); +INSERT INTO [[schema]].django_migrations VALUES (642, 'users', '0006_auto_20181016_1319', '2019-01-07 13:27:33.895701+00'); +INSERT INTO [[schema]].django_migrations VALUES (643, 'users', '0007_remove_country_domain_url', '2019-01-07 13:27:33.975846+00'); -- @@ -14022,25 +13884,25 @@ INSERT INTO [[schema]].partners_agreementamendment VALUES (1, '2018-03-26 13:46: -- Data for Name: partners_assessment; Type: TABLE DATA; Schema: [[schema]]; Owner: - -- -INSERT INTO [[schema]].partners_assessment VALUES (1, 'Micro Assessment', '', NULL, '', '2016-09-06', NULL, '2016-09-06', 'high', '', true, NULL, 30, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (2, 'Micro Assessment', '', NULL, '', '2017-03-31', NULL, '2016-01-02', 'high', '[[schema]]/file_attachments/partner_organizations/274/assesments/None/AMREF_UNICEF_Microasses_MhHoxth.pdf', true, NULL, 274, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (3, 'Micro Assessment', '', NULL, '', '2017-04-10', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/13/assesments/None/UNICEF_Micro_Assessment__3Zw0DFk.pdf', true, NULL, 13, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (4, 'Micro Assessment', '', NULL, '', '2017-04-18', NULL, '2015-09-23', 'high', '[[schema]]/file_attachments/partner_organizations/21/assesments/None/UNICEF_Micro_Assessment__jLp4s6s.pdf', true, NULL, 21, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (5, 'Micro Assessment', '', NULL, '', '2017-04-20', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/39/assesments/None/UNICEF_Micro_Assessment__PnZmAKw.pdf', true, NULL, 39, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (6, 'Micro Assessment', '', NULL, '', '2017-04-21', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/27/assesments/6/UNICEF_Micro_Assessment_Fin_2xzMTuw.pdf', false, NULL, 27, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (7, 'Micro Assessment', '', NULL, '', '2017-04-21', NULL, '2015-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/273/assesments/None/UNICEF_Micro_Assessment_gK7sYIc.pdf', true, NULL, 273, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (8, 'Special Audit report', '', NULL, '', '2017-04-21', NULL, '2015-12-31', 'high', '[[schema]]/file_attachments/partner_organizations/273/assesments/None/2015_Audit_Report.pdf', false, NULL, 273, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (9, 'Micro Assessment', '', NULL, '', '2017-04-24', NULL, '2016-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/25/assesments/None/UNICEF_Micro-assessment__bCW3eMJ.pdf', true, NULL, 25, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (10, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2015-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/92/assesments/None/UNICEF_Micro-assessment__jkzVimc.pdf', true, NULL, 92, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (11, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/18/assesments/None/UNICEF_Micro_Assessment__quOhWUA.pdf', true, NULL, 18, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (12, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2016-07-29', 'high', '[[schema]]/file_attachments/partner_organizations/270/assesments/None/UNICEF_Micro_Assessment_dUwbBYx.pdf', true, NULL, 270, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (13, 'Micro Assessment', '', NULL, '', '2017-07-06', NULL, '2015-10-30', 'high', '[[schema]]/file_attachments/partner_organizations/14/assesments/None/7._UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_TDH_Final_301015.pdf', true, NULL, 14, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (14, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/111/assesments/None/UNICEF_Micro-assessment_final_report_-_BBCMA-K.pdf', true, NULL, 111, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (15, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2015-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/22/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Windle_Trust_Kenya.pdf', true, NULL, 22, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (16, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/24/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Avsi_Foundation_in_Kenya.pdf', false, NULL, 24, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (17, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-12-13', 'high', '[[schema]]/file_attachments/partner_organizations/114/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Women_Educational_Researchers_of_Kenya.pdf', true, NULL, 114, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (18, 'Micro Assessment', '', NULL, '', '2017-07-11', NULL, '2016-07-14', 'high', '', true, NULL, 56, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); -INSERT INTO [[schema]].partners_assessment VALUES (19, 'Micro Assessment', '', NULL, '', '2017-07-11', NULL, '2016-01-19', 'high', '[[schema]]/file_attachments/partner_organizations/15/assesments/19/World_Vision_Kenya_UNICEF_Microassessment_report_-_Final.pdf', true, NULL, 15, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00'); +INSERT INTO [[schema]].partners_assessment VALUES (1, 'Micro Assessment', '', NULL, '', '2016-09-06', NULL, '2016-09-06', 'high', '', true, NULL, 30, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (2, 'Micro Assessment', '', NULL, '', '2017-03-31', NULL, '2016-01-02', 'high', '[[schema]]/file_attachments/partner_organizations/274/assesments/None/AMREF_UNICEF_Microasses_MhHoxth.pdf', true, NULL, 274, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (3, 'Micro Assessment', '', NULL, '', '2017-04-10', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/13/assesments/None/UNICEF_Micro_Assessment__3Zw0DFk.pdf', true, NULL, 13, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (4, 'Micro Assessment', '', NULL, '', '2017-04-18', NULL, '2015-09-23', 'high', '[[schema]]/file_attachments/partner_organizations/21/assesments/None/UNICEF_Micro_Assessment__jLp4s6s.pdf', true, NULL, 21, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (5, 'Micro Assessment', '', NULL, '', '2017-04-20', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/39/assesments/None/UNICEF_Micro_Assessment__PnZmAKw.pdf', true, NULL, 39, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (6, 'Micro Assessment', '', NULL, '', '2017-04-21', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/27/assesments/6/UNICEF_Micro_Assessment_Fin_2xzMTuw.pdf', false, NULL, 27, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (7, 'Micro Assessment', '', NULL, '', '2017-04-21', NULL, '2015-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/273/assesments/None/UNICEF_Micro_Assessment_gK7sYIc.pdf', true, NULL, 273, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (8, 'Special Audit report', '', NULL, '', '2017-04-21', NULL, '2015-12-31', 'high', '[[schema]]/file_attachments/partner_organizations/273/assesments/None/2015_Audit_Report.pdf', false, NULL, 273, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (9, 'Micro Assessment', '', NULL, '', '2017-04-24', NULL, '2016-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/25/assesments/None/UNICEF_Micro-assessment__bCW3eMJ.pdf', true, NULL, 25, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (10, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2015-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/92/assesments/None/UNICEF_Micro-assessment__jkzVimc.pdf', true, NULL, 92, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (11, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2015-10-23', 'high', '[[schema]]/file_attachments/partner_organizations/18/assesments/None/UNICEF_Micro_Assessment__quOhWUA.pdf', true, NULL, 18, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (12, 'Micro Assessment', '', NULL, '', '2017-04-25', NULL, '2016-07-29', 'high', '[[schema]]/file_attachments/partner_organizations/270/assesments/None/UNICEF_Micro_Assessment_dUwbBYx.pdf', true, NULL, 270, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (13, 'Micro Assessment', '', NULL, '', '2017-07-06', NULL, '2015-10-30', 'high', '[[schema]]/file_attachments/partner_organizations/14/assesments/None/7._UNICEF_Kenya_Micro_Assessment_Ex__Summary_Report_for_TDH_Final_301015.pdf', true, NULL, 14, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (14, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-01-25', 'high', '[[schema]]/file_attachments/partner_organizations/111/assesments/None/UNICEF_Micro-assessment_final_report_-_BBCMA-K.pdf', true, NULL, 111, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (15, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2015-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/22/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Windle_Trust_Kenya.pdf', true, NULL, 22, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (16, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-07-14', 'high', '[[schema]]/file_attachments/partner_organizations/24/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Avsi_Foundation_in_Kenya.pdf', false, NULL, 24, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (17, 'Micro Assessment', '', NULL, '', '2017-07-10', NULL, '2016-12-13', 'high', '[[schema]]/file_attachments/partner_organizations/114/assesments/None/UNICEF_Micro_Assessment_Final_Report_-_Women_Educational_Researchers_of_Kenya.pdf', true, NULL, 114, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (18, 'Micro Assessment', '', NULL, '', '2017-07-11', NULL, '2016-07-14', 'high', '', true, NULL, 56, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); +INSERT INTO [[schema]].partners_assessment VALUES (19, 'Micro Assessment', '', NULL, '', '2017-07-11', NULL, '2016-01-19', 'high', '[[schema]]/file_attachments/partner_organizations/15/assesments/19/World_Vision_Kenya_UNICEF_Microassessment_report_-_Final.pdf', true, NULL, 15, NULL, '2018-03-15 16:45:15.86156+00', '2018-03-15 16:45:16.233251+00', true); -- @@ -14809,12 +14671,12 @@ INSERT INTO [[schema]].partners_interventionamendment VALUES (3, '2018-10-11 08: -- Data for Name: partners_interventionattachment; Type: TABLE DATA; Schema: [[schema]]; Owner: - -- -INSERT INTO [[schema]].partners_interventionattachment VALUES (30, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/Annex_C_Education-01.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00'); -INSERT INTO [[schema]].partners_interventionattachment VALUES (31, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/Annex_G_-_WERK.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00'); -INSERT INTO [[schema]].partners_interventionattachment VALUES (32, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/THE_WERK_REGISTRATION_CERTIFICATE_-_151025.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00'); -INSERT INTO [[schema]].partners_interventionattachment VALUES (69, '[[schema]]/file_attachments/partner_organization/22/agreements/199/interventions/137/attachments/None/WIK_Simplified_Review_Form_2018.pdf', 137, 141, '2018-10-11 08:03:03.955808+00', '2018-10-11 08:03:03.956407+00'); -INSERT INTO [[schema]].partners_interventionattachment VALUES (68, '[[schema]]/file_attachments/partner_organization/391/agreements/223/interventions/131/attachments/None/Annex_E_and_partner_registration.pdf', 131, 141, '2018-10-03 10:11:42.443459+00', '2018-10-03 10:11:53.216492+00'); -INSERT INTO [[schema]].partners_interventionattachment VALUES (70, '[[schema]]/file_attachments/partner_organization/274/agreements/49/interventions/85/attachments/None/NFR_for_No_Cost_extension_AMREF.PDF', 85, 141, '2018-10-22 04:50:16.567754+00', '2018-10-22 04:50:16.569254+00'); +INSERT INTO [[schema]].partners_interventionattachment VALUES (30, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/Annex_C_Education-01.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00', true); +INSERT INTO [[schema]].partners_interventionattachment VALUES (31, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/Annex_G_-_WERK.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00', true); +INSERT INTO [[schema]].partners_interventionattachment VALUES (32, '[[schema]]/file_attachments/partner_organization/114/agreements/63/interventions/35/attachments/None/THE_WERK_REGISTRATION_CERTIFICATE_-_151025.pdf', 35, 139, '2017-10-20 15:58:57.395837+00', '2017-10-20 15:58:57.734577+00', true); +INSERT INTO [[schema]].partners_interventionattachment VALUES (69, '[[schema]]/file_attachments/partner_organization/22/agreements/199/interventions/137/attachments/None/WIK_Simplified_Review_Form_2018.pdf', 137, 141, '2018-10-11 08:03:03.955808+00', '2018-10-11 08:03:03.956407+00', true); +INSERT INTO [[schema]].partners_interventionattachment VALUES (68, '[[schema]]/file_attachments/partner_organization/391/agreements/223/interventions/131/attachments/None/Annex_E_and_partner_registration.pdf', 131, 141, '2018-10-03 10:11:42.443459+00', '2018-10-03 10:11:53.216492+00', true); +INSERT INTO [[schema]].partners_interventionattachment VALUES (70, '[[schema]]/file_attachments/partner_organization/274/agreements/49/interventions/85/attachments/None/NFR_for_No_Cost_extension_AMREF.PDF', 85, 141, '2018-10-22 04:50:16.567754+00', '2018-10-22 04:50:16.569254+00', true); -- @@ -14936,22 +14798,6 @@ INSERT INTO [[schema]].partners_interventionresultlink_ram_indicators VALUES (78 INSERT INTO [[schema]].partners_interventionresultlink_ram_indicators VALUES (79, 52, 92); --- --- Data for Name: partners_interventionsectorlocationlink; Type: TABLE DATA; Schema: [[schema]]; Owner: - --- - -INSERT INTO [[schema]].partners_interventionsectorlocationlink VALUES (43, 35, 1, '2018-03-15 16:45:19.220663+00', '2018-03-15 16:45:19.502128+00'); -INSERT INTO [[schema]].partners_interventionsectorlocationlink VALUES (33, 25, 6, '2018-03-15 16:45:19.220663+00', '2018-03-15 16:45:19.502128+00'); - - --- --- Data for Name: partners_interventionsectorlocationlink_locations; Type: TABLE DATA; Schema: [[schema]]; Owner: - --- - -INSERT INTO [[schema]].partners_interventionsectorlocationlink_locations VALUES (50, 33, 25); -INSERT INTO [[schema]].partners_interventionsectorlocationlink_locations VALUES (98, 43, 30); - - -- -- Data for Name: partners_partnerorganization; Type: TABLE DATA; Schema: [[schema]]; Owner: - -- @@ -41985,358 +41831,6 @@ INSERT INTO [[schema]].t2f_expense VALUES (63, 38000.0000, NULL, 211, 1); INSERT INTO [[schema]].t2f_expense VALUES (64, 15000.0000, NULL, 211, 3); --- --- Data for Name: t2f_invoice; Type: TABLE DATA; Schema: [[schema]]; Owner: - --- - -INSERT INTO [[schema]].t2f_invoice VALUES (1, '2400/2017/1/01', '2400', 'S00626102', 10455.0000, 'pending', '', 89, 538, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (93, '2400/2017/175/01', '2400', 'S00947674', 162900.0000, 'pending', '', 89, 613, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (125, '2400/2017/265/01', '2400', 'S00544404', 29520.0000, 'pending', '', 89, 231, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (190, '2400/2017/241/01', '2400', 'S00560225', 41820.0000, 'pending', '', 89, 254, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (299, '2400/2016/223/01', '2400', 'S00288435', 577800.0000, 'pending', '', 89, 272, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (180, '2400/2016/146/01', '2400', 'S00506253', 108800.0000, 'pending', '', 89, 349, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (193, '2400/2016/153/01', '2400', 'S00560225', 54120.0000, 'pending', '', 89, 342, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (18, '2400/2017/76/18', '2400', 'Traveler - Terminal Cost', 15000.0000, 'pending', '', 89, 572, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (19, '2400/2017/76/19', '2400', 'S00626102', 133940.0000, 'pending', '', 89, 572, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (20, '2400/2017/75/20', '2400', 'S00146907', 29520.0000, 'pending', '', 89, 571, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (23, '2400/2017/82/23', '2400', 'S00499006', 4920.0000, 'pending', '', 89, 575, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (24, '2400/2017/87/24', '2400', 'S00499006', 3360.0000, 'pending', '', 89, 580, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (236, '2400/2017/382/01', '2400', 'S00593245', 59220.0000, 'pending', '', 89, 114, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (237, '2400/2016/70/01', '2400', 'S00630877', 204800.0000, 'pending', '', 89, 425, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (240, '2400/2016/166/01', '2400', 'S00630877', 108800.0000, 'pending', '', 89, 329, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (66, '2400/2017/29/01', '2400', 'S00634151', 55200.0000, 'pending', '', 89, 558, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (29, '2400/2017/74/29', '2400', 'S00497311', 48585.0000, 'pending', '', 89, 570, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (76, '2400/2017/67/01', '2400', 'S00801811', 4920.0000, 'pending', '', 89, 563, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (32, '2400/2017/135/32', '2400', 'S00596148', 29520.0000, 'pending', '', 89, 597, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (73, '2400/2017/208/01', '2400', 'S00499006', 83640.0000, 'pending', '', 89, 628, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (221, '2400/2017/392/01', '2400', 'S00918321', 140220.0000, 'pending', '', 89, 104, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (185, '2400/2017/434/01', '2400', 'S00925957', 20160.0000, 'pending', '', 89, 94, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (194, '2400/2016/138/01', '2400', 'S00653997', 54120.0000, 'pending', '', 89, 357, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (65, '2400/2017/85/01', '2400', 'S00497311', 143750.0000, 'pending', '', 89, 578, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (217, '2400/2017/249/01', '2400', 'S00413939', 47080.0000, 'pending', '', 89, 246, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (220, '2400/2016/137/01', '2400', 'S00241049', 54120.0000, 'pending', '', 89, 358, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (78, '2400/2016/1/01', '2400', 'S00017136', 66420.0000, 'pending', '', 89, 489, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (79, '2400/2016/1/02', '2400', 'Traveler - Other Costs', 1.0000, 'pending', '', 89, 489, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (72, '2400/2017/27/01', '2400', 'S00918321', 78720.0000, 'pending', '', 89, 556, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (176, '2400/2017/49/01', '2400', 'S00245352', 78720.0000, 'pending', '', 89, 561, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (92, '2400/2017/8/01', '2400', 'S00651796', 47080.0000, 'pending', '', 89, 545, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (126, '2400/2017/499/01', '2400', 'S00544404', 41820.0000, 'pending', '', 89, 29, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (127, '2400/2017/267/01', '2400', 'S00544404', 17220.0000, 'pending', '', 89, 229, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (226, '2400/2017/334/01', '2400', 'S00561042', 29520.0000, 'pending', '', 89, 162, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (84, '2400/2017/31/01', '2400', 'S00146907', 78720.0000, 'pending', '', 89, 560, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (300, '2400/2017/481/01', '2400', 'S00804830', 9201.0000, 'pending', '', 89, 47, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (91, '2400/2017/607/03', '2400', 'S00925957', 29520.0000, 'pending', '', 89, 871, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (130, '2400/2016/91/01', '2400', 'S00590797', 14980.0000, 'pending', '', 89, 404, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (129, '2400/2016/111/01', '2400', 'S00925957', 14980.0000, 'pending', '', 89, 384, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (131, '2400/2016/213/01', '2400', 'S00590797', 29520.0000, 'pending', '', 89, 282, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (238, '2400/2016/121/01', '2400', 'S00630877', 78720.0000, 'pending', '', 89, 374, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (241, '2400/2016/208/01', '2400', 'S00630877', 41820.0000, 'pending', '', 89, 287, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (218, '2400/2017/248/01', '2400', 'S00241049', 47080.0000, 'pending', '', 89, 247, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (132, '2400/2017/355/01', '2400', 'S00590797', 47080.0000, 'pending', '', 89, 141, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (243, '2400/2016/193/01', '2400', 'S00593245', 91020.0000, 'pending', '', 89, 302, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (224, '2400/2016/198/01', '2400', 'S00918321', 78720.0000, 'pending', '', 89, 297, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (181, '2400/2016/196/01', '2400', 'S00506253', 108800.0000, 'pending', '', 89, 299, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (183, '2400/2016/136/01', '2400', 'S00925957', 46560.0000, 'pending', '', 89, 359, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (233, '2400/2017/505/01', '2400', 'S00660040', 140800.0000, 'pending', '', 89, 23, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (195, '2400/2016/165/01', '2400', 'S00653997', 25680.0000, 'pending', '', 89, 330, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (197, '2400/2017/385/01', '2400', 'S00653997', 57100.0000, 'pending', '', 89, 111, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (199, '2400/2017/269/01', '2400', 'S00060955', 57780.0000, 'pending', '', 89, 227, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (201, '2400/2016/217/01', '2400', 'S00060955', 29520.0000, 'pending', '', 89, 278, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (112, '2400/2016/179/01', '2400', 'S00980678', 106300.0000, 'pending', '', 89, 316, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (113, '2400/2016/191/01', '2400', 'S00980678', 108800.0000, 'pending', '', 89, 304, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (114, '2400/2016/218/01', '2400', 'S00980678', 78720.0000, 'pending', '', 89, 277, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (115, '2400/2017/277/01', '2400', 'S00980678', 41820.0000, 'pending', '', 89, 219, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (116, '2400/2016/222/01', '2400', 'S00072619', 98420.0000, 'pending', '', 89, 273, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (191, '2400/2016/199/01', '2400', 'S00560225', 29520.0000, 'pending', '', 89, 296, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (204, '2400/2017/250/01', '2400', 'S00609095', 47080.0000, 'pending', '', 89, 245, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (119, '2400/2017/14/01', '2400', 'S00808934', 4920.0000, 'pending', '', 89, 551, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (120, '2400/2016/207/01', '2400', 'S00808934', 29520.0000, 'pending', '', 89, 288, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (121, '2400/2017/301/01', '2400', 'S00808934', 29520.0000, 'pending', '', 89, 195, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (122, '2400/2017/302/01', '2400', 'S00808934', 54120.0000, 'pending', '', 89, 194, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (123, '2400/2016/157/01', '2400', 'S00544404', 29520.0000, 'pending', '', 89, 338, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (124, '2400/2016/178/01', '2400', 'S00544404', 76800.0000, 'pending', '', 89, 317, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (235, '2400/2016/106/01', '2400', 'S00660040', 140800.0000, 'pending', '', 89, 389, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (245, '2400/2017/323/01', '2400', 'S00593245', 173800.0000, 'pending', '', 89, 173, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (247, '2400/2016/76/01', '2400', 'S00778938', 20160.0000, 'pending', '', 89, 419, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (249, '2400/2016/145/01', '2400', 'S00933518', 86420.0000, 'pending', '', 89, 350, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (251, '2400/2017/477/01', '2400', 'S00933518', 45360.0000, 'pending', '', 89, 51, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (253, '2400/2017/479/01', '2400', 'S00505737', 53760.0000, 'pending', '', 89, 49, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (255, '2400/2017/276/01', '2400', 'S00505737', 130420.0000, 'pending', '', 89, 220, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (257, '2400/2016/143/01', '2400', 'S00577341', 66420.0000, 'pending', '', 89, 352, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (143, '2400/2016/214/01', '2400', 'S00413939', 52220.0000, 'pending', '', 89, 281, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (259, '2400/2017/235/01', '2400', 'S00577341', 54120.0000, 'pending', '', 89, 260, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (145, '2400/2017/498/01', '2400', 'S00413939', 222800.0000, 'pending', '', 89, 30, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (146, '2400/2016/117/01', '2400', 'S00628160', 76820.0000, 'pending', '', 89, 378, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (261, '2400/2017/357/01', '2400', 'S00577341', 45360.0000, 'pending', '', 89, 139, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (263, '2400/2016/71/01', '2400', 'S00109830', 28560.0000, 'pending', '', 89, 424, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (265, '2400/2017/341/01', '2400', 'S00109830', 45360.0000, 'pending', '', 89, 155, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (267, '2400/2016/75/01', '2400', '1900853613', 36960.0000, 'pending', '', 89, 420, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (151, '2400/2016/130/01', '2400', 'S00555476', 54120.0000, 'pending', '', 89, 365, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (152, '2400/2016/139/01', '2400', 'S00555476', 171000.0000, 'pending', '', 89, 356, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (153, '2400/2016/211/01', '2400', 'S00555476', 53520.0000, 'pending', '', 89, 284, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (154, '2400/2017/256/01', '2400', 'S00555476', 79180.0000, 'pending', '', 89, 240, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (269, '2400/2017/234/01', '2400', '1900853613', 54120.0000, 'pending', '', 89, 261, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (270, '2400/2017/300/01', '2400', '1900853613', 36960.0000, 'pending', '', 89, 196, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (272, '2400/2017/501/01', '2400', '1900853613', 36960.0000, 'pending', '', 89, 27, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (162, '2400/2016/175/01', '2400', 'S00953738', 204800.0000, 'pending', '', 89, 320, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (163, '2400/2016/176/01', '2400', 'S00953738', 150120.0000, 'pending', '', 89, 319, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (164, '2400/2017/389/01', '2400', 'S00953738', 36380.0000, 'pending', '', 89, 107, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (206, '2400/2017/459/01', '2400', 'S00947674', 76800.0000, 'pending', '', 89, 69, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (208, '2400/2016/126/01', '2400', 'S00628160', 47080.0000, 'pending', '', 89, 369, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (210, '2400/2016/210/01', '2400', 'S00628160', 29520.0000, 'pending', '', 89, 285, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (212, '2400/2016/123/01', '2400', 'S00275998', 47080.0000, 'pending', '', 89, 372, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (214, '2400/2016/212/01', '2400', 'S00275998', 17220.0000, 'pending', '', 89, 283, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (219, '2400/2017/217/01', '2400', 'S00241049', 79180.0000, 'pending', '', 89, 640, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (227, '2400/2017/332/01', '2400', 'S00561042', 29520.0000, 'pending', '', 89, 164, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (225, '2400/2016/154/01', '2400', 'S00561042', 54120.0000, 'pending', '', 89, 341, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (239, '2400/2016/160/01', '2400', 'S00630877', 53760.0000, 'pending', '', 89, 335, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (170, '2400/2016/224/01', '2400', 'S00947674', 249800.0000, 'pending', '', 89, 271, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (172, '2400/2017/285/01', '2400', 'S00288435', 129800.0000, 'pending', '', 89, 211, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (232, '2400/2017/329/01', '2400', 'S00343072', 70560.0000, 'pending', '', 89, 167, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (174, '2400/2017/263/01', '2400', 'S00590797', 57780.0000, 'pending', '', 89, 233, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (175, '2400/2017/70/01', '2400', 'S00561042', 78720.0000, 'pending', '', 89, 566, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (177, '2400/2017/327/01', '2400', 'S00245352', 41820.0000, 'pending', '', 89, 169, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (178, '2400/2017/353/01', '2400', 'S00245352', 29520.0000, 'pending', '', 89, 143, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (179, '2400/2016/216/01', '2400', 'S00992864', 54120.0000, 'pending', '', 89, 279, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (192, '2400/2016/163/01', '2400', 'S00560225', 66420.0000, 'pending', '', 89, 332, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (187, '2400/2017/433/01', '2400', 'S00925957', 14980.0000, 'pending', '', 89, 95, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (189, '2400/2016/68/01', '2400', 'S00925957', 20160.0000, 'pending', '', 89, 427, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (196, '2400/2017/251/01', '2400', 'S00653997', 47080.0000, 'pending', '', 89, 244, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (198, '2400/2017/390/01', '2400', 'S00653997', 47080.0000, 'pending', '', 89, 106, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (200, '2400/2017/255/01', '2400', 'S00060955', 47080.0000, 'pending', '', 89, 241, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (202, '2400/2016/170/01', '2400', 'S00609095', 47080.0000, 'pending', '', 89, 325, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (203, '2400/2016/215/01', '2400', 'S00609095', 29520.0000, 'pending', '', 89, 280, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (205, '2400/2017/435/01', '2400', 'S00609095', 36380.0000, 'pending', '', 89, 93, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (207, '2400/2017/260/01', '2400', 'S00947674', 123020.0000, 'pending', '', 89, 236, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (209, '2400/2016/162/01', '2400', 'S00628160', 25680.0000, 'pending', '', 89, 333, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (211, '2400/2017/246/01', '2400', 'S00628160', 47080.0000, 'pending', '', 89, 249, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (213, '2400/2016/124/01', '2400', 'S00275998', 172800.0000, 'pending', '', 89, 371, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (215, '2400/2017/254/01', '2400', 'S00275998', 36380.0000, 'pending', '', 89, 242, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (216, '2400/2017/287/01', '2400', 'S00275998', 140800.0000, 'pending', '', 89, 209, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (234, '2400/2016/105/01', '2400', 'S00660040', 217400.0000, 'pending', '', 89, 390, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (242, '2400/2017/316/01', '2400', 'S00630877', 140800.0000, 'pending', '', 89, 180, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (244, '2400/2016/226/01', '2400', 'S00593245', 54120.0000, 'pending', '', 89, 269, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (246, '2400/2017/326/01', '2400', 'S00593245', 41820.0000, 'pending', '', 89, 170, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (248, '2400/2016/107/01', '2400', 'S00933518', 45360.0000, 'pending', '', 89, 388, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (250, '2400/2016/194/01', '2400', 'S00933518', 140800.0000, 'pending', '', 89, 301, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (252, '2400/2017/503/01', '2400', 'S00933518', 172800.0000, 'pending', '', 89, 25, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (254, '2400/2016/113/01', '2400', 'S00505737', 66420.0000, 'pending', '', 89, 382, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (256, '2400/2016/69/01', '2400', 'S00577341', 36960.0000, 'pending', '', 89, 426, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (258, '2400/2016/173/01', '2400', 'S00577341', 108800.0000, 'pending', '', 89, 322, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (260, '2400/2017/238/01', '2400', 'S00577341', 36960.0000, 'pending', '', 89, 257, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (262, '2400/2016/73/01', '2400', 'S00109830', 36960.0000, 'pending', '', 89, 422, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (264, '2400/2016/74/01', '2400', 'S00109830', 36960.0000, 'pending', '', 89, 421, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (266, '2400/2017/351/01', '2400', 'S00499006', 36960.0000, 'pending', '', 89, 145, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (268, '2400/2016/140/01', '2400', '1900853613', 53760.0000, 'pending', '', 89, 355, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (271, '2400/2017/358/01', '2400', '1900853613', 45360.0000, 'pending', '', 89, 138, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (273, '2400/2017/500/01', '2400', 'S00104866', 36960.0000, 'pending', '', 89, 28, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (274, '2400/2016/204/01', '2400', 'S00104866', 108800.0000, 'pending', '', 89, 291, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (275, '2400/2017/317/01', '2400', 'S00104866', 29520.0000, 'pending', '', 89, 179, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (276, '2400/2017/340/01', '2400', 'S00104866', 45360.0000, 'pending', '', 89, 156, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (277, '2400/2016/97/01', '2400', 'S00356783', 45360.0000, 'pending', '', 89, 398, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (278, '2400/2017/342/01', '2400', 'S00356783', 45360.0000, 'pending', '', 89, 154, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (279, '2400/2016/103/01', '2400', 'S00720981', 157600.0000, 'pending', '', 89, 392, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (280, '2400/2017/354/01', '2400', 'S00720981', 36960.0000, 'pending', '', 89, 142, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (281, '2400/2017/473/01', '2400', 'S00720981', 76800.0000, 'pending', '', 89, 55, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (282, '2400/2017/443/01', '2400', 'S00720981', 126000.0000, 'pending', '', 89, 85, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (283, '2400/2017/312/01', '2400', 'S00720981', 78720.0000, 'pending', '', 89, 184, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (284, '2400/2017/280/01', '2400', 'S00542122', 28560.0000, 'pending', '', 89, 216, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (285, '2400/2017/314/01', '2400', 'S00542122', 78720.0000, 'pending', '', 89, 182, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (286, '2400/2017/359/01', '2400', 'S00542122', 45360.0000, 'pending', '', 89, 137, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (287, '2400/2017/366/01', '2400', 'S00542122', 36960.0000, 'pending', '', 89, 130, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (288, '2400/2016/159/01', '2400', 'S00435567', 53760.0000, 'pending', '', 89, 336, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (289, '2400/2017/283/01', '2400', 'S00435567', 36960.0000, 'pending', '', 89, 213, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (290, '2400/2017/478/01', '2400', 'S00237348', 45360.0000, 'pending', '', 89, 50, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (291, '2400/2017/288/01', '2400', 'S00237348', 36960.0000, 'pending', '', 89, 208, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (292, '2400/2017/308/01', '2400', 'S00156175', 108800.0000, 'pending', '', 89, 188, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (293, '2400/2017/318/01', '2400', 'S00931945', 29520.0000, 'pending', '', 89, 178, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (294, '2400/2017/343/01', '2400', 'S00931945', 45360.0000, 'pending', '', 89, 153, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (295, '2400/2017/504/01', '2400', 'S00931945', 36960.0000, 'pending', '', 89, 24, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (296, '2400/2017/361/01', '2400', '1900852799', 36960.0000, 'pending', '', 89, 135, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (297, '2400/2017/291/01', '2400', '1900852799', 36960.0000, 'pending', '', 89, 205, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (298, '2400/2017/375/01', '2400', 'S00874216', 76800.0000, 'pending', '', 89, 121, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (89, '2400/2017/607/01', '2400', 'Traveler - Air Ticket Cost', 16000.0000, 'pending', '', 89, 871, '{}'); -INSERT INTO [[schema]].t2f_invoice VALUES (90, '2400/2017/607/02', '2400', 'Traveler - Terminal Cost', 15000.0000, 'pending', '', 89, 871, '{}'); - - --- --- Data for Name: t2f_invoiceitem; Type: TABLE DATA; Schema: [[schema]]; Owner: - --- - -INSERT INTO [[schema]].t2f_invoiceitem VALUES (1, 10455.0000000000, 4, 4063, 1, 3574); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (95, 162900.0000000000, 6, 189, 93, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (127, 29520.0000000000, 6, 3925, 125, 3612); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (193, 41820.0000000000, 4, 25, 190, 3527); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (230, 29520.0000000000, 6, 3953, 226, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (183, 108800.0000000000, 4, 25, 180, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (91, 16000.0000000000, 4, 25, 89, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (18, 15000.0000000000, 4, 25, 18, 3560); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (19, 133940.0000000000, 4, 25, 19, 3560); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (20, 29520.0000000000, 4, 25, 20, 3540); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (23, 4920.0000000000, 4, 25, 23, 3584); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (24, 3360.0000000000, 6, 4011, 24, 6622); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (240, 59220.0000000000, 6, 4052, 236, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (241, 204800.0000000000, 4, 25, 237, 3556); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (243, 53760.0000000000, 4, 25, 239, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (67, 55200.0000000000, 4, 25, 66, 3618); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (29, 48585.0000000000, 4, 25, 29, 3540); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (77, 4920.0000000000, 6, 791, 76, 6581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (32, 29520.0000000000, 6, 196, 32, 6603); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (74, 83640.0000000000, 6, 3900, 73, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (224, 140220.0000000000, 4, 25, 221, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (195, 66420.0000000000, 6, 4089, 192, 3527); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (245, 41820.0000000000, 4, 25, 241, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (247, 91020.0000000000, 6, 4084, 243, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (66, 143750.0000000000, 4, 25, 65, 3540); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (197, 54120.0000000000, 6, 3953, 194, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (199, 47080.0000000000, 4, 25, 196, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (220, 47080.0000000000, 4, 25, 217, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (222, 79180.0000000000, 6, 189, 219, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (73, 78720.0000000000, 6, 32, 72, 3574); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (201, 47080.0000000000, 5, 3938, 198, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (79, 66420.0000000000, 4, 25, 78, 3511); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (80, 1.0000000000, 4, 25, 79, 3511); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (94, 47080.0000000000, 5, 3929, 92, 3546); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (128, 41820.0000000000, 6, 3913, 126, 3615); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (129, 17220.0000000000, 4, 25, 127, 3612); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (86, 78720.0000000000, 6, 791, 84, 6581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (92, 15000.0000000000, 4, 25, 90, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (93, 29520.0000000000, 4, 25, 91, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (132, 14980.0000000000, 5, 4105, 130, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (131, 14980.0000000000, 4, 25, 129, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (133, 29520.0000000000, 4, 25, 131, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (249, 173800.0000000000, 6, 368, 245, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (237, 140800.0000000000, 4, 25, 233, 6583); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (134, 47080.0000000000, 5, 3938, 132, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (228, 40590.0000000000, 4, 25, 225, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (229, 13530.0000000000, 4, 25, 225, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (203, 47080.0000000000, 4, 25, 200, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (205, 47080.0000000000, 6, 4011, 202, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (239, 140800.0000000000, 4, 25, 235, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (206, 29520.0000000000, 4, 25, 203, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (208, 36380.0000000000, 5, 3929, 205, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (210, 123020.0000000000, 4, 25, 207, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (212, 25680.0000000000, 6, 4108, 209, 3517); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (114, 106300.0000000000, 4, 25, 112, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (115, 108800.0000000000, 4, 25, 113, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (116, 78720.0000000000, 4, 25, 114, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (117, 41820.0000000000, 4, 25, 115, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (118, 98420.0000000000, 4, 25, 116, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (214, 47080.0000000000, 4, 25, 211, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (216, 172800.0000000000, 4, 25, 213, 3571); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (121, 4920.0000000000, 6, 791, 119, 6581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (122, 29520.0000000000, 4, 25, 120, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (123, 29520.0000000000, 4, 25, 121, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (124, 54120.0000000000, 4, 25, 122, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (125, 29520.0000000000, 4, 25, 123, 3612); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (126, 76800.0000000000, 4, 25, 124, 3612); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (251, 20160.0000000000, 4, 25, 247, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (253, 43210.0000000000, 5, 66, 249, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (254, 43210.0000000000, 5, 4105, 249, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (257, 45360.0000000000, 4, 25, 251, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (259, 53760.0000000000, 5, 3938, 253, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (261, 130420.0000000000, 5, 3938, 255, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (263, 66420.0000000000, 4, 25, 257, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (265, 54120.0000000000, 4, 25, 259, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (145, 52220.0000000000, 4, 25, 143, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (267, 45360.0000000000, 6, 3912, 261, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (147, 222800.0000000000, 4, 25, 145, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (148, 76820.0000000000, 6, 4108, 146, 3517); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (269, 28560.0000000000, 6, 46, 263, 3581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (271, 45360.0000000000, 4, 25, 265, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (273, 36960.0000000000, 5, 4054, 267, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (275, 54120.0000000000, 4, 25, 269, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (153, 54120.0000000000, 6, 249, 151, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (154, 171000.0000000000, 5, 3938, 152, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (155, 53520.0000000000, 4, 25, 153, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (156, 79180.0000000000, 4, 25, 154, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (276, 36960.0000000000, 5, 4054, 270, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (278, 36960.0000000000, 5, 4054, 272, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (280, 108800.0000000000, 6, 46, 274, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (282, 45360.0000000000, 4, 25, 276, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (218, 36380.0000000000, 4, 25, 215, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (219, 140800.0000000000, 4, 25, 216, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (164, 204800.0000000000, 6, 3912, 162, 3546); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (165, 150120.0000000000, 6, 3923, 163, 3541); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (166, 36380.0000000000, 5, 3929, 164, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (221, 47080.0000000000, 4, 25, 218, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (223, 54120.0000000000, 6, 3953, 220, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (231, 29520.0000000000, 6, 3953, 227, 3531); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (227, 78720.0000000000, 4, 25, 224, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (242, 78720.0000000000, 5, 3918, 238, 3556); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (172, 249800.0000000000, 4, 25, 170, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (307, 9201.0000000000, 2, 4057, 300, 6593); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (175, 129800.0000000000, 4, 25, 172, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (236, 70560.0000000000, 6, 3913, 232, 6626); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (177, 57780.0000000000, 5, 3938, 174, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (178, 78720.0000000000, 6, 791, 175, 6581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (179, 78720.0000000000, 6, 791, 176, 6581); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (180, 41820.0000000000, 4, 25, 177, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (181, 29520.0000000000, 6, 9, 178, 3616); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (182, 54120.0000000000, 6, 301, 179, 3528); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (184, 108800.0000000000, 4, 25, 181, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (186, 46560.0000000000, 4, 25, 183, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (188, 20160.0000000000, 4, 25, 185, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (190, 14980.0000000000, 4, 25, 187, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (192, 20160.0000000000, 4, 25, 189, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (194, 29520.0000000000, 6, 3931, 191, 3527); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (196, 54120.0000000000, 4, 25, 193, 3527); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (198, 25680.0000000000, 4, 25, 195, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (200, 57100.0000000000, 4, 25, 197, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (202, 57780.0000000000, 5, 3938, 199, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (204, 29520.0000000000, 4, 25, 201, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (207, 47080.0000000000, 4, 25, 204, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (209, 76800.0000000000, 6, 3953, 206, 6599); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (211, 47080.0000000000, 4, 25, 208, 3515); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (213, 29520.0000000000, 4, 25, 210, 3517); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (215, 47080.0000000000, 4, 25, 212, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (217, 17220.0000000000, 5, 3972, 214, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (238, 217400.0000000000, 4, 25, 234, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (244, 108800.0000000000, 4, 25, 240, 3556); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (246, 140800.0000000000, 4, 25, 242, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (248, 54120.0000000000, 4, 25, 244, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (250, 41820.0000000000, 6, 3953, 246, 3528); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (252, 45360.0000000000, 4, 25, 248, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (255, 70400.0000000000, 5, 3979, 250, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (256, 70400.0000000000, 5, 66, 250, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (258, 172800.0000000000, 4, 25, 252, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (260, 66420.0000000000, 5, 4105, 254, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (262, 36960.0000000000, 5, 4054, 256, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (264, 108800.0000000000, 4, 25, 258, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (266, 36960.0000000000, 5, 4054, 260, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (268, 36960.0000000000, 6, 3907, 262, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (270, 36960.0000000000, 6, 3907, 264, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (272, 36960.0000000000, 6, 4011, 266, 3585); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (274, 53760.0000000000, 4, 25, 268, 3546); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (277, 45360.0000000000, 6, 3912, 271, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (279, 36960.0000000000, 4, 25, 273, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (281, 29520.0000000000, 4, 25, 275, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (283, 45360.0000000000, 4, 25, 277, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (284, 45360.0000000000, 4, 25, 278, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (285, 157600.0000000000, 6, 3953, 279, 3528); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (286, 36960.0000000000, 6, 3953, 280, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (287, 76800.0000000000, 6, 3953, 281, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (288, 126000.0000000000, 6, 791, 282, 3533); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (289, 78720.0000000000, 6, 4052, 283, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (290, 28560.0000000000, 4, 25, 284, 3553); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (291, 78720.0000000000, 6, 4052, 285, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (292, 45360.0000000000, 5, 3938, 286, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (293, 36960.0000000000, 5, 3938, 287, 3537); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (294, 53760.0000000000, 4, 25, 288, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (295, 36960.0000000000, 4, 25, 289, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (296, 45360.0000000000, 4, 25, 290, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (297, 36960.0000000000, 5, 4054, 291, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (298, 108800.0000000000, 4, 25, 292, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (299, 29520.0000000000, 4, 25, 293, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (300, 45360.0000000000, 4, 25, 294, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (301, 36960.0000000000, 4, 25, 295, 3518); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (302, 36960.0000000000, 4, 25, 296, 3530); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (303, 36960.0000000000, 5, 4054, 297, 3547); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (304, 76800.0000000000, 4, 25, 298, 3594); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (305, 288900.0000000000, 1, 36, 299, 3514); -INSERT INTO [[schema]].t2f_invoiceitem VALUES (306, 288900.0000000000, 4, 25, 299, 3595); - - -- -- Data for Name: t2f_itineraryitem; Type: TABLE DATA; Schema: [[schema]]; Owner: - -- @@ -60005,7 +59499,7 @@ SELECT pg_catalog.setval('[[schema]].django_comments_id_seq', 189, true); -- Name: django_migrations_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - -- -SELECT pg_catalog.setval('[[schema]].django_migrations_id_seq', 624, true); +SELECT pg_catalog.setval('[[schema]].django_migrations_id_seq', 643, true); -- @@ -60239,20 +59733,6 @@ SELECT pg_catalog.setval('[[schema]].partners_interventionresultlink_id_seq', 52 SELECT pg_catalog.setval('[[schema]].partners_interventionresultlink_ram_indicators_id_seq', 79, true); --- --- Name: partners_interventionsectorlocationlink_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - --- - -SELECT pg_catalog.setval('[[schema]].partners_interventionsectorlocationlink_id_seq', 77, true); - - --- --- Name: partners_interventionsectorlocationlink_locations_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - --- - -SELECT pg_catalog.setval('[[schema]].partners_interventionsectorlocationlink_locations_id_seq', 132, true); - - -- -- Name: partners_partnerorganization_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - -- @@ -60449,20 +59929,6 @@ SELECT pg_catalog.setval('[[schema]].t2f_deduction_id_seq', 1790, true); SELECT pg_catalog.setval('[[schema]].t2f_expense_id_seq', 110, true); --- --- Name: t2f_invoice_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - --- - -SELECT pg_catalog.setval('[[schema]].t2f_invoice_id_seq', 332, true); - - --- --- Name: t2f_invoiceitem_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - --- - -SELECT pg_catalog.setval('[[schema]].t2f_invoiceitem_id_seq', 339, true); - - -- -- Name: t2f_iteneraryitem_airlines_id_seq; Type: SEQUENCE SET; Schema: [[schema]]; Owner: - -- @@ -61142,14 +60608,6 @@ ALTER TABLE ONLY [[schema]].partners_filetype ADD CONSTRAINT partners_filetype_pkey PRIMARY KEY (id); --- --- Name: partners_interventionsectorlocationlink_locations partners_interv_interventionsectorlocationlink_id_40f4e298_uniq; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink_locations - ADD CONSTRAINT partners_interv_interventionsectorlocationlink_id_40f4e298_uniq UNIQUE (interventionsectorlocationlink_id, location_id); - - -- -- Name: partners_intervention_flat_locations partners_intervention_flat_locati_intervention_id_b0bfcf1a_uniq; Type: CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -61326,22 +60784,6 @@ ALTER TABLE ONLY [[schema]].partners_interventionresultlink_ram_indicators ADD CONSTRAINT partners_interventionresultlink_ram_indicators_pkey PRIMARY KEY (id); --- --- Name: partners_interventionsectorlocationlink_locations partners_interventionsectorlocationlink_locations_pkey; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink_locations - ADD CONSTRAINT partners_interventionsectorlocationlink_locations_pkey PRIMARY KEY (id); - - --- --- Name: partners_interventionsectorlocationlink partners_interventionsectorlocationlink_pkey; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink - ADD CONSTRAINT partners_interventionsectorlocationlink_pkey PRIMARY KEY (id); - - -- -- Name: partners_partnerorganization partners_partnerorganization_name_586ea92c4b5abec3_uniq; Type: CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -61718,30 +61160,6 @@ ALTER TABLE ONLY [[schema]].t2f_expense ADD CONSTRAINT t2f_expense_pkey PRIMARY KEY (id); --- --- Name: t2f_invoice t2f_invoice_pkey; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoice - ADD CONSTRAINT t2f_invoice_pkey PRIMARY KEY (id); - - --- --- Name: t2f_invoice t2f_invoice_reference_number_key; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoice - ADD CONSTRAINT t2f_invoice_reference_number_key UNIQUE (reference_number); - - --- --- Name: t2f_invoiceitem t2f_invoiceitem_pkey; Type: CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem - ADD CONSTRAINT t2f_invoiceitem_pkey PRIMARY KEY (id); - - -- -- Name: t2f_itineraryitem_airlines t2f_iteneraryitem_airlines_iteneraryitem_id_3f5ee941_uniq; Type: CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -62951,34 +62369,6 @@ CREATE INDEX partners_interventionresultlink_ram_indicators_70bff951 ON [[schema CREATE INDEX partners_interventionresultlink_ram_indicators_a82bd466 ON [[schema]].partners_interventionresultlink_ram_indicators USING btree (indicator_id); --- --- Name: partners_interventionsectorlocationlink_123a1ce7; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX partners_interventionsectorlocationlink_123a1ce7 ON [[schema]].partners_interventionsectorlocationlink USING btree (intervention_id); - - --- --- Name: partners_interventionsectorlocationlink_5b1d2adf; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX partners_interventionsectorlocationlink_5b1d2adf ON [[schema]].partners_interventionsectorlocationlink USING btree (sector_id); - - --- --- Name: partners_interventionsectorlocationlink_locations_510c1d46; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX partners_interventionsectorlocationlink_locations_510c1d46 ON [[schema]].partners_interventionsectorlocationlink_locations USING btree (interventionsectorlocationlink_id); - - --- --- Name: partners_interventionsectorlocationlink_locations_e274a5da; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX partners_interventionsectorlocationlink_locations_e274a5da ON [[schema]].partners_interventionsectorlocationlink_locations USING btree (location_id); - - -- -- Name: partners_partnerplannedvisits_4e98b6eb; Type: INDEX; Schema: [[schema]]; Owner: - -- @@ -63336,55 +62726,6 @@ CREATE INDEX t2f_expense_46413c35 ON [[schema]].t2f_expense USING btree (travel_ CREATE INDEX t2f_expense_94757cae ON [[schema]].t2f_expense USING btree (type_id); --- --- Name: t2f_invoice_2c7d5721; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoice_2c7d5721 ON [[schema]].t2f_invoice USING btree (currency_id); - - --- --- Name: t2f_invoice_46413c35; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoice_46413c35 ON [[schema]].t2f_invoice USING btree (travel_id); - - --- --- Name: t2f_invoice_reference_number_5197b5f5_like; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoice_reference_number_5197b5f5_like ON [[schema]].t2f_invoice USING btree (reference_number varchar_pattern_ops); - - --- --- Name: t2f_invoiceitem_4e6789a8; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoiceitem_4e6789a8 ON [[schema]].t2f_invoiceitem USING btree (fund_id); - - --- --- Name: t2f_invoiceitem_78655e45; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoiceitem_78655e45 ON [[schema]].t2f_invoiceitem USING btree (wbs_id); - - --- --- Name: t2f_invoiceitem_c2418e07; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoiceitem_c2418e07 ON [[schema]].t2f_invoiceitem USING btree (grant_id); - - --- --- Name: t2f_invoiceitem_f1f5d967; Type: INDEX; Schema: [[schema]]; Owner: - --- - -CREATE INDEX t2f_invoiceitem_f1f5d967 ON [[schema]].t2f_invoiceitem USING btree (invoice_id); - - -- -- Name: t2f_iteneraryitem_46413c35; Type: INDEX; Schema: [[schema]]; Owner: - -- @@ -64167,14 +63508,6 @@ ALTER TABLE ONLY [[schema]].audit_engagement_staff_members ADD CONSTRAINT f2bd17555d7d671f284e1ba6c988713a FOREIGN KEY (auditorstaffmember_id) REFERENCES public.purchase_order_auditorstaffmember(id) DEFERRABLE INITIALLY DEFERRED; --- --- Name: partners_interventionsectorlocationlink_locations f6e945cf3065e94fe6ff2dd810773eb9; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink_locations - ADD CONSTRAINT f6e945cf3065e94fe6ff2dd810773eb9 FOREIGN KEY (interventionsectorlocationlink_id) REFERENCES [[schema]].partners_interventionsectorlocationlink(id) DEFERRABLE INITIALLY DEFERRED; - - -- -- Name: funds_fundscommitmentitem f_fund_commitment_id_efde5c22_fk_funds_fundscommitmentheader_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -64351,14 +63684,6 @@ ALTER TABLE ONLY [[schema]].partners_interventionbudget ADD CONSTRAINT partners_i_intervention_id_4b2f53ff_fk_partners_intervention_id FOREIGN KEY (intervention_id) REFERENCES [[schema]].partners_intervention(id) DEFERRABLE INITIALLY DEFERRED; --- --- Name: partners_interventionsectorlocationlink partners_i_intervention_id_4bad99f5_fk_partners_intervention_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink - ADD CONSTRAINT partners_i_intervention_id_4bad99f5_fk_partners_intervention_id FOREIGN KEY (intervention_id) REFERENCES [[schema]].partners_intervention(id) DEFERRABLE INITIALLY DEFERRED; - - -- -- Name: partners_intervention_flat_locations partners_i_intervention_id_4de66d52_fk_partners_intervention_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -64439,14 +63764,6 @@ ALTER TABLE ONLY [[schema]].partners_interventionresultlink_ram_indicators ADD CONSTRAINT partners_interven_indicator_id_39b85ee5_fk_reports_indicator_id FOREIGN KEY (indicator_id) REFERENCES [[schema]].reports_indicator(id) DEFERRABLE INITIALLY DEFERRED; --- --- Name: partners_interventionsectorlocationlink_locations partners_interven_location_id_454c4337_fk_locations_location_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink_locations - ADD CONSTRAINT partners_interven_location_id_454c4337_fk_locations_location_id FOREIGN KEY (location_id) REFERENCES [[schema]].locations_location(id) DEFERRABLE INITIALLY DEFERRED; - - -- -- Name: partners_intervention_flat_locations partners_interven_location_id_50504821_fk_locations_location_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -64503,14 +63820,6 @@ ALTER TABLE ONLY [[schema]].partners_interventionattachment ADD CONSTRAINT partners_interventiona_type_id_a73b39dd_fk_partners_filetype_id FOREIGN KEY (type_id) REFERENCES [[schema]].partners_filetype(id) DEFERRABLE INITIALLY DEFERRED; --- --- Name: partners_interventionsectorlocationlink partners_interventionse_sector_id_3c5d6302_fk_reports_sector_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].partners_interventionsectorlocationlink - ADD CONSTRAINT partners_interventionse_sector_id_3c5d6302_fk_reports_sector_id FOREIGN KEY (sector_id) REFERENCES [[schema]].reports_sector(id) DEFERRABLE INITIALLY DEFERRED; - - -- -- Name: partners_plannedengagement partners_partner_id_2cdd2ebd_fk_partners_partnerorganization_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - -- @@ -64823,54 +64132,6 @@ ALTER TABLE ONLY [[schema]].t2f_expense ADD CONSTRAINT t2f_expense_type_id_8e999744_fk_publics_travelexpensetype_id FOREIGN KEY (type_id) REFERENCES public.publics_travelexpensetype(id) DEFERRABLE INITIALLY DEFERRED; --- --- Name: t2f_invoice t2f_invoice_currency_id_ce7cb7a3_fk_publics_currency_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoice - ADD CONSTRAINT t2f_invoice_currency_id_ce7cb7a3_fk_publics_currency_id FOREIGN KEY (currency_id) REFERENCES public.publics_currency(id) DEFERRABLE INITIALLY DEFERRED; - - --- --- Name: t2f_invoice t2f_invoice_travel_id_905f65ab_fk_t2f_travel_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoice - ADD CONSTRAINT t2f_invoice_travel_id_905f65ab_fk_t2f_travel_id FOREIGN KEY (travel_id) REFERENCES [[schema]].t2f_travel(id) DEFERRABLE INITIALLY DEFERRED; - - --- --- Name: t2f_invoiceitem t2f_invoiceitem_fund_id_6187cb54_fk_publics_fund_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem - ADD CONSTRAINT t2f_invoiceitem_fund_id_6187cb54_fk_publics_fund_id FOREIGN KEY (fund_id) REFERENCES public.publics_fund(id) DEFERRABLE INITIALLY DEFERRED; - - --- --- Name: t2f_invoiceitem t2f_invoiceitem_grant_id_cb6bb8f6_fk_publics_grant_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem - ADD CONSTRAINT t2f_invoiceitem_grant_id_cb6bb8f6_fk_publics_grant_id FOREIGN KEY (grant_id) REFERENCES public.publics_grant(id) DEFERRABLE INITIALLY DEFERRED; - - --- --- Name: t2f_invoiceitem t2f_invoiceitem_invoice_id_5e1603cd_fk_t2f_invoice_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem - ADD CONSTRAINT t2f_invoiceitem_invoice_id_5e1603cd_fk_t2f_invoice_id FOREIGN KEY (invoice_id) REFERENCES [[schema]].t2f_invoice(id) DEFERRABLE INITIALLY DEFERRED; - - --- --- Name: t2f_invoiceitem t2f_invoiceitem_wbs_id_5c58fb45_fk_publics_wbs_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - --- - -ALTER TABLE ONLY [[schema]].t2f_invoiceitem - ADD CONSTRAINT t2f_invoiceitem_wbs_id_5c58fb45_fk_publics_wbs_id FOREIGN KEY (wbs_id) REFERENCES public.publics_wbs(id) DEFERRABLE INITIALLY DEFERRED; - - -- -- Name: t2f_itineraryitem_airlines t2f_ite_airlinecompany_id_9af18782_fk_publics_airlinecompany_id; Type: FK CONSTRAINT; Schema: [[schema]]; Owner: - -- From 40a72617987d3efc72fe83089004d32a18066306 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 15:48:22 +0100 Subject: [PATCH 027/122] raise docker verbosity --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- docker/entrypoint.sh | 2 ++ src/etools_datamart/__init__.py | 2 +- .../apps/init/management/commands/info.py | 22 +++++++++++++++++++ src/etools_datamart/config/settings.py | 20 +++++++++-------- 6 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 src/etools_datamart/apps/init/management/commands/info.py diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e0e3d8935..af1d7d8e9 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a2 +current_version = 1.9a3 commit = False tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 97735ec11..a0e523999 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a2 +TARGET?=1.9a3 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 3953f6eb0..732f56d6d 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -5,6 +5,8 @@ mkdir -p /var/datamart/{static,log,conf,run} mkdir -p ${STATIC_ROOT} rm -f /var/datamart/run/* +django-admin info +django-admin diffsettings --output hash if [[ "$*" == "workers" ]];then django-admin db-isready --wait --timeout 60 --sleep 5 diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 35e468e4d..2b72ef251 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a2' +VERSION = __version__ = '1.9a3' __author__ = '' diff --git a/src/etools_datamart/apps/init/management/commands/info.py b/src/etools_datamart/apps/init/management/commands/info.py new file mode 100644 index 000000000..de81d89cb --- /dev/null +++ b/src/etools_datamart/apps/init/management/commands/info.py @@ -0,0 +1,22 @@ +from django.conf import settings +from django.core.management.base import BaseCommand + + +class Command(BaseCommand): + help = "" + + def add_arguments(self, parser): + pass + + def handle(self, *args, **options): + self.stdout.write(f"DATABASES") + for name, config in settings.DATABASES.items(): + self.stdout.write(f"Connection: {name}") + for entry in ['NAME', 'HOST', 'PORT']: + self.stdout.write(f" {entry}: {config[entry]}") + self.stdout.write("=" * 80) + self.stdout.write(f"CACHES") + for name, config in settings.CACHES.items(): + self.stdout.write(f"Connection: {name}") + for entry in ['BACKEND', 'LOCATION']: + self.stdout.write(f" {entry}: {config[entry]}") diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 2026c16cb..0c20efc15 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -44,7 +44,7 @@ STATIC_ROOT=(str, '/tmp/static'), STATIC_URL=(str, '/dm-static/'), SYSTEM_PASSWORD=(str, ''), - X_FRAME_OPTIONS=(str, 'DENY'), + X_FRAME_OPTIONS=(str, 'SAMEORIGIN'), AZURE_CLIENT_ID=(str, ''), AZURE_CLIENT_SECRET=(str, ''), @@ -73,7 +73,7 @@ STATIC_ROOT = env('STATIC_ROOT') SECRET_KEY = env('SECRET_KEY') -ALLOWED_HOSTS = tuple(env.list('ALLOWED_HOSTS', default=[])) +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[]) ABSOLUTE_BASE_URL = env('ABSOLUTE_BASE_URL') API_PREFIX = env('API_PREFIX') @@ -113,7 +113,7 @@ # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html -LANGUAGE_CODE = 'en' +LANGUAGE_CODE = 'en-us' ugettext = lambda s: s # noqa LANGUAGES = ( ('es', ugettext('Spanish')), @@ -156,19 +156,19 @@ STATIC_URL = env('STATIC_URL') # Additional locations of static files -STATICFILES_DIRS = ( +STATICFILES_DIRS = [ # Put strings here, like "/home/html/static" or "C:/www/django/static". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. # os.path.join(PROJECT_DIR, '../static'), -) +] # List of finder classes that know how to find static files in # various locations. -STATICFILES_FINDERS = ( +STATICFILES_FINDERS = [ 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -) +] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', @@ -312,7 +312,8 @@ 'django_celery_beat', ] -DATE_FORMAT = '%d %b %Y' +# DATE_FORMAT = '%d %b %Y' +DATE_FORMAT = 'N j, Y' # default DATE_INPUT_FORMATS = [ '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' @@ -321,7 +322,8 @@ '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' ] -DATETIME_FORMAT = '%d %b %Y %H:%M:%S' +# DATETIME_FORMAT = '%d %b %Y %H:%M:%S' +DATETIME_FORMAT = 'N j, Y, P' # default DATETIME_INPUT_FORMATS = [ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' From 722c1e96263f713d003d1cd357ea260b7a0f93f8 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:10:14 +0100 Subject: [PATCH 028/122] update version --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- docker/entrypoint.sh | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index af1d7d8e9..7355e8750 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a3 +current_version = 1.9a4 commit = False tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index a0e523999..91fb5e005 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a3 +TARGET?=1.9a4 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 732f56d6d..8159dea78 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -17,7 +17,7 @@ elif [[ "$*" == "beat" ]];then elif [[ "$*" == "datamart" ]];then django-admin db-isready --wait --timeout 60 django-admin check --deploy - django-admin init-setup --all --verbosity 1 + django-admin init-setup --all --verbosity 2 django-admin db-isready --wait --timeout 300 --connection etools gunicorn -b 0.0.0.0:8000 etools_datamart.config.wsgi else diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 2b72ef251..960afd0d5 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a3' +VERSION = __version__ = '1.9a4' __author__ = '' From bd13506af75c919c676a5ea193bad01696b4644f Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:24:32 +0100 Subject: [PATCH 029/122] add URL_PREFIX to settings --- src/etools_datamart/config/settings.py | 55 ++++++++++++-------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 0c20efc15..eaf230ce5 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -12,56 +12,52 @@ DEVELOPMENT_DIR = PACKAGE_DIR.parent.parent env = environ.Env(API_PREFIX=(str, '/api/'), - ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), + ABSOLUTE_BASE_URL=(str, 'http://localhost:8000'), ANALYTICS_CODE=(str, ""), - REDOC_BASE=(str, '/api/+redoc/#operation/'), + AZURE_ACCOUNT_KEY=(str, ''), + AZURE_ACCOUNT_NAME=(str, ''), + AZURE_CLIENT_ID=(str, ''), + AZURE_CLIENT_SECRET=(str, ''), + AZURE_CONTAINER=(str, ''), + AZURE_LOCATION=(str, ''), + AZURE_OVERWRITE_FILES=(bool, True), + AZURE_TENANT=(str, ''), CACHE_URL=(str, "redis://127.0.0.1:6379/1"), CACHE_URL_API=(str, "redis://127.0.0.1:6379/2?key_prefix=api"), CACHE_URL_LOCK=(str, "redis://127.0.0.1:6379/2?key_prefix=lock"), CACHE_URL_TEMPLATE=(str, "redis://127.0.0.1:6379/2?key_prefix=template"), - # CACHE_URL=(str, "dummycache://"), - # CACHE_URL_API=(str, "dummycache://"), - ABSOLUTE_BASE_URL=(str, 'http://localhost:8000'), - DISCONNECT_URL=(str, 'https://login.microsoftonline.com/unicef.org/oauth2/logout'), - DISABLE_SCHEMA_RESTRICTIONS=(bool, False), - DISABLE_SERVICE_RESTRICTIONS=(bool, False), - ENABLE_LIVE_STATS=(bool, True), + CELERY_ALWAYS_EAGER=(bool, False), CELERY_BROKER_URL=(str, 'redis://127.0.0.1:6379/2'), CELERY_RESULT_BACKEND=(str, 'redis://127.0.0.1:6379/3'), - CELERY_ALWAYS_EAGER=(bool, False), CSRF_COOKIE_SECURE=(bool, True), DATABASE_URL=(str, "postgis://postgres:@127.0.0.1:5432/etools_datamart"), DATABASE_URL_ETOOLS=(str, "postgis://postgres:@127.0.0.1:15432/etools"), DEBUG=(bool, False), + DISABLE_SCHEMA_RESTRICTIONS=(bool, False), + DISABLE_SERVICE_RESTRICTIONS=(bool, False), + DISCONNECT_URL=(str, 'https://login.microsoftonline.com/unicef.org/oauth2/logout'), + EMAIL_HOST=(str, ''), + EMAIL_HOST_PASSWORD=(str, ''), + EMAIL_HOST_USER=(str, ''), + EMAIL_PORT=(int, 587), + EMAIL_USE_TLS=(bool, True), + ENABLE_LIVE_STATS=(bool, True), + ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), MEDIA_ROOT=(str, '/tmp/media'), + REDOC_BASE=(str, '/api/+redoc/#operation/'), SECRET_KEY=(str, 'secret'), - SECURE_HSTS_PRELOAD=(bool, 'True'), - SECURE_SSL_REDIRECT=(bool, True), SECURE_BROWSER_XSS_FILTER=(bool, True), SECURE_CONTENT_TYPE_NOSNIFF=(bool, True), SECURE_FRAME_DENY=(bool, True), + SECURE_HSTS_PRELOAD=(bool, 'True'), + SECURE_SSL_REDIRECT=(bool, True), SESSION_COOKIE_SECURE=(bool, True), STATIC_ROOT=(str, '/tmp/static'), STATIC_URL=(str, '/dm-static/'), SYSTEM_PASSWORD=(str, ''), - X_FRAME_OPTIONS=(str, 'SAMEORIGIN'), - - AZURE_CLIENT_ID=(str, ''), - AZURE_CLIENT_SECRET=(str, ''), - AZURE_TENANT=(str, ''), - - AZURE_ACCOUNT_NAME=(str, ''), - AZURE_ACCOUNT_KEY=(str, ''), - AZURE_CONTAINER=(str, ''), - AZURE_OVERWRITE_FILES=(bool, True), - AZURE_LOCATION=(str, ''), - - EMAIL_USE_TLS=(bool, True), - EMAIL_HOST=(str, ''), - EMAIL_HOST_USER=(str, ''), - EMAIL_HOST_PASSWORD=(str, ''), - EMAIL_PORT=(int, 587), + URL_PREFIX=(str, ''), USE_X_FORWARDED_HOST=(bool, False), + X_FRAME_OPTIONS=(str, 'SAMEORIGIN'), ) DEBUG = env.bool('DEBUG') @@ -76,6 +72,7 @@ ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[]) ABSOLUTE_BASE_URL = env('ABSOLUTE_BASE_URL') API_PREFIX = env('API_PREFIX') +URL_PREFIX = env('URL_PREFIX') ADMINS = ( ('Stefano', 'saxix@saxix.onmicrosoft.com'), From eba84ba91b633e5528c6f8d61b3bf5959fd41aa4 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:26:45 +0100 Subject: [PATCH 030/122] updates bumpversion --- .bumpversion.cfg | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 7355e8750..272d94983 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,12 +1,15 @@ [bumpversion] current_version = 1.9a4 -commit = False +commit = True tag = False allow_dirty = True parse = (?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? serialize = {major}.{minor}{release}{num} {major}.{minor} +message = + Bump version: {current_version} → {new_version} + [bumpversion:part:release] optional_value = a From 0e9776064296927f7720bc46d8896902866d0976 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:35:51 +0100 Subject: [PATCH 031/122] =?UTF-8?q?Bump=20version:=201.9a4=20=E2=86=92=201?= =?UTF-8?q?.9a5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 5 ++--- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 272d94983..7f3fa0732 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a4 +current_version = 1.9a5 commit = True tag = False allow_dirty = True @@ -7,10 +7,9 @@ parse = (?P\d+)\.(?P\d+)((?P[a-z]+)(?P\d+))? serialize = {major}.{minor}{release}{num} {major}.{minor} -message = +message = Bump version: {current_version} → {new_version} - [bumpversion:part:release] optional_value = a first_value = a diff --git a/docker/Makefile b/docker/Makefile index 91fb5e005..68afbb251 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a4 +TARGET?=1.9a5 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 960afd0d5..4abe71799 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a4' +VERSION = __version__ = '1.9a5' __author__ = '' From bb49910928a8faa1221c5d45a314c7d156c8130b Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:45:50 +0100 Subject: [PATCH 032/122] add some debug statements to docker entrypoint --- docker/entrypoint.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 8159dea78..39301644c 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -6,7 +6,8 @@ mkdir -p ${STATIC_ROOT} rm -f /var/datamart/run/* django-admin info -django-admin diffsettings --output hash +django-admin diffsettings --output unified +django-admin makemigrations --dry-run if [[ "$*" == "workers" ]];then django-admin db-isready --wait --timeout 60 --sleep 5 From d04dbad8b8e3c2f3a8992aaf974dc54dcd94dc4f Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 16:55:30 +0100 Subject: [PATCH 033/122] =?UTF-8?q?Bump=20version:=201.9a5=20=E2=86=92=201?= =?UTF-8?q?.9a6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 7f3fa0732..0d33bfb5a 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a5 +current_version = 1.9a6 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 68afbb251..228076f8b 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a5 +TARGET?=1.9a6 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 4abe71799..437652987 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a5' +VERSION = __version__ = '1.9a6' __author__ = '' From 666642f55366044db3f0d5334905a87af020dab1 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 17:42:59 +0100 Subject: [PATCH 034/122] internal managed URL_PREFIX --- src/etools_datamart/config/urls.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/etools_datamart/config/urls.py b/src/etools_datamart/config/urls.py index 37dfd2783..ca521dd7a 100644 --- a/src/etools_datamart/config/urls.py +++ b/src/etools_datamart/config/urls.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.contrib.admin import site from django.urls import include, path, re_path @@ -24,3 +25,7 @@ path(r'sys/version//', http_basic_login(version), name='sys-version'), ] + +urlpatterns = [ + path(settings.URL_PREFIX, include(urlpatterns)), +] From 44bb3e45a7c0efedf1048c3b5eff8f2ba5626a93 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 18:05:50 +0100 Subject: [PATCH 035/122] =?UTF-8?q?Bump=20version:=201.9a6=20=E2=86=92=201?= =?UTF-8?q?.9a7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- .../web/templates/admin/sysinfo/sysinfo.html | 36 +++++++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 0d33bfb5a..a81cf30a1 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a6 +current_version = 1.9a7 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 228076f8b..db71b6ae5 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a6 +TARGET?=1.9a7 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 437652987..c4746424a 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a6' +VERSION = __version__ = '1.9a7' __author__ = '' diff --git a/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html b/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html new file mode 100644 index 000000000..9583db574 --- /dev/null +++ b/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html @@ -0,0 +1,36 @@ +{% extends "admin/base_site.html" %}{% load i18n sysinfo static %} +{% block extrahead %} + {{ block.super }} + + +{% endblock %} +{% block userlinks %} + +{% endblock userlinks %} +{% block breadcrumbs %} + {{ block.super }} +{% endblock %} +{% block content_title %}{% if title %}

System Information

{% endif %}{% endblock %} + +{% block content %} +
+ Project + - Python + - OS + - Environment + - Modules + - Host + - Extras + {% url "sys-info" as json %} + {% if json %} + view json + {% endif %} +
+ {% section 'project' %} + {% section 'python' %} + {% section 'os' %} + {% section 'environ' %} + {% section 'host' %} + {% section 'modules' %} + {% section 'extra' %} +{% endblock %} From 63c5928bc465c56819a04f39523a34df96dfa537 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 20:09:03 +0100 Subject: [PATCH 036/122] updates requirements --- Pipfile | 4 +- Pipfile.lock | 161 +++++++++--------- .../apps/web/templates/admin/index_new.html | 16 +- .../web/templates/admin/sysinfo/sysinfo.html | 36 ---- 4 files changed, 96 insertions(+), 121 deletions(-) delete mode 100644 src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html diff --git a/Pipfile b/Pipfile index 368e05669..c05fafebc 100644 --- a/Pipfile +++ b/Pipfile @@ -8,7 +8,7 @@ psycopg2 = "*" admin-extra-urls = ">=2.1" celery = "*" coreapi = "*" -django = ">=2.1.4" +django = ">=2.1.5" django-adminfilters = ">=1.1" django-celery-beat = "==1.4.0" django-concurrency = "*" @@ -20,7 +20,7 @@ django-picklefield = "*" django-redis = "*" django-regex = "*" django-strategy-field = "*" -django-sysinfo = "*" +django-sysinfo = "==1.4" djangorestframework-csv = "*" djangorestframework-jwt = "*" drf-dynamic-serializer = ">=1.2.0" diff --git a/Pipfile.lock b/Pipfile.lock index 29c8af3a8..133594532 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "986bb114ad0fafa97bd413df0f19e83a6b29a5bef1af4f7f1729d9bad5ed96c9" + "sha256": "5c241f514b93227c4204e085aba5eb92c93d78d3cb418946e4555016bc134802" }, "pipfile-spec": 6, "requires": { @@ -970,10 +970,10 @@ }, "django-sysinfo": { "hashes": [ - "sha256:bf37be23fbcb9cb0be109a101d6abb73730e8b7d75646329db1267152c829564" + "sha256:73844d6662ab7eb724d40f935aaef84bbe00cbe03a529bf263b54caf918b1c9c" ], "index": "pypi", - "version": "==1.3.2" + "version": "==1.4" }, "django-timezone-field": { "hashes": [ @@ -1235,38 +1235,38 @@ }, "pillow": { "hashes": [ - "sha256:0cd42fe2d99ec6ce23aaf00947a7b7956ad2ed4b1695fd37545c3b8eae06d95a", - "sha256:137bed8972089d65da63fb79b4949b0f2b99e9a58f1b494e82be43ba8b0f4226", - "sha256:14eb2b2e4f2a14f5c89fd0edf55c5af0bf1a40fdf3838d81867f26f131cd557d", - "sha256:1fc43ce8c4fa3754222cd6831d599ad17ca2fc9868d2fb52f4e5362dfbfaf379", - "sha256:26dfeee23a86dad6277a63d18f61f53b957cb2cd3506dbbd74b88ba2fa65b3b1", - "sha256:2e0e582942e025cc58f669499a8e0bffde5bcc8d42b65729f294c1dac54e4672", - "sha256:3bb8dd3ce101dd8b0b37eaae924a5bb93abb6ffdd034bf68a066a808e11768ab", - "sha256:3f07da3874f0b085421f1d4f979785131aa9d497501d8610d82f7378b33858f8", - "sha256:429b2b5ae5f57f8fd9ec2e012c1e7b342ff10f1a8977dc291976b9a3b4c096e1", - "sha256:4a000fdd89d77b6b675de27e1ab91c6fba517c08f19ee83e6716b78930634e04", - "sha256:4ccbe7cce6156391a3ecf447c79a7d4a1a0ecd3de79bdec9ca5e4f7242a306d1", - "sha256:4d08034196db41acb7392e4fccfc0448e7a87192c41d3011ad4093eac2c31ffd", - "sha256:6b202b1cb524bc76ed52a7eb0314f4b0a0497c7cceb9a93539b5a25800e1f2b6", - "sha256:8563b56fa7c34f1606848c2143ea67d27cf225b9726a1b041c3d27cf85e46edc", - "sha256:86d7421e8803d7bae2e594765c378a867b629d46b32fbfe5ed9fd95b30989feb", - "sha256:8d4bddedcb4ab99131d9705a75720efc48b3d006122dae1a4cc329496ac47c9a", - "sha256:a4929c6de9590635c34533609402c9da12b22bfc2feb8c0c4f38c39bab48a9ad", - "sha256:b0736e21798448cee3e663c0df7a6dfa83d805b3f3a45e67f7457a2f019e5fca", - "sha256:b669acba91d47395de84c9ca52a7ad393b487e5ae2e20b9b2790b22a57d479fa", - "sha256:bba993443921f2d077195b425a3283357f52b07807d53704610c1249d20b183a", - "sha256:bdf706a93d00547c9443b2654ae424fd54d5dece4bc4333e7035740aeb7a7cea", - "sha256:c5aa93e55175b9cde95279ccd03c93d218976b376480222d37be41d2c9c54510", - "sha256:cc11fd997d8ad71bb0412e983b711e49639c2ddba9b9dce04d4bdab575fe5f84", - "sha256:d584f1c33995c3dc16a35e30ef43e0881fa0d085f0fef29cebf154ffb5643363", - "sha256:d88f54bdefb7ddccb68efdd710d689aa6a09b875cc3e44b7e81ef54e0751e3a7", - "sha256:de0d323072be72fa4d74f4e013cd594e3f8ee03b2e0eac5876a3249fa076ef7b", - "sha256:f139c963c6679d236b2c45369524338eabd36a853fe23abd39ba246ab0a75aec", - "sha256:f41c0bf667c4c1c30b873eaa8d6bb894f6d721b3e38e9c993bddd1263c02fb1f", - "sha256:fbd0ea468b4ec04270533bf5206f1cd57746fcf226520bb133318fa276de2644", - "sha256:fe2d2850521c467c915ff0a6e27dc64c3c04c2f66612e0072672bd1bd4854b61" - ], - "version": "==5.4.0" + "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e", + "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7", + "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a", + "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3", + "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1", + "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1", + "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7", + "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1", + "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3", + "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055", + "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf", + "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f", + "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f", + "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239", + "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe", + "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c", + "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697", + "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494", + "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356", + "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6", + "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000", + "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f", + "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c", + "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca", + "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8", + "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3", + "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad", + "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9", + "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc", + "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e" + ], + "version": "==5.4.1" }, "psutil": { "hashes": [ @@ -1377,10 +1377,10 @@ }, "pytz": { "hashes": [ - "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", - "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.7" + "version": "==2018.9" }, "pyyaml": { "hashes": [ @@ -1470,30 +1470,29 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:12ddf4dd68ad854c9a1a4843ad364f60f9215f87c85f940bced7d33887f273c8", - "sha256:180b384142a9c0af4a8cfb7df6f0224f2038babc68fcae0b15668c68098b923d", - "sha256:20aed6afc0e35ff0e68cd7266a73119b51d45d2f98d4ad00119f92a44aefa814", - "sha256:23a435391af43dea8e82c3f969134fefce639470bcae8cdf9e632946608819ff", - "sha256:3c4c10a597fbaaf12b1120e32a73761df3c3f27112215137d600760a1d1850c9", - "sha256:3dc6f3f1e5c8c7df29bf0efb24529d4c58a6a2a51d5d871a926e8fc38a352a5a", - "sha256:519aae4b1a37bec1ef7601f8234b03a4f2da7d096b23e4fdc0c3c9fecb423683", - "sha256:665b38b85201cb5f193539d4220bec9c28f47b04f88f7e32e3f452ca7fd65197", - "sha256:6adc866a972f5597df2776897af7ebae7d395e764b835c3261098a004fee0435", - "sha256:70b19f2c0d16a032f1a956c9fc1dfd17146107cb2db9b06e97a79fa4afa96787", - "sha256:7103b3f261d506b27d77e73cf825cba0271b3b10db626eb05708ce94a8d19df8", - "sha256:840596f45d64b021294868e1c9fc1f863dc370eacaf7ca28c0acafdabf6c637a", - "sha256:8516aab859b31e1053b1579f4eb5d3012401ff96a09cd06b44608879612fd64e", - "sha256:8fce1f436bf85b7f1eebacd8441842508ee8c462665f4de5b18363f5471f9ebe", - "sha256:a3e7c6ef13a70759b61b970ba628d140dc3824909e87698290fb51a93ccfb189", - "sha256:a5a04f13bc9c2a0623cf9626bf56c459ed9074bdef6c478a7fc3176891a69b70", - "sha256:c21362219524b81847a1da793d0d6bfdbb6276fae25415b1e491fb70f90ee84e", - "sha256:c461e5caa8e71715f2fc69481f7133cfd957aeecff022e8e773896a014d4e99b", - "sha256:d6e07b58cf9c16fc48eaf809082f81b182c77583fd2e88eb20290c57742cd38e", - "sha256:d6fc12a7061f2337eb487921476d6973519eec1dd64235db2ee9df408136dc86", - "sha256:f82ad2586515ba794f64883e37f76a8d8d42f8d4e4f97fcfbd9da9a37e6d3ed9", - "sha256:fc4e715ab8aea3e54df56a5c053784d7c2992339222da4a45c6b31249a42915c" - ], - "version": "==0.15.83" + "sha256:046b997a0892eebd9ca97823102b330ab3a2da719a6df877b2f2a03e19fb878e", + "sha256:0e7414b6b757ae64d5452a83fb197040a7835ff96fa228f7127c94d54041801d", + "sha256:31d9a1c4d15c02d60c2ca1996dcaf1a6c91b986b72299384071cce40bd1278bf", + "sha256:356ee57fa561243223d91cedb526fd057a91edb744825fe64b6fff23aa262324", + "sha256:3dcede78252a4cf3820928fa75c5928a56cbaedd4c698ea2d1f04e6c36235d6a", + "sha256:4329af449c314ea0565bb5c36dc52232ea9ca32297b58bb2340acf5767719ad6", + "sha256:51d81999ae9cb138a8043908c9406b7bd258a4d616f99200627a81f1c9f85fcb", + "sha256:53ea23234e82242267c4d32611e6907a64f0f2e03b77c19d270bd56b2e375f5b", + "sha256:5a3bf78266761f352d61cb18ee91fa11a1970566238ec732e4ec8857bebdf91d", + "sha256:5ec8f00fc23cca74dfc0529647bb16e5578e247c1ac5182be15dfb949d1304cb", + "sha256:606d3f83ede7a3f76845de64bc8f376df40d166eca782a56a35b8d1961b214e1", + "sha256:66af4e1a5f24534e9d63854ce028d5ccba642c387df6b1b9b39b7a0953d08135", + "sha256:71baa4ca8a7e4e37991f28b17f75d64c56ef82163f79fc9d875712d04c531c5a", + "sha256:7a32ab8866c04d844e1b7116118e7b8e38718a291802a60bb287964bcf4c0f47", + "sha256:a29655dc08ddf64b22c462aad88e4f54b54f80fac2cd8edfe0dcf817987a2722", + "sha256:c1de59975299c919058c54bb9309e430bdcea7239c76021cf082a841e6f8e43c", + "sha256:c3af911ee65e406d7ab0655fc3f4124d5000fcadcb470fe07d37d975f77a1a4c", + "sha256:cdd215fa38b15713378bccc99f3fd1eee06c328fe50b5b17775f7cf3bc047cac", + "sha256:d0ad7a4f8cd8082d0593b87848a46c12fbfb5c5011fb15dfe58941aa2ee5e5e8", + "sha256:e7e5fa36587e6e06b12a678314d2020f90928ea9522001ea7834e3f1e5ac3b98", + "sha256:f34262929dfab42ce88e34e2bc525a36a5972563c5cac1582a20b575303039c4" + ], + "version": "==0.15.84" }, "six": { "hashes": [ @@ -1570,10 +1569,10 @@ }, "vine": { "hashes": [ - "sha256:52116d59bc45392af9fdd3b75ed98ae48a93e822cee21e5fda249105c59a7a72", - "sha256:6849544be74ec3638e84d90bc1cf2e1e9224cc10d96cd4383ec3f69e9bce077b" + "sha256:3cd505dcf980223cfaf13423d371f2e7ff99247e38d5985a01ec8264e4f2aca1", + "sha256:ee4813e915d0e1a54e5c1963fde0855337f82655678540a6bc5996bca4165f76" ], - "version": "==1.1.4" + "version": "==1.2.0" }, "webencodings": { "hashes": [ @@ -1651,11 +1650,11 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:1ed70a0e99742653953d68462378a1a8eb65dca5f7c8fa44a05a2a0b3545df67", - "sha256:6a7f5e0efc563cd1ffeefba6d528b97aa0d313c02dd126ba6c455e5fe5bd48eb", - "sha256:e394827904cc4923f443e8dd2e9968343669c8e1ad7a8d62d7541e780884acb8" + "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858", + "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348", + "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718" ], - "version": "==4.7.0" + "version": "==4.7.1" }, "bumpversion": { "hashes": [ @@ -1681,10 +1680,10 @@ }, "cfgv": { "hashes": [ - "sha256:4e9f92594621a43304928415936a0da1b8d3ced23b0ca8c38e9865343920143c", - "sha256:f2756f6dc1af3762a996b39f20c28b4731b6006e992017442a5fc93e81650791" + "sha256:39d9055c47e3932908fe25abd5807e21dc002630db01c7a5f05738d027e2b706", + "sha256:41d22dd864c474f919ecb88900000d2410d640315f75bdb79b3abf9347089641" ], - "version": "==1.3.0" + "version": "==1.4.0" }, "chardet": { "hashes": [ @@ -2030,18 +2029,18 @@ }, "pytest": { "hashes": [ - "sha256:f689bf2fc18c4585403348dd56f47d87780bf217c53ed9ae7a3e2d7faa45f8e9", - "sha256:f812ea39a0153566be53d88f8de94839db1e8a05352ed8a49525d7d7f37861e9" + "sha256:3e65a22eb0d4f1bdbc1eacccf4a3198bf8d4049dea5112d70a0c61b00e748d02", + "sha256:5924060b374f62608a078494b909d341720a050b5224ff87e17e12377486a71d" ], "index": "pypi", - "version": "==4.0.2" + "version": "==4.1.0" }, "pytest-cov": { "hashes": [ - "sha256:513c425e931a0344944f84ea47f3956be0e416d95acbd897a44970c8d926d5d7", - "sha256:e360f048b7dae3f2f2a9a4d067b2dd6b6a015d384d1577c994a43f3f7cbad762" + "sha256:0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", + "sha256:230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f" ], - "version": "==2.6.0" + "version": "==2.6.1" }, "pytest-cover": { "hashes": [ @@ -2096,10 +2095,10 @@ }, "pytz": { "hashes": [ - "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", - "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.7" + "version": "==2018.9" }, "pyyaml": { "hashes": [ diff --git a/src/etools_datamart/apps/web/templates/admin/index_new.html b/src/etools_datamart/apps/web/templates/admin/index_new.html index fc18bc64f..adad588e8 100644 --- a/src/etools_datamart/apps/web/templates/admin/index_new.html +++ b/src/etools_datamart/apps/web/templates/admin/index_new.html @@ -30,7 +30,19 @@ diff --git a/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html b/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html deleted file mode 100644 index 9583db574..000000000 --- a/src/etools_datamart/apps/web/templates/admin/sysinfo/sysinfo.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "admin/base_site.html" %}{% load i18n sysinfo static %} -{% block extrahead %} - {{ block.super }} - - -{% endblock %} -{% block userlinks %} - -{% endblock userlinks %} -{% block breadcrumbs %} - {{ block.super }} -{% endblock %} -{% block content_title %}{% if title %}

System Information

{% endif %}{% endblock %} - -{% block content %} -
- Project - - Python - - OS - - Environment - - Modules - - Host - - Extras - {% url "sys-info" as json %} - {% if json %} - view json - {% endif %} -
- {% section 'project' %} - {% section 'python' %} - {% section 'os' %} - {% section 'environ' %} - {% section 'host' %} - {% section 'modules' %} - {% section 'extra' %} -{% endblock %} From 2a3d21e7e420a61d5a10d70341053fc6b1ca026f Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 20:09:31 +0100 Subject: [PATCH 037/122] updates CHANGES --- CHANGES | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index d2269b2ec..829b6c49c 100644 --- a/CHANGES +++ b/CHANGES @@ -3,7 +3,7 @@ * WARNINGS: migration reset * Location/GatewayType endpoints * add action to queue multiple tasks -* updates schema to eTools +* updates schema to eTools v6.5.1 1.8 --- From 6c116f7ea76fe04483a135f7526aed4e9cef14cd Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 20:51:07 +0100 Subject: [PATCH 038/122] =?UTF-8?q?Bump=20version:=201.9a7=20=E2=86=92=201?= =?UTF-8?q?.9a8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index a81cf30a1..5ced49c00 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a7 +current_version = 1.9a8 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index db71b6ae5..19a97a01e 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a7 +TARGET?=1.9a8 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index c4746424a..cb21a0594 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,3 @@ NAME = 'etools-datamart' -VERSION = __version__ = '1.9a7' +VERSION = __version__ = '1.9a8' __author__ = '' From 595e231ccf672cafd17de5d341adc974000b564b Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 21:31:42 +0100 Subject: [PATCH 039/122] updates settings to handle URL_PREFIX --- src/etools_datamart/config/settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index eaf230ce5..0e9acc583 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -43,6 +43,7 @@ EMAIL_USE_TLS=(bool, True), ENABLE_LIVE_STATS=(bool, True), ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), + LOGIN_URL=(str, '/login/'), MEDIA_ROOT=(str, '/tmp/media'), REDOC_BASE=(str, '/api/+redoc/#operation/'), SECRET_KEY=(str, 'secret'), @@ -96,8 +97,8 @@ router_factory('etools', ['etools'], syncdb=False), ] -LOGIN_URL = "/login/" -LOGIN_REDIRECT_URL = "/" +LOGIN_URL = env('LOGIN_URL') +LOGIN_REDIRECT_URL = URL_PREFIX # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name From a204f8e51fa284ab114a58a1c85b06f436a21864 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 21:33:20 +0100 Subject: [PATCH 040/122] updates settings to allow TIME_ZONE override --- src/etools_datamart/config/settings.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 0e9acc583..e88227195 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -56,6 +56,7 @@ STATIC_ROOT=(str, '/tmp/static'), STATIC_URL=(str, '/dm-static/'), SYSTEM_PASSWORD=(str, ''), + TIME_ZONE=(str, 'UTC'), URL_PREFIX=(str, ''), USE_X_FORWARDED_HOST=(bool, False), X_FRAME_OPTIONS=(str, 'SAMEORIGIN'), @@ -107,7 +108,7 @@ # timezone as the operating system. # If running in a Windows environment this must be set to the same as your # system time zone. -TIME_ZONE = 'UTC' +TIME_ZONE = env('TIME_ZONE') # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html From fa4b4c37219b8af81ca8b4ec8882bd1b20226392 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 21:36:17 +0100 Subject: [PATCH 041/122] silence 'UserWarning: The psycopg2...' --- manage.py | 3 --- src/etools_datamart/__init__.py | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/manage.py b/manage.py index 78908b0fb..5ecd479c5 100755 --- a/manage.py +++ b/manage.py @@ -1,12 +1,9 @@ #!/usr/bin/env python import os import sys -import warnings from django.core.management import execute_from_command_line -warnings.simplefilter("ignore", UserWarning, 144) - ROOT = os.path.abspath(os.path.dirname(__file__)) SRC = os.path.realpath(os.path.join(ROOT, 'src')) sys.path.append(SRC) diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index cb21a0594..43ef432eb 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,3 +1,8 @@ +import warnings + NAME = 'etools-datamart' VERSION = __version__ = '1.9a8' __author__ = '' + +# UserWarning: The psycopg2 wheel package will be renamed from release 2.8; +warnings.simplefilter("ignore", UserWarning, 144) From 8f46b52a099b625417f21b01800f517fd924418d Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 22:01:14 +0100 Subject: [PATCH 042/122] =?UTF-8?q?Bump=20version:=201.9a8=20=E2=86=92=201?= =?UTF-8?q?.9a9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 5ced49c00..d1aae1288 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a8 +current_version = 1.9a9 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 19a97a01e..7166d3897 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a8 +TARGET?=1.9a9 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 43ef432eb..92882f19c 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a8' +VERSION = __version__ = '1.9a9' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From da9b9681c77d29c67e832067672f81a6a50d2945 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 22:40:39 +0100 Subject: [PATCH 043/122] fixrx login --- src/etools_datamart/config/settings.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index e88227195..4f7c8766b 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -43,7 +43,6 @@ EMAIL_USE_TLS=(bool, True), ENABLE_LIVE_STATS=(bool, True), ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), - LOGIN_URL=(str, '/login/'), MEDIA_ROOT=(str, '/tmp/media'), REDOC_BASE=(str, '/api/+redoc/#operation/'), SECRET_KEY=(str, 'secret'), @@ -98,8 +97,8 @@ router_factory('etools', ['etools'], syncdb=False), ] -LOGIN_URL = env('LOGIN_URL') -LOGIN_REDIRECT_URL = URL_PREFIX +LOGIN_URL = '/login/' +LOGIN_REDIRECT_URL = '/' # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name From 7fe6e9fca35a75a3bf5c433c97dfe4fe8b9c7548 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 7 Jan 2019 23:03:57 +0100 Subject: [PATCH 044/122] =?UTF-8?q?Bump=20version:=201.9a9=20=E2=86=92=201?= =?UTF-8?q?.9a10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index d1aae1288..e21e6e2c3 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a9 +current_version = 1.9a10 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 7166d3897..3d47ad6a0 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a9 +TARGET?=1.9a10 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 92882f19c..4a351916a 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a9' +VERSION = __version__ = '1.9a10' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From dd890f65257a45302665ae4527e3a735eea16ee3 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 12:28:39 +0100 Subject: [PATCH 045/122] fixes permissions --- src/etools_datamart/api/endpoints/common.py | 2 + src/etools_datamart/apps/etl/admin.py | 2 + src/etools_datamart/apps/etl/models.py | 6 ++ src/etools_datamart/apps/web/static/style.css | 10 ++- .../apps/web/static/style.css.map | 2 +- .../apps/web/static/style.scss | 12 +++- .../apps/web/templates/login.html | 66 +++++++++++-------- src/etools_datamart/apps/web/urls.py | 6 +- src/etools_datamart/apps/web/views.py | 10 ++- src/etools_datamart/config/settings.py | 7 +- src/etools_datamart/libs/medusa.py | 31 +++++++++ src/unicef_rest_framework/permissions.py | 16 ++--- 12 files changed, 125 insertions(+), 45 deletions(-) create mode 100644 src/etools_datamart/libs/medusa.py diff --git a/src/etools_datamart/api/endpoints/common.py b/src/etools_datamart/api/endpoints/common.py index 48920ffb9..d96c136d1 100644 --- a/src/etools_datamart/api/endpoints/common.py +++ b/src/etools_datamart/api/endpoints/common.py @@ -21,6 +21,7 @@ from etools_datamart.api.filtering import CountryFilter, DatamartQueryStringFilterBackend, TenantCountryFilter from etools_datamart.apps.etl.models import EtlTask from etools_datamart.apps.multitenant.exceptions import InvalidSchema, NotAuthorizedSchema +from etools_datamart.libs.medusa import MedusaBasicAuthentication __all__ = ['APIMultiTenantReadOnlyModelViewSet'] @@ -49,6 +50,7 @@ class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin): OrderingFilter, DynamicSerializerFilter, ] + authentication_classes = URFReadOnlyModelViewSet.authentication_classes + (MedusaBasicAuthentication,) # filter_fields = ['country_name'] ordering_fields = ('id',) ordering = 'id' diff --git a/src/etools_datamart/apps/etl/admin.py b/src/etools_datamart/apps/etl/admin.py index b58338968..cd54a652d 100644 --- a/src/etools_datamart/apps/etl/admin.py +++ b/src/etools_datamart/apps/etl/admin.py @@ -106,6 +106,8 @@ def changeform_view(self, request, object_id=None, form_url='', extra_context=No def queue(self, request, pk): obj = self.get_object(request, pk) try: + obj.status = 'QUEUED' + obj.save() task = app.tasks.get(obj.task) task.delay() self.message_user(request, f"Task '{obj.task}' queued", messages.SUCCESS) diff --git a/src/etools_datamart/apps/etl/models.py b/src/etools_datamart/apps/etl/models.py index 02c7fc8f2..a16d53442 100644 --- a/src/etools_datamart/apps/etl/models.py +++ b/src/etools_datamart/apps/etl/models.py @@ -39,6 +39,12 @@ def inspect(self): class EtlTask(models.Model): + STATUSES = (('QUEUED', 'QUEUED'), + ('RUNNING', 'RUNNING'), + ('FAILURE', 'FAILURE'), + ('SUCCESS', 'SUCCESS'), + ('ERROR', 'ERROR'), + ) task = models.CharField(max_length=200, unique=True) last_run = models.DateTimeField(null=True, help_text="last execution time") status = models.CharField(max_length=200) diff --git a/src/etools_datamart/apps/web/static/style.css b/src/etools_datamart/apps/web/static/style.css index d3f4e47a1..fddbb9259 100644 --- a/src/etools_datamart/apps/web/static/style.css +++ b/src/etools_datamart/apps/web/static/style.css @@ -71,7 +71,7 @@ body span.str, html span.str { width: 50%; flex-wrap: wrap; } -.right form { +.right form, .right #login-menu { padding: 100px 0 0 65px; } .right .center { @@ -84,7 +84,13 @@ body span.str, html span.str { text-align: center; } .right h2 { - font-size: 14pt; + font-size: 16pt; +} +.right h1, .right h2, .right h3, .right h4 { + margin: 20px; +} +.right a { + text-decoration: none; } ul.index-menu { diff --git a/src/etools_datamart/apps/web/static/style.css.map b/src/etools_datamart/apps/web/static/style.css.map index f0ed5652e..679e73d72 100644 --- a/src/etools_datamart/apps/web/static/style.css.map +++ b/src/etools_datamart/apps/web/static/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AACA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAKJ;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EAMA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAcF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAaF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAyCA;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIA;EACE;;AAEA;EAKE;EACA;;AALA;EACE;;AAQN;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAQJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAQN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;;AAEA;EACE;EAEA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["style.scss"],"names":[],"mappings":"AACA;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAIA;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAEA;EACE;;AAKJ;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EAMA;;AAEA;EACE;;AAGF;EACE;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;;AAGF;EACE;EACA;;;AAKJ;EACE;EACA;;;AAGF;EACE;EACA;;;AAcF;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAaF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;AAyCA;EACE;EACA;EACA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;;;AAIA;EACE;;AAEA;EAKE;EACA;;AALA;EACE;;AAQN;EACE;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;AAQJ;EACE;;AAEA;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;;;AAQN;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAKF;EACE;EACA;;AAEA;EACE;EAEA;EACA;EACA;EACA;EACA;;AAIJ;EACE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA","file":"style.css"} \ No newline at end of file diff --git a/src/etools_datamart/apps/web/static/style.scss b/src/etools_datamart/apps/web/static/style.scss index 7e029a269..3b4a9582c 100644 --- a/src/etools_datamart/apps/web/static/style.scss +++ b/src/etools_datamart/apps/web/static/style.scss @@ -83,7 +83,7 @@ body, html { //display: flex; flex-wrap: wrap; - form { + form, #login-menu { padding: 100px 0 0 65px; } @@ -99,7 +99,15 @@ body, html { } h2 { - font-size: 14pt; + font-size: 16pt; + } + + h1, h2, h3, h4 { + margin: 20px; + } + + a { + text-decoration: none; } } diff --git a/src/etools_datamart/apps/web/templates/login.html b/src/etools_datamart/apps/web/templates/login.html index 07f0f6ed8..b4759409c 100644 --- a/src/etools_datamart/apps/web/templates/login.html +++ b/src/etools_datamart/apps/web/templates/login.html @@ -3,33 +3,47 @@ {% block title %}Login{% endblock %} {% block right %} -
- {% csrf_token %} - - Account Login - - -
- - -
-
- - -
- -
- -
+
- - - - + {% if settings.DEBUG %} +

OR

+ + {% endif %} +
+ + + {% endblock %} diff --git a/src/etools_datamart/apps/web/urls.py b/src/etools_datamart/apps/web/urls.py index cc066783c..ffd010c69 100644 --- a/src/etools_datamart/apps/web/urls.py +++ b/src/etools_datamart/apps/web/urls.py @@ -1,12 +1,12 @@ -from django.contrib.auth.views import LoginView, LogoutView +from django.contrib.auth.views import LogoutView from django.urls import path -from .views import DisconnectView, index, monitor +from .views import DatamartLoginView, DisconnectView, index, monitor urlpatterns = [ path(r'', index, name='home'), path(r'monitor/', monitor, name='monitor'), - path(r'login/', LoginView.as_view(template_name='login.html'), name='login'), + path(r'login/', DatamartLoginView.as_view(template_name='login.html'), name='login'), path(r'logout/', LogoutView.as_view(next_page='/'), name='logout'), path(r'disconnect/', DisconnectView.as_view(next_page='/'), name='disconnect'), diff --git a/src/etools_datamart/apps/web/views.py b/src/etools_datamart/apps/web/views.py index 8fe858b6d..58b4fae14 100644 --- a/src/etools_datamart/apps/web/views.py +++ b/src/etools_datamart/apps/web/views.py @@ -1,5 +1,6 @@ +from django.conf import settings from django.contrib.auth.decorators import login_required -from django.contrib.auth.views import LogoutView +from django.contrib.auth.views import LoginView, LogoutView from django.template.response import TemplateResponse from etools_datamart.apps.etl.models import EtlTask @@ -22,3 +23,10 @@ def monitor(request): class DisconnectView(LogoutView): def get_next_page(self): # pragma: no cover return env('DISCONNECT_URL') + + +class DatamartLoginView(LoginView): + + def get_context_data(self, **kwargs): + kwargs['settings'] = settings + return super().get_context_data(**kwargs) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 4f7c8766b..784e6c472 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -44,12 +44,13 @@ ENABLE_LIVE_STATS=(bool, True), ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), MEDIA_ROOT=(str, '/tmp/media'), + MEDUSA_PASSWORD=(str, ''), REDOC_BASE=(str, '/api/+redoc/#operation/'), SECRET_KEY=(str, 'secret'), SECURE_BROWSER_XSS_FILTER=(bool, True), SECURE_CONTENT_TYPE_NOSNIFF=(bool, True), SECURE_FRAME_DENY=(bool, True), - SECURE_HSTS_PRELOAD=(bool, 'True'), + SECURE_HSTS_PRELOAD=(bool, True), SECURE_SSL_REDIRECT=(bool, True), SESSION_COOKIE_SECURE=(bool, True), STATIC_ROOT=(str, '/tmp/static'), @@ -58,7 +59,7 @@ TIME_ZONE=(str, 'UTC'), URL_PREFIX=(str, ''), USE_X_FORWARDED_HOST=(bool, False), - X_FRAME_OPTIONS=(str, 'SAMEORIGIN'), + X_FRAME_OPTIONS=(str, 'DENY'), ) DEBUG = env.bool('DEBUG') @@ -190,7 +191,9 @@ 'unicef_security.graph.AzureADTenantOAuth2Ext', 'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.RemoteUserBackend', + 'etools_datamart.libs.medusa.MedusaBackend', ] +MEDUSA_PASSWORD = env('MEDUSA_PASSWORD') CACHES = { 'default': env.cache(), diff --git a/src/etools_datamart/libs/medusa.py b/src/etools_datamart/libs/medusa.py new file mode 100644 index 000000000..7b78f6169 --- /dev/null +++ b/src/etools_datamart/libs/medusa.py @@ -0,0 +1,31 @@ +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend + +from rest_framework.authentication import BasicAuthentication + +UserModel = get_user_model() + + +def medusa_auth(username, password): + try: + user = UserModel._default_manager.get_by_natural_key(username) + except UserModel.DoesNotExist: + # Run the default password hasher once to reduce the timing + # difference between an existing and a nonexistent user (#20760). + UserModel().set_password(password) + else: + if password and (password == settings.MEDUSA_PASSWORD): + return user + + +class MedusaBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + if username is None: + username = kwargs.get(UserModel.USERNAME_FIELD) + return medusa_auth(username, password) + + +class MedusaBasicAuthentication(BasicAuthentication): + def authenticate_credentials(self, userid, password, request=None): + return medusa_auth(userid, password) diff --git a/src/unicef_rest_framework/permissions.py b/src/unicef_rest_framework/permissions.py index 21e7bae6e..01ba189dd 100644 --- a/src/unicef_rest_framework/permissions.py +++ b/src/unicef_rest_framework/permissions.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import logging +from functools import lru_cache from rest_framework.exceptions import PermissionDenied from rest_framework.permissions import BasePermission @@ -13,15 +14,14 @@ class ServicePermission(BasePermission): - # serializer_field = "-serializer" - + @lru_cache(10) def get_acl(self, request, service: Service): - try: - return UserAccessControl.objects.filter(service=service, - user=request.user).order_by('-policy') - except UserAccessControl.DoesNotExist: - return GroupAccessControl.objects.filter(service=service, - group__user=request.user).order_by('-policy') + # PERF: this can be can be cached if we need to handle + # consecutive OPTIONS/GET requests + return (list(UserAccessControl.objects.filter(service=service, + user=request.user).order_by('-policy')) + + list(GroupAccessControl.objects.filter(service=service, + group__user=request.user).order_by('-policy'))) def has_permission(self, request, view): if request.user.is_superuser: From 7651f37d1c446e7e918e7b97e1f84703d8b7b58b Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 12:40:47 +0100 Subject: [PATCH 046/122] =?UTF-8?q?Bump=20version:=201.9a10=20=E2=86=92=20?= =?UTF-8?q?1.9a11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e21e6e2c3..e07e8acff 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a10 +current_version = 1.9a11 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 3d47ad6a0..4f0046f43 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a10 +TARGET?=1.9a11 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 4a351916a..fadfa6a41 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a10' +VERSION = __version__ = '1.9a11' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 83d19fa71ca77694384edc88304fb5fc8f918686 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 20:25:48 +0100 Subject: [PATCH 047/122] fixes date/time format --- src/etools_datamart/config/settings.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 784e6c472..de65d7e8d 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -313,8 +313,7 @@ 'django_celery_beat', ] -# DATE_FORMAT = '%d %b %Y' -DATE_FORMAT = 'N j, Y' # default +DATE_FORMAT = '%d %b %Y' DATE_INPUT_FORMATS = [ '%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06' '%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006' @@ -323,8 +322,7 @@ '%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006' ] -# DATETIME_FORMAT = '%d %b %Y %H:%M:%S' -DATETIME_FORMAT = 'N j, Y, P' # default +DATETIME_FORMAT = '%d %b %Y %H:%M:%S' DATETIME_INPUT_FORMATS = [ '%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59' From cb07a99a6c4b86980243a3ef0ba9e2c3d9d7d8d7 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 20:58:40 +0100 Subject: [PATCH 048/122] =?UTF-8?q?Bump=20version:=201.9a11=20=E2=86=92=20?= =?UTF-8?q?1.9a12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- tests/api/interfaces/test_data.py | 0 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 tests/api/interfaces/test_data.py diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e07e8acff..47e9d681a 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a11 +current_version = 1.9a12 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 4f0046f43..beafe61b1 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a11 +TARGET?=1.9a12 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index fadfa6a41..cdd117762 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a11' +VERSION = __version__ = '1.9a12' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; diff --git a/tests/api/interfaces/test_data.py b/tests/api/interfaces/test_data.py new file mode 100644 index 000000000..e69de29bb From f15a4189eca2e199a70288cbb5992b63a8082ffa Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 21:10:44 +0100 Subject: [PATCH 049/122] remove username from api page --- .../templates/rest_framework/base.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index 2189f776a..c276842eb 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -67,15 +67,15 @@ {% endblock %} - +{# #} {% endblock %} From eebd96c88bac0030f3ea3ef9c5f90cd638ba14cc Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 21:26:15 +0100 Subject: [PATCH 050/122] in browsable API, display username using ajax to allow page caching --- src/etools_datamart/apps/web/urls.py | 3 ++- src/etools_datamart/apps/web/views.py | 14 +++++++++++--- .../templates/rest_framework/base.html | 13 +++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/etools_datamart/apps/web/urls.py b/src/etools_datamart/apps/web/urls.py index ffd010c69..a466b67f2 100644 --- a/src/etools_datamart/apps/web/urls.py +++ b/src/etools_datamart/apps/web/urls.py @@ -1,7 +1,7 @@ from django.contrib.auth.views import LogoutView from django.urls import path -from .views import DatamartLoginView, DisconnectView, index, monitor +from .views import DatamartLoginView, DisconnectView, index, monitor, whoami urlpatterns = [ path(r'', index, name='home'), @@ -9,5 +9,6 @@ path(r'login/', DatamartLoginView.as_view(template_name='login.html'), name='login'), path(r'logout/', LogoutView.as_view(next_page='/'), name='logout'), path(r'disconnect/', DisconnectView.as_view(next_page='/'), name='disconnect'), + path(r'whoami/', whoami, name='whoami'), ] diff --git a/src/etools_datamart/apps/web/views.py b/src/etools_datamart/apps/web/views.py index 58b4fae14..5ecc1bcc4 100644 --- a/src/etools_datamart/apps/web/views.py +++ b/src/etools_datamart/apps/web/views.py @@ -1,6 +1,7 @@ from django.conf import settings from django.contrib.auth.decorators import login_required from django.contrib.auth.views import LoginView, LogoutView +from django.http import HttpResponse from django.template.response import TemplateResponse from etools_datamart.apps.etl.models import EtlTask @@ -20,6 +21,13 @@ def monitor(request): return TemplateResponse(request, 'monitor.html', context) +@login_required +def whoami(request): + if request.user.is_authenticated: + return HttpResponse(request.user.email) + return HttpResponse('') + + class DisconnectView(LogoutView): def get_next_page(self): # pragma: no cover return env('DISCONNECT_URL') @@ -27,6 +35,6 @@ def get_next_page(self): # pragma: no cover class DatamartLoginView(LoginView): - def get_context_data(self, **kwargs): - kwargs['settings'] = settings - return super().get_context_data(**kwargs) + def get_context_data(self, **kwargs): + kwargs['settings'] = settings + return super().get_context_data(**kwargs) diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index c276842eb..6ed85259c 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -67,15 +67,16 @@ {% endblock %} -{# {% endblock %} @@ -418,6 +419,10 @@ console.log( data ) }); }); + $.get("{% url 'whoami' %}") + .done(function (data) { + $("#whoami").text(data); + }) {% endblock %} From 08ccef07011e8f805b6733fe1ae1ac915ceb19ed Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 21:34:25 +0100 Subject: [PATCH 051/122] removes some extra lru_cache decorators --- src/unicef_rest_framework/cache.py | 6 ++++++ src/unicef_rest_framework/views.py | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/unicef_rest_framework/cache.py b/src/unicef_rest_framework/cache.py index 24442ac8f..f34129bcc 100644 --- a/src/unicef_rest_framework/cache.py +++ b/src/unicef_rest_framework/cache.py @@ -131,6 +131,11 @@ def get_data(self, params, view_instance, view_method, request, args, kwargs): return {'path': str(request.path)} +class SuperuserKeyBit(KeyBitBase): + def get_data(self, params, view_instance, view_method, request, args, kwargs): + return {'admin': request.user.is_superuser} + + class DevelopKeyBit(KeyBitBase): def get_data(self, params, view_instance, view_method, request, args, kwargs): if 'disable-cache' in request.GET: @@ -146,6 +151,7 @@ class ListKeyConstructor(KeyConstructor): format = bits.FormatKeyBit() headers = bits.HeadersKeyBit(['Accept']) dev = DevelopKeyBit() + admin = SuperuserKeyBit() # language = bits.LanguageKeyBit() # list_sql_query = bits.ListSqlQueryKeyBit() # NEVER NEVER USE THIS diff --git a/src/unicef_rest_framework/views.py b/src/unicef_rest_framework/views.py index 1e69ef74b..d5b1f22d9 100644 --- a/src/unicef_rest_framework/views.py +++ b/src/unicef_rest_framework/views.py @@ -1,6 +1,4 @@ # -*- coding: utf-8 -*- -from functools import lru_cache - import rest_framework_extensions.utils from drf_querystringfilter.backend import QueryStringFilterBackend from rest_framework import viewsets @@ -114,7 +112,6 @@ def label(cls): return cls.__name__.replace("ViewSet", "") @classmethod - @lru_cache() def get_service(cls): from unicef_rest_framework.models import Service return Service.objects.get_for_viewset(cls) From 5e0a508fb0f0c5f3f0d8ea28e9ce47c646c5cde4 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 21:44:29 +0100 Subject: [PATCH 052/122] add isstaff check cache --- src/unicef_rest_framework/cache.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/unicef_rest_framework/cache.py b/src/unicef_rest_framework/cache.py index f34129bcc..af883318c 100644 --- a/src/unicef_rest_framework/cache.py +++ b/src/unicef_rest_framework/cache.py @@ -136,6 +136,11 @@ def get_data(self, params, view_instance, view_method, request, args, kwargs): return {'admin': request.user.is_superuser} +class IsStaffKeyBit(KeyBitBase): + def get_data(self, params, view_instance, view_method, request, args, kwargs): + return {'staff': request.user.is_staff} + + class DevelopKeyBit(KeyBitBase): def get_data(self, params, view_instance, view_method, request, args, kwargs): if 'disable-cache' in request.GET: @@ -152,6 +157,7 @@ class ListKeyConstructor(KeyConstructor): headers = bits.HeadersKeyBit(['Accept']) dev = DevelopKeyBit() admin = SuperuserKeyBit() + staff = IsStaffKeyBit() # language = bits.LanguageKeyBit() # list_sql_query = bits.ListSqlQueryKeyBit() # NEVER NEVER USE THIS From e734637ec60298cb1af5d5f59d4fe245cf7ea585 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 21:55:26 +0100 Subject: [PATCH 053/122] =?UTF-8?q?Bump=20version:=201.9a12=20=E2=86=92=20?= =?UTF-8?q?1.9a13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 47e9d681a..0c7c6e1e1 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a12 +current_version = 1.9a13 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index beafe61b1..bd13c163b 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a12 +TARGET?=1.9a13 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index cdd117762..3823bf6f5 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a12' +VERSION = __version__ = '1.9a13' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 73bfd58a205a369e11e38e4b573ca4f171f86dc5 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 23:08:51 +0100 Subject: [PATCH 054/122] add APIChecker tests --- .../data/FAMIndicatorViewSet.fixture.json | 91 ++++++++ .../test_data/data/HACTViewSet.fixture.json | 61 +++++ .../data/InterventionViewSet.fixture.json | 160 ++++++++++++++ .../data/PMPIndicatorsViewSet.fixture.json | 124 +++++++++++ .../data/UserStatsViewSet.fixture.json | 55 +++++ .../record/FAMIndicatorViewSet.fixture.json | 33 +++ .../test_data/record/HACTViewSet.fixture.json | 23 ++ .../record/InterventionViewSet.fixture.json | 56 +++++ .../record/PMPIndicatorsViewSet.fixture.json | 44 ++++ .../record/UserStatsViewSet.fixture.json | 21 ++ ...est_datamart_fam-indicators_.response.json | 139 ++++++++++++ ...t__api_latest_datamart_hact_.response.json | 109 +++++++++ ...test_datamart_interventions_.response.json | 208 ++++++++++++++++++ ...est_datamart_pmp-indicators_.response.json | 172 +++++++++++++++ ..._latest_datamart_user-stats_.response.json | 103 +++++++++ ...datamart_fam-indicators_353_.response.json | 70 ++++++ ...api_latest_datamart_hact_18_.response.json | 60 +++++ ..._datamart_interventions_216_.response.json | 93 ++++++++ ...datamart_pmp-indicators_364_.response.json | 81 +++++++ ...test_datamart_user-stats_98_.response.json | 58 +++++ tests/api/interfaces/test_data.py | 89 ++++++++ 21 files changed, 1850 insertions(+) create mode 100644 tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json create mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json diff --git a/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json new file mode 100644 index 000000000..075c51054 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json @@ -0,0 +1,91 @@ +{ + "data": { + "master": [ + { + "model": "data.famindicator", + "pk": 350, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.509Z", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + } + }, + { + "model": "data.famindicator", + "pk": 351, + "fields": { + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.515Z", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + } + }, + { + "model": "data.famindicator", + "pk": 352, + "fields": { + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.518Z", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + } + } + ], + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json new file mode 100644 index 000000000..f5e11d3f5 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json @@ -0,0 +1,61 @@ +{ + "data": { + "master": [ + { + "model": "data.hact", + "pk": 15, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:11.031Z", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + } + }, + { + "model": "data.hact", + "pk": 16, + "fields": { + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:11.041Z", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + } + }, + { + "model": "data.hact", + "pk": 17, + "fields": { + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:11.045Z", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + } + } + ], + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json new file mode 100644 index 000000000..c73713d74 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json @@ -0,0 +1,160 @@ +{ + "data": { + "master": [ + { + "model": "data.intervention", + "pk": 213, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.048Z", + "seen": null, + "created": "2019-01-08T21:51:10.048Z", + "updated": null, + "document_type": null, + "number": "#000", + "title": "title000", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "metadata": {}, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + } + }, + { + "model": "data.intervention", + "pk": 214, + "fields": { + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.064Z", + "seen": null, + "created": "2019-01-08T21:51:10.064Z", + "updated": null, + "document_type": null, + "number": "#001", + "title": "title001", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "metadata": {}, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + } + }, + { + "model": "data.intervention", + "pk": 215, + "fields": { + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.068Z", + "seen": null, + "created": "2019-01-08T21:51:10.068Z", + "updated": null, + "document_type": null, + "number": "#002", + "title": "title002", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "metadata": {}, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + } + } + ], + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json new file mode 100644 index 000000000..8a229cc0e --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json @@ -0,0 +1,124 @@ +{ + "data": { + "master": [ + { + "model": "data.pmpindicators", + "pk": 361, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:47:03.234Z", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "2019-01-08T21:47:03.234Z", + "updated": null + } + }, + { + "model": "data.pmpindicators", + "pk": 362, + "fields": { + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "2019-01-08T21:47:03.249Z", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "2019-01-08T21:47:03.249Z", + "updated": null + } + }, + { + "model": "data.pmpindicators", + "pk": 363, + "fields": { + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "2019-01-08T21:47:03.260Z", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "2019-01-08T21:47:03.260Z", + "updated": null + } + } + ], + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json new file mode 100644 index 000000000..62ac958dd --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json @@ -0,0 +1,55 @@ +{ + "data": { + "master": [ + { + "model": "data.userstats", + "pk": 95, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.807Z", + "seen": null, + "month": "2019-01-01", + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + } + }, + { + "model": "data.userstats", + "pk": 96, + "fields": { + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.822Z", + "seen": null, + "month": "2019-02-01", + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + } + }, + { + "model": "data.userstats", + "pk": 97, + "fields": { + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "2019-01-08T21:51:10.837Z", + "seen": null, + "month": "2019-01-01", + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + } + } + ], + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json new file mode 100644 index 000000000..cab05950f --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json @@ -0,0 +1,33 @@ +{ + "record": { + "master": { + "model": "data.famindicator", + "pk": 353, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T22:06:07.843Z", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + } + }, + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json new file mode 100644 index 000000000..bcfe54c83 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json @@ -0,0 +1,23 @@ +{ + "record": { + "master": { + "model": "data.hact", + "pk": 18, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T22:06:08.348Z", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + } + }, + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json new file mode 100644 index 000000000..e9131f847 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json @@ -0,0 +1,56 @@ +{ + "record": { + "master": { + "model": "data.intervention", + "pk": 216, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T22:06:07.546Z", + "seen": null, + "created": "2019-01-08T22:06:07.546Z", + "updated": null, + "document_type": null, + "number": "#000", + "title": "title000", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "metadata": {}, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + } + }, + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json new file mode 100644 index 000000000..5ab2c63db --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json @@ -0,0 +1,44 @@ +{ + "record": { + "master": { + "model": "data.pmpindicators", + "pk": 364, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T21:58:34.612Z", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "2019-01-08T21:58:34.612Z", + "updated": null + } + }, + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json new file mode 100644 index 000000000..7f936de91 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json @@ -0,0 +1,21 @@ +{ + "record": { + "master": { + "model": "data.userstats", + "pk": 98, + "fields": { + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "2019-01-08T22:06:08.171Z", + "seen": null, + "month": "2019-03-01", + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + } + }, + "deps": [] + } +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json new file mode 100644 index 000000000..7ee515921 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json @@ -0,0 +1,139 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"bd9f1d0fe33faa948080db4555d90188\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.famindicator.FAMIndicatorViewSet" + ], + "service": [ + "service", + "FAMIndicator" + ], + "cache-version": [ + "cache-version", + "1" + ], + "system-filters": [ + "system-filters", + "" + ], + "cache-key": [ + "cache-key", + "bd9f1d0fe33faa948080db4555d90188" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "1827" + ] + }, + "data": { + "count": 3, + "next": null, + "current_page": 1, + "total_pages": 1, + "previous": null, + "results": [ + { + "id": 350, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + }, + { + "id": 351, + "country_name": "chad", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + }, + { + "id": 352, + "country_name": "lebanon", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + } + ] + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json new file mode 100644 index 000000000..5b5e086c8 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json @@ -0,0 +1,109 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"5c4875ec4c135e010d587a1ba4b756ae\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.hact.HACTViewSet" + ], + "service": [ + "service", + "HACT" + ], + "cache-version": [ + "cache-version", + "1" + ], + "system-filters": [ + "system-filters", + "" + ], + "cache-key": [ + "cache-key", + "5c4875ec4c135e010d587a1ba4b756ae" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "903" + ] + }, + "data": { + "count": 3, + "next": null, + "current_page": 1, + "total_pages": 1, + "previous": null, + "results": [ + { + "id": 15, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:11", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + }, + { + "id": 16, + "country_name": "chad", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:11", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + }, + { + "id": 17, + "country_name": "lebanon", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:11", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + } + ] + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json new file mode 100644 index 000000000..39df4fff0 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json @@ -0,0 +1,208 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"e9aa586241baaf7ebeec0807cdfc94a2\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.intervention.InterventionViewSet" + ], + "service": [ + "service", + "Intervention" + ], + "cache-version": [ + "cache-version", + "1" + ], + "system-filters": [ + "system-filters", + "" + ], + "cache-key": [ + "cache-key", + "e9aa586241baaf7ebeec0807cdfc94a2" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "3735" + ] + }, + "data": { + "count": 3, + "next": null, + "current_page": 1, + "total_pages": 1, + "previous": null, + "results": [ + { + "id": 213, + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "created": "08 Jan 2019 21:51:10", + "updated": null, + "document_type": null, + "number": "#000", + "title": "title000", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + }, + { + "id": 214, + "country_name": "chad", + "schema_name": "chad", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "created": "08 Jan 2019 21:51:10", + "updated": null, + "document_type": null, + "number": "#001", + "title": "title001", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + }, + { + "id": 215, + "country_name": "lebanon", + "schema_name": "lebanon", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "created": "08 Jan 2019 21:51:10", + "updated": null, + "document_type": null, + "number": "#002", + "title": "title002", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + } + ] + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json new file mode 100644 index 000000000..9b809445f --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json @@ -0,0 +1,172 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"86df929f9a506018223c50ab96074fa6\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.pmpindicators.PMPIndicatorsViewSet" + ], + "service": [ + "service", + "PMPIndicators" + ], + "cache-version": [ + "cache-version", + "1" + ], + "system-filters": [ + "system-filters", + "" + ], + "cache-key": [ + "cache-key", + "86df929f9a506018223c50ab96074fa6" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "2322" + ] + }, + "data": { + "count": 3, + "next": null, + "current_page": 1, + "total_pages": 1, + "previous": null, + "results": [ + { + "id": 361, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:47:03", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "08 Jan 2019 21:47:03", + "updated": null + }, + { + "id": 362, + "country_name": "chad", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:47:03", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "08 Jan 2019 21:47:03", + "updated": null + }, + { + "id": 363, + "country_name": "lebanon", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:47:03", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "08 Jan 2019 21:47:03", + "updated": null + } + ] + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json new file mode 100644 index 000000000..d920dd292 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json @@ -0,0 +1,103 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"2289007146baa7a1a21386bab566e9a7\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.user.UserStatsViewSet" + ], + "service": [ + "service", + "UserStats" + ], + "cache-version": [ + "cache-version", + "1" + ], + "system-filters": [ + "system-filters", + "" + ], + "cache-key": [ + "cache-key", + "2289007146baa7a1a21386bab566e9a7" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "600" + ] + }, + "data": { + "count": 3, + "next": null, + "current_page": 1, + "total_pages": 1, + "previous": null, + "results": [ + { + "id": 95, + "month": "Jan 2019", + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + }, + { + "id": 96, + "month": "Feb 2019", + "country_name": "chad", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + }, + { + "id": 97, + "month": "Jan 2019", + "country_name": "lebanon", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:51:10", + "seen": null, + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + } + ] + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json new file mode 100644 index 000000000..c79a3052b --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json @@ -0,0 +1,70 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"2f82099fefad7a87bbfb38dfe0e38912\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.famindicator.FAMIndicatorViewSet" + ], + "service": [ + "service", + "FAMIndicator" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "581" + ] + }, + "data": { + "id": 353, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 22:06:07", + "seen": null, + "month": "2019-01-01", + "spotcheck_ip_contacted": 0, + "spotcheck_report_submitted": 0, + "spotcheck_final_report": 0, + "spotcheck_cancelled": 0, + "audit_ip_contacted": 0, + "audit_report_submitted": 0, + "audit_final_report": 0, + "audit_cancelled": 0, + "specialaudit_ip_contacted": 0, + "specialaudit_report_submitted": 0, + "specialaudit_final_report": 0, + "specialaudit_cancelled": 0, + "microassessment_ip_contacted": 0, + "microassessment_report_submitted": 0, + "microassessment_final_report": 0, + "microassessment_cancelled": 0 + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json new file mode 100644 index 000000000..00d28a1f9 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json @@ -0,0 +1,60 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"3b892be720654ecc82d51991054edeed\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.hact.HACTViewSet" + ], + "service": [ + "service", + "HACT" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "273" + ] + }, + "data": { + "id": 18, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 22:06:08", + "seen": null, + "year": 2019, + "microassessments_total": 0, + "programmaticvisits_total": 0, + "followup_spotcheck": 0, + "completed_spotcheck": 0, + "completed_hact_audits": 0, + "completed_special_audits": 0 + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json new file mode 100644 index 000000000..1c3226361 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json @@ -0,0 +1,93 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"8703aa6dc8ce1b0b33a37978212500a6\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.intervention.InterventionViewSet" + ], + "service": [ + "service", + "Intervention" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "1218" + ] + }, + "data": { + "id": 216, + "country_name": "bolivia", + "schema_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 22:06:07", + "seen": null, + "created": "08 Jan 2019 22:06:07", + "updated": null, + "document_type": null, + "number": "#000", + "title": "title000", + "status": null, + "start_date": null, + "end_date": null, + "submission_date": null, + "submission_date_prc": null, + "review_date_prc": null, + "prc_review_document": null, + "signed_by_unicef_date": null, + "signed_by_partner_date": null, + "population_focus": null, + "partner_authorized_officer_signatory_id": null, + "signed_pd_document": null, + "contingency_pd": null, + "unicef_signatory_first_name": null, + "unicef_signatory_last_name": null, + "unicef_signatory_email": null, + "partner_name": null, + "partner_signatory_title": null, + "partner_signatory_first_name": null, + "partner_signatory_last_name": null, + "partner_signatory_email": null, + "partner_signatory_phone": null, + "unicef_focal_point_first_name": null, + "unicef_focal_point_last_name": null, + "unicef_focal_point_email": null, + "partner_focal_point_title": null, + "partner_focal_point_first_name": null, + "partner_focal_point_last_name": null, + "partner_focal_point_email": null, + "partner_focal_point_phone": null, + "intervention_id": null, + "agreement_id": null, + "country_programme_id": null, + "unicef_signatory_id": null + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json new file mode 100644 index 000000000..d8a1a7efa --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json @@ -0,0 +1,81 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"24c358bd872bde9449ef51355bbc35f8\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.pmpindicators.PMPIndicatorsViewSet" + ], + "service": [ + "service", + "PMPIndicators" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "746" + ] + }, + "data": { + "id": 364, + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 21:58:34", + "seen": null, + "vendor_number": null, + "partner_name": null, + "partner_type": null, + "pd_ssfa_ref": null, + "pd_ssfa_status": null, + "pd_ssfa_start_date": null, + "pd_ssfa_creation_date": null, + "pd_ssfa_end_date": null, + "cash_contribution": null, + "supply_contribution": null, + "total_budget": null, + "unicef_budget": null, + "currency": null, + "partner_contribution": null, + "unicef_cash": null, + "in_kind_amount": null, + "total": null, + "fr_numbers_against_pd_ssfa": null, + "fr_currencies": null, + "sum_of_all_fr_planned_amount": null, + "core_value_attached": null, + "partner_link": null, + "intervention_link": null, + "country_id": null, + "partner_id": null, + "intervention_id": null, + "created": "08 Jan 2019 21:58:34", + "updated": null + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json new file mode 100644 index 000000000..c7337c3e4 --- /dev/null +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json @@ -0,0 +1,58 @@ +{ + "status_code": 200, + "headers": { + "content-type": [ + "Content-Type", + "application/json" + ], + "vary": [ + "Vary", + "Accept, Origin" + ], + "allow": [ + "Allow", + "GET, HEAD, OPTIONS" + ], + "etag": [ + "ETag", + "\"272213a40f8c70916f6a8a454fb99b1c\"" + ], + "x-frame-options": [ + "X-Frame-Options", + "DENY" + ], + "view": [ + "view", + "etools_datamart.api.endpoints.datamart.user.UserStatsViewSet" + ], + "service": [ + "service", + "UserStats" + ], + "cache-hit": [ + "cache-hit", + "False" + ], + "cache-ttl": [ + "cache-ttl", + "1y" + ], + "content-length": [ + "Content-Length", + "172" + ] + }, + "data": { + "id": 98, + "month": "Mar 2019", + "country_name": "bolivia", + "area_code": "", + "last_modify_date": "08 Jan 2019 22:06:08", + "seen": null, + "total": 0, + "unicef": 0, + "logins": 0, + "unicef_logins": 0 + }, + "content_type": null +} \ No newline at end of file diff --git a/tests/api/interfaces/test_data.py b/tests/api/interfaces/test_data.py index e69de29bb..12ee43d43 100644 --- a/tests/api/interfaces/test_data.py +++ b/tests/api/interfaces/test_data.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +import os +from functools import wraps + +import pytest +from drf_api_checker.pytest import contract +from drf_api_checker.recorder import BASE_DATADIR, Recorder +from rest_framework.test import APIClient +from test_utilities.factories import factories_registry, UserFactory + +from etools_datamart.api.urls import router + + +class MyRecorder(Recorder): + @property + def client(self): + user = UserFactory(is_superuser=True) + client = APIClient() + client.force_authenticate(user) + return client + + +def frozenfixture2(use_request=False): + def deco(func): + from drf_api_checker.utils import load_fixtures, dump_fixtures + from drf_api_checker.fs import mktree + + @wraps(func) + def _inner(*args, **kwargs): + parts = [os.path.dirname(func.__code__.co_filename), + BASE_DATADIR, + func.__module__, + func.__name__, ] + if 'request' in kwargs: + request = kwargs['request'] + viewset = request.getfixturevalue('viewset') + parts.append(viewset.__name__) + + destination = os.path.join(*parts + ) + '.fixture.json' + if os.path.exists(destination) and not os.environ.get('API_CHECKER_RESET'): + return load_fixtures(destination)[func.__name__] + mktree(os.path.dirname(destination)) + data = func(*args, **kwargs) + dump_fixtures({func.__name__: data}, destination) + return data + + return pytest.fixture(_inner) + + return deco + + +def pytest_generate_tests(metafunc, *args): + if 'viewset' in metafunc.fixturenames: + for prefix, viewset, basenametry in router.registry: + if prefix.startswith('datamart/'): + metafunc.addcall(funcargs={'viewset': viewset}, + id=viewset.__name__) + + +@frozenfixture2() +def data(db, request): + # TIPS: database access is forbidden in pytest_generate_tests + viewset = request.getfixturevalue('viewset') + factory = factories_registry[viewset.serializer_class.Meta.model] + data = (factory(schema_name='bolivia'), + factory(schema_name='chad'), + factory(schema_name='lebanon')) + return data + + +@contract(recorder_class=MyRecorder) +def test_list(viewset, data): + url = f"{viewset.get_service().endpoint}" + return url + + +@frozenfixture2() +def record(db, request): + # TIPS: database access is forbidden in pytest_generate_tests + viewset = request.getfixturevalue('viewset') + factory = factories_registry[viewset.serializer_class.Meta.model] + return factory(schema_name='bolivia') + + +@contract(recorder_class=MyRecorder) +def test_record(viewset, record): + url = f"{viewset.get_service().endpoint}{record.pk}/" + return url From 67e49e3b5522e6bd0b4b5877dffa8276aedbb226 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 23:09:56 +0100 Subject: [PATCH 055/122] add isStaff keybit cache param --- src/unicef_rest_framework/cache.py | 5 ----- src/unicef_rest_framework/models/service.py | 1 - 2 files changed, 6 deletions(-) diff --git a/src/unicef_rest_framework/cache.py b/src/unicef_rest_framework/cache.py index af883318c..19b30db5f 100644 --- a/src/unicef_rest_framework/cache.py +++ b/src/unicef_rest_framework/cache.py @@ -158,13 +158,8 @@ class ListKeyConstructor(KeyConstructor): dev = DevelopKeyBit() admin = SuperuserKeyBit() staff = IsStaffKeyBit() - # language = bits.LanguageKeyBit() - # list_sql_query = bits.ListSqlQueryKeyBit() # NEVER NEVER USE THIS - querystring = bits.QueryParamsKeyBit() - # pagination = bits.PaginationKeyBit() - def get_key(self, view_instance, view_method, request, args, kwargs): key = super().get_key(view_instance, view_method, request, args, kwargs) view_instance.request._request.api_info['cache-key'] = key diff --git a/src/unicef_rest_framework/models/service.py b/src/unicef_rest_framework/models/service.py index 32e296237..5243273fb 100644 --- a/src/unicef_rest_framework/models/service.py +++ b/src/unicef_rest_framework/models/service.py @@ -45,7 +45,6 @@ def check_or_create(self, prefix, viewset, basename, url_name, ): service.suffix = prefix service.source_model = source_model service.save() - viewset.get_service.cache_clear() return service, isnew def load_services(self): From 8e1049b410ce99a133fea66e077794995f0c337e Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 8 Jan 2019 23:43:12 +0100 Subject: [PATCH 056/122] fixes tests --- src/unicef_rest_framework/models/service.py | 1 + src/unicef_rest_framework/views.py | 3 +++ tests/api/conftest.py | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/unicef_rest_framework/models/service.py b/src/unicef_rest_framework/models/service.py index 5243273fb..1dacf8651 100644 --- a/src/unicef_rest_framework/models/service.py +++ b/src/unicef_rest_framework/models/service.py @@ -45,6 +45,7 @@ def check_or_create(self, prefix, viewset, basename, url_name, ): service.suffix = prefix service.source_model = source_model service.save() + service.viewset.get_service.cache_clear() return service, isnew def load_services(self): diff --git a/src/unicef_rest_framework/views.py b/src/unicef_rest_framework/views.py index d5b1f22d9..1e69ef74b 100644 --- a/src/unicef_rest_framework/views.py +++ b/src/unicef_rest_framework/views.py @@ -1,4 +1,6 @@ # -*- coding: utf-8 -*- +from functools import lru_cache + import rest_framework_extensions.utils from drf_querystringfilter.backend import QueryStringFilterBackend from rest_framework import viewsets @@ -112,6 +114,7 @@ def label(cls): return cls.__name__.replace("ViewSet", "") @classmethod + @lru_cache() def get_service(cls): from unicef_rest_framework.models import Service return Service.objects.get_for_viewset(cls) diff --git a/tests/api/conftest.py b/tests/api/conftest.py index 21b0cb0b5..b8ffc0c86 100644 --- a/tests/api/conftest.py +++ b/tests/api/conftest.py @@ -54,7 +54,7 @@ def _assert_duplicate_queries(config, connection=None): msg += '\n\nQueries:\n========\n\n%s' % '\n\n'.join(sqls) else: msg += " (add -v option to show queries)" - pytest.fail(msg) + pytest.fail(str(msg)) @pytest.fixture(scope='function') From 804dfe64ceaa6f6c01e751bbba07473aa24d8d0a Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 9 Jan 2019 00:05:15 +0100 Subject: [PATCH 057/122] =?UTF-8?q?Bump=20version:=201.9a13=20=E2=86=92=20?= =?UTF-8?q?1.9a14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 0c7c6e1e1..6f663437c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a13 +current_version = 1.9a14 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index bd13c163b..3f9c3c9a8 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a13 +TARGET?=1.9a14 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 3823bf6f5..a5603039f 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a13' +VERSION = __version__ = '1.9a14' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 012fab659810a397be79b1599873ef23bac186f3 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 9 Jan 2019 15:36:03 +0100 Subject: [PATCH 058/122] Improves UI in API HTML filter form --- src/drf_querystringfilter/backend.py | 4 +- .../templates/querystringfilter/filter.html | 9 +- src/etools_datamart/api/endpoints/common.py | 1 - .../api/endpoints/datamart/intervention.py | 69 ++++++------ src/etools_datamart/apps/etools/patch.py | 20 ++++ src/unicef_rest_framework/cache.py | 2 + src/unicef_rest_framework/forms.py | 16 +++ .../templates/rest_framework/base.html | 106 ++++++++++-------- .../rest_framework/filters/filter_form.html | 4 - 9 files changed, 138 insertions(+), 93 deletions(-) diff --git a/src/drf_querystringfilter/backend.py b/src/drf_querystringfilter/backend.py index fbf55b802..73b6783e4 100644 --- a/src/drf_querystringfilter/backend.py +++ b/src/drf_querystringfilter/backend.py @@ -40,6 +40,8 @@ def __init__(self) -> None: self.unknown_arguments = [] def get_form_class(self, request, view): + if hasattr(view, 'querystringfilter_form_class'): + return view.querystringfilter_form_class fields = OrderedDict([ (name, forms.CharField(required=False)) for name in view.filter_fields or []]) @@ -49,7 +51,7 @@ def get_form_class(self, request, view): def get_form(self, request, view): if hasattr(view, 'get_querystringfilter_form'): - return view.get_querystringfilter_form(request.GET, prefix=self.form_prefix) + return view.get_querystringfilter_form(request, self) Form = self.get_form_class(request, view) self._form = Form(request.GET, prefix=self.form_prefix) diff --git a/src/drf_querystringfilter/templates/querystringfilter/filter.html b/src/drf_querystringfilter/templates/querystringfilter/filter.html index 6f7906050..613d9e2e8 100644 --- a/src/drf_querystringfilter/templates/querystringfilter/filter.html +++ b/src/drf_querystringfilter/templates/querystringfilter/filter.html @@ -1,9 +1,2 @@ {% load rest_framework i18n crispy_forms_tags %} -{#

{% trans "Fields" %}

#} -{#
#} - -{# {{ form|crispy }}#} - {{ form|crispy }} - -{# #} -{#
#} +{{ form|crispy }} diff --git a/src/etools_datamart/api/endpoints/common.py b/src/etools_datamart/api/endpoints/common.py index d96c136d1..f06d7ee3b 100644 --- a/src/etools_datamart/api/endpoints/common.py +++ b/src/etools_datamart/api/endpoints/common.py @@ -51,7 +51,6 @@ class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin): DynamicSerializerFilter, ] authentication_classes = URFReadOnlyModelViewSet.authentication_classes + (MedusaBasicAuthentication,) - # filter_fields = ['country_name'] ordering_fields = ('id',) ordering = 'id' diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index f0fbf7826..896ffd4ed 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -1,55 +1,60 @@ # -*- coding: utf-8 -*- # import django_filters -from django_filters import rest_framework as filters +from collections import OrderedDict + +from django import forms + +from unicef_rest_framework.forms import DatePickerField, Select2MultipleChoiceField from etools_datamart.api.endpoints.datamart.serializers import InterventionSerializerFull from etools_datamart.apps.data import models +from etools_datamart.apps.etools.models import PartnersIntervention from . import serializers from .. import common -class InterventionFilter(filters.FilterSet): - class Meta: - model = models.Intervention - fields = { - 'country_name': ['icontains', ], - 'title': ['icontains', ], - 'status': ['exact'], - 'start_date': ['exact', 'lt', 'gt'], - 'submission_date': ['exact', 'lt', 'gt'], - 'document_type': ['exact'], - } - # filter_overrides = { - # models.CharField: { - # 'filter_class': django_filters.CharFilter, - # 'extra': lambda f: { - # 'lookup_expr': 'icontains', - # }, - # }, - # models.BooleanField: { - # 'filter_class': django_filters.BooleanFilter, - # 'extra': lambda f: { - # 'widget': forms.CheckboxInput, - # }, - # }, - # } +class InterventionFilterForm(forms.Form): + status__in = Select2MultipleChoiceField(label='Status', + choices=PartnersIntervention.STATUSES, + required=False) + last_modify_date__gte = DatePickerField(label='Modified after', + required=False) + + start_date__gte = DatePickerField(label='Started after', + required=False) + + submission_date__gt = DatePickerField(label='Submitted after', + required=False) + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, *args, **kwargs): + filters = data.copy() + if 'status__in' in filters: + filters['status__in'] = data['status__in'].split(',') + super().__init__(filters, files, auto_id, prefix, initial, *args, **kwargs) class InterventionViewSet(common.DataMartViewSet): - """ + querystringfilter_form_base_class = InterventionFilterForm - """ serializer_class = serializers.InterventionSerializer queryset = models.Intervention.objects.all() - filter_fields = ('country_name', 'title', 'status', 'last_modify_date', + filter_fields = ('title', 'status', 'last_modify_date', 'start_date', 'submission_date', 'document_type') serializers_fieldsets = {'std': None, 'full': InterventionSerializerFull, 'short': ["title", "number", "country_name", "start_date"]} - # filter_backends = [DjangoFilterBackend, OrderingFilter] - # filterset_fields = ('category', 'in_stock') - # filterset_class = InterventionFilter def get_schema_fields(self): return super().get_schema_fields() + + def get_querystringfilter_form(self, request, filter): + fields = OrderedDict([ + (name, forms.CharField(required=False)) + for name in self.filter_fields if name not in ('status', + 'start_date', + 'submission_date', + 'last_modify_date')]) + + return type(str('%sForm' % self.__class__.__name__), + (InterventionFilterForm,), fields)(request.GET, filter.form_prefix) diff --git a/src/etools_datamart/apps/etools/patch.py b/src/etools_datamart/apps/etools/patch.py index 5ed65f58f..ddb73fa36 100644 --- a/src/etools_datamart/apps/etools/patch.py +++ b/src/etools_datamart/apps/etools/patch.py @@ -76,6 +76,26 @@ def patch(): PartnersIntervention.total_unicef_budget = cached_property( lambda self: self.total_unicef_cash + self.total_in_kind_amount) + PartnersIntervention.DRAFT = 'draft' + PartnersIntervention.SIGNED = 'signed' + PartnersIntervention.ACTIVE = 'active' + PartnersIntervention.ENDED = 'ended' + PartnersIntervention.IMPLEMENTED = 'implemented' + PartnersIntervention.CLOSED = 'closed' + PartnersIntervention.SUSPENDED = 'suspended' + PartnersIntervention.TERMINATED = 'terminated' + PartnersIntervention.CANCELLED = 'cancelled' + + PartnersIntervention.STATUSES = ( + (PartnersIntervention.DRAFT, "Draft"), + (PartnersIntervention.SIGNED, 'Signed'), + (PartnersIntervention.ACTIVE, "Active"), + (PartnersIntervention.ENDED, "Ended"), + (PartnersIntervention.CLOSED, "Closed"), + (PartnersIntervention.SUSPENDED, "Suspended"), + (PartnersIntervention.TERMINATED, "Terminated"), + (PartnersIntervention.CANCELLED, "Cancelled"), + ) # Fix User OneToOneField # for model in [AuthUserGroups, UsersUserprofile]: diff --git a/src/unicef_rest_framework/cache.py b/src/unicef_rest_framework/cache.py index 19b30db5f..2c1e408d1 100644 --- a/src/unicef_rest_framework/cache.py +++ b/src/unicef_rest_framework/cache.py @@ -145,6 +145,8 @@ class DevelopKeyBit(KeyBitBase): def get_data(self, params, view_instance, view_method, request, args, kwargs): if 'disable-cache' in request.GET: return {'dev': str(time.time())} + if request.META.get('HTTP_X_DM_CACHE') == 'disabled': + return {'dev': str(time.time())} return {} diff --git a/src/unicef_rest_framework/forms.py b/src/unicef_rest_framework/forms.py index 1875b8339..fa9f4fe42 100644 --- a/src/unicef_rest_framework/forms.py +++ b/src/unicef_rest_framework/forms.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from django import forms from django.core.exceptions import ValidationError from django.forms.models import ModelForm @@ -34,3 +35,18 @@ def clean_viewset(self): except Exception: raise ValidationError(value) return value + + +class Select2ChoiceField(forms.ChoiceField): + def widget_attrs(self, widget): + return {"class": "select2"} + + +class Select2MultipleChoiceField(forms.MultipleChoiceField): + def widget_attrs(self, widget): + return {"class": "select2"} + + +class DatePickerField(forms.DateField): + def widget_attrs(self, widget): + return {"class": "datepicker"} diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index 6ed85259c..81e26cbaf 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -21,6 +21,8 @@ {% endblock %} + @@ -96,38 +98,43 @@ {% endblock %} - -
- {% block content %} + +
+ {% block content %} -
- {% if service %} -
- Doc -
- {% endif %} - {% if iqy_url %} -
-
-
- IQY - - -   -
-
-
- {% endif %} +
+ {% if service %} +
+ Doc +
+ {% endif %} + {% if iqy_url %} +
+
+
+ IQY + + +   +
+
+
+ {% endif %} {% if 'GET' in allowed_methods %}
@@ -374,15 +381,20 @@ + - + }) + {% endblock %} - - {% endblock %} + +{% endblock %} diff --git a/src/unicef_rest_framework/templates/rest_framework/filters/filter_form.html b/src/unicef_rest_framework/templates/rest_framework/filters/filter_form.html index 5bb19afa7..8a5b1e416 100644 --- a/src/unicef_rest_framework/templates/rest_framework/filters/filter_form.html +++ b/src/unicef_rest_framework/templates/rest_framework/filters/filter_form.html @@ -3,8 +3,4 @@ {% if title %}

{% trans title %}

{% endif %}
{{ form|crispy }} -{# #}
From b6de1c834054b7a37d2c0087131c70aa88ae2c02 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 9 Jan 2019 19:38:25 +0100 Subject: [PATCH 059/122] fixes tests --- tests/api/interfaces/test_data.py | 9 +++++-- tests/api/test_api_data.py | 11 +++++--- tests/conftest.py | 42 +++++++++++++++++++++++++------ 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/tests/api/interfaces/test_data.py b/tests/api/interfaces/test_data.py index 12ee43d43..5faa1f2b5 100644 --- a/tests/api/interfaces/test_data.py +++ b/tests/api/interfaces/test_data.py @@ -52,10 +52,15 @@ def _inner(*args, **kwargs): def pytest_generate_tests(metafunc, *args): if 'viewset' in metafunc.fixturenames: + params = [] + ids = [] for prefix, viewset, basenametry in router.registry: if prefix.startswith('datamart/'): - metafunc.addcall(funcargs={'viewset': viewset}, - id=viewset.__name__) + params.append(viewset) + ids.append(f'{viewset.__name__}') + # metafunc.addcall(funcargs={'viewset': viewset}, + # id=viewset.__name__) + metafunc.parametrize("viewset", params, ids=ids) @frozenfixture2() diff --git a/tests/api/test_api_data.py b/tests/api/test_api_data.py index 7b190c5fb..03103d857 100644 --- a/tests/api/test_api_data.py +++ b/tests/api/test_api_data.py @@ -32,13 +32,18 @@ def data(db, request): def pytest_generate_tests(metafunc, *args): if 'serializer' in metafunc.fixturenames: + params = [] + ids = [] for prefix, viewset, basenametry in router.registry: if prefix.startswith('datamart/'): sers = viewset.serializers_fieldsets.keys() for ser in sers: - metafunc.addcall(funcargs={'viewset': viewset, - 'serializer': ser}, - id=f'{viewset.__name__}-{ser}') + params.append([viewset, ser]) + ids.append(f'{viewset.__name__}-{ser}') + # metafunc.addcall(funcargs={'viewset': viewset, + # 'serializer': ser}, + # id=f'{viewset.__name__}-{ser}') + metafunc.parametrize("viewset,serializer", params, ids=ids) @pytest.mark.parametrize("action", ['', 'updates/']) diff --git a/tests/conftest.py b/tests/conftest.py index f50a4d0c5..f23c0a0ff 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -60,16 +60,42 @@ def django_db_setup(request, import django.core.management.commands.migrate django.core.management.commands.migrate.emit_pre_migrate_signal = MagicMock() django.core.management.commands.migrate.emit_post_migrate_signal = MagicMock() + # + # from pytest_django.fixtures import django_db_setup as dj_db_setup + # dj_db_setup(request, + # django_test_environment, + # django_db_blocker, + # django_db_use_migrations, + # django_db_keepdb, + # django_db_createdb, + # django_db_modify_db_settings) + + """Top level fixture to ensure test databases are available""" + from pytest_django.compat import setup_databases, teardown_databases + from pytest_django.fixtures import _disable_native_migrations + setup_databases_args = {} + + if not django_db_use_migrations: + _disable_native_migrations() + + if django_db_keepdb and not django_db_createdb: + setup_databases_args["keepdb"] = True + + with django_db_blocker.unblock(): + db_cfg = setup_databases( + verbosity=pytest.config.option.verbose, + interactive=False, + **setup_databases_args + ) - from pytest_django.fixtures import django_db_setup as dj_db_setup - dj_db_setup(request, - django_test_environment, - django_db_blocker, - django_db_use_migrations, - django_db_keepdb, - django_db_createdb, - django_db_modify_db_settings) + def teardown_database(): + with django_db_blocker.unblock(): + teardown_databases(db_cfg, verbosity=pytest.config.option.verbose) + if not django_db_keepdb: + request.addfinalizer(teardown_database) + + # from unicef_rest_framework.models import Service, UserAccessControl from etools_datamart.apps.tracking.models import APIRequestLog from test_utilities.factories import UserFactory From 93a5299b3b07c67f345e85c754226e6f5be0a9c6 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 12:35:15 +0100 Subject: [PATCH 060/122] improves coverage --- src/etools_datamart/apps/data/exceptions.py | 2 +- src/etools_datamart/apps/data/loader.py | 2 +- .../apps/init/management/commands/info.py | 22 ------------------- tests/test_views.py | 10 +++++++++ 4 files changed, 12 insertions(+), 24 deletions(-) delete mode 100644 src/etools_datamart/apps/init/management/commands/info.py diff --git a/src/etools_datamart/apps/data/exceptions.py b/src/etools_datamart/apps/data/exceptions.py index 8a02c50b4..4462b65de 100644 --- a/src/etools_datamart/apps/data/exceptions.py +++ b/src/etools_datamart/apps/data/exceptions.py @@ -1,5 +1,5 @@ class LoaderException(Exception): - def __init__(self, message, error=None): + def __init__(self, message, error=None): # pragma: no cover self.message = message self.error = error diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 5358b43e8..73fac2d18 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -294,7 +294,7 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, # deleted = self.model.objects.exclude(seen=today).delete()[0] # self.results.deleted = deleted - except LoaderException: + except LoaderException: # pragma: no cover raise finally: if have_lock: # pragma: no branch diff --git a/src/etools_datamart/apps/init/management/commands/info.py b/src/etools_datamart/apps/init/management/commands/info.py deleted file mode 100644 index de81d89cb..000000000 --- a/src/etools_datamart/apps/init/management/commands/info.py +++ /dev/null @@ -1,22 +0,0 @@ -from django.conf import settings -from django.core.management.base import BaseCommand - - -class Command(BaseCommand): - help = "" - - def add_arguments(self, parser): - pass - - def handle(self, *args, **options): - self.stdout.write(f"DATABASES") - for name, config in settings.DATABASES.items(): - self.stdout.write(f"Connection: {name}") - for entry in ['NAME', 'HOST', 'PORT']: - self.stdout.write(f" {entry}: {config[entry]}") - self.stdout.write("=" * 80) - self.stdout.write(f"CACHES") - for name, config in settings.CACHES.items(): - self.stdout.write(f"Connection: {name}") - for entry in ['BACKEND', 'LOCATION']: - self.stdout.write(f" {entry}: {config[entry]}") diff --git a/tests/test_views.py b/tests/test_views.py index 2e7170dc8..179b69b07 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -9,6 +9,16 @@ def test_home(django_app, admin_user): assert res.status_code == 200 +def test_login(django_app, admin_user): + res = django_app.get(reverse('login')) + assert res.status_code == 200 + + +def test_whoami(django_app, admin_user): + res = django_app.get(reverse('whoami'), user=admin_user) + assert res.status_code == 200 + + def test_monitor(django_app, admin_user): EtlTask.objects.inspect() res = django_app.get(reverse('monitor'), user=admin_user) From 72e59e9752aa55ddf6c2a32451c9ed092f854717 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 13:05:39 +0100 Subject: [PATCH 061/122] =?UTF-8?q?Bump=20version:=201.9a14=20=E2=86=92=20?= =?UTF-8?q?1.9a15?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 6f663437c..871923b42 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a14 +current_version = 1.9a15 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 3f9c3c9a8..8c9a1e824 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a14 +TARGET?=1.9a15 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index a5603039f..ca15f5585 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a14' +VERSION = __version__ = '1.9a15' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 93ab2a4a91fa61edf257c49e5a93410259ab4e65 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 13:33:45 +0100 Subject: [PATCH 062/122] =?UTF-8?q?Bump=20version:=201.9a15=20=E2=86=92=20?= =?UTF-8?q?1.9a16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 871923b42..8cc826c7c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a15 +current_version = 1.9a16 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 8c9a1e824..2f0ba7778 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a15 +TARGET?=1.9a16 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index ca15f5585..52aedb152 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a15' +VERSION = __version__ = '1.9a16' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From a96ca38a5ec0f188e1c41c67efc4b4475627d7ed Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 15:02:58 +0100 Subject: [PATCH 063/122] fixes API filter --- docker/entrypoint.sh | 1 - .../api/endpoints/datamart/intervention.py | 5 ++- .../api/endpoints/datamart/pmpindicators.py | 38 +++++++++++++++++++ .../apps/data/models/intervention.py | 6 ++- src/etools_datamart/apps/data/models/pmp.py | 2 +- src/etools_datamart/apps/etools/patch.py | 22 ++++++++--- 6 files changed, 64 insertions(+), 10 deletions(-) diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 39301644c..988b7f4a8 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -5,7 +5,6 @@ mkdir -p /var/datamart/{static,log,conf,run} mkdir -p ${STATIC_ROOT} rm -f /var/datamart/run/* -django-admin info django-admin diffsettings --output unified django-admin makemigrations --dry-run diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index 896ffd4ed..1d904eeb5 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -26,11 +26,14 @@ class InterventionFilterForm(forms.Form): submission_date__gt = DatePickerField(label='Submitted after', required=False) + document_type__in = Select2MultipleChoiceField(label='Document Type', + choices=PartnersIntervention.INTERVENTION_TYPES, + required=False) def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, *args, **kwargs): filters = data.copy() if 'status__in' in filters: - filters['status__in'] = data['status__in'].split(',') + filters.setlist('status__in', data['status__in'].split(',')) super().__init__(filters, files, auto_id, prefix, initial, *args, **kwargs) diff --git a/src/etools_datamart/api/endpoints/datamart/pmpindicators.py b/src/etools_datamart/api/endpoints/datamart/pmpindicators.py index cb27ebaf8..60ad84e65 100644 --- a/src/etools_datamart/api/endpoints/datamart/pmpindicators.py +++ b/src/etools_datamart/api/endpoints/datamart/pmpindicators.py @@ -1,10 +1,38 @@ # -*- coding: utf-8 -*- +from collections import OrderedDict + +from django import forms + +from unicef_rest_framework.forms import DatePickerField, Select2MultipleChoiceField + from etools_datamart.apps.data import models +from etools_datamart.apps.etools.models import PartnersIntervention, PartnersPartnerorganization from . import serializers from .. import common +class PMPIndicatorFilterForm(forms.Form): + partner_type__in = Select2MultipleChoiceField(label='Partner Type', + choices=PartnersPartnerorganization.CSO_TYPES, + required=False) + + pd_ssfa_status__in = Select2MultipleChoiceField(label='Status', + choices=PartnersIntervention.STATUSES, + required=False) + + last_modify_date__gte = DatePickerField(label='Modified after', + required=False) + + def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, initial=None, *args, **kwargs): + filters = data.copy() + if 'partner_type__in' in filters: + filters.setlist('partner_type__in', data['partner_type__in'].split(',')) + if 'pd_ssfa_status__in' in filters: + filters.setlist('pd_ssfa_status__in', data['pd_ssfa_status__in'].split(',')) + super().__init__(filters, files, auto_id, prefix, initial, *args, **kwargs) + + class PMPIndicatorsViewSet(common.DataMartViewSet): serializer_class = serializers.PMPIndicatorsSerializer queryset = models.PMPIndicators.objects.all() @@ -19,3 +47,13 @@ class PMPIndicatorsViewSet(common.DataMartViewSet): "pd_ssfa_start_date", "pd_ssfa_creation_date", "pd_ssfa_end_date"]} + + def get_querystringfilter_form(self, request, filter): + fields = OrderedDict([ + (name, forms.CharField(required=False)) + for name in self.filter_fields if name not in ('partner_type', + 'pd_ssfa_status', + 'last_modify_date')]) + + return type(str('%sForm' % self.__class__.__name__), + (PMPIndicatorFilterForm,), fields)(request.GET, filter.form_prefix) diff --git a/src/etools_datamart/apps/data/models/intervention.py b/src/etools_datamart/apps/data/models/intervention.py index bed13f50c..d92d4f37a 100644 --- a/src/etools_datamart/apps/data/models/intervention.py +++ b/src/etools_datamart/apps/data/models/intervention.py @@ -13,10 +13,12 @@ class Intervention(DataMartModel): created = models.DateTimeField(auto_now=True) updated = models.DateTimeField(null=True) - document_type = models.CharField(max_length=255, null=True) + document_type = models.CharField(max_length=255, + null=True) number = models.CharField(max_length=64, null=True) title = models.CharField(max_length=256, null=True, db_index=True) - status = models.CharField(max_length=32, null=True) + status = models.CharField(max_length=32, + null=True) start_date = models.DateField(null=True) end_date = models.DateField(null=True) submission_date = models.DateField(null=True) diff --git a/src/etools_datamart/apps/data/models/pmp.py b/src/etools_datamart/apps/data/models/pmp.py index 905cc3224..f7661d6f7 100644 --- a/src/etools_datamart/apps/data/models/pmp.py +++ b/src/etools_datamart/apps/data/models/pmp.py @@ -28,7 +28,7 @@ def process_country(self, country, context): 'vendor_number': partner.vendor_number, 'pd_ssfa_ref': intervention.number.replace(',', '-'), - 'pd_ssfa_status': intervention.status.title(), + 'pd_ssfa_status': intervention.status.lower(), 'pd_ssfa_start_date': intervention.start, 'pd_ssfa_creation_date': intervention.created, 'pd_ssfa_end_date': intervention.end, diff --git a/src/etools_datamart/apps/etools/patch.py b/src/etools_datamart/apps/etools/patch.py index ddb73fa36..df212734d 100644 --- a/src/etools_datamart/apps/etools/patch.py +++ b/src/etools_datamart/apps/etools/patch.py @@ -56,6 +56,12 @@ def patch(): (AuditEngagement.CANCELLED, _('Cancelled')), ) # AuditEngagement._meta.fields['engagement_type'].choices = AuditEngagement.TYPES + PartnersPartnerorganization.CSO_TYPES = ( + ('International', 'International'), + ('National', 'National'), + ('Community Based Organization', 'Community Based Organization'), + ('Academic Institution', 'Academic Institution'), + ) PartnersPartnerorganization.current_core_value_assessment = cached_property( lambda self: @@ -96,10 +102,18 @@ def patch(): (PartnersIntervention.TERMINATED, "Terminated"), (PartnersIntervention.CANCELLED, "Cancelled"), ) + PartnersIntervention.PD = 'PD' + PartnersIntervention.SHPD = 'SHPD' + PartnersIntervention.SSFA = 'SSFA' + + PartnersIntervention.INTERVENTION_TYPES = ( + (PartnersIntervention.PD, 'Programme Document'), + (PartnersIntervention.SHPD, 'Simplified Humanitarian Programme Document'), + (PartnersIntervention.SSFA, 'SSFA'), + ) # Fix User OneToOneField # for model in [AuthUserGroups, UsersUserprofile]: - f = [f for f in AuthUserGroups._meta.local_fields if f.name != 'user_id'] AuthUserGroups._meta.local_fields = f AuthUserGroups._meta.unique_together = [] @@ -118,7 +132,6 @@ def patch(): through=AuthUserGroups, ).contribute_to_class(AuthUser, 'groups') - # models.OneToOneField(UsersUserprofile, # on_delete=models.PROTECT, # ).contribute_to_class(AuthUser, 'profile') @@ -132,7 +145,6 @@ def patch(): AuthUser.is_authenticated = True AuthUser.set_password = User.set_password - # AuthUser.profile = cached_property(lambda self: UsersUserprofile.objects.get(user_id=self.id)) # groups = models.ManyToManyField( @@ -177,8 +189,8 @@ def patch(): f = [f for f in PartnersPlannedengagement._meta.local_fields if f.name != 'partner'] PartnersPlannedengagement._meta.local_fields = f models.OneToOneField(PartnersPartnerorganization, - related_name='planned_engagement', - on_delete=models.PROTECT).contribute_to_class(PartnersPlannedengagement, 'partner') + related_name='planned_engagement', + on_delete=models.PROTECT).contribute_to_class(PartnersPlannedengagement, 'partner') aliases = (['partnersintervention_partners_interventionbudget_intervention_id', 'planned_budget'], ['partnersintervention_funds_fundsreservationheader_intervention_id', From 191458c52af6e9c20a65a50e5319efdc416006f5 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 15:12:45 +0100 Subject: [PATCH 064/122] allow clearing date input filter --- src/unicef_rest_framework/templates/rest_framework/base.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index 81e26cbaf..59e657b6e 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -388,7 +388,7 @@ $('form').ajaxForm(); }); - $('.datepicker').datepicker({format: 'yyyy-mm-dd', autoclose: true}); + $('.datepicker').datepicker({format: 'yyyy-mm-dd', autoclose: true, clearBtn: true}); $('.select2').select2({ placeholder: 'Select an option' @@ -414,7 +414,7 @@ } }); location.href = location.pathname + "?" + $.param(qs); - ; + return false; }); $("#copyToClipboard").on("click", function () { From 3c8a4fd3aaeba5eb4d84768e29bb102266660243 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 15:16:42 +0100 Subject: [PATCH 065/122] Fixes InterventionFilterForm --- src/etools_datamart/api/endpoints/datamart/intervention.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index 1d904eeb5..25eb47c93 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -42,8 +42,8 @@ class InterventionViewSet(common.DataMartViewSet): serializer_class = serializers.InterventionSerializer queryset = models.Intervention.objects.all() - filter_fields = ('title', 'status', 'last_modify_date', - 'start_date', 'submission_date', 'document_type') + filter_fields = ('status', 'last_modify_date', 'document_type', + 'start_date', 'submission_date',) serializers_fieldsets = {'std': None, 'full': InterventionSerializerFull, 'short': ["title", "number", "country_name", "start_date"]} @@ -57,6 +57,7 @@ def get_querystringfilter_form(self, request, filter): for name in self.filter_fields if name not in ('status', 'start_date', 'submission_date', + 'document_type', 'last_modify_date')]) return type(str('%sForm' % self.__class__.__name__), From 5033be7acb2462a6f3a53477777611140ad9e7d1 Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 10 Jan 2019 15:27:07 +0100 Subject: [PATCH 066/122] =?UTF-8?q?Bump=20version:=201.9a16=20=E2=86=92=20?= =?UTF-8?q?1.9a17?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8cc826c7c..3d0e03f61 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a16 +current_version = 1.9a17 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 2f0ba7778..db809d233 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a16 +TARGET?=1.9a17 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 52aedb152..ae3b496e1 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a16' +VERSION = __version__ = '1.9a17' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 26ed476f6cb109ffc22a04b843288e71a7fd3b4e Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 14 Jan 2019 09:56:39 +0100 Subject: [PATCH 067/122] add lazo support to deploy docker image --- docker/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/Makefile b/docker/Makefile index db809d233..1ccd0d671 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -88,6 +88,7 @@ release: docker push ${DOCKER_IMAGE_NAME}:latest docker push ${DOCKER_IMAGE_NAME}:${TARGET} cd .. && bumpversion --tag --config-file=.bumpversion.cfg num + lazo upgrade datamart:datamart ${DOCKER_IMAGE_NAME}:${TARGET} -vvv run: $(MAKE) .run From 9b97aefe55c20dc76e7321413d1fb8b216850a8a Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 14 Jan 2019 14:22:40 +0100 Subject: [PATCH 068/122] improves date-range selection in Form filter --- .../api/endpoints/datamart/intervention.py | 43 +++++---- src/unicef_rest_framework/forms.py | 87 ++++++++++++++++++- .../templates/rest_framework/base.html | 44 +++++++++- .../templates/widgets/daterange.html | 11 +++ src/unicef_rest_framework/views.py | 11 +-- 5 files changed, 168 insertions(+), 28 deletions(-) create mode 100644 src/unicef_rest_framework/templates/widgets/daterange.html diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index 25eb47c93..d3a13148b 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- # import django_filters -from collections import OrderedDict - from django import forms -from unicef_rest_framework.forms import DatePickerField, Select2MultipleChoiceField +from unicef_rest_framework.forms import DateRangePickerField, Select2MultipleChoiceField from etools_datamart.api.endpoints.datamart.serializers import InterventionSerializerFull from etools_datamart.apps.data import models @@ -18,14 +16,14 @@ class InterventionFilterForm(forms.Form): status__in = Select2MultipleChoiceField(label='Status', choices=PartnersIntervention.STATUSES, required=False) - last_modify_date__gte = DatePickerField(label='Modified after', + last_modify_date = DateRangePickerField(label='Modified between', required=False) - start_date__gte = DatePickerField(label='Started after', + start_date = DateRangePickerField(label='Started between', required=False) + submission_date = DateRangePickerField(label='Submitted between', + required=False) - submission_date__gt = DatePickerField(label='Submitted after', - required=False) document_type__in = Select2MultipleChoiceField(label='Document Type', choices=PartnersIntervention.INTERVENTION_TYPES, required=False) @@ -48,17 +46,24 @@ class InterventionViewSet(common.DataMartViewSet): 'full': InterventionSerializerFull, 'short': ["title", "number", "country_name", "start_date"]} - def get_schema_fields(self): - return super().get_schema_fields() + def process_filter_last_modify_date__range(self): + return {} - def get_querystringfilter_form(self, request, filter): - fields = OrderedDict([ - (name, forms.CharField(required=False)) - for name in self.filter_fields if name not in ('status', - 'start_date', - 'submission_date', - 'document_type', - 'last_modify_date')]) + # def get_filter_backends(self, removes=None): + # return super().get_filter_backends() + # + # def get_schema_fields(self): + # return super().get_schema_fields() - return type(str('%sForm' % self.__class__.__name__), - (InterventionFilterForm,), fields)(request.GET, filter.form_prefix) + def get_querystringfilter_form(self, request, filter): + return InterventionFilterForm(request.GET, filter.form_prefix) + # fields = OrderedDict([ + # (name, forms.CharField(required=False)) + # for name in self.filter_fields if name not in ('status', + # 'start_date', + # 'submission_date', + # 'document_type', + # 'last_modify_date')]) + # + # return type(str('%sForm' % self.__class__.__name__), + # (InterventionFilterForm,), fields)(request.GET, filter.form_prefix) diff --git a/src/unicef_rest_framework/forms.py b/src/unicef_rest_framework/forms.py index fa9f4fe42..8d64058ed 100644 --- a/src/unicef_rest_framework/forms.py +++ b/src/unicef_rest_framework/forms.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- +import json + from django import forms from django.core.exceptions import ValidationError +from django.forms import DateInput from django.forms.models import ModelForm from strategy_field.utils import import_by_name @@ -49,4 +52,86 @@ def widget_attrs(self, widget): class DatePickerField(forms.DateField): def widget_attrs(self, widget): - return {"class": "datepicker"} + return {"class": "datepicker", + "autocomplete": "off", + "data-pickeroptions": json.dumps({'format': 'yyyy-mm-dd', + 'orientation': 'bottom', + 'autoclose': True, + 'clearBtn': True}) + } + + +class DateRangePickerWidget(forms.MultiWidget): + template_name = 'widgets/daterange.html' + + def __init__(self, till_today=True, attrs=None): + widgets = (DateInput(), DateInput(),) + super(DateRangePickerWidget, self).__init__(widgets, attrs=attrs) + + def value_from_datadict(self, data, files, name): + return [self.widgets[0].value_from_datadict(data, files, name + '__gte'), + self.widgets[1].value_from_datadict(data, files, name + '__lte')] + + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + if not isinstance(value, list): + value = self.decompress(value) + subwidgets = [] + final_attrs = context['widget']['attrs'] + + id_ = final_attrs.get('id') + for i, op in enumerate(['gte', 'lte']): + widget = self.widgets[i] + widget_attrs = final_attrs.copy() + widget_attrs.update(self.widget_attrs(widget)) + widget_attrs['id'] = '%s_%s' % (id_, op) + + w = widget.get_context('%s__%s' % (name, op), value[i], widget_attrs) + if i == 1: + w['widget']['attrs']['class'] += " end-range" + w['widget']['attrs']['data-start-range'] = "#" + '%s_gte' % id_ + else: + w['widget']['attrs']['class'] += " start-range" + w['widget']['attrs']['data-end-range'] = "#" + '%s_lte' % id_ + + subwidgets.append(w['widget']) + context['widget']['subwidgets'] = subwidgets + return context + + def widget_attrs(self, widget): + defaults = {"class": "datepicker form-control", + "autocomplete": "off", + } + picker = {'format': 'yyyy-mm-dd', + 'orientation': 'auto', + 'autoclose': True, + 'clearBtn': True} + defaults["data-pickeroptions"] = json.dumps(picker) + return defaults + + +class DateRangePickerField(forms.MultiValueField): + widget = DateRangePickerWidget + + def __init__(self, input_formats=None, **kwargs): + localize = kwargs.get('localize', False) + fields = ( + DatePickerField(input_formats=input_formats, + localize=localize, + **kwargs), + DatePickerField(input_formats=input_formats, + localize=localize, + **kwargs) + ) + super(DateRangePickerField, self).__init__(fields, **kwargs) + + def widget_attrs(self, widget): + return {"class": "form-control"} + + def compress(self, data_list): + if not data_list or (not data_list[0] and not data_list[1]): + return None, None + if data_list[0] and data_list[1]: + if data_list[0] > data_list[1]: + raise ValidationError('Start Date cannot be greater than than End Date') + return data_list diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index 59e657b6e..de2072904 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -35,6 +35,9 @@ function gtag() {dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'UA-130479575-1'); + window.beforeShowDay = function (d) { + console.log(11111) + } {% endif %} {% endblock %} @@ -388,7 +391,46 @@ $('form').ajaxForm(); }); - $('.datepicker').datepicker({format: 'yyyy-mm-dd', autoclose: true, clearBtn: true}); + {#$('.datepicker').datepicker({format: 'yyyy-mm-dd', autoclose: true, clearBtn: true});#} + + $('.datepicker').each(function(){ + var $target = $(this); + var config = $target.data('pickeroptions'); + $target.datepicker( config ); + }); + + $('.end-range').change(function () { + if (this.value) { + var $other = $( $(this).data("start-range") ); + var start = Date.parse( $other.val() ); + var end = Date.parse( this.value ); + if ( start > end ){ + alert("End date cannot be before start date"); + $(this).val(""); + } + } + }); + + $('.start-range').change(function () { + if (this.value) { + var $other = $( $(this).data("end-range") ); + var end = Date.parse( $other.val() ); + var start = Date.parse( this.value ); + if ( start > end ){ + alert("Start date cannot be after end date"); + $(this).val(""); + } + } + }); + + + $('.daterange input').each(function() { + var $target = $(this); + var config = $target.data('pickeroptions'); + $target.datepicker( config ); + }); + + // **/ $('.select2').select2({ placeholder: 'Select an option' diff --git a/src/unicef_rest_framework/templates/widgets/daterange.html b/src/unicef_rest_framework/templates/widgets/daterange.html new file mode 100644 index 000000000..8d2ab2a61 --- /dev/null +++ b/src/unicef_rest_framework/templates/widgets/daterange.html @@ -0,0 +1,11 @@ +{% spaceless %} +
+ {% with widget.subwidgets.0 as widget %} + {% include widget.template_name %} + {% endwith %} +
to
+ {% with widget.subwidgets.1 as widget %} + {% include widget.template_name %} + {% endwith %} +
+{% endspaceless %} diff --git a/src/unicef_rest_framework/views.py b/src/unicef_rest_framework/views.py index 1e69ef74b..234a336b8 100644 --- a/src/unicef_rest_framework/views.py +++ b/src/unicef_rest_framework/views.py @@ -80,15 +80,17 @@ class URFReadOnlyModelViewSet(DynamicSerializerMixin, viewsets.ReadOnlyModelView permission_classes = [ServicePermission, ] serializers_fieldsets = {} - def get_filter_backends(self, removes=None): + def get_filter_backends(self): + # flt = list(self.filter_backends) if SystemFilterBackend not in flt: flt.insert(0, SystemFilterBackend) if PageFilter not in flt: flt.append(PageFilter) - return list(filter(removes, flt)) + return flt def filter_queryset(self, queryset): + # overridden to use get_filter_backends() for backend in self.get_filter_backends(): queryset = backend().filter_queryset(self.request, queryset, self) return queryset @@ -104,11 +106,6 @@ def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) - # def filter_queryset(self, queryset): - # if hasattr(self.request, 'api_info'): - # self.request.api_info["sql"] = str(queryset.query) - # return super().filter_queryset(queryset) - @classproperty def label(cls): return cls.__name__.replace("ViewSet", "") From f45a20f27fcf722d672050d571fa51d7ccf7908d Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 14 Jan 2019 14:34:38 +0100 Subject: [PATCH 069/122] =?UTF-8?q?Bump=20version:=201.9a17=20=E2=86=92=20?= =?UTF-8?q?1.9a18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 3d0e03f61..e38a3fda0 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a17 +current_version = 1.9a18 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 1ccd0d671..71565f801 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a17 +TARGET?=1.9a18 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index ae3b496e1..2a0e2ac04 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a17' +VERSION = __version__ = '1.9a18' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 74e9dd4524024dea666ca949873b6941fd7421c2 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 15 Jan 2019 07:40:31 +0100 Subject: [PATCH 070/122] Add unique_togheter to Location --- .../data/migrations/0002_auto_20190115_0634.py | 17 +++++++++++++++++ .../apps/data/models/location.py | 3 +++ 2 files changed, 20 insertions(+) create mode 100644 src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py diff --git a/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py b/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py new file mode 100644 index 000000000..f4aaa27e6 --- /dev/null +++ b/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py @@ -0,0 +1,17 @@ +# Generated by Django 2.1.5 on 2019-01-15 06:34 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('data', '0001_initial'), + ] + + operations = [ + migrations.AlterUniqueTogether( + name='location', + unique_together={('schema_name', 'source_id')}, + ), + ] diff --git a/src/etools_datamart/apps/data/models/location.py b/src/etools_datamart/apps/data/models/location.py index b3dd6665f..306ad208c 100644 --- a/src/etools_datamart/apps/data/models/location.py +++ b/src/etools_datamart/apps/data/models/location.py @@ -43,6 +43,9 @@ class Location(DataMartModel): source_id = models.IntegerField(blank=True, null=True) + class Meta: + unique_together = ('schema_name', 'source_id') + class Options: depends = (GatewayType,) # source = LocationsLocation From da8791ba483d098221d7753e813b01ff061517c8 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 16 Jan 2019 17:49:40 +0100 Subject: [PATCH 071/122] updates requirements --- Pipfile.lock | 245 +++++++++++++++++++++++++-------------------------- 1 file changed, 120 insertions(+), 125 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 133594532..3fceca244 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -32,10 +32,10 @@ }, "amqp": { "hashes": [ - "sha256:073dd02fdd73041bffc913b767866015147b61f2a9bc104daef172fc1a0066eb", - "sha256:eed41946890cd43e8dee44a316b85cf6fee5a1a34bb4a562b660a358eb529e1b" + "sha256:9f181e4aef6562e6f9f45660578fc1556150ca06e836ecb9e733e6ea10b48464", + "sha256:c3d7126bfbc640d076a01f1f4f6e609c0e4348508150c1f61336b0d83c738d2b" ], - "version": "==2.3.2" + "version": "==2.4.0" }, "asn1crypto": { "hashes": [ @@ -68,10 +68,10 @@ }, "azure-common": { "hashes": [ - "sha256:2606ae77ff81c0036965b92ec2efe03eaec02a66714140ca0f7aa401b8b9bbb0", - "sha256:c908621a71eb4ee9fab0962e35d3c27a18f09a854d8359c2f32c15b3f4fc576e" + "sha256:5dd7ed46da968814020ecd961e7496f0a4f5e59f6d452df02100218145f6d1ba", + "sha256:e7cd5a8ee2ec0639454c1bd0f1ea5f609d83977376abfd304527ec7343fef1be" ], - "version": "==1.1.16" + "version": "==1.1.17" }, "azure-cosmosdb-nspkg": { "hashes": [ @@ -89,10 +89,10 @@ }, "azure-datalake-store": { "hashes": [ - "sha256:995703113db6840aa02abab71b2d0699dd283a12130cd843fff8c7a1acde9661", - "sha256:fd1ca3384808ac806470c26c98bc2346c1784d5b281fac4ea468ba018269ee3a" + "sha256:84cf6dff24a6433161faa36c18b4c3d46e0bf9504c49ef88fa2280a0bb8661f6", + "sha256:c43f291ab17fc57b68c44adfb597f73255854c2fc57c2c808d146cb175db9519" ], - "version": "==0.0.39" + "version": "==0.0.40" }, "azure-eventgrid": { "hashes": [ @@ -222,10 +222,10 @@ }, "azure-mgmt-containerservice": { "hashes": [ - "sha256:219ace1349dd95198de4f4c8e63b67d4780a8e93a0151f3423db3bafadde912d", - "sha256:c8b8dfe8a2bfeac5d19dd6e32251a306741c50b4b167ca765dc83ea13a06dd48" + "sha256:150fa5437726a97428ab107e4de155c950f8065834f43aa2dff5924d20d4b42c", + "sha256:b75ceac9a18be75c4f6b1ee4e5320a3c75c78472b49d4ff7d374502d914f7594" ], - "version": "==4.3.0" + "version": "==4.4.0" }, "azure-mgmt-cosmosdb": { "hashes": [ @@ -412,10 +412,10 @@ }, "azure-mgmt-network": { "hashes": [ - "sha256:37c11c131ec55bf13216d62b058786491c8dd5700ffe19fec68b4557b87408a6", - "sha256:4ee99a9b1b648f31c0fb156a7cda7e680f29890465dd7863c9fcccc6aed53f71" + "sha256:5356a5998f1cf509436defcce2e3e560a3d14ce6f9b5d32640a27578ddeb233b", + "sha256:cef9bf5d36700966e52f7cea86e29c622bc5bbb92d0ce7a75420e29fb0e75f45" ], - "version": "==2.4.0" + "version": "==2.5.1" }, "azure-mgmt-notificationhubs": { "hashes": [ @@ -984,10 +984,10 @@ }, "djangorestframework": { "hashes": [ - "sha256:607865b0bb1598b153793892101d881466bd5a991de12bd6229abb18b1c86136", - "sha256:63f76cbe1e7d12b94c357d7e54401103b2e52aef0f7c1650d6c820ad708776e5" + "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", + "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" ], - "version": "==3.9.0" + "version": "==3.9.1" }, "djangorestframework-csv": { "hashes": [ @@ -1201,10 +1201,10 @@ }, "msrest": { "hashes": [ - "sha256:1b8daa01341fb77b0797c5fbc28e7e957388eb562721cc6392603ea5a4a39345", - "sha256:75adf8a044a6ff3a93dee977b8e8efb44da3e339b07aada87dcf53d6d51ca67c" + "sha256:5dadd54bec98d52cd9f43fb095015c346135b8cafaa35f24c7309cc25d3ad266", + "sha256:c74585e39041875c44d9235721ca946f7824ec28831c851b964106a60dc19cda" ], - "version": "==0.6.2" + "version": "==0.6.4" }, "msrestazure": { "hashes": [ @@ -1215,10 +1215,10 @@ }, "oauthlib": { "hashes": [ - "sha256:ac35665a61c1685c56336bda97d5eefa246f1202618a1d6f34fccb1bdd404162", - "sha256:d883b36b21a6ad813953803edfa563b1b579d79ca758fe950d1bc9e8b326025b" + "sha256:0a8b2e0daa7afb62bd1b0b387b7a3723fa9a35d1183694ca5a5c8e3d6df59913", + "sha256:8932fb34f7c6a4fc50c9f423b105923ed2e6df091b3c388d182540db02c581a0" ], - "version": "==2.1.0" + "version": "==3.0.0" }, "onedrivesdk": { "hashes": [ @@ -1333,11 +1333,11 @@ }, "pyparsing": { "hashes": [ - "sha256:40856e74d4987de5d01761a22d1621ae1c7f8774585acae358aa5c5936c6c90b", - "sha256:f353aab21fd474459d97b709e527b5571314ee5f067441dc9f88e33eecd96592" + "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", + "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" ], "index": "pypi", - "version": "==2.3.0" + "version": "==2.3.1" }, "pypdf2": { "hashes": [ @@ -1416,36 +1416,36 @@ }, "reportlab": { "hashes": [ - "sha256:00c4d275b14ccd77316c0e6b5ad12881c70edc97556b1177d90fe366163df786", - "sha256:03f968b21c41ff3364665b3f08426233e8255313c158a50f71745e66accd6d90", - "sha256:0a6bb96cc4ca7faaa5bcfb599eadd4afe6b90929cdc31e4913be4899f9ae4ac6", - "sha256:1857bb48c67b9278d5ada84a9c584f6bd61bb95d4f67d55799e8af9c8a5ef6e2", - "sha256:1b52d4d5ba9f5a1e939eed9441ca62a2ef7063a2610d001c70b39760b9d3314c", - "sha256:2637ea9a2ca093f10f0fc27ea02a8bdde0faadbeab9205ef1f5bf560510c6d52", - "sha256:2d63984f9593e5408cfc3da043cae871ab20006d494d5029a04ec5fa0d3044d6", - "sha256:55945d811655c52515067826f4f2a258e472fc34ad995acdc9a5f53910b8ebf6", - "sha256:63f1928c47acd9aa81ef75dd29ce74d292e50d77eaf2629ad0c99bbc1d2fa125", - "sha256:65a70673bc7d673ca52ee8b1b14e37959b01d45ef43729ed1507b6718351ec47", - "sha256:6dd39a260fd8e315f55e5f61c0a4b07994c3cd06d4893aacc9575a0e8804ba12", - "sha256:786e0d5b166fcfa1d0044ee411f820c3314b0bbc513985b0adc227118c2db009", - "sha256:7e10261065d0f926d9d83fd1f2edb8bec466f3c60b3e927ef40e2262805c069d", - "sha256:8474ed2a5d89a1546435294c91ae42fc18a29c3172af4b5f97d43bbf4d0a9018", - "sha256:8ce32d0878a38bc1f8b6ee1656f638a7629b2067f9b048787d4ad5fbd409093d", - "sha256:8fd604e791367038b673082c6e1d1801ef0998a68b0d436bcc0befc592f99541", - "sha256:9c25661f5089863c6976c0525593cdd3f3afb59092fbaa4ea9eb83c4e95a8c3c", - "sha256:a5c58f0ca4a4dd74fc8816a5240891614355d909b8c606febfb24375330b2a3b", - "sha256:a6b9a411ff87bca1ce33c902c25d25f11ea53d4941ad5d41b070a3eb95843b09", - "sha256:c1f0104d0a85d0db9bc98d5fa3679391ef052219b0f3ff0b741d22b0b78deb5f", - "sha256:c8f59aaa6989e111b0bfb46daae91c02cc4f5c23ce053fbd82ea6dac1c4c087d", - "sha256:cdca0b57cb5efccd946f79470598706fff661190627cb213e6eb7749aaeb02eb", - "sha256:d37854d9bce188b336dbf6de598924656d2ff0555dc720d347970ea8df097895", - "sha256:d6ab0ff7f2c3cf9ef33c163f5c85e3ebb1ced512d6ef8cdd022617f5951b1385", - "sha256:e7a145f376fcf56d0697b028fbd228dd6defe78bdf671a6ec6a8a87a930d8b6c", - "sha256:e94bd2457a5030df103d2f1b892d322076cd8c4b8db6c4331382f35431eb4ece", - "sha256:ecd7026ec27e6b33513fe53338ca33bd44dce6d8b00f6ec0ab4bfa10614a4503", - "sha256:fd697bc9afdad1e05d245da169a8c98f576a5c7b3d835fee76922f3e8b2d0388" - ], - "version": "==3.5.12" + "sha256:069f684cd0aaa518a27dc9124aed29cee8998e21ddf19604e53214ec8462bdd7", + "sha256:09b68ec01d86b4b120456b3f3202570ec96f57624e3a4fc36f3829323391daa4", + "sha256:0c32be9a406172c29ea20ff55a709ccac1e7fb09f15aba67cb7b455fd1d3dbe0", + "sha256:233196cf25e97cfe7c452524ea29d9a4909f1cb66599299233be1efaaaa7a7a3", + "sha256:2b5e4533f3e5b962835a5ce44467e66d1ecc822761d1b508077b5087a06be338", + "sha256:2e860bcdace5a558356802a92ae8658d7e5fdaa00ded82e83a3f2987c562cb66", + "sha256:3546029e63a9a9dc24ee38959eb417678c2425b96cd27b31e09e216dafc94666", + "sha256:4452b93f9c73b6b70311e7d69082d64da81b38e91bfb4766397630092e6da6fd", + "sha256:528c74a1c6527d1859c2c7a64a94a1cba485b00175162ea23699ae58a1e94939", + "sha256:6116e750f98018febc08dfee6df20446cf954adbcfa378d2c703d56c8864aff3", + "sha256:6b2b3580c647d75ef129172cb3da648cdb24566987b0b59c5ebb80ab770748d6", + "sha256:727b5f2bed08552d143fc99649b1863c773729f580a416844f9d9967bb0a1ae8", + "sha256:74c24a3ec0a3d4f8acb13a07192f45bdb54a1cc3c2286241677e7e8bcd5011fa", + "sha256:98ccd2f8b4f8636db05f3f14db0b471ad6bb4b66ae0dc9052c4822b3bd5d6a7d", + "sha256:a5905aa567946bc938b489a7249c7890c3fd3c9b7b5680dece5bc551c2ddbe0d", + "sha256:acbb7f676b8586b770719e9683eda951fdb38eb7970d46fcbf3cdda88d912a64", + "sha256:b5e30f865add48cf880f1c363eb505b97f2f7baaa88c155f87a335a76515a3e5", + "sha256:be2a7c33a2c28bbd3f453ffe4f0e5200b88c803a097f4cf52d69c6b53fad7a8f", + "sha256:c356bb600f59ac64955813d6497a08bfd5d0c451cb5829b61e3913d0ac084e26", + "sha256:c7ec4ae2393beab584921b1287a04e94fd98c28315e348362d89b85f4b464546", + "sha256:d476edc831bb3e9ebd04d1403abaf3ea57b3e4c2276c91a54fdfb6efbd3f9d97", + "sha256:db059e1a0691c872784062421ec51848539eb4f5210142682e61059a5ca7cc55", + "sha256:dd423a6753509ab14a0ac1b5be39d219c8f8d3781cce3deb4f45eda31969b5e8", + "sha256:ed9b7c0d71ce6fe2b31c6cde530ad8238632b876a5d599218739bda142a77f7c", + "sha256:f0a2465af4006f97b05e1f1546d67d3a3213d414894bf28be7f87f550a7f4a55", + "sha256:f20bfe26e57e8e1f575a9e0325be04dd3562db9f247ffdd73b5d4df6dec53bc2", + "sha256:f3463f2cb40a1b515ac0133ba859eca58f53b56760da9abb27ed684c565f853c", + "sha256:facc3c9748ab1525fb8401a1223bce4f24f0d6aa1a9db86c55db75777ccf40f9" + ], + "version": "==3.5.13" }, "requests": { "hashes": [ @@ -1456,10 +1456,10 @@ }, "requests-oauthlib": { "hashes": [ - "sha256:8886bfec5ad7afb391ed5443b1f697c6f4ae98d0e5620839d8b4499c032ada3f", - "sha256:e21232e2465808c0e892e0e4dbb8c2faafec16ac6dc067dd546e9b466f3deac8" + "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57", + "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140" ], - "version": "==1.0.0" + "version": "==1.2.0" }, "rfc3987": { "hashes": [ @@ -1470,29 +1470,30 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:046b997a0892eebd9ca97823102b330ab3a2da719a6df877b2f2a03e19fb878e", - "sha256:0e7414b6b757ae64d5452a83fb197040a7835ff96fa228f7127c94d54041801d", - "sha256:31d9a1c4d15c02d60c2ca1996dcaf1a6c91b986b72299384071cce40bd1278bf", - "sha256:356ee57fa561243223d91cedb526fd057a91edb744825fe64b6fff23aa262324", - "sha256:3dcede78252a4cf3820928fa75c5928a56cbaedd4c698ea2d1f04e6c36235d6a", - "sha256:4329af449c314ea0565bb5c36dc52232ea9ca32297b58bb2340acf5767719ad6", - "sha256:51d81999ae9cb138a8043908c9406b7bd258a4d616f99200627a81f1c9f85fcb", - "sha256:53ea23234e82242267c4d32611e6907a64f0f2e03b77c19d270bd56b2e375f5b", - "sha256:5a3bf78266761f352d61cb18ee91fa11a1970566238ec732e4ec8857bebdf91d", - "sha256:5ec8f00fc23cca74dfc0529647bb16e5578e247c1ac5182be15dfb949d1304cb", - "sha256:606d3f83ede7a3f76845de64bc8f376df40d166eca782a56a35b8d1961b214e1", - "sha256:66af4e1a5f24534e9d63854ce028d5ccba642c387df6b1b9b39b7a0953d08135", - "sha256:71baa4ca8a7e4e37991f28b17f75d64c56ef82163f79fc9d875712d04c531c5a", - "sha256:7a32ab8866c04d844e1b7116118e7b8e38718a291802a60bb287964bcf4c0f47", - "sha256:a29655dc08ddf64b22c462aad88e4f54b54f80fac2cd8edfe0dcf817987a2722", - "sha256:c1de59975299c919058c54bb9309e430bdcea7239c76021cf082a841e6f8e43c", - "sha256:c3af911ee65e406d7ab0655fc3f4124d5000fcadcb470fe07d37d975f77a1a4c", - "sha256:cdd215fa38b15713378bccc99f3fd1eee06c328fe50b5b17775f7cf3bc047cac", - "sha256:d0ad7a4f8cd8082d0593b87848a46c12fbfb5c5011fb15dfe58941aa2ee5e5e8", - "sha256:e7e5fa36587e6e06b12a678314d2020f90928ea9522001ea7834e3f1e5ac3b98", - "sha256:f34262929dfab42ce88e34e2bc525a36a5972563c5cac1582a20b575303039c4" - ], - "version": "==0.15.84" + "sha256:3858f420b03030f99da44414ff8275a95eb7a6b5613764dd520398fb63951822", + "sha256:47982ea36529d971c453105ead01788161326bb5349d2aea900da6c0e5f628b5", + "sha256:527b7978560bc79b5f71b08d8db1ab16d367a08bdf1c2790b1ffb2fac94e46ae", + "sha256:65c96f9e0a8117be90cd8e23fc4e1d2c94fa410f4364bf70a97aa3cc4e4f4769", + "sha256:7a1ab9228c48f4741b5d07961e99e898e88afc040343b31b75e1dc1b3f8cee7c", + "sha256:87c60bd6b282f41a0403df5d59ec1fb1876311e84f5609ada47f17f64406e4d0", + "sha256:91f93c1938867551e554ea295ef91f84720a68b711d37b9f7d442fd3903082da", + "sha256:9523308cd0b071f0f8b631ec4f310eb58b3e2b4adbd14a2661783e2c5e8e1fdc", + "sha256:97cfa9bca4980aa9a77788fe9fbed178bcf5556dd2e917f52fda70ce7bb38a95", + "sha256:a21e26cf0143d22d9743d23b5531f66385aaf3fb54641782b20c6139239a8a93", + "sha256:a5167a1b098c86d1b1c9f0d73b7c65e70876d54a11fb1ada4586ba557d2fe165", + "sha256:a889dc3d6cffb64ca89fac053455b7a778f922b65843263023e998c0fcce001e", + "sha256:a925760fa1eb8dece3e07ee32485da8d5253cfcd78df25938371a5f5acdaa8a4", + "sha256:a92fd8e32d824392c0cec96a77e374bb77ceda4b99b1d18c776631e18fc54ffe", + "sha256:b20e3130b4b5b210365d6760b7d3c87cc9c40e456fa14049f9257bc62cf0d2c9", + "sha256:cb21f6bad6eade16868efc86fe1bb3e7a3d61137af2bf064dd1e7ed0d629ca9c", + "sha256:ccb1a0860a602d83898dd71280db142a3502702be3976ffc35eef9eb19585169", + "sha256:d70eec8bd287798e7905d57d503b1091c8424ba736e287b75f39f1b5a0235d71", + "sha256:d8a39781c49a892dd0f936d472d850a9aa163205475ad6c90a0f4d0c4d90ee30", + "sha256:d98b3d421eebf7e10311ab12f41c5b0353e7cae1cc78f51312e24f569d593de0", + "sha256:e67ea0cf80682e539707fcd8811b7369d8b97b1b48b1d7b16e21cd7f6c2c2e40", + "sha256:feec97614776442b4dd5029eb16e15f5e582ffc5cf534cba5eefd07062e11eec" + ], + "version": "==0.15.86" }, "six": { "hashes": [ @@ -1512,11 +1513,11 @@ }, "social-auth-core": { "hashes": [ - "sha256:744c8b8498cf7e970151e8ea96a8d3e3aa818986ace7e1a0f39295fc193f4529", - "sha256:b8a34e7eb71c66e4d68deb007c81d4f74d4e0bc52c1c4f871a7758db0a0c268e", - "sha256:cec8e0a2297a23c0e1cab21bbcfaf32c8378fdb98762f47e315bbc65c3a83c89" + "sha256:3584a6b96b5c505bb2d2a5c35a9f8656addd895bfa64c58f9c40d4e3d824ea26", + "sha256:54eb683eeee677a45e4e544995b0c62a88d705ae5d9509256187f8d6a943a32a", + "sha256:d47c4f48484847faf043e975ec07300be84d64bfcf8268029e2383759222b609" ], - "version": "==2.0.0" + "version": "==3.0.0" }, "sqlparse": { "hashes": [ @@ -1534,11 +1535,11 @@ }, "swagger-spec-validator": { "hashes": [ - "sha256:320308dd4e9525daf2c041d37414283b3c7424de912ea5c37c215206e3890e44", - "sha256:b9618efbfa5446cdf09e72f9d384b869970c63c9a726c981f0abcf2d63a929cb" + "sha256:57e29feb3aa921a9fb98bd70af148746b27c77d3207266f5571cebcce211e685", + "sha256:62ef22eca3f429d93fddda5d793d2a1a9057d3732e7a14606e641805326ae4a6" ], "markers": "extra == 'validation'", - "version": "==2.4.1" + "version": "==2.4.3" }, "unicodecsv": { "hashes": [ @@ -1664,13 +1665,6 @@ "index": "pypi", "version": "==0.5.3" }, - "cached-property": { - "hashes": [ - "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f", - "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504" - ], - "version": "==1.5.1" - }, "certifi": { "hashes": [ "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", @@ -1761,18 +1755,18 @@ }, "djangorestframework": { "hashes": [ - "sha256:607865b0bb1598b153793892101d881466bd5a991de12bd6229abb18b1c86136", - "sha256:63f76cbe1e7d12b94c357d7e54401103b2e52aef0f7c1650d6c820ad708776e5" + "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", + "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" ], - "version": "==3.9.0" + "version": "==3.9.1" }, "docker": { "hashes": [ - "sha256:145c673f531df772a957bd1ebc49fc5a366bcd55efa0e64bbd029f5cc7a1fd8e", - "sha256:666611862edded75f6049893f779bff629fdcd4cd21ccf01d648626e709adb13" + "sha256:2840ffb9dc3ef6d00876bde476690278ab13fa1f8ba9127ef855ac33d00c3152", + "sha256:5831256da3477723362bc71a8df07b8cd8493e4a4a60cebd45580483edbe48ae" ], "index": "pypi", - "version": "==3.6.0" + "version": "==3.7.0" }, "docker-pycreds": { "hashes": [ @@ -1971,18 +1965,18 @@ }, "pluggy": { "hashes": [ - "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", - "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" + "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", + "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" ], - "version": "==0.8.0" + "version": "==0.8.1" }, "pre-commit": { "hashes": [ - "sha256:33bb9bf599c334d458fa9e311bde54e0c306a651473b6a36fdb36a61c8605c89", - "sha256:e233f5cf3230ae9ed9ada132e9cf6890e18cc937adc669353fb64394f6e80c17" + "sha256:2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", + "sha256:74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b" ], "index": "pypi", - "version": "==1.13.0" + "version": "==1.14.2" }, "prompt-toolkit": { "hashes": [ @@ -2029,11 +2023,11 @@ }, "pytest": { "hashes": [ - "sha256:3e65a22eb0d4f1bdbc1eacccf4a3198bf8d4049dea5112d70a0c61b00e748d02", - "sha256:5924060b374f62608a078494b909d341720a050b5224ff87e17e12377486a71d" + "sha256:41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", + "sha256:c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be" ], "index": "pypi", - "version": "==4.1.0" + "version": "==4.1.1" }, "pytest-cov": { "hashes": [ @@ -2059,11 +2053,11 @@ }, "pytest-django": { "hashes": [ - "sha256:deffd9d65827c582bd0a85638a0fe52f0eb65a764872ddcee9ce51cdf6ae9f55", - "sha256:fe1f71a0171f6b7edac37654da0904c9bd5ffba5221ab5a76779ab870611f41f" + "sha256:1a5d33be930e3172fa238643a380414dc369fe8fa4b3c3de25e59ed142950736", + "sha256:e88e471d3d0f9acfb6293bb03d0ee8a33ed978734e92ea6b5312163a6c9e87cc" ], "index": "pypi", - "version": "==3.4.4" + "version": "==3.4.5" }, "pytest-echo": { "hashes": [ @@ -2074,10 +2068,11 @@ }, "pytest-ignore-flaky": { "hashes": [ - "sha256:78f8ddf9b405c09ce852a4ceac58258e4b8d98d2bc236a03d4a075cdc51c56c6" + "sha256:29b3099cf4d424fd553d39940f7025acf6847ecbba292649a0dc764dfbb7d59e", + "sha256:fe33a1f725a78e1f92077bfb80926602622bc050a0a71b61c3f1ca7089afb779" ], "index": "pypi", - "version": "==0.1.1" + "version": "==1.0.0" }, "pytest-pythonpath": { "hashes": [ @@ -2132,10 +2127,10 @@ }, "soupsieve": { "hashes": [ - "sha256:638535780f7b966411123d56eb3b89cd1d2e42d707270c6d7d053c7720a238f3", - "sha256:cb61b59c55f9f6e91928a03fe4b500ac1fcef6f8e68082a630db098ab33e2126" + "sha256:009d8865916766f7f452880d08ff94ed4c5445011a3deaac67543b82bdb0b9ee", + "sha256:97599c45a1ddfe9ab0a0cba889b7f214b3e310b703f176a0610c0b54e207cc04" ], - "version": "==1.6.2" + "version": "==1.7.1" }, "text-unidecode": { "hashes": [ @@ -2182,10 +2177,10 @@ }, "waitress": { "hashes": [ - "sha256:40b0f297a7f3af61fbfbdc67e59090c70dc150a1601c39ecc9f5f1d283fb931b", - "sha256:d33cd3d62426c0f1b3cd84ee3d65779c7003aae3fc060dee60524d10a57f05a9" + "sha256:8b8c8686f628a635b9747e3014a0ab19cf9cf95c5c36eb3331ae355a462ee602", + "sha256:e624c829656ffc99b33d661072b2814885ae92835cf835ee8ab283ddb7c915b9" ], - "version": "==1.1.0" + "version": "==1.2.0" }, "wcwidth": { "hashes": [ @@ -2223,9 +2218,9 @@ }, "wrapt": { "hashes": [ - "sha256:d4d560d479f2c21e1b5443bbd15fe7ec4b37fe7e53d335d3b9b0a7b1226fe3c6" + "sha256:e03f19f64d81d0a3099518ca26b04550026f131eced2e76ced7b85c6b8d32128" ], - "version": "==1.10.11" + "version": "==1.11.0" }, "yapf": { "hashes": [ From 8ad500ac5dae29914637be132b4562b269cd71f1 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 18 Jan 2019 15:59:13 +0100 Subject: [PATCH 072/122] add budget informations to Intervention model --- Makefile | 8 +++++ .../apps/data/migrations/0001_initial.py | 20 +++++++++---- .../migrations/0002_auto_20190115_0634.py | 17 ----------- .../apps/data/models/intervention.py | 30 +++++++++++++++---- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...231_1024.py => 0002_auto_20190118_1451.py} | 2 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...231_1024.py => 0002_auto_20190118_1451.py} | 4 +-- .../migrations/0001_initial.py | 2 +- ...231_1024.py => 0002_auto_20190118_1451.py} | 6 ++-- .../migrations/0001_initial.py | 2 +- 13 files changed, 60 insertions(+), 39 deletions(-) delete mode 100644 src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20181231_1024.py => 0002_auto_20190118_1451.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20181231_1024.py => 0002_auto_20190118_1451.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20181231_1024.py => 0002_auto_20190118_1451.py} (99%) diff --git a/Makefile b/Makefile index b7528c32b..7fe1e4cac 100644 --- a/Makefile +++ b/Makefile @@ -70,3 +70,11 @@ demo-stop: -kill `cat beat.pid` -kill `cat celery.pid` -docker stop datamart-flower + +reset-migrations: + find src -name '000[1,2,3,4,5,6,7,8,9]*' | xargs rm -f + dropdb --if-exists -h 127.0.0.1 -U postgres test_etools_datamart + dropdb --if-exists -h 127.0.0.1 -U postgres etools_datamart + createdb -h 127.0.0.1 -U postgres etools_datamart + ./manage.py reset-migrations + ./manage.py init-setup --all diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 05f5dbb84..04a973d60 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -129,6 +129,15 @@ class Migration(migrations.Migration): ('partner_focal_point_last_name', models.CharField(max_length=64, null=True)), ('partner_focal_point_email', models.CharField(max_length=128, null=True)), ('partner_focal_point_phone', models.CharField(max_length=64, null=True)), + ('partner_contribution', models.DecimalField(decimal_places=2, max_digits=20)), + ('unicef_cash', models.DecimalField(decimal_places=2, max_digits=20)), + ('in_kind_amount', models.DecimalField(decimal_places=2, max_digits=20)), + ('partner_contribution_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('unicef_cash_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('in_kind_amount_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('total', models.DecimalField(decimal_places=2, max_digits=20)), + ('total_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('currency', models.CharField(max_length=4)), ('intervention_id', models.IntegerField(null=True)), ('agreement_id', models.IntegerField(null=True)), ('country_programme_id', models.IntegerField(null=True)), @@ -165,9 +174,6 @@ class Migration(migrations.Migration): ('gateway', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='data.GatewayType')), ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='data.Location')), ], - options={ - 'abstract': False, - }, ), migrations.CreateModel( name='PMPIndicators', @@ -242,10 +248,14 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, + unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, ), migrations.AlterUniqueTogether( name='famindicator', unique_together={('month', 'country_name')}, ), + migrations.AlterUniqueTogether( + name='location', + unique_together={('schema_name', 'source_id')}, + ), ] diff --git a/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py b/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py deleted file mode 100644 index f4aaa27e6..000000000 --- a/src/etools_datamart/apps/data/migrations/0002_auto_20190115_0634.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 2.1.5 on 2019-01-15 06:34 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('data', '0001_initial'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='location', - unique_together={('schema_name', 'source_id')}, - ), - ] diff --git a/src/etools_datamart/apps/data/models/intervention.py b/src/etools_datamart/apps/data/models/intervention.py index d92d4f37a..cc241ea94 100644 --- a/src/etools_datamart/apps/data/models/intervention.py +++ b/src/etools_datamart/apps/data/models/intervention.py @@ -13,12 +13,10 @@ class Intervention(DataMartModel): created = models.DateTimeField(auto_now=True) updated = models.DateTimeField(null=True) - document_type = models.CharField(max_length=255, - null=True) + document_type = models.CharField(max_length=255, null=True) number = models.CharField(max_length=64, null=True) title = models.CharField(max_length=256, null=True, db_index=True) - status = models.CharField(max_length=32, - null=True) + status = models.CharField(max_length=32, null=True) start_date = models.DateField(null=True) end_date = models.DateField(null=True) submission_date = models.DateField(null=True) @@ -54,6 +52,16 @@ class Intervention(DataMartModel): partner_focal_point_email = models.CharField(max_length=128, null=True) partner_focal_point_phone = models.CharField(max_length=64, null=True) + partner_contribution = models.DecimalField(max_digits=20, decimal_places=2) + unicef_cash = models.DecimalField(max_digits=20, decimal_places=2) + in_kind_amount = models.DecimalField(max_digits=20, decimal_places=2) + partner_contribution_local = models.DecimalField(max_digits=20, decimal_places=2) + unicef_cash_local = models.DecimalField(max_digits=20, decimal_places=2) + in_kind_amount_local = models.DecimalField(max_digits=20, decimal_places=2) + total = models.DecimalField(max_digits=20, decimal_places=2) + total_local = models.DecimalField(max_digits=20, decimal_places=2) + currency = models.CharField(max_length=4) + intervention_id = models.IntegerField(null=True) agreement_id = models.IntegerField(null=True) country_programme_id = models.IntegerField(null=True) @@ -69,6 +77,7 @@ class Options: 'partner_authorized_officer_signatory', 'unicef_signatory', 'country_programme', + 'partnersintervention_partners_interventionbudget_intervention_id' ) key = lambda country, record: dict(country_name=country.name, schema_name=country.schema_name, @@ -95,4 +104,15 @@ class Options: partner_focal_point_last_name='partner_focal_point.last_name', partner_focal_point_email='partner_focal_point.email', partner_focal_point_phone='partner_focal_point.phone', - updated='modified') + updated='modified', + + partner_contribution='planned_budget.partner_contribution', + unicef_cash='planned_budget.unicef_cash', + in_kind_amount='planned_budget.in_kind_amount', + partner_contribution_local='planned_budget.partner_contribution_local', + unicef_cash_local='planned_budget.unicef_cash_local', + in_kind_amount_local='planned_budget.in_kind_amount_local', + total='planned_budget.total', + total_local='planned_budget.total_local', + currency='planned_budget.currency', + ) diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index f85895649..826aec436 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 971c7f190..606722505 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index a7f29832f..8d03d77a1 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py index dc0e20aa6..661c3dc8e 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20181231_1024.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.db.models.deletion from django.conf import settings diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 58e4762fa..4899894dd 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py index 4c32ed044..d9b563987 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20181231_1024.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.db.models.deletion from django.conf import settings @@ -11,8 +11,8 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('tracking', '0001_initial'), ('unicef_rest_framework', '0001_initial'), + ('tracking', '0001_initial'), ] operations = [ diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index bc12b5a00..0ed1c6dca 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py b/src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py similarity index 99% rename from src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py rename to src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py index 0573eb4ba..7e9ecc290 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20181231_1024.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.db.models.deletion from django.conf import settings @@ -11,9 +11,9 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('auth', '0009_alter_user_last_name_max_length'), - ('contenttypes', '0002_remove_content_type_name'), ('unicef_rest_framework', '0001_initial'), + ('contenttypes', '0002_remove_content_type_name'), + ('auth', '0009_alter_user_last_name_max_length'), ] operations = [ diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 39a64958f..042406fa8 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.4 on 2018-12-31 10:24 +# Generated by Django 2.1.5 on 2019-01-18 14:51 import django.contrib.auth.models import django.contrib.auth.validators From 413f6629a8c3cea3e0d815e89596889e512f1147 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 18 Jan 2019 17:23:37 +0100 Subject: [PATCH 073/122] fixes tests --- .../api/endpoints/datamart/intervention.py | 3 ++- .../api/endpoints/datamart/serializers.py | 14 +++++++++++++- tests/_test_lib/test_utilities/factories/data.py | 9 +++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index d3a13148b..dd633068c 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -4,7 +4,7 @@ from unicef_rest_framework.forms import DateRangePickerField, Select2MultipleChoiceField -from etools_datamart.api.endpoints.datamart.serializers import InterventionSerializerFull +from etools_datamart.api.endpoints.datamart.serializers import InterventionSerializerBudget, InterventionSerializerFull from etools_datamart.apps.data import models from etools_datamart.apps.etools.models import PartnersIntervention @@ -44,6 +44,7 @@ class InterventionViewSet(common.DataMartViewSet): 'start_date', 'submission_date',) serializers_fieldsets = {'std': None, 'full': InterventionSerializerFull, + 'budget': InterventionSerializerBudget, 'short': ["title", "number", "country_name", "start_date"]} def process_filter_last_modify_date__range(self): diff --git a/src/etools_datamart/api/endpoints/datamart/serializers.py b/src/etools_datamart/api/endpoints/datamart/serializers.py index b4990a923..e4add23cf 100644 --- a/src/etools_datamart/api/endpoints/datamart/serializers.py +++ b/src/etools_datamart/api/endpoints/datamart/serializers.py @@ -17,6 +17,16 @@ class Meta(DataMartSerializer.Meta): model = models.PMPIndicators +class InterventionSerializerBudget(DataMartSerializer): + class Meta(DataMartSerializer.Meta): + model = models.Intervention + fields = ('number', 'title', 'status', 'start_date', 'end_date', + 'partner_contribution', 'unicef_cash', 'in_kind_amount', + 'partner_contribution_local', 'unicef_cash_local', 'in_kind_amount_local', + 'total', 'total_local', 'currency', + ) + + class InterventionSerializerFull(DataMartSerializer): class Meta(DataMartSerializer.Meta): model = models.Intervention @@ -25,7 +35,9 @@ class Meta(DataMartSerializer.Meta): class InterventionSerializer(InterventionSerializerFull): class Meta(DataMartSerializer.Meta): model = models.Intervention - exclude = ('metadata',) + exclude = ('metadata', 'partner_contribution', 'unicef_cash', 'in_kind_amount', + 'partner_contribution_local', 'unicef_cash_local', 'in_kind_amount_local', + 'total', 'total_local', 'currency',) class FAMIndicatorSerializer(DataMartSerializer): diff --git a/tests/_test_lib/test_utilities/factories/data.py b/tests/_test_lib/test_utilities/factories/data.py index 9661ba1f8..6101fced4 100644 --- a/tests/_test_lib/test_utilities/factories/data.py +++ b/tests/_test_lib/test_utilities/factories/data.py @@ -45,6 +45,15 @@ class InterventionFactory(DataMartModelFactory): metadata = {} title = factory.Sequence(lambda n: "title%03d" % n) number = factory.Sequence(lambda n: "#%03d" % n) + partner_contribution = 10 + unicef_cash = 10 + in_kind_amount = 10 + partner_contribution_local = 10 + unicef_cash_local = 10 + in_kind_amount_local = 10 + total = 10 + total_local = 10 + currency = 'USD' class Meta: model = Intervention From 55a785bc0ef748c17f25e57fd91d1d58d96ed1c3 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 21 Jan 2019 10:05:05 +0100 Subject: [PATCH 074/122] updates requirements --- Pipfile | 7 +- Pipfile.lock | 2258 -------------------------------------------------- 2 files changed, 4 insertions(+), 2261 deletions(-) delete mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile index c05fafebc..30302178a 100644 --- a/Pipfile +++ b/Pipfile @@ -8,7 +8,7 @@ psycopg2 = "*" admin-extra-urls = ">=2.1" celery = "*" coreapi = "*" -django = ">=2.1.5" +django = ">=2.1.5,<2.2a" django-adminfilters = ">=1.1" django-celery-beat = "==1.4.0" django-concurrency = "*" @@ -25,7 +25,7 @@ djangorestframework-csv = "*" djangorestframework-jwt = "*" drf-dynamic-serializer = ">=1.2.0" drf-extensions = "*" -drf-yasg = {version = "*", extras = ["validation"]} +drf-yasg = {version = "*",extras = ["validation"]} gunicorn = "*" humanize = "*" pyparsing = "*" @@ -46,7 +46,7 @@ django-redisboard = "*" djangorestframework-xml = "*" redis = "==2.10.6" djangorestframework-yaml = "*" -django-storages = {extras = ["azure"], version = "*"} +django-storages = {extras = ["azure"],version = "*"} onedrivesdk = "*" azure-storage = "*" django-post-office = "*" @@ -57,6 +57,7 @@ django-adminactions = "*" django-dbtemplates = {file = "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz"} django-mptt = "*" djangorestframework-gis = "*" +openpyxl = "==2.5.12" [dev-packages] "flake8" = ">=3.6.0" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 3fceca244..000000000 --- a/Pipfile.lock +++ /dev/null @@ -1,2258 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "5c241f514b93227c4204e085aba5eb92c93d78d3cb418946e4555016bc134802" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.6" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.python.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "adal": { - "hashes": [ - "sha256:ba52913c38d76b4a4d88eaab41a5763d056ab6d073f106e0605b051ab930f5c1", - "sha256:bf79392b8e9e5e82aa6acac3835ba58bbac0ccf7e15befa215863f83d5f6a007" - ], - "version": "==1.2.0" - }, - "admin-extra-urls": { - "hashes": [ - "sha256:cd5c77c3fcde240472bc9a6c79f8c2358ad287c243e6336902c4996c38212b92" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "amqp": { - "hashes": [ - "sha256:9f181e4aef6562e6f9f45660578fc1556150ca06e836ecb9e733e6ea10b48464", - "sha256:c3d7126bfbc640d076a01f1f4f6e609c0e4348508150c1f61336b0d83c738d2b" - ], - "version": "==2.4.0" - }, - "asn1crypto": { - "hashes": [ - "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87", - "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49" - ], - "version": "==0.24.0" - }, - "azure": { - "hashes": [ - "sha256:7d6afa332fccffe1a9390bcfac5122317eec657c6029f144d794603a81cd0e50", - "sha256:8bee1f569f700519e8cdfe210259c5c51fa96cee69ccae6b06f60d7224e334e6" - ], - "markers": "extra == 'azure'", - "version": "==4.0.0" - }, - "azure-applicationinsights": { - "hashes": [ - "sha256:6e1839169bb6ffd2d2c21ee3f4afbdd068ea428ad47cf884ea3167ecf7fd0859", - "sha256:c007a9cb7cee4852673e915220fca267e78f97f275f1a8f09b2266a55702462b" - ], - "version": "==0.1.0" - }, - "azure-batch": { - "hashes": [ - "sha256:017be21a9e6db92473d2e33170d5dd445596fc70d706f73552ac9c6b57a6ef1c", - "sha256:cd71c7ebb5beab174b6225bbf79ae18d6db0c8d63227a7e514da0a75f138364c" - ], - "version": "==4.1.3" - }, - "azure-common": { - "hashes": [ - "sha256:5dd7ed46da968814020ecd961e7496f0a4f5e59f6d452df02100218145f6d1ba", - "sha256:e7cd5a8ee2ec0639454c1bd0f1ea5f609d83977376abfd304527ec7343fef1be" - ], - "version": "==1.1.17" - }, - "azure-cosmosdb-nspkg": { - "hashes": [ - "sha256:5d83961922812ffb6e23f7321550b2916abbd7480ec5b4a798417c4a682ff5e9", - "sha256:acf691e692818d9a65c653c7a3485eb8e35c0bdc496bba652e5ea3905ba09cd8" - ], - "version": "==2.0.2" - }, - "azure-cosmosdb-table": { - "hashes": [ - "sha256:4a34c2c792036afc2a3811f4440ab967351e9ceee6542cc96453b63c678c0145", - "sha256:a9c3d2a75b376a45f4bda84af28e698b7578544bb0e9eb7b53fedef3369634a0" - ], - "version": "==1.0.5" - }, - "azure-datalake-store": { - "hashes": [ - "sha256:84cf6dff24a6433161faa36c18b4c3d46e0bf9504c49ef88fa2280a0bb8661f6", - "sha256:c43f291ab17fc57b68c44adfb597f73255854c2fc57c2c808d146cb175db9519" - ], - "version": "==0.0.40" - }, - "azure-eventgrid": { - "hashes": [ - "sha256:297fa9619622338691078112e479361311507e28ce54af17d2c16ace71ffa4e4", - "sha256:7ebbe1c4266ba176aa4969d9755c08f10b89848ad50fb0bfd16fa82e29234f95" - ], - "version": "==1.2.0" - }, - "azure-graphrbac": { - "hashes": [ - "sha256:825b397665f478fab511e521f3f3f4b64189cb9f6c2e7e873b3b7333dc533974", - "sha256:f94b97bdcf774878fe2f8b8c46a5d6550a4ed891350ed0730c1561a24d488ee2" - ], - "version": "==0.40.0" - }, - "azure-keyvault": { - "hashes": [ - "sha256:37a8e5f376eb5a304fcd066d414b5d93b987e68f9212b0c41efa37d429aadd49", - "sha256:dec5334cde846849dfe7896f2e98f17b4f4d75c316a4d30e7171ce71ca20713d" - ], - "version": "==1.1.0" - }, - "azure-loganalytics": { - "hashes": [ - "sha256:3ceb350def677a351f34b0a0d1637df6be0c6fe87ff32a5270b17f540f6da06e", - "sha256:5a1bdb33e1fd3dfb275d9eec45ed8e1126eda51e9072ccf08a19922ee5e0ad98" - ], - "version": "==0.1.0" - }, - "azure-mgmt": { - "hashes": [ - "sha256:8dcbee7b323c3898ae92f5e2d88c3e6201f197ae48a712970929c4646cc2580a", - "sha256:fdca6b5ecf17e5583f6fd3a20cd4e4e0335a3d91131d62b50cfef40d657234b2" - ], - "version": "==4.0.0" - }, - "azure-mgmt-advisor": { - "hashes": [ - "sha256:8fdcb41f760a216e6b835eaec11dba61822777b386139d83eee31f0ff63b05da", - "sha256:9d166cc9868971d03ec852e900fa1f1b95d8829233eff2b1baf702bd34b9887b" - ], - "version": "==1.0.1" - }, - "azure-mgmt-applicationinsights": { - "hashes": [ - "sha256:929c30559692c77d424ca36f11e98f066c98e7eb7b742c44beadc082715f19df", - "sha256:f10229eb9e3e9d0ad20188b8d14d67055e86f3815b43b75eedf96b654bee2a9b" - ], - "version": "==0.1.1" - }, - "azure-mgmt-authorization": { - "hashes": [ - "sha256:2b8504763ea8b1b475f2c3533b171bedb91ffae459f48f1f885ec8536df91093", - "sha256:535de12ff4f628b62b939ae17cc6186226d7783bf02f242cdd3512ee03a6a40e" - ], - "version": "==0.50.0" - }, - "azure-mgmt-batch": { - "hashes": [ - "sha256:6e375ecdd5966ee9ee45b29c90a806388c27ceacc2cbd6dd406ff311b5d7da72", - "sha256:d942e225180d07aae07a43e489ae0acbacd92651be3a019f4eb330a587028161" - ], - "version": "==5.0.1" - }, - "azure-mgmt-batchai": { - "hashes": [ - "sha256:b5f7df6a77fde0bd6b486762eb2c81750b6f1730ee1116689d2dfbd3e03dba95", - "sha256:f1870b0f97d5001cdb66208e5a236c9717a0ed18b34dbfdb238a828f3ca2a683" - ], - "version": "==2.0.0" - }, - "azure-mgmt-billing": { - "hashes": [ - "sha256:3810cdda69ec1409191b292628fe6ba86ce5e0444723b960d91af4f401846ac3", - "sha256:85f73bb3808a7d0d2543307e8f41e5b90a170ad6eeedd54fe7fcaac61b5b22d2" - ], - "version": "==0.2.0" - }, - "azure-mgmt-cdn": { - "hashes": [ - "sha256:069774eb4b59b76ff9bd01708be0c8f9254ed40237b48368c3bb173f298755dd", - "sha256:5d5fa3e3f37632e5787e73e78af37a28d7dd0206c854cc0a4d39d75b953f0c31" - ], - "version": "==3.0.0" - }, - "azure-mgmt-cognitiveservices": { - "hashes": [ - "sha256:36b406ee4b6652cd144a99309cd823ac1c726b0160120c14e4c35cb668f3f8ff", - "sha256:c3247f2786b996a5f328ebdaf65d31507571979e004de7a5ed0ff280f95d80b4" - ], - "version": "==3.0.0" - }, - "azure-mgmt-commerce": { - "hashes": [ - "sha256:c48e84ed322fa9ddbc2d7fcca754c5e97171919be94f510bd2579cf5666684c3", - "sha256:ddcd403bcaf6b7de2cbf1bc249b7db452b35dc1f0503f940368efc722dc0bc90" - ], - "version": "==1.0.1" - }, - "azure-mgmt-compute": { - "hashes": [ - "sha256:356219a354140ea26e6b4f4be4f855f1ffaf63af60de24cd2ca335b4ece9db00", - "sha256:3c6dddd3cb971092ed86d5825475f915561b62eae3a516e990fc2fb3fea54fcc" - ], - "version": "==4.4.0" - }, - "azure-mgmt-consumption": { - "hashes": [ - "sha256:36ea28bb2ed4bec7e4d643444085ba4debed20a01fbd87f599896a4bda3318bd", - "sha256:9a85a89f30f224d261749be20b4616a0eb8948586f7f0f20573b8ea32f265189" - ], - "version": "==2.0.0" - }, - "azure-mgmt-containerinstance": { - "hashes": [ - "sha256:274a9def808407fafe123aa8e9bc1c838a48af2de56419598db7a8b8901086e3", - "sha256:f1ea7d150447f0d8d670b7db13bd2f47320385526021053445d15c427cba6713" - ], - "version": "==1.4.0" - }, - "azure-mgmt-containerregistry": { - "hashes": [ - "sha256:4d31588ca5c5258b4a595e3de400994c7f6fff3b84faccf9b8a0ff6b583eba63", - "sha256:5630c31f2ae65e7cbf4df82f7b7817d017f2c0fab42ab1b253f38336a67f9dec" - ], - "version": "==2.6.0" - }, - "azure-mgmt-containerservice": { - "hashes": [ - "sha256:150fa5437726a97428ab107e4de155c950f8065834f43aa2dff5924d20d4b42c", - "sha256:b75ceac9a18be75c4f6b1ee4e5320a3c75c78472b49d4ff7d374502d914f7594" - ], - "version": "==4.4.0" - }, - "azure-mgmt-cosmosdb": { - "hashes": [ - "sha256:a6e70527994d8ce7f4eeca80c7691bc9555adf90819848a9a30284a33b0cffe2", - "sha256:d5f448e9e6733b83e2e6bde28267bb30620c5a3f1399e66dcfe04d0b80960094" - ], - "version": "==0.4.1" - }, - "azure-mgmt-datafactory": { - "hashes": [ - "sha256:63d6cad02ef4d9da788b148b69c708227085b2d948d805bbf54150c7a692393c", - "sha256:6ee02286e9950b9f5b76589459f6d060a962faaab1f49c263a55d011e98b30bf" - ], - "version": "==0.6.0" - }, - "azure-mgmt-datalake-analytics": { - "hashes": [ - "sha256:0d64c4689a67d6138eb9ffbaff2eda2bace7d30b846401673183dcb42714de8f", - "sha256:ac96c9777314831db37461f0602e75298bc25277ba7f4d0d3e7966a926669b7e" - ], - "version": "==0.6.0" - }, - "azure-mgmt-datalake-nspkg": { - "hashes": [ - "sha256:2ac6fa13c55b87112199c5fb03a3098cefebed5f44ac34ab3d39b399951b22c4", - "sha256:3b9e2843f5d0fd6015bba13040dfc2f5fe9bc7b02c9d91dd578e8fe852d1b2dd", - "sha256:deb192ba422f8b3ec272ce4e88736796f216f28ea5b03f28331d784b7a3f4880" - ], - "version": "==3.0.1" - }, - "azure-mgmt-datalake-store": { - "hashes": [ - "sha256:2af98236cd7eaa439b239bf761338c866996ce82e9c129b204e8851e5dc095dd", - "sha256:9376d35495661d19f8acc5604f67b0bc59493b1835bbc480f9a1952f90017a4c" - ], - "version": "==0.5.0" - }, - "azure-mgmt-datamigration": { - "hashes": [ - "sha256:bb654d9f96166a5cf2638f821af5cee8b1c331257c69b053592375a4d2bb4d5e", - "sha256:ea2920475f9e56e660003a06397228243042157d46674f8a09abaf2d0a933aed" - ], - "version": "==1.0.0" - }, - "azure-mgmt-devspaces": { - "hashes": [ - "sha256:220f1610c2cda584e4212611679868d8cc5bdd789d3f0dfa1259b64fc968f580", - "sha256:4710dd59fc219ebfa4272dbbad58bf62093b52ce22bfd32a5c0279d2149471b5" - ], - "version": "==0.1.0" - }, - "azure-mgmt-devtestlabs": { - "hashes": [ - "sha256:7e91bb139b59cfaf1c1b2b0e3e21f091768c658c1879797757dedc6312f00c8c", - "sha256:d416a6d0883b0d33a63c524db6455ee90a01a72a9d8757653e446bf4d3f69796" - ], - "version": "==2.2.0" - }, - "azure-mgmt-dns": { - "hashes": [ - "sha256:3730b1b3f545a5aa43c0fff07418b362a789eb7d81286e2bed90ffef88bfa5d0", - "sha256:5b80546b0f182d7abe90c43025cd5ca7e6605224b4d5b872cca2456667f172ef" - ], - "version": "==2.1.0" - }, - "azure-mgmt-eventgrid": { - "hashes": [ - "sha256:824503b668137affa5b3782c6348c0bb6ab012c72fe47a3be9942c5639f82f8a", - "sha256:9518e9d7e60ab90a7d18ae6a3f0049ca57588f8f9583ab40d442c2a5387cf94e" - ], - "version": "==1.0.0" - }, - "azure-mgmt-eventhub": { - "hashes": [ - "sha256:675804761cb146fd4eef9b4fb2aecf257da9837780bd03147e74906d7473c4c1", - "sha256:b5407e529b9daeefbb9393c8f7401f44a21ecfeede6e03cf08456149c1d3533e" - ], - "version": "==2.2.0" - }, - "azure-mgmt-hanaonazure": { - "hashes": [ - "sha256:9fe4dc0adeb772d13918e1d6126d83c7770b762f358487504c5f082f542d0189", - "sha256:aec953c54809d0cc2f61f24d4d62a97f02c466bdc7906fd66f30120becf0c3df" - ], - "version": "==0.1.1" - }, - "azure-mgmt-iotcentral": { - "hashes": [ - "sha256:0d2101f3ea8a21ec3b29ee72d83e6ca606a241efec3b042cda8c656ad99b8fd2", - "sha256:59f7c653ac7d6475d5d7900902a5d0e0fe7aad03224c47d70f2cf1e20d43a81d" - ], - "version": "==0.1.0" - }, - "azure-mgmt-iothub": { - "hashes": [ - "sha256:08388142ed6844f0a0e97d2740decf80ffc94f22adca174c15f60b9e2c2d14be", - "sha256:77221c5b6ff7feabc2e6d44156e29fbee9098b34de044165d3532b64b678bdb1" - ], - "version": "==0.5.0" - }, - "azure-mgmt-iothubprovisioningservices": { - "hashes": [ - "sha256:2b3480a8ad2e535928da55de92b6127d02171768fed375b112274eb1e55268c1", - "sha256:8c37acfd1c33aba845f2e0302ef7266cad31cba503cc990a48684659acb7b91d" - ], - "version": "==0.2.0" - }, - "azure-mgmt-keyvault": { - "hashes": [ - "sha256:05a15327a922441d2ba32add50a35c7f1b9225727cbdd3eeb98bc656e4684099", - "sha256:406298b6236abf9e3bae3218df2fc89c25aee471b917eca7769ff5696fc8ec01" - ], - "version": "==1.1.0" - }, - "azure-mgmt-loganalytics": { - "hashes": [ - "sha256:c7315ff0ee4d618fb38dca68548ef4023a7a20ce00efe27eb2105a5426237d86", - "sha256:f224b7d52f4369ce057c7f83e80da1d00a8887ad5c15606529e9c930e601088f" - ], - "version": "==0.2.0" - }, - "azure-mgmt-logic": { - "hashes": [ - "sha256:232c175e45582f7c547d3b50d93bd64aec37b400426962e4fd0cd235980ea110", - "sha256:d163dfc32e3cfa84f3f8131a75d9e94f5c4595907332cc001e45bf7e4efd5add" - ], - "version": "==3.0.0" - }, - "azure-mgmt-machinelearningcompute": { - "hashes": [ - "sha256:4995ba9ee392eb4f5579e93dba9187b67007187e7fd022d6b417ec56e6761a6b", - "sha256:7a52f85591114ef33a599dabbef840d872b7f599b7823e596af9490ec51b873f" - ], - "version": "==0.4.1" - }, - "azure-mgmt-managementgroups": { - "hashes": [ - "sha256:005e8289c2e1d8a8368c96790edf6a34e5c37b4096bce2eb8a923c6d5dc11fb2", - "sha256:ff62d982edda634a36160cb1d15a367a9572a5acb419e5e7ad371e8c83bd47c7" - ], - "version": "==0.1.0" - }, - "azure-mgmt-managementpartner": { - "hashes": [ - "sha256:1b0ec9b9d084e331b863cef77f002ede8cbc6214bb56c3c8dd7945d10c7ffc77", - "sha256:2d7d5f346cc3d6ad621a39357637565199c51a65c7e451b73aced1c097a78165" - ], - "version": "==0.1.0" - }, - "azure-mgmt-maps": { - "hashes": [ - "sha256:a779b1ddbbcd95393e53f11b586dd26c42a709aaa226412a2df64d0da6807a80", - "sha256:c120e210bb61768da29de24d28b82f8d42ae24e52396eb6569b499709e22f006" - ], - "version": "==0.1.0" - }, - "azure-mgmt-marketplaceordering": { - "hashes": [ - "sha256:6da12425cbab0cc62f246e7266b4d67aff6bdd031ecbe50c7542c2f2b2440ad4", - "sha256:fb7a21f4a4a4b8d32bae600614f047a17993111374c9567ac11f241ada61d69f" - ], - "version": "==0.1.0" - }, - "azure-mgmt-media": { - "hashes": [ - "sha256:688b56daad16e84afc7ad788a1d0d2969e365317db0d6034dd428a08030d21aa", - "sha256:6d68668b14c00b4c68f695f2bb69ff77af29034d440371c2bdd9c80187b1a08c" - ], - "version": "==1.0.0" - }, - "azure-mgmt-monitor": { - "hashes": [ - "sha256:838867a150694837e9c6141760ff0f20fe9e5b7ab88f9ba868fde1810855895e", - "sha256:f1a58d483e3292ba4f7bbf3104573130c9265d6c9262e26b60cbfa950b5601e4" - ], - "version": "==0.5.2" - }, - "azure-mgmt-msi": { - "hashes": [ - "sha256:8622bc9a164169a0113728ebe7fd43a88189708ce6e10d4507247d6907987167", - "sha256:e989e61753bf4eca0e688526b7c31c9a88082080acfb038fad17dda7f084a026" - ], - "version": "==0.2.0" - }, - "azure-mgmt-network": { - "hashes": [ - "sha256:5356a5998f1cf509436defcce2e3e560a3d14ce6f9b5d32640a27578ddeb233b", - "sha256:cef9bf5d36700966e52f7cea86e29c622bc5bbb92d0ce7a75420e29fb0e75f45" - ], - "version": "==2.5.1" - }, - "azure-mgmt-notificationhubs": { - "hashes": [ - "sha256:481aaf1c5c4b951c3114f9d256913a443892a18d3c2130f63149edf160b6b70d", - "sha256:7c4c7755c28c8301cfa90d6ded9509c30444e5dfc5001b132dca57836930602b" - ], - "version": "==2.0.0" - }, - "azure-mgmt-nspkg": { - "hashes": [ - "sha256:1c6f5134de78c8907e8b73a8ceaaf1f336a24193a543039994fe002bb5f7f39f", - "sha256:8b2287f671529505b296005e6de9150b074344c2c7d1c805b3f053d081d58c52", - "sha256:d638ea5fda3ed323db943feb29acaa200f5d8ff092078bf8d29d4a2f8ed16999" - ], - "version": "==3.0.2" - }, - "azure-mgmt-policyinsights": { - "hashes": [ - "sha256:49b88331bf823a030182ff492b728828c35758c7e49c8898a403bce5b210ba49", - "sha256:ff94cb12d6e01bf1470c2a6af4ce6960669ab4209106153879ff97addc569ce1" - ], - "version": "==0.1.0" - }, - "azure-mgmt-powerbiembedded": { - "hashes": [ - "sha256:2f05be73f2a086c579a78fc900e3b2ae14ccde5bcec54e29dfc73e626b377476", - "sha256:6f75fef7ff576383c8c6692ba5a1efa634e6eded99d0ff6e76fdc8327325fe2f" - ], - "version": "==2.0.0" - }, - "azure-mgmt-rdbms": { - "hashes": [ - "sha256:3b6a194e6b82aa9fa187d1060ff3f19ad7218317b9ae30d9b64c3113ac8dfd7c", - "sha256:f9b77f0ead387f48c3a81914e2b976967300b3e31be10a101abd00057af7bddd" - ], - "version": "==1.5.0" - }, - "azure-mgmt-recoveryservices": { - "hashes": [ - "sha256:29df3e58890492efdd80d608b7a0fd2006c8a908687c35b9b1f70af068c0f6e4", - "sha256:e48f7769fb10a85ad857710c2cba47880166f69fe7da6b331771f129b21de95c" - ], - "version": "==0.3.0" - }, - "azure-mgmt-recoveryservicesbackup": { - "hashes": [ - "sha256:1e55b6cbb808df83576cef352ba0065f4878fe505299c0a4c5a97f4f1e5793df", - "sha256:5c44bd73df6eb55382335f16a21aee62ddc8e271cd913b9147768f42aba59c3d" - ], - "version": "==0.3.0" - }, - "azure-mgmt-redis": { - "hashes": [ - "sha256:374a267b83ec4e71077b8afad537863fb93816c96407595cdd02973235356ded", - "sha256:41d12cea5673b2e277ea298d85bab7d1fdbd0636ff6be08b15ee30a312c07d6d" - ], - "version": "==5.0.0" - }, - "azure-mgmt-relay": { - "hashes": [ - "sha256:1411e734573ce6166ac7a75fbfc0afb7d6b3f47a94d0b4999b6adf2709eba87c", - "sha256:d9f987cf2998b8a354f331b2a71082c049193f1e1cd345812e14b9b821365acb" - ], - "version": "==0.1.0" - }, - "azure-mgmt-reservations": { - "hashes": [ - "sha256:40618a3700c47a788182649f238d985edf15b08b6577ea27557e70e2866ac171", - "sha256:612acfa18f005c2ee5dda5c473b8bf6540d232db331b27be47de2608c5855adb" - ], - "version": "==0.2.1" - }, - "azure-mgmt-resource": { - "hashes": [ - "sha256:56c7d4e8d6854212977477272c600ab1d2c535de2a86095b56e948b06eb6d539", - "sha256:aef8573066026db04ed3e7c5e727904e42f6462b6421c2e8a3646e4c4f8128be" - ], - "version": "==2.1.0" - }, - "azure-mgmt-scheduler": { - "hashes": [ - "sha256:59e7cced3ee9b93016efb8cf5f965ca11a463bb8e55f96a2f200b013426dd751", - "sha256:c6e6edd386ddc4c21d54b1497c3397b970bc127b71809b51bd2391cb1f3d1a14" - ], - "version": "==2.0.0" - }, - "azure-mgmt-search": { - "hashes": [ - "sha256:0ec5de861bd786bcb8691322feed6e6caa8d2f0806a50dc0ca5d640591926893", - "sha256:fdbaa1721b045a4ea4a21c84c6bc1f9636b39e93dff09ffd68f22e5da88bd3ea" - ], - "version": "==2.0.0" - }, - "azure-mgmt-servicebus": { - "hashes": [ - "sha256:7d1e8c3dc05ffdfe496ae643290ce4de93a3bf814ffda69121223e3d7da12408", - "sha256:cbc3fc8d8b8930452cf7d499856313da208eb66f62ade0091aa9bae0db2b1674" - ], - "version": "==0.5.3" - }, - "azure-mgmt-servicefabric": { - "hashes": [ - "sha256:0c1434e789d0c036c613855b898a385a4533656f45eafae3ef7af3ecf4d6a3e8", - "sha256:b2bf2279b8ff8450c35e78e226231655021482fdbda27db09975ebfc983398ad" - ], - "version": "==0.2.0" - }, - "azure-mgmt-signalr": { - "hashes": [ - "sha256:37a79dfe21af4addbd9cdf248a260387caabdfdd60d2ba6f3174d28e96660655", - "sha256:8a6266a59a5c69102e274806ccad3ac74b06fd2c226e16426bbe248fc2174903" - ], - "version": "==0.1.1" - }, - "azure-mgmt-sql": { - "hashes": [ - "sha256:43668705f17bd3532e2e489d368937eb19e7d0515638146c156982ace76e0743", - "sha256:5da488a56d5265757b45747cf5fd22413eb089e606658d6e6d84fe3e9b07e4fa" - ], - "version": "==0.9.1" - }, - "azure-mgmt-storage": { - "hashes": [ - "sha256:512a29798833453f8c32a5b6d038a459649bbb5b9970ac23c982b5787057fa2b", - "sha256:9577cea1f7a86ca1db6f14539bd05ce27f43ebe590cc7f23c943961a2c5c1cdc" - ], - "version": "==2.0.0" - }, - "azure-mgmt-subscription": { - "hashes": [ - "sha256:309b23f0de65f26da80c801e913b0c3b2aea8b90ba583d919f81fe6f329d3f1b", - "sha256:a37925fb820cb86dfb57559846cc97c7e066fe0e64da7594175f4a4f5e50783c" - ], - "version": "==0.2.0" - }, - "azure-mgmt-trafficmanager": { - "hashes": [ - "sha256:126167eaa82b443b5b71394050ec292f45074701232bdbdda71f636e9b46516b", - "sha256:65796588ffbeac45bf73668977131c317b64d6a3f32faecdc5cbf9683d48132c" - ], - "version": "==0.50.0" - }, - "azure-mgmt-web": { - "hashes": [ - "sha256:8ea0794eef22a257773c13269b94855ab79d36c342ad15a98135403c9785cc0a", - "sha256:f4ddb4850314325db688241caa323fa80d811dc4590454d87f5c5b558557ea51" - ], - "version": "==0.35.0" - }, - "azure-nspkg": { - "hashes": [ - "sha256:1d0bbb2157cf57b1bef6c8c8e5b41133957364456c43b0a43599890023cca0a8", - "sha256:31a060caca00ed1ebd369fc7fe01a56768c927e404ebc92268f4d9d636435e28", - "sha256:e7d3cea6af63e667d87ba1ca4f8cd7cb4dfca678e4c55fc1cedb320760e39dd0" - ], - "version": "==3.0.2" - }, - "azure-servicebus": { - "hashes": [ - "sha256:30d5beaf73eaf40aba52fdd7f7f26dd8c3e639051dc19a5f2ab5f8e7832d68f7", - "sha256:bb6a27afc8f1ea9ab46ff2371069243d45000d351d9b64e450b63d52409b934d" - ], - "version": "==0.21.1" - }, - "azure-servicefabric": { - "hashes": [ - "sha256:8724718ef48c2810dbd8609c193225fa1e037a2c9ce70c7263f5b031e2e8f208", - "sha256:c82575cbdf95cc897c3230ea889d4e751d8760a2223857fe6fbeeea5b802e5e2" - ], - "version": "==6.3.0.0" - }, - "azure-servicemanagement-legacy": { - "hashes": [ - "sha256:282d48aae6aa002c59db6f651b68777a8f93692bb8e9b443113e6a8d5ce5e875", - "sha256:c883ff8fa3d4f4cb7b9344e8cb7d92a9feca2aa5efd596237aeea89e5c10981d" - ], - "version": "==0.20.6" - }, - "azure-storage": { - "hashes": [ - "sha256:4c406422e3edd41920bb1f0c3930c34fee3eb0d55258ef7ec7308ccbb9385ad5", - "sha256:fb6212dcbed91b49d9637aa5e8888eafdfcd523b7e560c8044d2d838bbd3ca5f" - ], - "index": "pypi", - "version": "==0.36.0" - }, - "azure-storage-blob": { - "hashes": [ - "sha256:65ebe2e54460566c2077c6b3773a2a0623eabc7b95602010cb51b84077087fda", - "sha256:baa828607e21e5c7b6ceb2ede9894d465adf586373c2f7c988fe55eca8e9048c" - ], - "markers": "extra == 'azure'", - "version": "==1.4.0" - }, - "azure-storage-common": { - "hashes": [ - "sha256:69bba6aad1e8a717eeee0f95c2feeeed72ef802001e66d6d15bf8446c4f53e6a", - "sha256:7ab607f9b8fd27b817482194b1e7d43484c65dcf2605aae21ad8706c6891934d" - ], - "version": "==1.4.0" - }, - "azure-storage-file": { - "hashes": [ - "sha256:5217b0441b671246a8d5f506a459fa3af084eeb9297c5be3bbe95d75d23bac2f", - "sha256:65831e66594cdda36e02f5566ea9d8a6ad35eca6691c28f1fbb49f23987752ff" - ], - "version": "==1.4.0" - }, - "azure-storage-queue": { - "hashes": [ - "sha256:0bafe9e61c0ce7b3f3ecadea21e931dab3248bd4989dc327a8666c5deae7f7ed", - "sha256:d28e6f854ed5d719d62637c1b5c2b74d9c67584bc326de5ce41ba0af73e3a3f0" - ], - "version": "==1.4.0" - }, - "billiard": { - "hashes": [ - "sha256:42d9a227401ac4fba892918bba0a0c409def5435c4b483267ebfe821afaaba0e" - ], - "version": "==3.5.0.5" - }, - "celery": { - "hashes": [ - "sha256:77dab4677e24dc654d42dfbdfed65fa760455b6bb563a0877ecc35f4cfcfc678", - "sha256:ad7a7411772b80a4d6c64f2f7f723200e39fb66cf614a7fdfab76d345acc7b13" - ], - "index": "pypi", - "version": "==4.2.1" - }, - "certifi": { - "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" - ], - "version": "==2018.11.29" - }, - "cffi": { - "hashes": [ - "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743", - "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef", - "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50", - "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f", - "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30", - "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93", - "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257", - "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b", - "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3", - "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e", - "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc", - "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04", - "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6", - "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359", - "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596", - "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b", - "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd", - "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95", - "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5", - "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e", - "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6", - "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca", - "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31", - "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1", - "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2", - "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085", - "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801", - "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4", - "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184", - "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917", - "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f", - "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb" - ], - "version": "==1.11.5" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", - "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" - ], - "version": "==6.7" - }, - "coreapi": { - "hashes": [ - "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb", - "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3" - ], - "index": "pypi", - "version": "==2.3.3" - }, - "coreschema": { - "hashes": [ - "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f", - "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607" - ], - "version": "==0.0.4" - }, - "cryptography": { - "hashes": [ - "sha256:02915ee546b42ce513e8167140e9937fc4c81a06a82216e086ccce51f347948a", - "sha256:03cc8bc5a69ae3d44acf1a03facdb7c10a94c67907862c563e10efe72b737977", - "sha256:07f76bde6815c55195f3b3812d35769cc7c765144c0bb71ae45e02535d078591", - "sha256:13eac1c477b9af7e9a9024369468d08aead6ad78ed599d163ad046684474364b", - "sha256:179bfb585c5efc87ae0e665770e4896727b92dbc1f810c761b1ebf8363e2fec8", - "sha256:414af0ba308e74c1f8bc5b11befc86cb66b10be8959547786f64258830d2096f", - "sha256:41a1ca14f255df8c44dd22c6006441d631d1589104045ec7263cc47e9772f41a", - "sha256:54947eb98bc4eef99ddf49f45d2694ea5a3929ab3edc9806ad01967368594d82", - "sha256:5bac7a2abda07d0c3c8429210349bb54149ad8940dc7bcffedcd56519b410a3c", - "sha256:7f41af8c586bed9f59cfe8832d818b3b75c860d7025da9cd2db76875a72ff785", - "sha256:8004fae1b3cb2dbd90a011ad972e49a7e78a871b89c70cc7213cf4ebd2532bcb", - "sha256:8e0eccadc3b465e12c50a5b8fb4d39cf401b44d7bb9936c70fddb5e5aaf740d5", - "sha256:95b4741722269cfdc134fec23b7ae6503ee2aea83d0924cfee6d6ec54cd42d8e", - "sha256:a06f5aa6d7a94531dfe82eb2972e669258c452fe9cf88f76116610de4c789785", - "sha256:b0833d27c7eb536bc27323a1e8e22cb39ebac78c4ef3be0167ba40f447344808", - "sha256:b72dec675bc59a01edc96616cd48ec465b714481caa0938c8bbca5d18f17d5df", - "sha256:c800ddc23b5206ce025f23225fdde89cdc0e64016ad914d5be32d1f602ce9495", - "sha256:c980c8c313a5e014ae12e2245e89e7b30427e5a98cbb88afe478ecae85f3abaa", - "sha256:e85b410885addaeb31a867eabcefc9ef4a7e904ad45eac9e60a763a54b244626" - ], - "index": "pypi", - "version": "==2.4.1" - }, - "defusedxml": { - "hashes": [ - "sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4", - "sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20" - ], - "markers": "python_version >= '3.0'", - "version": "==0.5.0" - }, - "django": { - "hashes": [ - "sha256:a32c22af23634e1d11425574dce756098e015a165be02e4690179889b207c7a8", - "sha256:d6393918da830530a9516bbbcbf7f1214c3d733738779f06b0f649f49cc698c3" - ], - "index": "pypi", - "version": "==2.1.5" - }, - "django-adminactions": { - "hashes": [ - "sha256:cc8d236797dcebdfa229dc0f938dc8c5ab648b488318c9f584a13df8a03bd066" - ], - "index": "pypi", - "version": "==1.6.0" - }, - "django-adminfilters": { - "hashes": [ - "sha256:adab7f927b0845f9d87902ef3148ba704214e5977e5da483e386e82e445cb879" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "django-appconf": { - "hashes": [ - "sha256:6a4d9aea683b4c224d97ab8ee11ad2d29a37072c0c6c509896dd9857466fb261", - "sha256:ddab987d14b26731352c01ee69c090a4ebfc9141ed223bef039d79587f22acd9" - ], - "version": "==1.0.2" - }, - "django-braces": { - "hashes": [ - "sha256:a457d74ea29478123c0c4652272681b3cea0bf1232187fd9f9b6f1d97d32a890", - "sha256:ba68e98b817c6f01d71d10849f359979617b3fe4cefb7f289adefddced092ddc" - ], - "version": "==1.13.0" - }, - "django-celery-beat": { - "hashes": [ - "sha256:3c2c22647455be5503aca7450db64ea53acacee2d0aef3d7ac49aa3ef3845724", - "sha256:bfc22dad2884524697e1fcdfa63c0555a65151a97902c3045cd2cf7bf63970e4" - ], - "index": "pypi", - "version": "==1.4.0" - }, - "django-celery-email": { - "hashes": [ - "sha256:1b2e0e31c6266007463befdc23934696fc93dcf320dfc85b8bb6b063cfe9558a", - "sha256:e5f9122c02ec58d3e49653475ad1b8612fd752681ce2f006d9c0792c57046283" - ], - "index": "pypi", - "version": "==2.0.1" - }, - "django-concurrency": { - "hashes": [ - "sha256:233d23a8751989df6db2886957a8fbcc2408a1f16bb28262aab8a538d756d9d2" - ], - "index": "pypi", - "version": "==1.4" - }, - "django-constance": { - "hashes": [ - "sha256:5a4fec5361214b4658c64184b45a6678cb8f8bf8d342f56976f87d5c6645860a", - "sha256:a49735063b2c30015d2e52a90609ea9798da722ed070f091de51714758a5d018" - ], - "index": "pypi", - "version": "==2.3.1" - }, - "django-cors-headers": { - "hashes": [ - "sha256:5545009c9b233ea7e70da7dbab7cb1c12afa01279895086f98ec243d7eab46fa", - "sha256:c4c2ee97139d18541a1be7d96fe337d1694623816d83f53cb7c00da9b94acae1" - ], - "index": "pypi", - "version": "==2.4.0" - }, - "django-countries": { - "hashes": [ - "sha256:2f684e2c2b8afdfd80137c8bcbb2d75f62a4a7863101cc62b4d84d3c9f27fdab", - "sha256:74ebe919aeccea818dafea17b0b243fb1280c55226cb315b9622f0c0416536d2" - ], - "index": "pypi", - "version": "==5.3.2" - }, - "django-crashlog": { - "hashes": [ - "sha256:147a09226c69f4f8349292680662e53f20b232dc02d0f86e4532418a1da2dd94" - ], - "index": "pypi", - "version": "==1.0.0" - }, - "django-crispy-forms": { - "hashes": [ - "sha256:5952bab971110d0b86c278132dae0aa095beee8f723e625c3d3fa28888f1675f", - "sha256:705ededc554ad8736157c666681165fe22ead2dec0d5446d65fc9dd976a5a876" - ], - "index": "pypi", - "version": "==1.7.2" - }, - "django-db-logging": { - "hashes": [ - "sha256:4787de15c1a933e016766f023730f9551e8bf341e99549d13a918f27bf403f30" - ], - "index": "pypi", - "version": "==0.5.0" - }, - "django-dbtemplates": { - "file": "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz" - }, - "django-environ": { - "hashes": [ - "sha256:6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde", - "sha256:c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4" - ], - "index": "pypi", - "version": "==0.4.5" - }, - "django-filter": { - "hashes": [ - "sha256:6f4e4bc1a11151178520567b50320e5c32f8edb552139d93ea3e30613b886f56", - "sha256:86c3925020c27d072cdae7b828aaa5d165c2032a629abbe3c3a1be1edae61c58" - ], - "index": "pypi", - "version": "==2.0.0" - }, - "django-js-asset": { - "hashes": [ - "sha256:30149158206f693a5d027fe590096fc84495486bd11cd77d395b4f2ec27fc1d0", - "sha256:a395d8d19eb201ea8d2bd4f145b38f1717cd74c0f609f040141d8724c5a27f36" - ], - "version": "==1.1.0" - }, - "django-model-utils": { - "hashes": [ - "sha256:2c057f3bf0859aba27f04389f0cedd2d48f8c9b3848acb86fd9970794e58f477", - "sha256:8cd377744aa45f9f131d652ec460c57d1aaa88d3e9b586c8e27eb709341b9084" - ], - "index": "pypi", - "version": "==3.1.2" - }, - "django-mptt": { - "hashes": [ - "sha256:18a41d1b56ca7c02a5b04d246e33ee2d18f6ee5459c02ed1d945f5abdef23a2e", - "sha256:689a04cce0981671d6061a9928c33a16b47abb0d4cd43cf7dec31ae284fdae9d" - ], - "index": "pypi", - "version": "==0.9.1" - }, - "django-oauth-toolkit": { - "hashes": [ - "sha256:ad1b76275950ebbff708222cec57bbdb879f89bac7df6b9dee0f4b9db485c264" - ], - "version": "==1.2.0" - }, - "django-picklefield": { - "hashes": [ - "sha256:9052f2dcf4882c683ce87b4356f29b4d014c0dad645b6906baf9f09571f52bc8", - "sha256:f1733a8db1b6046c0d7d738e785f9875aa3c198215de11993463a9339aa4ea24" - ], - "index": "pypi", - "version": "==2.0" - }, - "django-post-office": { - "hashes": [ - "sha256:207b663a05d5d6a62765eb30081093837272a888cf00557d89d0e6f467928871", - "sha256:827937a944fe47cea393853069cd9315d080298c8ddb0faf787955d6aa51a030" - ], - "index": "pypi", - "version": "==3.1.0" - }, - "django-redis": { - "hashes": [ - "sha256:af0b393864e91228dd30d8c85b5c44d670b5524cb161b7f9e41acc98b6e5ace7", - "sha256:f46115577063d00a890867c6964ba096057f07cb756e78e0503b89cd18e4e083" - ], - "index": "pypi", - "version": "==4.10.0" - }, - "django-redisboard": { - "hashes": [ - "sha256:5db5598b9f423d31ae7424b825a6c41c29fbc8cae2907ccc18974e862122be86", - "sha256:6c1df00d936f178f9e1a8991324ed9e7e3bf0ffefaaf195fbf4decc5c8c17d14" - ], - "index": "pypi", - "version": "==4.0.0" - }, - "django-regex": { - "hashes": [ - "sha256:a4508894b49dd35e49acfbb8ee1046913ebe375ecbecebf64d30ffb9b4be6f2b" - ], - "index": "pypi", - "version": "==0.2.1" - }, - "django-rest-framework-social-oauth2": { - "hashes": [ - "sha256:c9a297b636ffd37957c6146280e99ead41e6aca37bcb995e3d52d65eefbca0b7" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "django-storages": { - "extras": [ - "azure" - ], - "hashes": [ - "sha256:8e35d2c7baeda5dc6f0b4f9a0fc142d25f9a1bf72b8cebfcbc5db4863abc552d", - "sha256:b1a63cd5ea286ee5a9fb45de6c3c5c0ae132d58308d06f1ce9865cfcd5e470a7" - ], - "index": "pypi", - "version": "==1.7.1" - }, - "django-strategy-field": { - "hashes": [ - "sha256:659ce7d1fec5dc7770291f64d530e345e155d4d24f843f225d0b5a451f7b3706" - ], - "index": "pypi", - "version": "==1.3.2" - }, - "django-sysinfo": { - "hashes": [ - "sha256:73844d6662ab7eb724d40f935aaef84bbe00cbe03a529bf263b54caf918b1c9c" - ], - "index": "pypi", - "version": "==1.4" - }, - "django-timezone-field": { - "hashes": [ - "sha256:7d7a37cfeacec5b1e81cd2f0aa334d46ebaa369cd516028579ed343cbc676c38", - "sha256:d9fdab77c443b78c362ffaeb50fe7d7b54692c89aaae8ca1cae67848139b82ac" - ], - "version": "==3.0" - }, - "djangorestframework": { - "hashes": [ - "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", - "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" - ], - "version": "==3.9.1" - }, - "djangorestframework-csv": { - "hashes": [ - "sha256:2f008b20a44f2d3c37835ea5b5ddfe19f54394f07b9cb267c616a917a7f7e27c" - ], - "index": "pypi", - "version": "==2.1.0" - }, - "djangorestframework-gis": { - "hashes": [ - "sha256:35527c51e083ccc93f6e6d90a6515c132bbeb2c5648b166ac5b1a48c4ea8e2a4", - "sha256:e645c6c8aedee53ac0a4851abcdf8121fff66813eebae1b040b1ccb941cb248b" - ], - "index": "pypi", - "version": "==0.14" - }, - "djangorestframework-jwt": { - "hashes": [ - "sha256:5efe33032f3a4518a300dc51a51c92145ad95fb6f4b272e5aa24701db67936a7", - "sha256:ab15dfbbe535eede8e2e53adaf52ef0cf018ee27dbfad10cbc4cbec2ab63d38c" - ], - "index": "pypi", - "version": "==1.11.0" - }, - "djangorestframework-xml": { - "hashes": [ - "sha256:d8118580b6c0e94a6b908a78c8d842e9f349901dfff43d91adc2d73a54f4ba59", - "sha256:d85d5744e75fe01ea2af667b15f6aa7df97c710516477ba493558da8432f6b0f" - ], - "index": "pypi", - "version": "==1.4.0" - }, - "djangorestframework-yaml": { - "hashes": [ - "sha256:58e44b2ba2b1484fe793adcdc5d04910ab9b385a2991603b049b96eed6a76d32", - "sha256:b2277cb0459cf14b473e8cb6e0055725582afe862049c32b840b261ca8fbce3e" - ], - "index": "pypi", - "version": "==1.0.3" - }, - "drf-dynamic-serializer": { - "hashes": [ - "sha256:058ae34570c1dfce4e8e97ac4a5c4ad543279b77f97e2ca254caaff9407c149a" - ], - "index": "pypi", - "version": "==2.0" - }, - "drf-extensions": { - "hashes": [ - "sha256:11223bc2e173233f4a108456df6433edebc895f65be0dcaa2a76f082fa3b91c3", - "sha256:6638ced63fabfefaa18b81e288a9f459234825ca734ab8dc9942d788b6ee7af4" - ], - "index": "pypi", - "version": "==0.4.0" - }, - "drf-renderer-xlsx": { - "hashes": [ - "sha256:21e9975f6ac6a45c91e8109f5c53ae6ae0569b9a8d4406e74590efafc56ef448", - "sha256:9bbdcd210abdf66e8c22b2c2cdb3fac67b017c151d496a944a52ff33a777c3b6" - ], - "index": "pypi", - "version": "==0.3.1" - }, - "drf-yasg": { - "extras": [ - "validation" - ], - "hashes": [ - "sha256:89c84779fb4bfe9c0704bdd40ad70b91fff13fa202696ce580de1c8615414f88", - "sha256:c37adfd3859d04827f971098227a54ef7229a79860860dae7b41abdc17e4e8cf" - ], - "index": "pypi", - "version": "==1.12.1" - }, - "et-xmlfile": { - "hashes": [ - "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b" - ], - "version": "==1.0.1" - }, - "flex": { - "hashes": [ - "sha256:17a58b3c0ca6524dbc79e1b266dcb8fc39d18060fbe8072ae297f14249ee0909", - "sha256:7002314367b7d497f4ef71fca8324ef5a640d3a90f7d1e89b3d3154b0af7b8d9" - ], - "markers": "extra == 'validation'", - "version": "==6.13.2" - }, - "gunicorn": { - "hashes": [ - "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", - "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" - ], - "index": "pypi", - "version": "==19.9.0" - }, - "html5lib": { - "hashes": [ - "sha256:20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3", - "sha256:66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736" - ], - "version": "==1.0.1" - }, - "humanize": { - "hashes": [ - "sha256:a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19" - ], - "index": "pypi", - "version": "==0.5.1" - }, - "idna": { - "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" - ], - "version": "==2.8" - }, - "inflection": { - "hashes": [ - "sha256:18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca" - ], - "version": "==0.3.1" - }, - "isodate": { - "hashes": [ - "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", - "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" - ], - "version": "==0.6.0" - }, - "itypes": { - "hashes": [ - "sha256:c6e77bb9fd68a4bfeb9d958fea421802282451a25bac4913ec94db82a899c073" - ], - "version": "==1.1.0" - }, - "jdcal": { - "hashes": [ - "sha256:948fb8d079e63b4be7a69dd5f0cd618a0a57e80753de8248fd786a8a20658a07", - "sha256:ea0a5067c5f0f50ad4c7bdc80abad3d976604f6fb026b0b3a17a9d84bb9046c9" - ], - "version": "==1.4" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" - ], - "version": "==2.10" - }, - "jsonfield": { - "hashes": [ - "sha256:a0a7fdee736ff049059409752b045281a225610fecbda9b9bd588ba976493c12", - "sha256:beb1cd4850d6d6351c32daefcb826c01757744e9c863228a642f87a1a4acb834" - ], - "version": "==2.0.2" - }, - "jsonpointer": { - "hashes": [ - "sha256:381b613fd1afd65376fb28948c4744f035e47ab049a9fdde0c48cc1c30b68559", - "sha256:c681af823545c731b7b38aedd5d4eee4c5eff87bc0f25e0ff25444a4189eac4d" - ], - "version": "==1.14" - }, - "jsonschema": { - "hashes": [ - "sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08", - "sha256:6ff5f3180870836cae40f06fa10419f557208175f13ad7bc26caa77beb1f6e02" - ], - "version": "==2.6.0" - }, - "kombu": { - "hashes": [ - "sha256:1ef049243aa05f29e988ab33444ec7f514375540eaa8e0b2e1f5255e81c5e56d", - "sha256:3c9dca2338c5d893f30c151f5d29bfb81196748ab426d33c362ab51f1e8dbf78" - ], - "version": "==4.2.2.post1" - }, - "markupsafe": { - "hashes": [ - "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", - "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", - "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", - "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", - "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", - "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", - "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", - "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", - "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", - "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", - "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", - "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", - "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", - "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", - "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", - "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", - "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", - "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", - "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", - "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", - "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", - "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", - "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", - "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", - "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", - "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", - "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", - "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" - ], - "version": "==1.1.0" - }, - "msrest": { - "hashes": [ - "sha256:5dadd54bec98d52cd9f43fb095015c346135b8cafaa35f24c7309cc25d3ad266", - "sha256:c74585e39041875c44d9235721ca946f7824ec28831c851b964106a60dc19cda" - ], - "version": "==0.6.4" - }, - "msrestazure": { - "hashes": [ - "sha256:86695c9728e91ee6f4cbb3b6e82ebd92233b72b6e145f7dcafa6b2da17412b88", - "sha256:99b185dcfc94f4ac2f7792691b865958c5a9871281cd618c50963c6b8d23401b" - ], - "version": "==0.6.0" - }, - "oauthlib": { - "hashes": [ - "sha256:0a8b2e0daa7afb62bd1b0b387b7a3723fa9a35d1183694ca5a5c8e3d6df59913", - "sha256:8932fb34f7c6a4fc50c9f423b105923ed2e6df091b3c388d182540db02c581a0" - ], - "version": "==3.0.0" - }, - "onedrivesdk": { - "hashes": [ - "sha256:922037d226dd374ab5a28379c45322cbc15f4d77f5117e9904599fdba05f6054" - ], - "index": "pypi", - "version": "==1.1.8" - }, - "openpyxl": { - "hashes": [ - "sha256:7bcf019a0be528673a8aec1e60b5c863342c3231962dbf7922fd4da42a49a91a" - ], - "version": "==2.5.12" - }, - "pillow": { - "hashes": [ - "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e", - "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7", - "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a", - "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3", - "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1", - "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1", - "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7", - "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1", - "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3", - "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055", - "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf", - "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f", - "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f", - "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239", - "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe", - "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c", - "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697", - "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494", - "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356", - "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6", - "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000", - "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f", - "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c", - "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca", - "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8", - "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3", - "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad", - "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9", - "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc", - "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e" - ], - "version": "==5.4.1" - }, - "psutil": { - "hashes": [ - "sha256:1c19957883e0b93d081d41687089ad630e370e26dc49fd9df6951d6c891c4736", - "sha256:1c71b9716790e202a00ab0931a6d1e25db1aa1198bcacaea2f5329f75d257fff", - "sha256:3b7a4daf4223dae171a67a89314ac5ca0738e94064a78d99cfd751c55d05f315", - "sha256:3e19be3441134445347af3767fa7770137d472a484070840eee6653b94ac5576", - "sha256:6e265c8f3da00b015d24b842bfeb111f856b13d24f2c57036582568dc650d6c3", - "sha256:809c9cef0402e3e48b5a1dddc390a8a6ff58b15362ea5714494073fa46c3d293", - "sha256:b4d1b735bf5b120813f4c89db8ac22d89162c558cbd7fdd298866125fe906219", - "sha256:bbffac64cfd01c6bcf90eb1bedc6c80501c4dae8aef4ad6d6dd49f8f05f6fc5a", - "sha256:bfcea4f189177b2d2ce4a34b03c4ac32c5b4c22e21f5b093d9d315e6e253cd81" - ], - "version": "==5.4.8" - }, - "psycopg2": { - "hashes": [ - "sha256:10e391687b171878181e71736d0effe3772314a339d9ae30995ec8171a0c834e", - "sha256:1283f9d45e458c2dcb15ba89367923563f90ef636fe78ee22df75183484a0237", - "sha256:1a9c32e4d140bea225f9821d993b2e53c913e717ea97b851246aa9b300095d8f", - "sha256:1be6f2438d2b71fec7b07c3c0949dd321b04349c382907ea76b36120edec8300", - "sha256:20ca6f29e118b8dd7133e8708b3fba2881e70a4e0841f874ed23985b7201a076", - "sha256:227c115b3c1f65d61385e51ac690b91b584640aefb45bffacd4bd33d02ed7221", - "sha256:27959abe64ca1fc6d8cd11a71a1f421d8287831a3262bd4cacd43bbf43cc3c82", - "sha256:2b2daf1fe30a58300542aea679fd87d1e1c2afd36e7644837b7954fa2dbacb92", - "sha256:36e51a51f295fdf67bcf05e7b1877011a6b39e6622b0013fe31c5025241873a3", - "sha256:3992b9b914f2eb77dc07e8045d2ca979e491612808bc5c7cd68f307469acf9f6", - "sha256:39a11de2335ad45ececed43ab851d36a4c52843d756471b940804f301792781e", - "sha256:3c2afe9ef0d1649005e3ccf93c1aaccd6f8ee379530e763d3b3b77f406b7c0ae", - "sha256:3fb18e0e52807fe3a300dc1b5421aa492d5e759550918f597d61863419482535", - "sha256:55eab94de96ee9702f23283e9c8b03cfdb0001e2b14d5d2e1bd5ff8114b96b9f", - "sha256:7e95c0ab7e7e6e452586f35d4d8966b1e924c8dd2c23977e3ea4968770ff1d26", - "sha256:7f47514dbddf604f196fcfe5da955537f04691bef8124aff5632316a78d992b7", - "sha256:8345370356bb4bddf93acbcfd0357163dd6b09471937adcfb38a2fbb49bdce53", - "sha256:8bc6ecb220c0b88d3742042013129c817c44459795c97e9ce1bca70a3f37a53b", - "sha256:8df623f248be15d1725faf5f333791678775047f12f17a90d29b5d22573f5cdc", - "sha256:9645f1305e4268cc0fc88c823cd6c91de27c003e183c233a6a230e5e963039ee", - "sha256:a68719ed5be8373dd72c9e45d55f7a202285e05a2e392eaa8872a67ea47d7d20", - "sha256:aca0edf062ec09e954fdf0cc93d3a872362701210983a1442549e703aedec25d", - "sha256:b0dd2114d93d8f424bb8ae76e0dc540f104b70ca9163172c05e7700b1459d4c9", - "sha256:b2c09359d6802279efb9efb3f91a9c94567151baee95175f9b637ea628f35244", - "sha256:ca7bc37b1efb7cc25271bf10f398462ed975d95259af1406d38fcb268466e34f", - "sha256:e64235d9013ebf6319cb9654e08f5066112c34d8c4cc41186254ab9c3d6d5b9b", - "sha256:ec9be679c0065667503851141c31fa699e1cc69ded3ba8e5d3673dd5a6eb1370", - "sha256:eca00d0f91fcb44d88b12f1fd16ad138e38fa07debb79587e2b7ff1fe80d72b9", - "sha256:f256e807b8b2b45b6af60d7f2bb5194aab2f4acc861241c4d8ef942a55f5030d", - "sha256:fce7612a3bd6a7ba95799f88285653bf130bd7ca066b52674d5f850108b2aec0" - ], - "index": "pypi", - "version": "==2.7.6.1" - }, - "pycparser": { - "hashes": [ - "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" - ], - "version": "==2.19" - }, - "pyjwt": { - "hashes": [ - "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e", - "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96" - ], - "version": "==1.7.1" - }, - "pyparsing": { - "hashes": [ - "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", - "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" - ], - "index": "pypi", - "version": "==2.3.1" - }, - "pypdf2": { - "hashes": [ - "sha256:e28f902f2f0a1603ea95ebe21dff311ef09be3d0f0ef29a3e44a932729564385" - ], - "version": "==1.26.0" - }, - "python-crontab": { - "hashes": [ - "sha256:91ce4b245ee5e5c117aa0b21b485bc43f2d80df854a36e922b707643f50d7923" - ], - "version": "==2.3.6" - }, - "python-dateutil": { - "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" - ], - "version": "==2.7.5" - }, - "python-social-auth": { - "hashes": [ - "sha256:6986220df76934aee15c54938a13ebe370a1976e043af01fa3bea417f6722e74", - "sha256:8aac8531f7dd4d1b9af606654532fef4f615cb437774a7a1f8dcdebe89c17664", - "sha256:9aaad6f7bf83fd129620eadaab1e78e63200da61a5d8898fd1aa243686b36575" - ], - "index": "pypi", - "version": "==0.3.6" - }, - "python3-openid": { - "hashes": [ - "sha256:0086da6b6ef3161cfe50fb1ee5cceaf2cda1700019fda03c2c5c440ca6abe4fa", - "sha256:628d365d687e12da12d02c6691170f4451db28d6d68d050007e4a40065868502" - ], - "markers": "python_version >= '3.0'", - "version": "==3.1.0" - }, - "pytz": { - "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" - ], - "version": "==2018.9" - }, - "pyyaml": { - "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" - ], - "version": "==3.13" - }, - "raven": { - "hashes": [ - "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", - "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" - ], - "index": "pypi", - "version": "==6.10.0" - }, - "redis": { - "hashes": [ - "sha256:8a1900a9f2a0a44ecf6e8b5eb3e967a9909dfed219ad66df094f27f7d6f330fb", - "sha256:a22ca993cea2962dbb588f9f30d0015ac4afcc45bee27d3978c0dbe9e97c6c0f" - ], - "index": "pypi", - "version": "==2.10.6" - }, - "reportlab": { - "hashes": [ - "sha256:069f684cd0aaa518a27dc9124aed29cee8998e21ddf19604e53214ec8462bdd7", - "sha256:09b68ec01d86b4b120456b3f3202570ec96f57624e3a4fc36f3829323391daa4", - "sha256:0c32be9a406172c29ea20ff55a709ccac1e7fb09f15aba67cb7b455fd1d3dbe0", - "sha256:233196cf25e97cfe7c452524ea29d9a4909f1cb66599299233be1efaaaa7a7a3", - "sha256:2b5e4533f3e5b962835a5ce44467e66d1ecc822761d1b508077b5087a06be338", - "sha256:2e860bcdace5a558356802a92ae8658d7e5fdaa00ded82e83a3f2987c562cb66", - "sha256:3546029e63a9a9dc24ee38959eb417678c2425b96cd27b31e09e216dafc94666", - "sha256:4452b93f9c73b6b70311e7d69082d64da81b38e91bfb4766397630092e6da6fd", - "sha256:528c74a1c6527d1859c2c7a64a94a1cba485b00175162ea23699ae58a1e94939", - "sha256:6116e750f98018febc08dfee6df20446cf954adbcfa378d2c703d56c8864aff3", - "sha256:6b2b3580c647d75ef129172cb3da648cdb24566987b0b59c5ebb80ab770748d6", - "sha256:727b5f2bed08552d143fc99649b1863c773729f580a416844f9d9967bb0a1ae8", - "sha256:74c24a3ec0a3d4f8acb13a07192f45bdb54a1cc3c2286241677e7e8bcd5011fa", - "sha256:98ccd2f8b4f8636db05f3f14db0b471ad6bb4b66ae0dc9052c4822b3bd5d6a7d", - "sha256:a5905aa567946bc938b489a7249c7890c3fd3c9b7b5680dece5bc551c2ddbe0d", - "sha256:acbb7f676b8586b770719e9683eda951fdb38eb7970d46fcbf3cdda88d912a64", - "sha256:b5e30f865add48cf880f1c363eb505b97f2f7baaa88c155f87a335a76515a3e5", - "sha256:be2a7c33a2c28bbd3f453ffe4f0e5200b88c803a097f4cf52d69c6b53fad7a8f", - "sha256:c356bb600f59ac64955813d6497a08bfd5d0c451cb5829b61e3913d0ac084e26", - "sha256:c7ec4ae2393beab584921b1287a04e94fd98c28315e348362d89b85f4b464546", - "sha256:d476edc831bb3e9ebd04d1403abaf3ea57b3e4c2276c91a54fdfb6efbd3f9d97", - "sha256:db059e1a0691c872784062421ec51848539eb4f5210142682e61059a5ca7cc55", - "sha256:dd423a6753509ab14a0ac1b5be39d219c8f8d3781cce3deb4f45eda31969b5e8", - "sha256:ed9b7c0d71ce6fe2b31c6cde530ad8238632b876a5d599218739bda142a77f7c", - "sha256:f0a2465af4006f97b05e1f1546d67d3a3213d414894bf28be7f87f550a7f4a55", - "sha256:f20bfe26e57e8e1f575a9e0325be04dd3562db9f247ffdd73b5d4df6dec53bc2", - "sha256:f3463f2cb40a1b515ac0133ba859eca58f53b56760da9abb27ed684c565f853c", - "sha256:facc3c9748ab1525fb8401a1223bce4f24f0d6aa1a9db86c55db75777ccf40f9" - ], - "version": "==3.5.13" - }, - "requests": { - "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" - ], - "version": "==2.21.0" - }, - "requests-oauthlib": { - "hashes": [ - "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57", - "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140" - ], - "version": "==1.2.0" - }, - "rfc3987": { - "hashes": [ - "sha256:10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53", - "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733" - ], - "version": "==1.3.8" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:3858f420b03030f99da44414ff8275a95eb7a6b5613764dd520398fb63951822", - "sha256:47982ea36529d971c453105ead01788161326bb5349d2aea900da6c0e5f628b5", - "sha256:527b7978560bc79b5f71b08d8db1ab16d367a08bdf1c2790b1ffb2fac94e46ae", - "sha256:65c96f9e0a8117be90cd8e23fc4e1d2c94fa410f4364bf70a97aa3cc4e4f4769", - "sha256:7a1ab9228c48f4741b5d07961e99e898e88afc040343b31b75e1dc1b3f8cee7c", - "sha256:87c60bd6b282f41a0403df5d59ec1fb1876311e84f5609ada47f17f64406e4d0", - "sha256:91f93c1938867551e554ea295ef91f84720a68b711d37b9f7d442fd3903082da", - "sha256:9523308cd0b071f0f8b631ec4f310eb58b3e2b4adbd14a2661783e2c5e8e1fdc", - "sha256:97cfa9bca4980aa9a77788fe9fbed178bcf5556dd2e917f52fda70ce7bb38a95", - "sha256:a21e26cf0143d22d9743d23b5531f66385aaf3fb54641782b20c6139239a8a93", - "sha256:a5167a1b098c86d1b1c9f0d73b7c65e70876d54a11fb1ada4586ba557d2fe165", - "sha256:a889dc3d6cffb64ca89fac053455b7a778f922b65843263023e998c0fcce001e", - "sha256:a925760fa1eb8dece3e07ee32485da8d5253cfcd78df25938371a5f5acdaa8a4", - "sha256:a92fd8e32d824392c0cec96a77e374bb77ceda4b99b1d18c776631e18fc54ffe", - "sha256:b20e3130b4b5b210365d6760b7d3c87cc9c40e456fa14049f9257bc62cf0d2c9", - "sha256:cb21f6bad6eade16868efc86fe1bb3e7a3d61137af2bf064dd1e7ed0d629ca9c", - "sha256:ccb1a0860a602d83898dd71280db142a3502702be3976ffc35eef9eb19585169", - "sha256:d70eec8bd287798e7905d57d503b1091c8424ba736e287b75f39f1b5a0235d71", - "sha256:d8a39781c49a892dd0f936d472d850a9aa163205475ad6c90a0f4d0c4d90ee30", - "sha256:d98b3d421eebf7e10311ab12f41c5b0353e7cae1cc78f51312e24f569d593de0", - "sha256:e67ea0cf80682e539707fcd8811b7369d8b97b1b48b1d7b16e21cd7f6c2c2e40", - "sha256:feec97614776442b4dd5029eb16e15f5e582ffc5cf534cba5eefd07062e11eec" - ], - "version": "==0.15.86" - }, - "six": { - "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" - ], - "version": "==1.12.0" - }, - "social-auth-app-django": { - "hashes": [ - "sha256:6d0dd18c2d9e71ca545097d57b44d26f59e624a12833078e8e52f91baf849778", - "sha256:9237e3d7b6f6f59494c3b02e0cce6efc69c9d33ad9d1a064e3b2318bcbe89ae3", - "sha256:f151396e5b16e2eee12cd2e211004257826ece24fc4ae97a147df386c1cd7082" - ], - "index": "pypi", - "version": "==3.1.0" - }, - "social-auth-core": { - "hashes": [ - "sha256:3584a6b96b5c505bb2d2a5c35a9f8656addd895bfa64c58f9c40d4e3d824ea26", - "sha256:54eb683eeee677a45e4e544995b0c62a88d705ae5d9509256187f8d6a943a32a", - "sha256:d47c4f48484847faf043e975ec07300be84d64bfcf8268029e2383759222b609" - ], - "version": "==3.0.0" - }, - "sqlparse": { - "hashes": [ - "sha256:ce028444cfab83be538752a2ffdb56bc417b7784ff35bb9a3062413717807dec", - "sha256:d9cf190f51cbb26da0412247dfe4fb5f4098edb73db84e02f9fc21fdca31fed4" - ], - "index": "pypi", - "version": "==0.2.4" - }, - "strict-rfc3339": { - "hashes": [ - "sha256:5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277" - ], - "version": "==0.7" - }, - "swagger-spec-validator": { - "hashes": [ - "sha256:57e29feb3aa921a9fb98bd70af148746b27c77d3207266f5571cebcce211e685", - "sha256:62ef22eca3f429d93fddda5d793d2a1a9057d3732e7a14606e641805326ae4a6" - ], - "markers": "extra == 'validation'", - "version": "==2.4.3" - }, - "unicodecsv": { - "hashes": [ - "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" - ], - "version": "==0.14.1" - }, - "uritemplate": { - "hashes": [ - "sha256:01c69f4fe8ed503b2951bef85d996a9d22434d2431584b5b107b2981ff416fbd", - "sha256:1b9c467a940ce9fb9f50df819e8ddd14696f89b9a8cc87ac77952ba416e0a8fd", - "sha256:c02643cebe23fc8adb5e6becffe201185bf06c40bda5c0b4028a93f1527d011d" - ], - "version": "==3.0.0" - }, - "urllib3": { - "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" - ], - "version": "==1.24.1" - }, - "validate-email": { - "hashes": [ - "sha256:784719dc5f780be319cdd185dc85dd93afebdb6ebb943811bc4c7c5f9c72aeaf" - ], - "version": "==1.3" - }, - "vine": { - "hashes": [ - "sha256:3cd505dcf980223cfaf13423d371f2e7ff99247e38d5985a01ec8264e4f2aca1", - "sha256:ee4813e915d0e1a54e5c1963fde0855337f82655678540a6bc5996bca4165f76" - ], - "version": "==1.2.0" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, - "whitenoise": { - "hashes": [ - "sha256:118ab3e5f815d380171b100b05b76de2a07612f422368a201a9ffdeefb2251c1", - "sha256:42133ddd5229eeb6a0c9899496bdbe56c292394bf8666da77deeb27454c0456a" - ], - "index": "pypi", - "version": "==4.1.2" - }, - "xhtml2pdf": { - "hashes": [ - "sha256:86a37e78d7a8d8bb2761746c3d559e12284d92c4d531b3a8a0f8fd632b436f82" - ], - "index": "pypi", - "version": "==0.2.3" - }, - "xlrd": { - "hashes": [ - "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", - "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" - ], - "version": "==1.2.0" - }, - "xlwt": { - "hashes": [ - "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", - "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88" - ], - "version": "==1.3.0" - } - }, - "develop": { - "appnope": { - "hashes": [ - "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", - "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71" - ], - "markers": "sys_platform == 'darwin'", - "version": "==0.1.0" - }, - "aspy.yaml": { - "hashes": [ - "sha256:04d26279513618f1024e1aba46471db870b3b33aef204c2d09bcf93bea9ba13f", - "sha256:0a77e23fafe7b242068ffc0252cee130d3e509040908fc678d9d1060e7494baa" - ], - "version": "==1.1.1" - }, - "atomicwrites": { - "hashes": [ - "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", - "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" - ], - "version": "==1.2.1" - }, - "attrs": { - "hashes": [ - "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", - "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" - ], - "version": "==18.2.0" - }, - "backcall": { - "hashes": [ - "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", - "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2" - ], - "version": "==0.1.0" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858", - "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348", - "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718" - ], - "version": "==4.7.1" - }, - "bumpversion": { - "hashes": [ - "sha256:6744c873dd7aafc24453d8b6a1a0d6d109faf63cd0cd19cb78fd46e74932c77e", - "sha256:6753d9ff3552013e2130f7bc03c1007e24473b4835952679653fb132367bdd57" - ], - "index": "pypi", - "version": "==0.5.3" - }, - "certifi": { - "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" - ], - "version": "==2018.11.29" - }, - "cfgv": { - "hashes": [ - "sha256:39d9055c47e3932908fe25abd5807e21dc002630db01c7a5f05738d027e2b706", - "sha256:41d22dd864c474f919ecb88900000d2410d640315f75bdb79b3abf9347089641" - ], - "version": "==1.4.0" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "check-manifest": { - "hashes": [ - "sha256:44e3cf4b0833a55460046bf7a3600eaadbcae5e9d13baf0c9d9789dd5c2c6452", - "sha256:728edbaccadaa86db0b8f876afac1fb90bce9452234753dfe4ef8fe786dcc2f1" - ], - "index": "pypi", - "version": "==0.37" - }, - "coverage": { - "hashes": [ - "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", - "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", - "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", - "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", - "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", - "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", - "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", - "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", - "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", - "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", - "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", - "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", - "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", - "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", - "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", - "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", - "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", - "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", - "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", - "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", - "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", - "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", - "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", - "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", - "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", - "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", - "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", - "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", - "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", - "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", - "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" - ], - "version": "==4.5.2" - }, - "decorator": { - "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" - ], - "version": "==4.3.0" - }, - "django-extensions": { - "hashes": [ - "sha256:8317a3fe479b1ba3e3a04ecf33fb8d6ccf09bb18f30eab64e34c40a593741d26", - "sha256:a76a61566f1c8d96acc7bcf765080b8e91367a25a2c6f8c5bddd574493839180" - ], - "index": "pypi", - "version": "==2.1.4" - }, - "django-webtest": { - "hashes": [ - "sha256:7b683d87cd9be13599af44b81bd44f97b49978b4e69cf4b92059c393f64307c1", - "sha256:f3cd35d06ec01610e1a5ec8917679ad9a53f815d85d1e41e385746f1e823869d" - ], - "index": "pypi", - "version": "==1.9.4" - }, - "djangorestframework": { - "hashes": [ - "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", - "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" - ], - "version": "==3.9.1" - }, - "docker": { - "hashes": [ - "sha256:2840ffb9dc3ef6d00876bde476690278ab13fa1f8ba9127ef855ac33d00c3152", - "sha256:5831256da3477723362bc71a8df07b8cd8493e4a4a60cebd45580483edbe48ae" - ], - "index": "pypi", - "version": "==3.7.0" - }, - "docker-pycreds": { - "hashes": [ - "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", - "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49" - ], - "version": "==0.4.0" - }, - "drf-api-checker": { - "hashes": [ - "sha256:db4045afe4585120ab298464c37887d8567a0ecadbe8eaa6a0e348c364d745bb" - ], - "index": "pypi", - "version": "==0.4.1" - }, - "factory-boy": { - "hashes": [ - "sha256:6f25cc4761ac109efd503f096e2ad99421b1159f01a29dbb917359dcd68e08ca", - "sha256:d552cb872b310ae78bd7429bf318e42e1e903b1a109e899a523293dfa762ea4f" - ], - "index": "pypi", - "version": "==2.11.1" - }, - "faker": { - "hashes": [ - "sha256:228419b0a788a7ac867ebfafdd438461559ab1a0975edb607300852d9acaa78d", - "sha256:52a3dcc6a565b15fe1c95090321756d5a8a7c1caf5ab3df2f573ed70936ff518" - ], - "version": "==1.0.1" - }, - "fancycompleter": { - "hashes": [ - "sha256:d2522f1f3512371f295379c4c0d1962de06762eb586c199620a2a5d423539b12" - ], - "version": "==0.8" - }, - "flake8": { - "hashes": [ - "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", - "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" - ], - "index": "pypi", - "version": "==3.6.0" - }, - "freezegun": { - "hashes": [ - "sha256:6cb82b276f83f2acce67f121dc2656f4df26c71e32238334eb071170b892a278", - "sha256:e839b43bfbe8158b4d62bb97e6313d39f3586daf48e1314fb1083d2ef17700da" - ], - "index": "pypi", - "version": "==0.3.11" - }, - "identify": { - "hashes": [ - "sha256:08826e68e39e7de53cc2ddd8f6228a4e463b4bacb20565e5301c3ec690e68d27", - "sha256:2364e24a7699fea0dc910e90740adbab43eef3746eeea4e016029c34123ce66d" - ], - "version": "==1.1.8" - }, - "idna": { - "hashes": [ - "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", - "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" - ], - "version": "==2.8" - }, - "importlib-metadata": { - "hashes": [ - "sha256:a17ce1a8c7bff1e8674cb12c992375d8d0800c9190177ecf0ad93e0097224095", - "sha256:b50191ead8c70adfa12495fba19ce6d75f2e0275c14c5a7beb653d6799b512bd" - ], - "version": "==0.8" - }, - "importlib-resources": { - "hashes": [ - "sha256:6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", - "sha256:d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078" - ], - "markers": "python_version < '3.7'", - "version": "==1.0.2" - }, - "ipython": { - "hashes": [ - "sha256:6a9496209b76463f1dec126ab928919aaf1f55b38beb9219af3fe202f6bbdd12", - "sha256:f69932b1e806b38a7818d9a1e918e5821b685715040b48e59c657b3c7961b742" - ], - "index": "pypi", - "version": "==7.2.0" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" - ], - "version": "==0.2.0" - }, - "isort": { - "hashes": [ - "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", - "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", - "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" - ], - "index": "pypi", - "version": "==4.3.4" - }, - "jedi": { - "hashes": [ - "sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd", - "sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191" - ], - "version": "==0.13.2" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "more-itertools": { - "hashes": [ - "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", - "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", - "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" - ], - "version": "==5.0.0" - }, - "multidict": { - "hashes": [ - "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f", - "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3", - "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef", - "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b", - "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73", - "sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc", - "sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3", - "sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd", - "sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351", - "sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941", - "sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d", - "sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1", - "sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b", - "sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a", - "sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3", - "sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7", - "sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0", - "sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0", - "sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014", - "sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5", - "sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036", - "sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d", - "sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a", - "sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce", - "sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1", - "sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a", - "sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9", - "sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7", - "sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b" - ], - "version": "==4.5.2" - }, - "nodeenv": { - "hashes": [ - "sha256:ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a" - ], - "version": "==1.3.3" - }, - "parso": { - "hashes": [ - "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" - ], - "version": "==0.3.1" - }, - "pdbpp": { - "hashes": [ - "sha256:535085916fcfb768690ba0aeab2967c2a2163a0a60e5b703776846873e171399" - ], - "index": "pypi", - "version": "==0.9.3" - }, - "pexpect": { - "hashes": [ - "sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba", - "sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b" - ], - "markers": "sys_platform != 'win32'", - "version": "==4.6.0" - }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" - }, - "pluggy": { - "hashes": [ - "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", - "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" - ], - "version": "==0.8.1" - }, - "pre-commit": { - "hashes": [ - "sha256:2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", - "sha256:74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b" - ], - "index": "pypi", - "version": "==1.14.2" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", - "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", - "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" - ], - "version": "==2.0.7" - }, - "ptyprocess": { - "hashes": [ - "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0", - "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f" - ], - "version": "==0.6.0" - }, - "py": { - "hashes": [ - "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", - "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" - ], - "version": "==1.7.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", - "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" - ], - "version": "==2.4.0" - }, - "pyflakes": { - "hashes": [ - "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", - "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" - ], - "version": "==2.0.0" - }, - "pygments": { - "hashes": [ - "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", - "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" - ], - "version": "==2.3.1" - }, - "pytest": { - "hashes": [ - "sha256:41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", - "sha256:c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be" - ], - "index": "pypi", - "version": "==4.1.1" - }, - "pytest-cov": { - "hashes": [ - "sha256:0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", - "sha256:230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f" - ], - "version": "==2.6.1" - }, - "pytest-cover": { - "hashes": [ - "sha256:578249955eb3b5f3991209df6e532bb770b647743b7392d3d97698dc02f39ebb", - "sha256:5bdb6c1cc3dd75583bb7bc2c57f5e1034a1bfcb79d27c71aceb0b16af981dbf4" - ], - "version": "==3.0.0" - }, - "pytest-coverage": { - "hashes": [ - "sha256:db6af2cbd7e458c7c9fd2b4207cee75258243c8a81cad31a7ee8cfad5be93c05", - "sha256:dedd084c5e74d8e669355325916dc011539b190355021b037242514dee546368" - ], - "index": "pypi", - "version": "==0.0" - }, - "pytest-django": { - "hashes": [ - "sha256:1a5d33be930e3172fa238643a380414dc369fe8fa4b3c3de25e59ed142950736", - "sha256:e88e471d3d0f9acfb6293bb03d0ee8a33ed978734e92ea6b5312163a6c9e87cc" - ], - "index": "pypi", - "version": "==3.4.5" - }, - "pytest-echo": { - "hashes": [ - "sha256:919f2c3d79a8537339266b182feb8a0670510873dd1158ab4bdae8217d31de18" - ], - "index": "pypi", - "version": "==1.6.0" - }, - "pytest-ignore-flaky": { - "hashes": [ - "sha256:29b3099cf4d424fd553d39940f7025acf6847ecbba292649a0dc764dfbb7d59e", - "sha256:fe33a1f725a78e1f92077bfb80926602622bc050a0a71b61c3f1ca7089afb779" - ], - "index": "pypi", - "version": "==1.0.0" - }, - "pytest-pythonpath": { - "hashes": [ - "sha256:63fc546ace7d2c845c1ee289e8f7a6362c2b6bae497d10c716e58e253e801d62" - ], - "index": "pypi", - "version": "==0.7.3" - }, - "python-dateutil": { - "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" - ], - "version": "==2.7.5" - }, - "pytz": { - "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" - ], - "version": "==2018.9" - }, - "pyyaml": { - "hashes": [ - "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", - "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", - "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", - "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", - "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", - "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", - "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", - "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", - "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", - "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", - "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" - ], - "version": "==3.13" - }, - "requests": { - "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" - ], - "version": "==2.21.0" - }, - "six": { - "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" - ], - "version": "==1.12.0" - }, - "soupsieve": { - "hashes": [ - "sha256:009d8865916766f7f452880d08ff94ed4c5445011a3deaac67543b82bdb0b9ee", - "sha256:97599c45a1ddfe9ab0a0cba889b7f214b3e310b703f176a0610c0b54e207cc04" - ], - "version": "==1.7.1" - }, - "text-unidecode": { - "hashes": [ - "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", - "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" - ], - "version": "==1.2" - }, - "toml": { - "hashes": [ - "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", - "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" - ], - "version": "==0.10.0" - }, - "traitlets": { - "hashes": [ - "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", - "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9" - ], - "version": "==4.3.2" - }, - "urllib3": { - "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" - ], - "version": "==1.24.1" - }, - "vcrpy": { - "hashes": [ - "sha256:127e79cf7b569d071d1bd761b83f7b62b2ce2a2eb63ceca7aa67cba8f2602ea3", - "sha256:57be64aa8e9883a4117d0b15de28af62275c001abcdb00b6dc2d4406073d9a4f" - ], - "index": "pypi", - "version": "==2.0.1" - }, - "virtualenv": { - "hashes": [ - "sha256:34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", - "sha256:fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd" - ], - "version": "==16.2.0" - }, - "waitress": { - "hashes": [ - "sha256:8b8c8686f628a635b9747e3014a0ab19cf9cf95c5c36eb3331ae355a462ee602", - "sha256:e624c829656ffc99b33d661072b2814885ae92835cf835ee8ab283ddb7c915b9" - ], - "version": "==1.2.0" - }, - "wcwidth": { - "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" - ], - "version": "==0.1.7" - }, - "webob": { - "hashes": [ - "sha256:05aaab7975e0ee8af2026325d656e5ce14a71f1883c52276181821d6d5bf7086", - "sha256:36db8203c67023d68c1b00208a7bf55e3b10de2aa317555740add29c619de12b" - ], - "version": "==1.8.5" - }, - "websocket-client": { - "hashes": [ - "sha256:8c8bf2d4f800c3ed952df206b18c28f7070d9e3dcbd6ca6291127574f57ee786", - "sha256:e51562c91ddb8148e791f0155fdb01325d99bb52c4cdbb291aee7a3563fd0849" - ], - "version": "==0.54.0" - }, - "webtest": { - "hashes": [ - "sha256:4221020d502ff414c5fba83c1213985b83219cb1cc611fe58aa4feaf96b5e062", - "sha256:9f1e6faad0b732911793e4d6f54aede292b0c3ee0b3ef7afb2011ec4f4044cc8" - ], - "version": "==2.0.32" - }, - "wmctrl": { - "hashes": [ - "sha256:d806f65ac1554366b6e31d29d7be2e8893996c0acbb2824bbf2b1f49cf628a13" - ], - "version": "==0.3" - }, - "wrapt": { - "hashes": [ - "sha256:e03f19f64d81d0a3099518ca26b04550026f131eced2e76ced7b85c6b8d32128" - ], - "version": "==1.11.0" - }, - "yapf": { - "hashes": [ - "sha256:8aa7f9abdb97b4da4d3227306b88477982daafef0a96cc41639754ca31f46d55", - "sha256:f2df5891481f94ddadfbf8ae8ae499080752cfb06005a31bbb102f3012f8b944" - ], - "index": "pypi", - "version": "==0.25.0" - }, - "yarl": { - "hashes": [ - "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9", - "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f", - "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb", - "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320", - "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842", - "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0", - "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829", - "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310", - "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4", - "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8", - "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1" - ], - "markers": "python_version >= '3.4'", - "version": "==1.3.0" - }, - "zipp": { - "hashes": [ - "sha256:55ca87266c38af6658b84db8cfb7343cdb0bf275f93c7afaea0d8e7a209c7478", - "sha256:682b3e1c62b7026afe24eadf6be579fb45fec54c07ea218bded8092af07a68c4" - ], - "version": "==0.3.3" - } - } -} From e85449922d5a569205ec3c5b430a40fc1d8d9229 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 21 Jan 2019 12:16:16 +0100 Subject: [PATCH 075/122] updates tests to cver new serializers --- .../api/endpoints/datamart/serializers.py | 1 + .../data/InterventionViewSet.fixture.json | 45 ++++++-- .../record/InterventionViewSet.fixture.json | 19 ++- ...t__api_latest_datamart_hact_.response.json | 109 ------------------ ...test_datamart_interventions_.response.json | 20 ++-- ...api_latest_datamart_hact_18_.response.json | 60 ---------- ...atamart_interventions_1110_.response.json} | 14 +-- tests/api/interfaces/test_data.py | 19 +-- 8 files changed, 79 insertions(+), 208 deletions(-) delete mode 100644 tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json delete mode 100644 tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_interventions_216_.response.json => get__api_latest_datamart_interventions_1110_.response.json} (91%) diff --git a/src/etools_datamart/api/endpoints/datamart/serializers.py b/src/etools_datamart/api/endpoints/datamart/serializers.py index e4add23cf..290f62285 100644 --- a/src/etools_datamart/api/endpoints/datamart/serializers.py +++ b/src/etools_datamart/api/endpoints/datamart/serializers.py @@ -20,6 +20,7 @@ class Meta(DataMartSerializer.Meta): class InterventionSerializerBudget(DataMartSerializer): class Meta(DataMartSerializer.Meta): model = models.Intervention + exclude = None fields = ('number', 'title', 'status', 'start_date', 'end_date', 'partner_contribution', 'unicef_cash', 'in_kind_amount', 'partner_contribution_local', 'unicef_cash_local', 'in_kind_amount_local', diff --git a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json index c73713d74..6d0b000bf 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json @@ -3,14 +3,14 @@ "master": [ { "model": "data.intervention", - "pk": 213, + "pk": 1107, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.048Z", + "last_modify_date": "2019-01-21T10:35:38.650Z", "seen": null, - "created": "2019-01-08T21:51:10.048Z", + "created": "2019-01-21T10:35:38.650Z", "updated": null, "document_type": null, "number": "#000", @@ -46,6 +46,15 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, + "partner_contribution": "10.00", + "unicef_cash": "10.00", + "in_kind_amount": "10.00", + "partner_contribution_local": "10.00", + "unicef_cash_local": "10.00", + "in_kind_amount_local": "10.00", + "total": "10.00", + "total_local": "10.00", + "currency": "USD", "intervention_id": null, "agreement_id": null, "country_programme_id": null, @@ -54,14 +63,14 @@ }, { "model": "data.intervention", - "pk": 214, + "pk": 1108, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.064Z", + "last_modify_date": "2019-01-21T10:35:38.659Z", "seen": null, - "created": "2019-01-08T21:51:10.064Z", + "created": "2019-01-21T10:35:38.659Z", "updated": null, "document_type": null, "number": "#001", @@ -97,6 +106,15 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, + "partner_contribution": "10.00", + "unicef_cash": "10.00", + "in_kind_amount": "10.00", + "partner_contribution_local": "10.00", + "unicef_cash_local": "10.00", + "in_kind_amount_local": "10.00", + "total": "10.00", + "total_local": "10.00", + "currency": "USD", "intervention_id": null, "agreement_id": null, "country_programme_id": null, @@ -105,14 +123,14 @@ }, { "model": "data.intervention", - "pk": 215, + "pk": 1109, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.068Z", + "last_modify_date": "2019-01-21T10:35:38.662Z", "seen": null, - "created": "2019-01-08T21:51:10.068Z", + "created": "2019-01-21T10:35:38.662Z", "updated": null, "document_type": null, "number": "#002", @@ -148,6 +166,15 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, + "partner_contribution": "10.00", + "unicef_cash": "10.00", + "in_kind_amount": "10.00", + "partner_contribution_local": "10.00", + "unicef_cash_local": "10.00", + "in_kind_amount_local": "10.00", + "total": "10.00", + "total_local": "10.00", + "currency": "USD", "intervention_id": null, "agreement_id": null, "country_programme_id": null, diff --git a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json index e9131f847..397f4544d 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json @@ -2,18 +2,18 @@ "record": { "master": { "model": "data.intervention", - "pk": 216, + "pk": 1110, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T22:06:07.546Z", + "last_modify_date": "2019-01-21T10:35:39.800Z", "seen": null, - "created": "2019-01-08T22:06:07.546Z", + "created": "2019-01-21T10:35:39.800Z", "updated": null, "document_type": null, - "number": "#000", - "title": "title000", + "number": "#003", + "title": "title003", "status": null, "start_date": null, "end_date": null, @@ -45,6 +45,15 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, + "partner_contribution": "10.00", + "unicef_cash": "10.00", + "in_kind_amount": "10.00", + "partner_contribution_local": "10.00", + "unicef_cash_local": "10.00", + "in_kind_amount_local": "10.00", + "total": "10.00", + "total_local": "10.00", + "currency": "USD", "intervention_id": null, "agreement_id": null, "country_programme_id": null, diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json deleted file mode 100644 index 5b5e086c8..000000000 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_hact_.response.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "status_code": 200, - "headers": { - "content-type": [ - "Content-Type", - "application/json" - ], - "vary": [ - "Vary", - "Accept, Origin" - ], - "allow": [ - "Allow", - "GET, HEAD, OPTIONS" - ], - "etag": [ - "ETag", - "\"5c4875ec4c135e010d587a1ba4b756ae\"" - ], - "x-frame-options": [ - "X-Frame-Options", - "DENY" - ], - "view": [ - "view", - "etools_datamart.api.endpoints.datamart.hact.HACTViewSet" - ], - "service": [ - "service", - "HACT" - ], - "cache-version": [ - "cache-version", - "1" - ], - "system-filters": [ - "system-filters", - "" - ], - "cache-key": [ - "cache-key", - "5c4875ec4c135e010d587a1ba4b756ae" - ], - "cache-hit": [ - "cache-hit", - "False" - ], - "cache-ttl": [ - "cache-ttl", - "1y" - ], - "content-length": [ - "Content-Length", - "903" - ] - }, - "data": { - "count": 3, - "next": null, - "current_page": 1, - "total_pages": 1, - "previous": null, - "results": [ - { - "id": 15, - "country_name": "bolivia", - "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:11", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - }, - { - "id": 16, - "country_name": "chad", - "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:11", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - }, - { - "id": 17, - "country_name": "lebanon", - "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:11", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - } - ] - }, - "content_type": null -} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json index 39df4fff0..cd5b6c556 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "3735" + "3738" ] }, "data": { @@ -62,13 +62,13 @@ "previous": null, "results": [ { - "id": 213, + "id": 1107, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "21 Jan 2019 10:35:38", "seen": null, - "created": "08 Jan 2019 21:51:10", + "created": "21 Jan 2019 10:35:38", "updated": null, "document_type": null, "number": "#000", @@ -109,13 +109,13 @@ "unicef_signatory_id": null }, { - "id": 214, + "id": 1108, "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "21 Jan 2019 10:35:38", "seen": null, - "created": "08 Jan 2019 21:51:10", + "created": "21 Jan 2019 10:35:38", "updated": null, "document_type": null, "number": "#001", @@ -156,13 +156,13 @@ "unicef_signatory_id": null }, { - "id": 215, + "id": 1109, "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "21 Jan 2019 10:35:38", "seen": null, - "created": "08 Jan 2019 21:51:10", + "created": "21 Jan 2019 10:35:38", "updated": null, "document_type": null, "number": "#002", diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json deleted file mode 100644 index 00d28a1f9..000000000 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_hact_18_.response.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "status_code": 200, - "headers": { - "content-type": [ - "Content-Type", - "application/json" - ], - "vary": [ - "Vary", - "Accept, Origin" - ], - "allow": [ - "Allow", - "GET, HEAD, OPTIONS" - ], - "etag": [ - "ETag", - "\"3b892be720654ecc82d51991054edeed\"" - ], - "x-frame-options": [ - "X-Frame-Options", - "DENY" - ], - "view": [ - "view", - "etools_datamart.api.endpoints.datamart.hact.HACTViewSet" - ], - "service": [ - "service", - "HACT" - ], - "cache-hit": [ - "cache-hit", - "False" - ], - "cache-ttl": [ - "cache-ttl", - "1y" - ], - "content-length": [ - "Content-Length", - "273" - ] - }, - "data": { - "id": 18, - "country_name": "bolivia", - "area_code": "", - "last_modify_date": "08 Jan 2019 22:06:08", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - }, - "content_type": null -} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json similarity index 91% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json index 1c3226361..f0e99da2b 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_216_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"8703aa6dc8ce1b0b33a37978212500a6\"" + "\"06193c1343d19db4c8b704f14beb55c4\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,21 +39,21 @@ ], "content-length": [ "Content-Length", - "1218" + "1219" ] }, "data": { - "id": 216, + "id": 1110, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 22:06:07", + "last_modify_date": "21 Jan 2019 10:35:39", "seen": null, - "created": "08 Jan 2019 22:06:07", + "created": "21 Jan 2019 10:35:39", "updated": null, "document_type": null, - "number": "#000", - "title": "title000", + "number": "#003", + "title": "title003", "status": null, "start_date": null, "end_date": null, diff --git a/tests/api/interfaces/test_data.py b/tests/api/interfaces/test_data.py index 5faa1f2b5..6ae3c9ea2 100644 --- a/tests/api/interfaces/test_data.py +++ b/tests/api/interfaces/test_data.py @@ -56,11 +56,14 @@ def pytest_generate_tests(metafunc, *args): ids = [] for prefix, viewset, basenametry in router.registry: if prefix.startswith('datamart/'): - params.append(viewset) - ids.append(f'{viewset.__name__}') - # metafunc.addcall(funcargs={'viewset': viewset}, - # id=viewset.__name__) - metafunc.parametrize("viewset", params, ids=ids) + sers = viewset.serializers_fieldsets.keys() + for ser in sers: + params.append([viewset, ser]) + ids.append(f'{viewset.__name__}-{ser}') + + # params.append(viewset) + # ids.append(f'{viewset.__name__}') + metafunc.parametrize("viewset,serializer", params, ids=ids) @frozenfixture2() @@ -75,9 +78,9 @@ def data(db, request): @contract(recorder_class=MyRecorder) -def test_list(viewset, data): +def test_list(viewset, serializer, data): url = f"{viewset.get_service().endpoint}" - return url + return [url, {'serializer': serializer}] @frozenfixture2() @@ -89,6 +92,6 @@ def record(db, request): @contract(recorder_class=MyRecorder) -def test_record(viewset, record): +def test_record(viewset, serializer, record): url = f"{viewset.get_service().endpoint}{record.pk}/" return url From 329233d7f7bc8a65c26440a342681e65f185145c Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 21 Jan 2019 18:23:13 +0100 Subject: [PATCH 076/122] funds reservation --- Makefile | 8 +- Pipfile | 1 - Pipfile.lock | 2255 +++++++++++++++++ src/etools_datamart/api/endpoints/common.py | 15 +- .../api/endpoints/datamart/__init__.py | 14 +- .../endpoints/datamart/funds_reservation.py | 38 + src/etools_datamart/api/urls.py | 4 +- src/etools_datamart/apps/data/loader.py | 3 +- .../apps/data/management/commands/load.py | 5 + .../apps/data/migrations/0001_initial.py | 64 +- .../apps/data/models/__init__.py | 1 + .../apps/data/models/funds_reservation.py | 89 + .../apps/data/models/intervention.py | 5 +- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...118_1451.py => 0002_auto_20190121_1720.py} | 4 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...118_1451.py => 0002_auto_20190121_1720.py} | 6 +- .../migrations/0001_initial.py | 2 +- ...118_1451.py => 0002_auto_20190121_1720.py} | 8 +- .../migrations/0001_initial.py | 2 +- .../test_utilities/factories/data.py | 11 +- 23 files changed, 2508 insertions(+), 35 deletions(-) create mode 100644 Pipfile.lock create mode 100644 src/etools_datamart/api/endpoints/datamart/funds_reservation.py create mode 100644 src/etools_datamart/apps/data/models/funds_reservation.py rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190118_1451.py => 0002_auto_20190121_1720.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190118_1451.py => 0002_auto_20190121_1720.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190118_1451.py => 0002_auto_20190121_1720.py} (98%) diff --git a/Makefile b/Makefile index 7fe1e4cac..37ae9f8cb 100644 --- a/Makefile +++ b/Makefile @@ -73,8 +73,10 @@ demo-stop: reset-migrations: find src -name '000[1,2,3,4,5,6,7,8,9]*' | xargs rm -f - dropdb --if-exists -h 127.0.0.1 -U postgres test_etools_datamart - dropdb --if-exists -h 127.0.0.1 -U postgres etools_datamart - createdb -h 127.0.0.1 -U postgres etools_datamart + + psql -h 127.0.0.1 -p 5432 -U postgres -c "DROP DATABASE IF EXISTS test_etools_datamart" + psql -h 127.0.0.1 -p 5432 -U postgres -c "DROP DATABASE IF EXISTS etools_datamart" + psql -h 127.0.0.1 -p 5432 -U postgres -c "CREATE DATABASE etools_datamart" + ./manage.py reset-migrations ./manage.py init-setup --all diff --git a/Pipfile b/Pipfile index 30302178a..edd0aec65 100644 --- a/Pipfile +++ b/Pipfile @@ -60,7 +60,6 @@ djangorestframework-gis = "*" openpyxl = "==2.5.12" [dev-packages] -"flake8" = ">=3.6.0" check-manifest= "*" django-extensions = "*" django-webtest = "*" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 000000000..7566a4fbe --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,2255 @@ +{ + "_meta": { + "hash": { + "sha256": "ddddd035807e129b4cc7a54e53277bbfc9a5712ad633bd61e8f756dfddd3181e" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.python.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "adal": { + "hashes": [ + "sha256:ba52913c38d76b4a4d88eaab41a5763d056ab6d073f106e0605b051ab930f5c1", + "sha256:bf79392b8e9e5e82aa6acac3835ba58bbac0ccf7e15befa215863f83d5f6a007" + ], + "version": "==1.2.0" + }, + "admin-extra-urls": { + "hashes": [ + "sha256:cd5c77c3fcde240472bc9a6c79f8c2358ad287c243e6336902c4996c38212b92" + ], + "index": "pypi", + "version": "==2.1.0" + }, + "amqp": { + "hashes": [ + "sha256:9f181e4aef6562e6f9f45660578fc1556150ca06e836ecb9e733e6ea10b48464", + "sha256:c3d7126bfbc640d076a01f1f4f6e609c0e4348508150c1f61336b0d83c738d2b" + ], + "version": "==2.4.0" + }, + "asn1crypto": { + "hashes": [ + "sha256:2f1adbb7546ed199e3c90ef23ec95c5cf3585bac7d11fb7eb562a3fe89c64e87", + "sha256:9d5c20441baf0cb60a4ac34cc447c6c189024b6b4c6cd7877034f4965c464e49" + ], + "version": "==0.24.0" + }, + "azure": { + "hashes": [ + "sha256:7d6afa332fccffe1a9390bcfac5122317eec657c6029f144d794603a81cd0e50", + "sha256:8bee1f569f700519e8cdfe210259c5c51fa96cee69ccae6b06f60d7224e334e6" + ], + "version": "==4.0.0" + }, + "azure-applicationinsights": { + "hashes": [ + "sha256:6e1839169bb6ffd2d2c21ee3f4afbdd068ea428ad47cf884ea3167ecf7fd0859", + "sha256:c007a9cb7cee4852673e915220fca267e78f97f275f1a8f09b2266a55702462b" + ], + "version": "==0.1.0" + }, + "azure-batch": { + "hashes": [ + "sha256:017be21a9e6db92473d2e33170d5dd445596fc70d706f73552ac9c6b57a6ef1c", + "sha256:cd71c7ebb5beab174b6225bbf79ae18d6db0c8d63227a7e514da0a75f138364c" + ], + "version": "==4.1.3" + }, + "azure-common": { + "hashes": [ + "sha256:5dd7ed46da968814020ecd961e7496f0a4f5e59f6d452df02100218145f6d1ba", + "sha256:e7cd5a8ee2ec0639454c1bd0f1ea5f609d83977376abfd304527ec7343fef1be" + ], + "version": "==1.1.17" + }, + "azure-cosmosdb-nspkg": { + "hashes": [ + "sha256:5d83961922812ffb6e23f7321550b2916abbd7480ec5b4a798417c4a682ff5e9", + "sha256:acf691e692818d9a65c653c7a3485eb8e35c0bdc496bba652e5ea3905ba09cd8" + ], + "version": "==2.0.2" + }, + "azure-cosmosdb-table": { + "hashes": [ + "sha256:4a34c2c792036afc2a3811f4440ab967351e9ceee6542cc96453b63c678c0145", + "sha256:a9c3d2a75b376a45f4bda84af28e698b7578544bb0e9eb7b53fedef3369634a0" + ], + "version": "==1.0.5" + }, + "azure-datalake-store": { + "hashes": [ + "sha256:84cf6dff24a6433161faa36c18b4c3d46e0bf9504c49ef88fa2280a0bb8661f6", + "sha256:c43f291ab17fc57b68c44adfb597f73255854c2fc57c2c808d146cb175db9519" + ], + "version": "==0.0.40" + }, + "azure-eventgrid": { + "hashes": [ + "sha256:297fa9619622338691078112e479361311507e28ce54af17d2c16ace71ffa4e4", + "sha256:7ebbe1c4266ba176aa4969d9755c08f10b89848ad50fb0bfd16fa82e29234f95" + ], + "version": "==1.2.0" + }, + "azure-graphrbac": { + "hashes": [ + "sha256:825b397665f478fab511e521f3f3f4b64189cb9f6c2e7e873b3b7333dc533974", + "sha256:f94b97bdcf774878fe2f8b8c46a5d6550a4ed891350ed0730c1561a24d488ee2" + ], + "version": "==0.40.0" + }, + "azure-keyvault": { + "hashes": [ + "sha256:37a8e5f376eb5a304fcd066d414b5d93b987e68f9212b0c41efa37d429aadd49", + "sha256:dec5334cde846849dfe7896f2e98f17b4f4d75c316a4d30e7171ce71ca20713d" + ], + "version": "==1.1.0" + }, + "azure-loganalytics": { + "hashes": [ + "sha256:3ceb350def677a351f34b0a0d1637df6be0c6fe87ff32a5270b17f540f6da06e", + "sha256:5a1bdb33e1fd3dfb275d9eec45ed8e1126eda51e9072ccf08a19922ee5e0ad98" + ], + "version": "==0.1.0" + }, + "azure-mgmt": { + "hashes": [ + "sha256:8dcbee7b323c3898ae92f5e2d88c3e6201f197ae48a712970929c4646cc2580a", + "sha256:fdca6b5ecf17e5583f6fd3a20cd4e4e0335a3d91131d62b50cfef40d657234b2" + ], + "version": "==4.0.0" + }, + "azure-mgmt-advisor": { + "hashes": [ + "sha256:8fdcb41f760a216e6b835eaec11dba61822777b386139d83eee31f0ff63b05da", + "sha256:9d166cc9868971d03ec852e900fa1f1b95d8829233eff2b1baf702bd34b9887b" + ], + "version": "==1.0.1" + }, + "azure-mgmt-applicationinsights": { + "hashes": [ + "sha256:929c30559692c77d424ca36f11e98f066c98e7eb7b742c44beadc082715f19df", + "sha256:f10229eb9e3e9d0ad20188b8d14d67055e86f3815b43b75eedf96b654bee2a9b" + ], + "version": "==0.1.1" + }, + "azure-mgmt-authorization": { + "hashes": [ + "sha256:2b8504763ea8b1b475f2c3533b171bedb91ffae459f48f1f885ec8536df91093", + "sha256:535de12ff4f628b62b939ae17cc6186226d7783bf02f242cdd3512ee03a6a40e" + ], + "version": "==0.50.0" + }, + "azure-mgmt-batch": { + "hashes": [ + "sha256:6e375ecdd5966ee9ee45b29c90a806388c27ceacc2cbd6dd406ff311b5d7da72", + "sha256:d942e225180d07aae07a43e489ae0acbacd92651be3a019f4eb330a587028161" + ], + "version": "==5.0.1" + }, + "azure-mgmt-batchai": { + "hashes": [ + "sha256:b5f7df6a77fde0bd6b486762eb2c81750b6f1730ee1116689d2dfbd3e03dba95", + "sha256:f1870b0f97d5001cdb66208e5a236c9717a0ed18b34dbfdb238a828f3ca2a683" + ], + "version": "==2.0.0" + }, + "azure-mgmt-billing": { + "hashes": [ + "sha256:3810cdda69ec1409191b292628fe6ba86ce5e0444723b960d91af4f401846ac3", + "sha256:85f73bb3808a7d0d2543307e8f41e5b90a170ad6eeedd54fe7fcaac61b5b22d2" + ], + "version": "==0.2.0" + }, + "azure-mgmt-cdn": { + "hashes": [ + "sha256:069774eb4b59b76ff9bd01708be0c8f9254ed40237b48368c3bb173f298755dd", + "sha256:5d5fa3e3f37632e5787e73e78af37a28d7dd0206c854cc0a4d39d75b953f0c31" + ], + "version": "==3.0.0" + }, + "azure-mgmt-cognitiveservices": { + "hashes": [ + "sha256:36b406ee4b6652cd144a99309cd823ac1c726b0160120c14e4c35cb668f3f8ff", + "sha256:c3247f2786b996a5f328ebdaf65d31507571979e004de7a5ed0ff280f95d80b4" + ], + "version": "==3.0.0" + }, + "azure-mgmt-commerce": { + "hashes": [ + "sha256:c48e84ed322fa9ddbc2d7fcca754c5e97171919be94f510bd2579cf5666684c3", + "sha256:ddcd403bcaf6b7de2cbf1bc249b7db452b35dc1f0503f940368efc722dc0bc90" + ], + "version": "==1.0.1" + }, + "azure-mgmt-compute": { + "hashes": [ + "sha256:356219a354140ea26e6b4f4be4f855f1ffaf63af60de24cd2ca335b4ece9db00", + "sha256:3c6dddd3cb971092ed86d5825475f915561b62eae3a516e990fc2fb3fea54fcc" + ], + "version": "==4.4.0" + }, + "azure-mgmt-consumption": { + "hashes": [ + "sha256:36ea28bb2ed4bec7e4d643444085ba4debed20a01fbd87f599896a4bda3318bd", + "sha256:9a85a89f30f224d261749be20b4616a0eb8948586f7f0f20573b8ea32f265189" + ], + "version": "==2.0.0" + }, + "azure-mgmt-containerinstance": { + "hashes": [ + "sha256:274a9def808407fafe123aa8e9bc1c838a48af2de56419598db7a8b8901086e3", + "sha256:f1ea7d150447f0d8d670b7db13bd2f47320385526021053445d15c427cba6713" + ], + "version": "==1.4.0" + }, + "azure-mgmt-containerregistry": { + "hashes": [ + "sha256:4d31588ca5c5258b4a595e3de400994c7f6fff3b84faccf9b8a0ff6b583eba63", + "sha256:5630c31f2ae65e7cbf4df82f7b7817d017f2c0fab42ab1b253f38336a67f9dec" + ], + "version": "==2.6.0" + }, + "azure-mgmt-containerservice": { + "hashes": [ + "sha256:150fa5437726a97428ab107e4de155c950f8065834f43aa2dff5924d20d4b42c", + "sha256:b75ceac9a18be75c4f6b1ee4e5320a3c75c78472b49d4ff7d374502d914f7594" + ], + "version": "==4.4.0" + }, + "azure-mgmt-cosmosdb": { + "hashes": [ + "sha256:a6e70527994d8ce7f4eeca80c7691bc9555adf90819848a9a30284a33b0cffe2", + "sha256:d5f448e9e6733b83e2e6bde28267bb30620c5a3f1399e66dcfe04d0b80960094" + ], + "version": "==0.4.1" + }, + "azure-mgmt-datafactory": { + "hashes": [ + "sha256:63d6cad02ef4d9da788b148b69c708227085b2d948d805bbf54150c7a692393c", + "sha256:6ee02286e9950b9f5b76589459f6d060a962faaab1f49c263a55d011e98b30bf" + ], + "version": "==0.6.0" + }, + "azure-mgmt-datalake-analytics": { + "hashes": [ + "sha256:0d64c4689a67d6138eb9ffbaff2eda2bace7d30b846401673183dcb42714de8f", + "sha256:ac96c9777314831db37461f0602e75298bc25277ba7f4d0d3e7966a926669b7e" + ], + "version": "==0.6.0" + }, + "azure-mgmt-datalake-nspkg": { + "hashes": [ + "sha256:2ac6fa13c55b87112199c5fb03a3098cefebed5f44ac34ab3d39b399951b22c4", + "sha256:3b9e2843f5d0fd6015bba13040dfc2f5fe9bc7b02c9d91dd578e8fe852d1b2dd", + "sha256:deb192ba422f8b3ec272ce4e88736796f216f28ea5b03f28331d784b7a3f4880" + ], + "version": "==3.0.1" + }, + "azure-mgmt-datalake-store": { + "hashes": [ + "sha256:2af98236cd7eaa439b239bf761338c866996ce82e9c129b204e8851e5dc095dd", + "sha256:9376d35495661d19f8acc5604f67b0bc59493b1835bbc480f9a1952f90017a4c" + ], + "version": "==0.5.0" + }, + "azure-mgmt-datamigration": { + "hashes": [ + "sha256:bb654d9f96166a5cf2638f821af5cee8b1c331257c69b053592375a4d2bb4d5e", + "sha256:ea2920475f9e56e660003a06397228243042157d46674f8a09abaf2d0a933aed" + ], + "version": "==1.0.0" + }, + "azure-mgmt-devspaces": { + "hashes": [ + "sha256:220f1610c2cda584e4212611679868d8cc5bdd789d3f0dfa1259b64fc968f580", + "sha256:4710dd59fc219ebfa4272dbbad58bf62093b52ce22bfd32a5c0279d2149471b5" + ], + "version": "==0.1.0" + }, + "azure-mgmt-devtestlabs": { + "hashes": [ + "sha256:7e91bb139b59cfaf1c1b2b0e3e21f091768c658c1879797757dedc6312f00c8c", + "sha256:d416a6d0883b0d33a63c524db6455ee90a01a72a9d8757653e446bf4d3f69796" + ], + "version": "==2.2.0" + }, + "azure-mgmt-dns": { + "hashes": [ + "sha256:3730b1b3f545a5aa43c0fff07418b362a789eb7d81286e2bed90ffef88bfa5d0", + "sha256:5b80546b0f182d7abe90c43025cd5ca7e6605224b4d5b872cca2456667f172ef" + ], + "version": "==2.1.0" + }, + "azure-mgmt-eventgrid": { + "hashes": [ + "sha256:824503b668137affa5b3782c6348c0bb6ab012c72fe47a3be9942c5639f82f8a", + "sha256:9518e9d7e60ab90a7d18ae6a3f0049ca57588f8f9583ab40d442c2a5387cf94e" + ], + "version": "==1.0.0" + }, + "azure-mgmt-eventhub": { + "hashes": [ + "sha256:675804761cb146fd4eef9b4fb2aecf257da9837780bd03147e74906d7473c4c1", + "sha256:b5407e529b9daeefbb9393c8f7401f44a21ecfeede6e03cf08456149c1d3533e" + ], + "version": "==2.2.0" + }, + "azure-mgmt-hanaonazure": { + "hashes": [ + "sha256:9fe4dc0adeb772d13918e1d6126d83c7770b762f358487504c5f082f542d0189", + "sha256:aec953c54809d0cc2f61f24d4d62a97f02c466bdc7906fd66f30120becf0c3df" + ], + "version": "==0.1.1" + }, + "azure-mgmt-iotcentral": { + "hashes": [ + "sha256:0d2101f3ea8a21ec3b29ee72d83e6ca606a241efec3b042cda8c656ad99b8fd2", + "sha256:59f7c653ac7d6475d5d7900902a5d0e0fe7aad03224c47d70f2cf1e20d43a81d" + ], + "version": "==0.1.0" + }, + "azure-mgmt-iothub": { + "hashes": [ + "sha256:08388142ed6844f0a0e97d2740decf80ffc94f22adca174c15f60b9e2c2d14be", + "sha256:77221c5b6ff7feabc2e6d44156e29fbee9098b34de044165d3532b64b678bdb1" + ], + "version": "==0.5.0" + }, + "azure-mgmt-iothubprovisioningservices": { + "hashes": [ + "sha256:2b3480a8ad2e535928da55de92b6127d02171768fed375b112274eb1e55268c1", + "sha256:8c37acfd1c33aba845f2e0302ef7266cad31cba503cc990a48684659acb7b91d" + ], + "version": "==0.2.0" + }, + "azure-mgmt-keyvault": { + "hashes": [ + "sha256:05a15327a922441d2ba32add50a35c7f1b9225727cbdd3eeb98bc656e4684099", + "sha256:406298b6236abf9e3bae3218df2fc89c25aee471b917eca7769ff5696fc8ec01" + ], + "version": "==1.1.0" + }, + "azure-mgmt-loganalytics": { + "hashes": [ + "sha256:c7315ff0ee4d618fb38dca68548ef4023a7a20ce00efe27eb2105a5426237d86", + "sha256:f224b7d52f4369ce057c7f83e80da1d00a8887ad5c15606529e9c930e601088f" + ], + "version": "==0.2.0" + }, + "azure-mgmt-logic": { + "hashes": [ + "sha256:232c175e45582f7c547d3b50d93bd64aec37b400426962e4fd0cd235980ea110", + "sha256:d163dfc32e3cfa84f3f8131a75d9e94f5c4595907332cc001e45bf7e4efd5add" + ], + "version": "==3.0.0" + }, + "azure-mgmt-machinelearningcompute": { + "hashes": [ + "sha256:4995ba9ee392eb4f5579e93dba9187b67007187e7fd022d6b417ec56e6761a6b", + "sha256:7a52f85591114ef33a599dabbef840d872b7f599b7823e596af9490ec51b873f" + ], + "version": "==0.4.1" + }, + "azure-mgmt-managementgroups": { + "hashes": [ + "sha256:005e8289c2e1d8a8368c96790edf6a34e5c37b4096bce2eb8a923c6d5dc11fb2", + "sha256:ff62d982edda634a36160cb1d15a367a9572a5acb419e5e7ad371e8c83bd47c7" + ], + "version": "==0.1.0" + }, + "azure-mgmt-managementpartner": { + "hashes": [ + "sha256:1b0ec9b9d084e331b863cef77f002ede8cbc6214bb56c3c8dd7945d10c7ffc77", + "sha256:2d7d5f346cc3d6ad621a39357637565199c51a65c7e451b73aced1c097a78165" + ], + "version": "==0.1.0" + }, + "azure-mgmt-maps": { + "hashes": [ + "sha256:a779b1ddbbcd95393e53f11b586dd26c42a709aaa226412a2df64d0da6807a80", + "sha256:c120e210bb61768da29de24d28b82f8d42ae24e52396eb6569b499709e22f006" + ], + "version": "==0.1.0" + }, + "azure-mgmt-marketplaceordering": { + "hashes": [ + "sha256:6da12425cbab0cc62f246e7266b4d67aff6bdd031ecbe50c7542c2f2b2440ad4", + "sha256:fb7a21f4a4a4b8d32bae600614f047a17993111374c9567ac11f241ada61d69f" + ], + "version": "==0.1.0" + }, + "azure-mgmt-media": { + "hashes": [ + "sha256:688b56daad16e84afc7ad788a1d0d2969e365317db0d6034dd428a08030d21aa", + "sha256:6d68668b14c00b4c68f695f2bb69ff77af29034d440371c2bdd9c80187b1a08c" + ], + "version": "==1.0.0" + }, + "azure-mgmt-monitor": { + "hashes": [ + "sha256:838867a150694837e9c6141760ff0f20fe9e5b7ab88f9ba868fde1810855895e", + "sha256:f1a58d483e3292ba4f7bbf3104573130c9265d6c9262e26b60cbfa950b5601e4" + ], + "version": "==0.5.2" + }, + "azure-mgmt-msi": { + "hashes": [ + "sha256:8622bc9a164169a0113728ebe7fd43a88189708ce6e10d4507247d6907987167", + "sha256:e989e61753bf4eca0e688526b7c31c9a88082080acfb038fad17dda7f084a026" + ], + "version": "==0.2.0" + }, + "azure-mgmt-network": { + "hashes": [ + "sha256:5356a5998f1cf509436defcce2e3e560a3d14ce6f9b5d32640a27578ddeb233b", + "sha256:cef9bf5d36700966e52f7cea86e29c622bc5bbb92d0ce7a75420e29fb0e75f45" + ], + "version": "==2.5.1" + }, + "azure-mgmt-notificationhubs": { + "hashes": [ + "sha256:481aaf1c5c4b951c3114f9d256913a443892a18d3c2130f63149edf160b6b70d", + "sha256:7c4c7755c28c8301cfa90d6ded9509c30444e5dfc5001b132dca57836930602b" + ], + "version": "==2.0.0" + }, + "azure-mgmt-nspkg": { + "hashes": [ + "sha256:1c6f5134de78c8907e8b73a8ceaaf1f336a24193a543039994fe002bb5f7f39f", + "sha256:8b2287f671529505b296005e6de9150b074344c2c7d1c805b3f053d081d58c52", + "sha256:d638ea5fda3ed323db943feb29acaa200f5d8ff092078bf8d29d4a2f8ed16999" + ], + "version": "==3.0.2" + }, + "azure-mgmt-policyinsights": { + "hashes": [ + "sha256:49b88331bf823a030182ff492b728828c35758c7e49c8898a403bce5b210ba49", + "sha256:ff94cb12d6e01bf1470c2a6af4ce6960669ab4209106153879ff97addc569ce1" + ], + "version": "==0.1.0" + }, + "azure-mgmt-powerbiembedded": { + "hashes": [ + "sha256:2f05be73f2a086c579a78fc900e3b2ae14ccde5bcec54e29dfc73e626b377476", + "sha256:6f75fef7ff576383c8c6692ba5a1efa634e6eded99d0ff6e76fdc8327325fe2f" + ], + "version": "==2.0.0" + }, + "azure-mgmt-rdbms": { + "hashes": [ + "sha256:3b6a194e6b82aa9fa187d1060ff3f19ad7218317b9ae30d9b64c3113ac8dfd7c", + "sha256:f9b77f0ead387f48c3a81914e2b976967300b3e31be10a101abd00057af7bddd" + ], + "version": "==1.5.0" + }, + "azure-mgmt-recoveryservices": { + "hashes": [ + "sha256:29df3e58890492efdd80d608b7a0fd2006c8a908687c35b9b1f70af068c0f6e4", + "sha256:e48f7769fb10a85ad857710c2cba47880166f69fe7da6b331771f129b21de95c" + ], + "version": "==0.3.0" + }, + "azure-mgmt-recoveryservicesbackup": { + "hashes": [ + "sha256:1e55b6cbb808df83576cef352ba0065f4878fe505299c0a4c5a97f4f1e5793df", + "sha256:5c44bd73df6eb55382335f16a21aee62ddc8e271cd913b9147768f42aba59c3d" + ], + "version": "==0.3.0" + }, + "azure-mgmt-redis": { + "hashes": [ + "sha256:374a267b83ec4e71077b8afad537863fb93816c96407595cdd02973235356ded", + "sha256:41d12cea5673b2e277ea298d85bab7d1fdbd0636ff6be08b15ee30a312c07d6d" + ], + "version": "==5.0.0" + }, + "azure-mgmt-relay": { + "hashes": [ + "sha256:1411e734573ce6166ac7a75fbfc0afb7d6b3f47a94d0b4999b6adf2709eba87c", + "sha256:d9f987cf2998b8a354f331b2a71082c049193f1e1cd345812e14b9b821365acb" + ], + "version": "==0.1.0" + }, + "azure-mgmt-reservations": { + "hashes": [ + "sha256:40618a3700c47a788182649f238d985edf15b08b6577ea27557e70e2866ac171", + "sha256:612acfa18f005c2ee5dda5c473b8bf6540d232db331b27be47de2608c5855adb" + ], + "version": "==0.2.1" + }, + "azure-mgmt-resource": { + "hashes": [ + "sha256:56c7d4e8d6854212977477272c600ab1d2c535de2a86095b56e948b06eb6d539", + "sha256:aef8573066026db04ed3e7c5e727904e42f6462b6421c2e8a3646e4c4f8128be" + ], + "version": "==2.1.0" + }, + "azure-mgmt-scheduler": { + "hashes": [ + "sha256:59e7cced3ee9b93016efb8cf5f965ca11a463bb8e55f96a2f200b013426dd751", + "sha256:c6e6edd386ddc4c21d54b1497c3397b970bc127b71809b51bd2391cb1f3d1a14" + ], + "version": "==2.0.0" + }, + "azure-mgmt-search": { + "hashes": [ + "sha256:0ec5de861bd786bcb8691322feed6e6caa8d2f0806a50dc0ca5d640591926893", + "sha256:fdbaa1721b045a4ea4a21c84c6bc1f9636b39e93dff09ffd68f22e5da88bd3ea" + ], + "version": "==2.0.0" + }, + "azure-mgmt-servicebus": { + "hashes": [ + "sha256:7d1e8c3dc05ffdfe496ae643290ce4de93a3bf814ffda69121223e3d7da12408", + "sha256:cbc3fc8d8b8930452cf7d499856313da208eb66f62ade0091aa9bae0db2b1674" + ], + "version": "==0.5.3" + }, + "azure-mgmt-servicefabric": { + "hashes": [ + "sha256:0c1434e789d0c036c613855b898a385a4533656f45eafae3ef7af3ecf4d6a3e8", + "sha256:b2bf2279b8ff8450c35e78e226231655021482fdbda27db09975ebfc983398ad" + ], + "version": "==0.2.0" + }, + "azure-mgmt-signalr": { + "hashes": [ + "sha256:37a79dfe21af4addbd9cdf248a260387caabdfdd60d2ba6f3174d28e96660655", + "sha256:8a6266a59a5c69102e274806ccad3ac74b06fd2c226e16426bbe248fc2174903" + ], + "version": "==0.1.1" + }, + "azure-mgmt-sql": { + "hashes": [ + "sha256:43668705f17bd3532e2e489d368937eb19e7d0515638146c156982ace76e0743", + "sha256:5da488a56d5265757b45747cf5fd22413eb089e606658d6e6d84fe3e9b07e4fa" + ], + "version": "==0.9.1" + }, + "azure-mgmt-storage": { + "hashes": [ + "sha256:512a29798833453f8c32a5b6d038a459649bbb5b9970ac23c982b5787057fa2b", + "sha256:9577cea1f7a86ca1db6f14539bd05ce27f43ebe590cc7f23c943961a2c5c1cdc" + ], + "version": "==2.0.0" + }, + "azure-mgmt-subscription": { + "hashes": [ + "sha256:309b23f0de65f26da80c801e913b0c3b2aea8b90ba583d919f81fe6f329d3f1b", + "sha256:a37925fb820cb86dfb57559846cc97c7e066fe0e64da7594175f4a4f5e50783c" + ], + "version": "==0.2.0" + }, + "azure-mgmt-trafficmanager": { + "hashes": [ + "sha256:126167eaa82b443b5b71394050ec292f45074701232bdbdda71f636e9b46516b", + "sha256:65796588ffbeac45bf73668977131c317b64d6a3f32faecdc5cbf9683d48132c" + ], + "version": "==0.50.0" + }, + "azure-mgmt-web": { + "hashes": [ + "sha256:8ea0794eef22a257773c13269b94855ab79d36c342ad15a98135403c9785cc0a", + "sha256:f4ddb4850314325db688241caa323fa80d811dc4590454d87f5c5b558557ea51" + ], + "version": "==0.35.0" + }, + "azure-nspkg": { + "hashes": [ + "sha256:1d0bbb2157cf57b1bef6c8c8e5b41133957364456c43b0a43599890023cca0a8", + "sha256:31a060caca00ed1ebd369fc7fe01a56768c927e404ebc92268f4d9d636435e28", + "sha256:e7d3cea6af63e667d87ba1ca4f8cd7cb4dfca678e4c55fc1cedb320760e39dd0" + ], + "version": "==3.0.2" + }, + "azure-servicebus": { + "hashes": [ + "sha256:30d5beaf73eaf40aba52fdd7f7f26dd8c3e639051dc19a5f2ab5f8e7832d68f7", + "sha256:bb6a27afc8f1ea9ab46ff2371069243d45000d351d9b64e450b63d52409b934d" + ], + "version": "==0.21.1" + }, + "azure-servicefabric": { + "hashes": [ + "sha256:8724718ef48c2810dbd8609c193225fa1e037a2c9ce70c7263f5b031e2e8f208", + "sha256:c82575cbdf95cc897c3230ea889d4e751d8760a2223857fe6fbeeea5b802e5e2" + ], + "version": "==6.3.0.0" + }, + "azure-servicemanagement-legacy": { + "hashes": [ + "sha256:282d48aae6aa002c59db6f651b68777a8f93692bb8e9b443113e6a8d5ce5e875", + "sha256:c883ff8fa3d4f4cb7b9344e8cb7d92a9feca2aa5efd596237aeea89e5c10981d" + ], + "version": "==0.20.6" + }, + "azure-storage": { + "hashes": [ + "sha256:4c406422e3edd41920bb1f0c3930c34fee3eb0d55258ef7ec7308ccbb9385ad5", + "sha256:fb6212dcbed91b49d9637aa5e8888eafdfcd523b7e560c8044d2d838bbd3ca5f" + ], + "index": "pypi", + "version": "==0.36.0" + }, + "azure-storage-blob": { + "hashes": [ + "sha256:65ebe2e54460566c2077c6b3773a2a0623eabc7b95602010cb51b84077087fda", + "sha256:baa828607e21e5c7b6ceb2ede9894d465adf586373c2f7c988fe55eca8e9048c" + ], + "version": "==1.4.0" + }, + "azure-storage-common": { + "hashes": [ + "sha256:69bba6aad1e8a717eeee0f95c2feeeed72ef802001e66d6d15bf8446c4f53e6a", + "sha256:7ab607f9b8fd27b817482194b1e7d43484c65dcf2605aae21ad8706c6891934d" + ], + "version": "==1.4.0" + }, + "azure-storage-file": { + "hashes": [ + "sha256:5217b0441b671246a8d5f506a459fa3af084eeb9297c5be3bbe95d75d23bac2f", + "sha256:65831e66594cdda36e02f5566ea9d8a6ad35eca6691c28f1fbb49f23987752ff" + ], + "version": "==1.4.0" + }, + "azure-storage-queue": { + "hashes": [ + "sha256:0bafe9e61c0ce7b3f3ecadea21e931dab3248bd4989dc327a8666c5deae7f7ed", + "sha256:d28e6f854ed5d719d62637c1b5c2b74d9c67584bc326de5ce41ba0af73e3a3f0" + ], + "version": "==1.4.0" + }, + "billiard": { + "hashes": [ + "sha256:42d9a227401ac4fba892918bba0a0c409def5435c4b483267ebfe821afaaba0e" + ], + "version": "==3.5.0.5" + }, + "celery": { + "hashes": [ + "sha256:77dab4677e24dc654d42dfbdfed65fa760455b6bb563a0877ecc35f4cfcfc678", + "sha256:ad7a7411772b80a4d6c64f2f7f723200e39fb66cf614a7fdfab76d345acc7b13" + ], + "index": "pypi", + "version": "==4.2.1" + }, + "certifi": { + "hashes": [ + "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", + "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + ], + "version": "==2018.11.29" + }, + "cffi": { + "hashes": [ + "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743", + "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef", + "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50", + "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f", + "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30", + "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93", + "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257", + "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b", + "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3", + "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e", + "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc", + "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04", + "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6", + "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359", + "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596", + "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b", + "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd", + "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95", + "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5", + "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e", + "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6", + "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca", + "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31", + "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1", + "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2", + "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085", + "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801", + "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4", + "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184", + "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917", + "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f", + "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb" + ], + "version": "==1.11.5" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "click": { + "hashes": [ + "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", + "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" + ], + "version": "==6.7" + }, + "coreapi": { + "hashes": [ + "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb", + "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3" + ], + "index": "pypi", + "version": "==2.3.3" + }, + "coreschema": { + "hashes": [ + "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f", + "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607" + ], + "version": "==0.0.4" + }, + "cryptography": { + "hashes": [ + "sha256:02915ee546b42ce513e8167140e9937fc4c81a06a82216e086ccce51f347948a", + "sha256:03cc8bc5a69ae3d44acf1a03facdb7c10a94c67907862c563e10efe72b737977", + "sha256:07f76bde6815c55195f3b3812d35769cc7c765144c0bb71ae45e02535d078591", + "sha256:13eac1c477b9af7e9a9024369468d08aead6ad78ed599d163ad046684474364b", + "sha256:179bfb585c5efc87ae0e665770e4896727b92dbc1f810c761b1ebf8363e2fec8", + "sha256:414af0ba308e74c1f8bc5b11befc86cb66b10be8959547786f64258830d2096f", + "sha256:41a1ca14f255df8c44dd22c6006441d631d1589104045ec7263cc47e9772f41a", + "sha256:54947eb98bc4eef99ddf49f45d2694ea5a3929ab3edc9806ad01967368594d82", + "sha256:5bac7a2abda07d0c3c8429210349bb54149ad8940dc7bcffedcd56519b410a3c", + "sha256:7f41af8c586bed9f59cfe8832d818b3b75c860d7025da9cd2db76875a72ff785", + "sha256:8004fae1b3cb2dbd90a011ad972e49a7e78a871b89c70cc7213cf4ebd2532bcb", + "sha256:8e0eccadc3b465e12c50a5b8fb4d39cf401b44d7bb9936c70fddb5e5aaf740d5", + "sha256:95b4741722269cfdc134fec23b7ae6503ee2aea83d0924cfee6d6ec54cd42d8e", + "sha256:a06f5aa6d7a94531dfe82eb2972e669258c452fe9cf88f76116610de4c789785", + "sha256:b0833d27c7eb536bc27323a1e8e22cb39ebac78c4ef3be0167ba40f447344808", + "sha256:b72dec675bc59a01edc96616cd48ec465b714481caa0938c8bbca5d18f17d5df", + "sha256:c800ddc23b5206ce025f23225fdde89cdc0e64016ad914d5be32d1f602ce9495", + "sha256:c980c8c313a5e014ae12e2245e89e7b30427e5a98cbb88afe478ecae85f3abaa", + "sha256:e85b410885addaeb31a867eabcefc9ef4a7e904ad45eac9e60a763a54b244626" + ], + "index": "pypi", + "version": "==2.4.1" + }, + "defusedxml": { + "hashes": [ + "sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4", + "sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20" + ], + "markers": "python_version >= '3.0'", + "version": "==0.5.0" + }, + "django": { + "hashes": [ + "sha256:a32c22af23634e1d11425574dce756098e015a165be02e4690179889b207c7a8", + "sha256:d6393918da830530a9516bbbcbf7f1214c3d733738779f06b0f649f49cc698c3" + ], + "index": "pypi", + "version": "==2.1.5" + }, + "django-adminactions": { + "hashes": [ + "sha256:cc8d236797dcebdfa229dc0f938dc8c5ab648b488318c9f584a13df8a03bd066" + ], + "index": "pypi", + "version": "==1.6.0" + }, + "django-adminfilters": { + "hashes": [ + "sha256:adab7f927b0845f9d87902ef3148ba704214e5977e5da483e386e82e445cb879" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "django-appconf": { + "hashes": [ + "sha256:6a4d9aea683b4c224d97ab8ee11ad2d29a37072c0c6c509896dd9857466fb261", + "sha256:ddab987d14b26731352c01ee69c090a4ebfc9141ed223bef039d79587f22acd9" + ], + "version": "==1.0.2" + }, + "django-braces": { + "hashes": [ + "sha256:a457d74ea29478123c0c4652272681b3cea0bf1232187fd9f9b6f1d97d32a890", + "sha256:ba68e98b817c6f01d71d10849f359979617b3fe4cefb7f289adefddced092ddc" + ], + "version": "==1.13.0" + }, + "django-celery-beat": { + "hashes": [ + "sha256:3c2c22647455be5503aca7450db64ea53acacee2d0aef3d7ac49aa3ef3845724", + "sha256:bfc22dad2884524697e1fcdfa63c0555a65151a97902c3045cd2cf7bf63970e4" + ], + "index": "pypi", + "version": "==1.4.0" + }, + "django-celery-email": { + "hashes": [ + "sha256:1b2e0e31c6266007463befdc23934696fc93dcf320dfc85b8bb6b063cfe9558a", + "sha256:e5f9122c02ec58d3e49653475ad1b8612fd752681ce2f006d9c0792c57046283" + ], + "index": "pypi", + "version": "==2.0.1" + }, + "django-concurrency": { + "hashes": [ + "sha256:233d23a8751989df6db2886957a8fbcc2408a1f16bb28262aab8a538d756d9d2" + ], + "index": "pypi", + "version": "==1.4" + }, + "django-constance": { + "hashes": [ + "sha256:5a4fec5361214b4658c64184b45a6678cb8f8bf8d342f56976f87d5c6645860a", + "sha256:a49735063b2c30015d2e52a90609ea9798da722ed070f091de51714758a5d018" + ], + "index": "pypi", + "version": "==2.3.1" + }, + "django-cors-headers": { + "hashes": [ + "sha256:5545009c9b233ea7e70da7dbab7cb1c12afa01279895086f98ec243d7eab46fa", + "sha256:c4c2ee97139d18541a1be7d96fe337d1694623816d83f53cb7c00da9b94acae1" + ], + "index": "pypi", + "version": "==2.4.0" + }, + "django-countries": { + "hashes": [ + "sha256:2f684e2c2b8afdfd80137c8bcbb2d75f62a4a7863101cc62b4d84d3c9f27fdab", + "sha256:74ebe919aeccea818dafea17b0b243fb1280c55226cb315b9622f0c0416536d2" + ], + "index": "pypi", + "version": "==5.3.2" + }, + "django-crashlog": { + "hashes": [ + "sha256:147a09226c69f4f8349292680662e53f20b232dc02d0f86e4532418a1da2dd94" + ], + "index": "pypi", + "version": "==1.0.0" + }, + "django-crispy-forms": { + "hashes": [ + "sha256:5952bab971110d0b86c278132dae0aa095beee8f723e625c3d3fa28888f1675f", + "sha256:705ededc554ad8736157c666681165fe22ead2dec0d5446d65fc9dd976a5a876" + ], + "index": "pypi", + "version": "==1.7.2" + }, + "django-db-logging": { + "hashes": [ + "sha256:4787de15c1a933e016766f023730f9551e8bf341e99549d13a918f27bf403f30" + ], + "index": "pypi", + "version": "==0.5.0" + }, + "django-dbtemplates": { + "file": "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz" + }, + "django-environ": { + "hashes": [ + "sha256:6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde", + "sha256:c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4" + ], + "index": "pypi", + "version": "==0.4.5" + }, + "django-filter": { + "hashes": [ + "sha256:3dafb7d2810790498895c22a1f31b2375795910680ac9c1432821cbedb1e176d", + "sha256:a3014de317bef0cd43075a0f08dfa1d319a7ccc5733c3901fb860da70b0dda68" + ], + "index": "pypi", + "version": "==2.1.0" + }, + "django-js-asset": { + "hashes": [ + "sha256:30149158206f693a5d027fe590096fc84495486bd11cd77d395b4f2ec27fc1d0", + "sha256:a395d8d19eb201ea8d2bd4f145b38f1717cd74c0f609f040141d8724c5a27f36" + ], + "version": "==1.1.0" + }, + "django-model-utils": { + "hashes": [ + "sha256:2c057f3bf0859aba27f04389f0cedd2d48f8c9b3848acb86fd9970794e58f477", + "sha256:8cd377744aa45f9f131d652ec460c57d1aaa88d3e9b586c8e27eb709341b9084" + ], + "index": "pypi", + "version": "==3.1.2" + }, + "django-mptt": { + "hashes": [ + "sha256:18a41d1b56ca7c02a5b04d246e33ee2d18f6ee5459c02ed1d945f5abdef23a2e", + "sha256:689a04cce0981671d6061a9928c33a16b47abb0d4cd43cf7dec31ae284fdae9d" + ], + "index": "pypi", + "version": "==0.9.1" + }, + "django-oauth-toolkit": { + "hashes": [ + "sha256:ad1b76275950ebbff708222cec57bbdb879f89bac7df6b9dee0f4b9db485c264" + ], + "version": "==1.2.0" + }, + "django-picklefield": { + "hashes": [ + "sha256:9052f2dcf4882c683ce87b4356f29b4d014c0dad645b6906baf9f09571f52bc8", + "sha256:f1733a8db1b6046c0d7d738e785f9875aa3c198215de11993463a9339aa4ea24" + ], + "index": "pypi", + "version": "==2.0" + }, + "django-post-office": { + "hashes": [ + "sha256:207b663a05d5d6a62765eb30081093837272a888cf00557d89d0e6f467928871", + "sha256:827937a944fe47cea393853069cd9315d080298c8ddb0faf787955d6aa51a030" + ], + "index": "pypi", + "version": "==3.1.0" + }, + "django-redis": { + "hashes": [ + "sha256:af0b393864e91228dd30d8c85b5c44d670b5524cb161b7f9e41acc98b6e5ace7", + "sha256:f46115577063d00a890867c6964ba096057f07cb756e78e0503b89cd18e4e083" + ], + "index": "pypi", + "version": "==4.10.0" + }, + "django-redisboard": { + "hashes": [ + "sha256:5db5598b9f423d31ae7424b825a6c41c29fbc8cae2907ccc18974e862122be86", + "sha256:6c1df00d936f178f9e1a8991324ed9e7e3bf0ffefaaf195fbf4decc5c8c17d14" + ], + "index": "pypi", + "version": "==4.0.0" + }, + "django-regex": { + "hashes": [ + "sha256:a4508894b49dd35e49acfbb8ee1046913ebe375ecbecebf64d30ffb9b4be6f2b" + ], + "index": "pypi", + "version": "==0.2.1" + }, + "django-rest-framework-social-oauth2": { + "hashes": [ + "sha256:c9a297b636ffd37957c6146280e99ead41e6aca37bcb995e3d52d65eefbca0b7" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "django-storages": { + "extras": [ + "azure" + ], + "hashes": [ + "sha256:8e35d2c7baeda5dc6f0b4f9a0fc142d25f9a1bf72b8cebfcbc5db4863abc552d", + "sha256:b1a63cd5ea286ee5a9fb45de6c3c5c0ae132d58308d06f1ce9865cfcd5e470a7" + ], + "index": "pypi", + "version": "==1.7.1" + }, + "django-strategy-field": { + "hashes": [ + "sha256:659ce7d1fec5dc7770291f64d530e345e155d4d24f843f225d0b5a451f7b3706" + ], + "index": "pypi", + "version": "==1.3.2" + }, + "django-sysinfo": { + "hashes": [ + "sha256:73844d6662ab7eb724d40f935aaef84bbe00cbe03a529bf263b54caf918b1c9c" + ], + "index": "pypi", + "version": "==1.4" + }, + "django-timezone-field": { + "hashes": [ + "sha256:7d7a37cfeacec5b1e81cd2f0aa334d46ebaa369cd516028579ed343cbc676c38", + "sha256:d9fdab77c443b78c362ffaeb50fe7d7b54692c89aaae8ca1cae67848139b82ac" + ], + "version": "==3.0" + }, + "djangorestframework": { + "hashes": [ + "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", + "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" + ], + "version": "==3.9.1" + }, + "djangorestframework-csv": { + "hashes": [ + "sha256:2f008b20a44f2d3c37835ea5b5ddfe19f54394f07b9cb267c616a917a7f7e27c" + ], + "index": "pypi", + "version": "==2.1.0" + }, + "djangorestframework-gis": { + "hashes": [ + "sha256:35527c51e083ccc93f6e6d90a6515c132bbeb2c5648b166ac5b1a48c4ea8e2a4", + "sha256:e645c6c8aedee53ac0a4851abcdf8121fff66813eebae1b040b1ccb941cb248b" + ], + "index": "pypi", + "version": "==0.14" + }, + "djangorestframework-jwt": { + "hashes": [ + "sha256:5efe33032f3a4518a300dc51a51c92145ad95fb6f4b272e5aa24701db67936a7", + "sha256:ab15dfbbe535eede8e2e53adaf52ef0cf018ee27dbfad10cbc4cbec2ab63d38c" + ], + "index": "pypi", + "version": "==1.11.0" + }, + "djangorestframework-xml": { + "hashes": [ + "sha256:d8118580b6c0e94a6b908a78c8d842e9f349901dfff43d91adc2d73a54f4ba59", + "sha256:d85d5744e75fe01ea2af667b15f6aa7df97c710516477ba493558da8432f6b0f" + ], + "index": "pypi", + "version": "==1.4.0" + }, + "djangorestframework-yaml": { + "hashes": [ + "sha256:58e44b2ba2b1484fe793adcdc5d04910ab9b385a2991603b049b96eed6a76d32", + "sha256:b2277cb0459cf14b473e8cb6e0055725582afe862049c32b840b261ca8fbce3e" + ], + "index": "pypi", + "version": "==1.0.3" + }, + "drf-dynamic-serializer": { + "hashes": [ + "sha256:058ae34570c1dfce4e8e97ac4a5c4ad543279b77f97e2ca254caaff9407c149a" + ], + "index": "pypi", + "version": "==2.0" + }, + "drf-extensions": { + "hashes": [ + "sha256:11223bc2e173233f4a108456df6433edebc895f65be0dcaa2a76f082fa3b91c3", + "sha256:6638ced63fabfefaa18b81e288a9f459234825ca734ab8dc9942d788b6ee7af4" + ], + "index": "pypi", + "version": "==0.4.0" + }, + "drf-renderer-xlsx": { + "hashes": [ + "sha256:21e9975f6ac6a45c91e8109f5c53ae6ae0569b9a8d4406e74590efafc56ef448", + "sha256:9bbdcd210abdf66e8c22b2c2cdb3fac67b017c151d496a944a52ff33a777c3b6" + ], + "index": "pypi", + "version": "==0.3.1" + }, + "drf-yasg": { + "extras": [ + "validation" + ], + "hashes": [ + "sha256:89c84779fb4bfe9c0704bdd40ad70b91fff13fa202696ce580de1c8615414f88", + "sha256:c37adfd3859d04827f971098227a54ef7229a79860860dae7b41abdc17e4e8cf" + ], + "index": "pypi", + "version": "==1.12.1" + }, + "et-xmlfile": { + "hashes": [ + "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b" + ], + "version": "==1.0.1" + }, + "flex": { + "hashes": [ + "sha256:17a58b3c0ca6524dbc79e1b266dcb8fc39d18060fbe8072ae297f14249ee0909", + "sha256:7002314367b7d497f4ef71fca8324ef5a640d3a90f7d1e89b3d3154b0af7b8d9" + ], + "version": "==6.13.2" + }, + "gunicorn": { + "hashes": [ + "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471", + "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3" + ], + "index": "pypi", + "version": "==19.9.0" + }, + "html5lib": { + "hashes": [ + "sha256:20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3", + "sha256:66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736" + ], + "version": "==1.0.1" + }, + "humanize": { + "hashes": [ + "sha256:a43f57115831ac7c70de098e6ac46ac13be00d69abbf60bdcac251344785bb19" + ], + "index": "pypi", + "version": "==0.5.1" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "inflection": { + "hashes": [ + "sha256:18ea7fb7a7d152853386523def08736aa8c32636b047ade55f7578c4edeb16ca" + ], + "version": "==0.3.1" + }, + "isodate": { + "hashes": [ + "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8", + "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81" + ], + "version": "==0.6.0" + }, + "itypes": { + "hashes": [ + "sha256:c6e77bb9fd68a4bfeb9d958fea421802282451a25bac4913ec94db82a899c073" + ], + "version": "==1.1.0" + }, + "jdcal": { + "hashes": [ + "sha256:948fb8d079e63b4be7a69dd5f0cd618a0a57e80753de8248fd786a8a20658a07", + "sha256:ea0a5067c5f0f50ad4c7bdc80abad3d976604f6fb026b0b3a17a9d84bb9046c9" + ], + "version": "==1.4" + }, + "jinja2": { + "hashes": [ + "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", + "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + ], + "version": "==2.10" + }, + "jsonfield": { + "hashes": [ + "sha256:a0a7fdee736ff049059409752b045281a225610fecbda9b9bd588ba976493c12", + "sha256:beb1cd4850d6d6351c32daefcb826c01757744e9c863228a642f87a1a4acb834" + ], + "version": "==2.0.2" + }, + "jsonpointer": { + "hashes": [ + "sha256:381b613fd1afd65376fb28948c4744f035e47ab049a9fdde0c48cc1c30b68559", + "sha256:c681af823545c731b7b38aedd5d4eee4c5eff87bc0f25e0ff25444a4189eac4d" + ], + "version": "==1.14" + }, + "jsonschema": { + "hashes": [ + "sha256:000e68abd33c972a5248544925a0cae7d1125f9bf6c58280d37546b946769a08", + "sha256:6ff5f3180870836cae40f06fa10419f557208175f13ad7bc26caa77beb1f6e02" + ], + "version": "==2.6.0" + }, + "kombu": { + "hashes": [ + "sha256:1ef049243aa05f29e988ab33444ec7f514375540eaa8e0b2e1f5255e81c5e56d", + "sha256:3c9dca2338c5d893f30c151f5d29bfb81196748ab426d33c362ab51f1e8dbf78" + ], + "version": "==4.2.2.post1" + }, + "markupsafe": { + "hashes": [ + "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432", + "sha256:130f844e7f5bdd8e9f3f42e7102ef1d49b2e6fdf0d7526df3f87281a532d8c8b", + "sha256:19f637c2ac5ae9da8bfd98cef74d64b7e1bb8a63038a3505cd182c3fac5eb4d9", + "sha256:1b8a7a87ad1b92bd887568ce54b23565f3fd7018c4180136e1cf412b405a47af", + "sha256:1c25694ca680b6919de53a4bb3bdd0602beafc63ff001fea2f2fc16ec3a11834", + "sha256:1f19ef5d3908110e1e891deefb5586aae1b49a7440db952454b4e281b41620cd", + "sha256:1fa6058938190ebe8290e5cae6c351e14e7bb44505c4a7624555ce57fbbeba0d", + "sha256:31cbb1359e8c25f9f48e156e59e2eaad51cd5242c05ed18a8de6dbe85184e4b7", + "sha256:3e835d8841ae7863f64e40e19477f7eb398674da6a47f09871673742531e6f4b", + "sha256:4e97332c9ce444b0c2c38dd22ddc61c743eb208d916e4265a2a3b575bdccb1d3", + "sha256:525396ee324ee2da82919f2ee9c9e73b012f23e7640131dd1b53a90206a0f09c", + "sha256:52b07fbc32032c21ad4ab060fec137b76eb804c4b9a1c7c7dc562549306afad2", + "sha256:52ccb45e77a1085ec5461cde794e1aa037df79f473cbc69b974e73940655c8d7", + "sha256:5c3fbebd7de20ce93103cb3183b47671f2885307df4a17a0ad56a1dd51273d36", + "sha256:5e5851969aea17660e55f6a3be00037a25b96a9b44d2083651812c99d53b14d1", + "sha256:5edfa27b2d3eefa2210fb2f5d539fbed81722b49f083b2c6566455eb7422fd7e", + "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1", + "sha256:83381342bfc22b3c8c06f2dd93a505413888694302de25add756254beee8449c", + "sha256:857eebb2c1dc60e4219ec8e98dfa19553dae33608237e107db9c6078b1167856", + "sha256:98e439297f78fca3a6169fd330fbe88d78b3bb72f967ad9961bcac0d7fdd1550", + "sha256:bf54103892a83c64db58125b3f2a43df6d2cb2d28889f14c78519394feb41492", + "sha256:d9ac82be533394d341b41d78aca7ed0e0f4ba5a2231602e2f05aa87f25c51672", + "sha256:e982fe07ede9fada6ff6705af70514a52beb1b2c3d25d4e873e82114cf3c5401", + "sha256:edce2ea7f3dfc981c4ddc97add8a61381d9642dc3273737e756517cc03e84dd6", + "sha256:efdc45ef1afc238db84cb4963aa689c0408912a0239b0721cb172b4016eb31d6", + "sha256:f137c02498f8b935892d5c0172560d7ab54bc45039de8805075e19079c639a9c", + "sha256:f82e347a72f955b7017a39708a3667f106e6ad4d10b25f237396a7115d8ed5fd", + "sha256:fb7c206e01ad85ce57feeaaa0bf784b97fa3cad0d4a5737bc5295785f5c613a1" + ], + "version": "==1.1.0" + }, + "msrest": { + "hashes": [ + "sha256:5dadd54bec98d52cd9f43fb095015c346135b8cafaa35f24c7309cc25d3ad266", + "sha256:c74585e39041875c44d9235721ca946f7824ec28831c851b964106a60dc19cda" + ], + "version": "==0.6.4" + }, + "msrestazure": { + "hashes": [ + "sha256:86695c9728e91ee6f4cbb3b6e82ebd92233b72b6e145f7dcafa6b2da17412b88", + "sha256:99b185dcfc94f4ac2f7792691b865958c5a9871281cd618c50963c6b8d23401b" + ], + "version": "==0.6.0" + }, + "oauthlib": { + "hashes": [ + "sha256:0a8b2e0daa7afb62bd1b0b387b7a3723fa9a35d1183694ca5a5c8e3d6df59913", + "sha256:8932fb34f7c6a4fc50c9f423b105923ed2e6df091b3c388d182540db02c581a0" + ], + "version": "==3.0.0" + }, + "onedrivesdk": { + "hashes": [ + "sha256:922037d226dd374ab5a28379c45322cbc15f4d77f5117e9904599fdba05f6054" + ], + "index": "pypi", + "version": "==1.1.8" + }, + "openpyxl": { + "hashes": [ + "sha256:7bcf019a0be528673a8aec1e60b5c863342c3231962dbf7922fd4da42a49a91a" + ], + "index": "pypi", + "version": "==2.5.12" + }, + "pillow": { + "hashes": [ + "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e", + "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7", + "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a", + "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3", + "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1", + "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1", + "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7", + "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1", + "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3", + "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055", + "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf", + "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f", + "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f", + "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239", + "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe", + "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c", + "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697", + "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494", + "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356", + "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6", + "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000", + "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f", + "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c", + "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca", + "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8", + "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3", + "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad", + "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9", + "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc", + "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e" + ], + "version": "==5.4.1" + }, + "psutil": { + "hashes": [ + "sha256:1c19957883e0b93d081d41687089ad630e370e26dc49fd9df6951d6c891c4736", + "sha256:1c71b9716790e202a00ab0931a6d1e25db1aa1198bcacaea2f5329f75d257fff", + "sha256:3b7a4daf4223dae171a67a89314ac5ca0738e94064a78d99cfd751c55d05f315", + "sha256:3e19be3441134445347af3767fa7770137d472a484070840eee6653b94ac5576", + "sha256:6e265c8f3da00b015d24b842bfeb111f856b13d24f2c57036582568dc650d6c3", + "sha256:809c9cef0402e3e48b5a1dddc390a8a6ff58b15362ea5714494073fa46c3d293", + "sha256:b4d1b735bf5b120813f4c89db8ac22d89162c558cbd7fdd298866125fe906219", + "sha256:bbffac64cfd01c6bcf90eb1bedc6c80501c4dae8aef4ad6d6dd49f8f05f6fc5a", + "sha256:bfcea4f189177b2d2ce4a34b03c4ac32c5b4c22e21f5b093d9d315e6e253cd81" + ], + "version": "==5.4.8" + }, + "psycopg2": { + "hashes": [ + "sha256:10e391687b171878181e71736d0effe3772314a339d9ae30995ec8171a0c834e", + "sha256:1283f9d45e458c2dcb15ba89367923563f90ef636fe78ee22df75183484a0237", + "sha256:1a9c32e4d140bea225f9821d993b2e53c913e717ea97b851246aa9b300095d8f", + "sha256:1be6f2438d2b71fec7b07c3c0949dd321b04349c382907ea76b36120edec8300", + "sha256:20ca6f29e118b8dd7133e8708b3fba2881e70a4e0841f874ed23985b7201a076", + "sha256:227c115b3c1f65d61385e51ac690b91b584640aefb45bffacd4bd33d02ed7221", + "sha256:27959abe64ca1fc6d8cd11a71a1f421d8287831a3262bd4cacd43bbf43cc3c82", + "sha256:2b2daf1fe30a58300542aea679fd87d1e1c2afd36e7644837b7954fa2dbacb92", + "sha256:36e51a51f295fdf67bcf05e7b1877011a6b39e6622b0013fe31c5025241873a3", + "sha256:3992b9b914f2eb77dc07e8045d2ca979e491612808bc5c7cd68f307469acf9f6", + "sha256:39a11de2335ad45ececed43ab851d36a4c52843d756471b940804f301792781e", + "sha256:3c2afe9ef0d1649005e3ccf93c1aaccd6f8ee379530e763d3b3b77f406b7c0ae", + "sha256:3fb18e0e52807fe3a300dc1b5421aa492d5e759550918f597d61863419482535", + "sha256:55eab94de96ee9702f23283e9c8b03cfdb0001e2b14d5d2e1bd5ff8114b96b9f", + "sha256:7e95c0ab7e7e6e452586f35d4d8966b1e924c8dd2c23977e3ea4968770ff1d26", + "sha256:7f47514dbddf604f196fcfe5da955537f04691bef8124aff5632316a78d992b7", + "sha256:8345370356bb4bddf93acbcfd0357163dd6b09471937adcfb38a2fbb49bdce53", + "sha256:8bc6ecb220c0b88d3742042013129c817c44459795c97e9ce1bca70a3f37a53b", + "sha256:8df623f248be15d1725faf5f333791678775047f12f17a90d29b5d22573f5cdc", + "sha256:9645f1305e4268cc0fc88c823cd6c91de27c003e183c233a6a230e5e963039ee", + "sha256:a68719ed5be8373dd72c9e45d55f7a202285e05a2e392eaa8872a67ea47d7d20", + "sha256:aca0edf062ec09e954fdf0cc93d3a872362701210983a1442549e703aedec25d", + "sha256:b0dd2114d93d8f424bb8ae76e0dc540f104b70ca9163172c05e7700b1459d4c9", + "sha256:b2c09359d6802279efb9efb3f91a9c94567151baee95175f9b637ea628f35244", + "sha256:ca7bc37b1efb7cc25271bf10f398462ed975d95259af1406d38fcb268466e34f", + "sha256:e64235d9013ebf6319cb9654e08f5066112c34d8c4cc41186254ab9c3d6d5b9b", + "sha256:ec9be679c0065667503851141c31fa699e1cc69ded3ba8e5d3673dd5a6eb1370", + "sha256:eca00d0f91fcb44d88b12f1fd16ad138e38fa07debb79587e2b7ff1fe80d72b9", + "sha256:f256e807b8b2b45b6af60d7f2bb5194aab2f4acc861241c4d8ef942a55f5030d", + "sha256:fce7612a3bd6a7ba95799f88285653bf130bd7ca066b52674d5f850108b2aec0" + ], + "index": "pypi", + "version": "==2.7.6.1" + }, + "pycparser": { + "hashes": [ + "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + ], + "version": "==2.19" + }, + "pyjwt": { + "hashes": [ + "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e", + "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96" + ], + "version": "==1.7.1" + }, + "pyparsing": { + "hashes": [ + "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", + "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" + ], + "index": "pypi", + "version": "==2.3.1" + }, + "pypdf2": { + "hashes": [ + "sha256:e28f902f2f0a1603ea95ebe21dff311ef09be3d0f0ef29a3e44a932729564385" + ], + "version": "==1.26.0" + }, + "python-crontab": { + "hashes": [ + "sha256:91ce4b245ee5e5c117aa0b21b485bc43f2d80df854a36e922b707643f50d7923" + ], + "version": "==2.3.6" + }, + "python-dateutil": { + "hashes": [ + "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", + "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + ], + "version": "==2.7.5" + }, + "python-social-auth": { + "hashes": [ + "sha256:6986220df76934aee15c54938a13ebe370a1976e043af01fa3bea417f6722e74", + "sha256:8aac8531f7dd4d1b9af606654532fef4f615cb437774a7a1f8dcdebe89c17664", + "sha256:9aaad6f7bf83fd129620eadaab1e78e63200da61a5d8898fd1aa243686b36575" + ], + "index": "pypi", + "version": "==0.3.6" + }, + "python3-openid": { + "hashes": [ + "sha256:0086da6b6ef3161cfe50fb1ee5cceaf2cda1700019fda03c2c5c440ca6abe4fa", + "sha256:628d365d687e12da12d02c6691170f4451db28d6d68d050007e4a40065868502" + ], + "markers": "python_version >= '3.0'", + "version": "==3.1.0" + }, + "pytz": { + "hashes": [ + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + ], + "version": "==2018.9" + }, + "pyyaml": { + "hashes": [ + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + ], + "version": "==3.13" + }, + "raven": { + "hashes": [ + "sha256:3fa6de6efa2493a7c827472e984ce9b020797d0da16f1db67197bcc23c8fae54", + "sha256:44a13f87670836e153951af9a3c80405d36b43097db869a36e92809673692ce4" + ], + "index": "pypi", + "version": "==6.10.0" + }, + "redis": { + "hashes": [ + "sha256:8a1900a9f2a0a44ecf6e8b5eb3e967a9909dfed219ad66df094f27f7d6f330fb", + "sha256:a22ca993cea2962dbb588f9f30d0015ac4afcc45bee27d3978c0dbe9e97c6c0f" + ], + "index": "pypi", + "version": "==2.10.6" + }, + "reportlab": { + "hashes": [ + "sha256:069f684cd0aaa518a27dc9124aed29cee8998e21ddf19604e53214ec8462bdd7", + "sha256:09b68ec01d86b4b120456b3f3202570ec96f57624e3a4fc36f3829323391daa4", + "sha256:0c32be9a406172c29ea20ff55a709ccac1e7fb09f15aba67cb7b455fd1d3dbe0", + "sha256:233196cf25e97cfe7c452524ea29d9a4909f1cb66599299233be1efaaaa7a7a3", + "sha256:2b5e4533f3e5b962835a5ce44467e66d1ecc822761d1b508077b5087a06be338", + "sha256:2e860bcdace5a558356802a92ae8658d7e5fdaa00ded82e83a3f2987c562cb66", + "sha256:3546029e63a9a9dc24ee38959eb417678c2425b96cd27b31e09e216dafc94666", + "sha256:4452b93f9c73b6b70311e7d69082d64da81b38e91bfb4766397630092e6da6fd", + "sha256:528c74a1c6527d1859c2c7a64a94a1cba485b00175162ea23699ae58a1e94939", + "sha256:6116e750f98018febc08dfee6df20446cf954adbcfa378d2c703d56c8864aff3", + "sha256:6b2b3580c647d75ef129172cb3da648cdb24566987b0b59c5ebb80ab770748d6", + "sha256:727b5f2bed08552d143fc99649b1863c773729f580a416844f9d9967bb0a1ae8", + "sha256:74c24a3ec0a3d4f8acb13a07192f45bdb54a1cc3c2286241677e7e8bcd5011fa", + "sha256:98ccd2f8b4f8636db05f3f14db0b471ad6bb4b66ae0dc9052c4822b3bd5d6a7d", + "sha256:a5905aa567946bc938b489a7249c7890c3fd3c9b7b5680dece5bc551c2ddbe0d", + "sha256:acbb7f676b8586b770719e9683eda951fdb38eb7970d46fcbf3cdda88d912a64", + "sha256:b5e30f865add48cf880f1c363eb505b97f2f7baaa88c155f87a335a76515a3e5", + "sha256:be2a7c33a2c28bbd3f453ffe4f0e5200b88c803a097f4cf52d69c6b53fad7a8f", + "sha256:c356bb600f59ac64955813d6497a08bfd5d0c451cb5829b61e3913d0ac084e26", + "sha256:c7ec4ae2393beab584921b1287a04e94fd98c28315e348362d89b85f4b464546", + "sha256:d476edc831bb3e9ebd04d1403abaf3ea57b3e4c2276c91a54fdfb6efbd3f9d97", + "sha256:db059e1a0691c872784062421ec51848539eb4f5210142682e61059a5ca7cc55", + "sha256:dd423a6753509ab14a0ac1b5be39d219c8f8d3781cce3deb4f45eda31969b5e8", + "sha256:ed9b7c0d71ce6fe2b31c6cde530ad8238632b876a5d599218739bda142a77f7c", + "sha256:f0a2465af4006f97b05e1f1546d67d3a3213d414894bf28be7f87f550a7f4a55", + "sha256:f20bfe26e57e8e1f575a9e0325be04dd3562db9f247ffdd73b5d4df6dec53bc2", + "sha256:f3463f2cb40a1b515ac0133ba859eca58f53b56760da9abb27ed684c565f853c", + "sha256:facc3c9748ab1525fb8401a1223bce4f24f0d6aa1a9db86c55db75777ccf40f9" + ], + "version": "==3.5.13" + }, + "requests": { + "hashes": [ + "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", + "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + ], + "version": "==2.21.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:bd6533330e8748e94bf0b214775fed487d309b8b8fe823dc45641ebcd9a32f57", + "sha256:d3ed0c8f2e3bbc6b344fa63d6f933745ab394469da38db16bdddb461c7e25140" + ], + "version": "==1.2.0" + }, + "rfc3987": { + "hashes": [ + "sha256:10702b1e51e5658843460b189b185c0366d2cf4cff716f13111b0ea9fd2dce53", + "sha256:d3c4d257a560d544e9826b38bc81db676890c79ab9d7ac92b39c7a253d5ca733" + ], + "version": "==1.3.8" + }, + "ruamel.yaml": { + "hashes": [ + "sha256:3858f420b03030f99da44414ff8275a95eb7a6b5613764dd520398fb63951822", + "sha256:47982ea36529d971c453105ead01788161326bb5349d2aea900da6c0e5f628b5", + "sha256:527b7978560bc79b5f71b08d8db1ab16d367a08bdf1c2790b1ffb2fac94e46ae", + "sha256:65c96f9e0a8117be90cd8e23fc4e1d2c94fa410f4364bf70a97aa3cc4e4f4769", + "sha256:7a1ab9228c48f4741b5d07961e99e898e88afc040343b31b75e1dc1b3f8cee7c", + "sha256:87c60bd6b282f41a0403df5d59ec1fb1876311e84f5609ada47f17f64406e4d0", + "sha256:91f93c1938867551e554ea295ef91f84720a68b711d37b9f7d442fd3903082da", + "sha256:9523308cd0b071f0f8b631ec4f310eb58b3e2b4adbd14a2661783e2c5e8e1fdc", + "sha256:97cfa9bca4980aa9a77788fe9fbed178bcf5556dd2e917f52fda70ce7bb38a95", + "sha256:a21e26cf0143d22d9743d23b5531f66385aaf3fb54641782b20c6139239a8a93", + "sha256:a5167a1b098c86d1b1c9f0d73b7c65e70876d54a11fb1ada4586ba557d2fe165", + "sha256:a889dc3d6cffb64ca89fac053455b7a778f922b65843263023e998c0fcce001e", + "sha256:a925760fa1eb8dece3e07ee32485da8d5253cfcd78df25938371a5f5acdaa8a4", + "sha256:a92fd8e32d824392c0cec96a77e374bb77ceda4b99b1d18c776631e18fc54ffe", + "sha256:b20e3130b4b5b210365d6760b7d3c87cc9c40e456fa14049f9257bc62cf0d2c9", + "sha256:cb21f6bad6eade16868efc86fe1bb3e7a3d61137af2bf064dd1e7ed0d629ca9c", + "sha256:ccb1a0860a602d83898dd71280db142a3502702be3976ffc35eef9eb19585169", + "sha256:d70eec8bd287798e7905d57d503b1091c8424ba736e287b75f39f1b5a0235d71", + "sha256:d8a39781c49a892dd0f936d472d850a9aa163205475ad6c90a0f4d0c4d90ee30", + "sha256:d98b3d421eebf7e10311ab12f41c5b0353e7cae1cc78f51312e24f569d593de0", + "sha256:e67ea0cf80682e539707fcd8811b7369d8b97b1b48b1d7b16e21cd7f6c2c2e40", + "sha256:feec97614776442b4dd5029eb16e15f5e582ffc5cf534cba5eefd07062e11eec" + ], + "version": "==0.15.86" + }, + "six": { + "hashes": [ + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + ], + "version": "==1.12.0" + }, + "social-auth-app-django": { + "hashes": [ + "sha256:6d0dd18c2d9e71ca545097d57b44d26f59e624a12833078e8e52f91baf849778", + "sha256:9237e3d7b6f6f59494c3b02e0cce6efc69c9d33ad9d1a064e3b2318bcbe89ae3", + "sha256:f151396e5b16e2eee12cd2e211004257826ece24fc4ae97a147df386c1cd7082" + ], + "index": "pypi", + "version": "==3.1.0" + }, + "social-auth-core": { + "hashes": [ + "sha256:3584a6b96b5c505bb2d2a5c35a9f8656addd895bfa64c58f9c40d4e3d824ea26", + "sha256:54eb683eeee677a45e4e544995b0c62a88d705ae5d9509256187f8d6a943a32a", + "sha256:d47c4f48484847faf043e975ec07300be84d64bfcf8268029e2383759222b609" + ], + "version": "==3.0.0" + }, + "sqlparse": { + "hashes": [ + "sha256:ce028444cfab83be538752a2ffdb56bc417b7784ff35bb9a3062413717807dec", + "sha256:d9cf190f51cbb26da0412247dfe4fb5f4098edb73db84e02f9fc21fdca31fed4" + ], + "index": "pypi", + "version": "==0.2.4" + }, + "strict-rfc3339": { + "hashes": [ + "sha256:5cad17bedfc3af57b399db0fed32771f18fc54bbd917e85546088607ac5e1277" + ], + "version": "==0.7" + }, + "swagger-spec-validator": { + "hashes": [ + "sha256:57e29feb3aa921a9fb98bd70af148746b27c77d3207266f5571cebcce211e685", + "sha256:62ef22eca3f429d93fddda5d793d2a1a9057d3732e7a14606e641805326ae4a6" + ], + "version": "==2.4.3" + }, + "unicodecsv": { + "hashes": [ + "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc" + ], + "version": "==0.14.1" + }, + "uritemplate": { + "hashes": [ + "sha256:01c69f4fe8ed503b2951bef85d996a9d22434d2431584b5b107b2981ff416fbd", + "sha256:1b9c467a940ce9fb9f50df819e8ddd14696f89b9a8cc87ac77952ba416e0a8fd", + "sha256:c02643cebe23fc8adb5e6becffe201185bf06c40bda5c0b4028a93f1527d011d" + ], + "version": "==3.0.0" + }, + "urllib3": { + "hashes": [ + "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", + "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + ], + "version": "==1.24.1" + }, + "validate-email": { + "hashes": [ + "sha256:784719dc5f780be319cdd185dc85dd93afebdb6ebb943811bc4c7c5f9c72aeaf" + ], + "version": "==1.3" + }, + "vine": { + "hashes": [ + "sha256:3cd505dcf980223cfaf13423d371f2e7ff99247e38d5985a01ec8264e4f2aca1", + "sha256:ee4813e915d0e1a54e5c1963fde0855337f82655678540a6bc5996bca4165f76" + ], + "version": "==1.2.0" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" + }, + "whitenoise": { + "hashes": [ + "sha256:118ab3e5f815d380171b100b05b76de2a07612f422368a201a9ffdeefb2251c1", + "sha256:42133ddd5229eeb6a0c9899496bdbe56c292394bf8666da77deeb27454c0456a" + ], + "index": "pypi", + "version": "==4.1.2" + }, + "xhtml2pdf": { + "hashes": [ + "sha256:86a37e78d7a8d8bb2761746c3d559e12284d92c4d531b3a8a0f8fd632b436f82" + ], + "index": "pypi", + "version": "==0.2.3" + }, + "xlrd": { + "hashes": [ + "sha256:546eb36cee8db40c3eaa46c351e67ffee6eeb5fa2650b71bc4c758a29a1b29b2", + "sha256:e551fb498759fa3a5384a94ccd4c3c02eb7c00ea424426e212ac0c57be9dfbde" + ], + "version": "==1.2.0" + }, + "xlwt": { + "hashes": [ + "sha256:a082260524678ba48a297d922cc385f58278b8aa68741596a87de01a9c628b2e", + "sha256:c59912717a9b28f1a3c2a98fd60741014b06b043936dcecbc113eaaada156c88" + ], + "version": "==1.3.0" + } + }, + "develop": { + "appnope": { + "hashes": [ + "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0", + "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71" + ], + "markers": "sys_platform == 'darwin'", + "version": "==0.1.0" + }, + "aspy.yaml": { + "hashes": [ + "sha256:04d26279513618f1024e1aba46471db870b3b33aef204c2d09bcf93bea9ba13f", + "sha256:0a77e23fafe7b242068ffc0252cee130d3e509040908fc678d9d1060e7494baa" + ], + "version": "==1.1.1" + }, + "atomicwrites": { + "hashes": [ + "sha256:0312ad34fcad8fac3704d441f7b317e50af620823353ec657a53e981f92920c0", + "sha256:ec9ae8adaae229e4f8446952d204a3e4b5fdd2d099f9be3aaf556120135fb3ee" + ], + "version": "==1.2.1" + }, + "attrs": { + "hashes": [ + "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", + "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + ], + "version": "==18.2.0" + }, + "backcall": { + "hashes": [ + "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", + "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2" + ], + "version": "==0.1.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858", + "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348", + "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718" + ], + "version": "==4.7.1" + }, + "bumpversion": { + "hashes": [ + "sha256:6744c873dd7aafc24453d8b6a1a0d6d109faf63cd0cd19cb78fd46e74932c77e", + "sha256:6753d9ff3552013e2130f7bc03c1007e24473b4835952679653fb132367bdd57" + ], + "index": "pypi", + "version": "==0.5.3" + }, + "certifi": { + "hashes": [ + "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", + "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + ], + "version": "==2018.11.29" + }, + "cfgv": { + "hashes": [ + "sha256:39d9055c47e3932908fe25abd5807e21dc002630db01c7a5f05738d027e2b706", + "sha256:41d22dd864c474f919ecb88900000d2410d640315f75bdb79b3abf9347089641" + ], + "version": "==1.4.0" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, + "check-manifest": { + "hashes": [ + "sha256:44e3cf4b0833a55460046bf7a3600eaadbcae5e9d13baf0c9d9789dd5c2c6452", + "sha256:728edbaccadaa86db0b8f876afac1fb90bce9452234753dfe4ef8fe786dcc2f1" + ], + "index": "pypi", + "version": "==0.37" + }, + "coverage": { + "hashes": [ + "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", + "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", + "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", + "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", + "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", + "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", + "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", + "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", + "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", + "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", + "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", + "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", + "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", + "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", + "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", + "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", + "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", + "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", + "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", + "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", + "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", + "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", + "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", + "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", + "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", + "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", + "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", + "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", + "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", + "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", + "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" + ], + "version": "==4.5.2" + }, + "decorator": { + "hashes": [ + "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", + "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + ], + "version": "==4.3.0" + }, + "django-extensions": { + "hashes": [ + "sha256:8317a3fe479b1ba3e3a04ecf33fb8d6ccf09bb18f30eab64e34c40a593741d26", + "sha256:a76a61566f1c8d96acc7bcf765080b8e91367a25a2c6f8c5bddd574493839180" + ], + "index": "pypi", + "version": "==2.1.4" + }, + "django-webtest": { + "hashes": [ + "sha256:7b683d87cd9be13599af44b81bd44f97b49978b4e69cf4b92059c393f64307c1", + "sha256:f3cd35d06ec01610e1a5ec8917679ad9a53f815d85d1e41e385746f1e823869d" + ], + "index": "pypi", + "version": "==1.9.4" + }, + "djangorestframework": { + "hashes": [ + "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", + "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" + ], + "version": "==3.9.1" + }, + "docker": { + "hashes": [ + "sha256:2840ffb9dc3ef6d00876bde476690278ab13fa1f8ba9127ef855ac33d00c3152", + "sha256:5831256da3477723362bc71a8df07b8cd8493e4a4a60cebd45580483edbe48ae" + ], + "index": "pypi", + "version": "==3.7.0" + }, + "docker-pycreds": { + "hashes": [ + "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4", + "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49" + ], + "version": "==0.4.0" + }, + "drf-api-checker": { + "hashes": [ + "sha256:db4045afe4585120ab298464c37887d8567a0ecadbe8eaa6a0e348c364d745bb" + ], + "index": "pypi", + "version": "==0.4.1" + }, + "factory-boy": { + "hashes": [ + "sha256:6f25cc4761ac109efd503f096e2ad99421b1159f01a29dbb917359dcd68e08ca", + "sha256:d552cb872b310ae78bd7429bf318e42e1e903b1a109e899a523293dfa762ea4f" + ], + "index": "pypi", + "version": "==2.11.1" + }, + "faker": { + "hashes": [ + "sha256:228419b0a788a7ac867ebfafdd438461559ab1a0975edb607300852d9acaa78d", + "sha256:52a3dcc6a565b15fe1c95090321756d5a8a7c1caf5ab3df2f573ed70936ff518" + ], + "version": "==1.0.1" + }, + "fancycompleter": { + "hashes": [ + "sha256:d2522f1f3512371f295379c4c0d1962de06762eb586c199620a2a5d423539b12" + ], + "version": "==0.8" + }, + "flake8": { + "hashes": [ + "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", + "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + ], + "index": "pypi", + "version": "==3.6.0" + }, + "freezegun": { + "hashes": [ + "sha256:6cb82b276f83f2acce67f121dc2656f4df26c71e32238334eb071170b892a278", + "sha256:e839b43bfbe8158b4d62bb97e6313d39f3586daf48e1314fb1083d2ef17700da" + ], + "index": "pypi", + "version": "==0.3.11" + }, + "identify": { + "hashes": [ + "sha256:0b2bb67c857b8048d979caeef4d20a3dfdb0337f154d16a8f9e31cd6e04ae554", + "sha256:113622f73da90a723e9baf764553f807051ad80c3a9e8a7edd15aa4309861f4d" + ], + "version": "==1.2.0" + }, + "idna": { + "hashes": [ + "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", + "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" + ], + "version": "==2.8" + }, + "importlib-metadata": { + "hashes": [ + "sha256:a17ce1a8c7bff1e8674cb12c992375d8d0800c9190177ecf0ad93e0097224095", + "sha256:b50191ead8c70adfa12495fba19ce6d75f2e0275c14c5a7beb653d6799b512bd" + ], + "version": "==0.8" + }, + "importlib-resources": { + "hashes": [ + "sha256:6e2783b2538bd5a14678284a3962b0660c715e5a0f10243fd5e00a4b5974f50b", + "sha256:d3279fd0f6f847cced9f7acc19bd3e5df54d34f93a2e7bb5f238f81545787078" + ], + "markers": "python_version < '3.7'", + "version": "==1.0.2" + }, + "ipython": { + "hashes": [ + "sha256:6a9496209b76463f1dec126ab928919aaf1f55b38beb9219af3fe202f6bbdd12", + "sha256:f69932b1e806b38a7818d9a1e918e5821b685715040b48e59c657b3c7961b742" + ], + "index": "pypi", + "version": "==7.2.0" + }, + "ipython-genutils": { + "hashes": [ + "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", + "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" + ], + "version": "==0.2.0" + }, + "isort": { + "hashes": [ + "sha256:1153601da39a25b14ddc54955dbbacbb6b2d19135386699e2ad58517953b34af", + "sha256:b9c40e9750f3d77e6e4d441d8b0266cf555e7cdabdcff33c4fd06366ca761ef8", + "sha256:ec9ef8f4a9bc6f71eec99e1806bfa2de401650d996c59330782b89a5555c1497" + ], + "index": "pypi", + "version": "==4.3.4" + }, + "jedi": { + "hashes": [ + "sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd", + "sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191" + ], + "version": "==0.13.2" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "more-itertools": { + "hashes": [ + "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", + "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc", + "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9" + ], + "version": "==5.0.0" + }, + "multidict": { + "hashes": [ + "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f", + "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3", + "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef", + "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b", + "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73", + "sha256:148ff60e0fffa2f5fad2eb25aae7bef23d8f3b8bdaf947a65cdbe84a978092bc", + "sha256:1d1c77013a259971a72ddaa83b9f42c80a93ff12df6a4723be99d858fa30bee3", + "sha256:1d48bc124a6b7a55006d97917f695effa9725d05abe8ee78fd60d6588b8344cd", + "sha256:31dfa2fc323097f8ad7acd41aa38d7c614dd1960ac6681745b6da124093dc351", + "sha256:34f82db7f80c49f38b032c5abb605c458bac997a6c3142e0d6c130be6fb2b941", + "sha256:3d5dd8e5998fb4ace04789d1d008e2bb532de501218519d70bb672c4c5a2fc5d", + "sha256:4a6ae52bd3ee41ee0f3acf4c60ceb3f44e0e3bc52ab7da1c2b2aa6703363a3d1", + "sha256:4b02a3b2a2f01d0490dd39321c74273fed0568568ea0e7ea23e02bd1fb10a10b", + "sha256:4b843f8e1dd6a3195679d9838eb4670222e8b8d01bc36c9894d6c3538316fa0a", + "sha256:5de53a28f40ef3c4fd57aeab6b590c2c663de87a5af76136ced519923d3efbb3", + "sha256:61b2b33ede821b94fa99ce0b09c9ece049c7067a33b279f343adfe35108a4ea7", + "sha256:6a3a9b0f45fd75dc05d8e93dc21b18fc1670135ec9544d1ad4acbcf6b86781d0", + "sha256:76ad8e4c69dadbb31bad17c16baee61c0d1a4a73bed2590b741b2e1a46d3edd0", + "sha256:7ba19b777dc00194d1b473180d4ca89a054dd18de27d0ee2e42a103ec9b7d014", + "sha256:7c1b7eab7a49aa96f3db1f716f0113a8a2e93c7375dd3d5d21c4941f1405c9c5", + "sha256:7fc0eee3046041387cbace9314926aa48b681202f8897f8bff3809967a049036", + "sha256:8ccd1c5fff1aa1427100ce188557fc31f1e0a383ad8ec42c559aabd4ff08802d", + "sha256:8e08dd76de80539d613654915a2f5196dbccc67448df291e69a88712ea21e24a", + "sha256:c18498c50c59263841862ea0501da9f2b3659c00db54abfbf823a80787fde8ce", + "sha256:c49db89d602c24928e68c0d510f4fcf8989d77defd01c973d6cbe27e684833b1", + "sha256:ce20044d0317649ddbb4e54dab3c1bcc7483c78c27d3f58ab3d0c7e6bc60d26a", + "sha256:d1071414dd06ca2eafa90c85a079169bfeb0e5f57fd0b45d44c092546fcd6fd9", + "sha256:d3be11ac43ab1a3e979dac80843b42226d5d3cccd3986f2e03152720a4297cd7", + "sha256:db603a1c235d110c860d5f39988ebc8218ee028f07a7cbc056ba6424372ca31b" + ], + "version": "==4.5.2" + }, + "nodeenv": { + "hashes": [ + "sha256:ad8259494cf1c9034539f6cced78a1da4840a4b157e23640bc4a0c0546b0cb7a" + ], + "version": "==1.3.3" + }, + "parso": { + "hashes": [ + "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", + "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + ], + "version": "==0.3.1" + }, + "pdbpp": { + "hashes": [ + "sha256:535085916fcfb768690ba0aeab2967c2a2163a0a60e5b703776846873e171399" + ], + "index": "pypi", + "version": "==0.9.3" + }, + "pexpect": { + "hashes": [ + "sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba", + "sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b" + ], + "markers": "sys_platform != 'win32'", + "version": "==4.6.0" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "pluggy": { + "hashes": [ + "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", + "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" + ], + "version": "==0.8.1" + }, + "pre-commit": { + "hashes": [ + "sha256:2cb7a588fdc78e4ec4e624932765e65d285159f4b3425121106cbd9060e40e04", + "sha256:74ee5779a17ef540efdf9a832911fe9057b1bb57d5d0152eace6534a228a863b" + ], + "index": "pypi", + "version": "==1.14.2" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", + "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", + "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" + ], + "version": "==2.0.7" + }, + "ptyprocess": { + "hashes": [ + "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0", + "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f" + ], + "version": "==0.6.0" + }, + "py": { + "hashes": [ + "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", + "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" + ], + "version": "==1.7.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", + "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" + ], + "version": "==2.4.0" + }, + "pyflakes": { + "hashes": [ + "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", + "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" + ], + "version": "==2.0.0" + }, + "pygments": { + "hashes": [ + "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", + "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" + ], + "version": "==2.3.1" + }, + "pytest": { + "hashes": [ + "sha256:41568ea7ecb4a68d7f63837cf65b92ce8d0105e43196ff2b26622995bb3dc4b2", + "sha256:c3c573a29d7c9547fb90217ece8a8843aa0c1328a797e200290dc3d0b4b823be" + ], + "index": "pypi", + "version": "==4.1.1" + }, + "pytest-cov": { + "hashes": [ + "sha256:0ab664b25c6aa9716cbf203b17ddb301932383046082c081b9848a0edf5add33", + "sha256:230ef817450ab0699c6cc3c9c8f7a829c34674456f2ed8df1fe1d39780f7c87f" + ], + "version": "==2.6.1" + }, + "pytest-cover": { + "hashes": [ + "sha256:578249955eb3b5f3991209df6e532bb770b647743b7392d3d97698dc02f39ebb", + "sha256:5bdb6c1cc3dd75583bb7bc2c57f5e1034a1bfcb79d27c71aceb0b16af981dbf4" + ], + "version": "==3.0.0" + }, + "pytest-coverage": { + "hashes": [ + "sha256:db6af2cbd7e458c7c9fd2b4207cee75258243c8a81cad31a7ee8cfad5be93c05", + "sha256:dedd084c5e74d8e669355325916dc011539b190355021b037242514dee546368" + ], + "index": "pypi", + "version": "==0.0" + }, + "pytest-django": { + "hashes": [ + "sha256:1a5d33be930e3172fa238643a380414dc369fe8fa4b3c3de25e59ed142950736", + "sha256:e88e471d3d0f9acfb6293bb03d0ee8a33ed978734e92ea6b5312163a6c9e87cc" + ], + "index": "pypi", + "version": "==3.4.5" + }, + "pytest-echo": { + "hashes": [ + "sha256:919f2c3d79a8537339266b182feb8a0670510873dd1158ab4bdae8217d31de18" + ], + "index": "pypi", + "version": "==1.6.0" + }, + "pytest-ignore-flaky": { + "hashes": [ + "sha256:29b3099cf4d424fd553d39940f7025acf6847ecbba292649a0dc764dfbb7d59e", + "sha256:fe33a1f725a78e1f92077bfb80926602622bc050a0a71b61c3f1ca7089afb779" + ], + "index": "pypi", + "version": "==1.0.0" + }, + "pytest-pythonpath": { + "hashes": [ + "sha256:63fc546ace7d2c845c1ee289e8f7a6362c2b6bae497d10c716e58e253e801d62" + ], + "index": "pypi", + "version": "==0.7.3" + }, + "python-dateutil": { + "hashes": [ + "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", + "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + ], + "version": "==2.7.5" + }, + "pytz": { + "hashes": [ + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + ], + "version": "==2018.9" + }, + "pyyaml": { + "hashes": [ + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" + ], + "version": "==3.13" + }, + "requests": { + "hashes": [ + "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", + "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + ], + "version": "==2.21.0" + }, + "six": { + "hashes": [ + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + ], + "version": "==1.12.0" + }, + "soupsieve": { + "hashes": [ + "sha256:10687fc53eeb3518e01a0ac84d3d711da623d3298a3039459d3f649927c4a270", + "sha256:b23a0d7da0247200fe83c67c34de9d7599ad404106367313d8e65e04174d0b4b" + ], + "version": "==1.7.2" + }, + "text-unidecode": { + "hashes": [ + "sha256:5a1375bb2ba7968740508ae38d92e1f889a0832913cb1c447d5e2046061a396d", + "sha256:801e38bd550b943563660a91de8d4b6fa5df60a542be9093f7abf819f86050cc" + ], + "version": "==1.2" + }, + "toml": { + "hashes": [ + "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", + "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + ], + "version": "==0.10.0" + }, + "traitlets": { + "hashes": [ + "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", + "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9" + ], + "version": "==4.3.2" + }, + "urllib3": { + "hashes": [ + "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", + "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + ], + "version": "==1.24.1" + }, + "vcrpy": { + "hashes": [ + "sha256:127e79cf7b569d071d1bd761b83f7b62b2ce2a2eb63ceca7aa67cba8f2602ea3", + "sha256:57be64aa8e9883a4117d0b15de28af62275c001abcdb00b6dc2d4406073d9a4f" + ], + "index": "pypi", + "version": "==2.0.1" + }, + "virtualenv": { + "hashes": [ + "sha256:34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", + "sha256:fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd" + ], + "version": "==16.2.0" + }, + "waitress": { + "hashes": [ + "sha256:8b8c8686f628a635b9747e3014a0ab19cf9cf95c5c36eb3331ae355a462ee602", + "sha256:e624c829656ffc99b33d661072b2814885ae92835cf835ee8ab283ddb7c915b9" + ], + "version": "==1.2.0" + }, + "wcwidth": { + "hashes": [ + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + ], + "version": "==0.1.7" + }, + "webob": { + "hashes": [ + "sha256:05aaab7975e0ee8af2026325d656e5ce14a71f1883c52276181821d6d5bf7086", + "sha256:36db8203c67023d68c1b00208a7bf55e3b10de2aa317555740add29c619de12b" + ], + "version": "==1.8.5" + }, + "websocket-client": { + "hashes": [ + "sha256:8c8bf2d4f800c3ed952df206b18c28f7070d9e3dcbd6ca6291127574f57ee786", + "sha256:e51562c91ddb8148e791f0155fdb01325d99bb52c4cdbb291aee7a3563fd0849" + ], + "version": "==0.54.0" + }, + "webtest": { + "hashes": [ + "sha256:4221020d502ff414c5fba83c1213985b83219cb1cc611fe58aa4feaf96b5e062", + "sha256:9f1e6faad0b732911793e4d6f54aede292b0c3ee0b3ef7afb2011ec4f4044cc8" + ], + "version": "==2.0.32" + }, + "wmctrl": { + "hashes": [ + "sha256:d806f65ac1554366b6e31d29d7be2e8893996c0acbb2824bbf2b1f49cf628a13" + ], + "version": "==0.3" + }, + "wrapt": { + "hashes": [ + "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533" + ], + "version": "==1.11.1" + }, + "yapf": { + "hashes": [ + "sha256:8aa7f9abdb97b4da4d3227306b88477982daafef0a96cc41639754ca31f46d55", + "sha256:f2df5891481f94ddadfbf8ae8ae499080752cfb06005a31bbb102f3012f8b944" + ], + "index": "pypi", + "version": "==0.25.0" + }, + "yarl": { + "hashes": [ + "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9", + "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f", + "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb", + "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320", + "sha256:5badb97dd0abf26623a9982cd448ff12cb39b8e4c94032ccdedf22ce01a64842", + "sha256:73f447d11b530d860ca1e6b582f947688286ad16ca42256413083d13f260b7a0", + "sha256:7ab825726f2940c16d92aaec7d204cfc34ac26c0040da727cf8ba87255a33829", + "sha256:b25de84a8c20540531526dfbb0e2d2b648c13fd5dd126728c496d7c3fea33310", + "sha256:c6e341f5a6562af74ba55205dbd56d248daf1b5748ec48a0200ba227bb9e33f4", + "sha256:c9bb7c249c4432cd47e75af3864bc02d26c9594f49c82e2a28624417f0ae63b8", + "sha256:e060906c0c585565c718d1c3841747b61c5439af2211e185f6739a9412dfbde1" + ], + "markers": "python_version >= '3.4'", + "version": "==1.3.0" + }, + "zipp": { + "hashes": [ + "sha256:55ca87266c38af6658b84db8cfb7343cdb0bf275f93c7afaea0d8e7a209c7478", + "sha256:682b3e1c62b7026afe24eadf6be579fb45fec54c07ea218bded8092af07a68c4" + ], + "version": "==0.3.3" + } + } +} diff --git a/src/etools_datamart/api/endpoints/common.py b/src/etools_datamart/api/endpoints/common.py index f06d7ee3b..7876e51d4 100644 --- a/src/etools_datamart/api/endpoints/common.py +++ b/src/etools_datamart/api/endpoints/common.py @@ -11,6 +11,7 @@ from rest_framework.decorators import action from rest_framework.exceptions import NotAuthenticated, PermissionDenied from rest_framework.response import Response +from strategy_field.utils import fqn from unicef_rest_framework.ds import DynamicSerializerFilter from unicef_rest_framework.filtering import SystemFilterBackend @@ -44,7 +45,17 @@ def updates(self, request, version): headers={'update-date': offset}) -class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin): +class AutoRegisterMetaClass(type): + registry = {} + + def __new__(mcs, class_name, bases, attrs): + new_class = super().__new__(mcs, class_name, bases, attrs) + mcs.registry[fqn(new_class)] = new_class + return new_class + + +class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin, + metaclass=AutoRegisterMetaClass): filter_backends = [CountryFilter, DatamartQueryStringFilterBackend, OrderingFilter, @@ -53,6 +64,7 @@ class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin): authentication_classes = URFReadOnlyModelViewSet.authentication_classes + (MedusaBasicAuthentication,) ordering_fields = ('id',) ordering = 'id' + family = 'datamart' def get_schema_fields(self): ret = [] @@ -133,6 +145,7 @@ class APIMultiTenantReadOnlyModelViewSet(APIReadOnlyModelViewSet): OrderingFilter, DynamicSerializerFilter, ] + family = 'etools' ordering_fields = ('id',) ordering = 'id' diff --git a/src/etools_datamart/api/endpoints/datamart/__init__.py b/src/etools_datamart/api/endpoints/datamart/__init__.py index f3954e5e4..7b8a552e1 100644 --- a/src/etools_datamart/api/endpoints/datamart/__init__.py +++ b/src/etools_datamart/api/endpoints/datamart/__init__.py @@ -1,7 +1,9 @@ # -*- coding: utf-8 -*- -from .pmpindicators import PMPIndicatorsViewSet # noqa -from .intervention import InterventionViewSet # noqa -from .famindicator import FAMIndicatorViewSet # noqa -from .user import UserStatsViewSet # noqa -from .hact import HACTViewSet # noqa -from .location import LocationViewSet # noqa +# flake8: noqa: F401 +from .pmpindicators import PMPIndicatorsViewSet +from .intervention import InterventionViewSet +from .famindicator import FAMIndicatorViewSet +from .user import UserStatsViewSet +from .hact import HACTViewSet +from .location import LocationViewSet +from .funds_reservation import FundsReservationViewSet diff --git a/src/etools_datamart/api/endpoints/datamart/funds_reservation.py b/src/etools_datamart/api/endpoints/datamart/funds_reservation.py new file mode 100644 index 000000000..7fa043126 --- /dev/null +++ b/src/etools_datamart/api/endpoints/datamart/funds_reservation.py @@ -0,0 +1,38 @@ +from django import forms + +from unicef_rest_framework.forms import DateRangePickerField + +from etools_datamart.api.endpoints.datamart.serializers import DataMartSerializer +from etools_datamart.apps.data import models + +from .. import common + + +class FundsReservationSerializer(DataMartSerializer): + class Meta(DataMartSerializer.Meta): + model = models.FundsReservation + exclude = None + fields = '__all__' + + +class FundsReservationFilterForm(forms.Form): + last_modify_date = DateRangePickerField(label='Modified between', + required=False) + + start_date = DateRangePickerField(label='Started between', + required=False) + submission_date = DateRangePickerField(label='Submitted between', + required=False) + + # document_type__in = Select2MultipleChoiceField(label='Document Type', + # choices=PartnersIntervention.INTERVENTION_TYPES, + # required=False) + + +class FundsReservationViewSet(common.DataMartViewSet): + serializer_class = FundsReservationSerializer + queryset = models.FundsReservation.objects.all() + filter_fields = ('vendor_code', 'fr_type', 'start_date') + + def get_querystringfilter_form(self, request, filter): + return FundsReservationFilterForm(request.GET, filter.form_prefix) diff --git a/src/etools_datamart/api/urls.py b/src/etools_datamart/api/urls.py index 46ae5d99f..687a027b3 100644 --- a/src/etools_datamart/api/urls.py +++ b/src/etools_datamart/api/urls.py @@ -8,7 +8,8 @@ class ReadOnlyRouter(APIReadOnlyRouter): - pass + def inspect(self): + pass router = ReadOnlyRouter() @@ -33,6 +34,7 @@ class ReadOnlyRouter(APIReadOnlyRouter): router.register(r'datamart/fam-indicators', endpoints.FAMIndicatorViewSet) router.register(r'datamart/user-stats', endpoints.UserStatsViewSet) router.register(r'datamart/hact', endpoints.HACTViewSet) +router.register(r'datamart/funds-reservation', endpoints.FundsReservationViewSet) router.register(r'system/monitor', endpoints.MonitorViewSet) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 73fac2d18..a0b8d0d05 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -179,7 +179,8 @@ def process(self, filters, values): err) from e def get_values(self, country, record, context): - ret = {} + ret = {'area_code': country.business_area_code} + for k, v in self.mapping.items(): if v == '__self__': try: diff --git a/src/etools_datamart/apps/data/management/commands/load.py b/src/etools_datamart/apps/data/management/commands/load.py index 559b47618..2972a15a6 100644 --- a/src/etools_datamart/apps/data/management/commands/load.py +++ b/src/etools_datamart/apps/data/management/commands/load.py @@ -32,6 +32,10 @@ def add_arguments(self, parser): '--unlock', action='store_true', help="Unlock all loaders.", ) + parser.add_argument( + '--no-deps', action='store_true', + help="Unlock all loaders.", + ) def notify(self, model, created, name, tpl=" {op} {model} `{name}`"): if self.verbosity > 2: @@ -56,6 +60,7 @@ def handle(self, *model_names, **options): if unlock: model.loader.load.unlock() res = model.loader.load(always_update=options['ignore_changes'], + ignore_dependencies=options['no_deps'], stdout=sys.stdout) self.stdout.write(f"{model_name:20}: " f" created: {res.created:<3}" diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 04a973d60..83ac55379 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -48,6 +48,51 @@ class Migration(migrations.Migration): 'ordering': ('month', 'country_name'), }, ), + migrations.CreateModel( + name='FundsReservation', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('country_name', models.CharField(db_index=True, max_length=100)), + ('schema_name', models.CharField(db_index=True, max_length=63)), + ('area_code', models.CharField(db_index=True, max_length=10)), + ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), + ('vendor_code', models.CharField(max_length=20)), + ('fr_number', models.CharField(max_length=20)), + ('document_date', models.DateField(blank=True, null=True)), + ('fr_type', models.CharField(max_length=50)), + ('currency', models.CharField(max_length=50)), + ('document_text', models.CharField(max_length=255)), + ('start_date', models.DateField(blank=True, null=True)), + ('end_date', models.DateField(blank=True, null=True)), + ('actual_amt', models.DecimalField(decimal_places=2, max_digits=20)), + ('intervention_amt', models.DecimalField(decimal_places=2, max_digits=20)), + ('outstanding_amt', models.DecimalField(decimal_places=2, max_digits=20)), + ('total_amt', models.DecimalField(decimal_places=2, max_digits=20)), + ('actual_amt_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('outstanding_amt_local', models.DecimalField(decimal_places=2, max_digits=20)), + ('total_amt_local', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('multi_curr_flag', models.BooleanField()), + ('fr_ref_number', models.CharField(max_length=30)), + ('line_item', models.SmallIntegerField()), + ('wbs', models.CharField(max_length=30)), + ('grant_number', models.CharField(max_length=20)), + ('fund', models.CharField(max_length=10)), + ('overall_amount', models.DecimalField(decimal_places=2, max_digits=20)), + ('overall_amount_dc', models.DecimalField(decimal_places=2, max_digits=20)), + ('due_date', models.DateField(blank=True, null=True)), + ('line_item_text', models.CharField(max_length=255)), + ('created', models.DateTimeField()), + ('modified', models.DateTimeField()), + ('donor', models.CharField(blank=True, max_length=256, null=True)), + ('donor_code', models.CharField(blank=True, max_length=30, null=True)), + ('source_id', models.IntegerField()), + ('source_intervention_id', models.IntegerField()), + ], + options={ + 'verbose_name': 'Funds Reservation', + }, + ), migrations.CreateModel( name='GatewayType', fields=[ @@ -138,7 +183,7 @@ class Migration(migrations.Migration): ('total', models.DecimalField(decimal_places=2, max_digits=20)), ('total_local', models.DecimalField(decimal_places=2, max_digits=20)), ('currency', models.CharField(max_length=4)), - ('intervention_id', models.IntegerField(null=True)), + ('intervention_id', models.IntegerField()), ('agreement_id', models.IntegerField(null=True)), ('country_programme_id', models.IntegerField(null=True)), ('unicef_signatory_id', models.IntegerField(null=True)), @@ -242,13 +287,22 @@ class Migration(migrations.Migration): name='userstats', unique_together={('country_name', 'month')}, ), + migrations.AlterUniqueTogether( + name='intervention', + unique_together={('schema_name', 'intervention_id')}, + ), migrations.AlterUniqueTogether( name='hact', unique_together={('year', 'country_name')}, ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, + unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, + ), + migrations.AddField( + model_name='fundsreservation', + name='intervention', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='funds', to='data.Intervention'), ), migrations.AlterUniqueTogether( name='famindicator', @@ -258,4 +312,8 @@ class Migration(migrations.Migration): name='location', unique_together={('schema_name', 'source_id')}, ), + migrations.AlterUniqueTogether( + name='fundsreservation', + unique_together={('schema_name', 'source_id'), ('schema_name', 'fr_number')}, + ), ] diff --git a/src/etools_datamart/apps/data/models/__init__.py b/src/etools_datamart/apps/data/models/__init__.py index 727ca8012..056b73ff6 100644 --- a/src/etools_datamart/apps/data/models/__init__.py +++ b/src/etools_datamart/apps/data/models/__init__.py @@ -4,3 +4,4 @@ from .user import UserStats # noqa from .hact import HACT # noqa from .location import GatewayType, Location # noqa +from .funds_reservation import FundsReservation # noqa diff --git a/src/etools_datamart/apps/data/models/funds_reservation.py b/src/etools_datamart/apps/data/models/funds_reservation.py new file mode 100644 index 000000000..b60fc7caa --- /dev/null +++ b/src/etools_datamart/apps/data/models/funds_reservation.py @@ -0,0 +1,89 @@ +from django.db import models + +from etools_datamart.apps.data.models import Intervention +from etools_datamart.apps.data.models.base import DataMartModel +from etools_datamart.apps.etools.models import FundsFundsreservationitem + + +class FundsReservation(DataMartModel): + # header + vendor_code = models.CharField(max_length=20) + fr_number = models.CharField(max_length=20) + document_date = models.DateField(blank=True, null=True) + fr_type = models.CharField(max_length=50) + currency = models.CharField(max_length=50) + document_text = models.CharField(max_length=255) + start_date = models.DateField(blank=True, null=True) + end_date = models.DateField(blank=True, null=True) + actual_amt = models.DecimalField(max_digits=20, decimal_places=2) + intervention_amt = models.DecimalField(max_digits=20, decimal_places=2) + outstanding_amt = models.DecimalField(max_digits=20, decimal_places=2) + total_amt = models.DecimalField(max_digits=20, decimal_places=2) + # created = models.DateTimeField() + # modified = models.DateTimeField() + actual_amt_local = models.DecimalField(max_digits=20, decimal_places=2) + outstanding_amt_local = models.DecimalField(max_digits=20, decimal_places=2) + total_amt_local = models.DecimalField(max_digits=20, decimal_places=2, + blank=True, null=True) + multi_curr_flag = models.BooleanField() + + # item + fr_ref_number = models.CharField(max_length=30) + line_item = models.SmallIntegerField() + wbs = models.CharField(max_length=30) + grant_number = models.CharField(max_length=20) + fund = models.CharField(max_length=10) + overall_amount = models.DecimalField(max_digits=20, decimal_places=2) + overall_amount_dc = models.DecimalField(max_digits=20, decimal_places=2) + due_date = models.DateField(blank=True, null=True) + line_item_text = models.CharField(max_length=255) + created = models.DateTimeField() + modified = models.DateTimeField() + donor = models.CharField(max_length=256, blank=True, null=True) + donor_code = models.CharField(max_length=30, blank=True, null=True) + + # extras + + # internals + source_id = models.IntegerField() + source_intervention_id = models.IntegerField() + + intervention = models.ForeignKey(Intervention, models.DO_NOTHING, + related_name='funds', blank=True, null=True) + + class Meta: + unique_together = (('schema_name', 'source_id'), + ('schema_name', 'fr_number')) + verbose_name = "Funds Reservation" + + class Options: + depends = (Intervention,) + source = FundsFundsreservationitem + queryset = lambda: FundsFundsreservationitem.objects.select_related('fund_reservation') + key = lambda country, record: dict(country_name=country.name, + schema_name=country.schema_name, + fr_number=record.fund_reservation.fr_number) + + mapping = dict(vendor_code='fund_reservation.vendor_code', + fr_number='fund_reservation.fr_number', + document_date='fund_reservation.document_date', + fr_type='fund_reservation.fr_type', + currency='fund_reservation.currency', + document_text='fund_reservation.document_text', + start_date='fund_reservation.start_date', + end_date='fund_reservation.end_date', + actual_amt='fund_reservation.actual_amt', + intervention_amt='fund_reservation.intervention_amt', + outstanding_amt='fund_reservation.outstanding_amt', + total_amt='fund_reservation.total_amt', + actual_amt_local='fund_reservation.actual_amt_local', + outstanding_amt_local='fund_reservation.outstanding_amt_local', + multi_curr_flag='fund_reservation.multi_curr_flag', + + source_id='id', + source_intervention_id='fund_reservation.id', + intervention=lambda country, record: Intervention.objects.filter( + schema_name=country.schema_name, + intervention_id=record.fund_reservation.id).first(), + + ) diff --git a/src/etools_datamart/apps/data/models/intervention.py b/src/etools_datamart/apps/data/models/intervention.py index cc241ea94..b18210573 100644 --- a/src/etools_datamart/apps/data/models/intervention.py +++ b/src/etools_datamart/apps/data/models/intervention.py @@ -62,7 +62,7 @@ class Intervention(DataMartModel): total_local = models.DecimalField(max_digits=20, decimal_places=2) currency = models.CharField(max_length=4) - intervention_id = models.IntegerField(null=True) + intervention_id = models.IntegerField(null=False) agreement_id = models.IntegerField(null=True) country_programme_id = models.IntegerField(null=True) unicef_signatory_id = models.IntegerField(null=True) @@ -70,6 +70,7 @@ class Intervention(DataMartModel): class Meta: ordering = ('country_name', 'title') verbose_name = "Intervention" + unique_together = ('schema_name', 'intervention_id') class Options: source = PartnersIntervention @@ -88,7 +89,7 @@ class Options: partner_name='agreement.partner.name', partner_authorized_officer_signatory_id='partner_authorized_officer_signatory.pk', country_programme_id='country_programme.pk', - intervention_id='pk', + intervention_id='id', unicef_signatory_id='unicef_signatory.pk', unicef_signatory_first_name='unicef_signatory.first_name', unicef_signatory_last_name='unicef_signatory.last_name', diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 826aec436..1e98c29f0 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 606722505..905e38e40 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 8d03d77a1..d7481706e 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py index 661c3dc8e..72117d605 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190118_1451.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('subscriptions', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 4899894dd..e742e9f73 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py index d9b563987..2fe7388d4 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190118_1451.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('unicef_rest_framework', '0001_initial'), ('tracking', '0001_initial'), + ('unicef_rest_framework', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 0ed1c6dca..85287e50e 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py b/src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py rename to src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py index 7e9ecc290..4ff540d4e 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190118_1451.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('unicef_rest_framework', '0001_initial'), ('contenttypes', '0002_remove_content_type_name'), ('auth', '0009_alter_user_last_name_max_length'), + ('unicef_rest_framework', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -136,7 +136,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'user'), ('service', 'group')}, + unique_together={('service', 'group'), ('service', 'user')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 042406fa8..8be2c50a6 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-18 14:51 +# Generated by Django 2.1.5 on 2019-01-21 17:20 import django.contrib.auth.models import django.contrib.auth.validators diff --git a/tests/_test_lib/test_utilities/factories/data.py b/tests/_test_lib/test_utilities/factories/data.py index 6101fced4..4eeb28f9f 100644 --- a/tests/_test_lib/test_utilities/factories/data.py +++ b/tests/_test_lib/test_utilities/factories/data.py @@ -9,8 +9,8 @@ from test_utilities.factories import today from test_utilities.factories.common import RegisterModelFactory -from etools_datamart.apps.data.models import (FAMIndicator, GatewayType, HACT, Intervention, - Location, PMPIndicators, UserStats,) +from etools_datamart.apps.data.models import (FAMIndicator, FundsReservation, GatewayType, HACT, + Intervention, Location, PMPIndicators, UserStats,) class DataMartModelFactory(RegisterModelFactory): @@ -97,3 +97,10 @@ class UserStatsFactory(DataMartModelFactory): class Meta: model = UserStats django_get_or_create = ('month', 'country_name') + + +class FundsReservationFactory(DataMartModelFactory): + intervention = factory.SubFactory(InterventionFactory) + + class Meta: + model = FundsReservation From 25ee64dea8df9503177c6225b79dd21cd0c33c70 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 21 Jan 2019 21:32:36 +0100 Subject: [PATCH 077/122] fixes tests --- Pipfile | 64 +++++------ Pipfile.lock | 104 ++++++++---------- src/etools_datamart/apps/data/admin.py | 6 + .../test_utilities/factories/data.py | 16 +++ .../data/InterventionViewSet.fixture.json | 24 ++-- .../record/InterventionViewSet.fixture.json | 12 +- ...test_datamart_interventions_.response.json | 30 ++--- ...datamart_interventions_549_.response.json} | 16 +-- 8 files changed, 140 insertions(+), 132 deletions(-) rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_interventions_1110_.response.json => get__api_latest_datamart_interventions_549_.response.json} (89%) diff --git a/Pipfile b/Pipfile index edd0aec65..2364fbd31 100644 --- a/Pipfile +++ b/Pipfile @@ -4,82 +4,82 @@ verify_ssl = true name = "pypi" [packages] -psycopg2 = "*" +"django-rest-framework-social-oauth2" = "*" +"xhtml2pdf" = "*" admin-extra-urls = ">=2.1" +azure-storage = "*" celery = "*" coreapi = "*" +cryptography = "==2.4.1" django = ">=2.1.5,<2.2a" +django-adminactions = "*" django-adminfilters = ">=1.1" django-celery-beat = "==1.4.0" +django-celery-email = "*" django-concurrency = "*" django-constance = "*" django-cors-headers = "*" +django-countries = "*" django-crashlog = "*" +django-crispy-forms = "*" +django-db-logging = "*" +django-dbtemplates = {file = "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz"} django-environ = "*" +django-filter = "*" +django-model-utils = "*" +django-mptt = "*" django-picklefield = "*" +django-post-office = "*" django-redis = "*" +django-redisboard = "*" django-regex = "*" +django-storages = {extras = ["azure"],version = "*"} django-strategy-field = "*" django-sysinfo = "==1.4" djangorestframework-csv = "*" +djangorestframework-gis = "*" djangorestframework-jwt = "*" +djangorestframework-xml = "*" +djangorestframework-yaml = "*" drf-dynamic-serializer = ">=1.2.0" drf-extensions = "*" +drf-renderer-xlsx = "*" drf-yasg = {version = "*",extras = ["validation"]} gunicorn = "*" humanize = "*" +onedrivesdk = "*" +openpyxl = "==2.5.12" +psycopg2-binary = "*" pyparsing = "*" +python-social-auth = "*" raven = "*" +redis = "==2.10.6" +social-auth-app-django = "*" sqlparse = "*" whitenoise = "*" -django-model-utils = "*" -python-social-auth = "*" -social-auth-app-django = "*" -django-db-logging = "*" -cryptography = "==2.4.1" -#rest-social-auth = "*" -"django-rest-framework-social-oauth2" = "*" -django-countries = "*" -django-filter = "*" -drf-renderer-xlsx = "*" -django-redisboard = "*" -djangorestframework-xml = "*" -redis = "==2.10.6" -djangorestframework-yaml = "*" -django-storages = {extras = ["azure"],version = "*"} -onedrivesdk = "*" -azure-storage = "*" -django-post-office = "*" -django-celery-email = "*" -"xhtml2pdf" = "*" -django-crispy-forms = "*" -django-adminactions = "*" -django-dbtemplates = {file = "https://github.com/jazzband/django-dbtemplates/archive/2.0.1.tar.gz"} -django-mptt = "*" -djangorestframework-gis = "*" -openpyxl = "==2.5.12" [dev-packages] +bumpversion = "*" check-manifest= "*" django-extensions = "*" django-webtest = "*" docker = "*" drf-api-checker = ">=0.3" factory-boy = "*" +freezegun = "*" ipython = "*" isort = "*" pdbpp = "*" +pre-commit = "*" pytest = "*" pytest-coverage = "*" pytest-django = "*" pytest-echo = "*" +pytest-ignore-flaky = "*" pytest-pythonpath = "*" -yapf = "*" +tox = "*" vcrpy = "*" -pre-commit = "*" -freezegun = "*" -pytest-ignore-flaky = "*" -bumpversion = "*" +yapf = "*" [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 7566a4fbe..8d1448e71 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "ddddd035807e129b4cc7a54e53277bbfc9a5712ad633bd61e8f756dfddd3181e" + "sha256": "97b68922c65b2336254ce87847a150c34276ca025dc160e6fcd3d0ae61303718" }, "pipfile-spec": 6, "requires": { @@ -1280,38 +1280,38 @@ ], "version": "==5.4.8" }, - "psycopg2": { - "hashes": [ - "sha256:10e391687b171878181e71736d0effe3772314a339d9ae30995ec8171a0c834e", - "sha256:1283f9d45e458c2dcb15ba89367923563f90ef636fe78ee22df75183484a0237", - "sha256:1a9c32e4d140bea225f9821d993b2e53c913e717ea97b851246aa9b300095d8f", - "sha256:1be6f2438d2b71fec7b07c3c0949dd321b04349c382907ea76b36120edec8300", - "sha256:20ca6f29e118b8dd7133e8708b3fba2881e70a4e0841f874ed23985b7201a076", - "sha256:227c115b3c1f65d61385e51ac690b91b584640aefb45bffacd4bd33d02ed7221", - "sha256:27959abe64ca1fc6d8cd11a71a1f421d8287831a3262bd4cacd43bbf43cc3c82", - "sha256:2b2daf1fe30a58300542aea679fd87d1e1c2afd36e7644837b7954fa2dbacb92", - "sha256:36e51a51f295fdf67bcf05e7b1877011a6b39e6622b0013fe31c5025241873a3", - "sha256:3992b9b914f2eb77dc07e8045d2ca979e491612808bc5c7cd68f307469acf9f6", - "sha256:39a11de2335ad45ececed43ab851d36a4c52843d756471b940804f301792781e", - "sha256:3c2afe9ef0d1649005e3ccf93c1aaccd6f8ee379530e763d3b3b77f406b7c0ae", - "sha256:3fb18e0e52807fe3a300dc1b5421aa492d5e759550918f597d61863419482535", - "sha256:55eab94de96ee9702f23283e9c8b03cfdb0001e2b14d5d2e1bd5ff8114b96b9f", - "sha256:7e95c0ab7e7e6e452586f35d4d8966b1e924c8dd2c23977e3ea4968770ff1d26", - "sha256:7f47514dbddf604f196fcfe5da955537f04691bef8124aff5632316a78d992b7", - "sha256:8345370356bb4bddf93acbcfd0357163dd6b09471937adcfb38a2fbb49bdce53", - "sha256:8bc6ecb220c0b88d3742042013129c817c44459795c97e9ce1bca70a3f37a53b", - "sha256:8df623f248be15d1725faf5f333791678775047f12f17a90d29b5d22573f5cdc", - "sha256:9645f1305e4268cc0fc88c823cd6c91de27c003e183c233a6a230e5e963039ee", - "sha256:a68719ed5be8373dd72c9e45d55f7a202285e05a2e392eaa8872a67ea47d7d20", - "sha256:aca0edf062ec09e954fdf0cc93d3a872362701210983a1442549e703aedec25d", - "sha256:b0dd2114d93d8f424bb8ae76e0dc540f104b70ca9163172c05e7700b1459d4c9", - "sha256:b2c09359d6802279efb9efb3f91a9c94567151baee95175f9b637ea628f35244", - "sha256:ca7bc37b1efb7cc25271bf10f398462ed975d95259af1406d38fcb268466e34f", - "sha256:e64235d9013ebf6319cb9654e08f5066112c34d8c4cc41186254ab9c3d6d5b9b", - "sha256:ec9be679c0065667503851141c31fa699e1cc69ded3ba8e5d3673dd5a6eb1370", - "sha256:eca00d0f91fcb44d88b12f1fd16ad138e38fa07debb79587e2b7ff1fe80d72b9", - "sha256:f256e807b8b2b45b6af60d7f2bb5194aab2f4acc861241c4d8ef942a55f5030d", - "sha256:fce7612a3bd6a7ba95799f88285653bf130bd7ca066b52674d5f850108b2aec0" + "psycopg2-binary": { + "hashes": [ + "sha256:036bcb198a7cc4ce0fe43344f8c2c9a8155aefa411633f426c8c6ed58a6c0426", + "sha256:1d770fcc02cdf628aebac7404d56b28a7e9ebec8cfc0e63260bd54d6edfa16d4", + "sha256:1fdc6f369dcf229de6c873522d54336af598b9470ccd5300e2f58ee506f5ca13", + "sha256:21f9ddc0ff6e07f7d7b6b484eb9da2c03bc9931dd13e36796b111d631f7135a3", + "sha256:247873cda726f7956f745a3e03158b00de79c4abea8776dc2f611d5ba368d72d", + "sha256:3aa31c42f29f1da6f4fd41433ad15052d5ff045f2214002e027a321f79d64e2c", + "sha256:475f694f87dbc619010b26de7d0fc575a4accf503f2200885cc21f526bffe2ad", + "sha256:4b5e332a24bf6e2fda1f51ca2a57ae1083352293a08eeea1fa1112dc7dd542d1", + "sha256:570d521660574aca40be7b4d532dfb6f156aad7b16b5ed62d1534f64f1ef72d8", + "sha256:59072de7def0690dd13112d2bdb453e20570a97297070f876fbbb7cbc1c26b05", + "sha256:5f0b658989e918ef187f8a08db0420528126f2c7da182a7b9f8bf7f85144d4e4", + "sha256:649199c84a966917d86cdc2046e03d536763576c0b2a756059ae0b3a9656bc20", + "sha256:6645fc9b4705ae8fbf1ef7674f416f89ae1559deec810f6dd15197dfa52893da", + "sha256:6872dd54d4e398d781efe8fe2e2d7eafe4450d61b5c4898aced7610109a6df75", + "sha256:6ce34fbc251fc0d691c8d131250ba6f42fd2b28ef28558d528ba8c558cb28804", + "sha256:73920d167a0a4d1006f5f3b9a3efce6f0e5e883a99599d38206d43f27697df00", + "sha256:8a671732b87ae423e34b51139628123bc0306c2cb85c226e71b28d3d57d7e42a", + "sha256:8d517e8fda2efebca27c2018e14c90ed7dc3f04d7098b3da2912e62a1a5585fe", + "sha256:9475a008eb7279e20d400c76471843c321b46acacc7ee3de0b47233a1e3fa2cf", + "sha256:96947b8cd7b3148fb0e6549fcb31258a736595d6f2a599f8cd450e9a80a14781", + "sha256:abf229f24daa93f67ac53e2e17c8798a71a01711eb9fcdd029abba8637164338", + "sha256:b1ab012f276df584beb74f81acb63905762c25803ece647016613c3d6ad4e432", + "sha256:b22b33f6f0071fe57cb4e9158f353c88d41e739a3ec0d76f7b704539e7076427", + "sha256:b3b2d53274858e50ad2ffdd6d97ce1d014e1e530f82ec8b307edd5d4c921badf", + "sha256:bab26a729befc7b9fab9ded1bba9c51b785188b79f8a2796ba03e7e734269e2e", + "sha256:daa1a593629aa49f506eddc9d23dc7f89b35693b90e1fbcd4480182d1203ea90", + "sha256:dd111280ce40e89fd17b19c1269fd1b74a30fce9d44a550840e86edb33924eb8", + "sha256:e0b86084f1e2e78c451994410de756deba206884d6bed68d5a3d7f39ff5fea1d", + "sha256:eb86520753560a7e89639500e2a254bb6f683342af598088cb72c73edcad21e6", + "sha256:ff18c5c40a38d41811c23e2480615425c97ea81fd7e9118b8b899c512d97c737" ], "index": "pypi", "version": "==2.7.6.1" @@ -1800,13 +1800,12 @@ ], "version": "==0.8" }, - "flake8": { + "filelock": { "hashes": [ - "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", - "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + "sha256:b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633", + "sha256:d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6" ], - "index": "pypi", - "version": "==3.6.0" + "version": "==3.0.10" }, "freezegun": { "hashes": [ @@ -1876,13 +1875,6 @@ ], "version": "==0.13.2" }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, "more-itertools": { "hashes": [ "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4", @@ -1997,20 +1989,6 @@ ], "version": "==1.7.0" }, - "pycodestyle": { - "hashes": [ - "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", - "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" - ], - "version": "==2.4.0" - }, - "pyflakes": { - "hashes": [ - "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", - "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" - ], - "version": "==2.0.0" - }, "pygments": { "hashes": [ "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", @@ -2143,6 +2121,14 @@ ], "version": "==0.10.0" }, + "tox": { + "hashes": [ + "sha256:04f8f1aa05de8e76d7a266ccd14e0d665d429977cd42123bc38efa9b59964e9e", + "sha256:25ef928babe88c71e3ed3af0c464d1160b01fca2dd1870a5bb26c2dea61a17fc" + ], + "index": "pypi", + "version": "==3.7.0" + }, "traitlets": { "hashes": [ "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", diff --git a/src/etools_datamart/apps/data/admin.py b/src/etools_datamart/apps/data/admin.py index 02c729ffd..55f3c240c 100644 --- a/src/etools_datamart/apps/data/admin.py +++ b/src/etools_datamart/apps/data/admin.py @@ -172,3 +172,9 @@ class GatewayTypeAdmin(DataModelAdmin): class LocationAdmin(DataModelAdmin): list_display = ('country_name', 'schema_name', 'name', 'latitude', 'longitude') readonly_fields = ('parent', 'gateway') + + +@register(models.FundsReservation) +class FundsReservationAdmin(DataModelAdmin): + list_display = ('country_name', 'schema_name', 'fr_number', 'fr_type', 'wbs') + date_hierarchy = 'start_date' diff --git a/tests/_test_lib/test_utilities/factories/data.py b/tests/_test_lib/test_utilities/factories/data.py index 4eeb28f9f..c90105cea 100644 --- a/tests/_test_lib/test_utilities/factories/data.py +++ b/tests/_test_lib/test_utilities/factories/data.py @@ -54,6 +54,7 @@ class InterventionFactory(DataMartModelFactory): total = 10 total_local = 10 currency = 'USD' + intervention_id = factory.Sequence(lambda n: n) class Meta: model = Intervention @@ -101,6 +102,21 @@ class Meta: class FundsReservationFactory(DataMartModelFactory): intervention = factory.SubFactory(InterventionFactory) + actual_amt = 101 + intervention_amt = 102 + outstanding_amt = 103 + total_amt = 104 + actual_amt_local = 105 + outstanding_amt_local = 106 + multi_curr_flag = False + line_item = 1 + overall_amount = 107 + overall_amount_dc = 108 + created = timezone.now() + modified = timezone.now() + + source_id = 1 + source_intervention_id = 1 class Meta: model = FundsReservation diff --git a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json index 6d0b000bf..9d583eb47 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json @@ -3,14 +3,14 @@ "master": [ { "model": "data.intervention", - "pk": 1107, + "pk": 274, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-21T10:35:38.650Z", + "last_modify_date": "2019-01-21T19:17:09.988Z", "seen": null, - "created": "2019-01-21T10:35:38.650Z", + "created": "2019-01-21T19:17:09.988Z", "updated": null, "document_type": null, "number": "#000", @@ -55,7 +55,7 @@ "total": "10.00", "total_local": "10.00", "currency": "USD", - "intervention_id": null, + "intervention_id": 0, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null @@ -63,14 +63,14 @@ }, { "model": "data.intervention", - "pk": 1108, + "pk": 275, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-21T10:35:38.659Z", + "last_modify_date": "2019-01-21T19:17:09.994Z", "seen": null, - "created": "2019-01-21T10:35:38.659Z", + "created": "2019-01-21T19:17:09.994Z", "updated": null, "document_type": null, "number": "#001", @@ -115,7 +115,7 @@ "total": "10.00", "total_local": "10.00", "currency": "USD", - "intervention_id": null, + "intervention_id": 1, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null @@ -123,14 +123,14 @@ }, { "model": "data.intervention", - "pk": 1109, + "pk": 276, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-21T10:35:38.662Z", + "last_modify_date": "2019-01-21T19:17:09.997Z", "seen": null, - "created": "2019-01-21T10:35:38.662Z", + "created": "2019-01-21T19:17:09.997Z", "updated": null, "document_type": null, "number": "#002", @@ -175,7 +175,7 @@ "total": "10.00", "total_local": "10.00", "currency": "USD", - "intervention_id": null, + "intervention_id": 2, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null diff --git a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json index 397f4544d..e063c7589 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json @@ -2,18 +2,18 @@ "record": { "master": { "model": "data.intervention", - "pk": 1110, + "pk": 549, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-21T10:35:39.800Z", + "last_modify_date": "2019-01-21T19:52:22.071Z", "seen": null, - "created": "2019-01-21T10:35:39.800Z", + "created": "2019-01-21T19:52:22.071Z", "updated": null, "document_type": null, - "number": "#003", - "title": "title003", + "number": "#272", + "title": "title272", "status": null, "start_date": null, "end_date": null, @@ -54,7 +54,7 @@ "total": "10.00", "total_local": "10.00", "currency": "USD", - "intervention_id": null, + "intervention_id": 272, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json index cd5b6c556..58068f1de 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"e9aa586241baaf7ebeec0807cdfc94a2\"" + "\"ad5abaf134ac66bc2f03b6233560a93c\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,7 +39,7 @@ ], "cache-key": [ "cache-key", - "e9aa586241baaf7ebeec0807cdfc94a2" + "ad5abaf134ac66bc2f03b6233560a93c" ], "cache-hit": [ "cache-hit", @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "3738" + "3726" ] }, "data": { @@ -62,13 +62,13 @@ "previous": null, "results": [ { - "id": 1107, + "id": 274, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "21 Jan 2019 10:35:38", + "last_modify_date": "21 Jan 2019 19:17:09", "seen": null, - "created": "21 Jan 2019 10:35:38", + "created": "21 Jan 2019 19:17:09", "updated": null, "document_type": null, "number": "#000", @@ -103,19 +103,19 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, - "intervention_id": null, + "intervention_id": 0, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null }, { - "id": 1108, + "id": 275, "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "21 Jan 2019 10:35:38", + "last_modify_date": "21 Jan 2019 19:17:09", "seen": null, - "created": "21 Jan 2019 10:35:38", + "created": "21 Jan 2019 19:17:09", "updated": null, "document_type": null, "number": "#001", @@ -150,19 +150,19 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, - "intervention_id": null, + "intervention_id": 1, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null }, { - "id": 1109, + "id": 276, "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "21 Jan 2019 10:35:38", + "last_modify_date": "21 Jan 2019 19:17:09", "seen": null, - "created": "21 Jan 2019 10:35:38", + "created": "21 Jan 2019 19:17:09", "updated": null, "document_type": null, "number": "#002", @@ -197,7 +197,7 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, - "intervention_id": null, + "intervention_id": 2, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json similarity index 89% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json index f0e99da2b..e2ac09c7e 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_1110_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"06193c1343d19db4c8b704f14beb55c4\"" + "\"46044bb9d13fc10f75387e4b21a746b8\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,21 +39,21 @@ ], "content-length": [ "Content-Length", - "1219" + "1217" ] }, "data": { - "id": 1110, + "id": 549, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "21 Jan 2019 10:35:39", + "last_modify_date": "21 Jan 2019 19:52:22", "seen": null, - "created": "21 Jan 2019 10:35:39", + "created": "21 Jan 2019 19:52:22", "updated": null, "document_type": null, - "number": "#003", - "title": "title003", + "number": "#272", + "title": "title272", "status": null, "start_date": null, "end_date": null, @@ -84,7 +84,7 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, - "intervention_id": null, + "intervention_id": 272, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null From 5d9bbdd88b9467efd1c5470ba505164b5e91e42d Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 21 Jan 2019 23:30:55 +0100 Subject: [PATCH 078/122] =?UTF-8?q?Bump=20version:=201.9a18=20=E2=86=92=20?= =?UTF-8?q?1.9a19?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index e38a3fda0..4d6bea8e4 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a18 +current_version = 1.9a19 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 71565f801..5c02b8c85 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a18 +TARGET?=1.9a19 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 2a0e2ac04..f7abafb3c 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a18' +VERSION = __version__ = '1.9a19' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 9987be2889c8085d863de414e5f8bb9c57630243 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 22 Jan 2019 11:17:13 +0100 Subject: [PATCH 079/122] reset migrations set Interventions values to nullable --- .../apps/data/migrations/0001_initial.py | 30 +++++++++---------- .../apps/data/models/intervention.py | 26 ++++++++-------- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...121_1720.py => 0002_auto_20190122_1016.py} | 2 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...121_1720.py => 0002_auto_20190122_1016.py} | 4 +-- .../migrations/0001_initial.py | 2 +- ...121_1720.py => 0002_auto_20190122_1016.py} | 6 ++-- .../migrations/0001_initial.py | 2 +- 11 files changed, 40 insertions(+), 40 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190121_1720.py => 0002_auto_20190122_1016.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190121_1720.py => 0002_auto_20190122_1016.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190121_1720.py => 0002_auto_20190122_1016.py} (98%) diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 83ac55379..84f7da432 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -174,19 +174,19 @@ class Migration(migrations.Migration): ('partner_focal_point_last_name', models.CharField(max_length=64, null=True)), ('partner_focal_point_email', models.CharField(max_length=128, null=True)), ('partner_focal_point_phone', models.CharField(max_length=64, null=True)), - ('partner_contribution', models.DecimalField(decimal_places=2, max_digits=20)), - ('unicef_cash', models.DecimalField(decimal_places=2, max_digits=20)), - ('in_kind_amount', models.DecimalField(decimal_places=2, max_digits=20)), - ('partner_contribution_local', models.DecimalField(decimal_places=2, max_digits=20)), - ('unicef_cash_local', models.DecimalField(decimal_places=2, max_digits=20)), - ('in_kind_amount_local', models.DecimalField(decimal_places=2, max_digits=20)), - ('total', models.DecimalField(decimal_places=2, max_digits=20)), - ('total_local', models.DecimalField(decimal_places=2, max_digits=20)), - ('currency', models.CharField(max_length=4)), - ('intervention_id', models.IntegerField()), - ('agreement_id', models.IntegerField(null=True)), - ('country_programme_id', models.IntegerField(null=True)), - ('unicef_signatory_id', models.IntegerField(null=True)), + ('partner_contribution', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('unicef_cash', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('in_kind_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('partner_contribution_local', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('unicef_cash_local', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('in_kind_amount_local', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('total', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('total_local', models.DecimalField(blank=True, decimal_places=2, max_digits=20, null=True)), + ('currency', models.CharField(blank=True, max_length=4, null=True)), + ('intervention_id', models.IntegerField(blank=True, null=True)), + ('agreement_id', models.IntegerField(blank=True, null=True)), + ('country_programme_id', models.IntegerField(blank=True, null=True)), + ('unicef_signatory_id', models.IntegerField(blank=True, null=True)), ], options={ 'verbose_name': 'Intervention', @@ -297,7 +297,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, + unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, ), migrations.AddField( model_name='fundsreservation', diff --git a/src/etools_datamart/apps/data/models/intervention.py b/src/etools_datamart/apps/data/models/intervention.py index b18210573..3ffaae1ea 100644 --- a/src/etools_datamart/apps/data/models/intervention.py +++ b/src/etools_datamart/apps/data/models/intervention.py @@ -52,20 +52,20 @@ class Intervention(DataMartModel): partner_focal_point_email = models.CharField(max_length=128, null=True) partner_focal_point_phone = models.CharField(max_length=64, null=True) - partner_contribution = models.DecimalField(max_digits=20, decimal_places=2) - unicef_cash = models.DecimalField(max_digits=20, decimal_places=2) - in_kind_amount = models.DecimalField(max_digits=20, decimal_places=2) - partner_contribution_local = models.DecimalField(max_digits=20, decimal_places=2) - unicef_cash_local = models.DecimalField(max_digits=20, decimal_places=2) - in_kind_amount_local = models.DecimalField(max_digits=20, decimal_places=2) - total = models.DecimalField(max_digits=20, decimal_places=2) - total_local = models.DecimalField(max_digits=20, decimal_places=2) - currency = models.CharField(max_length=4) + partner_contribution = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + unicef_cash = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + in_kind_amount = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + partner_contribution_local = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + unicef_cash_local = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + in_kind_amount_local = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + total = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + total_local = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True) + currency = models.CharField(max_length=4, blank=True, null=True) - intervention_id = models.IntegerField(null=False) - agreement_id = models.IntegerField(null=True) - country_programme_id = models.IntegerField(null=True) - unicef_signatory_id = models.IntegerField(null=True) + intervention_id = models.IntegerField(blank=True, null=True) + agreement_id = models.IntegerField(blank=True, null=True) + country_programme_id = models.IntegerField(blank=True, null=True) + unicef_signatory_id = models.IntegerField(blank=True, null=True) class Meta: ordering = ('country_name', 'title') diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 1e98c29f0..d84e91099 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 905e38e40..6fd5a500c 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index d7481706e..921700222 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py index 72117d605..3e7e495a1 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190121_1720.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.db.models.deletion from django.conf import settings diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index e742e9f73..43f8a4de4 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py index 2fe7388d4..5ff4ae531 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190121_1720.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.db.models.deletion from django.conf import settings @@ -11,8 +11,8 @@ class Migration(migrations.Migration): dependencies = [ ('tracking', '0001_initial'), - ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), ] operations = [ diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 85287e50e..aa5c9aeb5 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py b/src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py rename to src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py index 4ff540d4e..6d8b11b45 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190121_1720.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('contenttypes', '0002_remove_content_type_name'), ('auth', '0009_alter_user_last_name_max_length'), ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0002_remove_content_type_name'), ] operations = [ @@ -136,7 +136,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'group'), ('service', 'user')}, + unique_together={('service', 'user'), ('service', 'group')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 8be2c50a6..5862e9c31 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-21 17:20 +# Generated by Django 2.1.5 on 2019-01-22 10:16 import django.contrib.auth.models import django.contrib.auth.validators From f6d0850a9069a3ab3ce0e93a24f07ce11d2853c8 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 22 Jan 2019 11:35:11 +0100 Subject: [PATCH 080/122] =?UTF-8?q?Bump=20version:=201.9a19=20=E2=86=92=20?= =?UTF-8?q?1.9a20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 4d6bea8e4..10e8b4ef2 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a19 +current_version = 1.9a20 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 5c02b8c85..9c04577b1 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a19 +TARGET?=1.9a20 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index f7abafb3c..9fb879f28 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a19' +VERSION = __version__ = '1.9a20' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 8ec47311562c8d6e8047dfb5f6e1beff1e93b501 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 09:30:33 +0100 Subject: [PATCH 081/122] improves cache key to ignore default values in querystrinn (ordering, serializer) --- src/unicef_rest_framework/cache.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/unicef_rest_framework/cache.py b/src/unicef_rest_framework/cache.py index 2c1e408d1..08d9b78ab 100644 --- a/src/unicef_rest_framework/cache.py +++ b/src/unicef_rest_framework/cache.py @@ -10,7 +10,7 @@ from rest_framework_extensions.cache.decorators import CacheResponse from rest_framework_extensions.etag.decorators import ETAGProcessor from rest_framework_extensions.key_constructor import bits -from rest_framework_extensions.key_constructor.bits import KeyBitBase +from rest_framework_extensions.key_constructor.bits import KeyBitBase, QueryParamsKeyBit from rest_framework_extensions.key_constructor.constructors import KeyConstructor from rest_framework_extensions.settings import extensions_api_settings from strategy_field.utils import fqn @@ -150,6 +150,22 @@ def get_data(self, params, view_instance, view_method, request, args, kwargs): return {} +class SmartQueryParamsKeyBit(QueryParamsKeyBit): + """ + Return example: + {'part': 'Londo', 'callback': 'jquery_callback'} + + """ + + def get_source_dict(self, params, view_instance, view_method, request, args, kwargs): + values = request.GET.copy() + if not values.get('ordering', None) == view_instance.ordering: + values['ordering'] = view_instance.ordering + if not values.get(view_instance.serializer_field_param, None): + values[view_instance.serializer_field_param] = 'std' + return values + + class ListKeyConstructor(KeyConstructor): cache_version = CacheVersionKeyBit() system_filter = SystemFilterKeyBit() @@ -160,7 +176,7 @@ class ListKeyConstructor(KeyConstructor): dev = DevelopKeyBit() admin = SuperuserKeyBit() staff = IsStaffKeyBit() - querystring = bits.QueryParamsKeyBit() + querystring = SmartQueryParamsKeyBit() def get_key(self, view_instance, view_method, request, args, kwargs): key = super().get_key(view_instance, view_method, request, args, kwargs) From a2dfc9c2000a5622b131bf9998ffa2e0c4ff03e6 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 09:34:08 +0100 Subject: [PATCH 082/122] fix GA code --- .../apps/init/management/commands/init-setup.py | 1 + .../templates/rest_framework/base.html | 7 ++----- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index 99d1ffe4c..f6057a525 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -246,6 +246,7 @@ def handle(self, *args, **options): if options['tasks'] or _all or options['refresh']: midnight, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=0) + one, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=1) CrontabSchedule.objects.get_or_create(hour='0, 6, 12, 18') CrontabSchedule.objects.get_or_create(hour='0, 12') IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.HOURS) diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index de2072904..1d5f8e3e5 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -29,15 +29,12 @@ {% if code_style %}{% endif %} {% endblock %} {% if config.ANALYTICS_CODE %} - + {% endif %} {% endblock %} From ac591c73035f0cb2c836866afa131749baac88a5 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 12:01:53 +0100 Subject: [PATCH 083/122] improves PeriodicTask management --- docker/Dockerfile | 3 +- .../apps/data/migrations/0001_initial.py | 4 +- .../apps/etl/migrations/0001_initial.py | 2 +- .../init/management/commands/init-setup.py | 27 ++++++-- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...122_1016.py => 0002_auto_20190123_0953.py} | 2 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...122_1016.py => 0002_auto_20190123_0953.py} | 6 +- src/etools_datamart/config/admin.py | 8 ++- src/etools_datamart/config/settings.py | 2 +- src/unicef_rest_framework/admin/__init__.py | 12 +++- src/unicef_rest_framework/admin/beat.py | 65 +++++++++++++++++++ .../migrations/0001_initial.py | 10 ++- ...122_1016.py => 0002_auto_20190123_0953.py} | 13 ++-- src/unicef_rest_framework/models/__init__.py | 1 + .../models/periodic_task.py | 11 ++++ src/unicef_rest_framework/models/service.py | 5 ++ src/unicef_rest_framework/schedulers.py | 7 ++ .../templates/rest_framework/base.html | 3 + .../migrations/0001_initial.py | 2 +- 21 files changed, 163 insertions(+), 26 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190122_1016.py => 0002_auto_20190123_0953.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190122_1016.py => 0002_auto_20190123_0953.py} (97%) create mode 100644 src/unicef_rest_framework/admin/beat.py rename src/unicef_rest_framework/migrations/{0002_auto_20190122_1016.py => 0002_auto_20190123_0953.py} (94%) create mode 100644 src/unicef_rest_framework/models/periodic_task.py create mode 100644 src/unicef_rest_framework/schedulers.py diff --git a/docker/Dockerfile b/docker/Dockerfile index 60da2db93..7a3f850d5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -81,9 +81,10 @@ ENV PIPSI_HOME=/usr/local/pipsi/environments ENV PIPSI_BIN_DIR=/usr/local/bin ENV PYTHONUNBUFFERED 1 ENV USE_GUNICORN 0 -ENV GUNICORN_CMD_ARGS "-b 0.0.0.0:8000 \ +ENV GUNICORN_CMD_ARGS " --name datamart \ --chdir /var/datamart \ --access-logfile - \ +--timeout 120 \ --access-logformat \"%(h)s %(l)s %(u)s %(t)s '%(r)s' %(s)s\" " ENV ALLOWED_HOSTS * diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 84f7da432..68e1ad935 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -314,6 +314,6 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='fundsreservation', - unique_together={('schema_name', 'source_id'), ('schema_name', 'fr_number')}, + unique_together={('schema_name', 'fr_number'), ('schema_name', 'source_id')}, ), ] diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index d84e91099..e80af3a23 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/init/management/commands/init-setup.py b/src/etools_datamart/apps/init/management/commands/init-setup.py index f6057a525..c3139f0be 100644 --- a/src/etools_datamart/apps/init/management/commands/init-setup.py +++ b/src/etools_datamart/apps/init/management/commands/init-setup.py @@ -13,11 +13,14 @@ from django.db import connections from constance import config -from django_celery_beat.models import CrontabSchedule, IntervalSchedule, PeriodicTask +from django_celery_beat.models import CrontabSchedule, IntervalSchedule from post_office.models import EmailTemplate from redisboard.models import RedisServer +from strategy_field.utils import fqn +from unicef_rest_framework.models import PeriodicTask from unicef_rest_framework.models.acl import GroupAccessControl +from unicef_rest_framework.tasks import preload from etools_datamart.apps.data.loader import loadeables from etools_datamart.apps.etl.models import EtlTask @@ -245,8 +248,8 @@ def handle(self, *args, **options): port=int(spec.port)) if options['tasks'] or _all or options['refresh']: + preload_cron, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=1) midnight, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=0) - one, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=1) CrontabSchedule.objects.get_or_create(hour='0, 6, 12, 18') CrontabSchedule.objects.get_or_create(hour='0, 12') IntervalSchedule.objects.get_or_create(every=1, period=IntervalSchedule.HOURS) @@ -259,11 +262,23 @@ def handle(self, *args, **options): for loadeable in loadeables: model = apps.get_model(loadeable) loaders.append(loadeable) - __, is_new = PeriodicTask.objects.get_or_create(task=model.loader.task.name, + __, is_new = PeriodicTask.objects.get_or_create(task=f"ETL {model.loader.task.name}", defaults={'name': loadeable, + 'service': Service.objects.get_for_model(model), 'crontab': midnight}) if is_new: - self.stdout.write(f"NEW task {model.loader.task.name} scheduled at {midnight}") + self.stdout.write(f"NEW load task {model.loader.task.name} scheduled at {midnight}") + + # preload + for service in Service.objects.all(): + url = service.endpoint + pp, is_new = PeriodicTask.objects.get_or_create(name=f'PRELOAD {url}', + defaults={'task': fqn(preload), + 'crontab': preload_cron, + 'service': service, + 'args': f'["{url}?page_size=-1"]'}) + if is_new: + self.stdout.write(f"NEW preload task for '{url}'") ret = PeriodicTask.objects.filter(name__startswith='data.').exclude(name__in=loaders).delete() counters[False] = ret[0] @@ -277,6 +292,10 @@ def handle(self, *args, **options): defaults={'name': 'process mail queue', 'interval': every_minute}) + # PeriodicTask.objects.get_or_create(task='send_queued_mail', + # defaults={'name': 'process mail queue', + # 'interval': every_minute}) + EmailTemplate.objects.get_or_create(name='dataset_changed_attachment', defaults=dict(subject='Dataset changed', content=MAIL_ATTACHMENT, diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 6fd5a500c..a2c0e0c12 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 921700222..02a543cb6 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py index 3e7e495a1..79707fbd6 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190122_1016.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.db.models.deletion from django.conf import settings diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 43f8a4de4..56d508c34 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py index 5ff4ae531..c414fa97f 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190122_1016.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('tracking', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('unicef_rest_framework', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('tracking', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/config/admin.py b/src/etools_datamart/config/admin.py index 2b7294733..abc96e136 100644 --- a/src/etools_datamart/config/admin.py +++ b/src/etools_datamart/config/admin.py @@ -26,10 +26,12 @@ 'unicef_rest_framework.UserAccessControl', ], 'Logs': ['tracking', 'django_db_logging', 'crashlog', ], - 'System': ['redisboard', 'django_celery_beat', 'post_office'], - 'Other': ['unicef_rest_framework.Application', ], + 'System': ['redisboard', 'django_celery_beat', 'post_office', + 'unicef_rest_framework.PeriodicTask'], + 'Other': [], '_hidden_': ['sites', 'unicef_rest_framework.Application', - 'oauth2_provider', 'social_django'] + 'oauth2_provider', 'social_django', + 'django_celery_beat.PeriodicTask'] } diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index de65d7e8d..0674dce48 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -412,7 +412,7 @@ 'DISABLE_SERVICE_RESTRICTIONS': (env('DISABLE_SERVICE_RESTRICTIONS'), 'Disable per user service authorizations'), } -CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler' +CELERY_BEAT_SCHEDULER = 'unicef_rest_framework.schedulers.DatabaseScheduler' CELERY_TIMEZONE = 'America/New_York' CELERY_BROKER_URL = env('CELERY_BROKER_URL') CELERY_RESULT_BACKEND = env('CELERY_RESULT_BACKEND') diff --git a/src/unicef_rest_framework/admin/__init__.py b/src/unicef_rest_framework/admin/__init__.py index 081f39da9..7f16e5d52 100644 --- a/src/unicef_rest_framework/admin/__init__.py +++ b/src/unicef_rest_framework/admin/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from django.contrib import admin +from django_celery_beat.models import CrontabSchedule from unicef_rest_framework.models.acl import GroupAccessControl from .base import APIModelAdmin # noqa @@ -8,19 +9,28 @@ Service, CacheVersion, UserAccessControl, + PeriodicTask, SystemFilter) from .base import ListDisplayAllMixin, ReadOnlyAdminMixin, TruncateTableMixin # noqa from .application import ApplicationAdmin from .service import ServiceAdmin from .cache import CacheVersionAdmin from .acl import UserAccessControlAdmin, GroupAccessControlAdmin +from .beat import CrontabScheduleAdmin, PeriodicTaskAdmin __all__ = ['ApplicationAdmin', 'GroupAccessControlAdmin', 'ServiceAdmin', 'UserAccessControlAdmin', 'ListDisplayAllMixin', - 'ReadOnlyAdminMixin'] + 'ReadOnlyAdminMixin', + 'PeriodicTaskAdmin', + 'CrontabScheduleAdmin'] + +# admin.site.unregister(PeriodicTask) +admin.site.unregister(CrontabSchedule) +admin.site.register(PeriodicTask, PeriodicTaskAdmin) +admin.site.register(CrontabSchedule, CrontabScheduleAdmin) admin.site.register(Application, ApplicationAdmin) admin.site.register(CacheVersion, CacheVersionAdmin) diff --git a/src/unicef_rest_framework/admin/beat.py b/src/unicef_rest_framework/admin/beat.py new file mode 100644 index 000000000..d5f8e333a --- /dev/null +++ b/src/unicef_rest_framework/admin/beat.py @@ -0,0 +1,65 @@ +from django.utils.translation import ugettext_lazy as _ + +from admin_extra_urls.extras import action, ExtraUrlMixin +from adminactions.mass_update import mass_update, MassUpdateForm +from django_celery_beat import admin +from kombu.utils.json import loads + +from unicef_rest_framework.models import PeriodicTask + + +class PeriodicTaskUpdateForm(MassUpdateForm): + class Meta: + fields = ('interval', 'crontab', 'solar', 'queue', 'exchange', 'routing_key', + 'priority', 'expires', 'one_off', 'enabled',) + + +class PeriodicTaskAdmin(ExtraUrlMixin, admin.PeriodicTaskAdmin): + list_display = ('name', 'service', 'enabled', 'schedule', 'one_off', 'total_run_count') + list_filter = ('enabled', 'last_run_at', 'service') + date_hierarchy = 'last_run_at' + actions = ('enable_tasks', 'disable_tasks', 'toggle_tasks', 'run_tasks', mass_update) + mass_update_form = PeriodicTaskUpdateForm + fieldsets = ( + (None, { + 'fields': (('name', 'service'), ('regtask', 'task'), 'enabled', 'description',), + 'classes': ('extrapretty', 'wide'), + }), + ('Schedule', { + 'fields': ('interval', 'crontab', 'solar', + 'start_time', 'one_off'), + 'classes': ('extrapretty', 'wide'), + }), + ('Arguments', { + 'fields': ('args', 'kwargs'), + 'classes': ('extrapretty', 'wide', 'collapse', 'in'), + }), + ('Execution Options', { + 'fields': ('expires', 'queue', 'exchange', 'routing_key'), + 'classes': ('extrapretty', 'wide', 'collapse', 'in'), + }), + ) + + @action() + def run_task(self, request, pk): + periodic_task = PeriodicTask.objects.get(pk=pk) + self.celery_app.loader.import_default_modules() + + task = self.celery_app.tasks.get(periodic_task.task) + task.delay(*loads(periodic_task.args), **loads(periodic_task.kwargs)) + + self.message_user(request, _('task successfully run')) + + def schedule(self, obj): + fmt = '{{no schedule}}' + if obj.interval: + fmt = '{0.interval}' + elif obj.crontab: + fmt = '{0.crontab}' + elif obj.solar: + fmt = '{0.solar}' + return fmt.format(obj) + + +class CrontabScheduleAdmin(admin.admin.ModelAdmin): + list_display = ('minute', 'hour', 'day_of_month', 'month_of_year') diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index aa5c9aeb5..f2abe01d9 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import uuid @@ -17,6 +17,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('django_celery_beat', '0006_periodictask_priority'), ] operations = [ @@ -53,6 +54,13 @@ class Migration(migrations.Migration): 'ordering': ('group', 'service'), }, ), + migrations.CreateModel( + name='PeriodicTask', + fields=[ + ('periodictask_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='django_celery_beat.PeriodicTask')), + ], + bases=('django_celery_beat.periodictask',), + ), migrations.CreateModel( name='Service', fields=[ diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py b/src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py similarity index 94% rename from src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py rename to src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py index 6d8b11b45..adebb7177 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190122_1016.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-22 10:16 +# Generated by Django 2.1.5 on 2019-01-23 09:53 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0009_alter_user_last_name_max_length'), - ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0002_remove_content_type_name'), + ('unicef_rest_framework', '0001_initial'), + ('auth', '0009_alter_user_last_name_max_length'), ] operations = [ @@ -82,6 +82,11 @@ class Migration(migrations.Migration): name='source_model', field=models.ForeignKey(blank=True, help_text='model used as primary datasource', on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), ), + migrations.AddField( + model_name='periodictask', + name='service', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='unicef_rest_framework.Service'), + ), migrations.AddField( model_name='groupaccesscontrol', name='group', @@ -136,7 +141,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'user'), ('service', 'group')}, + unique_together={('service', 'group'), ('service', 'user')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_rest_framework/models/__init__.py b/src/unicef_rest_framework/models/__init__.py index 899b1a388..b49c8753c 100644 --- a/src/unicef_rest_framework/models/__init__.py +++ b/src/unicef_rest_framework/models/__init__.py @@ -5,3 +5,4 @@ from .token import UserServiceToken # noqa from .service import Service, CacheVersion # noqa from .filter import SystemFilter, SystemFilterFieldRule # noqa +from .periodic_task import PeriodicTask # noqa diff --git a/src/unicef_rest_framework/models/periodic_task.py b/src/unicef_rest_framework/models/periodic_task.py new file mode 100644 index 000000000..3093c04fa --- /dev/null +++ b/src/unicef_rest_framework/models/periodic_task.py @@ -0,0 +1,11 @@ +from django_celery_beat import models + +from unicef_rest_framework.models import Service + + +class PeriodicTask(models.PeriodicTask): + service = models.models.ForeignKey(Service, + on_delete=models.models.CASCADE, + blank=True, + null=True, + related_name='periodic_tasks') diff --git a/src/unicef_rest_framework/models/service.py b/src/unicef_rest_framework/models/service.py index 1dacf8651..624866c36 100644 --- a/src/unicef_rest_framework/models/service.py +++ b/src/unicef_rest_framework/models/service.py @@ -27,6 +27,11 @@ def invalidate_cache(self, **kwargs): def get_for_viewset(self, viewset): return self.model.objects.get(viewset=viewset) + def get_for_model(self, model): + return self.model.objects.filter(source_model__app_label=model._meta.app_label, + source_model__model=model._meta.model_name, + ).first() + def check_or_create(self, prefix, viewset, basename, url_name, ): name = getattr(viewset, 'label', viewset.__name__) source_model = ContentType.objects.get_for_model(viewset().get_queryset().model) diff --git a/src/unicef_rest_framework/schedulers.py b/src/unicef_rest_framework/schedulers.py new file mode 100644 index 000000000..594fc1f4c --- /dev/null +++ b/src/unicef_rest_framework/schedulers.py @@ -0,0 +1,7 @@ +from django_celery_beat import schedulers + +from unicef_rest_framework.models.periodic_task import PeriodicTask + + +class DatabaseScheduler(schedulers.DatabaseScheduler): + Model = PeriodicTask diff --git a/src/unicef_rest_framework/templates/rest_framework/base.html b/src/unicef_rest_framework/templates/rest_framework/base.html index 1d5f8e3e5..452bf9dbd 100644 --- a/src/unicef_rest_framework/templates/rest_framework/base.html +++ b/src/unicef_rest_framework/templates/rest_framework/base.html @@ -209,6 +209,9 @@

{{ name }}

Data + Preload {% endif %} {% if service_url %} Date: Wed, 23 Jan 2019 12:22:25 +0100 Subject: [PATCH 084/122] reset migrations --- docker/Dockerfile | 33 ------------------- docker/Makefile | 11 ++++--- .../apps/data/migrations/0001_initial.py | 6 ++-- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...123_0953.py => 0002_auto_20190123_1112.py} | 4 +-- .../apps/tracking/migrations/0001_initial.py | 2 +- ...123_0953.py => 0002_auto_20190123_1112.py} | 4 +-- .../migrations/0001_initial.py | 2 +- ...123_0953.py => 0002_auto_20190123_1112.py} | 6 ++-- .../migrations/0001_initial.py | 2 +- 12 files changed, 23 insertions(+), 53 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190123_0953.py => 0002_auto_20190123_1112.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190123_0953.py => 0002_auto_20190123_1112.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190123_0953.py => 0002_auto_20190123_1112.py} (97%) diff --git a/docker/Dockerfile b/docker/Dockerfile index 7a3f850d5..93acc6e6a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -20,39 +20,6 @@ RUN apt-get update \ gdal-bin \ python-dev -#RUN apk add --no-cache \ -# --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ -# --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ -# bash \ -# freetype \ -# geos \ -# gdal \ -# lcms2 \ -# libjpeg-turbo \ -# libpng \ -# libpq \ -# openjpeg \ -# postgresql-libs \ -# tiff \ -# && apk add --no-cache --virtual .build-deps \ -# --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ -# --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ -# freetype-dev \ -# gcc \ -# gdal-dev \ -# geos-dev \ -# jpeg-dev \ -# lcms2-dev \ -# libffi-dev \ -# linux-headers \ -# musl-dev \ -# openjpeg-dev \ -# postgresql-dev \ -# python3-dev \ -# tcl-dev \ -# tiff-dev \ -# tk-dev \ -# zlib-dev \ RUN pip install pip==18.0 pipenv --upgrade \ && adduser --system datamart diff --git a/docker/Makefile b/docker/Makefile index 9c04577b1..124fab1f5 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -37,10 +37,6 @@ build: -t ${DOCKER_IMAGE} \ -f docker/${DOCKERFILE} . docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:dev -# flatten image -# docker create --name foo ${DOCKER_IMAGE_NAME}:${TARGET} -# docker export foo | docker import - unicef/datamart:${TARGET} -# docker rm foo docker images | grep ${DOCKER_IMAGE_NAME} @@ -93,6 +89,13 @@ release: run: $(MAKE) .run +workers: + CMD=workers $(MAKE) .run + +beat: + CMD=beat $(MAKE) .run + + test: RUN_OPTIONS="-e DEBUG=0 \ -e X_FRAME_OPTIONS=DENY \ diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 68e1ad935..fe1181393 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -297,7 +297,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, + unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, ), migrations.AddField( model_name='fundsreservation', @@ -314,6 +314,6 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='fundsreservation', - unique_together={('schema_name', 'fr_number'), ('schema_name', 'source_id')}, + unique_together={('schema_name', 'source_id'), ('schema_name', 'fr_number')}, ), ] diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index e80af3a23..2876ce822 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index a2c0e0c12..498cb122d 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 02a543cb6..f2ff217ba 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py index 79707fbd6..f2a118762 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_0953.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('subscriptions', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('subscriptions', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 56d508c34..3cc0d0cf2 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py index c414fa97f..6a69851ec 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_0953.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), ('tracking', '0001_initial'), ] diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index f2abe01d9..23f14cae5 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py b/src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py similarity index 97% rename from src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py rename to src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py index adebb7177..ce5259eac 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190123_0953.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.db.models.deletion from django.conf import settings @@ -11,9 +11,9 @@ class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('auth', '0009_alter_user_last_name_max_length'), ('contenttypes', '0002_remove_content_type_name'), ('unicef_rest_framework', '0001_initial'), - ('auth', '0009_alter_user_last_name_max_length'), ] operations = [ @@ -85,7 +85,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='periodictask', name='service', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='unicef_rest_framework.Service'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='periodic_tasks', to='unicef_rest_framework.Service'), ), migrations.AddField( model_name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 4b139197d..926c2cff7 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 09:53 +# Generated by Django 2.1.5 on 2019-01-23 11:12 import django.contrib.auth.models import django.contrib.auth.validators From 0110d9e37aba47f805f9a63f73a51a24d2fa79ab Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 12:55:47 +0100 Subject: [PATCH 085/122] updates logo and colors --- docker/Makefile | 8 +- docker/entrypoint.sh | 2 +- .../apps/web/static/old_unicef_logo.png | Bin 0 -> 357202 bytes src/etools_datamart/apps/web/static/style.css | 274 +++++++----------- .../apps/web/static/style.css.map | 1 - .../apps/web/static/style.scss | 11 +- .../apps/web/static/unicef_logo.png | Bin 357202 -> 2574632 bytes .../apps/web/templates/base.html | 2 +- 8 files changed, 122 insertions(+), 176 deletions(-) create mode 100644 src/etools_datamart/apps/web/static/old_unicef_logo.png delete mode 100644 src/etools_datamart/apps/web/static/style.css.map diff --git a/docker/Makefile b/docker/Makefile index 124fab1f5..84ad1d95a 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -16,6 +16,7 @@ DOCKER_IMAGE=${DOCKER_IMAGE_NAME}:${TARGET} DOCKERFILE?=Dockerfile RUN_OPTIONS?= PIPENV_ARGS?= +PORTS= help: @echo "dev build dev image (based on local code)" @@ -44,7 +45,6 @@ build: cd .. && docker run \ --rm \ --name=${CONTAINER_NAME} \ - -p 8000:8000 \ -e CACHE_URL=redis://192.168.66.66:6379/1 \ -e CACHE_URL_API=redis://192.168.66.66:6379/2 \ -e CACHE_URL_LOCK=redis://192.168.66.66:6379/3 \ @@ -87,13 +87,13 @@ release: lazo upgrade datamart:datamart ${DOCKER_IMAGE_NAME}:${TARGET} -vvv run: - $(MAKE) .run + RUN_OPTIONS="-p 8000:8000" CONTAINER_NAME=datamart $(MAKE) .run workers: - CMD=workers $(MAKE) .run + CONTAINER_NAME=datamart-workers CMD=workers $(MAKE) .run beat: - CMD=beat $(MAKE) .run + CONTAINER_NAME=datamart-beat CMD=beat $(MAKE) .run test: diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 988b7f4a8..71b619875 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -6,7 +6,7 @@ mkdir -p ${STATIC_ROOT} rm -f /var/datamart/run/* django-admin diffsettings --output unified -django-admin makemigrations --dry-run +django-admin makemigrations --check --dry-run if [[ "$*" == "workers" ]];then django-admin db-isready --wait --timeout 60 --sleep 5 diff --git a/src/etools_datamart/apps/web/static/old_unicef_logo.png b/src/etools_datamart/apps/web/static/old_unicef_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8c6cd266344e3a1e169627a8991dfac292a3e6 GIT binary patch literal 357202 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

o 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

xkg?r6`Q~(pM$OG9+{ZhPJQ3yw$>t;K| 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

?J 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� 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

Xx6y=@-7k2ChE= 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� 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

o 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

xkg?r6`Q~(pM$OG9+{ZhPJQ3yw$>t;K| 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

?J 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 {% block left %}

{% endblock left %}
From cfb217513104c8c72ae2b6fed8d7d1b99a32d589 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 16:56:20 +0100 Subject: [PATCH 086/122] fixes dbtemplates migrations --- src/etools_datamart/config/settings.py | 2 + .../custom_migrations/__init__.py | 0 .../dbtemplates/0001_initial.py | 44 +++++++++++++++++++ .../dbtemplates/0002_auto_20190123_1403.py | 22 ++++++++++ .../custom_migrations/dbtemplates/__init__.py | 0 5 files changed, 68 insertions(+) create mode 100644 src/etools_datamart/custom_migrations/__init__.py create mode 100644 src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py create mode 100644 src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py create mode 100644 src/etools_datamart/custom_migrations/dbtemplates/__init__.py diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 0674dce48..8e7bc8530 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -628,3 +628,5 @@ def extra(r): SYSINFO = {"extra": {'Azure': extra}} + +MIGRATION_MODULES = {'dbtemplates': 'etools_datamart.custom_migrations.dbtemplates'} diff --git a/src/etools_datamart/custom_migrations/__init__.py b/src/etools_datamart/custom_migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py new file mode 100644 index 000000000..a9418abe0 --- /dev/null +++ b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import django +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sites', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Template', + fields=[ + ('id', models.AutoField( + verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('name', models.CharField( + help_text="Example: 'flatpages/default.html'", max_length=100, verbose_name='name')), + ('content', models.TextField(verbose_name='content', blank=True)), + ('creation_date', models.DateTimeField( + default=django.utils.timezone.now, verbose_name='creation date')), + ('last_changed', models.DateTimeField( + default=django.utils.timezone.now, verbose_name='last changed')), + ('sites', models.ManyToManyField( + to='sites.Site', verbose_name='sites', blank=True)), + ], + options={ + 'ordering': ('name',), + 'db_table': 'django_template', + 'verbose_name': 'template', + 'verbose_name_plural': 'templates', + }, + bases=(models.Model,), + managers=[ + ('objects', django.db.models.manager.Manager()), + ('on_site', django.contrib.sites.managers.CurrentSiteManager( + b'sites')), + ], + ), + ] diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py b/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py new file mode 100644 index 000000000..053557328 --- /dev/null +++ b/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py @@ -0,0 +1,22 @@ +# Generated by Django 2.1.5 on 2019-01-23 14:03 + +import django.contrib.sites.managers +import django.db.models.manager +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('dbtemplates', '0001_initial'), + ] + + operations = [ + migrations.AlterModelManagers( + name='template', + managers=[ + ('objects', django.db.models.manager.Manager()), + ('on_site', django.contrib.sites.managers.CurrentSiteManager('sites')), + ], + ), + ] diff --git a/src/etools_datamart/custom_migrations/dbtemplates/__init__.py b/src/etools_datamart/custom_migrations/dbtemplates/__init__.py new file mode 100644 index 000000000..e69de29bb From 5de46221012e07b8fa034fa86b56d2c7df77d662 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 16:57:01 +0100 Subject: [PATCH 087/122] updates dev env --- docker/Dockerfile | 5 +++-- docker/Makefile | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 93acc6e6a..e6d31754b 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -40,7 +40,7 @@ ARG PIPENV_ARGS ARG VERSION ENV VERSION ${VERSION} - +ENV ABSOLUTE_BASE_URL " ENV PIPENV_PYPI_MIRROR ${PIPENV_PYPI_MIRROR} ENV PIPENV_ARGS ${PIPENV_ARGS} ENV HOME /root/ @@ -48,7 +48,8 @@ ENV PIPSI_HOME=/usr/local/pipsi/environments ENV PIPSI_BIN_DIR=/usr/local/bin ENV PYTHONUNBUFFERED 1 ENV USE_GUNICORN 0 -ENV GUNICORN_CMD_ARGS " --name datamart \ +ENV GUNICORN_CMD_ARGS " -b 0.0.0.0:8000 \ +--name datamart \ --chdir /var/datamart \ --access-logfile - \ --timeout 120 \ diff --git a/docker/Makefile b/docker/Makefile index 84ad1d95a..6039ec356 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -17,6 +17,7 @@ DOCKERFILE?=Dockerfile RUN_OPTIONS?= PIPENV_ARGS?= PORTS= +ABSOLUTE_BASE_URL?="http://192.168.66.66:8000" help: @echo "dev build dev image (based on local code)" @@ -45,6 +46,7 @@ build: cd .. && docker run \ --rm \ --name=${CONTAINER_NAME} \ + -e ABSOLUTE_BASE_URL=${ABSOLUTE_BASE_URL} \ -e CACHE_URL=redis://192.168.66.66:6379/1 \ -e CACHE_URL_API=redis://192.168.66.66:6379/2 \ -e CACHE_URL_LOCK=redis://192.168.66.66:6379/3 \ @@ -87,13 +89,19 @@ release: lazo upgrade datamart:datamart ${DOCKER_IMAGE_NAME}:${TARGET} -vvv run: - RUN_OPTIONS="-p 8000:8000" CONTAINER_NAME=datamart $(MAKE) .run + RUN_OPTIONS="-p 8000:8000" \ + ABSOLUTE_BASE_URL=${ABSOLUTE_BASE_URL} \ + $(MAKE) .run workers: - CONTAINER_NAME=datamart-workers CMD=workers $(MAKE) .run + CONTAINER_NAME=datamart-workers \ + ABSOLUTE_BASE_URL=${ABSOLUTE_BASE_URL} \ + CMD=workers $(MAKE) .run beat: - CONTAINER_NAME=datamart-beat CMD=beat $(MAKE) .run + CONTAINER_NAME=datamart-beat \ + ABSOLUTE_BASE_URL=${ABSOLUTE_BASE_URL} \ + CMD=beat $(MAKE) .run test: From 1be8e41f510dd28040a3163e3ee3d4875d83acb9 Mon Sep 17 00:00:00 2001 From: sax Date: Wed, 23 Jan 2019 18:21:00 +0100 Subject: [PATCH 088/122] =?UTF-8?q?Bump=20version:=201.9a20=20=E2=86=92=20?= =?UTF-8?q?1.9a21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 10e8b4ef2..f6280951c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a20 +current_version = 1.9a21 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 6039ec356..c29262c33 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a20 +TARGET?=1.9a21 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 9fb879f28..82100d580 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a20' +VERSION = __version__ = '1.9a21' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From b50951430984c4a12776f7ab5092992ef620c3ef Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 00:03:44 +0100 Subject: [PATCH 089/122] loader refactoring --- Pipfile | 1 + Pipfile.lock | 160 ++++--- docker/Dockerfile | 2 +- src/etools_datamart/api/endpoints/common.py | 4 +- .../api/endpoints/datamart/intervention.py | 19 - src/etools_datamart/api/urls.py | 3 +- src/etools_datamart/apps/data/__init__.py | 1 + src/etools_datamart/apps/data/admin.py | 6 - src/etools_datamart/apps/data/apps.py | 9 + src/etools_datamart/apps/data/checks.py | 32 ++ src/etools_datamart/apps/data/loader.py | 231 ++++++++-- .../apps/data/management/commands/load.py | 96 ++++- .../apps/data/migrations/0001_initial.py | 7 +- src/etools_datamart/apps/data/models/base.py | 2 +- src/etools_datamart/apps/data/models/fam.py | 6 +- .../apps/data/models/funds_reservation.py | 4 +- src/etools_datamart/apps/data/models/hact.py | 39 +- src/etools_datamart/apps/data/models/pmp.py | 3 +- src/etools_datamart/apps/data/models/user.py | 3 +- src/etools_datamart/apps/etl/admin.py | 8 +- .../apps/etl/migrations/0001_initial.py | 3 +- src/etools_datamart/apps/etl/models.py | 9 + .../apps/etl/{tasks => }/tasks.py | 0 .../apps/etl/tasks/__init__.py | 3 - src/etools_datamart/apps/etl/tasks/etl.py | 404 ------------------ .../apps/security/migrations/0001_initial.py | 2 +- src/etools_datamart/apps/security/utils.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...123_1112.py => 0002_auto_20190124_0923.py} | 4 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...123_1112.py => 0002_auto_20190124_0923.py} | 4 +- .../apps/web/templates/base.html | 2 +- src/etools_datamart/apps/web/views.py | 2 +- src/etools_datamart/celery.py | 114 +++-- src/etools_datamart/config/settings.py | 6 +- .../dbtemplates/0001_initial.py | 35 +- .../dbtemplates/0002_auto_20190123_1403.py | 22 - .../libs/{medusa.py => mystica.py} | 14 +- .../migrations/0001_initial.py | 2 +- ...123_1112.py => 0002_auto_20190124_0923.py} | 8 +- .../migrations/0001_initial.py | 2 +- tests/.coveragerc | 21 +- tests/api/test_api_data.py | 24 +- tests/api/test_api_filtering.py | 14 +- tests/conftest.py | 12 +- tests/etl/test_etl_healthcheck.py | 2 +- tests/etl/test_etl_loaders.py | 4 +- tests/etl/test_etl_lock.py | 25 -- tests/etl/test_etl_tasklog.py | 45 +- tests/test_admin.py | 14 + tests/test_checks.py | 13 + 51 files changed, 636 insertions(+), 816 deletions(-) create mode 100644 src/etools_datamart/apps/data/apps.py create mode 100644 src/etools_datamart/apps/data/checks.py rename src/etools_datamart/apps/etl/{tasks => }/tasks.py (100%) delete mode 100644 src/etools_datamart/apps/etl/tasks/__init__.py delete mode 100644 src/etools_datamart/apps/etl/tasks/etl.py rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190123_1112.py => 0002_auto_20190124_0923.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190123_1112.py => 0002_auto_20190124_0923.py} (97%) delete mode 100644 src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py rename src/etools_datamart/libs/{medusa.py => mystica.py} (69%) rename src/unicef_rest_framework/migrations/{0002_auto_20190123_1112.py => 0002_auto_20190124_0923.py} (98%) delete mode 100644 tests/etl/test_etl_lock.py create mode 100644 tests/test_checks.py diff --git a/Pipfile b/Pipfile index 2364fbd31..c50f06f45 100644 --- a/Pipfile +++ b/Pipfile @@ -80,6 +80,7 @@ pytest-pythonpath = "*" tox = "*" vcrpy = "*" yapf = "*" +fancycompleter = {git = "https://github.com/theY4Kman/fancycompleter.git"} [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 8d1448e71..b700ce3b2 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "97b68922c65b2336254ce87847a150c34276ca025dc160e6fcd3d0ae61303718" + "sha256": "e43c5aadae45904e1ffb65c2a9498e8bb05da05918ee33617b3a64e0344d3bd7" }, "pipfile-spec": 6, "requires": { @@ -1268,53 +1268,53 @@ }, "psutil": { "hashes": [ - "sha256:1c19957883e0b93d081d41687089ad630e370e26dc49fd9df6951d6c891c4736", - "sha256:1c71b9716790e202a00ab0931a6d1e25db1aa1198bcacaea2f5329f75d257fff", - "sha256:3b7a4daf4223dae171a67a89314ac5ca0738e94064a78d99cfd751c55d05f315", - "sha256:3e19be3441134445347af3767fa7770137d472a484070840eee6653b94ac5576", - "sha256:6e265c8f3da00b015d24b842bfeb111f856b13d24f2c57036582568dc650d6c3", - "sha256:809c9cef0402e3e48b5a1dddc390a8a6ff58b15362ea5714494073fa46c3d293", - "sha256:b4d1b735bf5b120813f4c89db8ac22d89162c558cbd7fdd298866125fe906219", - "sha256:bbffac64cfd01c6bcf90eb1bedc6c80501c4dae8aef4ad6d6dd49f8f05f6fc5a", - "sha256:bfcea4f189177b2d2ce4a34b03c4ac32c5b4c22e21f5b093d9d315e6e253cd81" + "sha256:04d2071100aaad59f9bcbb801be2125d53b2e03b1517d9fed90b45eea51d297e", + "sha256:1aba93430050270750d046a179c5f3d6e1f5f8b96c20399ba38c596b28fc4d37", + "sha256:3ac48568f5b85fee44cd8002a15a7733deca056a191d313dbf24c11519c0c4a8", + "sha256:96f3fdb4ef7467854d46ad5a7e28eb4c6dc6d455d751ddf9640cd6d52bdb03d7", + "sha256:b755be689d6fc8ebc401e1d5ce5bac867e35788f10229e166338484eead51b12", + "sha256:c8ee08ad1b716911c86f12dc753eb1879006224fd51509f077987bb6493be615", + "sha256:d0c4230d60376aee0757d934020b14899f6020cd70ef8d2cb4f228b6ffc43e8f", + "sha256:d23f7025bac9b3e38adc6bd032cdaac648ac0074d18e36950a04af35458342e8", + "sha256:f0fcb7d3006dd4d9ccf3ccd0595d44c6abbfd433ec31b6ca177300ee3f19e54e" ], - "version": "==5.4.8" + "version": "==5.5.0" }, "psycopg2-binary": { "hashes": [ - "sha256:036bcb198a7cc4ce0fe43344f8c2c9a8155aefa411633f426c8c6ed58a6c0426", - "sha256:1d770fcc02cdf628aebac7404d56b28a7e9ebec8cfc0e63260bd54d6edfa16d4", - "sha256:1fdc6f369dcf229de6c873522d54336af598b9470ccd5300e2f58ee506f5ca13", - "sha256:21f9ddc0ff6e07f7d7b6b484eb9da2c03bc9931dd13e36796b111d631f7135a3", - "sha256:247873cda726f7956f745a3e03158b00de79c4abea8776dc2f611d5ba368d72d", - "sha256:3aa31c42f29f1da6f4fd41433ad15052d5ff045f2214002e027a321f79d64e2c", - "sha256:475f694f87dbc619010b26de7d0fc575a4accf503f2200885cc21f526bffe2ad", - "sha256:4b5e332a24bf6e2fda1f51ca2a57ae1083352293a08eeea1fa1112dc7dd542d1", - "sha256:570d521660574aca40be7b4d532dfb6f156aad7b16b5ed62d1534f64f1ef72d8", - "sha256:59072de7def0690dd13112d2bdb453e20570a97297070f876fbbb7cbc1c26b05", - "sha256:5f0b658989e918ef187f8a08db0420528126f2c7da182a7b9f8bf7f85144d4e4", - "sha256:649199c84a966917d86cdc2046e03d536763576c0b2a756059ae0b3a9656bc20", - "sha256:6645fc9b4705ae8fbf1ef7674f416f89ae1559deec810f6dd15197dfa52893da", - "sha256:6872dd54d4e398d781efe8fe2e2d7eafe4450d61b5c4898aced7610109a6df75", - "sha256:6ce34fbc251fc0d691c8d131250ba6f42fd2b28ef28558d528ba8c558cb28804", - "sha256:73920d167a0a4d1006f5f3b9a3efce6f0e5e883a99599d38206d43f27697df00", - "sha256:8a671732b87ae423e34b51139628123bc0306c2cb85c226e71b28d3d57d7e42a", - "sha256:8d517e8fda2efebca27c2018e14c90ed7dc3f04d7098b3da2912e62a1a5585fe", - "sha256:9475a008eb7279e20d400c76471843c321b46acacc7ee3de0b47233a1e3fa2cf", - "sha256:96947b8cd7b3148fb0e6549fcb31258a736595d6f2a599f8cd450e9a80a14781", - "sha256:abf229f24daa93f67ac53e2e17c8798a71a01711eb9fcdd029abba8637164338", - "sha256:b1ab012f276df584beb74f81acb63905762c25803ece647016613c3d6ad4e432", - "sha256:b22b33f6f0071fe57cb4e9158f353c88d41e739a3ec0d76f7b704539e7076427", - "sha256:b3b2d53274858e50ad2ffdd6d97ce1d014e1e530f82ec8b307edd5d4c921badf", - "sha256:bab26a729befc7b9fab9ded1bba9c51b785188b79f8a2796ba03e7e734269e2e", - "sha256:daa1a593629aa49f506eddc9d23dc7f89b35693b90e1fbcd4480182d1203ea90", - "sha256:dd111280ce40e89fd17b19c1269fd1b74a30fce9d44a550840e86edb33924eb8", - "sha256:e0b86084f1e2e78c451994410de756deba206884d6bed68d5a3d7f39ff5fea1d", - "sha256:eb86520753560a7e89639500e2a254bb6f683342af598088cb72c73edcad21e6", - "sha256:ff18c5c40a38d41811c23e2480615425c97ea81fd7e9118b8b899c512d97c737" - ], - "index": "pypi", - "version": "==2.7.6.1" + "sha256:19a2d1f3567b30f6c2bb3baea23f74f69d51f0c06c2e2082d0d9c28b0733a4c2", + "sha256:2b69cf4b0fa2716fd977aa4e1fd39af6110eb47b2bb30b4e5a469d8fbecfc102", + "sha256:2e952fa17ba48cbc2dc063ddeec37d7dc4ea0ef7db0ac1eda8906365a8543f31", + "sha256:348b49dd737ff74cfb5e663e18cb069b44c64f77ec0523b5794efafbfa7df0b8", + "sha256:3d72a5fdc5f00ca85160915eb9a973cf9a0ab8148f6eda40708bf672c55ac1d1", + "sha256:4957452f7868f43f32c090dadb4188e9c74a4687323c87a882e943c2bd4780c3", + "sha256:5138cec2ee1e53a671e11cc519505eb08aaaaf390c508f25b09605763d48de4b", + "sha256:587098ca4fc46c95736459d171102336af12f0d415b3b865972a79c03f06259f", + "sha256:5b79368bcdb1da4a05f931b62760bea0955ee2c81531d8e84625df2defd3f709", + "sha256:5cf43807392247d9bc99737160da32d3fa619e0bfd85ba24d1c78db205f472a4", + "sha256:676d1a80b1eebc0cacae8dd09b2fde24213173bf65650d22b038c5ed4039f392", + "sha256:6b0211ecda389101a7d1d3df2eba0cf7ffbdd2480ca6f1d2257c7bd739e84110", + "sha256:79cde4660de6f0bb523c229763bd8ad9a93ac6760b72c369cf1213955c430934", + "sha256:7aba9786ac32c2a6d5fb446002ed936b47d5e1f10c466ef7e48f66eb9f9ebe3b", + "sha256:7c8159352244e11bdd422226aa17651110b600d175220c451a9acf795e7414e0", + "sha256:945f2eedf4fc6b2432697eb90bb98cc467de5147869e57405bfc31fa0b824741", + "sha256:96b4e902cde37a7fc6ab306b3ac089a3949e6ce3d824eeca5b19dc0bedb9f6e2", + "sha256:9a7bccb1212e63f309eb9fab47b6eaef796f59850f169a25695b248ca1bf681b", + "sha256:a3bfcac727538ec11af304b5eccadbac952d4cca1a551a29b8fe554e3ad535dc", + "sha256:b19e9f1b85c5d6136f5a0549abdc55dcbd63aba18b4f10d0d063eb65ef2c68b4", + "sha256:b664011bb14ca1f2287c17185e222f2098f7b4c857961dbcf9badb28786dbbf4", + "sha256:bde7959ef012b628868d69c474ec4920252656d0800835ed999ba5e4f57e3e2e", + "sha256:cb095a0657d792c8de9f7c9a0452385a309dfb1bbbb3357d6b1e216353ade6ca", + "sha256:d16d42a1b9772152c1fe606f679b2316551f7e1a1ce273e7f808e82a136cdb3d", + "sha256:d444b1545430ffc1e7a24ce5a9be122ccd3b135a7b7e695c5862c5aff0b11159", + "sha256:d93ccc7bf409ec0a23f2ac70977507e0b8a8d8c54e5ee46109af2f0ec9e411f3", + "sha256:df6444f952ca849016902662e1a47abf4fa0678d75f92fd9dd27f20525f809cd", + "sha256:e63850d8c52ba2b502662bf3c02603175c2397a9acc756090e444ce49508d41e", + "sha256:ec43358c105794bc2b6fd34c68d27f92bea7102393c01889e93f4b6a70975728", + "sha256:f4c6926d9c03dadce7a3b378b40d2fea912c1344ef9b29869f984fb3d2a2420b" + ], + "index": "pypi", + "version": "==2.7.7" }, "pycparser": { "hashes": [ @@ -1468,30 +1468,30 @@ }, "ruamel.yaml": { "hashes": [ - "sha256:3858f420b03030f99da44414ff8275a95eb7a6b5613764dd520398fb63951822", - "sha256:47982ea36529d971c453105ead01788161326bb5349d2aea900da6c0e5f628b5", - "sha256:527b7978560bc79b5f71b08d8db1ab16d367a08bdf1c2790b1ffb2fac94e46ae", - "sha256:65c96f9e0a8117be90cd8e23fc4e1d2c94fa410f4364bf70a97aa3cc4e4f4769", - "sha256:7a1ab9228c48f4741b5d07961e99e898e88afc040343b31b75e1dc1b3f8cee7c", - "sha256:87c60bd6b282f41a0403df5d59ec1fb1876311e84f5609ada47f17f64406e4d0", - "sha256:91f93c1938867551e554ea295ef91f84720a68b711d37b9f7d442fd3903082da", - "sha256:9523308cd0b071f0f8b631ec4f310eb58b3e2b4adbd14a2661783e2c5e8e1fdc", - "sha256:97cfa9bca4980aa9a77788fe9fbed178bcf5556dd2e917f52fda70ce7bb38a95", - "sha256:a21e26cf0143d22d9743d23b5531f66385aaf3fb54641782b20c6139239a8a93", - "sha256:a5167a1b098c86d1b1c9f0d73b7c65e70876d54a11fb1ada4586ba557d2fe165", - "sha256:a889dc3d6cffb64ca89fac053455b7a778f922b65843263023e998c0fcce001e", - "sha256:a925760fa1eb8dece3e07ee32485da8d5253cfcd78df25938371a5f5acdaa8a4", - "sha256:a92fd8e32d824392c0cec96a77e374bb77ceda4b99b1d18c776631e18fc54ffe", - "sha256:b20e3130b4b5b210365d6760b7d3c87cc9c40e456fa14049f9257bc62cf0d2c9", - "sha256:cb21f6bad6eade16868efc86fe1bb3e7a3d61137af2bf064dd1e7ed0d629ca9c", - "sha256:ccb1a0860a602d83898dd71280db142a3502702be3976ffc35eef9eb19585169", - "sha256:d70eec8bd287798e7905d57d503b1091c8424ba736e287b75f39f1b5a0235d71", - "sha256:d8a39781c49a892dd0f936d472d850a9aa163205475ad6c90a0f4d0c4d90ee30", - "sha256:d98b3d421eebf7e10311ab12f41c5b0353e7cae1cc78f51312e24f569d593de0", - "sha256:e67ea0cf80682e539707fcd8811b7369d8b97b1b48b1d7b16e21cd7f6c2c2e40", - "sha256:feec97614776442b4dd5029eb16e15f5e582ffc5cf534cba5eefd07062e11eec" - ], - "version": "==0.15.86" + "sha256:18078354bfcf00d51bcc17984aded80840379aed36036f078479e191b59bc059", + "sha256:211e6ef2530f44fc3197c713892678e7fbfbc40a1db6741179d6981514be1674", + "sha256:2e8f7cee12a2372cec4480fe81086b1fdab163f4b56e58b5592a105c52973b78", + "sha256:48cc8e948a7ec4917bf94adff2cc1255e98f1eef5e1961889886acc4ff3a7194", + "sha256:4a0c7f970aa0e30bc541f690fbd14aca19de1cab70787180de5083b902ec40b5", + "sha256:5dd0ea7c5c703e8675f3caf2898a50b4dadaa52838f8e104637a452a05e03030", + "sha256:612fb4833f1978ceb7fd7a24d86a5ebd103bcc408394f3af621293194658cf1b", + "sha256:61c421a7a2b8e2886a94fbe29866df6b99451998abaa1584b9fdc9c10c33e40b", + "sha256:6483416847980aa7090b697d177a8754c4f340683cc84abd38da7b850826687d", + "sha256:6622f3b0cae7ed6fe5d3d6a6d8d8cb9413a05b408d69a789a57b77a616bb6562", + "sha256:80b2acde0d1b9d25e5c041960a9149480c15c6d9f4c24b8ddb381b14e9e70ea4", + "sha256:8f9ed94be17f306485df8fd0274a30f130a73f127798657d4dc65b1f89ec7a36", + "sha256:9a6b94cc9b6e738036426498ac9fe8ca05afea4249fb9dec1be32ce4823d5756", + "sha256:a4b11dfe421a9836c723107a4ccc9cab9674de611ba60b8212e85526ea8bf254", + "sha256:a55e55c6ecb5725ba472f9b811940e8d258a32fb36f5793dbc38582d6f377f3f", + "sha256:a736ab1d8c2d5566254a1a2ee38e7c5460520bcccd4a8f0feb25a4463735e5a7", + "sha256:c29d0a3cffa5a25f5259bfeac06ffdc5e7d1fd38a0a26a6664d160192730434f", + "sha256:c33458217a8c352b59c86065c4f05f3f1ac28b01c3e1a422845c306237446bf3", + "sha256:cc9bd3c3fa8a928f7b6e19fe8de13a61deb91f257eccbe0d16114ce8c54cdc81", + "sha256:d63b7c828a7358ce5b03a3e2c2a3e5a7058a954f8919334cb09b3d8541d1fff6", + "sha256:fbd301680a3563e84d667042dac1c5d50ef402ecf1f4b1763507a6877b8181ad", + "sha256:fc67e79e2f5083be6fd1000c4646e13a891585772a503f56f51f845b547fe621" + ], + "version": "==0.15.87" }, "six": { "hashes": [ @@ -1789,16 +1789,14 @@ }, "faker": { "hashes": [ - "sha256:228419b0a788a7ac867ebfafdd438461559ab1a0975edb607300852d9acaa78d", - "sha256:52a3dcc6a565b15fe1c95090321756d5a8a7c1caf5ab3df2f573ed70936ff518" + "sha256:16342dca4d92bfc83bab6a7daf6650e0ab087605a66bc38f17523fdb01757910", + "sha256:d871ea315b2dcba9138b8344f2c131a76ac62d6227ca39f69b0c889fec97376c" ], - "version": "==1.0.1" + "version": "==1.0.2" }, "fancycompleter": { - "hashes": [ - "sha256:d2522f1f3512371f295379c4c0d1962de06762eb586c199620a2a5d423539b12" - ], - "version": "==0.8" + "git": "https://github.com/theY4Kman/fancycompleter.git", + "ref": "69f38763ace1a8fb62670deb415dcda77962ce82" }, "filelock": { "hashes": [ @@ -1925,10 +1923,10 @@ }, "parso": { "hashes": [ - "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + "sha256:4b8f9ed80c3a4a3191aa3261505d868aa552dd25649cb13a7d73b6b7315edf2d", + "sha256:5a120be2e8863993b597f1c0437efca799e90e0793c98ae5d4e34ebd00140e31" ], - "version": "==0.3.1" + "version": "==0.3.2" }, "pdbpp": { "hashes": [ @@ -2102,10 +2100,10 @@ }, "soupsieve": { "hashes": [ - "sha256:10687fc53eeb3518e01a0ac84d3d711da623d3298a3039459d3f649927c4a270", - "sha256:b23a0d7da0247200fe83c67c34de9d7599ad404106367313d8e65e04174d0b4b" + "sha256:466910df7561796a60748826781ebe9a888f7a1668a636ae86783f44d10aae73", + "sha256:87db12ae79194f0ff9808d2b1641c4f031ae39ffa3cab6b907ea7c1e5e5ed445" ], - "version": "==1.7.2" + "version": "==1.7.3" }, "text-unidecode": { "hashes": [ diff --git a/docker/Dockerfile b/docker/Dockerfile index e6d31754b..56a4d3066 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -40,7 +40,7 @@ ARG PIPENV_ARGS ARG VERSION ENV VERSION ${VERSION} -ENV ABSOLUTE_BASE_URL " +ENV ABSOLUTE_BASE_URL "http://datamart.unicef.io" ENV PIPENV_PYPI_MIRROR ${PIPENV_PYPI_MIRROR} ENV PIPENV_ARGS ${PIPENV_ARGS} ENV HOME /root/ diff --git a/src/etools_datamart/api/endpoints/common.py b/src/etools_datamart/api/endpoints/common.py index 7876e51d4..202e44a95 100644 --- a/src/etools_datamart/api/endpoints/common.py +++ b/src/etools_datamart/api/endpoints/common.py @@ -22,7 +22,7 @@ from etools_datamart.api.filtering import CountryFilter, DatamartQueryStringFilterBackend, TenantCountryFilter from etools_datamart.apps.etl.models import EtlTask from etools_datamart.apps.multitenant.exceptions import InvalidSchema, NotAuthorizedSchema -from etools_datamart.libs.medusa import MedusaBasicAuthentication +from etools_datamart.libs.mystica import MysticaBasicAuthentication __all__ = ['APIMultiTenantReadOnlyModelViewSet'] @@ -61,7 +61,7 @@ class APIReadOnlyModelViewSet(URFReadOnlyModelViewSet, IQYConnectionMixin, OrderingFilter, DynamicSerializerFilter, ] - authentication_classes = URFReadOnlyModelViewSet.authentication_classes + (MedusaBasicAuthentication,) + authentication_classes = URFReadOnlyModelViewSet.authentication_classes + (MysticaBasicAuthentication,) ordering_fields = ('id',) ordering = 'id' family = 'datamart' diff --git a/src/etools_datamart/api/endpoints/datamart/intervention.py b/src/etools_datamart/api/endpoints/datamart/intervention.py index dd633068c..e43aed1bf 100644 --- a/src/etools_datamart/api/endpoints/datamart/intervention.py +++ b/src/etools_datamart/api/endpoints/datamart/intervention.py @@ -47,24 +47,5 @@ class InterventionViewSet(common.DataMartViewSet): 'budget': InterventionSerializerBudget, 'short': ["title", "number", "country_name", "start_date"]} - def process_filter_last_modify_date__range(self): - return {} - - # def get_filter_backends(self, removes=None): - # return super().get_filter_backends() - # - # def get_schema_fields(self): - # return super().get_schema_fields() - def get_querystringfilter_form(self, request, filter): return InterventionFilterForm(request.GET, filter.form_prefix) - # fields = OrderedDict([ - # (name, forms.CharField(required=False)) - # for name in self.filter_fields if name not in ('status', - # 'start_date', - # 'submission_date', - # 'document_type', - # 'last_modify_date')]) - # - # return type(str('%sForm' % self.__class__.__name__), - # (InterventionFilterForm,), fields)(request.GET, filter.form_prefix) diff --git a/src/etools_datamart/api/urls.py b/src/etools_datamart/api/urls.py index 687a027b3..15b24ba80 100644 --- a/src/etools_datamart/api/urls.py +++ b/src/etools_datamart/api/urls.py @@ -8,8 +8,7 @@ class ReadOnlyRouter(APIReadOnlyRouter): - def inspect(self): - pass + pass router = ReadOnlyRouter() diff --git a/src/etools_datamart/apps/data/__init__.py b/src/etools_datamart/apps/data/__init__.py index 40a96afc6..b1f311478 100644 --- a/src/etools_datamart/apps/data/__init__.py +++ b/src/etools_datamart/apps/data/__init__.py @@ -1 +1,2 @@ # -*- coding: utf-8 -*- +default_app_config = 'etools_datamart.apps.data.apps.Config' diff --git a/src/etools_datamart/apps/data/admin.py b/src/etools_datamart/apps/data/admin.py index 55f3c240c..4e8cb4aec 100644 --- a/src/etools_datamart/apps/data/admin.py +++ b/src/etools_datamart/apps/data/admin.py @@ -33,12 +33,6 @@ class DatamartChangeList(ChangeList): class DataModelAdmin(ExtraUrlMixin, ModelAdmin): actions = [mass_update, ] - def __init__(self, model, admin_site): - import etools_datamart.apps.etl.tasks.etl as mod - # we ned to force celery task initialization - self.loaders = [v for v in mod.__dict__.values() if hasattr(v, 'apply_async')] - super().__init__(model, admin_site) - def get_list_filter(self, request): if SchemaFilter not in self.list_filter: self.list_filter = (SchemaFilter,) + self.list_filter diff --git a/src/etools_datamart/apps/data/apps.py b/src/etools_datamart/apps/data/apps.py new file mode 100644 index 000000000..0070b6536 --- /dev/null +++ b/src/etools_datamart/apps/data/apps.py @@ -0,0 +1,9 @@ +# -*- coding: utf-8 -*- +from django.apps import AppConfig + + +class Config(AppConfig): + name = 'etools_datamart.apps.data' + + def ready(self): + from . import checks # noqa diff --git a/src/etools_datamart/apps/data/checks.py b/src/etools_datamart/apps/data/checks.py new file mode 100644 index 000000000..1ad2034f0 --- /dev/null +++ b/src/etools_datamart/apps/data/checks.py @@ -0,0 +1,32 @@ +from django.apps import apps +from django.core import checks +from django.core.checks import Error + +from etools_datamart.apps.data.loader import loadeables + + +@checks.register() +def check_loader(app_configs, **kwargs): + errors = [] + for model_name in loadeables: + model = apps.get_model(model_name) + cfg = model.loader.config + # if cfg.queryset is None and cfg.source is None: + # errors.append(Error( + # "LoaderOptions must set 'source' or 'queryset' attribunte", + # hint='', + # obj=model.loader, + # id='H001', + # )) + if cfg.last_modify_field: + try: + cfg.source._meta.get_field(cfg.last_modify_field) + except Exception: + errors.append(Error( + f"LoaderOptions last_modify_field: '{cfg.last_modify_field}' does not exists in {cfg.source}", + hint='', + obj=model.loader, + id='L001', + )) + + return errors diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index a0b8d0d05..e1ad9b3cc 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -1,12 +1,16 @@ +import datetime import logging +import time from inspect import isclass +from django.contrib.contenttypes.models import ContentType from django.core.cache import caches -from django.db import connections, models -from django.db.transaction import atomic +from django.db import connections, models, transaction from django.utils import timezone +from django.utils.functional import cached_property import celery +from celery.exceptions import Retry from crashlog.middleware import process_exception from redis.exceptions import LockError from strategy_field.utils import fqn, get_attr @@ -24,17 +28,32 @@ UNCHANGED = 'unchanged' DELETED = 'deleted' +RUN_UNKNOWN = 0 +RUN_MANUAL = 1 +RUN_COMMAND = 2 +RUN_SCHEDULE = 3 +RUN_QUEUED = 4 +RUN_AS_REQUIREMENT = 5 +RUN_TYPES = ((RUN_UNKNOWN, ""), + (RUN_MANUAL, "Manual"), + (RUN_COMMAND, "cli"), + (RUN_SCHEDULE, "Celery"), + (RUN_QUEUED, "Forced queue"), + (RUN_AS_REQUIREMENT, "Required by task"), + ) + class EtlResult: __slots__ = [CREATED, UPDATED, UNCHANGED, DELETED, 'status', 'context', 'error'] - def __init__(self, updated=0, created=0, unchanged=0, deleted=0, status='SUCCESS', context=None, **kwargs): + def __init__(self, updated=0, created=0, unchanged=0, deleted=0, + status='SUCCESS', context=None, error=None, **kwargs): self.created = created self.updated = updated self.unchanged = unchanged self.deleted = deleted self.status = status - self.error = None + self.error = error self.context = context or {} def __repr__(self): @@ -91,9 +110,17 @@ def is_record_changed(record, values): source_id=record.pk) +class RequiredIsRunning(Exception): + pass + + +class RequiredIsMissing(Exception): + pass + + class LoaderOptions: - __attrs__ = ['mapping', 'celery', 'source', - 'queryset', 'key', 'locks', + __attrs__ = ['mapping', 'celery', 'source', 'last_modify_field', + 'queryset', 'key', 'locks', 'filters', 'depends', 'timeout', 'lock_key'] def __init__(self, base=None): @@ -105,6 +132,9 @@ def __init__(self, base=None): self.key = DEFAULT_KEY self.timeout = None self.depends = () + self.filters = None + self.last_modify_field = None + if base: for attr in self.__attrs__: if hasattr(base, attr): @@ -114,9 +144,6 @@ def __init__(self, base=None): else: setattr(self, attr, getattr(base, attr, getattr(self, attr))) - if not self.queryset and self.source: - self.queryset = lambda: self.source.objects - def contribute_to_class(self, model, name): self.model = model setattr(model, name, self) @@ -132,7 +159,11 @@ def __init__(self, loader) -> None: self.name = "load_{0.app_label}_{0.model_name}".format(loader.model._meta) def run(self, *args, **kwargs): - return self.loader.load() + logger.debug(kwargs) + try: + return self.loader.load(run_type=RUN_SCHEDULE, check_requirement=True) + except (RequiredIsRunning, RequiredIsMissing): # pragma: no cover + raise Retry class Loader: @@ -145,6 +176,10 @@ def __init__(self) -> None: def __repr__(self): return "<%sLoader>" % self.model._meta.object_name + @property + def model_name(self): + return ".".join([self.model._meta.app_label, self.model._meta.model_name]) + def contribute_to_class(self, model, name): self.model = model self.config = model._etl_config @@ -157,7 +192,57 @@ def contribute_to_class(self, model, name): setattr(model, name, self) - def process(self, filters, values): + def get_queryset(self, context): + + if self.config.queryset: + ret = self.config.queryset() + elif self.config.source: + ret = self.config.source.objects.all() + else: # pragma: no cover + raise ValueError("Option must define 'queryset' or 'source' attribute") + + return ret + + def filter_queryset(self, qs, context): + use_delta = context['filter_last_modified'] and not context['is_empty'] + + if self.config.filters: + qs = qs.filter(**self.config.filters) + if use_delta and (self.config.last_modify_field and self.last_run): + logger.info("Loader {self}: use deltas") + qs = qs.filter(**{f"{self.config.last_modify_field}__gte": self.last_run}) + return qs + + @property + def last_run(self): + last_run = self.etl_task.last_run + # delta is not required as last_run is set at the beginning + # here just for safety + if last_run and self.etl_task.elapsed: + delta = datetime.timedelta(seconds=self.etl_task.elapsed) + return last_run - delta + return None + + def is_running(self): + return self.etl_task.status == 'RUNNING' + + def need_refresh(self, sender): + if not self.etl_task.last_success: + return True + if self.etl_task.status != 'SUCCESS': + return True + + if sender.etl_task.last_success: + return self.etl_task.last_success.day < sender.etl_task.last_run.day + return False + + def process(self, filters, values, context): + stdout = context['stdout'] + verbosity = context['verbosity'] + if stdout and verbosity > 2: # pragma: no cover + stdout.write('.') + stdout.flush() + try: record, created = self.model.objects.get_or_create(**filters, defaults=values) @@ -196,7 +281,7 @@ def get_values(self, country, record, context): try: ret[k] = v.objects.get(schema_name=country.schema_name, source_id=getattr(record, k).id) - except AttributeError: + except AttributeError: # pragma: no cover pass elif callable(v): ret[k] = v(country, record) @@ -218,19 +303,15 @@ def post_process_country(self, country, context): self.model.objects.filter(id__in=self.seen).update(seen=context['today']) def process_country(self, country, context): - qs = self.config.queryset() - stdout = context['stdout'] + qs = self.filter_queryset(self.get_queryset(context), context) max_records = context['max_records'] self.seen = [] for record in qs.all(): filters = self.config.key(country, record) values = self.get_values(country, record, context) - op = self.process(filters, values) + op = self.process(filters, values, context) self.results.incr(op) context['records'] += 1 - if stdout: # pragma: no cover - stdout.write('.') - stdout.flush() if max_records and context['records'] >= max_records: break @@ -251,18 +332,78 @@ def unlock(self): except LockError: pass - @atomic() + @cached_property + def etl_task(self): + from etools_datamart.apps.etl.models import EtlTask + return EtlTask.objects.get_or_create(task=self.task.name, + content_type=ContentType.objects.get_for_model(self.config.model), + table_name=self.config.model._meta.db_table)[0] + + def on_start(self, run_type): + from django.utils import timezone + logger.info(f"Start loader {self}") + self._start = time.time() + + defs = {'status': 'RUNNING', + 'elapsed': None, + 'run_type': run_type, + 'last_run': timezone.now()} + self.etl_task.update(**defs) + + def on_end(self, error=None): + from etools_datamart.apps.subscriptions.models import Subscription + from django.utils import timezone + + cost = time.time() - self._start + defs = {'elapsed': cost, + 'results': self.results.as_dict()} + if error: + defs['status'] = 'FAILURE' + defs['results'] = str(error) + defs['last_failure'] = timezone.now() + else: + defs['status'] = 'SUCCESS' + if self.results.error: + defs['status'] = 'ERROR' + defs['last_failure'] = timezone.now() + else: + defs['last_success'] = timezone.now() + defs['last_failure'] = None + if self.results.created > 0 or self.results.updated > 0: + defs['last_changes'] = timezone.now() + for service in self.config.model.linked_services: + service.invalidate_cache() + Subscription.objects.notify(self.config.model) + self.etl_task.update(**defs) + def load(self, *, verbosity=0, always_update=False, stdout=None, - ignore_dependencies=False, max_records=None, countries=None): + ignore_dependencies=False, max_records=None, countries=None, + ignore_last_modify_field=False, run_type=RUN_UNKNOWN, + check_requirements=False, force_requirements=False): + self.on_start(run_type) have_lock = False self.results = EtlResult() lock = locks.lock(self.config.lock_key, timeout=self.config.timeout) + logger.debug(f"Running loader {self}") + try: have_lock = lock.acquire(blocking=False) if have_lock: # pragma: no branch if not ignore_dependencies: - for dependency in self.config.depends: - dependency.loader.load(stdout=stdout) + for requirement in self.config.depends: + if force_requirements or requirement.loader.need_refresh(self): + if check_requirements: + raise RequiredIsMissing(requirement) + logger.info(f"Loader {requirement} need refresh") + if requirement.loader.is_running(): + raise RequiredIsRunning(requirement) + logger.info(f"Load required dataset {requirement}") + requirement.loader.load(stdout=stdout, + force_requirements=force_requirements, + check_requirements=check_requirements, + run_type=RUN_AS_REQUIREMENT) + else: + logger.info(f"Loader {requirement} is uptodate") self.always_update = always_update connection = connections['etools'] if not countries: # pragma: no branch @@ -279,28 +420,44 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, context = self.get_context(today=today, countries=countries, max_records=max_records, + verbosity=verbosity, records=0, + filter_last_modified=not ignore_last_modify_field, + is_empty=self.model.objects.exists(), stdout=stdout) - self.results.context = context - for country in countries: - if stdout: # pragma: no cover - stdout.write(f"{country}\n") - connection.set_schemas([country.schema_name]) - self.process_country(country, context) - self.post_process_country(country, context) - if max_records and context['records'] >= max_records: - break - if stdout: # pragma: no cover - stdout.write("\n") - # deleted = self.model.objects.exclude(seen=today).delete()[0] - # self.results.deleted = deleted - - except LoaderException: # pragma: no cover + sid = transaction.savepoint() + total_countries = len(countries) + try: + self.results.context = context + for i, country in enumerate(countries, 1): + if stdout and verbosity > 0: # pragma: no cover + stdout.write(f"{i:>3}/{total_countries} {country}") + connection.set_schemas([country.schema_name]) + self.process_country(country, context) + self.post_process_country(country, context) + if max_records and context['records'] >= max_records: + break + if stdout and verbosity > 0: # pragma: no cover + stdout.write("\n") + # deleted = self.model.objects.exclude(seen=today).delete()[0] + # self.results.deleted = deleted + except Exception: # pragma: no cover + transaction.savepoint_rollback(sid) + raise + else: + logger.info(f"Unable to get lock for {self}") + + except BaseException as e: # pragma: no cover + self.on_end(e) + process_exception(e) raise + else: + self.on_end(None) finally: if have_lock: # pragma: no branch try: lock.release() except LockError as e: # pragma: no cover logger.warning(e) + return self.results diff --git a/src/etools_datamart/apps/data/management/commands/load.py b/src/etools_datamart/apps/data/management/commands/load.py index 2972a15a6..ad3ea7280 100644 --- a/src/etools_datamart/apps/data/management/commands/load.py +++ b/src/etools_datamart/apps/data/management/commands/load.py @@ -5,11 +5,33 @@ from django.apps import apps from django.core.management import BaseCommand -from etools_datamart.apps.data.loader import loadeables +from etools_datamart.apps.data.loader import loadeables, RUN_COMMAND +from etools_datamart.apps.etl.models import EtlTask logger = logging.getLogger(__name__) +def setup_logging(verbosity): + level = {3: logging.DEBUG, + 2: logging.INFO, + 1: logging.ERROR, + 0: logging.NOTSET}[verbosity] + + targets = ['etools_datamart.apps.data.loader'] + consoleLogger = logging.StreamHandler() + formatter = logging.Formatter('%(levelname)s - %(message)s') + consoleLogger.setLevel(logging.DEBUG) + consoleLogger.setFormatter(formatter) + rootLogger = logging.getLogger() + rootLogger.addHandler(consoleLogger) + + for target in targets: + logger = logging.getLogger(target) + logger.setLevel(level) + logger.propagate = False + logger.addHandler(consoleLogger) + + class Command(BaseCommand): args = '' help = '' @@ -20,6 +42,10 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('args', metavar='models', nargs='*', help='One or more application label.') + parser.add_argument('-e', '--exclude', + metavar='excludes', + nargs='*', help='exclude.') + parser.add_argument( '--all', action='store_true', help="Run all loaders.", @@ -34,7 +60,22 @@ def add_arguments(self, parser): ) parser.add_argument( '--no-deps', action='store_true', - help="Unlock all loaders.", + help="Ingnore status of required datasets", + ) + + parser.add_argument( + '--ignore-last-modify-field', action='store_true', + help="Do not use last_modify_field if present. Reload full dataset.", + ) + + parser.add_argument( + '--debug', action='store_true', + help="maximum logging level", + ) + + parser.add_argument( + '--failed', action='store_true', + help="Run only failed tasks", ) def notify(self, model, created, name, tpl=" {op} {model} `{name}`"): @@ -46,24 +87,49 @@ def notify(self, model, created, name, tpl=" {op} {model} `{name}`"): def handle(self, *model_names, **options): self.verbosity = options['verbosity'] + _all = options['all'] + debug = options['debug'] unlock = options['unlock'] + excludes = options['exclude'] or [] + if debug: + setup_logging(self.verbosity) if _all: - model_names = sorted(list(loadeables)) + model_names = sorted([m for m in loadeables if m not in excludes]) + elif options['failed']: + qs = EtlTask.objects.exclude(status__in=['SUCCESS', 'RUNNING']) + model_names = [t.loader.model_name for t in qs] if not model_names: for model_name in sorted(list(loadeables)): self.stdout.write(model_name) else: - for model_name in model_names: - model = apps.get_model(model_name) - if unlock: - model.loader.load.unlock() - res = model.loader.load(always_update=options['ignore_changes'], - ignore_dependencies=options['no_deps'], - stdout=sys.stdout) - self.stdout.write(f"{model_name:20}: " - f" created: {res.created:<3}" - f" updated: {res.updated:<3}" - f" unchanged: {res.unchanged:<3}\n" - ) + try: + for model_name in model_names: + if self.verbosity > 0: + self.stdout.write(f"Loading {model_name}") + try: + model = apps.get_model(model_name) + except LookupError: + self.stderr.write(f'Invalid model {model_name}') + self.stderr.write(f'Available choices are:') + for model_name in sorted(list(loadeables)): + self.stderr.write(f" - {model_name}") + return "" + + if unlock: + if self.verbosity > 1: + self.stdout.write(f"Unlock {model_name}") + model.loader.unlock() + res = model.loader.load(always_update=options['ignore_changes'], + ignore_dependencies=options['no_deps'], + verbosity=self.verbosity, + run_type=RUN_COMMAND, + stdout=sys.stdout) + self.stdout.write(f"{model_name:20}: " + f" created: {res.created:<3}" + f" updated: {res.updated:<3}" + f" unchanged: {res.unchanged:<3}\n" + ) + except KeyboardInterrupt: + return "Interrupted" diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index fe1181393..462419b2c 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -86,6 +86,7 @@ class Migration(migrations.Migration): ('modified', models.DateTimeField()), ('donor', models.CharField(blank=True, max_length=256, null=True)), ('donor_code', models.CharField(blank=True, max_length=30, null=True)), + ('pd_ssfa_number', models.CharField(max_length=64, null=True)), ('source_id', models.IntegerField()), ('source_intervention_id', models.IntegerField()), ], @@ -297,7 +298,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, + unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, ), migrations.AddField( model_name='fundsreservation', @@ -314,6 +315,6 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='fundsreservation', - unique_together={('schema_name', 'source_id'), ('schema_name', 'fr_number')}, + unique_together={('schema_name', 'fr_number'), ('schema_name', 'source_id')}, ), ] diff --git a/src/etools_datamart/apps/data/models/base.py b/src/etools_datamart/apps/data/models/base.py index 642438161..9c4249e01 100644 --- a/src/etools_datamart/apps/data/models/base.py +++ b/src/etools_datamart/apps/data/models/base.py @@ -17,7 +17,7 @@ def get(self, *args, **kwargs): raise self.model.DoesNotExist( "%s (%s %s)" % (e, args, kwargs) ) - except self.model.MultipleObjectsReturned as e: + except self.model.MultipleObjectsReturned as e: # pragma: no cover raise self.model.MultipleObjectsReturned( "%s (%s %s) " % (e, args, kwargs) ) diff --git a/src/etools_datamart/apps/data/models/fam.py b/src/etools_datamart/apps/data/models/fam.py index 08df85eac..a3d24909c 100644 --- a/src/etools_datamart/apps/data/models/fam.py +++ b/src/etools_datamart/apps/data/models/fam.py @@ -29,7 +29,8 @@ def process_country(self, country, context): country_name=country.name, area_code=country.business_area_code, schema_name=country.schema_name), - values=values) + values=values, + context=context) self.results.incr(op) @@ -59,3 +60,6 @@ class Meta: verbose_name = "FAM Indicator" loader = FAMIndicatorLoader() + + class Option: + pass diff --git a/src/etools_datamart/apps/data/models/funds_reservation.py b/src/etools_datamart/apps/data/models/funds_reservation.py index b60fc7caa..a7254748b 100644 --- a/src/etools_datamart/apps/data/models/funds_reservation.py +++ b/src/etools_datamart/apps/data/models/funds_reservation.py @@ -43,7 +43,7 @@ class FundsReservation(DataMartModel): donor_code = models.CharField(max_length=30, blank=True, null=True) # extras - + pd_ssfa_number = models.CharField(max_length=64, null=True) # internals source_id = models.IntegerField() source_intervention_id = models.IntegerField() @@ -60,6 +60,7 @@ class Options: depends = (Intervention,) source = FundsFundsreservationitem queryset = lambda: FundsFundsreservationitem.objects.select_related('fund_reservation') + last_modify_field = 'modified' key = lambda country, record: dict(country_name=country.name, schema_name=country.schema_name, fr_number=record.fund_reservation.fr_number) @@ -67,6 +68,7 @@ class Options: mapping = dict(vendor_code='fund_reservation.vendor_code', fr_number='fund_reservation.fr_number', document_date='fund_reservation.document_date', + pd_ssfa_number='fund_reservation.number', fr_type='fund_reservation.fr_type', currency='fund_reservation.currency', document_text='fund_reservation.document_text', diff --git a/src/etools_datamart/apps/data/models/hact.py b/src/etools_datamart/apps/data/models/hact.py index 154ef70b3..6bde6be0b 100644 --- a/src/etools_datamart/apps/data/models/hact.py +++ b/src/etools_datamart/apps/data/models/hact.py @@ -11,23 +11,28 @@ class HACTLoader(Loader): def process_country(self, country, context): today = timezone.now() - aggregate = HactAggregatehact.objects.get(year=today.year) - data = json.loads(aggregate.partner_values) - - # # Total number of completed Microassessments in the business area in the past year - values = dict(microassessments_total=data['assurance_activities']['micro_assessment'], - programmaticvisits_total=data['assurance_activities']['programmatic_visits']['completed'], - followup_spotcheck=data['assurance_activities']['spot_checks']['follow_up'], - completed_spotcheck=data['assurance_activities']['spot_checks']['completed'], - completed_hact_audits=data['assurance_activities']['scheduled_audit'], - completed_special_audits=data['assurance_activities']['special_audit'], - ) - op = self.process(filters=dict(year=today.year, - area_code=country.business_area_code, - country_name=country.name, - schema_name=country.schema_name), - values=values) - self.results.incr(op) + try: + aggregate = HactAggregatehact.objects.get(year=today.year) + + data = json.loads(aggregate.partner_values) + + # # Total number of completed Microassessments in the business area in the past year + values = dict(microassessments_total=data['assurance_activities']['micro_assessment'], + programmaticvisits_total=data['assurance_activities']['programmatic_visits']['completed'], + followup_spotcheck=data['assurance_activities']['spot_checks']['follow_up'], + completed_spotcheck=data['assurance_activities']['spot_checks']['completed'], + completed_hact_audits=data['assurance_activities']['scheduled_audit'], + completed_special_audits=data['assurance_activities']['special_audit'], + ) + op = self.process(filters=dict(year=today.year, + area_code=country.business_area_code, + country_name=country.name, + schema_name=country.schema_name), + values=values, + context=context) + self.results.incr(op) + except HactAggregatehact.DoesNotExist: + pass class HACT(DataMartModel): diff --git a/src/etools_datamart/apps/data/models/pmp.py b/src/etools_datamart/apps/data/models/pmp.py index f7661d6f7..10ed9644c 100644 --- a/src/etools_datamart/apps/data/models/pmp.py +++ b/src/etools_datamart/apps/data/models/pmp.py @@ -56,7 +56,8 @@ def process_country(self, country, context): schema_name=country.schema_name, partner_id=partner.pk, intervention_id=intervention.pk), - values=values) + values=values, + context=context) self.results.incr(op) diff --git a/src/etools_datamart/apps/data/models/user.py b/src/etools_datamart/apps/data/models/user.py index dde3c5a2b..c63cb37d2 100644 --- a/src/etools_datamart/apps/data/models/user.py +++ b/src/etools_datamart/apps/data/models/user.py @@ -31,7 +31,8 @@ def process_country(self, country, context): op = self.process(filters=dict(month=first_of_month, country_name=country.name, schema_name=country.schema_name, ), - values=values) + values=values, + context=context) self.results.incr(op) diff --git a/src/etools_datamart/apps/etl/admin.py b/src/etools_datamart/apps/etl/admin.py index cd54a652d..5ee6a9071 100644 --- a/src/etools_datamart/apps/etl/admin.py +++ b/src/etools_datamart/apps/etl/admin.py @@ -3,6 +3,7 @@ from django.contrib.admin import register from django.http import HttpResponseRedirect from django.urls import reverse +from django.utils import timezone from django.utils.html import format_html from django.utils.safestring import mark_safe @@ -13,6 +14,7 @@ from django_celery_beat.models import PeriodicTask from humanize import naturaldelta +from etools_datamart.apps.data.loader import RUN_QUEUED from etools_datamart.celery import app from . import models @@ -28,7 +30,7 @@ def queue(modeladmin, request, queryset): @register(models.EtlTask) class EtlTaskAdmin(ExtraUrlMixin, admin.ModelAdmin): - list_display = ('task', 'last_run', '_status', 'time', + list_display = ('task', 'last_run', 'run_type', '_status', 'time', 'last_success', 'last_failure', 'locked', 'data', 'scheduling', 'unlock_task', 'queue_task') @@ -109,7 +111,7 @@ def queue(self, request, pk): obj.status = 'QUEUED' obj.save() task = app.tasks.get(obj.task) - task.delay() + task.delay(run_type=RUN_QUEUED) self.message_user(request, f"Task '{obj.task}' queued", messages.SUCCESS) except Exception as e: # pragma: no cover process_exception(e) @@ -122,6 +124,8 @@ def unlock(self, request, pk): def _action(request): obj.loader.unlock() + obj.update(status='FAILURE', run_type=0, + last_failure=timezone.now()) return _confirm_action(self, request, _action, f"""Continuing will unlock selected task. ({obj.task}). diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 2876ce822..619d2d1b8 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.contrib.postgres.fields.jsonb import django.db.models.deletion @@ -22,6 +22,7 @@ class Migration(migrations.Migration): ('last_run', models.DateTimeField(help_text='last execution time', null=True)), ('status', models.CharField(max_length=200)), ('elapsed', models.IntegerField(null=True)), + ('run_type', models.IntegerField(choices=[(1, 'Manual'), (2, 'Run by cli'), (3, 'Celery task'), (4, 'Forced queue')], default=3, max_length=10)), ('last_success', models.DateTimeField(help_text='last successully execution time', null=True)), ('last_failure', models.DateTimeField(help_text='last failure execution time', null=True)), ('last_changes', models.DateTimeField(help_text='last time data have been changed', null=True)), diff --git a/src/etools_datamart/apps/etl/models.py b/src/etools_datamart/apps/etl/models.py index a16d53442..966efa890 100644 --- a/src/etools_datamart/apps/etl/models.py +++ b/src/etools_datamart/apps/etl/models.py @@ -6,6 +6,7 @@ from django_celery_beat.models import PeriodicTask +from etools_datamart.apps.data.loader import RUN_TYPES, RUN_UNKNOWN from etools_datamart.apps.data.models.base import DataMartModel from etools_datamart.celery import app @@ -49,6 +50,7 @@ class EtlTask(models.Model): last_run = models.DateTimeField(null=True, help_text="last execution time") status = models.CharField(max_length=200) elapsed = models.IntegerField(null=True) + run_type = models.IntegerField(choices=RUN_TYPES, default=RUN_UNKNOWN) last_success = models.DateTimeField(null=True, help_text="last successully execution time") last_failure = models.DateTimeField(null=True, help_text="last failure execution time") last_changes = models.DateTimeField(null=True, help_text="last time data have been changed") @@ -72,6 +74,13 @@ def loader(self): except AttributeError: return None + def update(self, **values): + for attr, val in values.items(): + setattr(self, attr, val) + self.save() + + update.alters_data = True + @cached_property def verbose_name(self): return self.content_type.model_class()._meta.verbose_name diff --git a/src/etools_datamart/apps/etl/tasks/tasks.py b/src/etools_datamart/apps/etl/tasks.py similarity index 100% rename from src/etools_datamart/apps/etl/tasks/tasks.py rename to src/etools_datamart/apps/etl/tasks.py diff --git a/src/etools_datamart/apps/etl/tasks/__init__.py b/src/etools_datamart/apps/etl/tasks/__init__.py deleted file mode 100644 index e60aad479..000000000 --- a/src/etools_datamart/apps/etl/tasks/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -from .etl import * # noqa -from .tasks import * # noqa diff --git a/src/etools_datamart/apps/etl/tasks/etl.py b/src/etools_datamart/apps/etl/tasks/etl.py deleted file mode 100644 index 2f15e264c..000000000 --- a/src/etools_datamart/apps/etl/tasks/etl.py +++ /dev/null @@ -1,404 +0,0 @@ -# # -*- coding: utf-8 -*- -# import json -# import logging -# from datetime import date, datetime -# -# from crashlog.middleware import process_exception -# from django.db import connections -# from django.db.models import Sum -# from django.db.models.functions import Coalesce -# from django.utils import timezone -# from strategy_field.utils import get_attr -# -# from etools_datamart.apps.data.models import HACT, Intervention, PMPIndicators -# from etools_datamart.apps.data.models.fam import FAMIndicator -# from etools_datamart.apps.data.models.user import UserStats -# # from etools_datamart.apps.etl.results import CREATED, EtlResult, UNCHANGED, UPDATED -# from etools_datamart.apps.etools.models import (AuditAudit, AuditEngagement, AuditMicroassessment, -# AuditSpecialaudit, AuditSpotcheck, AuthUser, HactAggregatehact, -# PartnersIntervention, PartnersPartnerorganization,) -# from etools_datamart.celery import app -# -# logger = logging.getLogger(__name__) -# -# __all__ = ["load_hact", "load_user_report", "load_fam_indicator", -# "load_pmp_indicator", "load_intervention"] -# -# -# def is_record_changed(record, values): -# other = type(record)(**values) -# for field_name, field_value in values.items(): -# if getattr(record, field_name) != getattr(other, field_name): -# return True -# return False -# -# -# def process(Model, filters, values): -# try: -# existing, created = Model.objects.get_or_create(**filters, -# defaults=values) -# if created: -# op = CREATED -# else: -# if is_record_changed(existing, values): -# op = UPDATED -# Model.objects.update_or_create(**filters, -# defaults=values) -# else: -# op = UNCHANGED -# return op -# except Exception as e: # pragma: no cover -# logging.exception(e) -# process_exception(e) -# raise -# -# -# # @app.etl(HACT) -# def load_hact(): -# connection = connections['etools'] -# countries = connection.get_tenants() -# today = timezone.now() -# results = EtlResult() -# for country in countries: -# connection.set_schemas([country.schema_name]) -# -# logger.info(u'Running on %s' % country.name) -# aggregate = HactAggregatehact.objects.get(year=today.year) -# data = json.loads(aggregate.partner_values) -# -# # PartnersPartnerorganization.objects.hact_active() -# # qs = PartnersPartnerorganization.objects.filter(Q(reported_cy__gt=0) | Q(total_ct_cy__gt=0), hidden=False) -# # values = dict(microassessments_total=0, -# # programmaticvisits_total=0, -# # followup_spotcheck=0, -# # completed_hact_audits=0, -# # completed_special_audits=0, -# # ) -# # for partner in qs.all(): -# # values['microassessments_total'] += AuditEngagement.objects.filter( -# # engagement_type=AuditEngagement.TYPE_MICRO_ASSESSMENT, -# # status=AuditEngagement.FINAL, date_of_draft_report_to_unicef__year=datetime.now().year).count() -# # -# # values['programmaticvisits_total'] += partner.hact_values['programmatic_visits']['completed']['total'] -# # values['followup_spotcheck'] = qs.aggregate(total=Coalesce(Sum( -# # 'planned_engagement__spot_check_follow_up'), 0))['total'] -# # -# # # completed_hact_audits = ? -# # values['completed_special_audits'] += AuditEngagement.objects.filter( -# # engagement_type=AuditEngagement.TYPE_SPECIAL_AUDIT, -# # status=AuditEngagement.FINAL, date_of_draft_report_to_unicef__year=datetime.now().year).count() -# -# # # Total number of completed Microassessments in the business area in the past year -# values = dict(microassessments_total=data['assurance_activities']['micro_assessment'], -# programmaticvisits_total=data['assurance_activities']['programmatic_visits']['completed'], -# followup_spotcheck=data['assurance_activities']['spot_checks']['follow_up'], -# completed_spotcheck=data['assurance_activities']['spot_checks']['completed'], -# completed_hact_audits=data['assurance_activities']['scheduled_audit'], -# completed_special_audits=data['assurance_activities']['special_audit'], -# ) -# op = process(HACT, filters=dict(year=today.year, -# area_code=country.business_area_code, -# country_name=country.name, -# schema_name=country.schema_name), -# values=values) -# results.incr(op) -# # existing, created = HACT.objects.get_or_create(year=today.year, -# # country_name=country.name, -# # schema_name=country.schema_name, -# # defaults=values) -# # if created: -# # results.created += 1 -# # else: -# # if is_record_changed(existing, values): -# # results.updated += 1 -# # HACT.objects.update_or_create(year=today.year, -# # country_name=country.name, -# # schema_name=country.schema_name, -# # defaults=values) -# # else: -# # results.unchanged += 1 -# -# return results -# -# -# # @app.etl(PMPIndicators) -# def load_pmp_indicator() -> EtlResult: -# connection = connections['etools'] -# countries = connection.get_tenants() -# base_url = 'https://etools.unicef.org' -# results = EtlResult() -# -# for country in countries: -# connection.set_schemas([country.schema_name]) -# -# logger.info(u'Running on %s' % country.name) -# for partner in PartnersPartnerorganization.objects.all(): -# for intervention in PartnersIntervention.objects.filter(agreement__partner=partner): -# planned_budget = getattr(intervention, -# 'partnersintervention_partners_interventionbudget_intervention_id', None) -# fr_currencies = intervention.frs.all().values_list('currency', flat=True).distinct() -# has_assessment = bool(getattr(partner.current_core_value_assessment, 'assessment', False)) -# values = {'country_name': country.name, -# 'schema_name': country.schema_name, -# 'area_code': country.business_area_code, -# 'partner_name': partner.name, -# 'partner_type': partner.cso_type, -# 'vendor_number': partner.vendor_number, -# -# 'pd_ssfa_ref': intervention.number.replace(',', '-'), -# 'pd_ssfa_status': intervention.status.title(), -# 'pd_ssfa_start_date': intervention.start, -# 'pd_ssfa_creation_date': intervention.created, -# 'pd_ssfa_end_date': intervention.end, -# -# 'cash_contribution': intervention.total_unicef_cash or 0, -# 'supply_contribution': intervention.total_in_kind_amount or 0, -# 'total_budget': intervention.total_budget or 0, -# 'unicef_budget': intervention.total_unicef_budget or 0, -# -# 'currency': intervention.planned_budget.currency if planned_budget else '-', -# 'partner_contribution': intervention.planned_budget.partner_contribution if planned_budget else '-', -# 'unicef_cash': intervention.planned_budget.unicef_cash if planned_budget else '-', -# 'in_kind_amount': intervention.planned_budget.in_kind_amount if planned_budget else '-', -# 'total': intervention.planned_budget.total if planned_budget else '-', -# 'fr_numbers_against_pd_ssfa': ' - '.join([fh.fr_number for fh in intervention.frs.all()]), -# 'fr_currencies': ', '.join(fr for fr in fr_currencies), -# 'sum_of_all_fr_planned_amount': intervention.frs.aggregate( -# total=Coalesce(Sum('intervention_amt'), 0))[ -# 'total'] if fr_currencies.count() <= 1 else '-', -# 'core_value_attached': has_assessment, -# 'partner_link': '{}/pmp/partners/{}/details'.format(base_url, partner.pk), -# 'intervention_link': '{}/pmp/interventions/{}/details'.format(base_url, intervention.pk), -# } -# op = process(PMPIndicators, filters=dict(country_name=country.name, -# schema_name=country.schema_name, -# partner_id=partner.pk, -# intervention_id=intervention.pk), -# values=values) -# results.incr(op) -# # existing, created = PMPIndicators.objects.get_or_create(country_name=country.name, -# # schema_name=country.schema_name, -# # country_id=partner.id, -# # partner_id=partner.pk, -# # intervention_id=intervention.pk, -# # defaults=values) -# # if created: -# # results.created += 1 -# # else: -# # if is_record_changed(existing, values): -# # results.updated += 1 -# # PMPIndicators.objects.update_or_create(country_name=country.name, -# # schema_name=country.schema_name, -# # country_id=partner.id, -# # partner_id=partner.pk, -# # intervention_id=intervention.pk, -# # defaults=values) -# # else: -# # results.unchanged += 1 -# -# return results -# # PMPIndicators.objects.create( -# # country_id=country.pk, -# # partner_id=partner.pk, -# # intervention_id=intervention.pk) -# # created[country.name] += 1 -# # -# # return created -# -# -# # @app.etl(Intervention) -# def load_intervention() -> EtlResult: -# connection = connections['etools'] -# countries = connection.get_tenants() -# results = EtlResult() -# for country in countries: -# connection.set_schemas([country.schema_name]) -# qs = PartnersIntervention.objects.all().select_related('agreement', -# 'partner_authorized_officer_signatory', -# 'unicef_signatory', -# 'country_programme', -# ) -# num = 0 -# for num, record in enumerate(qs, 1): -# values = dict(number=record.number, -# title=record.title, -# status=record.status, -# start_date=record.start, -# end_date=record.end, -# review_date_prc=record.review_date_prc, -# prc_review_document=record.prc_review_document, -# partner_name=record.agreement.partner.name, -# partner_authorized_officer_signatory_id=get_attr(record, -# 'partner_authorized_officer_signatory.pk'), -# country_programme_id=get_attr(record, 'country_programme.pk'), -# intervention_id=record.pk, -# unicef_signatory_id=get_attr(record, 'unicef_signatory.pk'), -# -# signed_by_unicef_date=record.signed_by_unicef_date, -# signed_by_partner_date=record.signed_by_partner_date, -# population_focus=record.population_focus, -# signed_pd_document=record.signed_pd_document, -# -# submission_date=record.submission_date, -# submission_date_prc=record.submission_date_prc, -# -# unicef_signatory_first_name=get_attr(record, -# 'unicef_signatory.first_name'), -# unicef_signatory_last_name=get_attr(record, -# 'unicef_signatory.last_name'), -# unicef_signatory_email=get_attr(record, 'unicef_signatory.email'), -# -# partner_signatory_title=get_attr(record, -# 'partner_authorized_officer_signatory.title'), -# partner_signatory_first_name=get_attr(record, -# 'partner_authorized_officer_signatory.first_name'), -# partner_signatory_last_name=get_attr(record, -# 'partner_authorized_officer_signatory.last_name'), -# partner_signatory_email=get_attr(record, -# 'partner_authorized_officer_signatory.email'), -# partner_signatory_phone=get_attr(record, -# 'partner_authorized_officer_signatory.phone'), -# -# partner_focal_point_title=get_attr(record, -# 'partner_focal_point.title'), -# partner_focal_point_first_name=get_attr(record, -# 'partner_focal_point.first_name'), -# partner_focal_point_last_name=get_attr(record, -# 'partner_focal_point.last_name'), -# partner_focal_point_email=get_attr(record, -# 'partner_focal_point.email'), -# partner_focal_point_phone=get_attr(record, -# 'partner_focal_point.phone'), -# -# metadata=record.metadata, -# document_type=record.document_type, -# updated=record.modified, -# created=record.created, -# ) -# op = process(Intervention, filters=dict(country_name=country.name, -# schema_name=country.schema_name, -# area_code=country.business_area_code, -# agreement_id=record.agreement.pk, -# intervention_id=record.pk), -# values=values) -# results.incr(op) -# -# # existing, created = Intervention.objects.get_or_create(country_name=country.name, -# # schema_name=country.schema_name, -# # intervention_id=record.pk, -# # defaults=values) -# # if created: -# # results.created += 1 -# # else: -# # if is_record_changed(existing, values): -# # results.updated += 1 -# # Intervention.objects.update_or_create(country_name=country.name, -# # schema_name=country.schema_name, -# # intervention_id=record.pk, -# # defaults=values) -# # else: -# # results.unchanged += 1 -# -# return results -# -# -# @app.etl(FAMIndicator) -# def load_fam_indicator() -> EtlResult: -# connection = connections['etools'] -# countries = connection.get_tenants() -# -# engagements = (AuditSpotcheck, AuditAudit, AuditSpecialaudit, AuditMicroassessment) -# start_date = date.today() # + relativedelta(months=-1) -# results = EtlResult() -# for country in countries: -# connection.set_schemas([country.schema_name]) -# for model in engagements: -# # indicator, created = FAMIndicator.objects.get_or_create(month=start_date, -# # country_name=country.name, -# # schema_name=country.schema_name) -# # if created: -# # results.created += 1 -# # changed = created -# realname = "_".join(model._meta.db_table.split('_')[1:]) -# values = {} -# for status, status_display in AuditEngagement.STATUSES: -# filter_dict = { -# 'engagement_ptr__status': status, -# 'engagement_ptr__start_date__month': start_date.month, -# 'engagement_ptr__start_date__year': start_date.year, -# } -# field_name = f"{realname}_{status_display}".replace(" ", "_").lower() -# value = model.objects.filter(**filter_dict).count() -# values[field_name] = value -# # try: -# # field_name = f"{realname}_{status_display}".replace(" ", "_").lower() -# # value = model.objects.filter(**filter_dict).count() -# # # just a safety check -# # if not hasattr(indicator, field_name): # pragma: no cover -# # raise ValueError(field_name) -# # if getattr(indicator, field_name) == value: -# # changed = False -# # else: -# # changed = changed and True -# # setattr(indicator, field_name, value) -# # except Exception as e: # pragma: no cover -# # logger.error(e) -# # raise -# op = process(FAMIndicator, filters=dict(month=start_date, -# country_name=country.name, -# area_code=country.business_area_code, -# schema_name=country.schema_name), -# values=values) -# results.incr(op) -# return results -# -# -# @app.etl(UserStats, bind=True) -# def load_user_report(): -# connection = connections['etools'] -# countries = connection.get_tenants() -# today = date.today() -# first_of_month = datetime(today.year, today.month, 1) -# results = EtlResult() -# for country in countries: -# connection.set_schemas([country.schema_name]) -# base = AuthUser.objects.filter(profile__country=country) -# values = { -# 'total': base.count(), -# 'unicef': base.filter(email__endswith='@unicef.org').count(), -# 'logins': base.filter( -# last_login__month=first_of_month.month).count(), -# 'unicef_logins': base.filter( -# last_login__month=first_of_month.month, -# email__endswith='@unicef.org').count(), -# } -# op = process(UserStats, filters=dict(month=first_of_month, -# country_name=country.name, -# schema_name=country.schema_name, ), -# values=values) -# results.incr(op) -# -# # existing, created = UserStats.objects.get_or_create(month=first_of_month, -# # country_name=country.name, -# # schema_name=country.schema_name, -# # defaults=values) -# # if created: -# # results.created += 1 -# # else: -# # if is_record_changed(existing, values): -# # results.updated += 1 -# # UserStats.objects.update_or_create(month=first_of_month, -# # country_name=country.name, -# # schema_name=country.schema_name, -# # defaults=values) -# # else: -# # results.unchanged += 1 -# # -# return results -# # UserStats.objects.update_or_create(month=first_of_month, -# # country_name=country.name, -# # schema_name=country.schema_name, -# # defaults=values) -# # created[country.name] += 1 -# # -# # return created diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 498cb122d..a8d204712 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/utils.py b/src/etools_datamart/apps/security/utils.py index 88ca339b4..208e6dde8 100644 --- a/src/etools_datamart/apps/security/utils.py +++ b/src/etools_datamart/apps/security/utils.py @@ -37,7 +37,7 @@ def get_allowed_schemas(user): def get_allowed_services(user): - if not user.is_authenticated: + if not user.is_authenticated: # pragma: no cover return [] if user.is_superuser or config.DISABLE_SERVICE_RESTRICTIONS: return Service.objects.all() diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index f2ff217ba..7fe48fe24 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py index f2a118762..9ee5544ee 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190123_1112.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('subscriptions', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 3cc0d0cf2..799a6452f 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py index 6a69851ec..cf660581a 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190123_1112.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('unicef_rest_framework', '0001_initial'), ('tracking', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/etools_datamart/apps/web/templates/base.html b/src/etools_datamart/apps/web/templates/base.html index 58646364f..9b7ea463e 100644 --- a/src/etools_datamart/apps/web/templates/base.html +++ b/src/etools_datamart/apps/web/templates/base.html @@ -2,7 +2,7 @@ - Title + {{ title|default_if_none:"eTools Datamart" }} {% block head %} diff --git a/src/etools_datamart/apps/web/views.py b/src/etools_datamart/apps/web/views.py index 5ecc1bcc4..e2cb91ae3 100644 --- a/src/etools_datamart/apps/web/views.py +++ b/src/etools_datamart/apps/web/views.py @@ -9,7 +9,7 @@ def index(request): - context = {'page': 'index'} + context = {'page': 'index', 'title': 'eTools Datamart'} return TemplateResponse(request, 'index.html', context) diff --git a/src/etools_datamart/celery.py b/src/etools_datamart/celery.py index c42cfb3d5..0124bff04 100644 --- a/src/etools_datamart/celery.py +++ b/src/etools_datamart/celery.py @@ -1,10 +1,7 @@ # import json import os -from time import time from celery import Celery -from celery.signals import task_postrun, task_prerun -from celery.utils.log import get_task_logger from kombu import Exchange, Queue from kombu.serialization import register @@ -35,66 +32,65 @@ def get_all_etls(self): app.conf.task_default_queue = 'default' app.conf.task_default_exchange_type = 'direct' app.conf.task_default_routing_key = 'default' -app.conf.task_routes = {'etools_datamart.apps.etl.tasks.etl.*': {'queue': 'etl'}} app.conf.task_routes = {'send_queued_mail': {'queue': 'mail'}} app.conf.task_routes = {'etools_datamart.apps.etl.subscriptions.tasks.*': {'queue': 'subscription'}} - -@task_prerun.connect -def task_prerun_handler(signal, sender, task_id, task, args, kwargs, **kw): - if not hasattr(sender, 'linked_model'): - return - - app.timers[task_id] = time() - from django.contrib.contenttypes.models import ContentType - from etools_datamart.apps.etl.models import EtlTask - from django.utils import timezone - defs = {'status': 'RUNNING', - 'last_run': timezone.now()} - EtlTask.objects.update_or_create(task=task.name, - content_type=ContentType.objects.get_for_model(task.linked_model), - table_name=task.linked_model._meta.db_table, - defaults=defs) - - register('etljson', etl_dumps, etl_loads, content_type='application/x-myjson', content_encoding='utf-8') -@task_postrun.connect -def task_postrun_handler(signal, sender, task_id, task, args, kwargs, retval, state, **kw): - from django.utils import timezone - from etools_datamart.apps.subscriptions.models import Subscription - from etools_datamart.apps.etl.models import EtlTask - logger = get_task_logger('etl') - if not hasattr(sender, 'linked_model'): - return - try: - cost = time() - app.timers.pop(task_id) - except KeyError: # pragma: no cover - cost = -1 - defs = {'elapsed': cost, - 'status': state} - - if state == 'SUCCESS': - try: - defs['results'] = retval.as_dict() - if not retval.error: - if retval.created > 0 or retval.updated > 0: - defs['last_changes'] = timezone.now() - for service in sender.linked_model.linked_services: - service.invalidate_cache() - Subscription.objects.notify(sender.linked_model) - defs['last_success'] = timezone.now() - else: - defs['status'] = 'ERROR' - except Exception as e: # pragma: no cover - logger.error(e) - defs['results'] = str(retval) - else: - # if not isinstance(retval, dict): - defs['results'] = str(retval) - defs['last_failure'] = timezone.now() - - EtlTask.objects.update_or_create(task=task.name, defaults=defs) - app.timers[task.name] = cost +# @task_prerun.connect +# def task_prerun_handler(signal, sender, task_id, task, args, kwargs, **kw): +# if not hasattr(sender, 'linked_model'): +# return +# +# app.timers[task_id] = time() +# from django.contrib.contenttypes.models import ContentType +# from etools_datamart.apps.etl.models import EtlTask +# from django.utils import timezone +# defs = {'status': 'RUNNING', +# 'last_run': timezone.now()} +# EtlTask.objects.update_or_create(task=task.name, +# content_type=ContentType.objects.get_for_model(task.linked_model), +# table_name=task.linked_model._meta.db_table, +# defaults=defs) +# +# +# +# @task_postrun.connect +# def task_postrun_handler(signal, sender, task_id, task, args, kwargs, retval, state, **kw): +# from django.utils import timezone +# from etools_datamart.apps.subscriptions.models import Subscription +# from etools_datamart.apps.etl.models import EtlTask +# logger = get_task_logger('etl') +# if not hasattr(sender, 'linked_model'): +# return +# try: +# cost = time() - app.timers.pop(task_id) +# except KeyError: # pragma: no cover +# cost = -1 +# defs = {'elapsed': cost, +# 'status': state} +# +# if state == 'SUCCESS': +# try: +# defs['results'] = retval.as_dict() +# if not retval.error: +# if retval.created > 0 or retval.updated > 0: +# defs['last_changes'] = timezone.now() +# for service in sender.linked_model.linked_services: +# service.invalidate_cache() +# Subscription.objects.notify(sender.linked_model) +# defs['last_success'] = timezone.now() +# else: +# defs['status'] = 'ERROR' +# except Exception as e: # pragma: no cover +# logger.error(e) +# defs['results'] = str(retval) +# else: +# # if not isinstance(retval, dict): +# defs['results'] = str(retval) +# defs['last_failure'] = timezone.now() +# +# EtlTask.objects.update_or_create(task=task.name, defaults=defs) +# app.timers[task.name] = cost diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 8e7bc8530..e90754773 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -44,7 +44,7 @@ ENABLE_LIVE_STATS=(bool, True), ETOOLS_DUMP_LOCATION=(str, str(PACKAGE_DIR / 'apps' / 'multitenant' / 'postgresql')), MEDIA_ROOT=(str, '/tmp/media'), - MEDUSA_PASSWORD=(str, ''), + MYSTICA_PASSWORD=(str, ''), REDOC_BASE=(str, '/api/+redoc/#operation/'), SECRET_KEY=(str, 'secret'), SECURE_BROWSER_XSS_FILTER=(bool, True), @@ -191,9 +191,9 @@ 'unicef_security.graph.AzureADTenantOAuth2Ext', 'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.RemoteUserBackend', - 'etools_datamart.libs.medusa.MedusaBackend', + 'etools_datamart.libs.mystica.MysticaBackend', ] -MEDUSA_PASSWORD = env('MEDUSA_PASSWORD') +MYSTICA_PASSWORD = env('MYSTICA_PASSWORD') CACHES = { 'default': env.cache(), diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py index a9418abe0..8d28d6da2 100644 --- a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py +++ b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py @@ -1,44 +1,39 @@ -# -*- coding: utf-8 -*- -from __future__ import unicode_literals +# Generated by Django 2.1.5 on 2019-01-24 09:23 -import django +import django.contrib.sites.managers +import django.db.models.manager import django.utils.timezone from django.db import migrations, models class Migration(migrations.Migration): + initial = True + dependencies = [ - ('sites', '0001_initial'), + ('sites', '0002_alter_domain_unique'), ] operations = [ migrations.CreateModel( name='Template', fields=[ - ('id', models.AutoField( - verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('name', models.CharField( - help_text="Example: 'flatpages/default.html'", max_length=100, verbose_name='name')), - ('content', models.TextField(verbose_name='content', blank=True)), - ('creation_date', models.DateTimeField( - default=django.utils.timezone.now, verbose_name='creation date')), - ('last_changed', models.DateTimeField( - default=django.utils.timezone.now, verbose_name='last changed')), - ('sites', models.ManyToManyField( - to='sites.Site', verbose_name='sites', blank=True)), + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(help_text="Example: 'flatpages/default.html'", max_length=100, verbose_name='name')), + ('content', models.TextField(blank=True, verbose_name='content')), + ('creation_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation date')), + ('last_changed', models.DateTimeField(default=django.utils.timezone.now, verbose_name='last changed')), + ('sites', models.ManyToManyField(blank=True, to='sites.Site', verbose_name='sites')), ], options={ - 'ordering': ('name',), - 'db_table': 'django_template', 'verbose_name': 'template', 'verbose_name_plural': 'templates', + 'db_table': 'django_template', + 'ordering': ('name',), }, - bases=(models.Model,), managers=[ ('objects', django.db.models.manager.Manager()), - ('on_site', django.contrib.sites.managers.CurrentSiteManager( - b'sites')), + ('on_site', django.contrib.sites.managers.CurrentSiteManager('sites')), ], ), ] diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py b/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py deleted file mode 100644 index 053557328..000000000 --- a/src/etools_datamart/custom_migrations/dbtemplates/0002_auto_20190123_1403.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 2.1.5 on 2019-01-23 14:03 - -import django.contrib.sites.managers -import django.db.models.manager -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dbtemplates', '0001_initial'), - ] - - operations = [ - migrations.AlterModelManagers( - name='template', - managers=[ - ('objects', django.db.models.manager.Manager()), - ('on_site', django.contrib.sites.managers.CurrentSiteManager('sites')), - ], - ), - ] diff --git a/src/etools_datamart/libs/medusa.py b/src/etools_datamart/libs/mystica.py similarity index 69% rename from src/etools_datamart/libs/medusa.py rename to src/etools_datamart/libs/mystica.py index 7b78f6169..f0865de17 100644 --- a/src/etools_datamart/libs/medusa.py +++ b/src/etools_datamart/libs/mystica.py @@ -7,25 +7,25 @@ UserModel = get_user_model() -def medusa_auth(username, password): +def mystica_auth(username, password): try: user = UserModel._default_manager.get_by_natural_key(username) - except UserModel.DoesNotExist: + except UserModel.DoesNotExist: # pragma: no cover # Run the default password hasher once to reduce the timing # difference between an existing and a nonexistent user (#20760). UserModel().set_password(password) else: - if password and (password == settings.MEDUSA_PASSWORD): + if password and (password == settings.MYSTICA_PASSWORD): return user -class MedusaBackend(ModelBackend): +class MysticaBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): if username is None: username = kwargs.get(UserModel.USERNAME_FIELD) - return medusa_auth(username, password) + return mystica_auth(username, password) -class MedusaBasicAuthentication(BasicAuthentication): +class MysticaBasicAuthentication(BasicAuthentication): def authenticate_credentials(self, userid, password, request=None): - return medusa_auth(userid, password) + return mystica_auth(userid, password) diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 23f14cae5..a1c58862d 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py b/src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py rename to src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py index ce5259eac..23f272b74 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190123_1112.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.db.models.deletion from django.conf import settings @@ -10,10 +10,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), ('auth', '0009_alter_user_last_name_max_length'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0002_remove_content_type_name'), - ('unicef_rest_framework', '0001_initial'), ] operations = [ @@ -141,7 +141,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'group'), ('service', 'user')}, + unique_together={('service', 'user'), ('service', 'group')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 926c2cff7..71ebdc159 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-23 11:12 +# Generated by Django 2.1.5 on 2019-01-24 09:23 import django.contrib.auth.models import django.contrib.auth.validators diff --git a/tests/.coveragerc b/tests/.coveragerc index ede0edb4d..f8ef2933c 100644 --- a/tests/.coveragerc +++ b/tests/.coveragerc @@ -3,21 +3,22 @@ branch = True source = etools_datamart omit = - tests/** - **/reset-migrations.py - **/inspectschema.py - **/introspection.py - **/db_router.py **/api-builder.py - **/queue.py - **/multitenant/postgresql/creation.py - **/apps/etools/models/public_old.py - **/apps/etools/models/tenant_old.py - **/tracking/management/commands/track.py **/api/endpoints/unicef/business_area.py **/api/endpoints/unicef/region.py **/api/endpoints/unicef/serializers.py + **/apps/etools/models/public_old.py + **/apps/etools/models/tenant_old.py + **/db_router.py **/etools_datamart/apps/data/management/commands/load.py + **/inspectschema.py + **/introspection.py + **/libs/mystica.py + **/multitenant/postgresql/creation.py + **/queue.py + **/reset-migrations.py + **/tracking/management/commands/track.py + tests/** [report] diff --git a/tests/api/test_api_data.py b/tests/api/test_api_data.py index 03103d857..0192e9a30 100644 --- a/tests/api/test_api_data.py +++ b/tests/api/test_api_data.py @@ -1,8 +1,11 @@ # -*- coding: utf-8 -*- +from django.utils import timezone + import pytest from test_utilities.factories import factories_registry from etools_datamart.api.urls import router +from etools_datamart.apps.etl.models import EtlTask FORMATS = (('', 'application/json'), ('csv', 'text/csv; charset=utf-8'), @@ -40,16 +43,25 @@ def pytest_generate_tests(metafunc, *args): for ser in sers: params.append([viewset, ser]) ids.append(f'{viewset.__name__}-{ser}') - # metafunc.addcall(funcargs={'viewset': viewset, - # 'serializer': ser}, - # id=f'{viewset.__name__}-{ser}') metafunc.parametrize("viewset,serializer", params, ids=ids) -@pytest.mark.parametrize("action", ['', 'updates/']) @pytest.mark.parametrize("format,ct", FORMATS, ids=[f[0] for f in FORMATS]) -def test_list(client, action, viewset, format, ct, data, serializer): - res = client.get(f"{viewset.get_service().endpoint}{action}?format={format}") +def test_list(client, viewset, format, ct, data, serializer): + res = client.get(f"{viewset.get_service().endpoint}?format={format}") + assert res.status_code == 200, res + assert res.content + assert res['Content-Type'] == ct + + +@pytest.mark.parametrize("updates", [True, False]) +@pytest.mark.parametrize("format,ct", FORMATS, ids=[f[0] for f in FORMATS]) +def test_updates(client, viewset, format, ct, data, serializer, updates): + if updates: + task = EtlTask.objects.get_for_model(viewset.queryset.model) + task.update(last_changes=timezone.now()) + + res = client.get(f"{viewset.get_service().endpoint}updates/?format={format}") assert res.status_code == 200, res assert res.content assert res['Content-Type'] == ct diff --git a/tests/api/test_api_filtering.py b/tests/api/test_api_filtering.py index ae91bd055..4241746a7 100644 --- a/tests/api/test_api_filtering.py +++ b/tests/api/test_api_filtering.py @@ -1,6 +1,6 @@ import pytest from rest_framework.test import APIClient -from test_utilities.factories import AdminFactory, FAMIndicatorFactory, UserFactory +from test_utilities.factories import AdminFactory, FAMIndicatorFactory, FundsReservationFactory, UserFactory from unicef_rest_framework.test_utils import user_allow_country, user_allow_service @@ -119,6 +119,18 @@ def test_filter_datamart_month(db, client, flt, ct): assert res.status_code == 200 # assert res.json() + +@pytest.mark.parametrize('ct', ['text/html', 'application/json']) +@pytest.mark.parametrize('flt', ['2000-01-01']) +def test_filter_datamart_fundsreservation(db, client, flt, ct): + FundsReservationFactory() + client.force_authenticate(AdminFactory()) + + url = f"/api/latest/datamart/funds-reservation/?start_date__gt=%s" % flt + res = client.get(url, HTTP_ACCEPT=ct) + assert res.status_code == 200 + # assert res.json() + # # @pytest.mark.parametrize('flt', ['10', 'oct', '10-2018', 'current', '', '10-']) # def test_filter_datamart_month_browseable(admin_user, django_app, flt): diff --git a/tests/conftest.py b/tests/conftest.py index f23c0a0ff..c728fdd53 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -9,8 +9,6 @@ import pytest from _pytest.fixtures import SubRequest -from etools_datamart.apps.etl.models import EtlTask - def pytest_configure(config): # enable this to remove deprecations @@ -22,6 +20,7 @@ def pytest_configure(config): # warnings.simplefilter('ignore', RemovedInPytest4Warning) # warnings.simplefilter('ignore', PendingDeprecationWarning) warnings.simplefilter('ignore', UserWarning) +warnings.simplefilter('ignore', RuntimeWarning, lineno=1421) @pytest.fixture(scope="session") @@ -99,6 +98,8 @@ def teardown_database(): from unicef_rest_framework.models import Service, UserAccessControl from etools_datamart.apps.tracking.models import APIRequestLog from test_utilities.factories import UserFactory + from etools_datamart.apps.etl.models import EtlTask + with django_db_blocker.unblock(): EtlTask.objects.inspect() Service.objects.load_services() @@ -217,3 +218,10 @@ def local_user(db): from test_utilities.factories import UserFactory return UserFactory() + + +@pytest.fixture() +def schema_access_control(db): + from test_utilities.factories import SchemaAccessControlFactory + + return SchemaAccessControlFactory() diff --git a/tests/etl/test_etl_healthcheck.py b/tests/etl/test_etl_healthcheck.py index 0475fc091..60fdf37f9 100644 --- a/tests/etl/test_etl_healthcheck.py +++ b/tests/etl/test_etl_healthcheck.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from etools_datamart.apps.etl.tasks.tasks import healthcheck +from etools_datamart.apps.etl.tasks import healthcheck def test_healthcheck_async(): diff --git a/tests/etl/test_etl_loaders.py b/tests/etl/test_etl_loaders.py index c8970abd4..3a7eb0c06 100644 --- a/tests/etl/test_etl_loaders.py +++ b/tests/etl/test_etl_loaders.py @@ -20,10 +20,10 @@ def pytest_generate_tests(metafunc): def test_loader_load(loader, number_of_intervention): # factory = factories_registry.get(loader.model) # to_delete = factory() - with freeze_time("2018-12-31"): + with freeze_time("2018-12-31", tz_offset=1): loader.model.objects.truncate() loader.unlock() - ret = loader.load(max_records=2) + ret = loader.load(max_records=2, force_requirements=True) assert loader.model.objects.count() assert not loader.model.objects.exclude(seen=ret.context['today']).exists() # assert not loader.model.objects.filter(id=to_delete.pk).exists() diff --git a/tests/etl/test_etl_lock.py b/tests/etl/test_etl_lock.py deleted file mode 100644 index ff9678b1a..000000000 --- a/tests/etl/test_etl_lock.py +++ /dev/null @@ -1,25 +0,0 @@ -# # -*- coding: utf-8 -*- -# import uuid -# -# from etools_datamart.apps.etl.lock import locks, only_one -# -# -# def test_only_one(): -# call = 0 -# -# def func(): -# nonlocal call -# call += 1 -# key = uuid.uuid4() -# wrapped = only_one(func, key=key) -# wrapped() -# assert call == 1 -# wrapped() -# assert call == 2 -# -# lock = cache.lock(key) -# assert lock.acquire(blocking=False) -# -# wrapped() -# assert call == 2 -# lock.release() diff --git a/tests/etl/test_etl_tasklog.py b/tests/etl/test_etl_tasklog.py index 504076abd..c9822c377 100644 --- a/tests/etl/test_etl_tasklog.py +++ b/tests/etl/test_etl_tasklog.py @@ -1,56 +1,13 @@ -from unittest import mock - import pytest -from celery.signals import task_postrun from unicef_security.models import User -from etools_datamart.apps.data.loader import EtlResult -from etools_datamart.apps.data.models import HACT, PMPIndicators +from etools_datamart.apps.data.models import HACT from etools_datamart.apps.etl.models import EtlTask -from etools_datamart.celery import task_postrun_handler pytestmarker = pytest.mark.django_db -def test_load_pmp_indicator(db): - with mock.patch('etools_datamart.apps.data.models.PMPIndicators.loader.task.run', - return_value=EtlResult(created=11)): - assert PMPIndicators.loader.task.apply() - assert EtlTask.objects.filter(task=PMPIndicators.loader.task.name, - results__created=11, - status='SUCCESS').exists() - - -def test_load_pmp_indicator_fail(db): - with mock.patch('etools_datamart.apps.data.models.PMPIndicators.loader.task.run', side_effect=Exception): - assert PMPIndicators.loader.task.apply() - assert EtlTask.objects.filter(task=PMPIndicators.loader.task.name, - status='FAILURE') - - -@pytest.fixture() -def disable_post_run(): - task_postrun.disconnect(task_postrun_handler) - yield - task_postrun.connect(task_postrun_handler) - - -def test_load_pmp_indicator_running(db, disable_post_run): - with mock.patch('etools_datamart.apps.data.models.PMPIndicators.loader.task.run'): - assert PMPIndicators.loader.task.apply() - assert EtlTask.objects.filter(task=PMPIndicators.loader.task.name, - status='RUNNING') - - -def test_no_changes(db): - with mock.patch('etools_datamart.apps.data.models.PMPIndicators.loader.task.run', - return_value=EtlResult()): - assert PMPIndicators.loader.task.apply() - assert EtlTask.objects.filter(task=PMPIndicators.loader.task.name, - status='SUCCESS').exists() - - def test_manager(db): # TaskLogFactory(content_type=ContentType.objects.get_for_model(HACT)) assert EtlTask.objects.filter_for_models(HACT) diff --git a/tests/test_admin.py b/tests/test_admin.py index a6c87dc02..4897e230c 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -33,3 +33,17 @@ def test_index_old(django_app, admin_user): url = reverse("admin:index") res = django_app.get(url, user=admin_user) assert res.status_code == 200 + + +def test_schemaaccesscontrol_list(django_app, admin_user): + url = reverse("admin:security_schemaaccesscontrol_changelist") + res = django_app.get(url, user=admin_user) + assert res.status_code == 200 + + +def test_schemaaccesscontrol_change(django_app, admin_user, schema_access_control): + url = reverse("admin:security_schemaaccesscontrol_change", args=[schema_access_control.pk]) + res = django_app.get(url, user=admin_user) + assert res.status_code == 200 + res = res.form.submit() + assert res.status_code == 302 diff --git a/tests/test_checks.py b/tests/test_checks.py new file mode 100644 index 000000000..7a51b9039 --- /dev/null +++ b/tests/test_checks.py @@ -0,0 +1,13 @@ +from unittest import mock + +from etools_datamart.apps.data.checks import check_loader + + +def test_checks(): + assert check_loader(None) == [] + + +def test_checks_fail(): + with mock.patch('etools_datamart.apps.data.models.intervention.Intervention.loader.config.last_modify_field', + 'aaaa'): + assert check_loader(None) From 0771ad9c899c1ab7cdc8a3338910fb63ccbed6c7 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 00:48:22 +0100 Subject: [PATCH 090/122] migrations reset --- src/etools_datamart/apps/data/migrations/0001_initial.py | 4 ++-- src/etools_datamart/apps/etl/migrations/0001_initial.py | 4 ++-- src/etools_datamart/apps/security/migrations/0001_initial.py | 2 +- .../apps/subscriptions/migrations/0001_initial.py | 2 +- ...{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} | 2 +- src/etools_datamart/apps/tracking/migrations/0001_initial.py | 2 +- ...{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} | 4 ++-- .../custom_migrations/dbtemplates/0001_initial.py | 2 +- src/unicef_rest_framework/migrations/0001_initial.py | 2 +- ...{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} | 4 ++-- src/unicef_security/migrations/0001_initial.py | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190124_0923.py => 0002_auto_20190124_2347.py} (99%) diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 462419b2c..b0c242eea 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -315,6 +315,6 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='fundsreservation', - unique_together={('schema_name', 'fr_number'), ('schema_name', 'source_id')}, + unique_together={('schema_name', 'source_id'), ('schema_name', 'fr_number')}, ), ] diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 619d2d1b8..67a278e90 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.contrib.postgres.fields.jsonb import django.db.models.deletion @@ -22,7 +22,7 @@ class Migration(migrations.Migration): ('last_run', models.DateTimeField(help_text='last execution time', null=True)), ('status', models.CharField(max_length=200)), ('elapsed', models.IntegerField(null=True)), - ('run_type', models.IntegerField(choices=[(1, 'Manual'), (2, 'Run by cli'), (3, 'Celery task'), (4, 'Forced queue')], default=3, max_length=10)), + ('run_type', models.IntegerField(choices=[(0, ''), (1, 'Manual'), (2, 'cli'), (3, 'Celery'), (4, 'Forced queue'), (5, 'Required by task')], default=0)), ('last_success', models.DateTimeField(help_text='last successully execution time', null=True)), ('last_failure', models.DateTimeField(help_text='last failure execution time', null=True)), ('last_changes', models.DateTimeField(help_text='last time data have been changed', null=True)), diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index a8d204712..a9440fcd0 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 7fe48fe24..1fc686217 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py index 9ee5544ee..f0f9e2de8 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_0923.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.db.models.deletion from django.conf import settings diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 799a6452f..9e19577e9 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py index cf660581a..2a961ed9a 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_0923.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('unicef_rest_framework', '0001_initial'), ('tracking', '0001_initial'), + ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py index 8d28d6da2..0af50bffb 100644 --- a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py +++ b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.contrib.sites.managers import django.db.models.manager diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index a1c58862d..3e664c1ba 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py b/src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py similarity index 99% rename from src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py rename to src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py index 23f272b74..11357af3c 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190124_0923.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.db.models.deletion from django.conf import settings @@ -11,9 +11,9 @@ class Migration(migrations.Migration): dependencies = [ ('unicef_rest_framework', '0001_initial'), - ('auth', '0009_alter_user_last_name_max_length'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0002_remove_content_type_name'), + ('auth', '0009_alter_user_last_name_max_length'), ] operations = [ diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 71ebdc159..0b9fc7863 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 09:23 +# Generated by Django 2.1.5 on 2019-01-24 23:47 import django.contrib.auth.models import django.contrib.auth.validators From 18e9585c79cc30e96cd3ac645340ce5adfbb99b2 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 09:12:48 +0100 Subject: [PATCH 091/122] fixes requirements --- Pipfile | 2 +- Pipfile.lock | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Pipfile b/Pipfile index c50f06f45..73f272dc7 100644 --- a/Pipfile +++ b/Pipfile @@ -80,7 +80,7 @@ pytest-pythonpath = "*" tox = "*" vcrpy = "*" yapf = "*" -fancycompleter = {git = "https://github.com/theY4Kman/fancycompleter.git"} +fancycompleter = {file = "https://github.com/theY4Kman/fancycompleter/archive/0.8.tar.gz"} [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index b700ce3b2..fafaba5d3 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e43c5aadae45904e1ffb65c2a9498e8bb05da05918ee33617b3a64e0344d3bd7" + "sha256": "48d82e1436c891980e34fd1a8296f4cd8bf0642d033da6aacaea79d6768c1b26" }, "pipfile-spec": 6, "requires": { @@ -18,10 +18,10 @@ "default": { "adal": { "hashes": [ - "sha256:ba52913c38d76b4a4d88eaab41a5763d056ab6d073f106e0605b051ab930f5c1", - "sha256:bf79392b8e9e5e82aa6acac3835ba58bbac0ccf7e15befa215863f83d5f6a007" + "sha256:82e84fa0b442caf8131f1e87a7ebee2546f57ab16a8917a599a02b6e455cb1b0", + "sha256:b6edd095be66561382bdaa59d40b04490e93149fb3b7fa44c1fa5504eed5b8b9" ], - "version": "==1.2.0" + "version": "==1.2.1" }, "admin-extra-urls": { "hashes": [ @@ -1212,10 +1212,10 @@ }, "oauthlib": { "hashes": [ - "sha256:0a8b2e0daa7afb62bd1b0b387b7a3723fa9a35d1183694ca5a5c8e3d6df59913", - "sha256:8932fb34f7c6a4fc50c9f423b105923ed2e6df091b3c388d182540db02c581a0" + "sha256:0ce32c5d989a1827e3f1148f98b9085ed2370fc939bf524c9c851d8714797298", + "sha256:3e1e14f6cde7e5475128d30e97edc3bfb4dc857cb884d8714ec161fdbb3b358e" ], - "version": "==3.0.0" + "version": "==3.0.1" }, "onedrivesdk": { "hashes": [ @@ -1729,10 +1729,10 @@ }, "decorator": { "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + "sha256:33cd704aea07b4c28b3eb2c97d288a06918275dac0ecebdaf1bc8a48d98adb9e", + "sha256:cabb249f4710888a2fc0e13e9a16c343d932033718ff62e1e9bc93a9d3a9122b" ], - "version": "==4.3.0" + "version": "==4.3.2" }, "django-extensions": { "hashes": [ @@ -1795,8 +1795,10 @@ "version": "==1.0.2" }, "fancycompleter": { - "git": "https://github.com/theY4Kman/fancycompleter.git", - "ref": "69f38763ace1a8fb62670deb415dcda77962ce82" + "hashes": [ + "sha256:d2522f1f3512371f295379c4c0d1962de06762eb586c199620a2a5d423539b12" + ], + "version": "==0.8" }, "filelock": { "hashes": [ From dd13fc9512316b402ee3838b60a47309d928818b Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 09:59:43 +0100 Subject: [PATCH 092/122] =?UTF-8?q?Bump=20version:=201.9a21=20=E2=86=92=20?= =?UTF-8?q?1.9a22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index f6280951c..9e3de8c1c 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a21 +current_version = 1.9a22 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index c29262c33..80343a33c 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a21 +TARGET?=1.9a22 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 82100d580..142a43800 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a21' +VERSION = __version__ = '1.9a22' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 60b054476906c0606ce1b574f1cdbc896c8e56ba Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 10:17:16 +0100 Subject: [PATCH 093/122] use smaller logo --- .../apps/web/static/unicef_logo2.png | Bin 0 -> 63807 bytes .../apps/web/templates/base.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/etools_datamart/apps/web/static/unicef_logo2.png diff --git a/src/etools_datamart/apps/web/static/unicef_logo2.png b/src/etools_datamart/apps/web/static/unicef_logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..0e78d67c7e18b9342452f6c508ef62c7090d5404 GIT binary patch literal 63807 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 av&#>1@636KbjR>;#(&JLOv_+y5&s2!2V~s< literal 0 HcmV?d00001 diff --git a/src/etools_datamart/apps/web/templates/base.html b/src/etools_datamart/apps/web/templates/base.html index 9b7ea463e..75f3df0d1 100644 --- a/src/etools_datamart/apps/web/templates/base.html +++ b/src/etools_datamart/apps/web/templates/base.html @@ -51,7 +51,7 @@
{% block left %}
- +
{% endblock left %}
From 36e4289a25cef50fe860b5930464d621cab521a5 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 10:33:31 +0100 Subject: [PATCH 094/122] update docker --- docker/Dockerfile | 4 +++- docker/entrypoint.sh | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 56a4d3066..809966623 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -102,7 +102,9 @@ RUN set -ex \ && pipenv install --verbose --system --deploy --ignore-pipfile $PIPENV_ARGS RUN pip install . \ - && rm -fr /code + && rm -fr /code \ + && mkdir -p /var/datamart/ \ + && chown -R datamart /var/datamart/ #RUN apk del .build-deps \ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 71b619875..19008b16e 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,10 +1,6 @@ #!/bin/bash -e set -e -mkdir -p /var/datamart/{static,log,conf,run} -mkdir -p ${STATIC_ROOT} -rm -f /var/datamart/run/* - django-admin diffsettings --output unified django-admin makemigrations --check --dry-run @@ -15,6 +11,11 @@ if [[ "$*" == "workers" ]];then elif [[ "$*" == "beat" ]];then celery beat -A etools_datamart.celery --loglevel=DEBUG --pidfile run/celerybeat.pid elif [[ "$*" == "datamart" ]];then + + mkdir -p ${STATIC_ROOT} + rm -f /var/datamart/run/* + + django-admin db-isready --wait --timeout 60 django-admin check --deploy django-admin init-setup --all --verbosity 2 From e5e9f949af3fa36a98541a82c9b2c173828afa69 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 10:47:13 +0100 Subject: [PATCH 095/122] =?UTF-8?q?Bump=20version:=201.9a22=20=E2=86=92=20?= =?UTF-8?q?1.9a23?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 9e3de8c1c..2016627a3 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a22 +current_version = 1.9a23 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 80343a33c..8308db583 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a22 +TARGET?=1.9a23 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 142a43800..d4205144a 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a22' +VERSION = __version__ = '1.9a23' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 0963d92e1536cf9ce54513005c3f61e7e72a0963 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 11:13:34 +0100 Subject: [PATCH 096/122] =?UTF-8?q?Bump=20version:=201.9a23=20=E2=86=92=20?= =?UTF-8?q?1.9a24?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 2016627a3..12169d1a6 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a23 +current_version = 1.9a24 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 8308db583..2a40fc4fe 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a23 +TARGET?=1.9a24 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index d4205144a..cb798e90a 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a23' +VERSION = __version__ = '1.9a24' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 2cc948267d3d9c0f6ccc0ce9fdba075721d89ac5 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 11:50:49 +0100 Subject: [PATCH 097/122] =?UTF-8?q?Bump=20version:=201.9a24=20=E2=86=92=20?= =?UTF-8?q?1.9a25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 3 +-- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 12169d1a6..7d27dbfe3 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a24 +current_version = 1.9a25 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 2a40fc4fe..b8a391c6a 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a24 +TARGET?=1.9a25 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart @@ -70,7 +70,6 @@ build: -e DEVELOPMENT_MODE=0 \ -e STACK=1 \ -e X_FRAME_OPTIONS="SAMEORIGIN" \ - -v $$PWD/~build/volumes/var/datamart:/var/datamart/ \ ${RUN_OPTIONS} \ ${DOCKER_IMAGE} \ ${CMD} diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index cb798e90a..e96802366 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a24' +VERSION = __version__ = '1.9a25' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From c324cc34fcb318166e61aee82edb45b5d8417a04 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 12:19:16 +0100 Subject: [PATCH 098/122] =?UTF-8?q?Bump=20version:=201.9a25=20=E2=86=92=20?= =?UTF-8?q?1.9a26?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 7d27dbfe3..4e8e90be6 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a25 +current_version = 1.9a26 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index b8a391c6a..00f3af2be 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a25 +TARGET?=1.9a26 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index e96802366..caf014707 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a25' +VERSION = __version__ = '1.9a26' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 171fbd4f62545659788f3507903d66233f530f1c Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 12:41:31 +0100 Subject: [PATCH 099/122] =?UTF-8?q?Bump=20version:=201.9a26=20=E2=86=92=20?= =?UTF-8?q?1.9a27?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 4e8e90be6..5a003c855 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a26 +current_version = 1.9a27 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 00f3af2be..9c28ac603 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a26 +TARGET?=1.9a27 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index caf014707..a3f74df00 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a26' +VERSION = __version__ = '1.9a27' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 988d0f1323e8c14367bc372e6f68354e9cd301d8 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 13:29:15 +0100 Subject: [PATCH 100/122] =?UTF-8?q?Bump=20version:=201.9a27=20=E2=86=92=20?= =?UTF-8?q?1.9a28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 5a003c855..eb139e123 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a27 +current_version = 1.9a28 commit = True tag = False allow_dirty = True diff --git a/docker/Makefile b/docker/Makefile index 9c28ac603..2d3e1b1e5 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a27 +TARGET?=1.9a28 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index a3f74df00..e12246fa4 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a27' +VERSION = __version__ = '1.9a28' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 05b9613ba3c8c1f2876115ec33a68726c4b1d163 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 14:07:57 +0100 Subject: [PATCH 101/122] =?UTF-8?q?Bump=20version:=201.9a28=20=E2=86=92=20?= =?UTF-8?q?1.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index eb139e123..3b753dc96 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.9a28 +current_version = 1.10 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 829b6c49c..818d14786 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -1.9 (dev) +1.10 (dev) --------- * WARNINGS: migration reset * Location/GatewayType endpoints diff --git a/docker/Makefile b/docker/Makefile index 2d3e1b1e5..c98fa4d6a 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.9a28 +TARGET?=1.10 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index e12246fa4..0dd2764ab 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.9a28' +VERSION = __version__ = '1.10a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 2be6655aada1d51f7341d0a9096e918c060f2637 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 14:21:53 +0100 Subject: [PATCH 102/122] bug fixing --- docker/Dockerfile | 5 ++++- docker/entrypoint.sh | 10 ++++++---- src/etools_datamart/apps/data/loader.py | 2 +- src/unicef_rest_framework/admin/beat.py | 23 +++++++++++++++++++++++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 809966623..46044de96 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -103,7 +103,10 @@ RUN set -ex \ RUN pip install . \ && rm -fr /code \ - && mkdir -p /var/datamart/ \ + && mkdir -p /var/datamart/static \ + && mkdir -p /var/datamart/log \ + && mkdir -p /var/datamart/conf \ + && mkdir -p /var/datamart/run \ && chown -R datamart /var/datamart/ diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 19008b16e..5e88397dd 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,8 +1,10 @@ #!/bin/bash -e set -e -django-admin diffsettings --output unified -django-admin makemigrations --check --dry-run +mkdir -p /var/datamart/static +mkdir -p /var/datamart/log +mkdir -p /var/datamart/conf +mkdir -p /var/datamart/run if [[ "$*" == "workers" ]];then django-admin db-isready --wait --timeout 60 --sleep 5 @@ -11,10 +13,10 @@ if [[ "$*" == "workers" ]];then elif [[ "$*" == "beat" ]];then celery beat -A etools_datamart.celery --loglevel=DEBUG --pidfile run/celerybeat.pid elif [[ "$*" == "datamart" ]];then - - mkdir -p ${STATIC_ROOT} rm -f /var/datamart/run/* + django-admin diffsettings --output unified + django-admin makemigrations --check --dry-run django-admin db-isready --wait --timeout 60 django-admin check --deploy diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index e1ad9b3cc..79e074d95 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -161,7 +161,7 @@ def __init__(self, loader) -> None: def run(self, *args, **kwargs): logger.debug(kwargs) try: - return self.loader.load(run_type=RUN_SCHEDULE, check_requirement=True) + return self.loader.load(run_type=RUN_SCHEDULE, check_requirements=True) except (RequiredIsRunning, RequiredIsMissing): # pragma: no cover raise Retry diff --git a/src/unicef_rest_framework/admin/beat.py b/src/unicef_rest_framework/admin/beat.py index d5f8e333a..f631c5636 100644 --- a/src/unicef_rest_framework/admin/beat.py +++ b/src/unicef_rest_framework/admin/beat.py @@ -1,3 +1,4 @@ +from django.template.defaultfilters import pluralize from django.utils.translation import ugettext_lazy as _ from admin_extra_urls.extras import action, ExtraUrlMixin @@ -40,6 +41,28 @@ class PeriodicTaskAdmin(ExtraUrlMixin, admin.PeriodicTaskAdmin): }), ) + def run_tasks(self, request, queryset): + self.celery_app.loader.import_default_modules() + tasks = [(self.celery_app.tasks.get(periodic_task.task), + loads(periodic_task.args), + loads(periodic_task.kwargs)) + for periodic_task in queryset] + + task_ids = [task.delay(*args, **kwargs) + for task, args, kwargs in tasks if task and task.delay] + + tasks_run = len(task_ids) + self.message_user( + request, + _('{0} task{1} {2} successfully run').format( + tasks_run, + pluralize(tasks_run), + pluralize(tasks_run, _('was,were')), + ), + ) + + run_tasks.short_description = _('Run selected tasks') + @action() def run_task(self, request, pk): periodic_task = PeriodicTask.objects.get(pk=pk) From 15d17e309961b2a0e029f821ec7fdb2e393f9f2c Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 17:28:27 +0100 Subject: [PATCH 103/122] implements celery Retry policy --- docker/Makefile | 3 ++- src/etools_datamart/apps/data/loader.py | 36 ++++++++++++++++++------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/docker/Makefile b/docker/Makefile index c98fa4d6a..1ff3efe50 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -84,8 +84,9 @@ release: docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:latest docker push ${DOCKER_IMAGE_NAME}:latest docker push ${DOCKER_IMAGE_NAME}:${TARGET} + +bump: cd .. && bumpversion --tag --config-file=.bumpversion.cfg num - lazo upgrade datamart:datamart ${DOCKER_IMAGE_NAME}:${TARGET} -vvv run: RUN_OPTIONS="-p 8000:8000" \ diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 79e074d95..f6de46602 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -10,7 +10,6 @@ from django.utils.functional import cached_property import celery -from celery.exceptions import Retry from crashlog.middleware import process_exception from redis.exceptions import LockError from strategy_field.utils import fqn, get_attr @@ -44,14 +43,15 @@ class EtlResult: - __slots__ = [CREATED, UPDATED, UNCHANGED, DELETED, 'status', 'context', 'error'] + __slots__ = [CREATED, UPDATED, UNCHANGED, DELETED, 'status', 'context', 'error', 'retry'] def __init__(self, updated=0, created=0, unchanged=0, deleted=0, - status='SUCCESS', context=None, error=None, **kwargs): + status='SUCCESS', context=None, error=None, retry=False, **kwargs): self.created = created self.updated = updated self.unchanged = unchanged self.deleted = deleted + self.retry = retry self.status = status self.error = error self.context = context or {} @@ -111,11 +111,21 @@ def is_record_changed(record, values): class RequiredIsRunning(Exception): - pass + + def __init__(self, req, *args: object) -> None: + self.req = req + + def __str__(self): + return "Required datased %s is still updating" % self.req class RequiredIsMissing(Exception): - pass + + def __init__(self, req, *args: object) -> None: + self.req = req + + def __str__(self): + return "Missing required datased %s" % self.req class LoaderOptions: @@ -152,6 +162,7 @@ def contribute_to_class(self, model, name): class LoaderTask(celery.Task): + default_retry_delay = 3 * 60 def __init__(self, loader) -> None: self.loader = loader @@ -162,8 +173,8 @@ def run(self, *args, **kwargs): logger.debug(kwargs) try: return self.loader.load(run_type=RUN_SCHEDULE, check_requirements=True) - except (RequiredIsRunning, RequiredIsMissing): # pragma: no cover - raise Retry + except (RequiredIsRunning, RequiredIsMissing) as e: # pragma: no cover + self.retry(exc=e) class Loader: @@ -350,14 +361,18 @@ def on_start(self, run_type): 'last_run': timezone.now()} self.etl_task.update(**defs) - def on_end(self, error=None): + def on_end(self, error=None, retry=False): from etools_datamart.apps.subscriptions.models import Subscription from django.utils import timezone cost = time.time() - self._start defs = {'elapsed': cost, 'results': self.results.as_dict()} - if error: + if retry: + defs['status'] = 'RETRY' + defs['results'] = str(error) + defs['last_failure'] = timezone.now() + elif error: defs['status'] = 'FAILURE' defs['results'] = str(error) defs['last_failure'] = timezone.now() @@ -447,6 +462,9 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, else: logger.info(f"Unable to get lock for {self}") + except (RequiredIsMissing, RequiredIsRunning) as e: # pragma: no cover + self.on_end(error=e, retry=True) + raise except BaseException as e: # pragma: no cover self.on_end(e) process_exception(e) From 857f9bcfa17ade2836fdbff9731749a7d947835e Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 18:38:06 +0100 Subject: [PATCH 104/122] =?UTF-8?q?Bump=20version:=201.10=20=E2=86=92=201.?= =?UTF-8?q?11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 2 +- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 3b753dc96..675edc2d5 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.10 +current_version = 1.11 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 818d14786..db2dbb2a5 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -1.10 (dev) +1.11 (dev) --------- * WARNINGS: migration reset * Location/GatewayType endpoints diff --git a/docker/Makefile b/docker/Makefile index 1ff3efe50..d91b597ff 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.10 +TARGET?=1.11 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 0dd2764ab..89d5641a2 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.10a0' +VERSION = __version__ = '1.11a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 6202e118db6c69e4b0baf35a439b2521c9e24a7a Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 18:40:17 +0100 Subject: [PATCH 105/122] =?UTF-8?q?Bump=20version:=201.11=20=E2=86=92=201.?= =?UTF-8?q?11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/etools_datamart/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 89d5641a2..d2ac13da3 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.11a0' +VERSION = __version__ = '1.11a0a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 083a72788683a4ac509341b905e1956d12231bf4 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 25 Jan 2019 18:41:24 +0100 Subject: [PATCH 106/122] fixes schema check --- src/etools_datamart/__init__.py | 2 +- src/etools_datamart/apps/security/utils.py | 4 +++- src/etools_datamart/config/settings.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index d2ac13da3..89d5641a2 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.11a0a0' +VERSION = __version__ = '1.11a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; diff --git a/src/etools_datamart/apps/security/utils.py b/src/etools_datamart/apps/security/utils.py index 208e6dde8..6e71f9901 100644 --- a/src/etools_datamart/apps/security/utils.py +++ b/src/etools_datamart/apps/security/utils.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.core.cache import caches from django.db import connections @@ -29,7 +30,8 @@ def get_allowed_schemas(user): aa = flatten(list(SchemaAccessControl.objects.filter(group__user=user).values_list('schemas'))) etools_user = UsersUserprofile.objects.filter(user__email=user.email).first() if etools_user: - aa.extend(set(etools_user.countries_available.values_list('schema_name', flat=True))) + etools_allowed = etools_user.countries_available.exclude(**settings.SCHEMA_EXCLUDE) + aa.extend(set(etools_allowed.values_list('schema_name', flat=True))) values = list(filter(None, aa)) cache.set(key, list(values)) return set(values) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index e90754773..4a72cfd46 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -30,6 +30,7 @@ CELERY_BROKER_URL=(str, 'redis://127.0.0.1:6379/2'), CELERY_RESULT_BACKEND=(str, 'redis://127.0.0.1:6379/3'), CSRF_COOKIE_SECURE=(bool, True), + IGNORED_SCHEMAS=(str, "public,uat,frg"), DATABASE_URL=(str, "postgis://postgres:@127.0.0.1:5432/etools_datamart"), DATABASE_URL_ETOOLS=(str, "postgis://postgres:@127.0.0.1:15432/etools"), DEBUG=(bool, False), @@ -613,7 +614,7 @@ UNICEF_REST_FRAMEWORK_ROUTER = 'etools_datamart.api.urls.router' SCHEMA_FILTER = {} -SCHEMA_EXCLUDE = {'schema_name__in': ['public', 'uat', 'frg']} +SCHEMA_EXCLUDE = {'schema_name__in': env.list('IGNORED_SCHEMAS')} ENABLE_LIVE_STATS = env('ENABLE_LIVE_STATS') From 4ba7fd298e4d7bb1d2f1ef6701935135e7e5df1e Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 26 Jan 2019 00:48:37 +0100 Subject: [PATCH 107/122] add tests --- Pipfile | 1 + Pipfile.lock | 15 +- src/etools_datamart/apps/data/loader.py | 129 +++++++------- src/etools_datamart/apps/data/models/fam.py | 12 +- src/etools_datamart/apps/data/models/hact.py | 14 +- src/etools_datamart/apps/data/models/pmp.py | 12 +- src/etools_datamart/apps/data/models/user.py | 10 +- src/etools_datamart/apps/etl/admin.py | 5 +- src/etools_datamart/apps/etl/models.py | 7 +- src/etools_datamart/apps/etl/tasks.py | 8 +- src/etools_datamart/apps/me/views.py | 26 ++- src/etools_datamart/apps/security/utils.py | 12 +- .../apps/tracking/middleware.py | 27 ++- .../apps/web/templates/admin/base_site.html | 3 + .../apps/web/templates/base.html | 4 + src/etools_datamart/apps/web/views.py | 1 - src/etools_datamart/config/settings.py | 4 +- src/etools_datamart/config/urls.py | 1 + src/etools_datamart/libs/mystica.py | 14 +- src/unicef_security/admin.py | 7 +- tests/api/test_api_filter_forms.py | 29 ++++ tests/etl/test_etl_admin.py | 12 ++ tests/etl/test_etl_base_loader.py | 159 ++++++++++++++++++ tests/etl/test_etl_loaders.py | 1 - tests/etl/test_etl_result.py | 23 ++- tests/test_views.py | 5 + 26 files changed, 383 insertions(+), 158 deletions(-) create mode 100644 tests/api/test_api_filter_forms.py create mode 100644 tests/etl/test_etl_base_loader.py diff --git a/Pipfile b/Pipfile index 73f272dc7..6e1a7a3f1 100644 --- a/Pipfile +++ b/Pipfile @@ -57,6 +57,7 @@ redis = "==2.10.6" social-auth-app-django = "*" sqlparse = "*" whitenoise = "*" +django-impersonate = "*" [dev-packages] bumpversion = "*" diff --git a/Pipfile.lock b/Pipfile.lock index fafaba5d3..45ebaae0c 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "48d82e1436c891980e34fd1a8296f4cd8bf0642d033da6aacaea79d6768c1b26" + "sha256": "0e3cfd4ee72358f857008c17c8282dea84ee4efcff6abf44b80067b391199499" }, "pipfile-spec": 6, "requires": { @@ -873,6 +873,13 @@ "index": "pypi", "version": "==2.1.0" }, + "django-impersonate": { + "hashes": [ + "sha256:8a32a314eb4ef167dcf3cb4ad2b71f69786768a4e9a35b22d1169020c0f5a438" + ], + "index": "pypi", + "version": "==1.4" + }, "django-js-asset": { "hashes": [ "sha256:30149158206f693a5d027fe590096fc84495486bd11cd77d395b4f2ec27fc1d0", @@ -2153,10 +2160,10 @@ }, "virtualenv": { "hashes": [ - "sha256:34b9ae3742abed2f95d3970acf4d80533261d6061b51160b197f84e5b4c98b4c", - "sha256:fa736831a7b18bd2bfeef746beb622a92509e9733d645952da136b0639cd40cd" + "sha256:58c359370401e0af817fb0070911e599c5fdc836166306b04fd0f278151ed125", + "sha256:729f0bcab430e4ef137646805b5b1d8efbb43fe53d4a0f33328624a84a5121f7" ], - "version": "==16.2.0" + "version": "==16.3.0" }, "waitress": { "hashes": [ diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index f6de46602..b1974b8fb 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -62,8 +62,8 @@ def __repr__(self): def incr(self, counter): setattr(self, counter, getattr(self, counter) + 1) - def add(self, counter, value): - setattr(self, counter, getattr(self, counter) + value) + # def add(self, counter, value): + # setattr(self, counter, getattr(self, counter) + value) def as_dict(self): return {'created': self.created, @@ -73,36 +73,28 @@ def as_dict(self): 'status': self.status, 'error': self.error} - def __add__(self, other): - if isinstance(other, EtlResult): - ret = EtlResult(created=self.created + other.created, - updated=self.updated + other.updated, - unchanged=self.unchanged + other.unchanged, - deleted=self.deleted + other.deleted, - context=self.context - ) - return ret - raise ValueError(f"Cannot add EtlREsult with {other}") - - def __eq__(self, other): - if isinstance(other, EtlResult): - other = other.as_dict() - - if isinstance(other, dict): - return (self.created == other['created'] and - self.updated == other['updated'] and - self.unchanged == other['unchanged'] and - self.deleted == other['deleted'] - ) - return False - - -def is_record_changed(record, values): - other = type(record)(**values) - for field_name, field_value in values.items(): - if getattr(record, field_name) != getattr(other, field_name): - return True - return False + # def __add__(self, other): + # if isinstance(other, EtlResult): + # ret = EtlResult(created=self.created + other.created, + # updated=self.updated + other.updated, + # unchanged=self.unchanged + other.unchanged, + # deleted=self.deleted + other.deleted, + # context=self.context + # ) + # return ret + # raise ValueError(f"Cannot add EtlREsult with {other}") + + # def __eq__(self, other): + # if isinstance(other, EtlResult): + # other = other.as_dict() + # + # if isinstance(other, dict): + # return (self.created == other['created'] and + # self.updated == other['updated'] and + # self.unchanged == other['unchanged'] and + # self.deleted == other['deleted'] + # ) + # return False DEFAULT_KEY = lambda country, record: dict(country_name=country.name, @@ -157,7 +149,7 @@ def __init__(self, base=None): def contribute_to_class(self, model, name): self.model = model setattr(model, name, self) - if not self.lock_key: + if not self.lock_key: # pragma: no branch self.lock_key = f"{fqn(model)}-lock" @@ -187,9 +179,9 @@ def __init__(self) -> None: def __repr__(self): return "<%sLoader>" % self.model._meta.object_name - @property - def model_name(self): - return ".".join([self.model._meta.app_label, self.model._meta.model_name]) + # @property + # def model_name(self): + # return ".".join([self.model._meta.app_label, self.model._meta.model_name]) def contribute_to_class(self, model, name): self.model = model @@ -197,9 +189,9 @@ def contribute_to_class(self, model, name): del model._etl_config if not model._meta.abstract: loadeables.add("{0._meta.app_label}.{0._meta.model_name}".format(model)) - if self.config.celery: - self.task = LoaderTask(self) - self.config.celery.tasks.register(self.task) + # if self.config.celery: + self.task = LoaderTask(self) + self.config.celery.tasks.register(self.task) setattr(model, name, self) @@ -247,9 +239,18 @@ def need_refresh(self, sender): return self.etl_task.last_success.day < sender.etl_task.last_run.day return False - def process(self, filters, values, context): + def is_record_changed(self, record, values): + other = type(record)(**values) + # for field_name, field_value in values.items(): + for field_name in self.fields_to_compare: + if getattr(record, field_name) != getattr(other, field_name): + return True + return False + + def process_record(self, filters, values, context): stdout = context['stdout'] verbosity = context['verbosity'] + if stdout and verbosity > 2: # pragma: no cover stdout.write('.') stdout.flush() @@ -260,7 +261,7 @@ def process(self, filters, values, context): if created: op = CREATED else: - if self.always_update or is_record_changed(record, values): + if self.always_update or self.is_record_changed(record, values): op = UPDATED record, created = self.model.objects.update_or_create(**filters, defaults=values) @@ -320,7 +321,7 @@ def process_country(self, country, context): for record in qs.all(): filters = self.config.key(country, record) values = self.get_values(country, record, context) - op = self.process(filters, values, context) + op = self.process_record(filters, values, context) self.results.incr(op) context['records'] += 1 if max_records and context['records'] >= max_records: @@ -391,19 +392,21 @@ def on_end(self, error=None, retry=False): Subscription.objects.notify(self.config.model) self.etl_task.update(**defs) + def lock(self): + lock = locks.lock(self.config.lock_key, timeout=self.config.timeout) + if lock.acquire(blocking=False): + return lock + def load(self, *, verbosity=0, always_update=False, stdout=None, ignore_dependencies=False, max_records=None, countries=None, ignore_last_modify_field=False, run_type=RUN_UNKNOWN, check_requirements=False, force_requirements=False): self.on_start(run_type) - have_lock = False self.results = EtlResult() - lock = locks.lock(self.config.lock_key, timeout=self.config.timeout) logger.debug(f"Running loader {self}") - + lock = self.lock() try: - have_lock = lock.acquire(blocking=False) - if have_lock: # pragma: no branch + if lock: # pragma: no branch if not ignore_dependencies: for requirement in self.config.depends: if force_requirements or requirement.loader.need_refresh(self): @@ -423,13 +426,13 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, connection = connections['etools'] if not countries: # pragma: no branch countries = connection.get_tenants() - if self.config.mapping: - self.mapping = {} - mart_fields = self.model._meta.concrete_fields - for field in mart_fields: - if field.name not in ['country_name', 'schema_name', 'area_code', - 'id', 'last_modify_date']: - self.mapping[field.name] = field.name + self.mapping = {} + mart_fields = self.model._meta.concrete_fields + for field in mart_fields: + if field.name not in ['country_name', 'schema_name', 'area_code', + 'id', 'last_modify_date']: + self.mapping[field.name] = field.name + if self.config.mapping: # pragma: no branch self.mapping.update(self.config.mapping) today = timezone.now() context = self.get_context(today=today, @@ -438,41 +441,43 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, verbosity=verbosity, records=0, filter_last_modified=not ignore_last_modify_field, - is_empty=self.model.objects.exists(), + is_empty=not self.model.objects.exists(), stdout=stdout) sid = transaction.savepoint() total_countries = len(countries) try: self.results.context = context + self.fields_to_compare = [f for f in self.mapping.keys() if f not in ["seen"]] + for i, country in enumerate(countries, 1): - if stdout and verbosity > 0: # pragma: no cover + if stdout and verbosity > 0: stdout.write(f"{i:>3}/{total_countries} {country}") connection.set_schemas([country.schema_name]) self.process_country(country, context) self.post_process_country(country, context) if max_records and context['records'] >= max_records: break - if stdout and verbosity > 0: # pragma: no cover - stdout.write("\n") + if stdout and verbosity > 0: + stdout.write("\n") # deleted = self.model.objects.exclude(seen=today).delete()[0] # self.results.deleted = deleted - except Exception: # pragma: no cover + except Exception: transaction.savepoint_rollback(sid) raise else: logger.info(f"Unable to get lock for {self}") - except (RequiredIsMissing, RequiredIsRunning) as e: # pragma: no cover + except (RequiredIsMissing, RequiredIsRunning) as e: self.on_end(error=e, retry=True) raise - except BaseException as e: # pragma: no cover + except BaseException as e: self.on_end(e) process_exception(e) raise else: self.on_end(None) finally: - if have_lock: # pragma: no branch + if lock: # pragma: no branch try: lock.release() except LockError as e: # pragma: no cover diff --git a/src/etools_datamart/apps/data/models/fam.py b/src/etools_datamart/apps/data/models/fam.py index a3d24909c..08fc08a88 100644 --- a/src/etools_datamart/apps/data/models/fam.py +++ b/src/etools_datamart/apps/data/models/fam.py @@ -25,12 +25,12 @@ def process_country(self, country, context): field_name = f"{realname}_{status_display}".replace(" ", "_").lower() value = model.objects.filter(**filter_dict).count() values[field_name] = value - op = self.process(filters=dict(month=start_date, - country_name=country.name, - area_code=country.business_area_code, - schema_name=country.schema_name), - values=values, - context=context) + op = self.process_record(filters=dict(month=start_date, + country_name=country.name, + area_code=country.business_area_code, + schema_name=country.schema_name), + values=values, + context=context) self.results.incr(op) diff --git a/src/etools_datamart/apps/data/models/hact.py b/src/etools_datamart/apps/data/models/hact.py index 6bde6be0b..b02d8ed1c 100644 --- a/src/etools_datamart/apps/data/models/hact.py +++ b/src/etools_datamart/apps/data/models/hact.py @@ -24,14 +24,14 @@ def process_country(self, country, context): completed_hact_audits=data['assurance_activities']['scheduled_audit'], completed_special_audits=data['assurance_activities']['special_audit'], ) - op = self.process(filters=dict(year=today.year, - area_code=country.business_area_code, - country_name=country.name, - schema_name=country.schema_name), - values=values, - context=context) + op = self.process_record(filters=dict(year=today.year, + area_code=country.business_area_code, + country_name=country.name, + schema_name=country.schema_name), + values=values, + context=context) self.results.incr(op) - except HactAggregatehact.DoesNotExist: + except HactAggregatehact.DoesNotExist: # pragma: no cover pass diff --git a/src/etools_datamart/apps/data/models/pmp.py b/src/etools_datamart/apps/data/models/pmp.py index 10ed9644c..24cfceb0a 100644 --- a/src/etools_datamart/apps/data/models/pmp.py +++ b/src/etools_datamart/apps/data/models/pmp.py @@ -52,12 +52,12 @@ def process_country(self, country, context): # 'partner_link': '{}/pmp/partners/{}/details'.format(base_url, partner.pk), # 'intervention_link': '{}/pmp/interventions/{}/details'.format(base_url, intervention.pk), } - op = self.process(filters=dict(country_name=country.name, - schema_name=country.schema_name, - partner_id=partner.pk, - intervention_id=intervention.pk), - values=values, - context=context) + op = self.process_record(filters=dict(country_name=country.name, + schema_name=country.schema_name, + partner_id=partner.pk, + intervention_id=intervention.pk), + values=values, + context=context) self.results.incr(op) diff --git a/src/etools_datamart/apps/data/models/user.py b/src/etools_datamart/apps/data/models/user.py index c63cb37d2..6afcaf7a7 100644 --- a/src/etools_datamart/apps/data/models/user.py +++ b/src/etools_datamart/apps/data/models/user.py @@ -28,11 +28,11 @@ def process_country(self, country, context): last_login__month=first_of_month.month, email__endswith='@unicef.org').count(), } - op = self.process(filters=dict(month=first_of_month, - country_name=country.name, - schema_name=country.schema_name, ), - values=values, - context=context) + op = self.process_record(filters=dict(month=first_of_month, + country_name=country.name, + schema_name=country.schema_name, ), + values=values, + context=context) self.results.incr(op) diff --git a/src/etools_datamart/apps/etl/admin.py b/src/etools_datamart/apps/etl/admin.py index 5ee6a9071..e5430ae4b 100644 --- a/src/etools_datamart/apps/etl/admin.py +++ b/src/etools_datamart/apps/etl/admin.py @@ -2,6 +2,7 @@ from django.contrib import admin, messages from django.contrib.admin import register from django.http import HttpResponseRedirect +from django.template.defaultfilters import pluralize from django.urls import reverse from django.utils import timezone from django.utils.html import format_html @@ -25,7 +26,9 @@ def queue(modeladmin, request, queryset): for obj in queryset: task = app.tasks.get(obj.task) task.delay() - modeladmin.message_user(request, f"{count} tasks queued", messages.SUCCESS) + modeladmin.message_user(request, + "{0} task{1} queued".format(count, pluralize(count)), + messages.SUCCESS) @register(models.EtlTask) diff --git a/src/etools_datamart/apps/etl/models.py b/src/etools_datamart/apps/etl/models.py index 966efa890..ec1550a4c 100644 --- a/src/etools_datamart/apps/etl/models.py +++ b/src/etools_datamart/apps/etl/models.py @@ -18,7 +18,7 @@ def filter_for_models(self, *models): def get_for_model(self, model: DataMartModel): try: return self.get(content_type=ContentType.objects.get_for_model(model)) - except EtlTask.MultipleObjectsReturned: + except EtlTask.MultipleObjectsReturned: # pragma: no cover raise EtlTask.MultipleObjectsReturned(f"MultipleObjectsReturned for model '{model.__name__}'") except EtlTask.DoesNotExist: raise EtlTask.DoesNotExist(f"EtlTask for model '{model.__name__}' does not exists") @@ -69,10 +69,7 @@ def __str__(self): @cached_property def loader(self): - try: - return self.content_type.model_class().loader - except AttributeError: - return None + return self.content_type.model_class().loader def update(self, **values): for attr, val in values.items(): diff --git a/src/etools_datamart/apps/etl/tasks.py b/src/etools_datamart/apps/etl/tasks.py index 9ecf43135..2042a56bd 100644 --- a/src/etools_datamart/apps/etl/tasks.py +++ b/src/etools_datamart/apps/etl/tasks.py @@ -16,7 +16,7 @@ def healthcheck(): cache.set('healthcheck', timezone.now().strftime(HEALTHCHECK_FORMAT)) - -@app.on_after_configure.connect -def setup_periodic_tasks(sender, **kwargs): - sender.add_periodic_task(60.0, healthcheck.s(), name='healthcheck') +# +# @app.on_after_configure.connect +# def setup_periodic_tasks(sender, **kwargs): +# sender.add_periodic_task(60.0, healthcheck.s(), name='healthcheck') diff --git a/src/etools_datamart/apps/me/views.py b/src/etools_datamart/apps/me/views.py index cd6d4d435..e9ebe3377 100644 --- a/src/etools_datamart/apps/me/views.py +++ b/src/etools_datamart/apps/me/views.py @@ -3,18 +3,16 @@ from django.contrib.auth import BACKEND_SESSION_KEY, login from django.contrib.auth.decorators import login_required -from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views.generic.edit import FormView from etools_datamart.apps.etools.utils import get_allowed_schemas, get_allowed_services from etools_datamart.apps.me.forms import ProfileForm - -@login_required -def profile(request): - context = {'form': ProfileForm()} - return TemplateResponse(request, 'index.html', context) +# @login_required +# def profile(request): +# context = {'form': ProfileForm()} +# return TemplateResponse(request, 'index.html', context) class ProfileView(FormView): @@ -37,8 +35,8 @@ def generate(self, length=20): everything = upper + lower + num + symbol pwd += random.choice(everything) count += 1 - if count >= length: - break + # if count >= length: + # break return pwd def get_context_data(self, **kwargs): @@ -58,10 +56,10 @@ def get_initial(self): def form_valid(self, form): ctx = self.get_context_data(form=form) - if self.request.user.is_authenticated: - pwd = self.generate() - self.request.user.set_password(pwd) - self.request.user.save() - ctx['password'] = pwd - login(self.request, self.request.user, self.request.session[BACKEND_SESSION_KEY]) + # if self.request.user.is_authenticated: + pwd = self.generate() + self.request.user.set_password(pwd) + self.request.user.save() + ctx['password'] = pwd + login(self.request, self.request.user, self.request.session[BACKEND_SESSION_KEY]) return self.render_to_response(ctx) diff --git a/src/etools_datamart/apps/security/utils.py b/src/etools_datamart/apps/security/utils.py index 6e71f9901..22c225c9c 100644 --- a/src/etools_datamart/apps/security/utils.py +++ b/src/etools_datamart/apps/security/utils.py @@ -18,12 +18,12 @@ def get_allowed_schemas(user): key = f"allowed_schemas:{get_full_version()}:{config.CACHE_VERSION}:{user.pk}" values = cache.get(key) - if not values: - if config.DISABLE_SCHEMA_RESTRICTIONS: - values = conn.all_schemas - elif not user.is_authenticated: - values = [] - elif user.is_superuser: + if not values: # pragma: no branch + # if config.DISABLE_SCHEMA_RESTRICTIONS: + # values = conn.all_schemas + # elif not user.is_authenticated: + # values = [] + if user.is_superuser: values = conn.all_schemas else: with conn.noschema(): diff --git a/src/etools_datamart/apps/tracking/middleware.py b/src/etools_datamart/apps/tracking/middleware.py index 7c4cd2a7e..d69b39ca9 100644 --- a/src/etools_datamart/apps/tracking/middleware.py +++ b/src/etools_datamart/apps/tracking/middleware.py @@ -11,7 +11,6 @@ from strategy_field.utils import fqn from etools_datamart.apps.tracking import config -from etools_datamart.apps.tracking.asyncqueue import AsyncQueue from .models import APIRequestLog, DailyCounter, MonthlyCounter, PathCounter, UserCounter @@ -124,11 +123,11 @@ def record_to_kwargs(request, response): # -class AsyncLogger(AsyncQueue): - def _process(self, record): - values = record_to_kwargs(**record) - if values: - log_request(**values) +# class AsyncLogger(AsyncQueue): +# def _process(self, record): +# values = record_to_kwargs(**record) +# if values: +# log_request(**values) class StatsMiddleware(object): @@ -154,11 +153,11 @@ def __call__(self, request): self.log(request, response) return response - -class ThreadedStatsMiddleware(StatsMiddleware): - def __init__(self, get_response): - super(ThreadedStatsMiddleware, self).__init__(get_response) - self.worker = AsyncLogger() - - def log(self, request, response): - self.worker.queue({'request': request, 'response': response}) +# +# class ThreadedStatsMiddleware(StatsMiddleware): +# def __init__(self, get_response): +# super(ThreadedStatsMiddleware, self).__init__(get_response) +# self.worker = AsyncLogger() +# +# def log(self, request, response): +# self.worker.queue({'request': request, 'response': response}) diff --git a/src/etools_datamart/apps/web/templates/admin/base_site.html b/src/etools_datamart/apps/web/templates/admin/base_site.html index 3d2fbc14d..d4ee45e03 100644 --- a/src/etools_datamart/apps/web/templates/admin/base_site.html +++ b/src/etools_datamart/apps/web/templates/admin/base_site.html @@ -26,6 +26,9 @@

{{ site_header|default:_('D / Sys Infos {% endif %} / Switch index + {% if user.is_impersonate %} + Back to {{ request.real_user }} + {% endif %} {% endif %} {% endblock %} {% block nav-global %}{% endblock %} diff --git a/src/etools_datamart/apps/web/templates/base.html b/src/etools_datamart/apps/web/templates/base.html index 75f3df0d1..71762046f 100644 --- a/src/etools_datamart/apps/web/templates/base.html +++ b/src/etools_datamart/apps/web/templates/base.html @@ -66,6 +66,10 @@
{{ user.label }} + {% if user.is_impersonate %} + [Back to {{ request.real_user }}] + {% endif %} +
Version: {% version %} diff --git a/src/etools_datamart/apps/web/views.py b/src/etools_datamart/apps/web/views.py index e2cb91ae3..92b9d5d04 100644 --- a/src/etools_datamart/apps/web/views.py +++ b/src/etools_datamart/apps/web/views.py @@ -21,7 +21,6 @@ def monitor(request): return TemplateResponse(request, 'monitor.html', context) -@login_required def whoami(request): if request.user.is_authenticated: return HttpResponse(request.user.email) diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 4a72cfd46..b88ca89df 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -178,6 +178,7 @@ 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'impersonate.middleware.ImpersonateMiddleware', # 'django.contrib.auth.middleware.RemoteUserMiddleware', 'crashlog.middleware.CrashLogMiddleware', 'unicef_rest_framework.middleware.ApiMiddleware', @@ -192,7 +193,6 @@ 'unicef_security.graph.AzureADTenantOAuth2Ext', 'django.contrib.auth.backends.ModelBackend', 'django.contrib.auth.backends.RemoteUserBackend', - 'etools_datamart.libs.mystica.MysticaBackend', ] MYSTICA_PASSWORD = env('MYSTICA_PASSWORD') @@ -285,7 +285,7 @@ 'etools_datamart.apps.subscriptions', 'etools_datamart.apps.me', 'etools_datamart.api', - + 'impersonate', 'admin_extra_urls', 'adminactions', 'unicef_rest_framework.apps.Config', diff --git a/src/etools_datamart/config/urls.py b/src/etools_datamart/config/urls.py index ca521dd7a..7bbd8a54c 100644 --- a/src/etools_datamart/config/urls.py +++ b/src/etools_datamart/config/urls.py @@ -20,6 +20,7 @@ path(r'admin/', site.urls), path(r'admin/schemas/', SelectSchema.as_view(), name='select-schema'), path(r'admin/sysinfo/', admin_sysinfo, name="sys-admin-info"), + path(r'impersonate/', include('impersonate.urls')), path(r'sys/info/', http_basic_login(sysinfo), name='sys-info'), path(r'sys/version//', http_basic_login(version), name='sys-version'), diff --git a/src/etools_datamart/libs/mystica.py b/src/etools_datamart/libs/mystica.py index f0865de17..fbae40f4c 100644 --- a/src/etools_datamart/libs/mystica.py +++ b/src/etools_datamart/libs/mystica.py @@ -1,6 +1,5 @@ from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.auth.backends import ModelBackend from rest_framework.authentication import BasicAuthentication @@ -19,12 +18,13 @@ def mystica_auth(username, password): return user -class MysticaBackend(ModelBackend): - def authenticate(self, request, username=None, password=None, **kwargs): - if username is None: - username = kwargs.get(UserModel.USERNAME_FIELD) - return mystica_auth(username, password) - +# +# class MysticaBackend(ModelBackend): +# def authenticate(self, request, username=None, password=None, **kwargs): +# if username is None: +# username = kwargs.get(UserModel.USERNAME_FIELD) +# return mystica_auth(username, password) +# class MysticaBasicAuthentication(BasicAuthentication): def authenticate_credentials(self, userid, password, request=None): diff --git a/src/unicef_security/admin.py b/src/unicef_security/admin.py index 09889913b..00791903c 100644 --- a/src/unicef_security/admin.py +++ b/src/unicef_security/admin.py @@ -6,6 +6,7 @@ from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import Group from django.forms import Form +from django.http import HttpResponseRedirect from django.template.response import TemplateResponse from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -84,6 +85,11 @@ def is_linked(self, obj): is_linked.boolean = True + @action() + def impersonate(self, request, pk): + url = reverse('impersonate-start', args=[pk]) + return HttpResponseRedirect(url) + @action(label='Sync') def sync_user(self, request, pk): obj = self.get_object(request, pk) @@ -168,7 +174,6 @@ class RoleForm(forms.Form): user = forms.ModelChoiceField(queryset=User.objects.all()) group = forms.ModelChoiceField(queryset=Group.objects.all()) - # @admin.register(Role) # class RoleAdmin(ExtraUrlMixin, ModelAdmin): # list_display = ['user', 'group', 'business_area'] diff --git a/tests/api/test_api_filter_forms.py b/tests/api/test_api_filter_forms.py new file mode 100644 index 000000000..34cb13030 --- /dev/null +++ b/tests/api/test_api_filter_forms.py @@ -0,0 +1,29 @@ +from etools_datamart.api.endpoints import FundsReservationViewSet, InterventionViewSet, PMPIndicatorsViewSet + + +def test_filter_form1(db, django_app, admin_user): + service = PMPIndicatorsViewSet.get_service() + url = service.endpoint + res = django_app.get(url, user=admin_user, headers={'Accept': 'text/html'}) + assert res.status_code == 200 + url = f"{service.endpoint}?partner_type__in=&pd_ssfa_status__in=" + res = django_app.get(url, user=admin_user, headers={'Accept': 'text/html'}) + assert res.status_code == 200 + + +def test_filter_form2(db, django_app, admin_user): + service = InterventionViewSet.get_service() + url = service.endpoint + res = django_app.get(url, user=admin_user, headers={'Accept': 'text/html'}) + assert res.status_code == 200 + url = f"{service.endpoint}?status__in=" + res = django_app.get(url, user=admin_user, headers={'Accept': 'text/html'}) + assert res.status_code == 200 + + +def test_filter_form3(db, django_app, admin_user): + service = FundsReservationViewSet.get_service() + url = service.endpoint + res = django_app.get(url, user=admin_user, headers={'Accept': 'text/html'}) + assert res.status_code == 200 + url = f"{service.endpoint}?status__in=" diff --git a/tests/etl/test_etl_admin.py b/tests/etl/test_etl_admin.py index 7d3cb9efa..52a4be01c 100644 --- a/tests/etl/test_etl_admin.py +++ b/tests/etl/test_etl_admin.py @@ -57,6 +57,18 @@ def test_tasklog_queue(django_app, admin_user, tasklog): assert [m.message for m in storage] == [f"Task '{tasklog.task}' queued"] +def test_tasklog_queue_action(django_app, admin_user, tasklog): + tasklog.loader.task.delay = lambda: True + url = reverse("admin:etl_etltask_changelist") + res = django_app.get(url, user=admin_user) + res.form['action'].value = 'queue' + res.form['_selected_action'] = [tasklog.id] + res = res.form.submit().follow() + assert res.status_code == 200 + storage = res.context['messages'] + assert [m.message for m in storage] == ["1 task queued"] + + def test_tasklog_refresh(django_app, admin_user, tasklog): url = reverse("admin:etl_etltask_change", args=[tasklog.id]) res = django_app.get(url, user=admin_user) diff --git a/tests/etl/test_etl_base_loader.py b/tests/etl/test_etl_base_loader.py new file mode 100644 index 000000000..f2afc91d0 --- /dev/null +++ b/tests/etl/test_etl_base_loader.py @@ -0,0 +1,159 @@ +# -*- coding: utf-8 -*- +import time +from io import StringIO +from unittest import mock + +import pytest + +from etools_datamart.apps.data.loader import EtlResult, RequiredIsMissing, RequiredIsRunning +from etools_datamart.apps.data.models import FundsReservation + + +@pytest.fixture() +def loader1(db): + loader = FundsReservation.loader + loader.config.lock_key = str(time.time()) + return loader + + +def test_load_requiredismissing(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: True): + with pytest.raises(RequiredIsMissing): + loader1.load(check_requirements=True, max_records=2) + + +def test_load_requiredisrunning(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: True): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.is_running', lambda *a: True): + with pytest.raises(RequiredIsRunning): + loader1.load(check_requirements=False, max_records=2) + + +def test_load_requiredsuccess(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: True): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.load', lambda *a, **kw: True): + loader1.load(check_requirements=False, max_records=2) + + +def test_load_requiredready(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: False): + loader1.load(check_requirements=False, max_records=2) + + +def test_load_always_update(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: False): + loader1.load(check_requirements=False, max_records=2, always_update=True) + ret = loader1.load(check_requirements=False, max_records=2, always_update=True) + assert ret.created == 0 + assert ret.updated == 2 + + +def test_load_no_changes(loader1): + with mock.patch('etools_datamart.apps.data.models.Intervention.loader.need_refresh', lambda *a: False): + loader1.load(check_requirements=False, max_records=2) + ret = loader1.load(check_requirements=False, max_records=2) + assert ret.unchanged == 2 + + +def test_load_exception(loader1): + with mock.patch('etools_datamart.apps.data.models.FundsReservation.loader.process_country', + side_effect=Exception()): + with pytest.raises(Exception): + loader1.load(check_requirements=False, max_records=2) + + +def test_load_ignore_dependencies(loader1): + ret = loader1.load(ignore_dependencies=True, max_records=2) + assert ret.created == 2 + + +def test_load_lock_fail(loader1): + loader1.lock() + ret = loader1.load(ignore_dependencies=True, max_records=2) + assert ret.created == 0 + + +def test_load_verbosity(loader1): + ret = loader1.load(ignore_dependencies=True, max_records=2, + stdout=StringIO(), verbosity=2) + assert ret.created == 2 + + +def test_load_error(loader1): + with mock.patch('etools_datamart.apps.data.models.FundsReservation.loader.results', + EtlResult(error="error")): + loader1.on_end() + + +def test_loader_locking(loader1): + assert not loader1.is_locked + assert loader1.lock() + assert loader1.is_locked + loader1.unlock() + assert not loader1.is_locked + +# +# def test_load_pmp_indicator(number_of_intervention): +# PMPIndicators.objects.truncate() +# PMPIndicators.loader.unlock() +# assert PMPIndicators.loader.load() == EtlResult(created=153) +# assert PMPIndicators.objects.count() == number_of_intervention * 3 +# +# +# def test_load_intervention(number_of_intervention, settings, monkeypatch): +# Intervention.loader.unlock() +# assert Intervention.loader.load() == EtlResult(created=number_of_intervention * 3) +# assert Intervention.objects.count() == number_of_intervention * 3 +# +# +# def test_load_fam_indicator(db, settings, monkeypatch): +# FAMIndicator.loader.unlock() +# FAMIndicator.loader.load() +# assert FAMIndicator.objects.count() == 3 +# +# +# def test_load_user_stats(db, settings, monkeypatch): +# UserStats.loader.unlock() +# UserStats.loader.load() +# assert UserStats.objects.count() == 3 +# +# +# def test_load_location(db, settings, monkeypatch): +# Location.loader.unlock() +# Location.loader.load() +# assert UserStats.objects.count() == 3 +# +# +# def test_load_hact(db, settings, monkeypatch): +# HACT.loader.unlock() +# HACT.loader.load() +# assert HACT.objects.count() == 3 +# bolivia = HACT.objects.get(country_name='Bolivia') +# assert bolivia.microassessments_total == 0 +# assert bolivia.programmaticvisits_total == 1 +# assert bolivia.followup_spotcheck == 0 +# assert bolivia.completed_spotcheck == 0 +# assert bolivia.completed_hact_audits == 0 +# assert bolivia.completed_special_audits == 0 +# res = HACT.loader.load() +# assert res == EtlResult(unchanged=3) +# +# +# @freeze_time("2018-11-10") +# def test_dataset_increased(db, settings, monkeypatch): +# UserStats.loader.unlock() +# UserStats.loader.load() +# UserStats.objects.first().delete() +# ret = UserStats.loader.load() +# assert ret == EtlResult(created=1, unchanged=2) +# +# +# @freeze_time("2018-11-10") +# def test_dataset_changed(db, settings, monkeypatch): +# UserStats.loader.unlock() +# ret = UserStats.loader.load() +# assert ret == EtlResult(created=3) +# UserStats.objects.update(total=999, unicef=999) +# +# ret = UserStats.loader.load() +# assert ret == EtlResult(updated=3) diff --git a/tests/etl/test_etl_loaders.py b/tests/etl/test_etl_loaders.py index 3a7eb0c06..c7f6f48ac 100644 --- a/tests/etl/test_etl_loaders.py +++ b/tests/etl/test_etl_loaders.py @@ -28,7 +28,6 @@ def test_loader_load(loader, number_of_intervention): assert not loader.model.objects.exclude(seen=ret.context['today']).exists() # assert not loader.model.objects.filter(id=to_delete.pk).exists() -# # def test_load_pmp_indicator(number_of_intervention): # PMPIndicators.objects.truncate() # PMPIndicators.loader.unlock() diff --git a/tests/etl/test_etl_result.py b/tests/etl/test_etl_result.py index 234784d35..f26e00599 100644 --- a/tests/etl/test_etl_result.py +++ b/tests/etl/test_etl_result.py @@ -1,25 +1,24 @@ from etools_datamart.apps.data.loader import EtlResult from etools_datamart.apps.etl.results import etl_decoder, etl_dumps, etl_loads, EtlEncoder +# def test_result_eq(): +# assert EtlResult() == EtlResult() -def test_result_eq(): - assert EtlResult() == EtlResult() +# def test_result_ne(): +# assert not EtlResult() == EtlResult(created=1) -def test_result_ne(): - assert not EtlResult() == EtlResult(created=1) +# def test_result_eq_dict(): +# assert EtlResult() == {'created': 0, 'updated': 0, 'unchanged': 0, 'deleted': 0} -def test_result_eq_dict(): - assert EtlResult() == {'created': 0, 'updated': 0, 'unchanged': 0, 'deleted': 0} +# def test_result_ne_dict(): +# assert not EtlResult() == {'created': 1, 'updated': 1, 'unchanged': 1, 'deleted': 0} -def test_result_ne_dict(): - assert not EtlResult() == {'created': 1, 'updated': 1, 'unchanged': 1, 'deleted': 0} - -def test_result_ne_other(): - assert not EtlResult() == 1 +# def test_result_ne_other(): +# assert not EtlResult() == 1 def test_encoder(): @@ -46,7 +45,7 @@ def test_decode2(): "unchanged": 1, "deleted": 0, "status": "SUCCESS", - "error": None}}) == EtlResult(1, 1, 1) + "error": None}}) def test_dumps(): diff --git a/tests/test_views.py b/tests/test_views.py index 179b69b07..dedab42f2 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -19,6 +19,11 @@ def test_whoami(django_app, admin_user): assert res.status_code == 200 +def test_whoami_anon(django_app): + res = django_app.get(reverse('whoami')) + assert res.status_code == 200 + + def test_monitor(django_app, admin_user): EtlTask.objects.inspect() res = django_app.get(reverse('monitor'), user=admin_user) From 752ae8b287cd92a3dbe14be5ad232828b3b772a3 Mon Sep 17 00:00:00 2001 From: sax Date: Sat, 26 Jan 2019 00:52:25 +0100 Subject: [PATCH 108/122] updates CHANGES --- CHANGES | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index db2dbb2a5..30cafb5f2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,10 +1,24 @@ -1.11 (dev) +1.11 +--------- +* add impersonation +* fixes schema permission check + + +1.10 +---- +* Loader refactoring +* new endpoint 'Funds Reservation' +* add budget informations to interventions + + +1.9 (dev) --------- * WARNINGS: migration reset * Location/GatewayType endpoints * add action to queue multiple tasks * updates schema to eTools v6.5.1 + 1.8 --- * WARNINGS: migration reset From d8e991a65a2a1bd0a2b34a4fed0aa88227e336f7 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 28 Jan 2019 13:16:01 +0100 Subject: [PATCH 109/122] PD Indicators --- src/etools_datamart/apps/data/admin.py | 7 + src/etools_datamart/apps/data/loader.py | 2 +- .../apps/data/management/commands/load.py | 23 +++ .../apps/data/models/__init__.py | 1 + src/etools_datamart/apps/data/models/base.py | 2 + .../apps/data/models/pd_indicator.py | 158 ++++++++++++++++++ src/etools_datamart/apps/etools/patch.py | 12 +- src/etools_datamart/config/settings.py | 2 +- 8 files changed, 204 insertions(+), 3 deletions(-) create mode 100644 src/etools_datamart/apps/data/models/pd_indicator.py diff --git a/src/etools_datamart/apps/data/admin.py b/src/etools_datamart/apps/data/admin.py index 4e8cb4aec..805931d08 100644 --- a/src/etools_datamart/apps/data/admin.py +++ b/src/etools_datamart/apps/data/admin.py @@ -172,3 +172,10 @@ class LocationAdmin(DataModelAdmin): class FundsReservationAdmin(DataModelAdmin): list_display = ('country_name', 'schema_name', 'fr_number', 'fr_type', 'wbs') date_hierarchy = 'start_date' + + + +@register(models.PDIndicator) +class PDIndicatorAdmin(DataModelAdmin): + list_display = ('title', 'unit', 'display_type') + # list_filter = ('disaggregatable', ) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index b1974b8fb..0db43be86 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -424,7 +424,7 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, logger.info(f"Loader {requirement} is uptodate") self.always_update = always_update connection = connections['etools'] - if not countries: # pragma: no branch + if countries is None: # pragma: no branch countries = connection.get_tenants() self.mapping = {} mart_fields = self.model._meta.concrete_fields diff --git a/src/etools_datamart/apps/data/management/commands/load.py b/src/etools_datamart/apps/data/management/commands/load.py index ad3ea7280..8dec2fc7c 100644 --- a/src/etools_datamart/apps/data/management/commands/load.py +++ b/src/etools_datamart/apps/data/management/commands/load.py @@ -4,6 +4,7 @@ from django.apps import apps from django.core.management import BaseCommand +from django.db import connections from etools_datamart.apps.data.loader import loadeables, RUN_COMMAND from etools_datamart.apps.etl.models import EtlTask @@ -42,6 +43,7 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument('args', metavar='models', nargs='*', help='One or more application label.') + parser.add_argument('-e', '--exclude', metavar='excludes', nargs='*', help='exclude.') @@ -78,6 +80,17 @@ def add_arguments(self, parser): help="Run only failed tasks", ) + parser.add_argument('-c', + '--countries', + help="Run only selected counries", + ) + + parser.add_argument('-r', + '--records', + type=int, + help="Only load records", + ) + def notify(self, model, created, name, tpl=" {op} {model} `{name}`"): if self.verbosity > 2: op = {True: "Created", False: "Updated"}[created] @@ -92,6 +105,9 @@ def handle(self, *model_names, **options): debug = options['debug'] unlock = options['unlock'] excludes = options['exclude'] or [] + records = options['records'] + countries = options['countries'].split(',') + if debug: setup_logging(self.verbosity) if _all: @@ -100,6 +116,11 @@ def handle(self, *model_names, **options): qs = EtlTask.objects.exclude(status__in=['SUCCESS', 'RUNNING']) model_names = [t.loader.model_name for t in qs] + if countries: + connection = connections['etools'] + schemas = [c for c in connection.get_tenants() if c.schema_name in countries] + else: + schemas = None if not model_names: for model_name in sorted(list(loadeables)): self.stdout.write(model_name) @@ -125,6 +146,8 @@ def handle(self, *model_names, **options): ignore_dependencies=options['no_deps'], verbosity=self.verbosity, run_type=RUN_COMMAND, + max_records=records, + countries=schemas, stdout=sys.stdout) self.stdout.write(f"{model_name:20}: " f" created: {res.created:<3}" diff --git a/src/etools_datamart/apps/data/models/__init__.py b/src/etools_datamart/apps/data/models/__init__.py index 056b73ff6..032d98d79 100644 --- a/src/etools_datamart/apps/data/models/__init__.py +++ b/src/etools_datamart/apps/data/models/__init__.py @@ -5,3 +5,4 @@ from .hact import HACT # noqa from .location import GatewayType, Location # noqa from .funds_reservation import FundsReservation # noqa +from .pd_indicator import PDIndicator # noqa diff --git a/src/etools_datamart/apps/data/models/base.py b/src/etools_datamart/apps/data/models/base.py index 9c4249e01..8bb4a841f 100644 --- a/src/etools_datamart/apps/data/models/base.py +++ b/src/etools_datamart/apps/data/models/base.py @@ -71,6 +71,8 @@ class DataMartModel(models.Model, metaclass=DataMartModelBase): last_modify_date = models.DateTimeField(blank=True, auto_now=True) seen = models.DateTimeField(blank=True, null=True) + source_id = models.IntegerField(blank=True, null=True) + class Meta: abstract = True diff --git a/src/etools_datamart/apps/data/models/pd_indicator.py b/src/etools_datamart/apps/data/models/pd_indicator.py new file mode 100644 index 000000000..a552beb6e --- /dev/null +++ b/src/etools_datamart/apps/data/models/pd_indicator.py @@ -0,0 +1,158 @@ +from etools_datamart.apps.data.loader import Loader +from etools_datamart.apps.data.models import Location, Intervention +from etools_datamart.apps.data.models.base import DataMartModel +from etools_datamart.apps.etools.models import ReportsAppliedindicator, models + + +class PDIndicatorLoader(Loader): + + # def get_values(self, country, record, context): + # record is Location here + # record.disaggr + # return super().get_values(country, record, context) + + def process_record(self, filters, values, context): + return super().process_record(filters, values, context) + + def process_country(self, country, context): + qs = self.filter_queryset(self.get_queryset(context), context) + max_records = context['max_records'] + self.seen = [] + for indicator in qs.all(): + for disaggregation in indicator.disaggregations.all(): + indicator.disaggregation = disaggregation + for location in indicator.locations.all(): + indicator.location = location + filters = self.config.key(country, indicator) + values = self.get_values(country, indicator, context) + op = self.process_record(filters, values, context) + self.results.incr(op) + context['records'] += 1 + if max_records and context['records'] > max_records: + break + if max_records and context['records'] > max_records: + break + + # + # def process_record(self, filters, values, context): + # # ReportsAppliedindicatorLocations + # # ReportsAppliedindicatorDisaggregation + # + # for disaggregation in ReportsDisaggregation + # disaggregation = models.ManyToManyField( + # Disaggregation, + # verbose_name=_("Disaggregation Logic"), + # related_name='applied_indicators', + # blank=True, + # ) + # locations = models.ManyToManyField( + # Location, + # verbose_name=_("Location"), + # related_name='applied_indicators', + # ) + # + # return super().process_record(filters, values, context) + # + + +class PDIndicator(DataMartModel): + # header + context_code = models.CharField(max_length=50, blank=True, null=True) + assumptions = models.TextField(blank=True, null=True) + total = models.IntegerField(blank=True, null=True) + # indicator = models.ForeignKey('ReportsIndicatorblueprint', models.DO_NOTHING, + # related_name='reportsindicatorblueprint_reports_appliedindicator_indicator_id', + # blank=True, null=True) + # lower_result = models.ForeignKey('ReportsLowerresult', models.DO_NOTHING, + # related_name='reportslowerresult_reports_appliedindicator_lower_result_id') + means_of_verification = models.CharField(max_length=255, blank=True, null=True) + cluster_indicator_id = models.IntegerField(blank=True, null=True) + cluster_indicator_title = models.CharField(max_length=1024, blank=True, null=True) + cluster_name = models.CharField(max_length=512, blank=True, null=True) + created = models.DateTimeField(blank=True, null=True) + modified = models.DateTimeField(blank=True, null=True) + response_plan_name = models.CharField(max_length=1024, blank=True, null=True) + # section = models.ForeignKey('ReportsSector', models.DO_NOTHING, + # related_name='reportssector_reports_appliedindicator_section_id', blank=True, null=True) + is_active = models.BooleanField() + is_high_frequency = models.BooleanField() + baseline = models.TextField(blank=True, null=True) # This field type is a guess. + denominator_label = models.CharField(max_length=256, blank=True, null=True) + label = models.TextField(blank=True, null=True) + measurement_specifications = models.TextField(blank=True, null=True) + numerator_label = models.CharField(max_length=256, blank=True, null=True) + target = models.TextField() # This field type is a guess. + # from lower_result + lower_result_name = models.CharField(max_length=45, blank=True, null=True) + result_link_intervention = models.IntegerField(blank=True, null=True) + + # from section + section_name = models.CharField(max_length=45, blank=True, null=True) + + # from indicator + title = models.CharField(max_length=1024, blank=True, null=True) + # description = models.CharField(max_length=3072, blank=True, null=True) + # code = models.CharField(unique=True, max_length=50, blank=True, null=True) + # subdomain = models.CharField(max_length=255, blank=True, null=True) + # disaggregatable = models.BooleanField() + unit = models.CharField(max_length=10, blank=True, null=True) + # calculation_formula_across_locations = models.CharField(max_length=10, blank=True, null=True) + # calculation_formula_across_periods = models.CharField(max_length=10, blank=True, null=True) + display_type = models.CharField(max_length=10, blank=True, null=True) + + # from disaggregation + disaggregation_name = models.CharField(max_length=255, unique=True) + disaggregation_active = models.BooleanField(default=False) + + # from location + location_name = models.CharField(max_length=254, blank=True, null=True) + + # internals + location = models.ForeignKey(Location, blank=True, null=True, + on_delete=models.SET_NULL) + + intervention = models.ForeignKey(Intervention, blank=True, null=True, + on_delete=models.SET_NULL) + + # origin + source_disaggregation_id = models.IntegerField(blank=True, null=True) + source_location_id = models.IntegerField(blank=True, null=True) + + loader = PDIndicatorLoader() + + class Meta: + unique_together = (('schema_name', 'source_id', + 'source_location_id', + 'source_disaggregation_id', + ),) + + class Options: + source = ReportsAppliedindicator + queryset = ReportsAppliedindicator.objects.select_related('indicator', 'section').all + + key = lambda country, record: dict(schema_name=country.schema_name, + source_id=record.pk, + source_location_id=record.location.pk, + source_disaggregation_id=record.disaggregation.pk) + + mapping = {'title': 'indicator.title', + 'description': 'indicator.description', + 'code': 'indicator.code', + 'subdomain': 'indicator.subdomain', + 'disaggregatable': 'indicator.disaggregatable', + 'unit': 'indicator.unit', + 'calculation_formula_across_locations': 'indicator.calculation_formula_across_locations`', + 'calculation_formula_across_periods': 'indicator.calculation_formula_across_periods`', + 'display_type': 'indicator.display_type`', + 'section_name': 'section.name', + 'lower_result_name': 'lower_result.name', + 'result_link_intervention': 'lower_result.result_link.intervention.pk', + + 'disaggregation_name': 'disaggregation.name', + 'disaggregation_active': 'disaggregation.active', + + 'location_name': 'location.name', + + 'source_disaggregation_id': 'disaggregation.id', + 'source_location_id': 'location.id', + } diff --git a/src/etools_datamart/apps/etools/patch.py b/src/etools_datamart/apps/etools/patch.py index df212734d..aac430906 100644 --- a/src/etools_datamart/apps/etools/patch.py +++ b/src/etools_datamart/apps/etools/patch.py @@ -8,7 +8,8 @@ from unicef_security.models import User -from etools_datamart.apps.etools.models import PartnersPlannedengagement, T2FTravel +from etools_datamart.apps.etools.models import PartnersPlannedengagement, T2FTravel, ReportsAppliedindicator, \ + ReportsAppliedindicatorDisaggregation, ReportsAppliedindicatorLocations, ReportsDisaggregation, LocationsLocation def label(attr, self): @@ -132,6 +133,15 @@ def patch(): through=AuthUserGroups, ).contribute_to_class(AuthUser, 'groups') + # Fix ReportsAppliedindicator ManyToManyField + models.ManyToManyField(ReportsDisaggregation, + through=ReportsAppliedindicatorDisaggregation, + ).contribute_to_class(ReportsAppliedindicator, 'disaggregations') + + models.ManyToManyField(LocationsLocation, + through=ReportsAppliedindicatorLocations, + ).contribute_to_class(ReportsAppliedindicator, 'locations') + # models.OneToOneField(UsersUserprofile, # on_delete=models.PROTECT, # ).contribute_to_class(AuthUser, 'profile') diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index b88ca89df..9090769ca 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -30,7 +30,7 @@ CELERY_BROKER_URL=(str, 'redis://127.0.0.1:6379/2'), CELERY_RESULT_BACKEND=(str, 'redis://127.0.0.1:6379/3'), CSRF_COOKIE_SECURE=(bool, True), - IGNORED_SCHEMAS=(str, "public,uat,frg"), + IGNORED_SCHEMAS=(str, ["public","uat","frg"]), DATABASE_URL=(str, "postgis://postgres:@127.0.0.1:5432/etools_datamart"), DATABASE_URL_ETOOLS=(str, "postgis://postgres:@127.0.0.1:15432/etools"), DEBUG=(bool, False), From 8b8f7145df69e11c4ec1cb3836698bc9c1246944 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 28 Jan 2019 16:52:12 +0100 Subject: [PATCH 110/122] add PDIndicator endpoint --- Makefile | 6 ++ .../api/endpoints/datamart/__init__.py | 1 + .../api/endpoints/datamart/pd_indicator.py | 16 ++++ src/etools_datamart/api/urls.py | 9 +- src/etools_datamart/apps/data/admin.py | 1 - src/etools_datamart/apps/data/loader.py | 9 +- .../migrations/0002_auto_20190128_1447.py | 94 +++++++++++++++++++ .../apps/data/models/pd_indicator.py | 80 +++++++--------- src/etools_datamart/apps/etools/patch.py | 5 +- src/etools_datamart/config/settings.py | 2 +- src/unicef_rest_framework/apps.py | 1 + src/unicef_rest_framework/checks.py | 11 +++ 12 files changed, 177 insertions(+), 58 deletions(-) create mode 100644 src/etools_datamart/api/endpoints/datamart/pd_indicator.py create mode 100644 src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py create mode 100644 src/unicef_rest_framework/checks.py diff --git a/Makefile b/Makefile index 37ae9f8cb..d1ee5ca95 100644 --- a/Makefile +++ b/Makefile @@ -80,3 +80,9 @@ reset-migrations: ./manage.py reset-migrations ./manage.py init-setup --all + +new-data-migration: + ./manage.py migrate data 0001 + find src/etools_datamart/apps/data/migrations -name '000[2,3,4,5,6,7,8,9]*' | xargs rm -f + ./manage.py makemigrations data + ./manage.py migrate data diff --git a/src/etools_datamart/api/endpoints/datamart/__init__.py b/src/etools_datamart/api/endpoints/datamart/__init__.py index 7b8a552e1..0dd823bf2 100644 --- a/src/etools_datamart/api/endpoints/datamart/__init__.py +++ b/src/etools_datamart/api/endpoints/datamart/__init__.py @@ -7,3 +7,4 @@ from .hact import HACTViewSet from .location import LocationViewSet from .funds_reservation import FundsReservationViewSet +from .pd_indicator import PDIndicatorViewSet diff --git a/src/etools_datamart/api/endpoints/datamart/pd_indicator.py b/src/etools_datamart/api/endpoints/datamart/pd_indicator.py new file mode 100644 index 000000000..6d507ef3d --- /dev/null +++ b/src/etools_datamart/api/endpoints/datamart/pd_indicator.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +from etools_datamart.api.endpoints.datamart.serializers import DataMartSerializer +from etools_datamart.apps.data import models + +from .. import common + + +class PDIndicatorSerializer(DataMartSerializer): + class Meta: + model = models.PDIndicator + fields = '__all__' + + +class PDIndicatorViewSet(common.DataMartViewSet): + serializer_class = PDIndicatorSerializer + queryset = models.PDIndicator.objects.all() diff --git a/src/etools_datamart/api/urls.py b/src/etools_datamart/api/urls.py index 15b24ba80..dff91a51b 100644 --- a/src/etools_datamart/api/urls.py +++ b/src/etools_datamart/api/urls.py @@ -28,12 +28,13 @@ class ReadOnlyRouter(APIReadOnlyRouter): router.register(r'etools/tpm/tpmvisit', endpoints.TpmTpmvisitViewSet) router.register(r'etools/locations', endpoints.LocationViewSet) -router.register(r'datamart/pmp-indicators', endpoints.PMPIndicatorsViewSet) -router.register(r'datamart/interventions', endpoints.InterventionViewSet) router.register(r'datamart/fam-indicators', endpoints.FAMIndicatorViewSet) -router.register(r'datamart/user-stats', endpoints.UserStatsViewSet) -router.register(r'datamart/hact', endpoints.HACTViewSet) router.register(r'datamart/funds-reservation', endpoints.FundsReservationViewSet) +router.register(r'datamart/hact', endpoints.HACTViewSet) +router.register(r'datamart/interventions', endpoints.InterventionViewSet) +router.register(r'datamart/pd-indicators', endpoints.PDIndicatorViewSet) +router.register(r'datamart/pmp-indicators', endpoints.PMPIndicatorsViewSet) +router.register(r'datamart/user-stats', endpoints.UserStatsViewSet) router.register(r'system/monitor', endpoints.MonitorViewSet) diff --git a/src/etools_datamart/apps/data/admin.py b/src/etools_datamart/apps/data/admin.py index 805931d08..c33675266 100644 --- a/src/etools_datamart/apps/data/admin.py +++ b/src/etools_datamart/apps/data/admin.py @@ -174,7 +174,6 @@ class FundsReservationAdmin(DataModelAdmin): date_hierarchy = 'start_date' - @register(models.PDIndicator) class PDIndicatorAdmin(DataModelAdmin): list_display = ('title', 'unit', 'display_type') diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 0db43be86..9d1286287 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -276,8 +276,11 @@ def process_record(self, filters, values, context): err) from e def get_values(self, country, record, context): - ret = {'area_code': country.business_area_code} - + ret = {'area_code': country.business_area_code, + 'schema_name': country.schema_name, + 'country_name': country.name, + 'source_id': record.id + } for k, v in self.mapping.items(): if v == '__self__': try: @@ -429,7 +432,7 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, self.mapping = {} mart_fields = self.model._meta.concrete_fields for field in mart_fields: - if field.name not in ['country_name', 'schema_name', 'area_code', + if field.name not in ['country_name', 'schema_name', 'area_code', 'source_id', 'id', 'last_modify_date']: self.mapping[field.name] = field.name if self.config.mapping: # pragma: no branch diff --git a/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py b/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py new file mode 100644 index 000000000..356e0ff97 --- /dev/null +++ b/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py @@ -0,0 +1,94 @@ +# Generated by Django 2.1.5 on 2019-01-28 14:47 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('data', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='PDIndicator', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('country_name', models.CharField(db_index=True, max_length=100)), + ('schema_name', models.CharField(db_index=True, max_length=63)), + ('area_code', models.CharField(db_index=True, max_length=10)), + ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), + ('context_code', models.CharField(blank=True, max_length=50, null=True)), + ('assumptions', models.TextField(blank=True, null=True)), + ('total', models.IntegerField(blank=True, null=True)), + ('means_of_verification', models.CharField(blank=True, max_length=255, null=True)), + ('cluster_indicator_id', models.IntegerField(blank=True, null=True)), + ('cluster_indicator_title', models.CharField(blank=True, max_length=1024, null=True)), + ('cluster_name', models.CharField(blank=True, max_length=512, null=True)), + ('response_plan_name', models.CharField(blank=True, max_length=1024, null=True)), + ('is_active', models.BooleanField()), + ('is_high_frequency', models.BooleanField()), + ('denominator_label', models.CharField(blank=True, max_length=256, null=True)), + ('label', models.TextField(blank=True, null=True)), + ('measurement_specifications', models.TextField(blank=True, null=True)), + ('numerator_label', models.CharField(blank=True, max_length=256, null=True)), + ('target_denominator', models.IntegerField(blank=True, null=True)), + ('target_numerator', models.IntegerField(blank=True, null=True)), + ('baseline_denominator', models.IntegerField(blank=True, null=True)), + ('baseline_numerator', models.IntegerField(blank=True, null=True)), + ('lower_result_name', models.CharField(blank=True, max_length=500, null=True)), + ('result_link_intervention', models.IntegerField(blank=True, null=True)), + ('section_name', models.CharField(blank=True, max_length=45, null=True)), + ('title', models.CharField(blank=True, max_length=1024, null=True)), + ('unit', models.CharField(blank=True, max_length=10, null=True)), + ('display_type', models.CharField(blank=True, max_length=10, null=True)), + ('disaggregation_name', models.CharField(max_length=255)), + ('disaggregation_active', models.BooleanField(default=False)), + ('location_name', models.CharField(blank=True, max_length=254, null=True)), + ('source_disaggregation_id', models.IntegerField(blank=True, null=True)), + ('source_location_id', models.IntegerField(blank=True, null=True)), + ], + ), + migrations.AddField( + model_name='famindicator', + name='source_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='hact', + name='source_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='intervention', + name='source_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='pmpindicators', + name='source_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='userstats', + name='source_id', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='pdindicator', + name='intervention', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Intervention'), + ), + migrations.AddField( + model_name='pdindicator', + name='location', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Location'), + ), + migrations.AlterUniqueTogether( + name='pdindicator', + unique_together={('schema_name', 'source_id', 'source_location_id', 'source_disaggregation_id')}, + ), + ] diff --git a/src/etools_datamart/apps/data/models/pd_indicator.py b/src/etools_datamart/apps/data/models/pd_indicator.py index a552beb6e..bc36f9471 100644 --- a/src/etools_datamart/apps/data/models/pd_indicator.py +++ b/src/etools_datamart/apps/data/models/pd_indicator.py @@ -1,19 +1,11 @@ from etools_datamart.apps.data.loader import Loader -from etools_datamart.apps.data.models import Location, Intervention +from etools_datamart.apps.data.models import Intervention, Location from etools_datamart.apps.data.models.base import DataMartModel -from etools_datamart.apps.etools.models import ReportsAppliedindicator, models +from etools_datamart.apps.etools.models import models, ReportsAppliedindicator class PDIndicatorLoader(Loader): - # def get_values(self, country, record, context): - # record is Location here - # record.disaggr - # return super().get_values(country, record, context) - - def process_record(self, filters, values, context): - return super().process_record(filters, values, context) - def process_country(self, country, context): qs = self.filter_queryset(self.get_queryset(context), context) max_records = context['max_records'] @@ -33,30 +25,8 @@ def process_country(self, country, context): if max_records and context['records'] > max_records: break - # - # def process_record(self, filters, values, context): - # # ReportsAppliedindicatorLocations - # # ReportsAppliedindicatorDisaggregation - # - # for disaggregation in ReportsDisaggregation - # disaggregation = models.ManyToManyField( - # Disaggregation, - # verbose_name=_("Disaggregation Logic"), - # related_name='applied_indicators', - # blank=True, - # ) - # locations = models.ManyToManyField( - # Location, - # verbose_name=_("Location"), - # related_name='applied_indicators', - # ) - # - # return super().process_record(filters, values, context) - # - class PDIndicator(DataMartModel): - # header context_code = models.CharField(max_length=50, blank=True, null=True) assumptions = models.TextField(blank=True, null=True) total = models.IntegerField(blank=True, null=True) @@ -69,30 +39,38 @@ class PDIndicator(DataMartModel): cluster_indicator_id = models.IntegerField(blank=True, null=True) cluster_indicator_title = models.CharField(max_length=1024, blank=True, null=True) cluster_name = models.CharField(max_length=512, blank=True, null=True) - created = models.DateTimeField(blank=True, null=True) - modified = models.DateTimeField(blank=True, null=True) + # created = models.DateTimeField(blank=True, null=True) + # modified = models.DateTimeField(blank=True, null=True) response_plan_name = models.CharField(max_length=1024, blank=True, null=True) # section = models.ForeignKey('ReportsSector', models.DO_NOTHING, # related_name='reportssector_reports_appliedindicator_section_id', blank=True, null=True) is_active = models.BooleanField() is_high_frequency = models.BooleanField() - baseline = models.TextField(blank=True, null=True) # This field type is a guess. + denominator_label = models.CharField(max_length=256, blank=True, null=True) label = models.TextField(blank=True, null=True) measurement_specifications = models.TextField(blank=True, null=True) numerator_label = models.CharField(max_length=256, blank=True, null=True) - target = models.TextField() # This field type is a guess. + + # target = models.TextField() # This field type is a guess. + target_denominator = models.IntegerField(blank=True, null=True) + target_numerator = models.IntegerField(blank=True, null=True) + + # baseline = models.TextField(blank=True, null=True) # This field type is a guess. + baseline_denominator = models.IntegerField(blank=True, null=True) + baseline_numerator = models.IntegerField(blank=True, null=True) + # from lower_result - lower_result_name = models.CharField(max_length=45, blank=True, null=True) + lower_result_name = models.CharField(max_length=500, blank=True, null=True) result_link_intervention = models.IntegerField(blank=True, null=True) # from section section_name = models.CharField(max_length=45, blank=True, null=True) - # from indicator + # from blueprint title = models.CharField(max_length=1024, blank=True, null=True) # description = models.CharField(max_length=3072, blank=True, null=True) - # code = models.CharField(unique=True, max_length=50, blank=True, null=True) + # code = models.CharField(max_length=50, blank=True, null=True) # subdomain = models.CharField(max_length=255, blank=True, null=True) # disaggregatable = models.BooleanField() unit = models.CharField(max_length=10, blank=True, null=True) @@ -101,7 +79,7 @@ class PDIndicator(DataMartModel): display_type = models.CharField(max_length=10, blank=True, null=True) # from disaggregation - disaggregation_name = models.CharField(max_length=255, unique=True) + disaggregation_name = models.CharField(max_length=255) disaggregation_active = models.BooleanField(default=False) # from location @@ -121,7 +99,8 @@ class PDIndicator(DataMartModel): loader = PDIndicatorLoader() class Meta: - unique_together = (('schema_name', 'source_id', + unique_together = (('schema_name', + 'source_id', 'source_location_id', 'source_disaggregation_id', ),) @@ -136,13 +115,19 @@ class Options: source_disaggregation_id=record.disaggregation.pk) mapping = {'title': 'indicator.title', - 'description': 'indicator.description', - 'code': 'indicator.code', - 'subdomain': 'indicator.subdomain', - 'disaggregatable': 'indicator.disaggregatable', + # 'description': 'indicator.description', + # 'code': 'indicator.code', + # 'subdomain': 'indicator.subdomain', + # 'disaggregatable': 'indicator.disaggregatable', 'unit': 'indicator.unit', - 'calculation_formula_across_locations': 'indicator.calculation_formula_across_locations`', - 'calculation_formula_across_periods': 'indicator.calculation_formula_across_periods`', + # 'calculation_formula_across_locations': 'indicator.calculation_formula_across_locations`', + # 'calculation_formula_across_periods': 'indicator.calculation_formula_across_periods`', + + 'target_denominator': lambda c, r: r.target['d'], + 'target_numerator': lambda c, r: r.target['v'], + 'baseline_denominator': lambda c, r: r.baseline['d'], + 'baseline_numerator': lambda c, r: r.baseline['v'], + 'display_type': 'indicator.display_type`', 'section_name': 'section.name', 'lower_result_name': 'lower_result.name', @@ -152,6 +137,7 @@ class Options: 'disaggregation_active': 'disaggregation.active', 'location_name': 'location.name', + 'location': lambda *a: None, 'source_disaggregation_id': 'disaggregation.id', 'source_location_id': 'location.id', diff --git a/src/etools_datamart/apps/etools/patch.py b/src/etools_datamart/apps/etools/patch.py index aac430906..67152aca4 100644 --- a/src/etools_datamart/apps/etools/patch.py +++ b/src/etools_datamart/apps/etools/patch.py @@ -8,8 +8,9 @@ from unicef_security.models import User -from etools_datamart.apps.etools.models import PartnersPlannedengagement, T2FTravel, ReportsAppliedindicator, \ - ReportsAppliedindicatorDisaggregation, ReportsAppliedindicatorLocations, ReportsDisaggregation, LocationsLocation +from etools_datamart.apps.etools.models import (LocationsLocation, PartnersPlannedengagement, + ReportsAppliedindicator, ReportsAppliedindicatorDisaggregation, + ReportsAppliedindicatorLocations, ReportsDisaggregation, T2FTravel,) def label(attr, self): diff --git a/src/etools_datamart/config/settings.py b/src/etools_datamart/config/settings.py index 9090769ca..1f0b9b6c2 100644 --- a/src/etools_datamart/config/settings.py +++ b/src/etools_datamart/config/settings.py @@ -30,7 +30,7 @@ CELERY_BROKER_URL=(str, 'redis://127.0.0.1:6379/2'), CELERY_RESULT_BACKEND=(str, 'redis://127.0.0.1:6379/3'), CSRF_COOKIE_SECURE=(bool, True), - IGNORED_SCHEMAS=(str, ["public","uat","frg"]), + IGNORED_SCHEMAS=(str, ["public", "uat", "frg"]), DATABASE_URL=(str, "postgis://postgres:@127.0.0.1:5432/etools_datamart"), DATABASE_URL_ETOOLS=(str, "postgis://postgres:@127.0.0.1:15432/etools"), DEBUG=(bool, False), diff --git a/src/unicef_rest_framework/apps.py b/src/unicef_rest_framework/apps.py index a9f0724ae..b221b5b39 100644 --- a/src/unicef_rest_framework/apps.py +++ b/src/unicef_rest_framework/apps.py @@ -9,3 +9,4 @@ class Config(AppConfig): def ready(self): from . import tasks # noqa from . import handlers # noqa + from . import checks # noqa diff --git a/src/unicef_rest_framework/checks.py b/src/unicef_rest_framework/checks.py new file mode 100644 index 000000000..dc80322fc --- /dev/null +++ b/src/unicef_rest_framework/checks.py @@ -0,0 +1,11 @@ +from django.core import checks +from django.core.checks import INFO, Warning + + +@checks.register() +def check_services(app_configs, **kwargs): + from unicef_rest_framework.models import Service + created, deleted, total = Service.objects.load_services() + if created: + return [Warning(INFO, f"{created} new services found")] + return [] From 7d3fe882e6f3dc7c04614030f0eca54768858c68 Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 28 Jan 2019 19:21:49 +0100 Subject: [PATCH 111/122] updates tests --- src/etools_datamart/apps/data/loader.py | 6 +- .../apps/data/models/pd_indicator.py | 4 +- .../test_utilities/factories/data.py | 10 ++- .../data/FAMIndicatorViewSet.fixture.json | 15 +++-- .../test_data/data/HACTViewSet.fixture.json | 61 ------------------- .../data/InterventionViewSet.fixture.json | 21 ++++--- .../data/PMPIndicatorsViewSet.fixture.json | 21 ++++--- .../data/UserStatsViewSet.fixture.json | 17 +++--- .../record/FAMIndicatorViewSet.fixture.json | 5 +- .../test_data/record/HACTViewSet.fixture.json | 23 ------- .../record/InterventionViewSet.fixture.json | 13 ++-- .../record/PMPIndicatorsViewSet.fixture.json | 7 ++- .../record/UserStatsViewSet.fixture.json | 5 +- ...est_datamart_fam-indicators_.response.json | 23 ++++--- ...test_datamart_interventions_.response.json | 29 +++++---- ...est_datamart_pmp-indicators_.response.json | 29 +++++---- ..._latest_datamart_user-stats_.response.json | 25 ++++---- ...atamart_fam-indicators_518_.response.json} | 11 ++-- ...datamart_interventions_726_.response.json} | 19 +++--- ...atamart_pmp-indicators_460_.response.json} | 13 ++-- ...st_datamart_user-stats_131_.response.json} | 11 ++-- tests/etl/test_etl_loaders.py | 6 +- 22 files changed, 167 insertions(+), 207 deletions(-) delete mode 100644 tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json delete mode 100644 tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_fam-indicators_353_.response.json => get__api_latest_datamart_fam-indicators_518_.response.json} (88%) rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_interventions_549_.response.json => get__api_latest_datamart_interventions_726_.response.json} (87%) rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_pmp-indicators_364_.response.json => get__api_latest_datamart_pmp-indicators_460_.response.json} (88%) rename tests/api/interfaces/_api_checker/test_data/test_record/{get__api_latest_datamart_user-stats_98_.response.json => get__api_latest_datamart_user-stats_131_.response.json} (84%) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 9d1286287..63a1786c1 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -315,7 +315,7 @@ def post_process_country(self, country, context): self.tree_parents = [] # mark seen records - self.model.objects.filter(id__in=self.seen).update(seen=context['today']) + # self.model.objects.filter(id__in=self.seen).update(seen=context['today']) def process_country(self, country, context): qs = self.filter_queryset(self.get_queryset(context), context) @@ -462,8 +462,8 @@ def load(self, *, verbosity=0, always_update=False, stdout=None, break if stdout and verbosity > 0: stdout.write("\n") - # deleted = self.model.objects.exclude(seen=today).delete()[0] - # self.results.deleted = deleted + deleted = self.model.objects.exclude(seen=today).delete()[0] + self.results.deleted = deleted except Exception: transaction.savepoint_rollback(sid) raise diff --git a/src/etools_datamart/apps/data/models/pd_indicator.py b/src/etools_datamart/apps/data/models/pd_indicator.py index bc36f9471..df662a0d2 100644 --- a/src/etools_datamart/apps/data/models/pd_indicator.py +++ b/src/etools_datamart/apps/data/models/pd_indicator.py @@ -44,8 +44,8 @@ class PDIndicator(DataMartModel): response_plan_name = models.CharField(max_length=1024, blank=True, null=True) # section = models.ForeignKey('ReportsSector', models.DO_NOTHING, # related_name='reportssector_reports_appliedindicator_section_id', blank=True, null=True) - is_active = models.BooleanField() - is_high_frequency = models.BooleanField() + is_active = models.BooleanField(blank=True, null=True) + is_high_frequency = models.BooleanField(blank=True, null=True) denominator_label = models.CharField(max_length=256, blank=True, null=True) label = models.TextField(blank=True, null=True) diff --git a/tests/_test_lib/test_utilities/factories/data.py b/tests/_test_lib/test_utilities/factories/data.py index c90105cea..a769595b0 100644 --- a/tests/_test_lib/test_utilities/factories/data.py +++ b/tests/_test_lib/test_utilities/factories/data.py @@ -10,7 +10,7 @@ from test_utilities.factories.common import RegisterModelFactory from etools_datamart.apps.data.models import (FAMIndicator, FundsReservation, GatewayType, HACT, - Intervention, Location, PMPIndicators, UserStats,) + Intervention, Location, PDIndicator, PMPIndicators, UserStats,) class DataMartModelFactory(RegisterModelFactory): @@ -120,3 +120,11 @@ class FundsReservationFactory(DataMartModelFactory): class Meta: model = FundsReservation + + +class PDIndicatorFactory(DataMartModelFactory): + is_active = True + is_high_frequency = True + + class Meta: + model = PDIndicator diff --git a/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json index 075c51054..5a31c050b 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/FAMIndicatorViewSet.fixture.json @@ -3,13 +3,14 @@ "master": [ { "model": "data.famindicator", - "pk": 350, + "pk": 515, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.509Z", + "last_modify_date": "2019-01-28T16:49:04.689Z", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, @@ -31,13 +32,14 @@ }, { "model": "data.famindicator", - "pk": 351, + "pk": 516, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.515Z", + "last_modify_date": "2019-01-28T16:49:04.695Z", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, @@ -59,13 +61,14 @@ }, { "model": "data.famindicator", - "pk": 352, + "pk": 517, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.518Z", + "last_modify_date": "2019-01-28T16:49:04.696Z", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json deleted file mode 100644 index f5e11d3f5..000000000 --- a/tests/api/interfaces/_api_checker/test_data/data/HACTViewSet.fixture.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "data": { - "master": [ - { - "model": "data.hact", - "pk": 15, - "fields": { - "country_name": "bolivia", - "schema_name": "bolivia", - "area_code": "", - "last_modify_date": "2019-01-08T21:51:11.031Z", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - } - }, - { - "model": "data.hact", - "pk": 16, - "fields": { - "country_name": "chad", - "schema_name": "chad", - "area_code": "", - "last_modify_date": "2019-01-08T21:51:11.041Z", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - } - }, - { - "model": "data.hact", - "pk": 17, - "fields": { - "country_name": "lebanon", - "schema_name": "lebanon", - "area_code": "", - "last_modify_date": "2019-01-08T21:51:11.045Z", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - } - } - ], - "deps": [] - } -} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json index 9d583eb47..97c75d6a2 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/InterventionViewSet.fixture.json @@ -3,14 +3,15 @@ "master": [ { "model": "data.intervention", - "pk": 274, + "pk": 723, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-21T19:17:09.988Z", + "last_modify_date": "2019-01-28T16:49:05.500Z", "seen": null, - "created": "2019-01-21T19:17:09.988Z", + "source_id": null, + "created": "2019-01-28T16:49:05.500Z", "updated": null, "document_type": null, "number": "#000", @@ -63,14 +64,15 @@ }, { "model": "data.intervention", - "pk": 275, + "pk": 724, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-21T19:17:09.994Z", + "last_modify_date": "2019-01-28T16:49:05.512Z", "seen": null, - "created": "2019-01-21T19:17:09.994Z", + "source_id": null, + "created": "2019-01-28T16:49:05.513Z", "updated": null, "document_type": null, "number": "#001", @@ -123,14 +125,15 @@ }, { "model": "data.intervention", - "pk": 276, + "pk": 725, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-21T19:17:09.997Z", + "last_modify_date": "2019-01-28T16:49:05.516Z", "seen": null, - "created": "2019-01-21T19:17:09.997Z", + "source_id": null, + "created": "2019-01-28T16:49:05.516Z", "updated": null, "document_type": null, "number": "#002", diff --git a/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json index 8a229cc0e..b73738fed 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/PMPIndicatorsViewSet.fixture.json @@ -3,13 +3,14 @@ "master": [ { "model": "data.pmpindicators", - "pk": 361, + "pk": 457, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T21:47:03.234Z", + "last_modify_date": "2019-01-28T16:49:06.905Z", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -36,19 +37,20 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "2019-01-08T21:47:03.234Z", + "created": "2019-01-28T16:49:06.906Z", "updated": null } }, { "model": "data.pmpindicators", - "pk": 362, + "pk": 458, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-08T21:47:03.249Z", + "last_modify_date": "2019-01-28T16:49:06.928Z", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -75,19 +77,20 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "2019-01-08T21:47:03.249Z", + "created": "2019-01-28T16:49:06.928Z", "updated": null } }, { "model": "data.pmpindicators", - "pk": 363, + "pk": 459, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-08T21:47:03.260Z", + "last_modify_date": "2019-01-28T16:49:06.951Z", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -114,7 +117,7 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "2019-01-08T21:47:03.260Z", + "created": "2019-01-28T16:49:06.952Z", "updated": null } } diff --git a/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json index 62ac958dd..442616a31 100644 --- a/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/data/UserStatsViewSet.fixture.json @@ -3,13 +3,14 @@ "master": [ { "model": "data.userstats", - "pk": 95, + "pk": 128, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.807Z", + "last_modify_date": "2019-01-28T16:49:07.810Z", "seen": null, + "source_id": null, "month": "2019-01-01", "total": 0, "unicef": 0, @@ -19,14 +20,15 @@ }, { "model": "data.userstats", - "pk": 96, + "pk": 129, "fields": { "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.822Z", + "last_modify_date": "2019-01-28T16:49:07.842Z", "seen": null, - "month": "2019-02-01", + "source_id": null, + "month": "2019-01-01", "total": 0, "unicef": 0, "logins": 0, @@ -35,13 +37,14 @@ }, { "model": "data.userstats", - "pk": 97, + "pk": 130, "fields": { "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "2019-01-08T21:51:10.837Z", + "last_modify_date": "2019-01-28T16:49:07.855Z", "seen": null, + "source_id": null, "month": "2019-01-01", "total": 0, "unicef": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json index cab05950f..5db441ce4 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/FAMIndicatorViewSet.fixture.json @@ -2,13 +2,14 @@ "record": { "master": { "model": "data.famindicator", - "pk": 353, + "pk": 518, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T22:06:07.843Z", + "last_modify_date": "2019-01-28T16:49:08.167Z", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json deleted file mode 100644 index bcfe54c83..000000000 --- a/tests/api/interfaces/_api_checker/test_data/record/HACTViewSet.fixture.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "record": { - "master": { - "model": "data.hact", - "pk": 18, - "fields": { - "country_name": "bolivia", - "schema_name": "bolivia", - "area_code": "", - "last_modify_date": "2019-01-08T22:06:08.348Z", - "seen": null, - "year": 2019, - "microassessments_total": 0, - "programmaticvisits_total": 0, - "followup_spotcheck": 0, - "completed_spotcheck": 0, - "completed_hact_audits": 0, - "completed_special_audits": 0 - } - }, - "deps": [] - } -} \ No newline at end of file diff --git a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json index e063c7589..9d537927c 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/InterventionViewSet.fixture.json @@ -2,18 +2,19 @@ "record": { "master": { "model": "data.intervention", - "pk": 549, + "pk": 726, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-21T19:52:22.071Z", + "last_modify_date": "2019-01-28T16:49:09.586Z", "seen": null, - "created": "2019-01-21T19:52:22.071Z", + "source_id": null, + "created": "2019-01-28T16:49:09.586Z", "updated": null, "document_type": null, - "number": "#272", - "title": "title272", + "number": "#003", + "title": "title003", "status": null, "start_date": null, "end_date": null, @@ -54,7 +55,7 @@ "total": "10.00", "total_local": "10.00", "currency": "USD", - "intervention_id": 272, + "intervention_id": 3, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null diff --git a/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json index 5ab2c63db..479a135d9 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/PMPIndicatorsViewSet.fixture.json @@ -2,13 +2,14 @@ "record": { "master": { "model": "data.pmpindicators", - "pk": 364, + "pk": 460, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T21:58:34.612Z", + "last_modify_date": "2019-01-28T16:49:10.340Z", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -35,7 +36,7 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "2019-01-08T21:58:34.612Z", + "created": "2019-01-28T16:49:10.340Z", "updated": null } }, diff --git a/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json b/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json index 7f936de91..9102479c8 100644 --- a/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json +++ b/tests/api/interfaces/_api_checker/test_data/record/UserStatsViewSet.fixture.json @@ -2,13 +2,14 @@ "record": { "master": { "model": "data.userstats", - "pk": 98, + "pk": 131, "fields": { "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "2019-01-08T22:06:08.171Z", + "last_modify_date": "2019-01-28T16:49:11.272Z", "seen": null, + "source_id": null, "month": "2019-03-01", "total": 0, "unicef": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json index 7ee515921..5366d9330 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_fam-indicators_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"bd9f1d0fe33faa948080db4555d90188\"" + "\"122ae2947846c7060ee6c51027475ccd\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,7 +39,7 @@ ], "cache-key": [ "cache-key", - "bd9f1d0fe33faa948080db4555d90188" + "122ae2947846c7060ee6c51027475ccd" ], "cache-hit": [ "cache-hit", @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "1827" + "1878" ] }, "data": { @@ -62,11 +62,12 @@ "previous": null, "results": [ { - "id": 350, + "id": 515, "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:04", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, @@ -86,11 +87,12 @@ "microassessment_cancelled": 0 }, { - "id": 351, + "id": 516, "country_name": "chad", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:04", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, @@ -110,11 +112,12 @@ "microassessment_cancelled": 0 }, { - "id": 352, + "id": 517, "country_name": "lebanon", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:04", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json index 58068f1de..d01bf2c15 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_interventions_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"ad5abaf134ac66bc2f03b6233560a93c\"" + "\"8c1055f7fab0891e97ecbc8bdab370ff\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,7 +39,7 @@ ], "cache-key": [ "cache-key", - "ad5abaf134ac66bc2f03b6233560a93c" + "8c1055f7fab0891e97ecbc8bdab370ff" ], "cache-hit": [ "cache-hit", @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "3726" + "3777" ] }, "data": { @@ -62,13 +62,14 @@ "previous": null, "results": [ { - "id": 274, + "id": 723, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "21 Jan 2019 19:17:09", + "last_modify_date": "28 Jan 2019 16:49:05", "seen": null, - "created": "21 Jan 2019 19:17:09", + "source_id": null, + "created": "28 Jan 2019 16:49:05", "updated": null, "document_type": null, "number": "#000", @@ -109,13 +110,14 @@ "unicef_signatory_id": null }, { - "id": 275, + "id": 724, "country_name": "chad", "schema_name": "chad", "area_code": "", - "last_modify_date": "21 Jan 2019 19:17:09", + "last_modify_date": "28 Jan 2019 16:49:05", "seen": null, - "created": "21 Jan 2019 19:17:09", + "source_id": null, + "created": "28 Jan 2019 16:49:05", "updated": null, "document_type": null, "number": "#001", @@ -156,13 +158,14 @@ "unicef_signatory_id": null }, { - "id": 276, + "id": 725, "country_name": "lebanon", "schema_name": "lebanon", "area_code": "", - "last_modify_date": "21 Jan 2019 19:17:09", + "last_modify_date": "28 Jan 2019 16:49:05", "seen": null, - "created": "21 Jan 2019 19:17:09", + "source_id": null, + "created": "28 Jan 2019 16:49:05", "updated": null, "document_type": null, "number": "#002", diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json index 9b809445f..f578bcaa5 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_pmp-indicators_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"86df929f9a506018223c50ab96074fa6\"" + "\"e66ef3fdb6e54f1a7d18333dac7238a3\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,7 +39,7 @@ ], "cache-key": [ "cache-key", - "86df929f9a506018223c50ab96074fa6" + "e66ef3fdb6e54f1a7d18333dac7238a3" ], "cache-hit": [ "cache-hit", @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "2322" + "2373" ] }, "data": { @@ -62,11 +62,12 @@ "previous": null, "results": [ { - "id": 361, + "id": 457, "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 21:47:03", + "last_modify_date": "28 Jan 2019 16:49:06", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -93,15 +94,16 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "08 Jan 2019 21:47:03", + "created": "28 Jan 2019 16:49:06", "updated": null }, { - "id": 362, + "id": 458, "country_name": "chad", "area_code": "", - "last_modify_date": "08 Jan 2019 21:47:03", + "last_modify_date": "28 Jan 2019 16:49:06", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -128,15 +130,16 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "08 Jan 2019 21:47:03", + "created": "28 Jan 2019 16:49:06", "updated": null }, { - "id": 363, + "id": 459, "country_name": "lebanon", "area_code": "", - "last_modify_date": "08 Jan 2019 21:47:03", + "last_modify_date": "28 Jan 2019 16:49:06", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -163,7 +166,7 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "08 Jan 2019 21:47:03", + "created": "28 Jan 2019 16:49:06", "updated": null } ] diff --git a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json index d920dd292..ebffbc5de 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_list/get__api_latest_datamart_user-stats_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"2289007146baa7a1a21386bab566e9a7\"" + "\"678fcdc32df1f42502a782286b74757b\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,7 +39,7 @@ ], "cache-key": [ "cache-key", - "2289007146baa7a1a21386bab566e9a7" + "678fcdc32df1f42502a782286b74757b" ], "cache-hit": [ "cache-hit", @@ -51,7 +51,7 @@ ], "content-length": [ "Content-Length", - "600" + "654" ] }, "data": { @@ -62,36 +62,39 @@ "previous": null, "results": [ { - "id": 95, + "id": 128, "month": "Jan 2019", "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:07", "seen": null, + "source_id": null, "total": 0, "unicef": 0, "logins": 0, "unicef_logins": 0 }, { - "id": 96, - "month": "Feb 2019", + "id": 129, + "month": "Jan 2019", "country_name": "chad", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:07", "seen": null, + "source_id": null, "total": 0, "unicef": 0, "logins": 0, "unicef_logins": 0 }, { - "id": 97, + "id": 130, "month": "Jan 2019", "country_name": "lebanon", "area_code": "", - "last_modify_date": "08 Jan 2019 21:51:10", + "last_modify_date": "28 Jan 2019 16:49:07", "seen": null, + "source_id": null, "total": 0, "unicef": 0, "logins": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_518_.response.json similarity index 88% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_518_.response.json index c79a3052b..d640fe3bf 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_353_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_fam-indicators_518_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"2f82099fefad7a87bbfb38dfe0e38912\"" + "\"7738fab56b86584266316465e607145c\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,15 +39,16 @@ ], "content-length": [ "Content-Length", - "581" + "598" ] }, "data": { - "id": 353, + "id": 518, "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 22:06:07", + "last_modify_date": "28 Jan 2019 16:49:08", "seen": null, + "source_id": null, "month": "2019-01-01", "spotcheck_ip_contacted": 0, "spotcheck_report_submitted": 0, diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_726_.response.json similarity index 87% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_726_.response.json index e2ac09c7e..68d17d65f 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_549_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_interventions_726_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"46044bb9d13fc10f75387e4b21a746b8\"" + "\"9eb54f56191280e1ecb776088777822d\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,21 +39,22 @@ ], "content-length": [ "Content-Length", - "1217" + "1232" ] }, "data": { - "id": 549, + "id": 726, "country_name": "bolivia", "schema_name": "bolivia", "area_code": "", - "last_modify_date": "21 Jan 2019 19:52:22", + "last_modify_date": "28 Jan 2019 16:49:09", "seen": null, - "created": "21 Jan 2019 19:52:22", + "source_id": null, + "created": "28 Jan 2019 16:49:09", "updated": null, "document_type": null, - "number": "#272", - "title": "title272", + "number": "#003", + "title": "title003", "status": null, "start_date": null, "end_date": null, @@ -84,7 +85,7 @@ "partner_focal_point_last_name": null, "partner_focal_point_email": null, "partner_focal_point_phone": null, - "intervention_id": 272, + "intervention_id": 3, "agreement_id": null, "country_programme_id": null, "unicef_signatory_id": null diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_460_.response.json similarity index 88% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_460_.response.json index d8a1a7efa..031c88f07 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_364_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_pmp-indicators_460_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"24c358bd872bde9449ef51355bbc35f8\"" + "\"f16c89a867cfefcbf5bad97e65733208\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,15 +39,16 @@ ], "content-length": [ "Content-Length", - "746" + "763" ] }, "data": { - "id": 364, + "id": 460, "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 21:58:34", + "last_modify_date": "28 Jan 2019 16:49:10", "seen": null, + "source_id": null, "vendor_number": null, "partner_name": null, "partner_type": null, @@ -74,7 +75,7 @@ "country_id": null, "partner_id": null, "intervention_id": null, - "created": "08 Jan 2019 21:58:34", + "created": "28 Jan 2019 16:49:10", "updated": null }, "content_type": null diff --git a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_131_.response.json similarity index 84% rename from tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json rename to tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_131_.response.json index c7337c3e4..74fa36dfd 100644 --- a/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_98_.response.json +++ b/tests/api/interfaces/_api_checker/test_data/test_record/get__api_latest_datamart_user-stats_131_.response.json @@ -7,7 +7,7 @@ ], "vary": [ "Vary", - "Accept, Origin" + "Accept, Origin, Cookie" ], "allow": [ "Allow", @@ -15,7 +15,7 @@ ], "etag": [ "ETag", - "\"272213a40f8c70916f6a8a454fb99b1c\"" + "\"05f4b434604f3c43af3a2ef57fc02190\"" ], "x-frame-options": [ "X-Frame-Options", @@ -39,16 +39,17 @@ ], "content-length": [ "Content-Length", - "172" + "190" ] }, "data": { - "id": 98, + "id": 131, "month": "Mar 2019", "country_name": "bolivia", "area_code": "", - "last_modify_date": "08 Jan 2019 22:06:08", + "last_modify_date": "28 Jan 2019 16:49:11", "seen": null, + "source_id": null, "total": 0, "unicef": 0, "logins": 0, diff --git a/tests/etl/test_etl_loaders.py b/tests/etl/test_etl_loaders.py index c7f6f48ac..22b533d9c 100644 --- a/tests/etl/test_etl_loaders.py +++ b/tests/etl/test_etl_loaders.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from django.apps import apps +import pytest from freezegun import freeze_time from etools_datamart.apps.data.loader import loadeables @@ -12,7 +13,10 @@ def pytest_generate_tests(metafunc): ids = [] for model_name in loadeables: model = apps.get_model(model_name) - m.append(model.loader) + if model_name in ['data.pdindicator']: + m.append(pytest.param(model.loader, marks=pytest.mark.xfail)) + else: + m.append(model.loader) ids.append(model.__name__) metafunc.parametrize("loader", m, ids=ids) From 3e096cf2e2133de7a557db62c7c73f39ea25b9be Mon Sep 17 00:00:00 2001 From: sax Date: Mon, 28 Jan 2019 19:46:15 +0100 Subject: [PATCH 112/122] updates loaders --- src/etools_datamart/apps/data/loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/etools_datamart/apps/data/loader.py b/src/etools_datamart/apps/data/loader.py index 63a1786c1..38e4a9dc6 100644 --- a/src/etools_datamart/apps/data/loader.py +++ b/src/etools_datamart/apps/data/loader.py @@ -315,7 +315,7 @@ def post_process_country(self, country, context): self.tree_parents = [] # mark seen records - # self.model.objects.filter(id__in=self.seen).update(seen=context['today']) + self.model.objects.filter(id__in=self.seen).update(seen=context['today']) def process_country(self, country, context): qs = self.filter_queryset(self.get_queryset(context), context) From 5e84cdbab67076ddf0a643998a802af2ca4062a0 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:02:35 +0100 Subject: [PATCH 113/122] add preloading helppers --- src/etools_datamart/apps/tracking/admin.py | 29 ++++++- src/unicef_rest_framework/admin/beat.py | 98 +++++++++++++++++++++- src/unicef_rest_framework/admin/service.py | 39 +++++---- 3 files changed, 144 insertions(+), 22 deletions(-) diff --git a/src/etools_datamart/apps/tracking/admin.py b/src/etools_datamart/apps/tracking/admin.py index c8bb03264..b0f941aa9 100644 --- a/src/etools_datamart/apps/tracking/admin.py +++ b/src/etools_datamart/apps/tracking/admin.py @@ -4,12 +4,17 @@ from urllib.parse import urlencode from django.contrib import admin +from django.http import HttpResponseRedirect from django.template.defaultfilters import pluralize from django.utils.safestring import mark_safe -from admin_extra_urls.extras import link +from admin_extra_urls.extras import action, link +from django_celery_beat.models import CrontabSchedule +from rest_framework.reverse import reverse +from strategy_field.utils import fqn from unicef_rest_framework.admin import APIModelAdmin, TruncateTableMixin +from unicef_rest_framework.tasks import preload from unicef_rest_framework.utils import humanize_size from .models import APIRequestLog, DailyCounter, MonthlyCounter, PathCounter, UserCounter @@ -56,6 +61,28 @@ def aggregate(self, request): processed = APIRequestLog.objects.aggregate() self.message_user(request, "{} {} aggregated".format(processed, pluralize(processed, 'day,days'))) + @action() + def preload(self, request, pk): + obj = APIRequestLog.objects.get(id=pk) + base_url = reverse("admin:unicef_rest_framework_periodictask_preload") + params = json.loads(obj.query_params) + preload_cron, __ = CrontabSchedule.objects.get_or_create(minute=0, hour=1) + if params: + path = "{0.path}?{1}".format(obj, urlencode(params)) + else: + path = obj.path + qs = {'task': fqn(preload), + 'name': f'PRELOAD {path}', + 'crontab': preload_cron.id, + 'service': obj.viewset.get_service().id, + 'args': json.dumps([path]), + 'kwargs': "{}", + 'enabled': True, + '_from': reverse('admin:tracking_apirequestlog_change', args=[obj.pk]) + } + url = f'{base_url}?{urlencode(qs)}' + return HttpResponseRedirect(url) + def is_filtered(self, obj): return obj.query_params != '{}' diff --git a/src/unicef_rest_framework/admin/beat.py b/src/unicef_rest_framework/admin/beat.py index f631c5636..85b7afbf8 100644 --- a/src/unicef_rest_framework/admin/beat.py +++ b/src/unicef_rest_framework/admin/beat.py @@ -1,9 +1,19 @@ +from django import forms +from django.contrib import messages +from django.contrib.admin import helpers +from django.contrib.admin.utils import quote +from django.http import HttpResponseRedirect from django.template.defaultfilters import pluralize +from django.template.response import TemplateResponse +from django.urls import reverse +from django.utils.html import format_html +from django.utils.http import urlquote from django.utils.translation import ugettext_lazy as _ -from admin_extra_urls.extras import action, ExtraUrlMixin +from admin_extra_urls.extras import action, ExtraUrlMixin, link from adminactions.mass_update import mass_update, MassUpdateForm from django_celery_beat import admin +from django_celery_beat.admin import PeriodicTaskForm from kombu.utils.json import loads from unicef_rest_framework.models import PeriodicTask @@ -15,6 +25,18 @@ class Meta: 'priority', 'expires', 'one_off', 'enabled',) +class PeriodicTaskPreloadForm(PeriodicTaskForm): + name = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:500px'})) + args = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:500px'})) + task = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:400px'})) + + class Meta: + model = PeriodicTask + fields = ('name', 'task', 'service', 'enabled', + 'crontab', 'args', 'kwargs') + widgets = {'kwargs': forms.HiddenInput} + + class PeriodicTaskAdmin(ExtraUrlMixin, admin.PeriodicTaskAdmin): list_display = ('name', 'service', 'enabled', 'schedule', 'one_off', 'total_run_count') list_filter = ('enabled', 'last_run_at', 'service') @@ -39,6 +61,7 @@ class PeriodicTaskAdmin(ExtraUrlMixin, admin.PeriodicTaskAdmin): 'fields': ('expires', 'queue', 'exchange', 'routing_key'), 'classes': ('extrapretty', 'wide', 'collapse', 'in'), }), + ) def run_tasks(self, request, queryset): @@ -73,6 +96,79 @@ def run_task(self, request, pk): self.message_user(request, _('task successfully run')) + @link() + def preload(self, request): + opts = self.model._meta + app_label = opts.app_label + _from = request.GET.get('_from', '.') + name = request.GET.get('name', None) + obj = PeriodicTask.objects.filter(name=name).first() + + # fields = ('name', 'regtask', 'service', 'enabled', + # 'crontab', 'args', 'kwargs') + # ModelForm = self.get_form(request, fields=fields) + if request.method == 'POST': + form = PeriodicTaskPreloadForm(request.POST, request.FILES, instance=obj) + if form.is_valid(): + obj = self.save_form(request, form, change=False) + self.save_model(request, obj, form, False) + change_message = self.construct_change_message(request, form, None, True) + self.log_addition(request, obj, change_message) + obj_url = reverse( + 'admin:%s_%s_change' % (opts.app_label, opts.model_name), + args=(quote(obj.pk),), + current_app=self.admin_site.name, + ) + msg_dict = { + 'name': opts.verbose_name, + 'obj': format_html('{}', urlquote(obj_url), obj), + } + msg = _('The {name} "{obj}" was added successfully.') + self.message_user(request, format_html(msg, **msg_dict), messages.SUCCESS) + return HttpResponseRedirect(_from) + if obj: + self.message_user(request, "Editing existing preload task", messages.WARNING) + + adminForm = helpers.AdminForm( + PeriodicTaskPreloadForm(self.get_changeform_initial_data(request), instance=obj), + [(None, {'fields': ['name', + 'task', + 'args', + ('service', 'crontab', 'enabled'), + 'kwargs']})], + # Clear prepopulated fields on a view-only form to avoid a crash. + {}, + [], + model_admin=self) + + context = { + 'add': True, + 'change': False, + 'has_view_permission': False, + 'has_add_permission': True, + 'has_change_permission': True, + 'has_delete_permission': False, + 'has_editable_inline_admin_formsets': False, + 'has_file_field': False, + 'has_absolute_url': True, + 'absolute_url': None, + 'form_url': '', + 'opts': opts, + 'is_popup': False, + 'adminform': adminForm, + # 'content_type_id': get_content_type_for_model(self.model).pk, + 'save_as': False, + 'save_on_top': False, + # 'to_field_var': TO_FIELD_VAR, + # 'is_popup_var': IS_POPUP_VAR, + 'app_label': app_label, + } + return TemplateResponse(request, [ + "admin/%s/%s/change_form.html" % (app_label, opts.model_name), + "admin/%s/change_form.html" % app_label, + "admin/change_form.html" + ], context) + def schedule(self, obj): fmt = '{{no schedule}}' if obj.interval: diff --git a/src/unicef_rest_framework/admin/service.py b/src/unicef_rest_framework/admin/service.py index e89e1c3c1..f69cc9628 100644 --- a/src/unicef_rest_framework/admin/service.py +++ b/src/unicef_rest_framework/admin/service.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -import inspect import logging import os @@ -13,7 +12,7 @@ from admin_extra_urls.extras import action, ExtraUrlMixin, link from adminactions.mass_update import mass_update from constance import config -from strategy_field.utils import fqn, import_by_name +from strategy_field.utils import fqn from unicef_rest_framework import acl from unicef_rest_framework.forms import ServiceForm @@ -140,11 +139,11 @@ def api(self, request, pk): service = Service.objects.get(pk=pk) return HttpResponseRedirect(service.endpoint) - @action() - def crontab_expire(self, request, pk): - base = reverse("admin:django_celery_beat_crontabschedule_add") - url = f"{base}?" - return HttpResponseRedirect(url) + # @action() + # def crontab_expire(self, request, pk): + # base = reverse("admin:django_celery_beat_crontabschedule_add") + # url = f"{base}?" + # return HttpResponseRedirect(url) @action() def invalidate_cache(self, request, pk): @@ -155,16 +154,16 @@ def invalidate_cache(self, request, pk): else: return HttpResponseRedirect(request.META.get('HTTP_REFERER')) - @action(visible=False) - def code(self, request, pk): - cls = request.GET.get('c', None) - if cls: - target = import_by_name(cls) - else: - service = Service.objects.get(pk=pk) - target = service.view - code = inspect.getsource(target) - return HttpResponse(code, content_type='text/plain') - - def changelist_view(self, request, extra_context=None): - return super(ServiceAdmin, self).changelist_view(request, extra_context) + # @action(visible=False) + # def code(self, request, pk): + # cls = request.GET.get('c', None) + # if cls: + # target = import_by_name(cls) + # else: + # service = Service.objects.get(pk=pk) + # target = service.view + # code = inspect.getsource(target) + # return HttpResponse(code, content_type='text/plain') + + # def changelist_view(self, request, extra_context=None): + # return super(ServiceAdmin, self).changelist_view(request, extra_context) From 33e4cbfe8af03cdf75bbc60085ad7940a52e45ed Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:08:38 +0100 Subject: [PATCH 114/122] resetmigrations --- .../apps/data/migrations/0001_initial.py | 56 ++++++++++- .../migrations/0002_auto_20190128_1447.py | 94 ------------------- .../apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../subscriptions/migrations/0001_initial.py | 2 +- ...124_2347.py => 0002_auto_20190128_2305.py} | 4 +- .../apps/tracking/migrations/0001_initial.py | 2 +- ...124_2347.py => 0002_auto_20190128_2305.py} | 6 +- .../dbtemplates/0001_initial.py | 2 +- src/unicef_rest_framework/checks.py | 2 +- .../migrations/0001_initial.py | 2 +- ...124_2347.py => 0002_auto_20190128_2305.py} | 4 +- .../migrations/0001_initial.py | 2 +- 13 files changed, 69 insertions(+), 111 deletions(-) delete mode 100644 src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190124_2347.py => 0002_auto_20190128_2305.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190124_2347.py => 0002_auto_20190128_2305.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190124_2347.py => 0002_auto_20190128_2305.py} (99%) diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index b0c242eea..8c07e03f1 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -25,6 +25,7 @@ class Migration(migrations.Migration): ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), ('month', month_field.models.MonthField(verbose_name='Month Value')), ('spotcheck_ip_contacted', models.IntegerField(default=0, verbose_name='Spot Check-IP Contacted')), ('spotcheck_report_submitted', models.IntegerField(default=0, verbose_name='Spot Check-Report Submitted')), @@ -117,6 +118,7 @@ class Migration(migrations.Migration): ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), ('year', models.IntegerField()), ('microassessments_total', models.IntegerField(default=0, help_text='Total number of completed Microassessments in the business area in the past year')), ('programmaticvisits_total', models.IntegerField(default=0, help_text='Total number of completed Programmatic visits in the business area')), @@ -139,6 +141,7 @@ class Migration(migrations.Migration): ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), ('created', models.DateTimeField(auto_now=True)), ('updated', models.DateTimeField(null=True)), ('document_type', models.CharField(max_length=255, null=True)), @@ -221,6 +224,49 @@ class Migration(migrations.Migration): ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='data.Location')), ], ), + migrations.CreateModel( + name='PDIndicator', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('country_name', models.CharField(db_index=True, max_length=100)), + ('schema_name', models.CharField(db_index=True, max_length=63)), + ('area_code', models.CharField(db_index=True, max_length=10)), + ('last_modify_date', models.DateTimeField(auto_now=True)), + ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), + ('context_code', models.CharField(blank=True, max_length=50, null=True)), + ('assumptions', models.TextField(blank=True, null=True)), + ('total', models.IntegerField(blank=True, null=True)), + ('means_of_verification', models.CharField(blank=True, max_length=255, null=True)), + ('cluster_indicator_id', models.IntegerField(blank=True, null=True)), + ('cluster_indicator_title', models.CharField(blank=True, max_length=1024, null=True)), + ('cluster_name', models.CharField(blank=True, max_length=512, null=True)), + ('response_plan_name', models.CharField(blank=True, max_length=1024, null=True)), + ('is_active', models.BooleanField(blank=True, null=True)), + ('is_high_frequency', models.BooleanField(blank=True, null=True)), + ('denominator_label', models.CharField(blank=True, max_length=256, null=True)), + ('label', models.TextField(blank=True, null=True)), + ('measurement_specifications', models.TextField(blank=True, null=True)), + ('numerator_label', models.CharField(blank=True, max_length=256, null=True)), + ('target_denominator', models.IntegerField(blank=True, null=True)), + ('target_numerator', models.IntegerField(blank=True, null=True)), + ('baseline_denominator', models.IntegerField(blank=True, null=True)), + ('baseline_numerator', models.IntegerField(blank=True, null=True)), + ('lower_result_name', models.CharField(blank=True, max_length=500, null=True)), + ('result_link_intervention', models.IntegerField(blank=True, null=True)), + ('section_name', models.CharField(blank=True, max_length=45, null=True)), + ('title', models.CharField(blank=True, max_length=1024, null=True)), + ('unit', models.CharField(blank=True, max_length=10, null=True)), + ('display_type', models.CharField(blank=True, max_length=10, null=True)), + ('disaggregation_name', models.CharField(max_length=255)), + ('disaggregation_active', models.BooleanField(default=False)), + ('location_name', models.CharField(blank=True, max_length=254, null=True)), + ('source_disaggregation_id', models.IntegerField(blank=True, null=True)), + ('source_location_id', models.IntegerField(blank=True, null=True)), + ('intervention', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Intervention')), + ('location', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Location')), + ], + ), migrations.CreateModel( name='PMPIndicators', fields=[ @@ -230,6 +276,7 @@ class Migration(migrations.Migration): ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), ('vendor_number', models.CharField(db_index=True, max_length=255, null=True)), ('partner_name', models.CharField(db_index=True, max_length=255, null=True)), ('partner_type', models.CharField(db_index=True, max_length=255, null=True)), @@ -273,6 +320,7 @@ class Migration(migrations.Migration): ('area_code', models.CharField(db_index=True, max_length=10)), ('last_modify_date', models.DateTimeField(auto_now=True)), ('seen', models.DateTimeField(blank=True, null=True)), + ('source_id', models.IntegerField(blank=True, null=True)), ('month', month_field.models.MonthField(verbose_name='Month Value')), ('total', models.IntegerField(default=0, verbose_name='Total users')), ('unicef', models.IntegerField(default=0, verbose_name='UNICEF uswers')), @@ -298,7 +346,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='gatewaytype', - unique_together={('schema_name', 'name'), ('schema_name', 'admin_level')}, + unique_together={('schema_name', 'admin_level'), ('schema_name', 'name')}, ), migrations.AddField( model_name='fundsreservation', @@ -309,6 +357,10 @@ class Migration(migrations.Migration): name='famindicator', unique_together={('month', 'country_name')}, ), + migrations.AlterUniqueTogether( + name='pdindicator', + unique_together={('schema_name', 'source_id', 'source_location_id', 'source_disaggregation_id')}, + ), migrations.AlterUniqueTogether( name='location', unique_together={('schema_name', 'source_id')}, diff --git a/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py b/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py deleted file mode 100644 index 356e0ff97..000000000 --- a/src/etools_datamart/apps/data/migrations/0002_auto_20190128_1447.py +++ /dev/null @@ -1,94 +0,0 @@ -# Generated by Django 2.1.5 on 2019-01-28 14:47 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('data', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='PDIndicator', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('country_name', models.CharField(db_index=True, max_length=100)), - ('schema_name', models.CharField(db_index=True, max_length=63)), - ('area_code', models.CharField(db_index=True, max_length=10)), - ('last_modify_date', models.DateTimeField(auto_now=True)), - ('seen', models.DateTimeField(blank=True, null=True)), - ('source_id', models.IntegerField(blank=True, null=True)), - ('context_code', models.CharField(blank=True, max_length=50, null=True)), - ('assumptions', models.TextField(blank=True, null=True)), - ('total', models.IntegerField(blank=True, null=True)), - ('means_of_verification', models.CharField(blank=True, max_length=255, null=True)), - ('cluster_indicator_id', models.IntegerField(blank=True, null=True)), - ('cluster_indicator_title', models.CharField(blank=True, max_length=1024, null=True)), - ('cluster_name', models.CharField(blank=True, max_length=512, null=True)), - ('response_plan_name', models.CharField(blank=True, max_length=1024, null=True)), - ('is_active', models.BooleanField()), - ('is_high_frequency', models.BooleanField()), - ('denominator_label', models.CharField(blank=True, max_length=256, null=True)), - ('label', models.TextField(blank=True, null=True)), - ('measurement_specifications', models.TextField(blank=True, null=True)), - ('numerator_label', models.CharField(blank=True, max_length=256, null=True)), - ('target_denominator', models.IntegerField(blank=True, null=True)), - ('target_numerator', models.IntegerField(blank=True, null=True)), - ('baseline_denominator', models.IntegerField(blank=True, null=True)), - ('baseline_numerator', models.IntegerField(blank=True, null=True)), - ('lower_result_name', models.CharField(blank=True, max_length=500, null=True)), - ('result_link_intervention', models.IntegerField(blank=True, null=True)), - ('section_name', models.CharField(blank=True, max_length=45, null=True)), - ('title', models.CharField(blank=True, max_length=1024, null=True)), - ('unit', models.CharField(blank=True, max_length=10, null=True)), - ('display_type', models.CharField(blank=True, max_length=10, null=True)), - ('disaggregation_name', models.CharField(max_length=255)), - ('disaggregation_active', models.BooleanField(default=False)), - ('location_name', models.CharField(blank=True, max_length=254, null=True)), - ('source_disaggregation_id', models.IntegerField(blank=True, null=True)), - ('source_location_id', models.IntegerField(blank=True, null=True)), - ], - ), - migrations.AddField( - model_name='famindicator', - name='source_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='hact', - name='source_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='intervention', - name='source_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='pmpindicators', - name='source_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='userstats', - name='source_id', - field=models.IntegerField(blank=True, null=True), - ), - migrations.AddField( - model_name='pdindicator', - name='intervention', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Intervention'), - ), - migrations.AddField( - model_name='pdindicator', - name='location', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='data.Location'), - ), - migrations.AlterUniqueTogether( - name='pdindicator', - unique_together={('schema_name', 'source_id', 'source_location_id', 'source_disaggregation_id')}, - ), - ] diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 67a278e90..86f5ac63d 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index a9440fcd0..6ae2e7d9b 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 1fc686217..49fd8bfd4 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py index f0f9e2de8..3a456ac19 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190124_2347.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('subscriptions', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('subscriptions', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 9e19577e9..5d87d856b 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py index 2a961ed9a..1dde7f041 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190124_2347.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('tracking', '0001_initial'), - ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('unicef_rest_framework', '0001_initial'), + ('tracking', '0001_initial'), ] operations = [ diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py index 0af50bffb..76f33fd12 100644 --- a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py +++ b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.contrib.sites.managers import django.db.models.manager diff --git a/src/unicef_rest_framework/checks.py b/src/unicef_rest_framework/checks.py index dc80322fc..a668efcdf 100644 --- a/src/unicef_rest_framework/checks.py +++ b/src/unicef_rest_framework/checks.py @@ -2,7 +2,7 @@ from django.core.checks import INFO, Warning -@checks.register() +@checks.register(deploy=True) def check_services(app_configs, **kwargs): from unicef_rest_framework.models import Service created, deleted, total = Service.objects.load_services() diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 3e664c1ba..982f66999 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py b/src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py similarity index 99% rename from src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py rename to src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py index 11357af3c..0faf03641 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190124_2347.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.db.models.deletion from django.conf import settings @@ -12,8 +12,8 @@ class Migration(migrations.Migration): dependencies = [ ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('contenttypes', '0002_remove_content_type_name'), ('auth', '0009_alter_user_last_name_max_length'), + ('contenttypes', '0002_remove_content_type_name'), ] operations = [ diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 0b9fc7863..439f47778 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-24 23:47 +# Generated by Django 2.1.5 on 2019-01-28 23:05 import django.contrib.auth.models import django.contrib.auth.validators From 0ef2e61c7ad8c710589c4fa12fb9494636db0115 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:16:08 +0100 Subject: [PATCH 115/122] =?UTF-8?q?Bump=20version:=201.11=20=E2=86=92=201.?= =?UTF-8?q?12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 7 ++++++- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 675edc2d5..6a0e25dc7 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.11 +current_version = 1.12 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 30cafb5f2..3d4093410 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,9 @@ -1.11 +1.12 +--------- +* new endpoint DPIndicator +* preload helpers + +1.12 --------- * add impersonation * fixes schema permission check diff --git a/docker/Makefile b/docker/Makefile index d91b597ff..53d956885 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.11 +TARGET?=1.12 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 89d5641a2..5d7d20091 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.11a0' +VERSION = __version__ = '1.12a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From 0084fca65344f5b30077b8d338786bd7bb2ddc39 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:54:42 +0100 Subject: [PATCH 116/122] removes broken check --- src/unicef_rest_framework/apps.py | 1 - src/unicef_rest_framework/checks.py | 11 ----------- 2 files changed, 12 deletions(-) delete mode 100644 src/unicef_rest_framework/checks.py diff --git a/src/unicef_rest_framework/apps.py b/src/unicef_rest_framework/apps.py index b221b5b39..a9f0724ae 100644 --- a/src/unicef_rest_framework/apps.py +++ b/src/unicef_rest_framework/apps.py @@ -9,4 +9,3 @@ class Config(AppConfig): def ready(self): from . import tasks # noqa from . import handlers # noqa - from . import checks # noqa diff --git a/src/unicef_rest_framework/checks.py b/src/unicef_rest_framework/checks.py deleted file mode 100644 index a668efcdf..000000000 --- a/src/unicef_rest_framework/checks.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.core import checks -from django.core.checks import INFO, Warning - - -@checks.register(deploy=True) -def check_services(app_configs, **kwargs): - from unicef_rest_framework.models import Service - created, deleted, total = Service.objects.load_services() - if created: - return [Warning(INFO, f"{created} new services found")] - return [] From ff625c9eb77dfe3b95aa032ee6ef3f93b0242498 Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:55:19 +0100 Subject: [PATCH 117/122] =?UTF-8?q?Bump=20version:=201.12=20=E2=86=92=201.?= =?UTF-8?q?1201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 4 ++-- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 6a0e25dc7..8adb9c3f4 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.12 +current_version = 1.1201 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 3d4093410..03eb08ea0 100644 --- a/CHANGES +++ b/CHANGES @@ -1,9 +1,9 @@ -1.12 +1.1201 --------- * new endpoint DPIndicator * preload helpers -1.12 +1.1201 --------- * add impersonation * fixes schema permission check diff --git a/docker/Makefile b/docker/Makefile index 53d956885..f72e4352d 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.12 +TARGET?=1.1201 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 5d7d20091..7ca79e512 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.12a0' +VERSION = __version__ = '1.1201a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From ed88fa90ee32a69780956cd8de7fc1202904213b Mon Sep 17 00:00:00 2001 From: sax Date: Tue, 29 Jan 2019 00:56:09 +0100 Subject: [PATCH 118/122] =?UTF-8?q?Bump=20version:=201.1201=20=E2=86=92=20?= =?UTF-8?q?1.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 4 ++-- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 8adb9c3f4..87f27c4a7 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.1201 +current_version = 1.13 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 03eb08ea0..16026814c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,9 +1,9 @@ -1.1201 +1.13 --------- * new endpoint DPIndicator * preload helpers -1.1201 +1.13 --------- * add impersonation * fixes schema permission check diff --git a/docker/Makefile b/docker/Makefile index f72e4352d..9e89b7be6 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.1201 +TARGET?=1.13 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 7ca79e512..947d9d101 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.1201a0' +VERSION = __version__ = '1.13a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From df939f3037cdbff634c58a06d8364414e91399db Mon Sep 17 00:00:00 2001 From: sax Date: Thu, 31 Jan 2019 22:40:05 +0100 Subject: [PATCH 119/122] reduce docker size image --- MANIFEST.in | 1 + Pipfile | 2 +- docker/Dockerfile | 150 +++++++++++------- docker/{Dockerfile.alpine => Dockerfile.slim} | 66 +++----- docker/Makefile | 8 +- docker/entrypoint.sh | 1 - 6 files changed, 124 insertions(+), 104 deletions(-) rename docker/{Dockerfile.alpine => Dockerfile.slim} (72%) diff --git a/MANIFEST.in b/MANIFEST.in index 268d68760..75504d310 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -45,3 +45,4 @@ exclude hooks recursive-exclude docker * recursive-exclude deploy * recursive-exclude hooks * +recursive-exclude src *.scss diff --git a/Pipfile b/Pipfile index 6e1a7a3f1..973a85fc9 100644 --- a/Pipfile +++ b/Pipfile @@ -1,4 +1,4 @@ -[[source]] + [[source]] url = "https://pypi.python.org/simple" verify_ssl = true name = "pypi" diff --git a/docker/Dockerfile b/docker/Dockerfile index 46044de96..dbb0611f4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,9 +1,76 @@ -FROM pstauffer/curl:latest as builder -ARG DEVELOP -ARG GITHUB_CREDENTIALS +FROM python:3.6.8-alpine3.8 as base +FROM base + +ARG BUILD_DATE +ARG PIPENV_ARGS ARG VERSION +ARG DEVELOP -RUN mkdir /code +ENV CPLUS_INCLUDE_PATH /usr/include/gdal +ENV C_INCLUDE_PATH /usr/include/gdal + +RUN apk add --no-cache --virtual .fetch-deps \ + curl \ + ca-certificates \ + openssl \ + tar + +RUN apk add --no-cache --virtual .build-deps \ + autoconf \ + automake \ + pkgconf \ + g++ \ + json-c-dev \ + libtool \ + libxml2-dev \ + make \ + perl + +RUN apk add --no-cache --virtual .build-deps-edge \ + --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ + --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ + proj4-dev \ + protobuf-c-dev + +RUN apk add --no-cache --virtual .postgis-rundeps \ + json-c + +RUN apk add --no-cache --virtual .postgis-rundeps-edge \ + --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ + --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ + binutils \ + geos \ + geos-dev \ + gdal-dev \ + gdal \ + proj4 \ + protobuf-c + +RUN apk add --no-cache --virtual .datamart-build-deps \ + freetype-dev \ + fontconfig-dev \ + freetype-dev \ + jpeg-dev \ + lcms2-dev \ + libffi-dev \ + libressl-dev \ + linux-headers \ + musl-dev \ + openjpeg-dev \ + postgresql-dev \ + python3-dev \ + tcl-dev \ + tiff-dev \ + tk-dev \ + zlib-dev + +RUN apk add --no-cache --virtual .datamart-run-deps \ + postgresql-libs + +RUN apk add --no-cache --virtual .system-run-deps \ + bash + +RUN mkdir -p /code ADD . /code RUN set -o pipefail && if [ "${DEVELOP}" = "1" ]; then \ @@ -13,19 +80,15 @@ RUN set -o pipefail && if [ "${DEVELOP}" = "1" ]; then \ && curl ${GITHUB_CREDENTIALS}: -L "https://github.com/unicef/etools-datamart/archive/${VERSION}.tar.gz" | tar -xzf - --strip-components=1; \ fi -FROM python:3.6.7-slim as base -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - gcc \ - gdal-bin \ - python-dev - +RUN pip install pip==18.0 pipenv --upgrade -RUN pip install pip==18.0 pipenv --upgrade \ - && adduser --system datamart +WORKDIR /code -FROM base -COPY --from=builder /code /code +RUN set -ex \ + ls -al /code \ + && pipenv install --verbose --system --deploy --ignore-pipfile $PIPENV_ARGS \ + && pip3 install . \ + && rm -fr /code LABEL org.label.name="eTools Datamart" \ org.label.maintainer="sapostolico@unicef.org" \ @@ -35,12 +98,8 @@ LABEL org.label.name="eTools Datamart" \ org.label.version=$VERSION -ARG BUILD_DATE -ARG PIPENV_ARGS -ARG VERSION - ENV VERSION ${VERSION} -ENV ABSOLUTE_BASE_URL "http://datamart.unicef.io" + ENV PIPENV_PYPI_MIRROR ${PIPENV_PYPI_MIRROR} ENV PIPENV_ARGS ${PIPENV_ARGS} ENV HOME /root/ @@ -48,11 +107,9 @@ ENV PIPSI_HOME=/usr/local/pipsi/environments ENV PIPSI_BIN_DIR=/usr/local/bin ENV PYTHONUNBUFFERED 1 ENV USE_GUNICORN 0 -ENV GUNICORN_CMD_ARGS " -b 0.0.0.0:8000 \ ---name datamart \ +ENV GUNICORN_CMD_ARGS "-b 0.0.0.0:8000 \ --chdir /var/datamart \ --access-logfile - \ ---timeout 120 \ --access-logformat \"%(h)s %(l)s %(u)s %(t)s '%(r)s' %(s)s\" " ENV ALLOWED_HOSTS * @@ -78,49 +135,28 @@ ENV SENTRY_DSN "" ENV SESSION_COOKIE_HTTPONLY True ENV SESSION_COOKIE_SECURE True ENV STATIC_ROOT /tmp/static -#ENV SUPERVISOR_USER admin -#ENV SUPERVISOR_PWD "" -#ENV FLOWER_USER admin -#ENV FLOWER_PWD "" -#ENV X_FRAME_OPTIONS "DENY" -#ENV START_DATAMART "true" -#ENV START_REDIS "true" -#ENV START_CELERY "true" - -#RUN apt-get update && apt-get install -y --force-yes \ -# gcc - -RUN mkdir -p \ - /var/datamart/ \ - && chown datamart /var/datamart/ \ - && pip install pip==18.0 pipenv --upgrade -WORKDIR /code -RUN set -ex \ - ls -al /code \ - && pipenv install --verbose --system --deploy --ignore-pipfile $PIPENV_ARGS +EXPOSE 8000 +RUN apk del .fetch-deps .build-deps .build-deps-edge .datamart-build-deps +RUN rm -rf /var/cache/apk/* \ + rm -fr /root/.cache/ \ + rm -fr /code \ + rm -fr /usr/include/ -RUN pip install . \ - && rm -fr /code \ - && mkdir -p /var/datamart/static \ - && mkdir -p /var/datamart/log \ - && mkdir -p /var/datamart/conf \ - && mkdir -p /var/datamart/run \ - && chown -R datamart /var/datamart/ +RUN find /usr/local/lib/python3.6/ -name *.pyc | xargs rm -f \ + && python -O -m compileall -fqb /usr/local/lib/python3.6/ \ + && find /usr/local/lib/python3.6/ -name *.py | xargs rm -f +ADD docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh -#RUN apk del .build-deps \ -# && rm -rf /var/cache/apk/* \ -# && rm -fr /root/.cache/ +RUN adduser -S datamart \ + && mkdir -p /var/datamart \ + && chown datamart /var/datamart/ WORKDIR /var/datamart - -EXPOSE 8000 - USER datamart -ADD docker/entrypoint.sh /usr/local/bin/docker-entrypoint.sh ENTRYPOINT ["docker-entrypoint.sh"] CMD ["datamart"] diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.slim similarity index 72% rename from docker/Dockerfile.alpine rename to docker/Dockerfile.slim index 454208dc9..46044de96 100644 --- a/docker/Dockerfile.alpine +++ b/docker/Dockerfile.slim @@ -13,43 +13,16 @@ RUN set -o pipefail && if [ "${DEVELOP}" = "1" ]; then \ && curl ${GITHUB_CREDENTIALS}: -L "https://github.com/unicef/etools-datamart/archive/${VERSION}.tar.gz" | tar -xzf - --strip-components=1; \ fi -FROM python:3.6-alpine as base - -RUN apk add --no-cache \ - --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ - --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ - bash \ - freetype \ - geos \ - gdal \ - lcms2 \ - libjpeg-turbo \ - libpng \ - libpq \ - openjpeg \ - postgresql-libs \ - tiff \ - && apk add --no-cache --virtual .build-deps \ - --repository http://dl-cdn.alpinelinux.org/alpine/edge/main \ - --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \ - freetype-dev \ - gcc \ - gdal-dev \ - geos-dev \ - jpeg-dev \ - lcms2-dev \ - libffi-dev \ - linux-headers \ - musl-dev \ - openjpeg-dev \ - postgresql-dev \ - python3-dev \ - tcl-dev \ - tiff-dev \ - tk-dev \ - zlib-dev \ - && pip install pip==18.0 pipenv --upgrade \ - && adduser -S datamart +FROM python:3.6.7-slim as base +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + gcc \ + gdal-bin \ + python-dev + + +RUN pip install pip==18.0 pipenv --upgrade \ + && adduser --system datamart FROM base COPY --from=builder /code /code @@ -67,7 +40,7 @@ ARG PIPENV_ARGS ARG VERSION ENV VERSION ${VERSION} - +ENV ABSOLUTE_BASE_URL "http://datamart.unicef.io" ENV PIPENV_PYPI_MIRROR ${PIPENV_PYPI_MIRROR} ENV PIPENV_ARGS ${PIPENV_ARGS} ENV HOME /root/ @@ -75,9 +48,11 @@ ENV PIPSI_HOME=/usr/local/pipsi/environments ENV PIPSI_BIN_DIR=/usr/local/bin ENV PYTHONUNBUFFERED 1 ENV USE_GUNICORN 0 -ENV GUNICORN_CMD_ARGS "-b 0.0.0.0:8000 \ +ENV GUNICORN_CMD_ARGS " -b 0.0.0.0:8000 \ +--name datamart \ --chdir /var/datamart \ --access-logfile - \ +--timeout 120 \ --access-logformat \"%(h)s %(l)s %(u)s %(t)s '%(r)s' %(s)s\" " ENV ALLOWED_HOSTS * @@ -127,12 +102,17 @@ RUN set -ex \ && pipenv install --verbose --system --deploy --ignore-pipfile $PIPENV_ARGS RUN pip install . \ - && rm -fr /code + && rm -fr /code \ + && mkdir -p /var/datamart/static \ + && mkdir -p /var/datamart/log \ + && mkdir -p /var/datamart/conf \ + && mkdir -p /var/datamart/run \ + && chown -R datamart /var/datamart/ -RUN apk del .build-deps \ - && rm -rf /var/cache/apk/* \ - && rm -fr /root/.cache/ +#RUN apk del .build-deps \ +# && rm -rf /var/cache/apk/* \ +# && rm -fr /root/.cache/ WORKDIR /var/datamart diff --git a/docker/Makefile b/docker/Makefile index 9e89b7be6..96a88f501 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -36,6 +36,7 @@ build: --build-arg DEVELOP=${DEVELOP} \ --build-arg GITHUB_CREDENTIALS=${GITHUB_CREDENTIALS} \ --build-arg VERSION=${TARGET} \ + --build-arg PIPENV_ARGS=${PIPENV_ARGS} \ -t ${DOCKER_IMAGE} \ -f docker/${DOCKERFILE} . docker tag ${DOCKER_IMAGE_NAME}:${TARGET} ${DOCKER_IMAGE_NAME}:dev @@ -68,7 +69,6 @@ build: -e SESSION_COOKIE_SECURE=false \ -e STATIC_ROOT=/var/datamart/static/ \ -e DEVELOPMENT_MODE=0 \ - -e STACK=1 \ -e X_FRAME_OPTIONS="SAMEORIGIN" \ ${RUN_OPTIONS} \ ${DOCKER_IMAGE} \ @@ -118,8 +118,12 @@ scratch: RUN_OPTIONS=-it CMD='/bin/bash' $(MAKE) .run shell: + RUN_OPTIONS="-p 8000:8000 -it" \ + ABSOLUTE_BASE_URL=${ABSOLUTE_BASE_URL} \ + CMD='/bin/bash' \ + $(MAKE) .run # docker exec -it ${CONTAINER_NAME} /bin/bash - RUN_OPTIONS=-it CMD='/bin/bash' $(MAKE) .run +# RUN_OPTIONS=-it CMD='/bin/bash' $(MAKE) .run docker-remove: docker-remove.sh ${IMAGE_NAME} -o ${ORGANIZATION} diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 5e88397dd..7146471c3 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -1,5 +1,4 @@ #!/bin/bash -e -set -e mkdir -p /var/datamart/static mkdir -p /var/datamart/log From 644ab1356ce1afe9052f2ed6c8df63aa23c59014 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 1 Feb 2019 20:17:21 +0100 Subject: [PATCH 120/122] migrations reset --- CHANGES | 6 ++++++ src/etools_datamart/apps/data/migrations/0001_initial.py | 4 ++-- src/etools_datamart/apps/data/models/funds_reservation.py | 3 ++- src/etools_datamart/apps/etl/migrations/0001_initial.py | 2 +- .../apps/security/migrations/0001_initial.py | 2 +- .../apps/subscriptions/migrations/0001_initial.py | 2 +- ...002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} | 4 ++-- .../apps/tracking/migrations/0001_initial.py | 2 +- ...002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} | 4 ++-- .../custom_migrations/dbtemplates/0001_initial.py | 2 +- src/unicef_rest_framework/migrations/0001_initial.py | 2 +- ...002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} | 6 +++--- src/unicef_security/migrations/0001_initial.py | 2 +- 13 files changed, 24 insertions(+), 17 deletions(-) rename src/etools_datamart/apps/subscriptions/migrations/{0002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} (93%) rename src/etools_datamart/apps/tracking/migrations/{0002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} (97%) rename src/unicef_rest_framework/migrations/{0002_auto_20190128_2305.py => 0002_auto_20190201_1913.py} (98%) diff --git a/CHANGES b/CHANGES index 16026814c..81d87c45c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +1.14 +---- +* Fix loading Intervention +* migrations reset + + 1.13 --------- * new endpoint DPIndicator diff --git a/src/etools_datamart/apps/data/migrations/0001_initial.py b/src/etools_datamart/apps/data/migrations/0001_initial.py index 8c07e03f1..eb308ba2d 100644 --- a/src/etools_datamart/apps/data/migrations/0001_initial.py +++ b/src/etools_datamart/apps/data/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.contrib.gis.db.models.fields import django.contrib.postgres.fields.jsonb @@ -351,7 +351,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='fundsreservation', name='intervention', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='funds', to='data.Intervention'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='funds', to='data.Intervention'), ), migrations.AlterUniqueTogether( name='famindicator', diff --git a/src/etools_datamart/apps/data/models/funds_reservation.py b/src/etools_datamart/apps/data/models/funds_reservation.py index a7254748b..12d89aab1 100644 --- a/src/etools_datamart/apps/data/models/funds_reservation.py +++ b/src/etools_datamart/apps/data/models/funds_reservation.py @@ -48,7 +48,8 @@ class FundsReservation(DataMartModel): source_id = models.IntegerField() source_intervention_id = models.IntegerField() - intervention = models.ForeignKey(Intervention, models.DO_NOTHING, + intervention = models.ForeignKey(Intervention, + models.SET_NULL, related_name='funds', blank=True, null=True) class Meta: diff --git a/src/etools_datamart/apps/etl/migrations/0001_initial.py b/src/etools_datamart/apps/etl/migrations/0001_initial.py index 86f5ac63d..f6c97c459 100644 --- a/src/etools_datamart/apps/etl/migrations/0001_initial.py +++ b/src/etools_datamart/apps/etl/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.contrib.postgres.fields.jsonb import django.db.models.deletion diff --git a/src/etools_datamart/apps/security/migrations/0001_initial.py b/src/etools_datamart/apps/security/migrations/0001_initial.py index 6ae2e7d9b..35226e822 100644 --- a/src/etools_datamart/apps/security/migrations/0001_initial.py +++ b/src/etools_datamart/apps/security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.contrib.postgres.fields import django.db.models.deletion diff --git a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py index 49fd8bfd4..b7a282af4 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.db.models.deletion from django.db import migrations, models diff --git a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190201_1913.py similarity index 93% rename from src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py rename to src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190201_1913.py index 3a456ac19..e7d4f0309 100644 --- a/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190128_2305.py +++ b/src/etools_datamart/apps/subscriptions/migrations/0002_auto_20190201_1913.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('subscriptions', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ diff --git a/src/etools_datamart/apps/tracking/migrations/0001_initial.py b/src/etools_datamart/apps/tracking/migrations/0001_initial.py index 5d87d856b..7c9416815 100644 --- a/src/etools_datamart/apps/tracking/migrations/0001_initial.py +++ b/src/etools_datamart/apps/tracking/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.utils.timezone from django.db import migrations, models diff --git a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190201_1913.py similarity index 97% rename from src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py rename to src/etools_datamart/apps/tracking/migrations/0002_auto_20190201_1913.py index 1dde7f041..556a768c2 100644 --- a/src/etools_datamart/apps/tracking/migrations/0002_auto_20190128_2305.py +++ b/src/etools_datamart/apps/tracking/migrations/0002_auto_20190201_1913.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.db.models.deletion from django.conf import settings @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('unicef_rest_framework', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('tracking', '0001_initial'), ] diff --git a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py index 76f33fd12..88c6fe8c5 100644 --- a/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py +++ b/src/etools_datamart/custom_migrations/dbtemplates/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.contrib.sites.managers import django.db.models.manager diff --git a/src/unicef_rest_framework/migrations/0001_initial.py b/src/unicef_rest_framework/migrations/0001_initial.py index 982f66999..e03fc4f5e 100644 --- a/src/unicef_rest_framework/migrations/0001_initial.py +++ b/src/unicef_rest_framework/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import uuid diff --git a/src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py b/src/unicef_rest_framework/migrations/0002_auto_20190201_1913.py similarity index 98% rename from src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py rename to src/unicef_rest_framework/migrations/0002_auto_20190201_1913.py index 0faf03641..66cb72ccc 100644 --- a/src/unicef_rest_framework/migrations/0002_auto_20190128_2305.py +++ b/src/unicef_rest_framework/migrations/0002_auto_20190201_1913.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.db.models.deletion from django.conf import settings @@ -10,9 +10,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('auth', '0009_alter_user_last_name_max_length'), ('unicef_rest_framework', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('auth', '0009_alter_user_last_name_max_length'), ('contenttypes', '0002_remove_content_type_name'), ] @@ -141,7 +141,7 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='systemfilter', - unique_together={('service', 'user'), ('service', 'group')}, + unique_together={('service', 'group'), ('service', 'user')}, ), migrations.AlterUniqueTogether( name='groupaccesscontrol', diff --git a/src/unicef_security/migrations/0001_initial.py b/src/unicef_security/migrations/0001_initial.py index 439f47778..23e24576b 100644 --- a/src/unicef_security/migrations/0001_initial.py +++ b/src/unicef_security/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.5 on 2019-01-28 23:05 +# Generated by Django 2.1.5 on 2019-02-01 19:13 import django.contrib.auth.models import django.contrib.auth.validators From 239b1338f951ecbce8818b1a36430787babe0d22 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 1 Feb 2019 20:18:37 +0100 Subject: [PATCH 121/122] =?UTF-8?q?Bump=20version:=201.13=20=E2=86=92=201.?= =?UTF-8?q?14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- CHANGES | 4 ++-- docker/Makefile | 2 +- src/etools_datamart/__init__.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 87f27c4a7..4b063a3ad 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.13 +current_version = 1.14 commit = True tag = False allow_dirty = True diff --git a/CHANGES b/CHANGES index 81d87c45c..929b7fd01 100644 --- a/CHANGES +++ b/CHANGES @@ -4,12 +4,12 @@ * migrations reset -1.13 +1.14 --------- * new endpoint DPIndicator * preload helpers -1.13 +1.14 --------- * add impersonation * fixes schema permission check diff --git a/docker/Makefile b/docker/Makefile index 96a88f501..ba6a82310 100644 --- a/docker/Makefile +++ b/docker/Makefile @@ -4,7 +4,7 @@ DATABASE_URL_ETOOLS?= DEVELOP?=0 DOCKER_PASS?= DOCKER_USER?= -TARGET?=1.13 +TARGET?=1.14 # below vars are used internally BUILD_OPTIONS?=--squash CMD?=datamart diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 947d9d101..916eea633 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.13a0' +VERSION = __version__ = '1.14a0' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8; From e4f813eeb7e7b355292d35c8ffbb25064df16195 Mon Sep 17 00:00:00 2001 From: sax Date: Fri, 1 Feb 2019 20:20:55 +0100 Subject: [PATCH 122/122] fix version number --- .bumpversion.cfg | 4 +++- src/etools_datamart/__init__.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 4b063a3ad..0fdbd0ceb 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -21,8 +21,10 @@ serialize = {major}.{minor} [bumpversion:file:docker/Makefile] +serialize = + {major}.{minor}{release}{num} [bumpversion:file:src/etools_datamart/__init__.py] serialize = - {major}.{minor}{release}{num} + {major}.{minor} diff --git a/src/etools_datamart/__init__.py b/src/etools_datamart/__init__.py index 916eea633..909cb376b 100644 --- a/src/etools_datamart/__init__.py +++ b/src/etools_datamart/__init__.py @@ -1,7 +1,7 @@ import warnings NAME = 'etools-datamart' -VERSION = __version__ = '1.14a0' +VERSION = __version__ = '1.14' __author__ = '' # UserWarning: The psycopg2 wheel package will be renamed from release 2.8;