Skip to content
Snippets Groups Projects
Commit 047a070c authored by Remco Tukker's avatar Remco Tukker
Browse files

first version of v2 publisher

parent caab071d
Branches
Tags
1 merge request!77Feature/comp 276 publisher v2
from decimal import Decimal
from sqlalchemy import delete, select
from compendium_v2.db import db
from compendium_v2.db.model import BudgetEntry, ChargingStructure, ECProject, FeeType, FundingSource, InstitutionURLs,\
NrenStaff, ParentOrganization, Policy, SubOrganization, TrafficVolume
from compendium_v2.db.survey_model import ResponseStatus, SurveyResponse
def map_2023(year, nren, answers):
for table_class in [BudgetEntry, ChargingStructure, ECProject, FundingSource, InstitutionURLs,
NrenStaff, ParentOrganization, Policy, SubOrganization, TrafficVolume]:
db.session.execute(delete(table_class).where(table_class.year == 2023))
answers = answers["data"]
budget = answers.get("budget")
if budget:
db.session.add(BudgetEntry(nren_id=nren.id, nren=nren, year=year, budget=Decimal(budget)))
funding_source = answers.get("income_sources")
if funding_source:
db.session.add(FundingSource(
nren_id=nren.id, nren=nren, year=year,
client_institutions=Decimal(funding_source.get("client_institutions", 0)),
european_funding=Decimal(funding_source.get("european_funding", 0)),
gov_public_bodies=Decimal(funding_source.get("gov_public_bodies", 0)),
commercial=Decimal(funding_source.get("commercial", 0)),
other=Decimal(funding_source.get("other", 0))
))
charging = answers.get("charging_mechanism")
if charging:
db.session.add(ChargingStructure(nren_id=nren.id, nren=nren, year=year, fee_type=FeeType[charging]))
staff_roles = answers.get("staff_roles", {})
staff_employment_type = answers.get("staff_employment_type", {})
if staff_roles or staff_employment_type:
db.session.add(NrenStaff(
nren_id=nren.id, nren=nren, year=year,
permanent_fte=Decimal(staff_employment_type.get("permanent_fte", 0)),
subcontracted_fte=Decimal(staff_employment_type.get("subcontracted_fte", 0)),
technical_fte=Decimal(staff_roles.get("technical_fte", 0)),
non_technical_fte=Decimal(staff_roles.get("nontechnical_fte", 0))
))
parent = answers.get("parent_organization_name")
if parent:
db.session.add(ParentOrganization(nren_id=nren.id, nren=nren, year=year, organization=parent))
subs = answers.get("suborganization_details")
if subs:
for sub in subs:
db.session.add(SubOrganization(
nren_id=nren.id, nren=nren, year=year,
organization=sub.get("suborganization_name"),
role=sub.get("suborganization_role") # TODO handle 'other' option properly
))
ec_projects = answers.get("ec_project_names")
if ec_projects:
for ec_project in ec_projects:
db.session.add(ECProject(nren_id=nren.id, nren=nren, year=year, project=ec_project.get("ec_project_name")))
strategy = answers.get("corporate_strategy_url", "")
policies = answers.get("policies", {})
if strategy or policies:
db.session.add(Policy(
nren_id=nren.id, nren=nren, year=year,
strategic_plan=strategy,
environmental=policies.get("environmental_policy", {}).get("url", ""),
equal_opportunity=policies.get("equal_opportunity_policy", {}).get("url", ""),
connectivity=policies.get("connectivity_policy", {}).get("url", ""),
acceptable_use=policies.get("acceptable_use_policy", {}).get("url", ""),
privacy_notice=policies.get("privacy_notice", {}).get("url", ""),
data_protection=policies.get("data_protection_contact", {}).get("url", "")
# TODO gender_equality_policy missing?
))
traffic_estimate = answers.get("traffic_estimate")
if traffic_estimate:
db.session.add(TrafficVolume(
nren_id=nren.id, nren=nren, year=year,
strategic_plan=strategy,
to_customers=Decimal(traffic_estimate.get("to_customers")),
from_customers=Decimal(traffic_estimate.get("from_customers")),
to_external=Decimal(traffic_estimate.get("to_external")),
from_external=Decimal(traffic_estimate.get("from_external")),
))
institution_urls = answers.get("connected_sites_lists")
if institution_urls:
db.session.add(InstitutionURLs(
nren_id=nren.id, nren=nren, year=year,
urls=institution_urls,
))
def publish(year):
responses = db.session.scalars(
select(SurveyResponse).where(SurveyResponse.survey_year == year)
.where(SurveyResponse.status == ResponseStatus.completed)
).unique()
question_mapping = {
2023: map_2023
}
mapping_function = question_mapping[year]
for response in responses:
mapping_function(year, response.nren, response.answers)
...@@ -8,6 +8,7 @@ from sqlalchemy.orm import joinedload, load_only ...@@ -8,6 +8,7 @@ from sqlalchemy.orm import joinedload, load_only
from compendium_v2.db import db from compendium_v2.db import db
from compendium_v2.db.model import NREN, PreviewYear from compendium_v2.db.model import NREN, PreviewYear
from compendium_v2.db.survey_model import Survey, SurveyResponse, SurveyStatus, RESPONSE_NOT_STARTED from compendium_v2.db.survey_model import Survey, SurveyResponse, SurveyStatus, RESPONSE_NOT_STARTED
from compendium_v2.publishers.survey_publisher_v2 import publish
from compendium_v2.routes import common from compendium_v2.routes import common
from compendium_v2.auth.session_management import admin_required from compendium_v2.auth.session_management import admin_required
...@@ -195,7 +196,10 @@ def preview_survey(year) -> Any: ...@@ -195,7 +196,10 @@ def preview_survey(year) -> Any:
if survey.status not in [SurveyStatus.closed, SurveyStatus.preview]: if survey.status not in [SurveyStatus.closed, SurveyStatus.preview]:
return {'message': 'Survey is not closed or in preview and can therefore not be published for preview'}, 400 return {'message': 'Survey is not closed or in preview and can therefore not be published for preview'}, 400
# TODO call new survey_publisher with all completed responses and the year if year < 2023:
return {'message': 'The 2023 survey is the first that can be published from this application'}, 400
publish(year)
preview = db.session.scalar(select(PreviewYear).where(PreviewYear.year == year)) preview = db.session.scalar(select(PreviewYear).where(PreviewYear.year == year))
if not preview: if not preview:
...@@ -223,7 +227,10 @@ def publish_survey(year) -> Any: ...@@ -223,7 +227,10 @@ def publish_survey(year) -> Any:
if survey.status not in [SurveyStatus.preview, SurveyStatus.published]: if survey.status not in [SurveyStatus.preview, SurveyStatus.published]:
return {'message': 'Survey is not in preview or published and can therefore not be published'}, 400 return {'message': 'Survey is not in preview or published and can therefore not be published'}, 400
# TODO call new survey_publisher with all completed responses and the year if year < 2023:
return {'message': 'The 2023 survey is the first that can be published from this application'}, 400
publish(year)
db.session.execute(delete(PreviewYear).where(PreviewYear.year == year)) db.session.execute(delete(PreviewYear).where(PreviewYear.year == year))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment