def exportPresentation(request, client, filename, stylesDir): """ export client to a DOM presentation """ try: # filename is a directory where we will export the website to # We assume that the user knows what they are doing # and don't check if the directory is already full or not # and we just overwrite what's already there filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if not filename.exists(): filename.makedirs() elif not filename.isdir(): client.alert( _(u'Filename %s is a file, cannot replace it') % filename) log.error("Couldn't export web page: " + "Filename %s is a file, cannot replace it" % filename) return else: client.alert( _(u'Folder name %s already exists. ' 'Please choose another one or delete existing one then try again.' ) % filename) return # Now do the export presentationExport = PresentationExport(self.config, stylesDir, filename) presentationExport.export(package) except Exception, e: client.alert(_('EXPORT FAILED!\n%s') % str(e)) raise
def exportPresentation(request, client, filename, stylesDir): """ export client to a DOM presentation """ try: # filename is a directory where we will export the website to # We assume that the user knows what they are doing # and don't check if the directory is already full or not # and we just overwrite what's already there filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if not filename.exists(): filename.makedirs() elif not filename.isdir(): client.alert(_(u"Filename %s is a file, cannot replace it") % filename) log.error("Couldn't export web page: " + "Filename %s is a file, cannot replace it" % filename) return else: client.alert( _(u"Folder name %s already exists. " "Please choose another one or delete existing one then try again.") % filename ) return # Now do the export presentationExport = PresentationExport(self.config, stylesDir, filename) presentationExport.export(package) except Exception, e: client.alert(_("EXPORT FAILED!\n%s") % str(e)) raise
def exportWebSite2(request, client, filename, stylesDir): """Overwrite allowed, proceed""" try: filename = Path(filename) if filename.exists(): if filename.isdir(): shutil.rmtree(filename) else: os.remove(filename) filename.makedirs() websiteExport = WebsiteExport(self.config, stylesDir, filename) websiteExport.export(package) self._startFile(client, filename) except Exception, e: log.error("EXPORT FAILED! %s" % filename) raise
def exportWebSite2(request, client, filename, stylesDir): '''Overwrite allowed, proceed''' try: filename = Path(filename) if filename.exists(): if filename.isdir(): shutil.rmtree(filename) else: os.remove(filename) filename.makedirs() websiteExport = WebsiteExport(self.config, stylesDir, filename) websiteExport.export(package) self._startFile(client, filename) except Exception, e: log.error("EXPORT FAILED! %s" % filename) raise
def exportWebSite(request, client, filename, stylesDir, quick=False): """ Export 'client' to a web site, 'webDir' is just read from config.webDir 'stylesDir' is where to copy the style sheet information from """ # filename is a directory where we will export the website to filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if filename.exists() and not quick: client.sendScript( 'askOverwrite("%s", "%s");' % (str(filename).replace("\\", "\\\\"), stylesDir.replace("\\", "\\\\")) ) else: # Now do the export self.exportWebSite2(client, filename, stylesDir)
def exportWebSite(request, client, filename, stylesDir, quick=False): """ Export 'client' to a web site, 'webDir' is just read from config.webDir 'stylesDir' is where to copy the style sheet information from """ # filename is a directory where we will export the website to filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if filename.exists() and not quick: client.sendScript('askOverwrite("%s", "%s");' \ % (str(filename).replace("\\", "\\\\"), stylesDir.replace("\\", "\\\\"))) else: # Now do the export self.exportWebSite2(client, filename, stylesDir)
def exportSinglePage(request, client, filename, webDir, stylesDir, \ printFlag): """ Export 'client' to a single web page, 'webDir' is just read from config.webDir 'stylesDir' is where to copy the style sheet information from 'printFlag' indicates whether or not this is for print (and whatever else that might mean) """ try: imagesDir = webDir.joinpath('images') scriptsDir = webDir.joinpath('scripts') templatesDir = webDir.joinpath('templates') # filename is a directory where we will export the website to # We assume that the user knows what they are doing # and don't check if the directory is already full or not # and we just overwrite what's already there filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if not filename.exists(): filename.makedirs() elif not filename.isdir(): client.alert( _(u'Filename %s is a file, cannot replace it') % filename) log.error("Couldn't export web page: " + "Filename %s is a file, cannot replace it" % filename) return else: client.alert( _(u'Folder name %s already exists. ' 'Please choose another one or delete existing one then try again.' ) % filename) return # Now do the export singlePageExport = SinglePageExport(stylesDir, filename, \ imagesDir, scriptsDir, templatesDir) singlePageExport.export(package, printFlag) except Exception, e: client.alert(_('SAVE FAILED!\n%s' % str(e))) raise
def exportSinglePage(request, client, filename, webDir, stylesDir, printFlag): """ Export 'client' to a single web page, 'webDir' is just read from config.webDir 'stylesDir' is where to copy the style sheet information from 'printFlag' indicates whether or not this is for print (and whatever else that might mean) """ try: imagesDir = webDir.joinpath("images") scriptsDir = webDir.joinpath("scripts") templatesDir = webDir.joinpath("templates") # filename is a directory where we will export the website to # We assume that the user knows what they are doing # and don't check if the directory is already full or not # and we just overwrite what's already there filename = Path(filename) # Append the package name to the folder path if necessary if filename.basename() != package.name: filename /= package.name if not filename.exists(): filename.makedirs() elif not filename.isdir(): client.alert(_(u"Filename %s is a file, cannot replace it") % filename) log.error("Couldn't export web page: " + "Filename %s is a file, cannot replace it" % filename) return else: client.alert( _(u"Folder name %s already exists. " "Please choose another one or delete existing one then try again.") % filename ) return # Now do the export singlePageExport = SinglePageExport(stylesDir, filename, imagesDir, scriptsDir, templatesDir) singlePageExport.export(package, printFlag) except Exception, e: client.alert(_("SAVE FAILED!\n%s" % str(e))) raise
def exportPackage(request, package, exportType, filename, print_callback="", quick=False): """ Called by js. Exports the current package to one of the above formats 'exportType' can be one of 'singlePage' 'webSite' 'zipFile' 'ipod' 'textFile' 'scorm' or 'presentation' 'filename' is a file for scorm pages, and a directory for websites """ G.application.lastExportType = exportType G.application.lastExportPath = filename client.sendScript('document.getElementById("quick-export")' + '.setAttribute("disabled", "false");') client.sendScript('document.getElementById("serving-elem")' + '.setAttribute("disabled", "false");') client.sendScript('document.getElementById("serving-elem")' + '.setAttribute("label", "Start Serving");') client.sendScript('document.getElementById("serving-elem")' + '.setAttribute("oncommand", "serveDocument\(\)");') client.sendScript('document.getElementById("quick-export").' + 'setAttribute("disabled", "false");') log.info("Filename to export" + filename) webDir = Path(self.config.webDir) if package.style.find("locale/") != -1: # local style loaded stylesDir = self.config.configDir / "style" # delete "locale/" from style name stylesDir /= package.style[package.style.find("locale/") + len("locale/") :] else: # global style stylesDir = webDir / "style" stylesDir /= package.style exportDir = Path(filename).dirname() if exportDir and not exportDir.exists(): client.alert(_(u"Cannot access directory named ") + unicode(exportDir) + _(u". Please use ASCII names.")) return """ adding the print feature in using the same export functionality: """ if exportType == "singlePage" or exportType == "printSinglePage": printit = 0 if exportType == "printSinglePage": printit = 1 exported_dir = self.exportSinglePage(client, filename, webDir, stylesDir, printit) # the above will return None if the desired exported directory # already exists (printing always goes to a new temp dir, though): if printit == 1 and not exported_dir is None: web_printdir = self.get_printdir_relative2web(exported_dir) # now that this has ben exported, go ahead and trigger # the requested printing callback: client.call(print_callback, filename, exported_dir, web_printdir) elif exportType == "webSite": self.exportWebSite(client, filename, stylesDir, quick=quick) elif exportType == "presentation": self.exportPresentation(client, filename, stylesDir) elif exportType == "printHandout": exported_dir = self.printHandout(client, filename, stylesDir) print exported_dir web_printdir = self.get_printdir_relative2web(exported_dir) client.call(print_callback, filename, exported_dir, web_printdir) elif exportType == "zipFile": filename = self.b4save(client, filename, ".zip", _(u"EXPORT FAILED!")) self.exportWebZip(client, filename, stylesDir) elif exportType == "textFile": self.exportText(client, filename) elif exportType == "ipod": self.exportIpod(client, filename) elif exportType == "scorm": filename = self.b4save(client, filename, ".zip", _(u"EXPORT FAILED!")) self.exportScorm(client, filename, stylesDir, "scorm1.2") elif exportType == "scorm2004": filename = self.b4save(client, filename, ".zip", _(u"EXPORT FAILED!")) self.exportScorm(client, filename, stylesDir, "scorm2004") elif exportType == "commoncartridge": filename = self.b4save(client, filename, ".zip", _(u"EXPORT FAILED!")) self.exportScorm(client, filename, stylesDir, "commoncartridge") else: filename = self.b4save(client, filename, ".zip", _(u"EXPORT FAILED!")) self.exportIMS(client, filename, stylesDir)
def previewTinyMCEimage(request, package, tinyMCEwin, tinyMCEwin_name, tinyMCEfield, local_filename, preview_filename): """ Once an image is selected in the file browser that is spawned by the TinyMCE image dialog, copy this file (which is local to the user's machine) into the server space, under a preview directory (after checking if this exists, and creating it if necessary). Note that this IS a "cheat", in violation of the client-server separation, but can be done since we know that the eXe server is actually sitting on the client host. """ server_filename = "" callback_errors = "" errors = 0 log.debug( "handleTinyMCEimageChoice: image local = " + local_filename + ", base=" + os.path.basename(local_filename) ) webDir = Path(G.application.tempWebDir) previewDir = webDir.joinpath("previews") if not previewDir.exists(): log.debug("image previews directory does not yet exist; " + "creating as %s " % previewDir) previewDir.makedirs() elif not previewDir.isdir(): client.alert(_(u"Preview directory %s is a file, cannot replace it") % previewDir) log.error( "Couldn't preview tinyMCE-chosen image: " + "Preview dir %s is a file, cannot replace it" % previewDir ) callback_errors = "Preview dir is a file, cannot replace" errors += 1 if errors == 0: log.debug("handleTinyMCEimageChoice: originally, local_filename=" + local_filename) local_filename = unicode(local_filename, "utf-8") log.debug("handleTinyMCEimageChoice: in unicode, local_filename=" + local_filename) localImagePath = Path(local_filename) log.debug("handleTinyMCEimageChoice: after Path, localImagePath= " + localImagePath) if not localImagePath.exists() or not localImagePath.isfile(): client.alert(_(u"Local file %s is not found, cannot preview it") % localImagePath) log.error("Couldn't find tinyMCE-chosen image: %s" % localImagePath) callback_errors = "Image file %s not found, cannot preview" % localImagePath errors += 1 try: # joinpath needs its join arguments to already be in Unicode: # preview_filename = toUnicode(preview_filename); # but that's okay, cuz preview_filename is now URI safe, right? log.debug("URIencoded preview filename=" + preview_filename) server_filename = previewDir.joinpath(preview_filename) log.debug( "handleTinyMCEimageChoice copying image from '" + local_filename + "' to '" + server_filename.abspath() + "'." ) shutil.copyfile(local_filename, server_filename.abspath()) # new optional description file to provide the # actual base filename, such that once it is later processed # copied into the resources directory, it can be done with # only the basename. Otherwise the resource filenames # are too long for some users, preventing them from making # backup CDs of the content, for example. # # Remember that the full path of the # file is only used here as an easy way to keep the names # unique WITHOUT requiring a roundtrip call from the Javascript # to this server, and back again, a process which does not # seem to work with tinyMCE in the mix. BUT, once tinyMCE's # part is done, and this image processed, it can be returned # to just its basename, since the resource parts have their # own unique-ification mechanisms already in place. descrip_file_path = Path(server_filename + ".exe_info") log.debug( "handleTinyMCEimageChoice creating preview " + "description file '" + descrip_file_path.abspath() + "'." ) descrip_file = open(descrip_file_path, "wb") # safety measures against TinyMCE, otherwise it will # later take ampersands and entity-escape them into '&', # and filenames with hash signs will not be found, etc.: unspaced_filename = local_filename.replace(" ", "_") unhashed_filename = unspaced_filename.replace("#", "_num_") unamped_local_filename = unhashed_filename.replace("&", "_and_") log.debug("and setting new file basename as: " + unamped_local_filename) my_basename = os.path.basename(unamped_local_filename) descrip_file.write((u"basename=" + my_basename).encode("utf-8")) descrip_file.flush() descrip_file.close() except Exception, e: client.alert(_("SAVE FAILED!\n%s" % str(e))) log.error("handleTinyMCEimageChoice unable to copy local image " + "file to server prevew, error = " + str(e)) raise
def exportPackage(request, package, exportType, filename, print_callback='', quick=False): """ Called by js. Exports the current package to one of the above formats 'exportType' can be one of 'singlePage' 'webSite' 'zipFile' 'ipod' 'textFile' 'scorm' or 'presentation' 'filename' is a file for scorm pages, and a directory for websites """ G.application.lastExportType = exportType G.application.lastExportPath = filename client.sendScript('document.getElementById("quick-export")' + \ '.setAttribute("disabled", "false");') client.sendScript('document.getElementById("serving-elem")' + \ '.setAttribute("disabled", "false");') client.sendScript('document.getElementById("serving-elem")' + \ '.setAttribute("label", "Start Serving");') client.sendScript('document.getElementById("serving-elem")' + \ '.setAttribute("oncommand", "serveDocument\(\)");') client.sendScript('document.getElementById("quick-export").' +\ 'setAttribute("disabled", "false");') log.info("Filename to export" + filename) webDir = Path(self.config.webDir) if package.style.find("locale/") != -1: # local style loaded stylesDir = self.config.configDir / "style" # delete "locale/" from style name stylesDir /= package.style[package.style.find\ ("locale/") + len("locale/"):] else: # global style stylesDir = webDir / "style" stylesDir /= package.style exportDir = Path(filename).dirname() if exportDir and not exportDir.exists(): client.alert( _(u'Cannot access directory named ') + unicode(exportDir) + _(u'. Please use ASCII names.')) return """ adding the print feature in using the same export functionality: """ if exportType == 'singlePage' or exportType == 'printSinglePage': printit = 0 if exportType == 'printSinglePage': printit = 1 exported_dir = self.exportSinglePage(client, filename, webDir, \ stylesDir, printit) # the above will return None if the desired exported directory # already exists (printing always goes to a new temp dir, though): if printit == 1 and not exported_dir is None: web_printdir = self.get_printdir_relative2web(exported_dir) # now that this has ben exported, go ahead and trigger # the requested printing callback: client.call(print_callback, filename, exported_dir, \ web_printdir) elif exportType == 'webSite': self.exportWebSite(client, filename, stylesDir, quick=quick) elif exportType == 'presentation': self.exportPresentation(client, filename, stylesDir) elif exportType == 'printHandout': exported_dir = self.printHandout(client, filename, stylesDir) print exported_dir web_printdir = self.get_printdir_relative2web(exported_dir) client.call(print_callback, filename, exported_dir, web_printdir) elif exportType == 'zipFile': filename = self.b4save(client, filename, '.zip', _(u'EXPORT FAILED!')) self.exportWebZip(client, filename, stylesDir) elif exportType == 'textFile': self.exportText(client, filename) elif exportType == 'ipod': self.exportIpod(client, filename) elif exportType == "scorm": filename = self.b4save(client, filename, '.zip', _(u'EXPORT FAILED!')) self.exportScorm(client, filename, stylesDir, "scorm1.2") elif exportType == "scorm2004": filename = self.b4save(client, filename, '.zip', _(u'EXPORT FAILED!')) self.exportScorm(client, filename, stylesDir, "scorm2004") elif exportType == "commoncartridge": filename = self.b4save(client, filename, '.zip', _(u'EXPORT FAILED!')) self.exportScorm(client, filename, stylesDir, "commoncartridge") else: filename = self.b4save(client, filename, '.zip', _(u'EXPORT FAILED!')) self.exportIMS(client, filename, stylesDir)
def previewTinyMCEimage(request, package, tinyMCEwin, tinyMCEwin_name, \ tinyMCEfield, local_filename, preview_filename): """ Once an image is selected in the file browser that is spawned by the TinyMCE image dialog, copy this file (which is local to the user's machine) into the server space, under a preview directory (after checking if this exists, and creating it if necessary). Note that this IS a "cheat", in violation of the client-server separation, but can be done since we know that the eXe server is actually sitting on the client host. """ server_filename = "" callback_errors = "" errors = 0 log.debug('handleTinyMCEimageChoice: image local = ' + local_filename + ', base=' + os.path.basename(local_filename)) webDir = Path(G.application.tempWebDir) previewDir = webDir.joinpath('previews') if not previewDir.exists(): log.debug("image previews directory does not yet exist; " \ + "creating as %s " % previewDir) previewDir.makedirs() elif not previewDir.isdir(): client.alert( \ _(u'Preview directory %s is a file, cannot replace it') \ % previewDir) log.error("Couldn't preview tinyMCE-chosen image: "+ "Preview dir %s is a file, cannot replace it" \ % previewDir) callback_errors = "Preview dir is a file, cannot replace" errors += 1 if errors == 0: log.debug('handleTinyMCEimageChoice: originally, local_filename=' + local_filename) local_filename = unicode(local_filename, 'utf-8') log.debug('handleTinyMCEimageChoice: in unicode, local_filename=' + local_filename) localImagePath = Path(local_filename) log.debug('handleTinyMCEimageChoice: after Path, localImagePath= ' + localImagePath) if not localImagePath.exists() or not localImagePath.isfile(): client.alert( \ _(u'Local file %s is not found, cannot preview it') \ % localImagePath) log.error("Couldn't find tinyMCE-chosen image: %s" \ % localImagePath) callback_errors = "Image file %s not found, cannot preview" \ % localImagePath errors += 1 try: # joinpath needs its join arguments to already be in Unicode: #preview_filename = toUnicode(preview_filename); # but that's okay, cuz preview_filename is now URI safe, right? log.debug('URIencoded preview filename=' + preview_filename) server_filename = previewDir.joinpath(preview_filename) log.debug("handleTinyMCEimageChoice copying image from \'"\ + local_filename + "\' to \'" \ + server_filename.abspath() + "\'.") shutil.copyfile(local_filename, \ server_filename.abspath()) # new optional description file to provide the # actual base filename, such that once it is later processed # copied into the resources directory, it can be done with # only the basename. Otherwise the resource filenames # are too long for some users, preventing them from making # backup CDs of the content, for example. # # Remember that the full path of the # file is only used here as an easy way to keep the names # unique WITHOUT requiring a roundtrip call from the Javascript # to this server, and back again, a process which does not # seem to work with tinyMCE in the mix. BUT, once tinyMCE's # part is done, and this image processed, it can be returned # to just its basename, since the resource parts have their # own unique-ification mechanisms already in place. descrip_file_path = Path(server_filename + ".exe_info") log.debug("handleTinyMCEimageChoice creating preview " \ + "description file \'" \ + descrip_file_path.abspath() + "\'.") descrip_file = open(descrip_file_path, 'wb') # safety measures against TinyMCE, otherwise it will # later take ampersands and entity-escape them into '&', # and filenames with hash signs will not be found, etc.: unspaced_filename = local_filename.replace(' ', '_') unhashed_filename = unspaced_filename.replace('#', '_num_') unamped_local_filename = unhashed_filename.replace('&', '_and_') log.debug("and setting new file basename as: " + unamped_local_filename) my_basename = os.path.basename(unamped_local_filename) descrip_file.write((u"basename=" + my_basename).encode('utf-8')) descrip_file.flush() descrip_file.close() except Exception, e: client.alert(_('SAVE FAILED!\n%s' % str(e))) log.error("handleTinyMCEimageChoice unable to copy local image "\ +"file to server prevew, error = " + str(e)) raise