def upload(request): if request.method == 'POST': form = UploadedFileForm(request.POST, request.FILES) keys = SecretKey.objects.all() if not form.is_valid(): return render(request, 'upload.html', {'form': form}) if request.FILES['data_file'].content_type == 'application/gzip': # Check validity of provided secret key try: SecretKey.objects.get(key=request.POST['secret_key']) except: return render(request, 'upload.html', {'form': form, 'message': 'Secret key incorrect', type: 'alert-error'}) newfile = UploadedFile(name=request.FILES['data_file'].name, data_file=request.FILES['data_file'], secret_key=request.POST['secret_key']) newfile.save() file = UploadedFile.objects.get(name=request.FILES['data_file'].name) temp = settings.MEDIA_ROOT + settings.TEMP_FOLDER # Untar the archive to a temp location and read its data untar = subprocess.Popen(['tar', 'xvzf', file.data_file.path, '-C', temp], stdout=subprocess.PIPE) comm = untar.communicate()[0] comm = comm.split('\n')[0] directory = comm[:-len("/")] try: data = read_config(temp + directory) except: newfile.delete() subprocess.call(['rm', '-r', temp + directory]) return render(request, 'upload.html', {'form': form, 'message': 'Malformed archive. Please resubmit in accordance with Genesis Plugin API guidelines.', type: 'alert-error'}) # Create a backup if a matching plugin already exists if UploadedFile.objects.filter(PLUGIN_ID=directory).exists(): backup(UploadedFile.objects.get(PLUGIN_ID=directory)) # Update the database with the new plugin data file.name = data.NAME file.DESCRIPTION = data.DESCRIPTION file.AUTHOR = data.AUTHOR file.MODULES = data.MODULES file.PLATFORMS = data.PLATFORMS file.VERSION = data.VERSION file.DEPS = data.DEPS file.HOMEPAGE = data.HOMEPAGE file.PLUGIN_ID = directory file.ICON.save(directory + '.png', File(open(temp + directory + '/files/icon.png'))) file.BACKUP = False subprocess.call(['rm', '-r', temp + directory]) # Display success message return render(request, 'upload.html', {'form': form, 'message': 'Upload successful!', type: 'alert-success'}) else: return render(request, 'upload.html', {'form': form, 'message': 'Form not valid, or file not of acceptable type', type: 'alert-error'}) else: form = UploadedFileForm() return render(request, 'upload.html', {'form': form})
def upload_project(request): """ View: Processes new project file upload of an authenticated user. Redirects to index page if unauthenticated. Otherwise once the file is parsed for domains to process, the user is redirected back to their project listing with an appropriate success or failure message. """ if not request.user.is_authenticated(): logger.debug('Unauthenticated user.') return redirect('index') project = None if request.method == 'POST': uploadform = URLFileForm(request.POST, request.FILES) logger.debug('Attempting to upload project...') if uploadform.is_valid(): logger.debug('Form is valid.') file_contents = unicode(request.FILES['file'].read(), errors='ignore') (domain_list, failed_domains, failed_lines) = extract_domains(file_contents, request.user.email, request.FILES['file'].name) projectdomains = [] with transaction.atomic(): project = UserProject(state='checking', last_updated=timezone.now(), user_id=request.user.id) parse_error_str = '' # If any lines failed, track them if len(failed_lines) > 0: for fd in failed_lines: parse_error_str += '%d: %s (%s)\n' % (fd[0], fd[1], fd[2]) project.parse_errors = parse_error_str project.save() # Store uploaded file in database projectfile = UploadedFile(filename=request.FILES['file'].name, filedata=file_contents, project_id=project.id) # Create and associate project domain records for domain in domain_list: projectdomains.append( ProjectDomain(domain=domain, subdomains_preserved=False, is_checked=False, state='unchecked', last_checked=timezone.now(), project_id=project.id)) for (domain, state, error) in failed_domains: projectdomains.append( ProjectDomain(domain=domain, subdomains_preserved=False, is_checked=True, state=state, last_checked=timezone.now(), project_id=project.id, error=error)) projectfile.save() [pd.save() for pd in projectdomains] # Initial celery task to check availability of parsed domains if project.projectdomain_set.exclude(state='error').count() == 0: project.state = 'completed' project.save() request.session[ 'profile_message'] = 'Project "%s" successfully uploaded but no valid domains were found for checking.' % request.FILES[ 'file'].name request.session['profile_messagetype'] = 'warning' else: task_id = check_project_domains.delay(project.id) project_task = ProjectTask() project_task.project_id = project.id project_task.celery_id = task_id project_task.type = 'checker' project_task.save() request.session[ 'profile_message'] = 'Project "%s" successfully uploaded. You will be emailed when domain checking is complete.' % request.FILES[ 'file'].name request.session['profile_messagetype'] = 'success' return redirect('project_list') else: # If an error occurred, inform the user logger.debug(uploadform.errors) request.session[ 'profile_message'] = '<b>Project not uploaded.</b> The following errors occurred: %s' % uploadform.errors request.session['profile_messagetype'] = 'danger' return redirect('project_list')
def upload_project(request): """ View: Processes new project file upload of an authenticated user. Redirects to index page if unauthenticated. Otherwise once the file is parsed for domains to process, the user is redirected back to their project listing with an appropriate success or failure message. """ if not request.user.is_authenticated(): logger.debug('Unauthenticated user.') return redirect('index') project = None if request.method == 'POST': uploadform = URLFileForm(request.POST, request.FILES) logger.debug('Attempting to upload project...') if uploadform.is_valid(): logger.debug('Form is valid.') file_contents = unicode(request.FILES['file'].read(), errors='ignore') (domain_list, failed_domains, failed_lines) = extract_domains(file_contents, request.user.email, request.FILES['file'].name) projectdomains = [] with transaction.atomic(): project = UserProject(state='checking', last_updated=timezone.now(), user_id=request.user.id) parse_error_str = '' # If any lines failed, track them if len(failed_lines) > 0: for fd in failed_lines: parse_error_str += '%d: %s (%s)\n' % (fd[0], fd[1], fd[2]) project.parse_errors = parse_error_str project.save() # Store uploaded file in database projectfile = UploadedFile(filename=request.FILES['file'].name, filedata=file_contents, project_id=project.id) # Create and associate project domain records for domain in domain_list: projectdomains.append(ProjectDomain(domain=domain, subdomains_preserved=False, is_checked=False, state='unchecked', last_checked=timezone.now(), project_id=project.id)) for (domain, state, error) in failed_domains: projectdomains.append(ProjectDomain(domain=domain, subdomains_preserved=False, is_checked=True, state=state, last_checked=timezone.now(), project_id=project.id, error=error)) projectfile.save() [pd.save() for pd in projectdomains] # Initial celery task to check availability of parsed domains if project.projectdomain_set.exclude(state='error').count() == 0: project.state = 'completed' project.save() request.session['profile_message'] = 'Project "%s" successfully uploaded but no valid domains were found for checking.' % request.FILES['file'].name request.session['profile_messagetype'] = 'warning' else: task_id = check_project_domains.delay(project.id) project_task = ProjectTask() project_task.project_id = project.id project_task.celery_id = task_id project_task.type = 'checker' project_task.save() request.session['profile_message'] = 'Project "%s" successfully uploaded. You will be emailed when domain checking is complete.' % request.FILES['file'].name request.session['profile_messagetype'] = 'success' return redirect('project_list') else: # If an error occurred, inform the user logger.debug(uploadform.errors) request.session['profile_message'] = '<b>Project not uploaded.</b> The following errors occurred: %s' % uploadform.errors request.session['profile_messagetype'] = 'danger' return redirect('project_list')