示例#1
0
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})
示例#2
0
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')
示例#3
0
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')