def add_featured_links(self, request, zip_file, save_dir): structure = peppercorn.parse(request.POST.items()) if structure.has_key('featuredlinks'): featuredlinks = build_featured_links(structure) if featuredlinks: cnxml = get_cnxml_from_zipfile(zip_file) new_cnxml = add_featuredlinks_to_cnxml(cnxml, featuredlinks) files = get_files_from_zipfile(zip_file) save_cnxml(save_dir, new_cnxml, files) return featuredlinks
def cnxml_view(request): check_login(request) form = Form(request, schema=CnxmlSchema) save_dir = os.path.join(request.registry.settings['transform_dir'], request.session['upload_dir']) cnxml_filename = os.path.join(save_dir, 'index.cnxml') transformerror = request.session.get('transformerror') # Check for successful form completion if 'cnxml' in request.POST and form.validate(): cnxml = form.data['cnxml'] # Keep sure we use the standard python ascii string and encode Unicode to xml character mappings if isinstance(cnxml, unicode): cnxml = cnxml.encode('ascii', 'xmlcharrefreplace') # get the list of files from upload.zip if it exists files = [] zip_filename = os.path.join(save_dir, 'upload.zip') if os.path.exists(zip_filename): zip_archive = zipfile.ZipFile(zip_filename, 'r') for filename in zip_archive.namelist(): if filename == 'index.cnxml': continue fp = zip_archive.open(filename, 'r') files.append((filename, fp.read())) fp.close() try: files = get_files_from_zipfile(os.path.join(save_dir, 'upload.zip')) save_cnxml(save_dir, cnxml, files) validate_cnxml(cnxml) except ConversionError as e: return render_conversionerror(request, e.msg) # Return to preview return HTTPFound(location=request.route_url('preview'), request=request) # Read CNXML try: with open(cnxml_filename, 'rt') as fp: cnxml = fp.read() except IOError: raise HTTPNotFound('index.cnxml not found') # Clean CNXML cnxml = clean_cnxml(cnxml) cnxml = cnxml.decode('utf-8') cnxml = unicode(cnxml) return { 'codemirror': True, 'form': FormRenderer(form), 'cnxml': cnxml, 'transformerror': transformerror, }
def enhance(request): check_login(request) session = request.session google_resource_id = "" slideshare_id = "" embed_google = False embed_slideshare = False not_converted = True show_iframe = False form = Form(request, schema=QuestionAnswerSchema) validate_form = form.validate() print form.all_errors() if session.has_key('google-resource-id'): google_resource_id = session['google-resource-id'] if session.has_key('slideshare_id'): slideshare_id = session['slideshare_id'] if fetch_slideshow_status(slideshare_id) == "2": not_converted = False show_iframe = True if google_resource_id!="": embed_google = True if slideshare_id!="": embed_slideshare = True templatePath = "templates/google_ss_preview.pt" if validate_form: introductory_paragraphs = request.POST.get('introductory_paragraphs') question_count=0 cnxml=session["cnxml"]+"""<content><section id="intro-section-title"><title id="introtitle">Introduction</title><para id="introduction-1">"""+introductory_paragraphs+"""</para></section><section id="slides-embed"><title id="slide-embed-title">View the slides</title><figure id="ss-embed-figure"><media id="slideshare-embed" alt="slideshare-embed"><iframe src="http://www.slideshare.net/slideshow/embed_code/"""+slideshare_id+"""" width="425" height="355" /></media></figure></section>""" for i in range(1,6): form_question = request.POST.get('question-'+str(i)) if form_question: form_radio_answer = request.POST.get('radio-'+str(i)) #this give us something like 'answer-1-1'. so our solution is this question_count +=1 if question_count==1: cnxml+="""<section id="test-section"><title>Test your knowledge</title>""" itemlist = "" for j in range(1,10): try: form_all_answers = request.POST.get('answer-'+str(i)+'-'+str(j)) if form_all_answers: itemlist +="<item>" + form_all_answers+"</item>" except: print "No element found" if form_radio_answer: solution = request.POST.get(form_radio_answer) cnxml+="""<exercise id="exercise-"""+str(i)+""""><problem id="problem-"""+str(i)+""""><para id="para-"""+str(i)+"""">"""+str(form_question)+"""<list id="option-list-"""+str(i)+"""" list-type="enumerated" number-style="lower-alpha">"""+str(itemlist)+"""</list></para></problem>""" else: print "ELESE CONDUITION OF radio" solution = request.POST.get('answer-'+str(i)+'-1') cnxml+="""<exercise id="exercise-"""+str(i)+""""><problem id="problem-"""+str(i)+""""><para id="para-"""+str(i)+"""">"""+str(form_question)+"""</para></problem>""" print "FORM RADIO ANSWER",form_radio_answer print "SOLUTION", solution cnxml+=""" <solution id="solution-"""+str(i)+""""> <para id="solution-para-"""+str(i)+"""">"""+solution+"""</para></solution></exercise>""" """form_solution = request.POST.get('solution-'+str(i)) all_post_data = {"data":{"options":form_options,"solution":form_solution,"question":form_question}} for question in all_post_data: options = all_post_data[question]['options'] solution = all_post_data[question]['solution'] asked_question = all_post_data[question]['question'] optionlist="" for option in options: optionlist+="<item>"+option+"</item>""" #cnxml+="""<exercise id="exercise-"""+str(j)+""""><problem id="problem-"""+str(j)+""""><para id="para-"""+str(j)+"""">"""+str(asked_question)+"""<list id="option-list-"""+str(j)+"""" list-type="enumerated" number-style="lower-alpha">"""+str(optionlist)+"""</list></para></problem>""" #cnxml+=""" <solution id="solution-"""+str(j)+""""> <para id="solution-para-"""+str(j)+"""">"""+solution+"""</para></solution></exercise>""" #j+=1 metadata = session['metadata'] if question_count>=1: cnxml += "</section></content></document>" else: cnxml += "</content></document>" workspaces = [(i['href'], i['title']) for i in session['login'].collections] metadata_entry = sword2cnx.MetaData(metadata) zipped_filepath = session['userfilepath'] zip_archive = zipfile.ZipFile(zipped_filepath, 'w') zip_archive.writestr("index.cnxml",cnxml) zip_archive.close() conn = sword2cnx.Connection("http://cnx.org/sword/servicedocument", user_name=session['login'].username, user_pass=session['login'].password, always_authenticate=True, download_service_document=True) collections = [{'title': i.title, 'href': i.href} for i in sword2cnx.get_workspaces(conn)] session['login'].collections = collections workspaces = [(i['href'], i['title']) for i in session['login'].collections] session['workspaces'] = workspaces with open(zipped_filepath, 'rb') as zip_file: deposit_receipt = conn.create( col_iri = workspaces[0][0], metadata_entry = metadata_entry, payload = zip_file, filename = 'upload.zip', mimetype = 'application/zip', packaging = 'http://purl.org/net/sword/package/SimpleZip', in_progress = True) session['dr'] = deposit_receipt session['deposit_receipt'] = deposit_receipt.to_xml() soup = BeautifulSoup(deposit_receipt.to_xml()) data = soup.find("link",rel="edit") edit_iri = data['href'] session['edit_iri'] = edit_iri creator = soup.find('dcterms:creator') username = session['login'].username email = creator["oerdc:email"] url = "http://connexions-oerpub.appspot.com/" post_values = {"username":username,"email":email,"slideshow_id":slideshare_id} data = urllib.urlencode(post_values) google_req = urllib2.Request(url, data) google_response = urllib2.urlopen(google_req) now_string = datetime.datetime.now().strftime('%Y%m%d-%H%M%S') temp_dir_name = '%s-%s' % (request.session['login'].username, now_string) save_dir = os.path.join(request.registry.settings['transform_dir'],temp_dir_name) os.mkdir(save_dir) request.session['upload_dir'] = temp_dir_name cnxml = clean_cnxml(cnxml) save_cnxml(save_dir,cnxml,[]) return HTTPFound(location=request.route_url('metadata')) #return HTTPFound(location=request.route_url('updatecnx')) response = {'form':FormRenderer(form), "slideshare_id":slideshare_id, "google_resource_id":google_resource_id, "embed_google":embed_google, "embed_slideshare":embed_slideshare, "not_converted": not_converted, "show_iframe":show_iframe} return render_to_response(templatePath, response, request=request)
def do_transition(self, form=None, request=None): errors = {} session = self.session request = self.request workspaces = self.workspaces self.target_module_url = session.get('target_module_url', None) # Check for successful form completion if form.validate(): # Find what the user actually wanted to do. # This is important since we don't want to upload the module to cnx # if the user clicked on the back button. action = self.request.params.get( 'btn-forward') and 'forward' or 'back' if action == 'forward': self.set_selected_workspace(form.data['workspace']) self.update_session(session, self.remember_fields, form) # Reconstruct the path to the saved files save_dir = os.path.join( request.registry.settings['transform_dir'], session['upload_dir']) # Create a connection to the sword service conn = self.get_connection() # Send zip file to Connexions through SWORD interface with open(os.path.join(save_dir, 'upload.zip'), 'rb') as zip_file: # Create the metadata entry metadata_entry = self.get_metadata_entry(form, session) title = form.data['title'] # get the cnxml file from zip and update it updated_cnxml = self.update_cnxml(request, zip_file) # write cnxml et al to server and zip filename files = get_files_from_zipfile(zip_file) save_cnxml(save_dir, updated_cnxml, files, title=title) if self.target_module_url: # this is an update not a create deposit_receipt = self.update_module( save_dir, conn, metadata_entry, self.target_module_url) else: # this is a workaround until I can determine why the # featured links don't upload correcly with a multipart # upload during module creation. See redmine issue 40 # TODO: # Fix me properly! if self.featured_links: deposit_receipt = create_module_in_2_steps( form, conn, metadata_entry, zip_file, save_dir) else: deposit_receipt = self.create_module( form, conn, metadata_entry, zip_file) # Remember to which workspace we submitted session['deposit_workspace'] = workspaces[[ x[0] for x in workspaces ].index(form.data['workspace'])][1] # The deposit receipt cannot be pickled, so we pickle the xml session['deposit_receipt'] = deposit_receipt.to_xml() else: errors.update(form.errors) return errors
def enhance(request): check_login(request) session = request.session google_resource_id = "" slideshare_id = "" embed_google = False embed_slideshare = False not_converted = True show_iframe = False form = Form(request, schema=QuestionAnswerSchema) validate_form = form.validate() print form.all_errors() if session.has_key('google-resource-id'): google_resource_id = session['google-resource-id'] if session.has_key('slideshare_id'): slideshare_id = session['slideshare_id'] if fetch_slideshow_status(slideshare_id) == "2": not_converted = False show_iframe = True if google_resource_id != "": embed_google = True if slideshare_id != "": embed_slideshare = True templatePath = "templates/google_ss_preview.pt" if validate_form: introductory_paragraphs = request.POST.get('introductory_paragraphs') question_count = 0 cnxml = session[ "cnxml"] + """<content><section id="intro-section-title"><title id="introtitle">Introduction</title><para id="introduction-1">""" + introductory_paragraphs + """</para></section><section id="slides-embed"><title id="slide-embed-title">View the slides</title><figure id="ss-embed-figure"><media id="slideshare-embed" alt="slideshare-embed"><iframe src="http://www.slideshare.net/slideshow/embed_code/""" + slideshare_id + """" width="425" height="355" /></media></figure></section>""" for i in range(1, 6): form_question = request.POST.get('question-' + str(i)) if form_question: form_radio_answer = request.POST.get( 'radio-' + str(i) ) #this give us something like 'answer-1-1'. so our solution is this question_count += 1 if question_count == 1: cnxml += """<section id="test-section"><title>Test your knowledge</title>""" itemlist = "" for j in range(1, 10): try: form_all_answers = request.POST.get('answer-' + str(i) + '-' + str(j)) if form_all_answers: itemlist += "<item>" + form_all_answers + "</item>" except: print "No element found" if form_radio_answer: solution = request.POST.get(form_radio_answer) cnxml += """<exercise id="exercise-""" + str( i ) + """"><problem id="problem-""" + str( i ) + """"><para id="para-""" + str(i) + """">""" + str( form_question ) + """<list id="option-list-""" + str( i ) + """" list-type="enumerated" number-style="lower-alpha">""" + str( itemlist) + """</list></para></problem>""" else: print "ELESE CONDUITION OF radio" solution = request.POST.get('answer-' + str(i) + '-1') cnxml += """<exercise id="exercise-""" + str( i) + """"><problem id="problem-""" + str( i) + """"><para id="para-""" + str( i) + """">""" + str( form_question) + """</para></problem>""" print "FORM RADIO ANSWER", form_radio_answer print "SOLUTION", solution cnxml += """ <solution id="solution-""" + str( i ) + """"> <para id="solution-para-""" + str( i ) + """">""" + solution + """</para></solution></exercise>""" """form_solution = request.POST.get('solution-'+str(i)) all_post_data = {"data":{"options":form_options,"solution":form_solution,"question":form_question}} for question in all_post_data: options = all_post_data[question]['options'] solution = all_post_data[question]['solution'] asked_question = all_post_data[question]['question'] optionlist="" for option in options: optionlist+="<item>"+option+"</item>""" #cnxml+="""<exercise id="exercise-"""+str(j)+""""><problem id="problem-"""+str(j)+""""><para id="para-"""+str(j)+"""">"""+str(asked_question)+"""<list id="option-list-"""+str(j)+"""" list-type="enumerated" number-style="lower-alpha">"""+str(optionlist)+"""</list></para></problem>""" #cnxml+=""" <solution id="solution-"""+str(j)+""""> <para id="solution-para-"""+str(j)+"""">"""+solution+"""</para></solution></exercise>""" #j+=1 metadata = session['metadata'] if question_count >= 1: cnxml += "</section></content></document>" else: cnxml += "</content></document>" workspaces = [(i['href'], i['title']) for i in session['login'].collections] metadata_entry = sword2cnx.MetaData(metadata) zipped_filepath = session['userfilepath'] zip_archive = zipfile.ZipFile(zipped_filepath, 'w') zip_archive.writestr("index.cnxml", cnxml) zip_archive.close() conn = sword2cnx.Connection("http://cnx.org/sword/servicedocument", user_name=session['login'].username, user_pass=session['login'].password, always_authenticate=True, download_service_document=True) collections = [{ 'title': i.title, 'href': i.href } for i in sword2cnx.get_workspaces(conn)] session['login'].collections = collections workspaces = [(i['href'], i['title']) for i in session['login'].collections] session['workspaces'] = workspaces with open(zipped_filepath, 'rb') as zip_file: deposit_receipt = conn.create( col_iri=workspaces[0][0], metadata_entry=metadata_entry, payload=zip_file, filename='upload.zip', mimetype='application/zip', packaging='http://purl.org/net/sword/package/SimpleZip', in_progress=True) session['dr'] = deposit_receipt session['deposit_receipt'] = deposit_receipt.to_xml() soup = BeautifulSoup(deposit_receipt.to_xml()) data = soup.find("link", rel="edit") edit_iri = data['href'] session['edit_iri'] = edit_iri creator = soup.find('dcterms:creator') username = session['login'].username email = creator["oerdc:email"] url = "http://connexions-oerpub.appspot.com/" post_values = { "username": username, "email": email, "slideshow_id": slideshare_id } data = urllib.urlencode(post_values) google_req = urllib2.Request(url, data) google_response = urllib2.urlopen(google_req) now_string = datetime.datetime.now().strftime('%Y%m%d-%H%M%S') temp_dir_name = '%s-%s' % (request.session['login'].username, now_string) save_dir = os.path.join(request.registry.settings['transform_dir'], temp_dir_name) os.mkdir(save_dir) request.session['upload_dir'] = temp_dir_name cnxml = clean_cnxml(cnxml) save_cnxml(save_dir, cnxml, []) return HTTPFound(location=request.route_url('metadata')) #return HTTPFound(location=request.route_url('updatecnx')) response = { 'form': FormRenderer(form), "slideshare_id": slideshare_id, "google_resource_id": google_resource_id, "embed_google": embed_google, "embed_slideshare": embed_slideshare, "not_converted": not_converted, "show_iframe": show_iframe } return render_to_response(templatePath, response, request=request)
def do_transition(self, form=None, request=None): errors = {} session = self.session request = self.request workspaces = self.workspaces self.target_module_url = session.get('target_module_url', None) # Check for successful form completion if form.validate(): # Find what the user actually wanted to do. # This is important since we don't want to upload the module to cnx # if the user clicked on the back button. action = self.request.params.get('btn-forward') and 'forward' or 'back' if action == 'forward': self.set_selected_workspace(form.data['workspace']) self.update_session(session, self.remember_fields, form) # Reconstruct the path to the saved files save_dir = os.path.join( request.registry.settings['transform_dir'], session['upload_dir'] ) # Create a connection to the sword service conn = self.get_connection() # Send zip file to Connexions through SWORD interface with open(os.path.join(save_dir, 'upload.zip'), 'rb') as zip_file: # Create the metadata entry metadata_entry = self.get_metadata_entry(form, session) title = form.data['title'] # get the cnxml file from zip and update it updated_cnxml = self.update_cnxml(request, zip_file) # write cnxml et al to server and zip filename files = get_files_from_zipfile(zip_file) save_cnxml(save_dir, updated_cnxml, files, title=title) if self.target_module_url: # this is an update not a create deposit_receipt = self.update_module( save_dir, conn, metadata_entry, self.target_module_url) else: # this is a workaround until I can determine why the # featured links don't upload correcly with a multipart # upload during module creation. See redmine issue 40 # TODO: # Fix me properly! if self.featured_links: deposit_receipt = create_module_in_2_steps( form, conn, metadata_entry, zip_file, save_dir) else: deposit_receipt = self.create_module( form, conn, metadata_entry, zip_file) # Remember to which workspace we submitted session['deposit_workspace'] = workspaces[[x[0] for x in workspaces].index(form.data['workspace'])][1] # The deposit receipt cannot be pickled, so we pickle the xml session['deposit_receipt'] = deposit_receipt.to_xml() else: errors.update(form.errors) return errors