Skip to content
Snippets Groups Projects
utils.py 1.41 KiB
Newer Older
  • Learn to ignore specific revisions
  • Eliot Berriot's avatar
    Eliot Berriot committed
    from urllib.parse import parse_qs, urlencode, urlsplit, urlunsplit
    
    from django.db import transaction
    
    
    
    def rename_file(instance, field_name, new_name, allow_missing_file=False):
        field = getattr(instance, field_name)
        current_name, extension = os.path.splitext(field.name)
    
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        new_name_with_extension = "{}{}".format(new_name, extension)
    
        try:
            shutil.move(field.path, new_name_with_extension)
        except FileNotFoundError:
            if not allow_missing_file:
                raise
    
    Eliot Berriot's avatar
    Eliot Berriot committed
            print("Skipped missing file", field.path)
    
        initial_path = os.path.dirname(field.name)
        field.name = os.path.join(initial_path, new_name_with_extension)
        instance.save()
        return new_name_with_extension
    
    
    
    def on_commit(f, *args, **kwargs):
    
    Eliot Berriot's avatar
    Eliot Berriot committed
        return transaction.on_commit(lambda: f(*args, **kwargs))
    
    
    
    def set_query_parameter(url, **kwargs):
        """Given a URL, set or replace a query parameter and return the
        modified URL.
    
        >>> set_query_parameter('http://example.com?foo=bar&biz=baz', 'foo', 'stuff')
        'http://example.com?foo=stuff&biz=baz'
        """
        scheme, netloc, path, query_string, fragment = urlsplit(url)
        query_params = parse_qs(query_string)
    
        for param_name, param_value in kwargs.items():
            query_params[param_name] = [param_value]
        new_query_string = urlencode(query_params, doseq=True)
    
        return urlunsplit((scheme, netloc, path, new_query_string, fragment))