Skip to content

Commit d843334

Browse files
authored
Merge pull request #1080 from MTES-MCT/staging
MEP v9
2 parents ae6fa68 + 551546e commit d843334

436 files changed

Lines changed: 9992 additions & 10947 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.env.example

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,5 @@ DEBUG_TOOLBAR=1
5252

5353
GOOGLE_ADWORDS_ACTIVATE=1
5454
DB_LOGGING_LEVEL=WARNING
55+
56+
TWO_FACTOR_ENABLED=1

.github/workflows/deploy_airflow.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,19 @@ jobs:
99
name: Deploy
1010
runs-on: ubuntu-latest
1111
steps:
12-
- name: executing remote ssh git pull
12+
- name: Git pull
1313
uses: appleboy/ssh-action@master
1414
with:
1515
host: ${{ secrets.AIRFLOW_SSH_HOST }}
1616
username: ${{ secrets.AIRFLOW_SSH_USER }}
1717
key: ${{ secrets.AIRFLOW_SSH_KEY }}
1818
port: ${{ secrets.AIRFLOW_SSH_PORT }}
1919
script: cd ~/sparte && git pull
20+
- name: Generate DBT docs
21+
uses: appleboy/ssh-action@master
22+
with:
23+
host: ${{ secrets.AIRFLOW_SSH_HOST }}
24+
username: ${{ secrets.AIRFLOW_SSH_USER }}
25+
key: ${{ secrets.AIRFLOW_SSH_KEY }}
26+
port: ${{ secrets.AIRFLOW_SSH_PORT }}
27+
script: cd ~/sparte/airflow/include/sql/sparte && dbt docs generate --static

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,6 @@
3434
"[typescriptreact]": {
3535
"editor.defaultFormatter": "esbenp.prettier-vscode"
3636
},
37+
"dbt.perspectiveTheme": "Vintage",
3738
}
3839

Pipfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,6 @@ setuptools = "*"
7171
py7zr = "*"
7272
dependency-injector = "*"
7373
django-webpack-loader = "*"
74+
django-two-factor-auth = "*"
75+
qrcode = "*"
76+
phonenumbers = "*"

Pipfile.lock

Lines changed: 511 additions & 470 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

airflow/.astro/test_dag_integrity_default.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from contextlib import contextmanager
66

77
import pytest
8+
89
from airflow.hooks.base import BaseHook
910
from airflow.models import Connection, DagBag, Variable
1011
from airflow.utils.db import initdb

airflow/.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,5 @@ __pycache__/
66
astro
77
.venv
88
airflow-webserver.pid
9-
webserver_config.py
109
airflow.cfg
1110
airflow.db

airflow/dags/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .data_gouv import * # noqa: F403, F401

airflow/dags/backup_dbt_db.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
from datetime import datetime, timedelta
2+
from os import getenv
3+
4+
from include.container import Container
5+
6+
from airflow import DAG
7+
from airflow.operators.bash import BashOperator
8+
from airflow.operators.python import PythonOperator
9+
10+
default_args = {
11+
"owner": "Alexis Athlani",
12+
"depends_on_past": False,
13+
"email_on_failure": True,
14+
"email_on_retry": False,
15+
"retries": 1,
16+
"retry_delay": timedelta(minutes=5),
17+
}
18+
19+
DB_HOST = getenv("DBT_DB_HOST")
20+
DB_PORT = getenv("DBT_DB_PORT")
21+
DB_NAME = getenv("DBT_DB_NAME")
22+
DB_USER = getenv("DBT_DB_USER")
23+
DB_PASSWORD = getenv("DBT_DB_PASSWORD")
24+
25+
26+
def upload_to_s3(local_file: str, s3_file: str) -> str:
27+
bucket_name = "airflow-staging"
28+
path_on_bucket = f"{bucket_name}/{s3_file}"
29+
30+
s3 = Container().s3()
31+
s3.put(local_file, path_on_bucket)
32+
33+
print(f"Upload réussi : {path_on_bucket}")
34+
return path_on_bucket
35+
36+
37+
with DAG(
38+
"backup_dbt_staging_db",
39+
default_args=default_args,
40+
description="Sauvegarde hebdomadaire de la base staging DBT vers S3",
41+
schedule_interval="0 1 * * 0", # Tous les dimanches à 1h du matin
42+
start_date=datetime(2024, 1, 1),
43+
catchup=False,
44+
) as dag:
45+
backup_date = "{{ ds_nodash }}"
46+
backup_filename = f"{DB_NAME}_backup_{backup_date}.dump"
47+
backup_path = f"/tmp/{backup_filename}"
48+
49+
create_backup = BashOperator(
50+
task_id="create_backup",
51+
bash_command=f'PGPASSWORD="{DB_PASSWORD}" pg_dump -Fc -O -h {DB_HOST} -p {DB_PORT} -U {DB_USER} -d {DB_NAME} > {backup_path}', # noqa E501
52+
)
53+
54+
upload_backup = PythonOperator(
55+
task_id="upload_to_s3",
56+
python_callable=upload_to_s3,
57+
op_kwargs={"local_file": backup_path, "s3_file": f"backup/{DB_NAME}/{backup_filename}"},
58+
)
59+
60+
cleanup = BashOperator(
61+
task_id="cleanup",
62+
bash_command=f"rm {backup_path}",
63+
)
64+
65+
create_backup >> upload_backup >> cleanup

