unicef / etools-partner-reporting-portal Goto Github PK
View Code? Open in Web Editor NEWLicense: Other
License: Other
Like in https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016134
This is a re-usable component and hence should be designed / implemented carefully. "Output" here is really the "Reportable" from the data model, hence this is a view of showing an instance of an IndicatorReport for a Reportable in the context of a PD report (in the future cluster reporting there is no PD reports, hence this should be thought of as reusable component).
When user clicks the arrow in right of the indicator it should uncollapse and show the "location tabs" and within each the disaggregation data of the indicator.
These components will be re-used in PRP when viewing a report and also in PMP implementations later on.
If one location is done another is pending, then at indicator level its shown as pending as well (red "!").
With empty templates to have navigation in place.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231054935
Shows basic partner information for the partner that is logged in.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016144
Clicking expand shows performance for this indicator for all locations and per location as well, along with totals and target.
There might be some clarifications needed on numbers
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016144
Clicking should show a list of all indicators (any order is fine for this story), no filtering needed, showing their 'percent complete'. No open functionality needed for this story
report_status - is an calculated parameter that should be (after talk with Sumit) implemented as a model filed instead of property. Will be updated probably by cron - need to specify this with Sumit.
btw.. we can also make a trigger/signal when IndicatorReport change and then calculate related PD
Refreshing or sharing that url so that filters are pre-filled when user goes to it.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338575 (scroll down)
See green section. If indicator is marked as "cluster indicator" then show entire context as "green" color. Specifically show the cluster assigned colors as green.
Data is split by cluster and unicef, so 2X amount of data will come through, one version for each set of disaggregations.
Don't worry about entering data for this story.
Since I tried many times to make an filter on std query set Django ORM -I can't see model relation to make happen it (as a ProgrammeDocument.objects.filter(...
)
cluster, activity, core, accounts, reporting, and analytics
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016138
Similar to #35. 2X the amount of data is entered.
The backend API call should be structured in a way ideally that it supports in the future adding another funding entity (say other than unicef)?
Currently we are designing for 3 disaggregations (4 including locations).
Entering data when 3 disaggregations mockup: https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016139
We've mapped out in colors the data here (per level in JSON below): https://www.evernote.com/l/AAUnyhUkhr5GY4_LNUMwp9BJJGwSJQcYbLA
Showing four cases (0, 1, 2, 3 disaggregations): https://docs.google.com/spreadsheets/d/14lbalO2NlNdxDk03ShXy19TAZjXBESYZglHmENW3nDI/edit#gid=0
Open issues:
[
{
"id": 559,
"title": "indicator_report_0",
"indicator_location_data": [
{
"id": 1010,
"location": {
"id": 258,
"title": "location_3",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"()": {
"c": null,
"d": null,
"v": 178
}
},
"num_disaggregation": 3,
"level_reported": 0,
"disaggregation_reported_on": []
},
{
"id": 1009,
"location": {
"id": 257,
"title": "location_2",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1759,)": {
"c": null,
"d": null,
"v": 158
},
"(1758,)": {
"c": null,
"d": null,
"v": 103
},
"()": {
"c": null,
"d": null,
"v": 110
},
"(1757,)": {
"c": null,
"d": null,
"v": 152
}
},
"num_disaggregation": 3,
"level_reported": 1,
"disaggregation_reported_on": [
505
]
},
{
"id": 1008,
"location": {
"id": 257,
"title": "location_2",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1752,)": {
"c": null,
"d": null,
"v": 160
},
"(1754,)": {
"c": null,
"d": null,
"v": 108
},
"(1756,)": {
"c": null,
"d": null,
"v": 64
},
"(1753,)": {
"c": null,
"d": null,
"v": 163
},
"(1751,)": {
"c": null,
"d": null,
"v": 114
},
"()": {
"c": null,
"d": null,
"v": 186
},
"(1755,)": {
"c": null,
"d": null,
"v": 89
}
},
"num_disaggregation": 3,
"level_reported": 1,
"disaggregation_reported_on": [
504
]
},
{
"id": 1007,
"location": {
"id": 257,
"title": "location_2",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1750,)": {
"c": null,
"d": null,
"v": 195
},
"(1748,)": {
"c": null,
"d": null,
"v": 69
},
"()": {
"c": null,
"d": null,
"v": 89
},
"(1747,)": {
"c": null,
"d": null,
"v": 184
},
"(1749,)": {
"c": null,
"d": null,
"v": 172
}
},
"num_disaggregation": 3,
"level_reported": 1,
"disaggregation_reported_on": [
503
]
},
{
"id": 1006,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1752,)": {
"c": null,
"d": null,
"v": 153
},
"(1754, 1756)": {
"c": null,
"d": null,
"v": 79
},
"(1753,)": {
"c": null,
"d": null,
"v": 112
},
"(1754, 1758)": {
"c": null,
"d": null,
"v": 186
},
"(1753, 1758)": {
"c": null,
"d": null,
"v": 121
},
"(1756, 1758)": {
"c": null,
"d": null,
"v": 181
},
"(1751, 1754)": {
"c": null,
"d": null,
"v": 99
},
"(1759,)": {
"c": null,
"d": null,
"v": 151
},
"(1751, 1756)": {
"c": null,
"d": null,
"v": 148
},
"(1753, 1756)": {
"c": null,
"d": null,
"v": 72
},
"(1755, 1757)": {
"c": null,
"d": null,
"v": 166
},
"(1756,)": {
"c": null,
"d": null,
"v": 156
},
"(1757, 1758)": {
"c": null,
"d": null,
"v": 54
},
"(1755, 1759)": {
"c": null,
"d": null,
"v": 151
},
"(1757,)": {
"c": null,
"d": null,
"v": 98
},
"(1751,)": {
"c": null,
"d": null,
"v": 158
},
"(1751, 1759)": {
"c": null,
"d": null,
"v": 111
},
"(1756, 1757)": {
"c": null,
"d": null,
"v": 93
},
"(1752, 1758)": {
"c": null,
"d": null,
"v": 124
},
"(1752, 1754)": {
"c": null,
"d": null,
"v": 180
},
"(1752, 1756)": {
"c": null,
"d": null,
"v": 102
},
"(1754, 1757)": {
"c": null,
"d": null,
"v": 154
},
"(1755, 1756)": {
"c": null,
"d": null,
"v": 102
},
"(1752, 1753)": {
"c": null,
"d": null,
"v": 121
},
"(1752, 1755)": {
"c": null,
"d": null,
"v": 97
},
"(1754, 1759)": {
"c": null,
"d": null,
"v": 68
},
"(1751, 1757)": {
"c": null,
"d": null,
"v": 56
},
"(1751, 1755)": {
"c": null,
"d": null,
"v": 162
},
"(1757, 1759)": {
"c": null,
"d": null,
"v": 147
},
"(1753, 1759)": {
"c": null,
"d": null,
"v": 52
},
"(1753, 1755)": {
"c": null,
"d": null,
"v": 109
},
"(1756, 1759)": {
"c": null,
"d": null,
"v": 150
},
"(1753, 1757)": {
"c": null,
"d": null,
"v": 151
},
"(1751, 1752)": {
"c": null,
"d": null,
"v": 113
},
"(1753, 1754)": {
"c": null,
"d": null,
"v": 99
},
"(1754,)": {
"c": null,
"d": null,
"v": 118
},
"(1758,)": {
"c": null,
"d": null,
"v": 149
},
"(1751, 1753)": {
"c": null,
"d": null,
"v": 173
},
"(1755, 1758)": {
"c": null,
"d": null,
"v": 86
},
"(1752, 1759)": {
"c": null,
"d": null,
"v": 120
},
"(1751, 1758)": {
"c": null,
"d": null,
"v": 141
},
"()": {
"c": null,
"d": null,
"v": 165
},
"(1755,)": {
"c": null,
"d": null,
"v": 122
},
"(1758, 1759)": {
"c": null,
"d": null,
"v": 80
},
"(1754, 1755)": {
"c": null,
"d": null,
"v": 78
},
"(1752, 1757)": {
"c": null,
"d": null,
"v": 64
}
},
"num_disaggregation": 3,
"level_reported": 2,
"disaggregation_reported_on": [
504,
505
]
},
{
"id": 1005,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1747, 1757)": {
"c": null,
"d": null,
"v": 134
},
"(1750, 1758)": {
"c": null,
"d": null,
"v": 55
},
"(1748, 1749)": {
"c": null,
"d": null,
"v": 127
},
"(1749, 1757)": {
"c": null,
"d": null,
"v": 115
},
"(1747, 1749)": {
"c": null,
"d": null,
"v": 109
},
"(1747, 1759)": {
"c": null,
"d": null,
"v": 73
},
"(1748, 1759)": {
"c": null,
"d": null,
"v": 124
},
"(1759,)": {
"c": null,
"d": null,
"v": 158
},
"(1757, 1758)": {
"c": null,
"d": null,
"v": 144
},
"(1750,)": {
"c": null,
"d": null,
"v": 151
},
"(1747,)": {
"c": null,
"d": null,
"v": 81
},
"(1749,)": {
"c": null,
"d": null,
"v": 142
},
"(1757,)": {
"c": null,
"d": null,
"v": 148
},
"(1749, 1758)": {
"c": null,
"d": null,
"v": 144
},
"(1750, 1759)": {
"c": null,
"d": null,
"v": 151
},
"(1748, 1758)": {
"c": null,
"d": null,
"v": 136
},
"(1747, 1758)": {
"c": null,
"d": null,
"v": 142
},
"(1748,)": {
"c": null,
"d": null,
"v": 98
},
"()": {
"c": null,
"d": null,
"v": 178
},
"(1747, 1748)": {
"c": null,
"d": null,
"v": 131
},
"(1749, 1750)": {
"c": null,
"d": null,
"v": 161
},
"(1748, 1757)": {
"c": null,
"d": null,
"v": 193
},
"(1749, 1759)": {
"c": null,
"d": null,
"v": 77
},
"(1758,)": {
"c": null,
"d": null,
"v": 55
},
"(1750, 1757)": {
"c": null,
"d": null,
"v": 112
},
"(1748, 1750)": {
"c": null,
"d": null,
"v": 164
},
"(1757, 1759)": {
"c": null,
"d": null,
"v": 146
},
"(1747, 1750)": {
"c": null,
"d": null,
"v": 123
},
"(1758, 1759)": {
"c": null,
"d": null,
"v": 70
}
},
"num_disaggregation": 3,
"level_reported": 2,
"disaggregation_reported_on": [
503,
505
]
},
{
"id": 1004,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1748, 1749)": {
"c": null,
"d": null,
"v": 165
},
"(1752,)": {
"c": null,
"d": null,
"v": 175
},
"(1754, 1756)": {
"c": null,
"d": null,
"v": 89
},
"(1753,)": {
"c": null,
"d": null,
"v": 144
},
"(1747, 1749)": {
"c": null,
"d": null,
"v": 198
},
"(1749, 1755)": {
"c": null,
"d": null,
"v": 176
},
"(1749, 1751)": {
"c": null,
"d": null,
"v": 153
},
"(1755, 1756)": {
"c": null,
"d": null,
"v": 172
},
"(1751, 1754)": {
"c": null,
"d": null,
"v": 92
},
"(1751, 1756)": {
"c": null,
"d": null,
"v": 118
},
"(1753, 1756)": {
"c": null,
"d": null,
"v": 152
},
"(1750,)": {
"c": null,
"d": null,
"v": 139
},
"(1750, 1755)": {
"c": null,
"d": null,
"v": 179
},
"(1748, 1755)": {
"c": null,
"d": null,
"v": 157
},
"(1747,)": {
"c": null,
"d": null,
"v": 93
},
"(1756,)": {
"c": null,
"d": null,
"v": 198
},
"(1748, 1753)": {
"c": null,
"d": null,
"v": 120
},
"(1749,)": {
"c": null,
"d": null,
"v": 99
},
"(1751,)": {
"c": null,
"d": null,
"v": 56
},
"(1747, 1751)": {
"c": null,
"d": null,
"v": 158
},
"(1748, 1751)": {
"c": null,
"d": null,
"v": 65
},
"(1747, 1755)": {
"c": null,
"d": null,
"v": 171
},
"(1752, 1754)": {
"c": null,
"d": null,
"v": 176
},
"(1747, 1753)": {
"c": null,
"d": null,
"v": 58
},
"(1749, 1753)": {
"c": null,
"d": null,
"v": 154
},
"(1750, 1753)": {
"c": null,
"d": null,
"v": 141
},
"(1752, 1753)": {
"c": null,
"d": null,
"v": 97
},
"(1749, 1754)": {
"c": null,
"d": null,
"v": 193
},
"(1752, 1755)": {
"c": null,
"d": null,
"v": 167
},
"(1749, 1756)": {
"c": null,
"d": null,
"v": 168
},
"(1747, 1756)": {
"c": null,
"d": null,
"v": 150
},
"(1749, 1752)": {
"c": null,
"d": null,
"v": 145
},
"(1750, 1752)": {
"c": null,
"d": null,
"v": 61
},
"(1748,)": {
"c": null,
"d": null,
"v": 53
},
"()": {
"c": null,
"d": null,
"v": 190
},
"(1747, 1748)": {
"c": null,
"d": null,
"v": 115
},
"(1751, 1755)": {
"c": null,
"d": null,
"v": 153
},
"(1749, 1750)": {
"c": null,
"d": null,
"v": 52
},
"(1753, 1755)": {
"c": null,
"d": null,
"v": 93
},
"(1750, 1754)": {
"c": null,
"d": null,
"v": 157
},
"(1751, 1752)": {
"c": null,
"d": null,
"v": 158
},
"(1750, 1756)": {
"c": null,
"d": null,
"v": 99
},
"(1753, 1754)": {
"c": null,
"d": null,
"v": 86
},
"(1754,)": {
"c": null,
"d": null,
"v": 103
},
"(1748, 1756)": {
"c": null,
"d": null,
"v": 95
},
"(1748, 1752)": {
"c": null,
"d": null,
"v": 165
},
"(1751, 1753)": {
"c": null,
"d": null,
"v": 168
},
"(1748, 1754)": {
"c": null,
"d": null,
"v": 169
},
"(1752, 1756)": {
"c": null,
"d": null,
"v": 135
},
"(1748, 1750)": {
"c": null,
"d": null,
"v": 131
},
"(1747, 1752)": {
"c": null,
"d": null,
"v": 156
},
"(1755,)": {
"c": null,
"d": null,
"v": 71
},
"(1747, 1750)": {
"c": null,
"d": null,
"v": 115
},
"(1747, 1754)": {
"c": null,
"d": null,
"v": 159
},
"(1754, 1755)": {
"c": null,
"d": null,
"v": 182
},
"(1750, 1751)": {
"c": null,
"d": null,
"v": 189
}
},
"num_disaggregation": 3,
"level_reported": 2,
"disaggregation_reported_on": [
503,
504
]
},
{
"id": 1003,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1747, 1753, 1755)": {
"c": null,
"d": null,
"v": 165
},
"(1748, 1759)": {
"c": null,
"d": null,
"v": 96
},
"(1753, 1754, 1755)": {
"c": null,
"d": null,
"v": 149
},
"(1747, 1754, 1758)": {
"c": null,
"d": null,
"v": 154
},
"(1751, 1754)": {
"c": null,
"d": null,
"v": 134
},
"(1748, 1755, 1756)": {
"c": null,
"d": null,
"v": 191
},
"(1750, 1756)": {
"c": null,
"d": null,
"v": 92
},
"(1749, 1757, 1759)": {
"c": null,
"d": null,
"v": 168
},
"(1749, 1753, 1756)": {
"c": null,
"d": null,
"v": 86
},
"(1752, 1756, 1758)": {
"c": null,
"d": null,
"v": 200
},
"(1749, 1758, 1759)": {
"c": null,
"d": null,
"v": 91
},
"(1749, 1752, 1758)": {
"c": null,
"d": null,
"v": 119
},
"(1747, 1756, 1759)": {
"c": null,
"d": null,
"v": 92
},
"(1749, 1750, 1754)": {
"c": null,
"d": null,
"v": 166
},
"(1751, 1752, 1756)": {
"c": null,
"d": null,
"v": 51
},
"(1751, 1756, 1759)": {
"c": null,
"d": null,
"v": 115
},
"(1748, 1752, 1753)": {
"c": null,
"d": null,
"v": 195
},
"(1749, 1751, 1756)": {
"c": null,
"d": null,
"v": 156
},
"(1753, 1755)": {
"c": null,
"d": null,
"v": 56
},
"(1756, 1759)": {
"c": null,
"d": null,
"v": 153
},
"(1754, 1755, 1758)": {
"c": null,
"d": null,
"v": 101
},
"(1751, 1754, 1759)": {
"c": null,
"d": null,
"v": 135
},
"(1750, 1752, 1755)": {
"c": null,
"d": null,
"v": 118
},
"(1749, 1759)": {
"c": null,
"d": null,
"v": 66
},
"(1748, 1750)": {
"c": null,
"d": null,
"v": 73
},
"(1748, 1756, 1757)": {
"c": null,
"d": null,
"v": 166
},
"(1749, 1757)": {
"c": null,
"d": null,
"v": 122
},
"(1747, 1750, 1756)": {
"c": null,
"d": null,
"v": 140
},
"(1747, 1749, 1750)": {
"c": null,
"d": null,
"v": 190
},
"(1748, 1754, 1755)": {
"c": null,
"d": null,
"v": 122
},
"(1747, 1752, 1757)": {
"c": null,
"d": null,
"v": 87
},
"(1748, 1753, 1758)": {
"c": null,
"d": null,
"v": 77
},
"(1748, 1757)": {
"c": null,
"d": null,
"v": 194
},
"(1748, 1752, 1758)": {
"c": null,
"d": null,
"v": 55
},
"(1747, 1750, 1758)": {
"c": null,
"d": null,
"v": 105
},
"(1750, 1753, 1756)": {
"c": null,
"d": null,
"v": 194
},
"(1750, 1759)": {
"c": null,
"d": null,
"v": 189
},
"(1755, 1756, 1758)": {
"c": null,
"d": null,
"v": 96
},
"(1750, 1751, 1755)": {
"c": null,
"d": null,
"v": 74
},
"(1748, 1750, 1754)": {
"c": null,
"d": null,
"v": 166
},
"(1752, 1753, 1759)": {
"c": null,
"d": null,
"v": 65
},
"(1747, 1758)": {
"c": null,
"d": null,
"v": 56
},
"(1755, 1757, 1759)": {
"c": null,
"d": null,
"v": 94
},
"(1753, 1755, 1756)": {
"c": null,
"d": null,
"v": 185
},
"(1747, 1748, 1750)": {
"c": null,
"d": null,
"v": 138
},
"(1747, 1757, 1758)": {
"c": null,
"d": null,
"v": 133
},
"(1747, 1749, 1752)": {
"c": null,
"d": null,
"v": 195
},
"(1748, 1751, 1753)": {
"c": null,
"d": null,
"v": 74
},
"(1752, 1757)": {
"c": null,
"d": null,
"v": 105
},
"(1752, 1755, 1759)": {
"c": null,
"d": null,
"v": 159
},
"(1749, 1754, 1755)": {
"c": null,
"d": null,
"v": 72
},
"(1750, 1751, 1752)": {
"c": null,
"d": null,
"v": 104
},
"(1751, 1757, 1758)": {
"c": null,
"d": null,
"v": 64
},
"(1752, 1753, 1756)": {
"c": null,
"d": null,
"v": 122
},
"(1748, 1749, 1753)": {
"c": null,
"d": null,
"v": 61
},
"(1747, 1753, 1758)": {
"c": null,
"d": null,
"v": 109
},
"(1747, 1754, 1755)": {
"c": null,
"d": null,
"v": 81
},
"(1747, 1751, 1756)": {
"c": null,
"d": null,
"v": 107
},
"(1747, 1748, 1759)": {
"c": null,
"d": null,
"v": 156
},
"(1747, 1751)": {
"c": null,
"d": null,
"v": 158
},
"(1750, 1752)": {
"c": null,
"d": null,
"v": 184
},
"(1748, 1753, 1755)": {
"c": null,
"d": null,
"v": 119
},
"(1750, 1755, 1756)": {
"c": null,
"d": null,
"v": 117
},
"(1747, 1750, 1752)": {
"c": null,
"d": null,
"v": 58
},
"(1751, 1754, 1755)": {
"c": null,
"d": null,
"v": 74
},
"(1748, 1752, 1757)": {
"c": null,
"d": null,
"v": 190
},
"(1749, 1753, 1758)": {
"c": null,
"d": null,
"v": 92
},
"(1754, 1758)": {
"c": null,
"d": null,
"v": 103
},
"(1750, 1752, 1759)": {
"c": null,
"d": null,
"v": 125
},
"(1749, 1752, 1755)": {
"c": null,
"d": null,
"v": 160
},
"(1754, 1755, 1757)": {
"c": null,
"d": null,
"v": 180
},
"(1750, 1751)": {
"c": null,
"d": null,
"v": 85
},
"(1751, 1755, 1758)": {
"c": null,
"d": null,
"v": 60
},
"(1747, 1752, 1753)": {
"c": null,
"d": null,
"v": 116
},
"(1749, 1753)": {
"c": null,
"d": null,
"v": 118
},
"(1750, 1756, 1758)": {
"c": null,
"d": null,
"v": 71
},
"(1749, 1750, 1753)": {
"c": null,
"d": null,
"v": 59
},
"(1753, 1758)": {
"c": null,
"d": null,
"v": 102
},
"(1751, 1752, 1753)": {
"c": null,
"d": null,
"v": 176
},
"(1749, 1751, 1753)": {
"c": null,
"d": null,
"v": 57
},
"(1748, 1753)": {
"c": null,
"d": null,
"v": 151
},
"(1749, 1750, 1758)": {
"c": null,
"d": null,
"v": 111
},
"(1753, 1756, 1758)": {
"c": null,
"d": null,
"v": 167
},
"(1747, 1752, 1758)": {
"c": null,
"d": null,
"v": 58
},
"(1748, 1754, 1758)": {
"c": null,
"d": null,
"v": 146
},
"(1748, 1756, 1758)": {
"c": null,
"d": null,
"v": 126
},
"(1748,)": {
"c": null,
"d": null,
"v": 140
},
"(1750, 1758, 1759)": {
"c": null,
"d": null,
"v": 50
},
"(1748, 1751, 1757)": {
"c": null,
"d": null,
"v": 106
},
"(1749, 1755, 1758)": {
"c": null,
"d": null,
"v": 121
},
"(1755, 1756)": {
"c": null,
"d": null,
"v": 127
},
"(1751, 1756, 1757)": {
"c": null,
"d": null,
"v": 70
},
"(1750, 1754, 1757)": {
"c": null,
"d": null,
"v": 166
},
"(1750, 1757, 1759)": {
"c": null,
"d": null,
"v": 105
},
"(1751, 1753, 1756)": {
"c": null,
"d": null,
"v": 119
},
"(1747, 1749, 1758)": {
"c": null,
"d": null,
"v": 168
},
"(1748, 1750, 1751)": {
"c": null,
"d": null,
"v": 146
},
"(1750, 1751, 1756)": {
"c": null,
"d": null,
"v": 193
},
"(1747, 1748, 1755)": {
"c": null,
"d": null,
"v": 151
},
"(1748, 1749, 1757)": {
"c": null,
"d": null,
"v": 168
},
"(1747, 1748, 1749)": {
"c": null,
"d": null,
"v": 72
},
"(1747, 1751, 1752)": {
"c": null,
"d": null,
"v": 191
},
"(1748, 1750, 1758)": {
"c": null,
"d": null,
"v": 132
},
"(1747, 1755)": {
"c": null,
"d": null,
"v": 89
},
"(1747, 1749, 1757)": {
"c": null,
"d": null,
"v": 88
},
"(1752, 1753)": {
"c": null,
"d": null,
"v": 149
},
"(1748, 1758)": {
"c": null,
"d": null,
"v": 54
},
"(1747, 1753, 1756)": {
"c": null,
"d": null,
"v": 159
},
"(1751, 1757)": {
"c": null,
"d": null,
"v": 55
},
"(1753, 1754, 1756)": {
"c": null,
"d": null,
"v": 78
},
"(1755, 1757, 1758)": {
"c": null,
"d": null,
"v": 150
},
"(1747, 1758, 1759)": {
"c": null,
"d": null,
"v": 155
},
"(1748, 1757, 1759)": {
"c": null,
"d": null,
"v": 122
},
"(1749, 1753, 1757)": {
"c": null,
"d": null,
"v": 161
},
"(1747, 1756, 1758)": {
"c": null,
"d": null,
"v": 189
},
"(1747, 1751, 1757)": {
"c": null,
"d": null,
"v": 137
},
"(1749, 1756, 1759)": {
"c": null,
"d": null,
"v": 68
},
"(1751, 1752, 1757)": {
"c": null,
"d": null,
"v": 143
},
"(1754, 1755, 1759)": {
"c": null,
"d": null,
"v": 117
},
"(1751, 1754, 1756)": {
"c": null,
"d": null,
"v": 81
},
"(1749, 1751, 1757)": {
"c": null,
"d": null,
"v": 86
},
"(1750,)": {
"c": null,
"d": null,
"v": 50
},
"(1750, 1752, 1754)": {
"c": null,
"d": null,
"v": 145
},
"(1752, 1758)": {
"c": null,
"d": null,
"v": 128
},
"(1749, 1754)": {
"c": null,
"d": null,
"v": 90
},
"(1747, 1752, 1756)": {
"c": null,
"d": null,
"v": 178
},
"(1757, 1759)": {
"c": null,
"d": null,
"v": 141
},
"(1747, 1750, 1755)": {
"c": null,
"d": null,
"v": 122
},
"(1748, 1754, 1756)": {
"c": null,
"d": null,
"v": 73
},
"(1748, 1752, 1759)": {
"c": null,
"d": null,
"v": 66
},
"(1753, 1754)": {
"c": null,
"d": null,
"v": 141
},
"(1754,)": {
"c": null,
"d": null,
"v": 66
},
"(1748, 1756)": {
"c": null,
"d": null,
"v": 147
},
"(1749, 1750, 1757)": {
"c": null,
"d": null,
"v": 151
},
"(1754, 1755)": {
"c": null,
"d": null,
"v": 128
},
"(1750, 1753, 1757)": {
"c": null,
"d": null,
"v": 162
},
"(1755, 1756, 1759)": {
"c": null,
"d": null,
"v": 107
},
"(1754, 1756, 1759)": {
"c": null,
"d": null,
"v": 131
},
"(1748, 1750, 1755)": {
"c": null,
"d": null,
"v": 62
},
"(1752, 1754, 1757)": {
"c": null,
"d": null,
"v": 107
},
"(1747, 1759)": {
"c": null,
"d": null,
"v": 68
},
"(1747, 1750, 1759)": {
"c": null,
"d": null,
"v": 108
},
"(1747, 1748, 1751)": {
"c": null,
"d": null,
"v": 200
},
"(1747, 1757, 1759)": {
"c": null,
"d": null,
"v": 139
},
"(1748, 1751, 1752)": {
"c": null,
"d": null,
"v": 192
},
"(1756, 1757, 1758)": {
"c": null,
"d": null,
"v": 181
},
"(1751, 1753, 1755)": {
"c": null,
"d": null,
"v": 153
},
"(1754, 1757, 1759)": {
"c": null,
"d": null,
"v": 191
},
"(1750, 1751, 1753)": {
"c": null,
"d": null,
"v": 169
},
"(1748, 1751, 1758)": {
"c": null,
"d": null,
"v": 175
},
"(1752, 1753, 1757)": {
"c": null,
"d": null,
"v": 113
},
"(1747, 1753, 1759)": {
"c": null,
"d": null,
"v": 164
},
"(1748, 1749, 1750)": {
"c": null,
"d": null,
"v": 53
},
"(1747, 1749, 1754)": {
"c": null,
"d": null,
"v": 185
},
"(1751, 1758)": {
"c": null,
"d": null,
"v": 129
},
"(1747, 1752)": {
"c": null,
"d": null,
"v": 102
},
"(1753, 1755, 1758)": {
"c": null,
"d": null,
"v": 103
},
"(1749, 1755, 1756)": {
"c": null,
"d": null,
"v": 108
},
"(1750, 1755, 1757)": {
"c": null,
"d": null,
"v": 135
},
"(1748, 1752, 1754)": {
"c": null,
"d": null,
"v": 160
},
"(1749, 1753, 1759)": {
"c": null,
"d": null,
"v": 148
},
"(1752,)": {
"c": null,
"d": null,
"v": 98
},
"(1748, 1753, 1754)": {
"c": null,
"d": null,
"v": 90
},
"(1750, 1752, 1758)": {
"c": null,
"d": null,
"v": 190
},
"(1752, 1757, 1758)": {
"c": null,
"d": null,
"v": 143
},
"(1748, 1758, 1759)": {
"c": null,
"d": null,
"v": 93
},
"(1754, 1757, 1758)": {
"c": null,
"d": null,
"v": 189
},
"(1750, 1754)": {
"c": null,
"d": null,
"v": 90
},
"(1749, 1752, 1754)": {
"c": null,
"d": null,
"v": 108
},
"(1756,)": {
"c": null,
"d": null,
"v": 78
},
"(1750, 1751, 1758)": {
"c": null,
"d": null,
"v": 106
},
"(1751, 1755, 1757)": {
"c": null,
"d": null,
"v": 80
},
"(1752, 1754)": {
"c": null,
"d": null,
"v": 86
},
"(1747, 1750, 1751)": {
"c": null,
"d": null,
"v": 135
},
"(1749, 1750, 1752)": {
"c": null,
"d": null,
"v": 128
},
"(1750, 1753, 1754)": {
"c": null,
"d": null,
"v": 59
},
"(1747, 1756, 1757)": {
"c": null,
"d": null,
"v": 99
},
"(1754, 1759)": {
"c": null,
"d": null,
"v": 62
},
"(1751, 1752, 1754)": {
"c": null,
"d": null,
"v": 131
},
"(1750, 1756, 1759)": {
"c": null,
"d": null,
"v": 72
},
"(1753, 1757)": {
"c": null,
"d": null,
"v": 154
},
"(1753, 1757, 1759)": {
"c": null,
"d": null,
"v": 179
},
"(1755, 1758, 1759)": {
"c": null,
"d": null,
"v": 105
},
"(1749, 1751, 1754)": {
"c": null,
"d": null,
"v": 140
},
"(1758,)": {
"c": null,
"d": null,
"v": 120
},
"(1748, 1752)": {
"c": null,
"d": null,
"v": 143
},
"(1750, 1752, 1753)": {
"c": null,
"d": null,
"v": 132
},
"(1749, 1752, 1753)": {
"c": null,
"d": null,
"v": 192
},
"(1753, 1756, 1759)": {
"c": null,
"d": null,
"v": 85
},
"(1748, 1754, 1759)": {
"c": null,
"d": null,
"v": 105
},
"(1747, 1749)": {
"c": null,
"d": null,
"v": 88
},
"(1748, 1756, 1759)": {
"c": null,
"d": null,
"v": 59
},
"(1753, 1756, 1757)": {
"c": null,
"d": null,
"v": 113
},
"(1747, 1752, 1755)": {
"c": null,
"d": null,
"v": 196
},
"(1749, 1755, 1759)": {
"c": null,
"d": null,
"v": 73
},
"(1748, 1751, 1756)": {
"c": null,
"d": null,
"v": 150
},
"(1750, 1754, 1756)": {
"c": null,
"d": null,
"v": 164
},
"(1751, 1753, 1759)": {
"c": null,
"d": null,
"v": 176
},
"(1755, 1759)": {
"c": null,
"d": null,
"v": 52
},
"(1747, 1756)": {
"c": null,
"d": null,
"v": 107
},
"(1750, 1751, 1757)": {
"c": null,
"d": null,
"v": 77
},
"(1748, 1750, 1752)": {
"c": null,
"d": null,
"v": 165
},
"(1748, 1755, 1759)": {
"c": null,
"d": null,
"v": 57
},
"(1748, 1749, 1754)": {
"c": null,
"d": null,
"v": 158
},
"(1747, 1748, 1756)": {
"c": null,
"d": null,
"v": 61
},
"(1747, 1751, 1753)": {
"c": null,
"d": null,
"v": 182
},
"(1749, 1754, 1759)": {
"c": null,
"d": null,
"v": 146
},
"(1748, 1750, 1759)": {
"c": null,
"d": null,
"v": 92
},
"(1758, 1759)": {
"c": null,
"d": null,
"v": 158
},
"(1747, 1754, 1757)": {
"c": null,
"d": null,
"v": 162
},
"(1747, 1755, 1756)": {
"c": null,
"d": null,
"v": 66
},
"(1747, 1753, 1757)": {
"c": null,
"d": null,
"v": 135
},
"(1753, 1754, 1757)": {
"c": null,
"d": null,
"v": 137
},
"(1751, 1756)": {
"c": null,
"d": null,
"v": 65
},
"(1756, 1758, 1759)": {
"c": null,
"d": null,
"v": 142
},
"(1749, 1753, 1754)": {
"c": null,
"d": null,
"v": 144
},
"(1748, 1757, 1758)": {
"c": null,
"d": null,
"v": 199
},
"(1752, 1755, 1756)": {
"c": null,
"d": null,
"v": 86
},
"(1747, 1751, 1758)": {
"c": null,
"d": null,
"v": 75
},
"(1750, 1757, 1758)": {
"c": null,
"d": null,
"v": 128
},
"(1751, 1752, 1758)": {
"c": null,
"d": null,
"v": 144
},
"(1750, 1755, 1758)": {
"c": null,
"d": null,
"v": 53
},
"(1757, 1758, 1759)": {
"c": null,
"d": null,
"v": 111
},
"(1749, 1756, 1758)": {
"c": null,
"d": null,
"v": 96
},
"(1748, 1753, 1757)": {
"c": null,
"d": null,
"v": 104
},
"(1751, 1754, 1757)": {
"c": null,
"d": null,
"v": 199
},
"(1749, 1751, 1758)": {
"c": null,
"d": null,
"v": 71
},
"(1750, 1752, 1757)": {
"c": null,
"d": null,
"v": 195
},
"(1753, 1754, 1758)": {
"c": null,
"d": null,
"v": 199
},
"(1749, 1752, 1757)": {
"c": null,
"d": null,
"v": 103
},
"(1752, 1759)": {
"c": null,
"d": null,
"v": 140
},
"(1747, 1750, 1757)": {
"c": null,
"d": null,
"v": 148
},
"(1754, 1756)": {
"c": null,
"d": null,
"v": 139
},
"(1747, 1750, 1754)": {
"c": null,
"d": null,
"v": 133
},
"(1749, 1750, 1751)": {
"c": null,
"d": null,
"v": 128
},
"(1749, 1755)": {
"c": null,
"d": null,
"v": 103
},
"(1748, 1754, 1757)": {
"c": null,
"d": null,
"v": 107
},
"(1747, 1749, 1751)": {
"c": null,
"d": null,
"v": 194
},
"(1757, 1758)": {
"c": null,
"d": null,
"v": 53
},
"(1754, 1758, 1759)": {
"c": null,
"d": null,
"v": 88
},
"(1748, 1755)": {
"c": null,
"d": null,
"v": 95
},
"(1750, 1753, 1758)": {
"c": null,
"d": null,
"v": 181
},
"(1749, 1750, 1756)": {
"c": null,
"d": null,
"v": 143
},
"(1754, 1756, 1758)": {
"c": null,
"d": null,
"v": 52
},
"(1747, 1748, 1752)": {
"c": null,
"d": null,
"v": 183
},
"(1748, 1749, 1758)": {
"c": null,
"d": null,
"v": 54
},
"(1756, 1757, 1759)": {
"c": null,
"d": null,
"v": 124
},
"(1748, 1751, 1755)": {
"c": null,
"d": null,
"v": 177
},
"(1750, 1754, 1759)": {
"c": null,
"d": null,
"v": 178
},
"(1751, 1753, 1754)": {
"c": null,
"d": null,
"v": 116
},
"(1749, 1754, 1757)": {
"c": null,
"d": null,
"v": 110
},
"(1750, 1756, 1757)": {
"c": null,
"d": null,
"v": 111
},
"(1752, 1754, 1759)": {
"c": null,
"d": null,
"v": 182
},
"(1752, 1753, 1754)": {
"c": null,
"d": null,
"v": 147
},
"(1747, 1755, 1758)": {
"c": null,
"d": null,
"v": 81
},
"(1748, 1749, 1751)": {
"c": null,
"d": null,
"v": 105
},
"(1749, 1755, 1757)": {
"c": null,
"d": null,
"v": 50
},
"(1747, 1751, 1754)": {
"c": null,
"d": null,
"v": 104
},
"(1748, 1750, 1756)": {
"c": null,
"d": null,
"v": 174
},
"(1752, 1754, 1756)": {
"c": null,
"d": null,
"v": 63
},
"(1747, 1753)": {
"c": null,
"d": null,
"v": 174
},
"(1752, 1755)": {
"c": null,
"d": null,
"v": 78
},
"(1748, 1752, 1755)": {
"c": null,
"d": null,
"v": 105
},
"(1747, 1753, 1754)": {
"c": null,
"d": null,
"v": 134
},
"(1751, 1755)": {
"c": null,
"d": null,
"v": 193
},
"(1752, 1757, 1759)": {
"c": null,
"d": null,
"v": 83
},
"(1747, 1754, 1759)": {
"c": null,
"d": null,
"v": 69
},
"(1751, 1752)": {
"c": null,
"d": null,
"v": 86
},
"(1750, 1751, 1759)": {
"c": null,
"d": null,
"v": 95
},
"(1750, 1755)": {
"c": null,
"d": null,
"v": 197
},
"(1749, 1757, 1758)": {
"c": null,
"d": null,
"v": 177
},
"(1751, 1753)": {
"c": null,
"d": null,
"v": 191
},
"(1748, 1755, 1757)": {
"c": null,
"d": null,
"v": 184
},
"(1751, 1755, 1756)": {
"c": null,
"d": null,
"v": 123
},
"(1752, 1756, 1759)": {
"c": null,
"d": null,
"v": 155
},
"()": {
"c": null,
"d": null,
"v": 154
},
"(1750, 1753, 1755)": {
"c": null,
"d": null,
"v": 119
},
"(1749, 1750, 1755)": {
"c": null,
"d": null,
"v": 140
},
"(1753,)": {
"c": null,
"d": null,
"v": 57
},
"(1749, 1752, 1759)": {
"c": null,
"d": null,
"v": 104
},
"(1751, 1756, 1758)": {
"c": null,
"d": null,
"v": 144
},
"(1749, 1751)": {
"c": null,
"d": null,
"v": 53
},
"(1756, 1758)": {
"c": null,
"d": null,
"v": 65
},
"(1751, 1752, 1755)": {
"c": null,
"d": null,
"v": 193
},
"(1751, 1754, 1758)": {
"c": null,
"d": null,
"v": 58
},
"(1752, 1756, 1757)": {
"c": null,
"d": null,
"v": 115
},
"(1753, 1756)": {
"c": null,
"d": null,
"v": 153
},
"(1749, 1751, 1755)": {
"c": null,
"d": null,
"v": 166
},
"(1757,)": {
"c": null,
"d": null,
"v": 78
},
"(1749, 1758)": {
"c": null,
"d": null,
"v": 155
},
"(1748, 1751)": {
"c": null,
"d": null,
"v": 131
},
"(1749, 1756)": {
"c": null,
"d": null,
"v": 127
},
"(1748, 1751, 1759)": {
"c": null,
"d": null,
"v": 63
},
"(1747, 1748)": {
"c": null,
"d": null,
"v": 186
},
"(1747, 1752, 1754)": {
"c": null,
"d": null,
"v": 88
},
"(1751, 1753, 1758)": {
"c": null,
"d": null,
"v": 169
},
"(1750, 1754, 1755)": {
"c": null,
"d": null,
"v": 102
},
"(1748, 1753, 1759)": {
"c": null,
"d": null,
"v": 164
},
"(1755, 1758)": {
"c": null,
"d": null,
"v": 97
},
"(1747, 1757)": {
"c": null,
"d": null,
"v": 151
},
"(1750, 1758)": {
"c": null,
"d": null,
"v": 186
},
"(1748, 1750, 1753)": {
"c": null,
"d": null,
"v": 74
},
"(1752, 1754, 1755)": {
"c": null,
"d": null,
"v": 190
},
"(1750, 1757)": {
"c": null,
"d": null,
"v": 116
},
"(1748, 1755, 1758)": {
"c": null,
"d": null,
"v": 133
},
"(1755, 1756, 1757)": {
"c": null,
"d": null,
"v": 153
},
"(1753, 1758, 1759)": {
"c": null,
"d": null,
"v": 190
},
"(1752, 1753, 1758)": {
"c": null,
"d": null,
"v": 180
},
"(1747, 1748, 1757)": {
"c": null,
"d": null,
"v": 62
},
"(1748, 1749, 1755)": {
"c": null,
"d": null,
"v": 191
},
"(1747, 1749, 1753)": {
"c": null,
"d": null,
"v": 123
},
"(1747,)": {
"c": null,
"d": null,
"v": 112
},
"(1749, 1754, 1758)": {
"c": null,
"d": null,
"v": 110
},
"(1747, 1755, 1757)": {
"c": null,
"d": null,
"v": 79
},
"(1753, 1757, 1758)": {
"c": null,
"d": null,
"v": 168
},
"(1750, 1753)": {
"c": null,
"d": null,
"v": 129
},
"(1752, 1755, 1758)": {
"c": null,
"d": null,
"v": 89
},
"(1752, 1758, 1759)": {
"c": null,
"d": null,
"v": 65
},
"(1751, 1757, 1759)": {
"c": null,
"d": null,
"v": 106
},
"(1749, 1753, 1755)": {
"c": null,
"d": null,
"v": 51
},
"(1752, 1755, 1757)": {
"c": null,
"d": null,
"v": 153
},
"(1748, 1749, 1752)": {
"c": null,
"d": null,
"v": 185
},
"(1747, 1750)": {
"c": null,
"d": null,
"v": 176
},
"(1747, 1748, 1758)": {
"c": null,
"d": null,
"v": 106
},
"(1747, 1754, 1756)": {
"c": null,
"d": null,
"v": 127
},
"(1747, 1751, 1759)": {
"c": null,
"d": null,
"v": 107
},
"(1751, 1752, 1759)": {
"c": null,
"d": null,
"v": 138
},
"(1748, 1749)": {
"c": null,
"d": null,
"v": 172
},
"(1749, 1756, 1757)": {
"c": null,
"d": null,
"v": 88
},
"(1750, 1751, 1754)": {
"c": null,
"d": null,
"v": 141
},
"(1749, 1750)": {
"c": null,
"d": null,
"v": 166
},
"(1748, 1753, 1756)": {
"c": null,
"d": null,
"v": 69
},
"(1750, 1755, 1759)": {
"c": null,
"d": null,
"v": 178
},
"(1748, 1752, 1756)": {
"c": null,
"d": null,
"v": 54
},
"(1749, 1751, 1759)": {
"c": null,
"d": null,
"v": 106
},
"(1759,)": {
"c": null,
"d": null,
"v": 151
},
"(1750, 1752, 1756)": {
"c": null,
"d": null,
"v": 83
},
"(1753, 1754, 1759)": {
"c": null,
"d": null,
"v": 131
},
"(1751, 1759)": {
"c": null,
"d": null,
"v": 81
},
"(1749, 1752, 1756)": {
"c": null,
"d": null,
"v": 153
},
"(1751,)": {
"c": null,
"d": null,
"v": 109
},
"(1756, 1757)": {
"c": null,
"d": null,
"v": 187
},
"(1747, 1749, 1755)": {
"c": null,
"d": null,
"v": 121
},
"(1754, 1756, 1757)": {
"c": null,
"d": null,
"v": 122
},
"(1751, 1755, 1759)": {
"c": null,
"d": null,
"v": 187
},
"(1752, 1756)": {
"c": null,
"d": null,
"v": 139
},
"(1754, 1755, 1756)": {
"c": null,
"d": null,
"v": 193
},
"(1754, 1757)": {
"c": null,
"d": null,
"v": 85
},
"(1749, 1752)": {
"c": null,
"d": null,
"v": 142
},
"(1753, 1755, 1759)": {
"c": null,
"d": null,
"v": 180
},
"(1747, 1750, 1753)": {
"c": null,
"d": null,
"v": 177
},
"(1753, 1759)": {
"c": null,
"d": null,
"v": 70
},
"(1748, 1754)": {
"c": null,
"d": null,
"v": 105
},
"(1749, 1751, 1752)": {
"c": null,
"d": null,
"v": 170
},
"(1750, 1753, 1759)": {
"c": null,
"d": null,
"v": 168
},
"(1749, 1750, 1759)": {
"c": null,
"d": null,
"v": 52
},
"(1755,)": {
"c": null,
"d": null,
"v": 115
},
"(1747, 1749, 1756)": {
"c": null,
"d": null,
"v": 73
},
"(1747, 1752, 1759)": {
"c": null,
"d": null,
"v": 99
},
"(1748, 1749, 1759)": {
"c": null,
"d": null,
"v": 175
},
"(1747, 1748, 1753)": {
"c": null,
"d": null,
"v": 143
},
"(1751, 1758, 1759)": {
"c": null,
"d": null,
"v": 130
},
"(1748, 1751, 1754)": {
"c": null,
"d": null,
"v": 55
},
"(1755, 1757)": {
"c": null,
"d": null,
"v": 181
},
"(1751, 1753, 1757)": {
"c": null,
"d": null,
"v": 65
},
"(1749,)": {
"c": null,
"d": null,
"v": 148
},
"(1750, 1754, 1758)": {
"c": null,
"d": null,
"v": 59
},
"(1749, 1754, 1756)": {
"c": null,
"d": null,
"v": 162
},
"(1747, 1749, 1759)": {
"c": null,
"d": null,
"v": 58
},
"(1747, 1755, 1759)": {
"c": null,
"d": null,
"v": 145
},
"(1752, 1754, 1758)": {
"c": null,
"d": null,
"v": 181
},
"(1752, 1753, 1755)": {
"c": null,
"d": null,
"v": 76
},
"(1753, 1755, 1757)": {
"c": null,
"d": null,
"v": 177
},
"(1747, 1748, 1754)": {
"c": null,
"d": null,
"v": 54
},
"(1748, 1749, 1756)": {
"c": null,
"d": null,
"v": 195
},
"(1747, 1751, 1755)": {
"c": null,
"d": null,
"v": 56
},
"(1747, 1754)": {
"c": null,
"d": null,
"v": 193
},
"(1748, 1750, 1757)": {
"c": null,
"d": null,
"v": 87
}
},
"num_disaggregation": 3,
"level_reported": 3,
"disaggregation_reported_on": [
503,
504,
505
]
}
],
"time_period_start": "2017-06-14",
"time_period_end": "2017-06-14",
"total": 2000,
"remarks": null,
"report_status": "OT",
"disagg_lookup_map": [
{
"id": 503,
"name": "height",
"active": true,
"choices": [
{
"id": 1747,
"value": "tall",
"active": true
},
{
"id": 1748,
"value": "medium",
"active": true
},
{
"id": 1749,
"value": "short",
"active": true
},
{
"id": 1750,
"value": "extrashort",
"active": true
}
]
},
{
"id": 504,
"name": "age",
"active": true,
"choices": [
{
"id": 1751,
"value": "1-2m",
"active": true
},
{
"id": 1752,
"value": "3-4m",
"active": true
},
{
"id": 1753,
"value": "5-6m",
"active": true
},
{
"id": 1754,
"value": "7-10m",
"active": true
},
{
"id": 1755,
"value": "11-13m",
"active": true
},
{
"id": 1756,
"value": "14-16m",
"active": true
}
]
},
{
"id": 505,
"name": "gender",
"active": true,
"choices": [
{
"id": 1757,
"value": "male",
"active": true
},
{
"id": 1758,
"value": "female",
"active": true
},
{
"id": 1759,
"value": "other",
"active": true
}
]
}
],
"disagg_choice_lookup_map": [
[
[
1757,
"male"
],
[
1758,
"female"
],
[
1759,
"other"
]
],
[
[
1747,
"tall"
],
[
1748,
"medium"
],
[
1749,
"short"
],
[
1750,
"extrashort"
]
],
[
[
1751,
"1-2m"
],
[
1752,
"3-4m"
],
[
1753,
"5-6m"
],
[
1754,
"7-10m"
],
[
1755,
"11-13m"
],
[
1756,
"14-16m"
]
]
]
},
{
"id": 564,
"title": "indicator_report_5",
"indicator_location_data": [
{
"id": 1017,
"location": {
"id": 257,
"title": "location_2",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"()": {
"c": null,
"d": null,
"v": 104
}
},
"num_disaggregation": 2,
"level_reported": 0,
"disaggregation_reported_on": []
},
{
"id": 1016,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1759,)": {
"c": null,
"d": null,
"v": 74
},
"(1758,)": {
"c": null,
"d": null,
"v": 194
},
"()": {
"c": null,
"d": null,
"v": 107
},
"(1757,)": {
"c": null,
"d": null,
"v": 62
}
},
"num_disaggregation": 2,
"level_reported": 1,
"disaggregation_reported_on": [
505
]
},
{
"id": 1015,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1752,)": {
"c": null,
"d": null,
"v": 95
},
"(1754,)": {
"c": null,
"d": null,
"v": 165
},
"(1756,)": {
"c": null,
"d": null,
"v": 95
},
"(1753,)": {
"c": null,
"d": null,
"v": 192
},
"(1751,)": {
"c": null,
"d": null,
"v": 144
},
"()": {
"c": null,
"d": null,
"v": 159
},
"(1755,)": {
"c": null,
"d": null,
"v": 84
}
},
"num_disaggregation": 2,
"level_reported": 1,
"disaggregation_reported_on": [
504
]
},
{
"id": 1014,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1750,)": {
"c": null,
"d": null,
"v": 60
},
"(1748,)": {
"c": null,
"d": null,
"v": 84
},
"()": {
"c": null,
"d": null,
"v": 145
},
"(1747,)": {
"c": null,
"d": null,
"v": 190
},
"(1749,)": {
"c": null,
"d": null,
"v": 66
}
},
"num_disaggregation": 2,
"level_reported": 1,
"disaggregation_reported_on": [
503
]
},
{
"id": 1013,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1752,)": {
"c": null,
"d": null,
"v": 198
},
"(1754, 1756)": {
"c": null,
"d": null,
"v": 194
},
"(1753,)": {
"c": null,
"d": null,
"v": 66
},
"(1754, 1758)": {
"c": null,
"d": null,
"v": 152
},
"(1753, 1758)": {
"c": null,
"d": null,
"v": 138
},
"(1756, 1758)": {
"c": null,
"d": null,
"v": 185
},
"(1751, 1754)": {
"c": null,
"d": null,
"v": 100
},
"(1759,)": {
"c": null,
"d": null,
"v": 139
},
"(1751, 1756)": {
"c": null,
"d": null,
"v": 80
},
"(1753, 1756)": {
"c": null,
"d": null,
"v": 121
},
"(1755, 1757)": {
"c": null,
"d": null,
"v": 102
},
"(1756,)": {
"c": null,
"d": null,
"v": 109
},
"(1757, 1758)": {
"c": null,
"d": null,
"v": 174
},
"(1755, 1759)": {
"c": null,
"d": null,
"v": 85
},
"(1757,)": {
"c": null,
"d": null,
"v": 188
},
"(1751,)": {
"c": null,
"d": null,
"v": 52
},
"(1751, 1759)": {
"c": null,
"d": null,
"v": 117
},
"(1756, 1757)": {
"c": null,
"d": null,
"v": 171
},
"(1752, 1758)": {
"c": null,
"d": null,
"v": 135
},
"(1752, 1754)": {
"c": null,
"d": null,
"v": 120
},
"(1752, 1756)": {
"c": null,
"d": null,
"v": 108
},
"(1754, 1757)": {
"c": null,
"d": null,
"v": 117
},
"(1755, 1756)": {
"c": null,
"d": null,
"v": 84
},
"(1752, 1753)": {
"c": null,
"d": null,
"v": 183
},
"(1752, 1755)": {
"c": null,
"d": null,
"v": 166
},
"(1754, 1759)": {
"c": null,
"d": null,
"v": 106
},
"(1751, 1757)": {
"c": null,
"d": null,
"v": 189
},
"(1751, 1755)": {
"c": null,
"d": null,
"v": 144
},
"(1757, 1759)": {
"c": null,
"d": null,
"v": 68
},
"(1753, 1759)": {
"c": null,
"d": null,
"v": 172
},
"(1753, 1755)": {
"c": null,
"d": null,
"v": 50
},
"(1756, 1759)": {
"c": null,
"d": null,
"v": 69
},
"(1753, 1757)": {
"c": null,
"d": null,
"v": 148
},
"(1751, 1752)": {
"c": null,
"d": null,
"v": 132
},
"(1753, 1754)": {
"c": null,
"d": null,
"v": 65
},
"(1754,)": {
"c": null,
"d": null,
"v": 97
},
"(1758,)": {
"c": null,
"d": null,
"v": 113
},
"(1751, 1753)": {
"c": null,
"d": null,
"v": 189
},
"(1755, 1758)": {
"c": null,
"d": null,
"v": 136
},
"(1752, 1759)": {
"c": null,
"d": null,
"v": 175
},
"(1751, 1758)": {
"c": null,
"d": null,
"v": 188
},
"()": {
"c": null,
"d": null,
"v": 98
},
"(1755,)": {
"c": null,
"d": null,
"v": 93
},
"(1758, 1759)": {
"c": null,
"d": null,
"v": 126
},
"(1754, 1755)": {
"c": null,
"d": null,
"v": 80
},
"(1752, 1757)": {
"c": null,
"d": null,
"v": 124
}
},
"num_disaggregation": 2,
"level_reported": 2,
"disaggregation_reported_on": [
504,
505
]
},
{
"id": 1012,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1747, 1757)": {
"c": null,
"d": null,
"v": 55
},
"(1750, 1758)": {
"c": null,
"d": null,
"v": 75
},
"(1748, 1749)": {
"c": null,
"d": null,
"v": 74
},
"(1749, 1757)": {
"c": null,
"d": null,
"v": 132
},
"(1747, 1749)": {
"c": null,
"d": null,
"v": 77
},
"(1747, 1759)": {
"c": null,
"d": null,
"v": 76
},
"(1748, 1759)": {
"c": null,
"d": null,
"v": 83
},
"(1759,)": {
"c": null,
"d": null,
"v": 141
},
"(1757, 1758)": {
"c": null,
"d": null,
"v": 137
},
"(1750,)": {
"c": null,
"d": null,
"v": 118
},
"(1747,)": {
"c": null,
"d": null,
"v": 117
},
"(1749,)": {
"c": null,
"d": null,
"v": 126
},
"(1757,)": {
"c": null,
"d": null,
"v": 90
},
"(1749, 1758)": {
"c": null,
"d": null,
"v": 69
},
"(1750, 1759)": {
"c": null,
"d": null,
"v": 147
},
"(1748, 1758)": {
"c": null,
"d": null,
"v": 165
},
"(1747, 1758)": {
"c": null,
"d": null,
"v": 178
},
"(1748,)": {
"c": null,
"d": null,
"v": 128
},
"()": {
"c": null,
"d": null,
"v": 52
},
"(1747, 1748)": {
"c": null,
"d": null,
"v": 175
},
"(1749, 1750)": {
"c": null,
"d": null,
"v": 194
},
"(1748, 1757)": {
"c": null,
"d": null,
"v": 162
},
"(1749, 1759)": {
"c": null,
"d": null,
"v": 173
},
"(1758,)": {
"c": null,
"d": null,
"v": 165
},
"(1750, 1757)": {
"c": null,
"d": null,
"v": 183
},
"(1748, 1750)": {
"c": null,
"d": null,
"v": 96
},
"(1757, 1759)": {
"c": null,
"d": null,
"v": 125
},
"(1747, 1750)": {
"c": null,
"d": null,
"v": 194
},
"(1758, 1759)": {
"c": null,
"d": null,
"v": 67
}
},
"num_disaggregation": 2,
"level_reported": 2,
"disaggregation_reported_on": [
503,
505
]
},
{
"id": 1011,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1748, 1749)": {
"c": null,
"d": null,
"v": 55
},
"(1752,)": {
"c": null,
"d": null,
"v": 150
},
"(1754, 1756)": {
"c": null,
"d": null,
"v": 181
},
"(1753,)": {
"c": null,
"d": null,
"v": 89
},
"(1747, 1749)": {
"c": null,
"d": null,
"v": 99
},
"(1749, 1755)": {
"c": null,
"d": null,
"v": 174
},
"(1749, 1751)": {
"c": null,
"d": null,
"v": 51
},
"(1755, 1756)": {
"c": null,
"d": null,
"v": 52
},
"(1751, 1754)": {
"c": null,
"d": null,
"v": 98
},
"(1751, 1756)": {
"c": null,
"d": null,
"v": 191
},
"(1753, 1756)": {
"c": null,
"d": null,
"v": 99
},
"(1750,)": {
"c": null,
"d": null,
"v": 59
},
"(1750, 1755)": {
"c": null,
"d": null,
"v": 189
},
"(1748, 1755)": {
"c": null,
"d": null,
"v": 140
},
"(1747,)": {
"c": null,
"d": null,
"v": 171
},
"(1756,)": {
"c": null,
"d": null,
"v": 186
},
"(1748, 1753)": {
"c": null,
"d": null,
"v": 118
},
"(1749,)": {
"c": null,
"d": null,
"v": 119
},
"(1751,)": {
"c": null,
"d": null,
"v": 63
},
"(1747, 1751)": {
"c": null,
"d": null,
"v": 166
},
"(1748, 1751)": {
"c": null,
"d": null,
"v": 149
},
"(1747, 1755)": {
"c": null,
"d": null,
"v": 102
},
"(1752, 1754)": {
"c": null,
"d": null,
"v": 71
},
"(1747, 1753)": {
"c": null,
"d": null,
"v": 163
},
"(1749, 1753)": {
"c": null,
"d": null,
"v": 67
},
"(1750, 1753)": {
"c": null,
"d": null,
"v": 141
},
"(1752, 1753)": {
"c": null,
"d": null,
"v": 91
},
"(1749, 1754)": {
"c": null,
"d": null,
"v": 161
},
"(1752, 1755)": {
"c": null,
"d": null,
"v": 72
},
"(1749, 1756)": {
"c": null,
"d": null,
"v": 148
},
"(1747, 1756)": {
"c": null,
"d": null,
"v": 173
},
"(1749, 1752)": {
"c": null,
"d": null,
"v": 185
},
"(1750, 1752)": {
"c": null,
"d": null,
"v": 86
},
"(1748,)": {
"c": null,
"d": null,
"v": 90
},
"()": {
"c": null,
"d": null,
"v": 92
},
"(1747, 1748)": {
"c": null,
"d": null,
"v": 76
},
"(1751, 1755)": {
"c": null,
"d": null,
"v": 75
},
"(1749, 1750)": {
"c": null,
"d": null,
"v": 143
},
"(1753, 1755)": {
"c": null,
"d": null,
"v": 159
},
"(1750, 1754)": {
"c": null,
"d": null,
"v": 193
},
"(1751, 1752)": {
"c": null,
"d": null,
"v": 123
},
"(1750, 1756)": {
"c": null,
"d": null,
"v": 162
},
"(1753, 1754)": {
"c": null,
"d": null,
"v": 151
},
"(1754,)": {
"c": null,
"d": null,
"v": 62
},
"(1748, 1756)": {
"c": null,
"d": null,
"v": 136
},
"(1748, 1752)": {
"c": null,
"d": null,
"v": 145
},
"(1751, 1753)": {
"c": null,
"d": null,
"v": 123
},
"(1748, 1754)": {
"c": null,
"d": null,
"v": 123
},
"(1752, 1756)": {
"c": null,
"d": null,
"v": 182
},
"(1748, 1750)": {
"c": null,
"d": null,
"v": 125
},
"(1747, 1752)": {
"c": null,
"d": null,
"v": 159
},
"(1755,)": {
"c": null,
"d": null,
"v": 177
},
"(1747, 1750)": {
"c": null,
"d": null,
"v": 169
},
"(1747, 1754)": {
"c": null,
"d": null,
"v": 94
},
"(1754, 1755)": {
"c": null,
"d": null,
"v": 119
},
"(1750, 1751)": {
"c": null,
"d": null,
"v": 139
}
},
"num_disaggregation": 2,
"level_reported": 2,
"disaggregation_reported_on": [
503,
504
]
}
],
"time_period_start": "2017-06-14",
"time_period_end": "2017-06-14",
"total": 1800,
"remarks": null,
"report_status": "OT",
"disagg_lookup_map": [
{
"id": 503,
"name": "height",
"active": true,
"choices": [
{
"id": 1747,
"value": "tall",
"active": true
},
{
"id": 1748,
"value": "medium",
"active": true
},
{
"id": 1749,
"value": "short",
"active": true
},
{
"id": 1750,
"value": "extrashort",
"active": true
}
]
},
{
"id": 504,
"name": "age",
"active": true,
"choices": [
{
"id": 1751,
"value": "1-2m",
"active": true
},
{
"id": 1752,
"value": "3-4m",
"active": true
},
{
"id": 1753,
"value": "5-6m",
"active": true
},
{
"id": 1754,
"value": "7-10m",
"active": true
},
{
"id": 1755,
"value": "11-13m",
"active": true
},
{
"id": 1756,
"value": "14-16m",
"active": true
}
]
},
{
"id": 505,
"name": "gender",
"active": true,
"choices": [
{
"id": 1757,
"value": "male",
"active": true
},
{
"id": 1758,
"value": "female",
"active": true
},
{
"id": 1759,
"value": "other",
"active": true
}
]
}
],
"disagg_choice_lookup_map": [
[
[
1757,
"male"
],
[
1758,
"female"
],
[
1759,
"other"
]
],
[
[
1747,
"tall"
],
[
1748,
"medium"
],
[
1749,
"short"
],
[
1750,
"extrashort"
]
],
[
[
1751,
"1-2m"
],
[
1752,
"3-4m"
],
[
1753,
"5-6m"
],
[
1754,
"7-10m"
],
[
1755,
"11-13m"
],
[
1756,
"14-16m"
]
]
]
},
{
"id": 565,
"title": "indicator_report_6",
"indicator_location_data": [
{
"id": 1021,
"location": {
"id": 256,
"title": "location_1",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"()": {
"c": null,
"d": null,
"v": 53
}
},
"num_disaggregation": 1,
"level_reported": 0,
"disaggregation_reported_on": []
},
{
"id": 1020,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1759,)": {
"c": null,
"d": null,
"v": 141
},
"(1758,)": {
"c": null,
"d": null,
"v": 93
},
"()": {
"c": null,
"d": null,
"v": 131
},
"(1757,)": {
"c": null,
"d": null,
"v": 75
}
},
"num_disaggregation": 1,
"level_reported": 1,
"disaggregation_reported_on": [
505
]
},
{
"id": 1019,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1752,)": {
"c": null,
"d": null,
"v": 123
},
"(1754,)": {
"c": null,
"d": null,
"v": 92
},
"(1756,)": {
"c": null,
"d": null,
"v": 50
},
"(1753,)": {
"c": null,
"d": null,
"v": 92
},
"(1751,)": {
"c": null,
"d": null,
"v": 174
},
"()": {
"c": null,
"d": null,
"v": 96
},
"(1755,)": {
"c": null,
"d": null,
"v": 147
}
},
"num_disaggregation": 1,
"level_reported": 1,
"disaggregation_reported_on": [
504
]
},
{
"id": 1018,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"(1750,)": {
"c": null,
"d": null,
"v": 148
},
"(1748,)": {
"c": null,
"d": null,
"v": 199
},
"()": {
"c": null,
"d": null,
"v": 160
},
"(1747,)": {
"c": null,
"d": null,
"v": 75
},
"(1749,)": {
"c": null,
"d": null,
"v": 173
}
},
"num_disaggregation": 1,
"level_reported": 1,
"disaggregation_reported_on": [
503
]
}
],
"time_period_start": "2017-06-14",
"time_period_end": "2017-06-14",
"total": 200,
"remarks": null,
"report_status": "OT",
"disagg_lookup_map": [
{
"id": 503,
"name": "height",
"active": true,
"choices": [
{
"id": 1747,
"value": "tall",
"active": true
},
{
"id": 1748,
"value": "medium",
"active": true
},
{
"id": 1749,
"value": "short",
"active": true
},
{
"id": 1750,
"value": "extrashort",
"active": true
}
]
},
{
"id": 504,
"name": "age",
"active": true,
"choices": [
{
"id": 1751,
"value": "1-2m",
"active": true
},
{
"id": 1752,
"value": "3-4m",
"active": true
},
{
"id": 1753,
"value": "5-6m",
"active": true
},
{
"id": 1754,
"value": "7-10m",
"active": true
},
{
"id": 1755,
"value": "11-13m",
"active": true
},
{
"id": 1756,
"value": "14-16m",
"active": true
}
]
},
{
"id": 505,
"name": "gender",
"active": true,
"choices": [
{
"id": 1757,
"value": "male",
"active": true
},
{
"id": 1758,
"value": "female",
"active": true
},
{
"id": 1759,
"value": "other",
"active": true
}
]
}
],
"disagg_choice_lookup_map": [
[
[
1757,
"male"
],
[
1758,
"female"
],
[
1759,
"other"
]
],
[
[
1747,
"tall"
],
[
1748,
"medium"
],
[
1749,
"short"
],
[
1750,
"extrashort"
]
],
[
[
1751,
"1-2m"
],
[
1752,
"3-4m"
],
[
1753,
"5-6m"
],
[
1754,
"7-10m"
],
[
1755,
"11-13m"
],
[
1756,
"14-16m"
]
]
]
},
{
"id": 566,
"title": "indicator_report_7",
"indicator_location_data": [
{
"id": 1022,
"location": {
"id": 255,
"title": "location_0",
"latitude": null,
"longitude": null,
"p_code": null
},
"disaggregation": {
"()": {
"c": null,
"d": null,
"v": 141
}
},
"num_disaggregation": 0,
"level_reported": 0,
"disaggregation_reported_on": []
}
],
"time_period_start": "2017-06-14",
"time_period_end": "2017-06-14",
"total": 2800,
"remarks": null,
"report_status": "OT",
"disagg_lookup_map": [
{
"id": 503,
"name": "height",
"active": true,
"choices": [
{
"id": 1747,
"value": "tall",
"active": true
},
{
"id": 1748,
"value": "medium",
"active": true
},
{
"id": 1749,
"value": "short",
"active": true
},
{
"id": 1750,
"value": "extrashort",
"active": true
}
]
},
{
"id": 504,
"name": "age",
"active": true,
"choices": [
{
"id": 1751,
"value": "1-2m",
"active": true
},
{
"id": 1752,
"value": "3-4m",
"active": true
},
{
"id": 1753,
"value": "5-6m",
"active": true
},
{
"id": 1754,
"value": "7-10m",
"active": true
},
{
"id": 1755,
"value": "11-13m",
"active": true
},
{
"id": 1756,
"value": "14-16m",
"active": true
}
]
},
{
"id": 505,
"name": "gender",
"active": true,
"choices": [
{
"id": 1757,
"value": "male",
"active": true
},
{
"id": 1758,
"value": "female",
"active": true
},
{
"id": 1759,
"value": "other",
"active": true
}
]
}
],
"disagg_choice_lookup_map": [
[
[
1757,
"male"
],
[
1758,
"female"
],
[
1759,
"other"
]
],
[
[
1747,
"tall"
],
[
1748,
"medium"
],
[
1749,
"short"
],
[
1750,
"extrashort"
]
],
[
[
1751,
"1-2m"
],
[
1752,
"3-4m"
],
[
1753,
"5-6m"
],
[
1754,
"7-10m"
],
[
1755,
"11-13m"
],
[
1756,
"14-16m"
]
]
]
},
{
"id": 567,
"title": "indicator_report_8",
"indicator_location_data": [],
"time_period_start": "2017-06-14",
"time_period_end": "2017-06-14",
"total": 1600,
"remarks": null,
"report_status": "OT",
"disagg_lookup_map": [
{
"id": 503,
"name": "height",
"active": true,
"choices": [
{
"id": 1747,
"value": "tall",
"active": true
},
{
"id": 1748,
"value": "medium",
"active": true
},
{
"id": 1749,
"value": "short",
"active": true
},
{
"id": 1750,
"value": "extrashort",
"active": true
}
]
},
{
"id": 504,
"name": "age",
"active": true,
"choices": [
{
"id": 1751,
"value": "1-2m",
"active": true
},
{
"id": 1752,
"value": "3-4m",
"active": true
},
{
"id": 1753,
"value": "5-6m",
"active": true
},
{
"id": 1754,
"value": "7-10m",
"active": true
},
{
"id": 1755,
"value": "11-13m",
"active": true
},
{
"id": 1756,
"value": "14-16m",
"active": true
}
]
},
{
"id": 505,
"name": "gender",
"active": true,
"choices": [
{
"id": 1757,
"value": "male",
"active": true
},
{
"id": 1758,
"value": "female",
"active": true
},
{
"id": 1759,
"value": "other",
"active": true
}
]
}
],
"disagg_choice_lookup_map": [
[
[
1757,
"male"
],
[
1758,
"female"
],
[
1759,
"other"
]
],
[
[
1747,
"tall"
],
[
1748,
"medium"
],
[
1749,
"short"
],
[
1750,
"extrashort"
]
],
[
[
1751,
"1-2m"
],
[
1752,
"3-4m"
],
[
1753,
"5-6m"
],
[
1754,
"7-10m"
],
[
1755,
"11-13m"
],
[
1756,
"14-16m"
]
]
]
}
]
See https://projects.invisionapp.com/share/RDBE0T04F#/screens/238647670 and next few screens.
data is not auto-saved.....
Once user clicks save, modal closes and data is shown in the read-only components below for that indicator+location. If user entered all the data then green checkmark appears, otherwise remains a red "!". https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016142
Clear clears the data. Saving will make an API call. Entering partial data is not allowed. User can report at lower disagg level and thats allowed of course (checkboxes at top: https://projects.invisionapp.com/share/RDBE0T04F#/screens/238646320 ). Message shows when reporting at lower level than what the indicator (reportable) has been configured at/as.
If changing to higher or lower disagg, can get a warning message as well: https://projects.invisionapp.com/share/RDBE0T04F#/screens/238646326
Technical design
Please build upon work in #72
The JSON structure is being used for the "view only" tables already. Similar logic should be used to construct the forms here as well, except instead of TD its a INPUT component being used.
It'd be good to create a copy the redux element / store for the data being edited. If user cancels modal out, then delete this copy. If user is making changes then the data in this copy in redux is being modified. If user makes changes and/or presses save then PUT the data back to backend and on success copy it back to the original redux store/key, so underlying tables and logic of complete/incomplete etc. will auto-update.
If the user checks / unchecks any disaggregation checkboxes, other than the warning the frontend will have the regenerate the disaggregation data structure with all the possible key combinations for that level and set them to empty data.
Please look at this as well if it helps in implementation: http://david-mulder.github.io/paper-datatable/components/paper-datatable/demo/paper-datatable/editable.html
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338351
Keep in mind mockups for filtering when in "edit mode" (idea is the same):
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338349
Filters as in top.
Do after #74
Here's some story.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016130
Pagination should work. Ignore filtering etc. for this task. Name of PD, report status, due data, draft status and appropriate link should work.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016141
"Show incomplete" will only show outputs and indicators that are not complete (with red "!").
Same thing in top right. Called "workspace" in eTools.
Switching will kick user to overview tab of that country/intervention/emergency.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016131
User can see Details of a PD at /pd/$id/overview/
Lower Level output, CP output, PD itself and its related metadata.
Sync all PD's other than draft ones from PMP. On the list of PD's page default to "active, ended".
As part of the sync will need to interpret the indicators (applied and blueprint) from PMP and create similar in PRP.
once you get PD from PD endpoint in etools, add/update the below models accordingly (spec here: https://docs.google.com/document/d/1bvUAmNn8PbcWky8c7QWPaud-HRwvzOhvScA1nu2yFbo/edit)
vendor_number
in the PD API, check the Partner
model if there is an existing record. If there is, update the record for the below fields. If the record does not exist, add with the below fields.Fields from Partner API | Fields in Partners model |
Comments |
---|---|---|
vendor_number | vendor_number | |
id | external_id | change tracked here #302 |
name | title | |
short_name | short_title | |
partner_type | partner_type | |
cso_type | cso_type | |
rating | rating | |
shared_partner | shared_partner | |
phone_number | phone_number | |
total_ct_cp | total_ct_cp | |
total_ct_cy | total_ct_cy | |
alternate_name | alternate_title | named twice in that model #302 |
last_assessment_date | last_assessment_date | |
core_values_assessment_date | core_values_assessment_date | |
street_address | street_address | |
city | city | |
postal_code | postal_code | |
alternate_id | alternate_id |
Person
model by email address if the agreement_auth_officers
unicef_focal_points
unicef_focal_points
fields exist or not. Update all fields if the record exists. For agreement_auth_officers
and unicef_focal_points
fields, also check the users
model by email address and add the user group as indicated below for that user(s).Fields from PD API | Fields in Person model |
Comments |
---|---|---|
agreement_auth_officers{email} | add/update in users with group="IP Authorized Officer" and assign partner to this partner org |
|
agreement_auth_officers{id} | external_id | need to create this field #302 |
agreement_auth_officers{name} | name | |
agreement_auth_officers{title} | title | |
agreement_auth_officers{phone_number} | phone_number |
Fields from PD API | Fields in Person model |
Comments |
---|---|---|
focal_points{email} | add/update in users with group="IP Authorized Officer" and assign partner to this partner org |
|
focal_points{id} | external_id | need to create this field #302 |
focal_points{name} | name | |
focal_points{title} | title | |
focal_points{phone_number} | phone_number |
Fields from PD API | Fields in Person model |
Comments |
---|---|---|
unicef_focal_points{email} | DO NOT add/update users for this type of Person |
|
unicef_focal_points{id} | external_id | need to create this field #302 |
unicef_focal_points{name} | name | |
unicef_focal_points{title} | title | |
unicef_focal_points{phone_number} | phone_number |
ProgrammeDocument
model by external_id
. Make sure to FK to the Workspace
. This can be achieved by matching the business_area
field in the PD API to the workspace matching to this business area code.Fields from PD API | Fields in ProgrammeDocument model |
Comments |
---|---|---|
id | external_id | need to create this field #302 |
title | title | |
offices | unicef_office | |
number | reference_number | |
partner_org{name} | officer_programme_documents | FK to Partner by vendor_number |
unicef_focal_points{name} | unicef_focal_point | FK to Person by email |
agreement_auth_officers{name} | unicef_officers | FK to Person by email |
focal_points{name} | unicef_focal_point | FK to Person by email |
start_date | start_date | |
end_date | end_date | |
cso_budget | budget | |
cso_budget_currency | budget_currency | |
funds_recieved | remove from progress report and add in pd #302 | |
funds_recieved_currency | add to ProgressReport #302 | |
reporting_frequencies{start,end,due_date} | cs_dates | modify cs_dates #302 |
business_area_code | workspace | FK to Workspace by id ; Workspace needs association to ProgrammeDocument #302 |
CountryProgrammeDocument
model by external_id
. Make sure to FK to new/updated Programme DocumentFields from PD API | Fields in CountryProgrammeOutput model |
Comments |
---|---|---|
cp_output{id} | external_id | need to create this field #302 |
cp_output{title} | title | |
programme_document | FK to ProgrammeDocument by id ; change M2M between PD and CP Output #302 |
CountryProgrammeDocument
model by external_id
. Make sure to FK to new/updated Programme DocumentFields from PD API | Fields in LowerLevelOutput model |
Comments |
---|---|---|
expected_results{id} | external_id | need to create this field |
expected_results{title} | title | |
cp_output{title} | indicator | FK to CountryProgrammeOutput by id ; change field name to cp_output #302 |
is_cluster=True
THEN SKIP THIS STEP. IF is_cluster=False
THEN add/update Indicator BluePrint based on external_id
as shown below.Fields from PD API | Fields in IndicatorBlueprint model |
Comments |
---|---|---|
indicators{id} | external_id | need to create this field |
indicators{title} | title | |
indicators{type} | unit | |
disaggregatable | default to disaggregatable=True |
|
calculation_formula_across_periods | default to calculation_formula_across_periods=sum |
|
calculation_formula_across_locations | calculation_formula_across_locations=sum |
|
indicators{display_type} | display_type |
is_cluster=True
THEN use parent_id
in the PD API to check for id
in Reportable
and FK to the same blueprint
value. IF is_cluster=False
THEN add/update Reportable based on external_id
as shown below.Fields from PD API | Fields in Reportable model |
Comments |
---|---|---|
indicators{id} | external_id | need to create this field |
indicators{target} | target | |
indicators{baseline} | baseline | |
indicators{title} | means_of_verification | |
content_type | default to content_type=LowerLevelOutputs |
|
object_id | this should be equal to id of LowerLevelOutput |
|
is_cluster | is_cluster_indicator | |
parent_id | parent_indicator | IF is_cluster=True THEN FK to Reportable linked to the parent activity indicator |
blueprint | FK to IndicatorBlueprint by id |
|
indicators{parent_id} | parent_indicator | |
locations{} | locations | FK to Locations by pcode to all locations under this reportable |
is_cluster=True
THEN use parent_id
in the PD API to check for reportable
in Disaggregation
and FK the disaggregation record to this Reportable. IF is_cluster=False
THEN add/update Disaggregation based on external_id
as shown below.Fields from PD API | Fields in Disaggregation model |
Comments |
---|---|---|
disaggregation{id} | external_id | need to create this field |
disaggregation{name} | name | |
reportable | FK to Reportable by id ; make M2M #302 |
|
active | default to active=true |
is_cluster=True
THEN SKIP THIS STEP. IF is_cluster=False
THEN add/update Disaggregation Value based on external_id
as shown below.Fields from PD API | Fields in DisaggregationValue model |
Comments |
---|---|---|
parameter{id} | external_id | need to create this field |
parameter{name} | value | |
disaggregation | FK to Disaggregation by id |
|
active | active=true |
Can use https://github.com/unicef-polymer/etools-frontend-template for now for frontend...
Have 3-4 services with a compose file etc.
Can take code from https://github.com/unicef/etools-infra etc. as well. This repo will though have 3-4 services, each with folder/Dockerfile unlike other separate ones. Thanks.
When viewing a progress report, clicking the "Show PD/SSFA ToR Details" button should result in a modal with details as shown here: https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016133
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016144
Filters as in mockups at the top. "Show active PDs only" will only show indicators that belong to an active PD for this partner.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338349
Filters should be working very similar to how done in #33
Each output (there could be many) needs this form, and each could have $N indicators. Each should be collapsed by default.
API to say whether indicator data for this report is complete (show green checkmark) or not (show red "!").
This task should be done after #74
Smoke test
Unit tests
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016132
Shows all due and past submitted reports for this PD.
See #23 - except in this interface we just want filtering by status.
url can be /pd/$id/reports/
Potentially sufficient solution: https://github.com/PolymerElements/app-localize-behavior
for test that need session (probably all of them)
Set up creating user to session and self.client and others
something like this:
class BaseAPITestCase(APITestCase):
def setUp(self):
# Make all requests in the context of a logged in session.
admin, created = User.objects.get_or_create(username='admin', defaults={
'email': '[email protected]',
'is_superuser': True,
'is_staff': True
})
admin.set_password('Passw0rd!')
admin.save()
self.client = APIClient()
self.client.login(username='admin', password='Passw0rd!')
This solution should allow partners and unicef staff (IMO / PO's etc.) to login to PRP.
Details TBD.
think about removing
from future import absolute_import
Change unicode to str in models
Remove unnecessary params from super() method
Acceptance criteria
No major linting issues
Docker image for django_api switched to Python 3 base image?
Since identity solution will be in place in future, for this milestone be able to login with a test django user / password. This will assume the user is logged in as a partner user (the IP reporting use-case). This should enable the user to get access to whichever emergency / intervention this partner is associated with. Default to one with most PD's for now?
due_date - is an calculated parameter that should be (after talk with Sumit) implemented as a model filed instead of property. Will be updated probably by cron - need to specify this with Sumit.
btw.. we can also make a trigger/signal when IndicatorReport change and then calculate related PD
https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338351
One or more indicators (Reportables) showing. Expanding shows the indicator report and data for each location in that report for that progress/PD report.
Showing the table of data is to be done in #34
Filtering at the top will be handled in #33
#32 should follow this task (at a later time), since its a but more involved. I think for cleanliness it might be best to use different components, but same route? Can be decided.
For this task though route will probably be like /pd/$idX/report/$idY/data/
Backend API ----> /pd-report/$id/ should send back:
PR -> indicator reports -> reportables -> LLoutputs
Take this data and group by LLoutput.id.
{
// https://projects.invisionapp.com/share/RDBE0T04F#/screens/231338350
partner_contribution_to_date:,
funds_received_to_date:,
challenges_in_the_reporting_period:,
proposed_way_forward:,
'outputs':
[
{
id:
name:
status: {remarks:, report_status:}, // backend can just read this from first indicator report associated with this output
indicator_reports:
[
{id:, indicator_name:, target:, achieved:}, // indicator_name can be indicator serialized or comes from blueprint
{id:, indicator_name:, target:, achieved:}, // target comes from Reportable
{id:, indicator_name:, target:, achieved:}, // achieved comes from IndicatorReport.total
]
},
{
id:
name:
remarks:
report_status:
indicator_reports:
[
{id:, indicator_name:, target:, achieved:}, // indicator_name can be indicator serialized or comes from blueprint
{id:, indicator_name:, target:, achieved:}, // target comes from Reportable
{id:, indicator_name:, target:, achieved:}, // achieved comes from IndicatorReport.total
]
},
{
id:
name:
remarks:
report_status:
indicator_reports:
[
{id:, indicator_name:, target:, achieved:}, // indicator_name can be indicator serialized or comes from blueprint
{id:, indicator_name:, target:, achieved:}, // target comes from Reportable
{id:, indicator_name:, target:, achieved:}, // achieved comes from IndicatorReport.total
]
}
]
}
But NOT the actual data itself... that is in API in #21 and #34.
Based on reporting frequency required create indicator reports, their indicator location data's and progress report (IP reporting only) instances. They will not contain any data (but should probably have the correct JSON structure we have put in place for disaggregations), till the partner user enters the data for that time period.
The reports, location datas and progress reports should only be created at the end of the reporting period. So for example if reporting is monthly, and last IR is at June 3, 2017 then new one should get created for June 4-July 3, 2017 (assuming cron ran on July4). Something similar to this logic, please document in detail in the code as this might change a bit.
There are different reporting periods that need to be supported including some that are specific dates as well.
This can be achieved via a cron or celery-beat. A technical discussion will be helpful to determine best approach.
technical design
Please design this as a Django management command please for now.
Keep #164 in mind.
Please do a quick technical evaluation and ask any questions before any extended coding.
Don't create IndicatorReport if its Reportable belongs to ClusterActivity.
run a job every day to sync parts from /api/partners endpoint in eTools
Basic Steps
/api/partners
wher hidden=false
vendor_number
and either add new partners or update the info of existing partnersFields from /api/partners | Fields in partners model |
---|---|
vendor_number | vendor_number |
name | title |
short_name | short_title |
partner_type | partner_type |
cso_type | cso_type |
rating | rating |
shared_partner | shared_partner |
phone_number | phone_number |
total_ct_cp | total_ct_cp |
total_ct_cy | total_ct_cy |
Create few Django model classes based on the diagrams.
Related (maybe a dup?) to #287 #286 #285
Will need to expose API of all cluster activity indicators from PRP grouped by response plan, cluster and cluster activity indicators. This API will primarily be used in PMP to select an existing indicator from PRP by:
{
"response_plans": [{
"id": 983,
"title": "Response Plan 2017",
"clusters": [{
"id": 123,
"title": "WASH",
"cluster_indicators":[{
"id": 3298,
"title": "# of hand pumps distributed",
"is_cluster": "True",
"type": "quantity",
"display_type": "",
"reporting_frequency": "weekly",
"means_of_verification": "data should be collected by checking household",
"baseline": "50",
"target": "1000",
"locations": [{
"name": "beirut",
"pcode": "leb9183",
"location_type": "governorate"
},
{
"name": "tripoli",
"pcode": "leb8183",
"location_type": "governorate"
}]
}],
"disaggregation": [{
"id": 1371,
"prp_id": 234,
"name": "gender",
"parameter": [{
"id": 123,
"name": "male"
},
{
"id": 837,
"name": "female"
}]
},
{
"id": 8372,
"name": "age",
"parameter": [{
"id": 9272,
"name": "0-5y"
},
{
"id": 3618,
"name": "6-12y"
}]
}]
}]
}]
}
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016130
See filters up top. "Draft only" will show half done / completed (but started) PD reports for this partner. Some filters might be multi-select.
https://projects.invisionapp.com/share/RDBE0T04F#/screens/230016143
PUT request will update the data. Allowed only if progress report is NOT IN submitted status.
Ignore file upload for this task. To be done in #130
Lower level output narrative is captured here: #79 - not to be confused with this task.
Once DRF supports it as well.
Be able to generate fake data on development for the application to be usable / browsable etc. and for testing
UI can be similar to how eTools does it:
Will kick user to login screen if user clicks logout.
If they click "profile" then can show in a modal, basic profile details like name, email, and their "group" (role) in the PRP project.
Edit profile not needed.
Please test / make sure working for both cluster and IP reporting.
technical notes
To show the profile users profile details will be available via an API
/api/account/user-profile/
api/account/user-logout/
Please call a reset action on the redux store as well.
Etools uses this component: https://github.com/unicef-polymer/etools-profile-dropdown
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.