Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
amandine-sahl committed May 11, 2023
1 parent 69def69 commit 768b2ce
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 71 deletions.
38 changes: 29 additions & 9 deletions backend/gn_module_export/blueprint.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,9 @@ def __init__(self, session, **kwargs):
# exclusion du champ exports
form_excluded_columns = "exports"
# Nom de colonne user friendly
column_labels = dict(name_licence="Nom de la licence", url_licence="Description de la licence")
column_labels = dict(
name_licence="Nom de la licence", url_licence="Description de la licence"
)
# Description des colonnes
column_descriptions = dict(
name_licence="Nom de la licence",
Expand Down Expand Up @@ -196,7 +198,9 @@ def validate_form(self, form):
if is_form_submitted() and view_name and schema_name:
try:
if geometry_field.data and geometry_srid.data is None:
raise KeyError("Field Geometry SRID is mandatory with Geometry field")
raise KeyError(
"Field Geometry SRID is mandatory with Geometry field"
)

query = GenericQueryGeo(
DB,
Expand Down Expand Up @@ -256,7 +260,9 @@ def __init__(self, session, **kwargs):
}

if "EXPORTS" in current_app.config:
format_list = [(k, k) for k in current_app.config["EXPORTS"]["export_format_map"].keys()]
format_list = [
(k, k) for k in current_app.config["EXPORTS"]["export_format_map"].keys()
]
form_choices = {"format": format_list}


Expand Down Expand Up @@ -290,7 +296,8 @@ def swagger_ui(id_export=None):
return render_template(
"index.html",
API_ENDPOINT=(
current_app.config["API_ENDPOINT"] + current_app.config["EXPORTS"]["MODULE_URL"]
current_app.config["API_ENDPOINT"]
+ current_app.config["EXPORTS"]["MODULE_URL"]
),
id_export=id_export,
)
Expand Down Expand Up @@ -337,7 +344,9 @@ def swagger_ressources(id_export=None):
"/swagger/generic_swagger_doc.json",
export_nom=export.label,
export_description=export.desc,
export_path="{}/api/{}".format(current_app.config["EXPORTS"]["MODULE_URL"], id_export),
export_path="{}/api/{}".format(
current_app.config["EXPORTS"]["MODULE_URL"], id_export
),
export_parameters=export_parameters,
licence_nom=export.licence.name_licence,
licence_description=export.licence.url_licence,
Expand Down Expand Up @@ -381,15 +390,26 @@ def getOneExportThread(id_export, export_format):
status=500,
)

export_request = ExportRequest(id_export=id_export, id_role=user.id_role, format=export_format)
export_request = ExportRequest(
id_export=id_export, id_role=user.id_role, format=export_format
)

module_conf = current_app.config["EXPORTS"]
export_url = url_for(
"media",
filename=module_conf.get("usr_generated_dirname")
+ "/"
+ export_request.file_name,
_external=True,
)

generate_export.delay(
export_id=export_request.export.id,
file_name=export_request.generate_file_name(),
export_url=export_request.generate_url(),
export_url=export_url,
format=export_request.format,
id_role=filters,
filters=None,
id_role=user.id_role,
filters=filters,
)

return to_json_resp(
Expand Down
28 changes: 15 additions & 13 deletions backend/gn_module_export/commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from click import ClickException
from werkzeug.exceptions import NotFound

from flask import url_for, current_app
from gn_module_export.tasks import generate_export
from gn_module_export.models import Export, ExportSchedules
from gn_module_export.utils_export import ExportGenerationNotNeeded, ExportRequest
Expand All @@ -21,13 +22,13 @@
help="Générer un export de type planifié ou utilisateur.",
)
@click.option(
"--skip-newer-than",
type=int,
help="Ne pas regénérer les fichiers récents (en minutes).",
"--user_id",
default=None,
help="Identifiant de l'utilisateur.",
)
@click.argument("export_id")
@with_appcontext
def generate(export_id, export_format, scheduled, skip_newer_than):
def generate(export_id, export_format, scheduled, user_id):
"""
Lance la génération d’un fichier d’export
"""
Expand All @@ -38,20 +39,21 @@ def generate(export_id, export_format, scheduled, skip_newer_than):
.filter(ExportSchedules.format == export_format)
.first()
)

