Skip to content

Commit

Permalink
Merge pull request #40 from SocialFinanceDigitalLabs/37-save-data-bet…
Browse files Browse the repository at this point in the history
…ween-views---use-scenarios

37 save data between views   use scenarios
  • Loading branch information
amynickolls committed May 1, 2024
2 parents aca9383 + f23eebb commit 4c0832d
Show file tree
Hide file tree
Showing 20 changed files with 448 additions and 195 deletions.
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ To load some dummy data, run:
python manage.py load-fixtures
```

This will load some users and some fake scenarios:
This will load some users:

**Regular user**
- email: [email protected]
Expand All @@ -39,6 +39,15 @@ This will load some users and some fake scenarios:
- password: test


## Delete Session Scenarios

To manage data transfer between views, users are assigned a session scenario. These scenarios should be deleted weekly through a recurrent job wherever the app is deployed.
To run this command:

```
python manage.py erase_session_scenarios
```

## Run

Run `python manage.py runserver` to access the regional demand model platform. it will be live at http://localhost:8000.
5 changes: 3 additions & 2 deletions dm_regional_app/admin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.contrib import admin

from .models import Scenario
from .models import SavedScenario, SessionScenario

admin.site.register(Scenario)
admin.site.register(SessionScenario)
admin.site.register(SavedScenario)

# Register your models here.
14 changes: 12 additions & 2 deletions dm_regional_app/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from django.contrib.auth.hashers import make_password
from faker import Faker

from dm_regional_app.models import Scenario
from dm_regional_app.models import SavedScenario

User = get_user_model()
DEFAULT_PASSWORD = "test"
Expand Down Expand Up @@ -43,12 +43,22 @@ def scenario(
user: Optional[User] = None,
name: Optional[str] = None,
description: Optional[str] = None,
historic_filters: Optional[str] = None,
prediction_filters: Optional[str] = None,
prediction_parameters: Optional[str] = None,
historic_stock: Optional[str] = None,
adjusted_costs: Optional[str] = None,
**kwargs,
):
scenario = Scenario.objects.create(
scenario = SavedScenario.objects.create(
user=user or self.user(),
name=name or self.fake.name(),
description=description or self.fake.text(),
historic_filters=historic_filters or self.fake.text(),
prediction_filters=prediction_filters or self.fake.text(),
prediction_parameters=prediction_parameters or self.fake.text(),
historic_stock=historic_stock or self.fake.text(),
adjusted_costs=adjusted_costs or self.fake.text(),
**kwargs,
)
return scenario
23 changes: 0 additions & 23 deletions dm_regional_app/fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,3 @@ def fixtures():
password="test",
superuser=True,
)

builder.scenario(
name="Scenario 1",
description="This is a test scenario",
user=user,
data={
"source": "sample://v1.zip",
"five to ten fostering": 100,
"five to ten residential": 100,
"ten to fifteen other": 100,
},
)
builder.scenario(
name="Scenario 2",
description="This is another test scenario",
user=user,
data={
"source": "sample://v1.zip",
"five to ten fostering": 300,
"five to ten residential": 200,
"ten to fifteen other": 200,
},
)
51 changes: 3 additions & 48 deletions dm_regional_app/forms.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import pandas as pd
from bootstrap_datepicker_plus.widgets import DatePickerInput
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Column, Layout, Row, Submit
Expand Down Expand Up @@ -56,9 +55,9 @@ class HistoricDataFilter(forms.Form):
)

def __init__(self, *args, **kwargs):
la_choices = kwargs.pop("la_choices")
placement_type_choices = kwargs.pop("placement_type_choices")
age_bin_choices = kwargs.pop("age_bin_choices")
la_choices = kwargs.pop("la")
placement_type_choices = kwargs.pop("placement_types")
age_bin_choices = kwargs.pop("age_bins")

super().__init__(*args, **kwargs)
self.fields["la"].choices = [(la, la) for la in la_choices]
Expand Down Expand Up @@ -86,47 +85,3 @@ def __init__(self, *args, **kwargs):
),
Submit("submit", "Filter"),
)

def filter_by_start_date(self, data: pd.DataFrame):
data = data.loc[data.DECOM.dt.date >= self.cleaned_data["start_date"]]
return data

def filter_by_end_date(self, data: pd.DataFrame):
data = data.loc[data.DEC.dt.date <= self.cleaned_data["end_date"]]
return data

def filter_by_la(self, data: pd.DataFrame):
if self.cleaned_data["la"] != []:
loc = data.LA.astype(str).isin(self.cleaned_data["la"])
data = data.loc[loc]
return data

def filter_by_placement_type(self, data: pd.DataFrame):
if self.cleaned_data["placement_types"] != []:
loc = data.placement_type.astype(str).isin(
self.cleaned_data["placement_types"]
)
data = data.loc[loc]
return data

def filter_by_age_bin(self, data: pd.DataFrame):
if self.cleaned_data["age_bins"] != []:
loc = data.age_bin.astype(str).isin(self.cleaned_data["age_bins"])
data = data.loc[loc]
return data

def filter_by_uasc(self, data: pd.DataFrame):
if self.cleaned_data["uasc"] == "True":
data = data.loc[data.UASC == True]
elif self.cleaned_data["uasc"] == "False":
data = data.loc[data.UASC == True]
return data

def apply_filters(self, data: pd.DataFrame):
data = self.filter_by_start_date(data)
data = self.filter_by_end_date(data)
data = self.filter_by_la(data)
data = self.filter_by_placement_type(data)
data = self.filter_by_age_bin(data)
data = self.filter_by_uasc(data)
return data
15 changes: 15 additions & 0 deletions dm_regional_app/management/commands/erase_session_scenarios.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from django.core.management.base import BaseCommand

from dm_regional_app.models import SessionScenario


class Command(BaseCommand):
help = "Erases all SessionScenario data weekly"

def handle(self, *args, **options):
# Delete all session scenario data. This command is set to run weekly at midnight on Sundays.
try:
SessionScenario.objects.all().delete()
self.stdout.write(self.style.SUCCESS("Data erased successfully."))
except Exception as e:
self.stdout.write(self.style.ERROR(f"Error: {e}"))
13 changes: 12 additions & 1 deletion dm_regional_app/management/commands/sandbox.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
from django.contrib.auth import get_user_model
from django.core.files.storage import default_storage
from django.core.management.base import BaseCommand
from django.shortcuts import get_object_or_404

from dm_regional_app.models import SavedScenario, SessionScenario
from ssda903 import (
Config,
DemandModellingDataContainer,
Expand All @@ -31,7 +33,16 @@ def handle(self, *args, **kwargs):
pop = PopulationStats(dc.enriched_view, config)

data = dc.enriched_view
print(data.loc[data.UASC == True])
# print(data.loc[data.UASC == True])

# print(pop.stock)
# print(dc.enriched_view)
session_scenario = get_object_or_404(SessionScenario, pk=1)
print(session_scenario.historic_filters)
print(type(session_scenario.historic_filters))

"""
for key, value in session_scenario.historic_filters.items():
print(key, value)
"""
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# Generated by Django 4.2.10 on 2024-04-24 15:30

import django.core.serializers.json
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models

import dm_regional_app.utils


class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("dm_regional_app", "0002_profile"),
]

operations = [
migrations.CreateModel(
name="SavedScenario",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"historic_filters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"prediction_filters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"prediction_parameters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"historic_stock",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"adjusted_costs",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
("name", models.CharField(max_length=255)),
("description", models.TextField(blank=True, null=True)),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
migrations.CreateModel(
name="SessionScenario",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
(
"historic_filters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"prediction_filters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"prediction_parameters",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"historic_stock",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"adjusted_costs",
models.JSONField(
decoder=dm_regional_app.utils.DateAwareJSONDecoder,
encoder=django.core.serializers.json.DjangoJSONEncoder,
),
),
(
"saved_scenario",
models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="dm_regional_app.savedscenario",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
migrations.DeleteModel(
name="Scenario",
),
]
Loading

0 comments on commit 4c0832d

Please sign in to comment.