From 3b8d694cac9e5ef9dd0728d338b4a97cd18cd5e3 Mon Sep 17 00:00:00 2001
From: Remco Tukker <remco.tukker@geant.org>
Date: Thu, 29 Jun 2023 15:35:32 +0200
Subject: [PATCH] start of conversion script

---
 compendium_v2/conversion/__init__.py   |   0
 compendium_v2/conversion/conversion.py | 149 +++++++++++++++++++++++++
 setup.py                               |   1 +
 3 files changed, 150 insertions(+)
 create mode 100644 compendium_v2/conversion/__init__.py
 create mode 100644 compendium_v2/conversion/conversion.py

diff --git a/compendium_v2/conversion/__init__.py b/compendium_v2/conversion/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/compendium_v2/conversion/conversion.py b/compendium_v2/conversion/conversion.py
new file mode 100644
index 00000000..bdd8d96a
--- /dev/null
+++ b/compendium_v2/conversion/conversion.py
@@ -0,0 +1,149 @@
+"""
+conversion
+=========================
+
+This module loads the survey data from 2022 from the survey database
+and stores the data in the json structure of the new survey, so that
+it can be used to prefill the 2023 survey.
+
+"""
+import logging
+import click
+
+from sqlalchemy import delete, text, select
+
+import compendium_v2
+from compendium_v2.environment import setup_logging
+from compendium_v2.db import db
+from compendium_v2.config import load
+from compendium_v2.survey_db import model as survey_model
+from compendium_v2.db.model import NREN
+from compendium_v2.db.survey_model import Survey, SurveyResponse
+
+setup_logging()
+
+logger = logging.getLogger('conversion')
+
+
+ANSWERS_2022_QUERY = """
+SELECT question_id, value
+FROM answers a
+WHERE nren_id = {}
+      AND value NOT IN ('""', '[]', '"NA"', '"N/A"', '[""]', '["-"]', '["/"]')
+      AND NOT EXISTS (SELECT 1 FROM answers a2 WHERE a.question_id = a2.question_id AND a.nren_id = a2.nren_id AND a2.id > a.id)
+      AND question_id IN (16402,16405,16406,16407,16408,16409,16410,16413,16414,16416,16417,16418,16419,16420,16422,16426,16429,16430,16432,16433,16434,16435,16438,16439,16446,16448,16449,
+                          16450,16451,16452,16453,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,
+                          16480,16481,16482,16483,16484,16485,16486,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16499,16500,16501,16502,16503,16504,16760,16761,16762,16763,
+                          16507,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,
+                          16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,
+                          16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,
+                          16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16613,16614,16615,16616,16617,16618,16619,
+                          16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16646,16647,16648,16649,
+                          16650,16652,16653,16654,16656,16658,16659,16662,16663,16664,16665,16666,16667,16668,16669,16670,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,
+                          16683,16684,16685,16687,16688,16689,16691,16692,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,
+                          16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,
+                          16740,16741,16742,16743,16744,16746,16747,16748,16749,16750,16752,16753,16754,16755,16756,16757,16758);
+"""
+
+NREN_IDS = {
+    "ANAS": 49,
+    "GRNET": 17,
+    "Restena": 28,
+    "University of Malta": 29,
+    "DeiC": 9,
+    "CSC": 12,
+    "Sikt": 33,
+    "ACOnet": 4,
+    "AMRES": 48,
+    "ARNES": 39,
+    "ASNET-AM": 200,
+    "BASNET": 54,
+    "Belnet": 5,
+    "BREN": 58,
+    "CARNET": 6,
+    "CESNET": 8,
+    "CYNET": 7,
+    "DFN": 16,
+    "EENet": 11,
+    "FCCN": 35,
+    "GARR": 23,
+    "GRENA": 15,
+    "HEAnet": 21,
+    "IUCC": 22,
+    "Jisc": 46,
+    "KIFU": 18,
+    "LAT": 51,
+    "LITNET": 27,
+    "MARnet": 14,
+    "MREN": 100,
+    "PIONIER": 34,
+    "RASH": 1,
+    "RedIRIS": 40,
+    "RENAM": 30,
+    "RENATER": 13,
+    "RHnet": 19,
+    "RoEduNet": 52,
+    "SANET": 38,
+    "SUNET": 41,
+    "SURF": 32,
+    "SWITCH": 42,
+    "ULAKBIM": 44,
+    "URAN": 45,
+}
+
+
+
+def query_nren(nren_id: int):
+    query = ANSWERS_2022_QUERY.format(nren_id)
+    answers = {}
+    for row in db.session.execute(text(query), bind_arguments={'bind': db.engines[survey_model.SURVEY_DB_BIND]}):
+        answers[row[0]] = row[1]
+    return answers
+
+
+def _cli(app):
+    with app.app_context():
+
+        nren_surveys = {}
+
+        for nren in db.session.scalars(select(NREN)):
+            survey_db_nren_id = NREN_IDS[nren.name]
+            nren_surveys[nren] = query_nren(survey_db_nren_id)
+
+        db.session.execute(delete(SurveyResponse).where(
+            SurveyResponse.survey_year == 2022
+        ))
+
+        db.session.execute(delete(Survey).where(
+            Survey.year == 2022
+        ))
+
+        survey = Survey(year=2022, survey={})
+        db.session.add(survey)
+
+        for nren, answers in nren_surveys.items():
+            response = SurveyResponse(
+                nren=nren,
+                nren_id=nren.id,
+                survey_year=2022,
+                survey=survey,
+                answers=answers  # TODO structure should be different
+            )
+            db.session.add(response)
+
+        db.session.commit()
+
+
+@click.command()
+@click.option('--config', type=click.STRING, default='config.json')
+def cli(config):
+    app_config = load(open(config, 'r'))
+
+    app_config['SQLALCHEMY_BINDS'] = {survey_model.SURVEY_DB_BIND: app_config['SURVEY_DATABASE_URI']}
+
+    app = compendium_v2._create_app_with_db(app_config)
+    _cli(app)
+
+
+if __name__ == "__main__":
+    cli()
diff --git a/setup.py b/setup.py
index 87daee04..6d982c18 100644
--- a/setup.py
+++ b/setup.py
@@ -28,6 +28,7 @@ setup(
         'console_scripts': [
             'survey-publisher-v1=compendium_v2.publishers.survey_publisher_v1:cli',  # noqa
             'survey-publisher-2022=compendium_v2.publishers.survey_publisher_2022:cli',  # noqa
+            'conversion=compendium_v2.conversion.conversion:cli',  # noqa
         ]
     }
 )
-- 
GitLab