airflow/dags/create_ocsge_vector_tiles.py

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1+
import json
2+
13
import pendulum
4+
from include.domain.container import Container
5+
from include.utils import multiline_string_to_single_line
6+
27
from airflow.decorators import dag, task
38
from airflow.exceptions import AirflowSkipException
49
from airflow.models.param import Param
5-
from include.domain.container import Container
10+
11+
with open("include/domain/data/ocsge/sources.json", "r") as f:
12+
sources = json.load(f)
613

714

8-
def get_geojson_filename(year: int, departement: str) -> str:
9-
return f"occupation_du_sol_{year}_{departement}.geojson"
15+
def get_geojson_filename(index: int, departement: str) -> str:
16+
return f"occupation_du_sol_{index}_{departement}.geojson"
1017

1118

12-
def get_pmtiles_filename(year: int, departement: str) -> str:
13-
return f"occupation_du_sol_{year}_{departement}.pmtiles"
19+
def get_pmtiles_filename(index: int, departement: str) -> str:
20+
return f"occupation_du_sol_{index}_{departement}.pmtiles"
1421

1522

1623
@dag(
@@ -23,8 +30,8 @@ def get_pmtiles_filename(year: int, departement: str) -> str:
2330
tags=["OCS GE"],
2431
max_active_tasks=10,
2532
params={
26-
"year": Param(2018, type="integer"),
27-
"departement": Param("75", type="string"),
33+
"index": Param(1, type="integer", enum=[1, 2]),
34+
"departement": Param("75", type="string", enum=list(sources.keys())),
2835
"refresh_existing": Param(False, type="boolean"),
2936
},
3037
)
@@ -36,35 +43,55 @@ def create_ocsge_vector_tiles():
3643
def check_if_vector_tiles_not_exist(params: dict):
3744
if params.get("refresh_existing"):
3845
return
39-
year = params.get("year")
46+
index = params.get("index")
4047
departement = params.get("departement")
41-
filename = get_pmtiles_filename(year, departement)
48+
filename = get_pmtiles_filename(index, departement)
4249
exists = Container().s3().exists(f"{bucket_name}/{vector_tiles_dir}/{filename}")
4350
if exists:
4451
raise AirflowSkipException("Vector tiles already exist")
4552

4653
@task.python(trigger_rule="none_skipped")
4754
def postgis_to_geojson(params: dict):
48-
year = params.get("year")
55+
index = params.get("index")
4956
departement = params.get("departement")
50-
filename = get_geojson_filename(year, departement)
57+
filename = get_geojson_filename(index, departement)
58+
59+
sql = f"""
60+
SELECT
61+
id,
62+
code_cs,
63+
code_us,
64+
departement,
65+
year,
66+
index,
67+
is_impermeable,
68+
is_artificial,
69+
critere_seuil,
70+
st_transform(geom, 4326) as geom,
71+
surface
72+
FROM
73+
public_ocsge.occupation_du_sol_with_artif
74+
WHERE
75+
index = {index} and
76+
departement = '{departement}'
77+
"""
5178

5279
return (
5380
Container()
5481
.sql_to_geojsonseq_on_s3_handler()
5582
.export_sql_result_to_geojsonseq_on_s3(
56-
sql=f"SELECT * FROM public_ocsge.occupation_du_sol WHERE year = {year} and departement = '{departement}'", # noqa: E501
83+
sql=multiline_string_to_single_line(sql), # noqa: E501
5784
s3_key=f"{vector_tiles_dir}/{filename}",
5885
s3_bucket=bucket_name,
5986
)
6087
)
6188

6289
@task.bash(skip_on_exit_code=110, trigger_rule="none_skipped")
6390
def geojson_to_pmtiles(params: dict):
64-
year = params.get("year")
91+
index = params.get("index")
6592
departement = params.get("departement")
66-
geojson_filename = get_geojson_filename(year, departement)
67-
pmtiles_filename = get_pmtiles_filename(year, departement)
93+
geojson_filename = get_geojson_filename(index, departement)
94+
pmtiles_filename = get_pmtiles_filename(index, departement)
6895
local_input = f"/tmp/{geojson_filename}"
6996
local_output = f"/tmp/{pmtiles_filename}"
7097
Container().s3().get_file(f"{bucket_name}/{vector_tiles_dir}/{geojson_filename}", local_input)
@@ -87,25 +114,25 @@ def geojson_to_pmtiles(params: dict):
87114

88115
@task.python(trigger_rule="none_skipped")
89116
def upload(params: dict):
90-
year = params.get("year")
117+
index = params.get("index")
91118
departement = params.get("departement")
92-
pmtiles_filename = get_pmtiles_filename(year, departement)
119+
pmtiles_filename = get_pmtiles_filename(index, departement)
93120
local_path = f"/tmp/{pmtiles_filename}"
94121
path_on_s3 = f"{bucket_name}/{vector_tiles_dir}/{pmtiles_filename}"
95122
Container().s3().put(local_path, path_on_s3)
96123

97124
@task.bash(trigger_rule="none_skipped")
98125
def delete_geojson_file(params: dict):
99-
year = params.get("year")
126+
index = params.get("index")
100127
departement = params.get("departement")
101-
geojson_filename = get_geojson_filename(year, departement)
128+
geojson_filename = get_geojson_filename(index, departement)
102129
return f"rm /tmp/{geojson_filename}"
103130

104131
@task.bash(trigger_rule="none_skipped")
105132
def delete_pmtiles_file(params: dict):
106-
year = params.get("year")
133+
index = params.get("index")
107134
departement = params.get("departement")
108-
pmtiles_filename = get_pmtiles_filename(year, departement)
135+
pmtiles_filename = get_pmtiles_filename(index, departement)
109136
return f"rm /tmp/{pmtiles_filename}"
110137

111138
(

0 commit comments

Comments
 (0)