diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2023-02-08 23:51:46 +0100 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2023-02-08 23:51:46 +0100 | 
| commit | db470d5f6f9c543a105ef34553beaa74870c3fa8 (patch) | |
| tree | ad8d0283faa85ff3e613ba931ce82229621ca2b3 | |
| parent | 94f2f0758a79f797233cfd7e7db241e3eca2e700 (diff) | |
| download | fietsboek-db470d5f6f9c543a105ef34553beaa74870c3fa8.tar.gz fietsboek-db470d5f6f9c543a105ef34553beaa74870c3fa8.tar.bz2 fietsboek-db470d5f6f9c543a105ef34553beaa74870c3fa8.zip  | |
fix transformer handling when uploading a file
| -rw-r--r-- | fietsboek/actions.py | 39 | ||||
| -rw-r--r-- | fietsboek/models/track.py | 3 | ||||
| -rw-r--r-- | fietsboek/templates/edit_form.jinja2 | 2 | ||||
| -rw-r--r-- | fietsboek/transformers/__init__.py | 28 | ||||
| -rw-r--r-- | fietsboek/views/upload.py | 3 | ||||
| -rw-r--r-- | tests/playwright/conftest.py | 1 | ||||
| -rw-r--r-- | tests/playwright/test_basic.py | 4 | 
7 files changed, 53 insertions, 27 deletions
diff --git a/fietsboek/actions.py b/fietsboek/actions.py index 350faaf..7a69913 100644 --- a/fietsboek/actions.py +++ b/fietsboek/actions.py @@ -16,7 +16,9 @@ from pyramid.request import Request  from sqlalchemy import select  from sqlalchemy.orm.session import Session -from . import models, transformers, util +from . import models +from . import transformers as mod_transformers +from . import util  from .data import DataManager  from .models.track import TrackType, Visibility @@ -35,6 +37,7 @@ def add_track(      badges: List[models.Badge],      tagged_people: List[models.User],      tags: List[str], +    transformers: list[mod_transformers.Transformer],      gpx_data: bytes,  ) -> models.Track:      """Adds a track to the database. @@ -56,6 +59,7 @@ def add_track(      :param badges: Badges to attach to the track.      :param tagged_people: List of people to tag.      :param tags: List of text tags for the track. +    :param transformers: List of :class:`~fietsboek.transformers.Transformer` to apply.      :param gpx_data: Actual GPX data (uncompressed, straight from the source).      :return: The track object that has been inserted into the database. Useful          for its ``id`` attribute. @@ -88,6 +92,12 @@ def add_track(      manager.compress_gpx(gpx_data)      manager.backup() +    gpx = gpxpy.parse(gpx_data) +    for transformer in transformers: +        LOGGER.debug("Running %s with %r", transformer, transformer.parameters) +        transformer.execute(gpx) +    track.transformers = [[tfm.identifier(), tfm.parameters.dict()] for tfm in transformers] +      manager.engrave_metadata(          title=track.title,          description=track.description, @@ -170,23 +180,9 @@ def execute_transformers(request: Request, track: models.Track):      # pylint: disable=too-many-locals      LOGGER.debug("Executing transformers for %d", track.id) -    settings = [] -    for tfm in transformers.list_transformers(): -        ident = tfm.identifier() -        prefix = f"transformer[{ident}]" -        req_params = {} -        for name, val in request.params.items(): -            if name.startswith(prefix): -                name = name[len(prefix) :] -                name = name.strip("[]") -                req_params[name] = val - -        if req_params.get("") == "on": -            params = tfm().parameters -            params.read_from_request(req_params) -            settings.append((ident, params)) - -    serialized = [[tfm_id, params.dict()] for tfm_id, params in settings] +    settings = mod_transformers.extract_from_request(request) + +    serialized = [[tfm.identifier(), tfm.parameters.dict()] for tfm in settings]      if serialized == track.transformers:          LOGGER.debug("Applied transformations mach on %d, skipping", track.id)          return @@ -199,11 +195,8 @@ def execute_transformers(request: Request, track: models.Track):      gpx_bytes = brotli.decompress(gpx_bytes)      gpx = gpxpy.parse(gpx_bytes) -    tfms = {tfm.identifier(): tfm for tfm in transformers.list_transformers()} -    for tfm_id, params in settings: -        transformer = tfms[tfm_id]() -        transformer.parameters = params -        LOGGER.debug("Running %s with %r", transformer, params) +    for transformer in settings: +        LOGGER.debug("Running %s with %r", transformer, transformer.parameters)          transformer.execute(gpx)      LOGGER.debug("Saving transformed file for %d", track.id) diff --git a/fietsboek/models/track.py b/fietsboek/models/track.py index a7217bf..9342cff 100644 --- a/fietsboek/models/track.py +++ b/fietsboek/models/track.py @@ -415,6 +415,9 @@ class Track(Base):          :param transformer_id: The string ID of the transformer.          :return: The settings as a dictionary.          """ +        if not self.transformers: +            return None +          for t_id, settings in self.transformers:              if t_id == transformer_id:                  return settings diff --git a/fietsboek/templates/edit_form.jinja2 b/fietsboek/templates/edit_form.jinja2 index 491db98..8f6e092 100644 --- a/fietsboek/templates/edit_form.jinja2 +++ b/fietsboek/templates/edit_form.jinja2 @@ -155,7 +155,7 @@      </div>      <div id="transformer-{{ loop.index}}" class="accordion-collapse collapse" aria-labelledby="transformer-heading-{{ loop.index }}">        <div class="accordion-body"> -        {% set params = track.transformer_params_for(transformer.identifier()) %} +        {% set params = track.transformer_params_for(transformer.identifier()) if track else None %}          <!-- Short transformer description -->          <p>{{ _(transformer.description()) }}</p> diff --git a/fietsboek/transformers/__init__.py b/fietsboek/transformers/__init__.py index 1a9517e..b22c492 100644 --- a/fietsboek/transformers/__init__.py +++ b/fietsboek/transformers/__init__.py @@ -17,6 +17,7 @@ from gpxpy.gpx import GPX  from markupsafe import Markup  from pydantic import BaseModel  from pyramid.i18n import TranslationString +from pyramid.request import Request  _ = TranslationString @@ -157,4 +158,31 @@ def list_transformers() -> list[type[Transformer]]:      ] +def extract_from_request(request: Request) -> list[Transformer]: +    """Extracts the list of transformers to execute from the given request. + +    Note that this sets up the transformers with the right parameters. + +    :param request: The pyramid request. +    :return: The list of prepared transformers. +    """ +    transformers = [] +    for tfm in list_transformers(): +        ident = tfm.identifier() +        prefix = f"transformer[{ident}]" +        req_params = {} +        for name, val in request.params.items(): +            if name.startswith(prefix): +                name = name[len(prefix) :] +                name = name.strip("[]") +                req_params[name] = val + +        if req_params.get("") == "on": +            instance = tfm() +            instance.parameters.read_from_request(req_params) +            transformers.append(instance) + +    return transformers + +  __all__ = ["Parameters", "Transformer", "list_transformers"] diff --git a/fietsboek/views/upload.py b/fietsboek/views/upload.py index e172339..15fa990 100644 --- a/fietsboek/views/upload.py +++ b/fietsboek/views/upload.py @@ -9,7 +9,7 @@ from pyramid.response import Response  from pyramid.view import view_config  from sqlalchemy import select -from .. import actions, models, util +from .. import actions, models, transformers, util  from ..models.track import TrackType, Visibility  LOGGER = logging.getLogger(__name__) @@ -170,6 +170,7 @@ def do_finish_upload(request):          tagged_people=tagged_people,          date=date,          tags=request.params.getall("tag[]"), +        transformers=transformers.extract_from_request(request),          gpx_data=upload.gpx_data,      )      request.dbsession.delete(upload) diff --git a/tests/playwright/conftest.py b/tests/playwright/conftest.py index 18b7ad0..f57aca7 100644 --- a/tests/playwright/conftest.py +++ b/tests/playwright/conftest.py @@ -126,6 +126,7 @@ class Helper:                  tags=[],                  badges=[],                  tagged_people=[], +                transformers=[],                  gpx_data=load_gpx_asset(track_name),              )              self.dbaccess.commit() diff --git a/tests/playwright/test_basic.py b/tests/playwright/test_basic.py index 3b3329a..a98e52d 100644 --- a/tests/playwright/test_basic.py +++ b/tests/playwright/test_basic.py @@ -51,7 +51,7 @@ def test_upload(page: Page, playwright_helper, tmp_path, dbaccess):      page.locator(".bi-upload").click()      # We now fill in most of the data -    page.get_by_label("Title").fill("An awesome track!") +    page.get_by_label("Title", exact=True).fill("An awesome track!")      page.get_by_label("Date").type("07302022")      page.get_by_label("Date").press("Tab")      page.get_by_label("Date").type("12:41") @@ -82,7 +82,7 @@ def test_edit(page: Page, playwright_helper, dbaccess):      page.locator(".btn", has_text="Edit").click()      # We now fill in most of the data -    page.get_by_label("Title").fill("Not so awesome anymore!") +    page.get_by_label("Title", exact=True).fill("Not so awesome anymore!")      page.get_by_label("Date").type("09232019")      page.get_by_label("Date").press("Tab")      page.get_by_label("Date").type("15:28")  | 