export_request = ExportRequest(
id_export=export_id,
export_schedule=export_schedule,
id_role=None,
format=export_format,
)
if export_request is None:
try:
export_request = ExportRequest(
id_export=export_id,
scheduled_export=export_schedule,
id_role=user_id,
format=export_format,
)
except NotFound:
raise ClickException(f"Export {export_id} not found.")

try:
generate_export(
export_id=export_request.export.id,
file_name=export_request.generate_file_name(),
export_url=export_request.generate_url(),
export_url=None,
format=export_request.format,
id_role=None,
filters=None,
Expand Down
2 changes: 1 addition & 1 deletion backend/gn_module_export/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def generate_scheduled_exports(self):
generate_export.delay(
export_id=export_request.export.id,
file_name=export_request.generate_file_name(),
export_url=export_request.generate_url(),
export_url=None,
format=export_request.format,
id_role=None,
filters=None,
Expand Down
66 changes: 18 additions & 48 deletions backend/gn_module_export/utils_export.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
from geonature.core.notifications.utils import dispatch_notifications
from .models import Export

from gn_module_export.utils.export import export_as_file


class ExportGenerationNotNeeded(Exception):
pass
Expand Down Expand Up @@ -56,7 +58,6 @@ def __init__(self, id_export, scheduled_export=None, id_role=None, format=None):
self.id_export = id_export
self.id_role = id_role
self.format = format
print(format)
self.export = Export.query.get_or_404(self.id_export)

if id_role and not self.export.has_instance_permission(id_role):
Expand All @@ -66,52 +67,33 @@ def __init__(self, id_export, scheduled_export=None, id_role=None, format=None):
self.format = scheduled_export.format
self.test_schedule_needded()

self.generate_file_name()

def generate_file_name(self):
if self.file_name:
return self.export_dir + self.file_name
return self.export_dir + "/" + self.file_name

conf = current_app.config.get("EXPORTS")
if self.id_role:
"""
Génération du nom horodaté du fichier d'export
"""
if not self.id_role:
self.export_dir = os.path.join(
current_app.config["MEDIA_FOLDER"],
conf.get("export_schedules_dir"),
)
self.file_name = "{}_{}.{}".format(
datetime.now().strftime("%Y_%m_%d_%Hh%Mm%S"),
removeDisallowedFilenameChars(self.export.label),
self.format,
self.file_name = "{}.{}".format(
removeDisallowedFilenameChars(self.export.label), self.format
)
else:
"""
Génération du nom statique du fichier d'export programmé
"""
self.export_dir = os.path.join(
current_app.config["MEDIA_FOLDER"], conf.get("usr_generated_dirname")
)
self.file_name = "{}.{}".format(
removeDisallowedFilenameChars(self.export.get("label")), self.format
self.file_name = "{}_{}.{}".format(
datetime.now().strftime("%Y_%m_%d_%Hh%Mm%S"),
removeDisallowedFilenameChars(self.export.label),
self.format,
)
print(self.file_name)
os.makedirs(self.export_dir, exist_ok=True)

return self.export_dir + self.file_name

def generate_url(self):
self.generate_file_name()
module_conf = current_app.config["EXPORTS"]
if module_conf.get("export_web_url"):
return "{}/{}".format(module_conf.get("export_web_url"), self.file_name)
else:
return url_for(
"media",
filename=module_conf.get("usr_generated_dirname")
+ "/"
+ self.file_name,
_external=True,
)
return self.export_dir + "/" + self.file_name

def test_schedule_needded(self):
self.generate_file_name()
Expand Down Expand Up @@ -143,31 +125,19 @@ def export_data_file(export_id, file_name, export_url, format, id_role, filters)
export = Export.query.get(export_id)

try:
full_file_name = GenerateExport(
query=export.get_view_query(limit=-1, offset=0, filters=None),
file_name=file_name,
format=format,
primary_key=None, # TODO change with PR 151
export_as_file(
export=export,
file_format=format,
filename=file_name,
generic_query_geo=export.get_view_query(limit=-1, offset=0, filters=None),
)
except Exception as exp:
notify_export_file_generated(
export=export, user=id_role, export_url=export_url, export_failed=True
)
raise exp

notify_export_file_generated(export=export, user=id_role, export_url=export_url)

return full_file_name


class GenerateExport:
"""
Classe permettant de générer un fichier d'export dans le format spécfié
"""

def __init__(self, query, file_name, format, primary_key):
print("TODO")


def clean_export_file(dir_to_del, nb_days):
"""
Expand Down

0 comments on commit 768b2ce

Please sign in to comment.