def get_html_file(wpobj): """ finds html file to use for the content, if any. returns empty string on failure. """ if hasattr(wpobj, 'html_url'): htmlattr = 'html_url' elif hasattr(wpobj, 'contentfile'): htmlattr = 'contentfile' else: log.error('Object doesn\'t have a html file attribute!: ' '{}'.format(wpobj.__name__)) return '' if not hasattr(wpobj, 'alias'): log.error('Object doesn\'t have an \'alias\' attribute!: ' '{}'.format(wpobj.__name__)) return '' # Get objects html_url/contentfile obj_file = getattr(wpobj, htmlattr) if not obj_file: # use default location if no manual override is set. possiblefile = 'static/html/{}.html'.format(wpobj.alias) html_file = utilities.get_absolute_path(possiblefile) elif obj_file.lower() == 'none': # html files can be disabled by putting None in the # html_url/contentfile field. return '' else: if os.path.isfile(obj_file): # already absolute html_file = obj_file else: # try absolute path html_file = utilities.get_absolute_path(obj_file) return html_file
def test_get_absolute_path(self): """ get_absolute_path() returns only static directories, with no '..'. """ # Common case. self.assertEqual( '{}/css/main.min.css'.format(settings.STATIC_ROOT), utils.get_absolute_path('/static/css/main.min.css'), msg='failed to get absolute path for known file.' ) # Guard against '..' tricks. self.assertEqual( '', utils.get_absolute_path('/static/../html/index.html'), msg='failed to guard against \'..\'!' ) # Guard against non-static files. self.assertEqual( '', utils.get_absolute_path('{}/wp_main'.format( settings.BASE_PARENT )), msg='failed to guard against non-static file!' ) # Guard against multiple //. self.assertEqual( '{}/css/main.min.css'.format(settings.STATIC_ROOT), utils.get_absolute_path('///static//css/main.min.css'), msg='failed to fix slightly malformed url.' )
def get_html_file(wpobj): """ finds html file to use for the content, if any. returns empty string on failure. """ if hasattr(wpobj, 'html_url'): htmlattr = 'html_url' elif hasattr(wpobj, 'contentfile'): htmlattr = 'contentfile' else: _log.error('Object doesn\'t have a html file attribute!: ' '{}'.format(wpobj.__name__)) return '' if not hasattr(wpobj, 'alias'): _log.error('Object doesn\'t have an \'alias\' attribute!: ' '{}'.format(wpobj.__name__)) return '' # Get objects html_url/contentfile obj_file = getattr(wpobj, htmlattr) if not obj_file: # use default location if no manual override is set. possiblefile = 'static/html/{}.html'.format(wpobj.alias) html_file = utilities.get_absolute_path(possiblefile) elif obj_file.lower() == "none": # html files can be disabled by putting None in the # html_url/contentfile field. return '' else: if os.path.isfile(obj_file): # already absolute html_file = obj_file else: # try absolute path html_file = utilities.get_absolute_path(obj_file) return html_file
def get_screenshots_dir(project): """ determine screenshots directory for project """ if project.screenshot_dir == "": # try default location aliasdir = 'static/images/{}'.format(project.alias) images_dir = utilities.get_absolute_path(aliasdir) else: if os.path.isdir(project.screenshot_dir): # project path was absolute images_dir = project.screenshot_dir else: # needs absolute? images_dir = utilities.get_absolute_path(project.screenshot_dir) return images_dir
def get_screenshots_dir(project): """ determine screenshots directory for project """ if project.screenshot_dir == "": # try default location aliasdir = 'static/images/{}'.format(project.alias) images_dir = utilities.get_absolute_path(aliasdir) else: if os.path.isdir(project.screenshot_dir): # project path was absolute images_dir = project.screenshot_dir else: # needs absolute? images_dir = utilities.get_absolute_path(project.screenshot_dir) return images_dir
def get_using_paths(dir_path, absolute_path=None, proj=None): """ When given a dir as a path, find out which file is preferred to use first. """ if absolute_path is None: absolute_path = utilities.get_absolute_path(dir_path) if not os.path.isdir(absolute_path): return (None, None) try: files = os.listdir(absolute_path) except Exception as ex: files = [] log.debug('unable to listdir: {}\n {}'.format( absolute_path, ex, )) # no files in this directory, or bad dir. if not files: return (None, None) default_file = utilities.get_relative_path( utilities.append_path(dir_path, files[0]) ) # Dir has files, get most important to show. if proj is None: # No project, try first file. return ( default_file, utilities.get_absolute_path(default_file), ) # Has project, see if source_file is good. if so, use it. if proj.source_file: absolute_path = utilities.get_absolute_path(proj.source_file) return ( utilities.get_relative_path(absolute_path), absolute_path, ) # Just use first file found for project. return ( default_file, utilities.get_absolute_path(default_file), )
def get_post_body(post): """ retrieves body for post. if html_url is set, we will try to load the file if loading fails, or it is not set, we will use post.body. """ if post is None: log.error('post is None!') return '' # Try for automatic slug-based html file. slugfile = '{}.html'.format(post.slug) content = htmltools.load_html_template(slugfile) if content: return content # Try the posts's html_url as a template. absolute_path = utilities.get_absolute_path(post.html_url) if absolute_path: # Load the html_url template content. return htmltools.load_html_file( absolute_path, context={ 'post': post }) # No valid html_url, using post body as a Template. return htmltools.render_html_str(post.body, context={'post': post})
def get_screenshots(images_dir, noscript_image=None): """ Retrieves html formatted screenshots box for all images in a directory. Returns None on failure. Arguments: images_dir : Relative dir containing all the images. Keyword Arguments: noscript_image : Path to image to show for <noscript> tag. """ # accceptable image formats (last 4 chars) formats = ['.png', '.jpg', '.gif', '.bmp', '.jpeg'] if os.path.isdir(images_dir): dirpath = images_dir else: # Make sure we are using the right dir. # get absolute path for images dir. dirpath = utilities.get_absolute_path(images_dir) if not dirpath: log.error('No images dir: {!r} -> {!r}'.format(images_dir, dirpath)) return None # Get useable relative dir (user-passed may be wrong format) relative_dir = utilities.get_relative_path(dirpath) # find acceptable pics try: all_files = os.listdir(dirpath) except Exception as ex: log.error('Can\'t list dir: {}\n{}'.format(dirpath, ex)) return None # Help functions for building screenshots. def relative_img(filename): return os.path.join(relative_dir, filename) def good_format(filename): return os.path.splitext(filename)[-1] in formats # Build acceptable pics list good_pics = [relative_img(f) for f in all_files if good_format(f)] # auto-pick noscript image if needed if (len(good_pics) > 0) and (noscript_image is None): noscript_image = good_pics[0] else: # no good pics. noscript_image = None # Render from template. screenshots = render_clean( 'home/imageviewer.html', context={ 'images': good_pics, 'noscript_image': noscript_image, }) return screenshots
def get_screenshots(images_dir, noscript_image=None): """ Retrieves html formatted screenshots box for all images in a directory. Returns None on failure. Arguments: images_dir : Relative dir containing all the images. Keyword Arguments: noscript_image : Path to image to show for <noscript> tag. """ # accceptable image formats (last 4 chars) formats = ['.png', '.jpg', '.gif', '.bmp', '.jpeg'] if os.path.isdir(images_dir): dirpath = images_dir else: # Make sure we are using the right dir. # get absolute path for images dir. dirpath = utilities.get_absolute_path(images_dir) if not dirpath: log.error('No images dir: {!r} -> {!r}'.format(images_dir, dirpath)) return None # Get useable relative dir (user-passed may be wrong format) relative_dir = utilities.get_relative_path(dirpath) # find acceptable pics try: all_files = os.listdir(dirpath) except Exception as ex: log.error('Can\'t list dir: {}\n{}'.format(dirpath, ex)) return None # Help functions for building screenshots. def relative_img(filename): return os.path.join(relative_dir, filename) def good_format(filename): return os.path.splitext(filename)[-1] in formats # Build acceptable pics list good_pics = [relative_img(f) for f in all_files if good_format(f)] # auto-pick noscript image if needed if (len(good_pics) > 0) and (noscript_image is None): noscript_image = good_pics[0] else: # no good pics. noscript_image = None # Render from template. screenshots = render_clean('home/imageviewer.html', context={ 'images': good_pics, 'noscript_image': noscript_image, }) return screenshots
def download(request, file_path): """ provides download of files, tracks download count of projects and possibly others by checking file's project owner, incrementing the count, and then redirecting to the actual file. """ # File path may be an incomplete path to the actual location. # /cedit/source is just as good as /static/files/cedit/source # so we must grab the real (absolute) path, and then convert # it to a valid static path. # location on disk absolute_path = utilities.get_absolute_path(file_path) # location relative to site if settings.SERVER_LOCATION == 'local': static_path = absolute_path.replace(settings.STATIC_PARENT, '') else: # remote, file is actually located at the static_server dir. # but we will need to forward the user to the /static url. static_path = absolute_path.replace(settings.STATIC_ROOT, '') if static_path.startswith('/'): static_path = '/static{}'.format(static_path) else: static_path = '/static/{}'.format(static_path) # used for local only. if (not static_path.startswith('/')): static_path = '/{}'.format(static_path) if not absolute_path: # File doesn't exist. Return an error. log.debug('file doesn\'t exist: {}'.format(file_path)) alert_message = 'Sorry, that file doesn\'t exist.' main_content = '\n'.join(( '<div class=\'wp-block\'>', '<a href=\'/\'><span>Click here to go home.</span></a>', '</div>' )) context = { 'main_content': mark_safe(main_content), 'alert_message': mark_safe(alert_message), } response = responses.clean_response( 'home/main.html', context=context, request=request) else: # redirect to actual file. # log.debug("redirecting to: " + static_path) response = responses.redirect_response(static_path) # File to track? (not a directory) if os.path.isfile(absolute_path): # see if its a trackable model's file, increment it's count. dltools.increment_dl_count(file_path, absolute_path) return response
def download(request, file_path): """ provides download of files, tracks download count of projects and possibly others by checking file's project owner, incrementing the count, and then redirecting to the actual file. """ # File path may be an incomplete path to the actual location. # /cedit/source is just as good as /static/files/cedit/source # so we must grab the real (absolute) path, and then convert # it to a valid static path. # location on disk absolute_path = utilities.get_absolute_path(file_path) # location relative to site if settings.SERVER_LOCATION == 'local': static_path = absolute_path.replace(settings.STATIC_PARENT, '') else: # remote, file is actually located at the static_server dir. # but we will need to forward the user to the /static url. static_path = absolute_path.replace(settings.STATIC_ROOT, '') if static_path.startswith('/'): static_path = '/static{}'.format(static_path) else: static_path = '/static/{}'.format(static_path) # used for local only. if (not static_path.startswith('/')): static_path = '/{}'.format(static_path) if not absolute_path: # File doesn't exist. Return an error. log.debug('file doesn\'t exist: {}'.format(file_path)) alert_message = 'Sorry, that file doesn\'t exist.' main_content = '\n'.join( ('<div class=\'wp-block\'>', '<a href=\'/\'><span>Click here to go home.</span></a>', '</div>')) context = { 'main_content': mark_safe(main_content), 'alert_message': mark_safe(alert_message), } response = responses.clean_response('home/main.html', context=context, request=request) else: # redirect to actual file. # log.debug("redirecting to: " + static_path) response = responses.redirect_response(static_path) # File to track? (not a directory) if os.path.isfile(absolute_path): # see if its a trackable model's file, increment it's count. dltools.increment_dl_count(file_path, absolute_path) return response
def get_html_file(project): """ finds html file to use for project content, if any returns empty string on failure. """ if project.html_url == "": # use default location if no manual override is set. aliashtml = 'static/html/{}.html'.format(project.alias) html_file = utilities.get_absolute_path(aliashtml) elif project.html_url.lower() == 'none': # html files can be disabled by putting None in the html_url field. return "" else: if os.path.isfile(project.html_url): # already absolute html_file = project.html_url else: # try absolute path html_file = utilities.get_absolute_path(project.html_url) return html_file
def get_html_file(project): """ finds html file to use for project content, if any returns empty string on failure. """ if project.html_url == "": # use default location if no manual override is set. aliashtml = 'static/html/{}.html'.format(project.alias) html_file = utilities.get_absolute_path(aliashtml) elif project.html_url.lower() == "none": # html files can be disabled by putting None in the html_url field. return "" else: if os.path.isfile(project.html_url): # already absolute html_file = project.html_url else: # try absolute path html_file = utilities.get_absolute_path(project.html_url) return html_file
def get_screenshots_dir(miscobj): """ Retrieves screenshots directory for this misc object, if screenshots are available. Otherwise, returns None. """ possibledir = os.path.join('static/images', miscobj.alias) imagedir = utilities.get_absolute_path(possibledir) if not os.path.isdir(imagedir): # log.debug('No screenshots dir: {}'.format(possibledir)) return None return imagedir
def get_screenshots_dir(miscobj): """ Retrieves screenshots directory for this misc object, if screenshots are available. Otherwise, returns None. """ possibledir = os.path.join('static/images', miscobj.alias) imagedir = utilities.get_absolute_path(possibledir) if not os.path.isdir(imagedir): # log.debug('No screenshots dir: {}'.format(possibledir)) return None return imagedir
def get_download_file(project): """ determines location of download file, or returns empty string if we can't find it anywhere. """ surl = project.download_url if surl == "": return "" if utilities.is_file_or_dir(surl): # already absolute return surl else: # try absolute_path return utilities.get_absolute_path(surl)
def get_using_paths(dir_path, absolute_path=None, proj=None): """ When given a dir as a path, find out which file is preferred to use first. """ if absolute_path is None: absolute_path = utilities.get_absolute_path(dir_path) if not os.path.isdir(absolute_path): return (None, None) try: files = os.listdir(absolute_path) except Exception as ex: files = [] _log.debug("unable to listdir: " + absolute_path + '\n' + str(ex)) # no files in this directory, or bad dir. if len(files) == 0: return (None, None) # dir has files, get most important to show. if proj is None: # no project, try first file. static_path = utilities.append_path(dir_path, files[0]) absolute_path = utilities.get_absolute_path(static_path) else: # has project, see if source_file is good. if so, use it. if proj.source_file: static_path = proj.source_file absolute_path = utilities.get_absolute_path(static_path) #_log.debug("dir passed: using source_file: " + absolute_path) else: # just use first file found. static_path = utilities.append_path(dir_path, files[0]) absolute_path = utilities.get_absolute_path(static_path) return (static_path, absolute_path)
def get_screenshots(images_dir, noscript_image=None): """ Retrieves html formatted screenshots box for all images in a directory. Returns None on failure. Arguments: images_dir : Relative dir containing all the images. Keyword Arguments: noscript_image : Path to image to show for <noscript> tag. """ # accceptable image formats (last 4 chars) formats = [".png", ".jpg", ".gif", ".bmp", "jpeg"] # Make sure we are using the right dir. # get absolute path for images dir, # if none exists then delete the target_replacement. images_dir = utilities.get_absolute_path(images_dir) if not images_dir: return None # Get useable relative dir (user-passed may be wrong format) relative_dir = utilities.get_relative_path(images_dir) # find acceptable pics try: all_files = os.listdir(images_dir) except Exception as ex: _log.debug("Can't list dir: " + images_dir + '\n' + str(ex)) return None # Help functions for building screenshots. relative_img = lambda filename: os.path.join(relative_dir, filename) good_format = lambda filename: (filename[-4:] in formats) # Build acceptable pics list good_pics = [relative_img(f) for f in all_files if good_format(f)] # auto-pick noscript image if needed if (len(good_pics) > 0) and (noscript_image is None): noscript_image = good_pics[0] else: # no good pics. noscript_image = None # Render from template. screenshots = render_clean("home/screenshots.html", context_dict={'images': good_pics, 'noscript_image': noscript_image, }) return screenshots
def get_images(self): """ Retrieves html formatted images box for all images in a directory. Returns None on failure. Arguments: images_dir : Relative dir containing all the images. """ # accceptable image formats formats = ('.png', '.jpg', '.gif', '.bmp', '.jpeg') # Make sure we are using the right dir. # get absolute path for images dir, # if none exists then no screenshots are given. images_dir = utilities.get_absolute_path(self.images_dir) if not images_dir: return None # Get useable relative dir (user-passed may be wrong format) relative_dir = utilities.get_relative_path(images_dir) # find acceptable pics try: all_files = os.listdir(images_dir) except Exception as ex: log.debug('Can\'t list dir: {}\n{}'.format(images_dir, ex)) return None # Build acceptable pics list good_pics = [ os.path.join(relative_dir, f) for f in all_files if os.path.splitext(f)[-1] in formats ] # auto-pick noscript image if needed if len(good_pics) > 0: noscript_image = good_pics[0] else: # no good pics. noscript_image = None # Render from template. c = { 'images': good_pics, 'noscript_image': noscript_image, } return htmltools.render_clean( 'home/imageviewer.html', context=c)
def test_get_absolute_path(self): """ get_absolute_path() returns only static directories, with no '..'. """ # Common case. self.assertEqual('{}/css/main.min.css'.format(settings.STATIC_ROOT), utils.get_absolute_path('/static/css/main.min.css'), msg='failed to get absolute path for known file.') # Guard against '..' tricks. self.assertEqual('', utils.get_absolute_path('/static/../html/index.html'), msg='failed to guard against \'..\'!') # Guard against non-static files. self.assertEqual('', utils.get_absolute_path('{}/wp_main'.format( settings.BASE_PARENT)), msg='failed to guard against non-static file!') # Guard against multiple //. self.assertEqual( '{}/css/main.min.css'.format(settings.STATIC_ROOT), utils.get_absolute_path('///static//css/main.min.css'), msg='failed to fix slightly malformed url.')
def get_download_file_abs(self): """ Determines location of download file, or returns empty string if we can't find it anywhere. """ if not self.project.download_url: log.debug('Project has no download_url: {!r} -> {!r}'.format( self.project, self.project.download_url )) return '' if utilities.is_file_or_dir(self.project.download_url): # already absolute return self.project.download_url # try absolute_path return utilities.get_absolute_path(self.project.download_url)
def get_images(self): """ Retrieves html formatted images box for all images in a directory. Returns None on failure. Arguments: images_dir : Relative dir containing all the images. """ # accceptable image formats formats = ('.png', '.jpg', '.gif', '.bmp', '.jpeg') # Make sure we are using the right dir. # get absolute path for images dir, # if none exists then no screenshots are given. images_dir = utilities.get_absolute_path(self.images_dir) if not images_dir: return None # Get useable relative dir (user-passed may be wrong format) relative_dir = utilities.get_relative_path(images_dir) # find acceptable pics try: all_files = os.listdir(images_dir) except Exception as ex: log.debug('Can\'t list dir: {}\n{}'.format(images_dir, ex)) return None # Build acceptable pics list good_pics = [ os.path.join(relative_dir, f) for f in all_files if os.path.splitext(f)[-1] in formats ] # auto-pick noscript image if needed if len(good_pics) > 0: noscript_image = good_pics[0] else: # no good pics. noscript_image = None # Render from template. c = { 'images': good_pics, 'noscript_image': noscript_image, } return htmltools.render_clean('home/imageviewer.html', context=c)
def get_scriptkid_image(): """ returns a random image filename from /images/scriptkid """ import random image_dir = utilities.get_absolute_path("images/scriptkids") goodexts = ("jpeg", ".jpg", ".png", ".gif", ".bmp") try: images = [img for img in os.listdir(image_dir) if img[-4:].lower() in goodexts] except Exception as ex: _log.error("can't do listdir() on: " + image_dir + '\n' + str(ex)) return None if not images: _log.error("images was empty!") return None randomindex = random.randint(0, len(images) - 1) return os.path.join(image_dir, images[randomindex])
def load_html_file(filename, request=None, context=None): """ Try rendering a file as a Template, if that fails return the raw file content. This can all be short-circuited by passing in a pre-loaded template with: template=loader.get_template(templatename) Arguments: filename : File name for template/html file. request : Request() to build template with. context : Context dict for template. """ # Try rendering file as a template. content = load_html_template(filename, request=request, context=context) if content: return content # no template, probably a filename. check it: log.debug('No template, falling back to HTML: {}'.format(filename)) if not os.path.isfile(filename): # try getting absolute path spath = utilities.get_absolute_path(filename) if os.path.isfile(spath): filename = spath else: # no file found. log.debug('No file found at: {}'.format(filename)) return '' try: with open(filename) as fhtml: # Successful file open, return the contents. return fhtml.read() except IOError as exIO: log.error('Cannot open file: {}\n{}'.format(filename, exIO)) except OSError as exOS: log.error(( 'Possible bad permissions opening file: {}\n{}' ).format(filename, exOS)) except Exception as ex: log.error('General error opening file: {}\n{}'.format(filename, ex)) return ''
def get_post_body(post_): """ retrieves body for post. if html_url is set, we will try to load the file if loading fails, or it is not set, we will use post.body. """ # TODO: Html content needs to be tied into template render. # see: htmltools.load_html_file(), projects.tools.get_html_content(), # misc.tools.get_long_desc() if post_ is None: _log.error("post_ = None!") return "" absolute_path = utilities.get_absolute_path(post_.html_url) if absolute_path == "": # no valid html_url return post_.body # load html file content scontent = htmltools.load_html_file(absolute_path) return scontent
def load_html_file(filename, request=None, context=None): """ Try rendering a file as a Template, if that fails return the raw file content. This can all be short-circuited by passing in a pre-loaded template with: template=loader.get_template(templatename) Arguments: filename : File name for template/html file. request : Request() to build template with. context : Context dict for template. """ # Try rendering file as a template. content = load_html_template(filename, request=request, context=context) if content: return content # no template, probably a filename. check it: log.debug('No template, falling back to HTML: {}'.format(filename)) if not os.path.isfile(filename): # try getting absolute path spath = utilities.get_absolute_path(filename) if os.path.isfile(spath): filename = spath else: # no file found. log.debug('No file found at: {}'.format(filename)) return '' try: with open(filename) as fhtml: # Successful file open, return the contents. return fhtml.read() except IOError as exIO: log.error('Cannot open file: {}\n{}'.format(filename, exIO)) except OSError as exOS: log.error(('Possible bad permissions opening file: {}\n{}').format( filename, exOS)) except Exception as ex: log.error('General error opening file: {}\n{}'.format(filename, ex)) return ''
def get_scriptkid_image(): """ returns a random image filename from /static/images/scriptkids """ import random image_dir = utilities.get_absolute_path('/static/images/scriptkids') goodexts = ('.jpeg', '.jpg', '.png', '.gif', '.bmp') try: images = [ imgfile for imgfile in os.listdir(image_dir) if os.path.splitext(imgfile)[-1].lower() in goodexts ] except Exception as ex: log.error('Can\'t do listdir() on {!r}\n {}'.format( image_dir, ex, )) return None if not images: log.error('Script kid images are empty!') return None randomindex = random.randint(0, len(images) - 1) return os.path.join(image_dir, images[randomindex])
def get_source_files(project): """ returns list of all source files for a project, if any. uses relative static path. (/static/files/project/source/file.py) returns None on failure. """ if project.source_dir == "": source_files = [] else: sabsolute = utilities.get_absolute_path(project.source_dir) if sabsolute == "": source_files = [] else: # retrieve all source filenames file_names = os.listdir(sabsolute) if len(file_names) == 0: source_files = [] else: source_files = [] for sfilename in file_names: srelativepath = utilities.get_relative_path(os.path.join(project.source_dir, sfilename)) # noqa source_files.append(srelativepath) return source_files
def get_source_files(project): """ returns list of all source files for a project, if any. uses relative static path. (/static/files/project/source/file.py) returns None on failure. """ if project.source_dir == "": source_files = [] else: sabsolute = utilities.get_absolute_path(project.source_dir) if sabsolute == "": source_files = [] else: # retrieve all source filenames file_names = os.listdir(sabsolute) if len(file_names) == 0: source_files = [] else: source_files = [] for sfilename in file_names: srelativepath = utilities.get_relative_path(os.path.join(project.source_dir, sfilename)) # noqa source_files.append(srelativepath) return source_files
def get_post_body(post): """ retrieves body for post. if html_url is set, we will try to load the file if loading fails, or it is not set, we will use post.body. """ if post is None: log.error('post is None!') return '' # Try for automatic slug-based html file. slugfile = '{}.html'.format(post.slug) content = htmltools.load_html_template(slugfile) if content: return content # Try the posts's html_url as a template. absolute_path = utilities.get_absolute_path(post.html_url) if absolute_path: # Load the html_url template content. return htmltools.load_html_file(absolute_path, context={'post': post}) # No valid html_url, using post body as a Template. return htmltools.render_html_str(post.body, context={'post': post})
def get_scriptkid_image(): """ returns a random image filename from /static/images/scriptkids """ import random image_dir = utilities.get_absolute_path('/static/images/scriptkids') goodexts = ('.jpeg', '.jpg', '.png', '.gif', '.bmp') try: images = [ imgfile for imgfile in os.listdir(image_dir) if os.path.splitext(imgfile)[-1].lower() in goodexts ] except Exception as ex: log.error('Can\'t do listdir() on {!r}\n {}'.format( image_dir, ex, )) return None if not images: log.error('Script kid images are empty!') return None randomindex = random.randint(0, len(images) - 1) return os.path.join(image_dir, images[randomindex])
def load_html_file(sfile, request=None, context=None): """ Trys loading a template by name, If context is passed it is used to render the template. If a request was passed then RequestContext is used, otherwise Context is used. If no template is found, it trys loading html content from file. returns string with html content. """ # TODO: project pages and blogs don't need to use the old style # {{ inject_something }} tags. They need a new templatetag like: # {{ post|injectsomething }} or {{ project|sourceview }}. # Template code is disabled until then. # see: projects.tools.get_html_content() # try: # template = loader.get_template(sfile) # except Exception: # template = None # # if template: # Found template for this file, use it. # if context: # if request: # Try creating a request context. # try: # contextobj = RequestContext(request, context) # except Exception as ex: # _log.error('Error creating request context from: ' # '{}\n{}'.format(request, ex)) # return '' # else: # No request, use normal context. # contextobj = Context(context) # else: # No context dict given, use empty context. # contextobj = Context({}) # # Have context, try rendering. # try: # content = template.render(contextobj) # Good content, return it. # return content # except Exception as ex: # _log.error(''.join(['Error rendering template: {} '.format(sfile), # 'Context: {}'.format(context), # '\n{}'.format(ex), # ])) # return '' # no template, probably a filename. check it: if not os.path.isfile(sfile): # try getting absolute path spath = utilities.get_absolute_path(sfile) if os.path.isfile(spath): sfile = spath else: # no file found. _log.debug('No file found at: {}'.format(sfile)) return '' try: with open(sfile) as fhtml: # Successful file open, return the contents. return fhtml.read() except IOError as exIO: _log.error('Cannot open file: {}\n{}'.format(sfile, exIO)) return '' except OSError as exOS: _log.error('Possible bad permissions opening file: {}'.format(sfile) + '{}'.format(exOS)) return '' except Exception as ex: _log.error('General error opening file: {}\n{}'.format(sfile, ex)) return ''
def download(request, file_path): """ provides download of files, tracks download count of projects and possibly others by checking file's project owner, incrementing the count, and then redirecting to the actual file. """ # File path may be an incomplete path to the actual location. # /cedit/source is just as good as /static/files/cedit/source # so we must grab the real (absolute) path, and then convert # it to a valid static path. # location on disk absolute_path = utilities.get_absolute_path(file_path) # location relative to site if settings.SERVER_LOCATION == 'local': static_path = absolute_path.replace(settings.STATIC_PARENT, '') else: # remote, file is actually located at the static_server dir. # but we will need to forward the user to the /static url. static_path = absolute_path.replace(settings.STATIC_ROOT, '') if static_path.startswith('/'): static_path = '/static{}'.format(static_path) else: static_path = '/static/{}'.format(static_path) # used for local only. if (not static_path.startswith('/')): static_path = '/{}'.format(static_path) if not absolute_path: # File doesn't exist. Return an error. _log.debug("file doesn't exist: " + file_path) alert_message = "Sorry, that file doesn't exist." main_content = ("<div class='wp-block'>" "<a href='/'><span>Click here to go home.</span></a>" "</div>") context = {'request': request, 'main_content': mark_safe(main_content), 'alert_message': mark_safe(alert_message), 'extra_style_link_list': [utilities.get_browser_style(request)], } response = responses.clean_response("home/main.html", context) else: # redirect to actual file. #_log.debug("redirecting to: " + static_path) response = responses.redirect_response(static_path) # File to track? (not a directory) if os.path.isfile(absolute_path): # see if its a project file. proj = ptools.get_project_from_path(absolute_path) # update project's download count if proj is not None: # increment downloads for this project. proj.download_count += 1 proj.save() # see if it's a misc file misc = misctools.get_by_filename(file_path) # update misc files count if misc: misc.download_count += 1 misc.save() # update file tracker info filetracker = dltools.get_file_tracker(absolute_path) if filetracker is not None: if proj is not None: dltools.update_tracker_projects(filetracker, proj) filetracker.download_count += 1 filetracker.save() return response
def get_file_info(file_path): """ retrieves actual file content for viewer. """ absolute_path = utilities.get_absolute_path(file_path) static_path = utilities.get_relative_path(file_path) # no file to load. if not absolute_path: _log.error('Invalid file path for viewer.get_file_content(): ' '{}'.format(file_path)) raise Http404("Sorry, that file doesn't exist.") project = ptools.get_project_from_path(absolute_path) # Directory was passed, get files to use. (based on project, dir listing) if os.path.isdir(absolute_path): if project: static_path, absolute_path = get_using_paths(static_path, absolute_path, project) if static_path is None or absolute_path is None: # Raise error which will display a 404. raise Http404("Sorry, there was an error viewing that file.") else: raise Http404("Sorry, that file doesn't exist.") # Update project view count tracker miscobj = None if project: project.view_count += 1 project.save() else: # Not a project, may be a Misc Object. miscobj = misctools.get_by_filename(file_path) logdebug('Found Misc Object: {}'.format(repr(miscobj))) # Update misc view count tracker if miscobj: miscobj.view_count += 1 miscobj.save() else: _log.debug('get_file_content: not a project or misc object: ' '{}'.format(file_path)) # Update file tracker if os.path.isfile(absolute_path): filetracker = dltools.get_file_tracker(absolute_path) if filetracker is not None: if project is not None: dltools.update_tracker_projects(filetracker, project, dosave=False) filetracker.view_count += 1 filetracker.save() # Get file content file_content = "" try: with open(absolute_path) as fread: file_content = fread.read() except Exception as ex: _log.error("Error loading file: " + absolute_path + '\n' + str(ex)) raise Http404("Sorry, I can't load that file right now.") fileinfo = {'project': project, 'miscobj': miscobj, 'static_path': static_path, 'absolute_path': absolute_path, 'file_content': file_content, } return fileinfo
def get_file_info(file_path): """ retrieves actual file content for viewer. """ absolute_path = utilities.get_absolute_path(file_path) static_path = utilities.get_relative_path(file_path) # no file to load. if not absolute_path: log.error( 'Invalid file path for viewer.get_file_content(): {}'.format( file_path)) raise Http404('Sorry, that file doesn\'t exist.') project = ptools.get_project_from_path(absolute_path) # Directory was passed, get files to use. (based on project, dir listing) if os.path.isdir(absolute_path): if project: static_path, absolute_path = get_using_paths( static_path, proj=project ) if static_path is None or absolute_path is None: # Raise error which will display a 404. raise Http404('Sorry, there was an error viewing that file.') else: raise Http404('Sorry, that file doesn\'t exist.') # Update project view count tracker miscobj = None if project: project.view_count += 1 project.save() else: # Not a project, may be a Misc Object. miscobj = misctools.get_by_filename(file_path) log.debug('Found Misc Object: {}'.format(repr(miscobj))) # Update misc view count tracker if miscobj: miscobj.view_count += 1 miscobj.save() else: log.debug( 'get_file_content: not a project or misc object: {}'.format( file_path)) # Update file tracker if os.path.isfile(absolute_path): filetracker = dltools.get_file_tracker(absolute_path) if filetracker is not None: if project is not None: dltools.update_tracker_projects( filetracker, project, dosave=False ) filetracker.view_count += 1 filetracker.save() # Get file content try: with open(absolute_path) as fread: file_content = fread.read() except Exception as ex: log.error('Error loading file: {}\n{}'.format(absolute_path, ex)) raise Http404('Sorry, I can\'t load that file right now.') fileinfo = { 'project': project, 'miscobj': miscobj, 'static_path': static_path, 'absolute_path': absolute_path, 'file_content': file_content, } if project: fileinfo['name'] = project.name fileinfo['related_url'] = '/projects/{}'.format(project.alias) elif miscobj: fileinfo['name'] = miscobj.name fileinfo['related_url'] = '/misc/{}'.format(miscobj.alias) else: fileinfo['name'] = None fileinfo['related_url'] = None return fileinfo