#34497: ManifestStaticFilesStorage skips import and export of javascript modules
with absolute paths
-------------------------------------+-------------------------------------
               Reporter:  Hielke     |          Owner:  nobody
  Walinga                            |
                   Type:  Bug        |         Status:  new
              Component:             |        Version:  4.2
  contrib.staticfiles                |       Keywords:
               Severity:  Normal     |  ManifestStaticFilesStorage ES
           Triage Stage:             |  modules
  Unreviewed                         |      Has patch:  0
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 The recently added support for finding the ES modules does not work for
 absolute paths. As this is skipped.

 It is not uncommon to import from the absolute path.

 {{{
 import function from "/appname/file.js"
 }}}

 The current implementation just skips this.

 A change in the code can be made to find these correctly.

 Current:
 {{{
             # Ignore absolute/protocol-relative and data-uri URLs.
             if re.match(r"^[a-z]+:", url):
                 return matched

             # Ignore absolute URLs that don't point to a static file
 (dynamic
             # CSS / JS?). Note that STATIC_URL cannot be empty.
             if url.startswith("/") and not
 url.startswith(settings.STATIC_URL):
                 return matched

             # Strip off the fragment so a path-like fragment won't
 interfere.
             url_path, fragment = urldefrag(url)

             # Ignore URLs without a path
             if not url_path:
                 return matched

             if url_path.startswith("/"):
                 # Otherwise the condition above would have returned
 prematurely.
                 assert url_path.startswith(settings.STATIC_URL)
                 target_name = url_path[len(settings.STATIC_URL) :]
             else:
                 # We're using the posixpath module to mix paths and URLs
 conveniently.
                 source_name = name if os.sep == "/" else
 name.replace(os.sep, "/")
                 target_name =
 posixpath.join(posixpath.dirname(source_name), url_path)

             # Determine the hashed name of the target file with the
 storage backend.
             hashed_url = self._url(
                 self._stored_name,
                 unquote(target_name),
                 force=True,
                 hashed_files=hashed_files,
             )

             transformed_url = "/".join(
                 url_path.split("/")[:-1] + hashed_url.split("/")[-1:]
             )
 }}}

 Proposed change:
 {{{
             # Ignore absolute/protocol-relative and data-uri URLs.
             if re.match(r"^[a-z]+:", url):
                 return matched

             # Strip off the fragment so a path-like fragment won't
 interfere.
             url_path, fragment = urldefrag(url)

             # Ignore URLs without a path
             if not url_path:
                 return matched

             if url_path.startswith('/'):
                 if url_path.startswith(settings.STATIC_URL):
                     target_name = url_path[len(settings.STATIC_URL):]
                 else:
                     target_name = url_path[1:]
             else:
                 # We're using the posixpath module to mix paths and URLs
 conveniently.
                 source_name = name if os.sep == '/' else
 name.replace(os.sep, '/')
                 target_name =
 posixpath.join(posixpath.dirname(source_name), url_path)

             try:
                 # Determine the hashed name of the target file with the
 storage backend.
                 hashed_url = self._url(
                     self._stored_name, unquote(target_name),
                     force=True, hashed_files=hashed_files,
                 )
             except ValueError:
                 # Ignore absolute URLs that don't point to a static file
 (dynamic
                 # CSS / JS?). Note that STATIC_URL cannot be empty.
                 if url.startswith("/") and not
 url.startswith(settings.STATIC_URL):
                     return matched
                 else:
                     raise

             transformed_url = "/".join(
                 url_path.split("/")[:-1] + hashed_url.split("/")[-1:]
             )
 }}}

 == PR

 I could make a PR if this seems good. Thank you.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34497>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/010701878075bfd7-4aeaabf3-221b-43aa-bae8-16146c9c79cb-000000%40eu-central-1.amazonses.com.

Reply via email to