def additional_context(request): context = {} if 'datasource_profile_id' in request.session: rest_datasource = RestDatasourceProfile(username=request.user.username) profile = rest_datasource.get(request.session['datasource_profile_id']) if 'identification' in profile: title = _(profile['pluginName'] + " - %(account)s") % {'account': profile['identification']} else: title = profile['title'] profile['good_title'] = title context['datasource_profile'] = profile if 'datasink_profile_id' in request.session: rest_datasink = RestDatasinkProfile(username=request.user.username) profile = rest_datasink.get(request.session['datasink_profile_id']) if 'identification' in profile: title = _(profile['pluginName'] + " - %(account)s") % {'account': profile['identification']} else: title = profile['title'] profile['good_title'] = title context['datasink_profile'] = profile context['search_form'] = SearchForm(request.POST or None) return context
def __init__(self, *args, **kwargs): self.extra_data = kwargs.pop('extra_data') super(JobCreateForm, self).__init__(*args, **kwargs) rest_datasource_profile = RestDatasourceProfile(username=self.extra_data['username']) result = rest_datasource_profile.options(profile_id=self.extra_data['datasource_profile_id'], data={'keyRing': self.extra_data['key_ring']}) if result and 'sourceOptions' in result: for i, item in enumerate(result['sourceOptions']): self.fields['datasource_options_value_%s' % i] = forms.BooleanField(label=item, required=False) self.fields['datasource_options_key_%s' % i] = forms.CharField(widget=forms.HiddenInput, initial=item) rest_actions = RestAction() actions = rest_actions.get_all() for i, action in enumerate(actions): if action.get('visibility', "") == "job": action['options'] = rest_actions.options(action_id=action['actionId']) self.fields['actions_value_%d' % i] = forms.BooleanField(label=_(action['title']), required=False, help_text=_(action['description'])) self.fields['actions_key_%d' % i] = forms.CharField(widget=forms.HiddenInput, initial=action['actionId']) for j, option in enumerate(action['options']): self.fields['actions_value_%d_option_%d' % (i, j)] = forms.CharField(label=_(option), required=False, widget=forms.PasswordInput) self.fields['actions_value_%d_option_%d' % (i, j)].initial = "" self.fields['actions_key_%d_option_%d' % (i, j)] = forms.CharField(widget=forms.HiddenInput, initial=option)
def index(request): context = additional_context(request) if request.user.is_authenticated(): ### delete job form start job_delete_form = JobDeleteForm(request.POST or None) if job_delete_form.is_valid(): result = job_delete_form.rest_save(username=request.user.username) if result: messages.add_message(request, messages.SUCCESS, _(u'Backup was successfully deleted.')) else: messages.add_message(request, messages.ERROR, _(u'Backup couldn\'t be deleted.')) context['job_delete_form'] = job_delete_form rest_jobs = RestJobs(username=request.user.username) jobs = rest_jobs.get_all() #### delete job form end if jobs and 'errorType' in jobs: if jobs['errorType'] == 'org.backmeup.model.exceptions.UnknownUserException': logout(request) redirect('index') else: messages.error(request, _(jobs['errorMessage'])) context['needs_email_validation'] = True else: rest_datasource_profile = RestDatasourceProfile(username=request.user.username) datasource_profiles = rest_datasource_profile.get_all() rest_datasink_profile = RestDatasinkProfile(username=request.user.username) datasink_profiles = rest_datasink_profile.get_all() for job in jobs: # need to cut of first 3 numbers to get valid unix timestamp if 'createDate' in job: job['createDate'] = datetime.datetime.fromtimestamp(job['createDate']/1000) if 'startDate' in job: job['startDate'] = datetime.datetime.fromtimestamp(job['startDate']/1000) if 'lastBackup' in job: job['lastBackup'] = datetime.datetime.fromtimestamp(job['lastBackup']/1000) if 'nextBackup' in job: job['nextBackup'] = datetime.datetime.fromtimestamp(job['nextBackup']/1000) if 'lastSuccessful' in job: job['lastSuccessful'] = datetime.datetime.fromtimestamp(job['lastSuccessful']/1000) job['datasink']['title'] = get_sink_title(datasink_profiles, job['datasink']['datasinkId']) #job['datasources'] = [] for datasource in job['datasources']: datasource['title'] = get_source_title(datasource_profiles, datasource['datasourceId']) context['jobs'] = jobs return render_to_response( "www/index.html", context, context_instance=RequestContext(request))
def datasource_auth(request): if request.session['auth_data']['type'] == 'Input': # make sure 'requiredInputs' (= list of dicts) is sorted by 'order' dict value(s) request.session['auth_data']['requiredInputs'] = sorted(request.session['auth_data']['requiredInputs'], key=lambda k: k['order']) extra_data = { 'auth_data': request.session['auth_data'], } form = DatasourceAuthForm(request.POST or None, extra_data=extra_data) # redirect to next step if there is no authentication needed... # ... basically means auth type is 'Input' but there are noe input fields definded if not form.fields and request.session['auth_data']['type'] == 'Input': request.session['datasource_profile_id'] = request.session['auth_data']['profileId'] return redirect('datasink-select') # the form won't be valid if auth type is OAuth # so form.is_valid() works for auth type Input only. if form.is_valid() or request.session['auth_data']['type'] == 'OAuth': data = { "keyRing": request.session['key_ring'], } if request.session['auth_data']['type'] == 'Input': for key in form.cleaned_data: if key.startswith('input_key_'): value = form.cleaned_data[key.replace('input_key_', 'input_value_')] data[form.cleaned_data[key]] = value elif request.session['auth_data']['type'] == 'OAuth': data.update(request.session['auth_data']['oauth_data']) # add authentication data to newly created datasource profile rest_datasource_profile = RestDatasourceProfile(username=request.user.username) result = rest_datasource_profile.auth_post(profile_id=request.session['auth_data']['profileId'], data=data) if hasError(result): del request.session['auth_data'] messages.add_message(request, messages.ERROR, getErrorMsg(result)) return redirect('datasource-select') else: request.session['datasource_profile_id'] = request.session['auth_data']['profileId'] del request.session['auth_data'] return redirect('datasink-select') context = additional_context(request) context['form'] = form return render_to_response( "www/datasource_auth.html", context, context_instance=RequestContext(request))
def job_log(request, job_id): rest_jobs = RestJobs(username=request.user.username) job_status = rest_jobs.get_job_status(job_id=job_id) rest_jobs = RestJobs(username=request.user.username) jobs = rest_jobs.get_all() job = get_job(jobs, job_id=job_id) rest_datasource_profile = RestDatasourceProfile(username=request.user.username) datasource_profiles = rest_datasource_profile.get_all() rest_datasink_profile = RestDatasinkProfile(username=request.user.username) datasink_profiles = rest_datasink_profile.get_all() job['datasink']['title'] = get_sink_title(datasink_profiles, job['datasink']['datasinkId']) #job['datasources'] = [] for datasource in job['datasources']: datasource['title'] = get_source_title(datasource_profiles, datasource['datasourceId']) log=job_status['backupStatus'] for l in log: l['message']=l['message'].encode("utf-8") if 'timeStamp' in l: l['timeStamp'] = datetime.datetime.fromtimestamp(int(l['timeStamp'])/1000) context = { 'job': job, 'log': log, } try: context['current_status'] = job_status['backupStatus'][0]['type'] except: pass return render_to_response( "www/job_log.html", context, context_instance=RequestContext(request))
def job_edit(request, job_id): rest_jobs = RestJobs(username=request.user.username) job = rest_jobs.get(job_id=job_id) datasource_profile_id = job['sourceProfiles'][0]['id'] datasink_profile_id = job['sinkProfileId'] rest_datasource_profile = RestDatasourceProfile(username=request.user.username) datasource_profile_options = rest_datasource_profile.options(profile_id=datasource_profile_id, data={'keyRing': request.session['key_ring']})['sourceOptions'] rest_actions = RestAction() actions = rest_actions.get_all() for action in actions: action['options'] = rest_actions.options(action_id=action['actionId']) action['checked'] = False for job_action in job['actions']: if job_action['id'] == action['actionId']: action['checked'] = True extra_data = { 'job': job, 'datasource_profile_options': datasource_profile_options, 'actions': actions, } form = JobEditForm(request.POST or None, extra_data=extra_data) if form.is_valid(): new_source_options = [] new_actions = [] for key in form.cleaned_data: if key.startswith('datasource_options_value_') and form.cleaned_data[key]: new_source_options.append(form.cleaned_data[key.replace('_value_', '_key_')]) if key.startswith('actions_value_') and form.cleaned_data[key]: value = form.cleaned_data[key.replace('_value_', '_key_')] new_actions.append(value) rest_jobs = RestJobs(username=request.user.username) data = { "keyRing": request.session['key_ring'], 'timeExpression': form.cleaned_data['time_expression'], 'sourceProfiles': datasource_profile_id, 'sinkProfileId': datasink_profile_id, 'jobTitle': form.cleaned_data['title'], 'actions': new_actions, } for item in new_source_options: params_key = str(data['sourceProfiles']) + "." + item data[params_key] = "true" job_result = rest_jobs.put(job_id=job_id ,data=data) if hasError(job_result): messages.add_message(request, messages.ERROR, getErrorMsg(job_result)) else: return redirect('index') return render_to_response("www/job_edit.html", { 'form': form, }, context_instance=RequestContext(request))
def datasource_select(request): try: del request.session['datasource_profile_id'] del request.session['datasink_profile_id'] except Exception: pass rest_datasource = RestDatasource() datasources = rest_datasource.get_all() datasource_choices = [] for item in datasources: datasource_choices.append((item['datasourceId'], _(item['title']))) rest_datasource_profile = RestDatasourceProfile(username=request.user.username) datasource_profiles = rest_datasource_profile.get_all() datasource_profile_choices = [] if len(datasource_profiles): for item in datasource_profiles: # no need to show profiles without 'identification' # * it's not a completely authenticated profile # * it's a profile whitch doesn't require authentication if 'identification' in item: title = _(item['pluginName'] + " - %(account)s") % {'account': item['identification']} datasource_profile_choices.append( (item['datasourceProfileId'], title) ) if len(datasource_profile_choices): datasource_profile_choices = [("", "---")] + datasource_profile_choices extra_data = { 'datasource_choices': datasource_choices, 'datasource_profile_choices': datasource_profile_choices, } form = DatasourceSelectForm(request.POST or None, extra_data=extra_data) if form.is_valid(): if form.cleaned_data['datasource']: rest_datasource_profile = RestDatasourceProfile(username=request.user.username) profile_name = _("%(plugin)s - profile") % {'plugin': form.cleaned_data['datasource']} data = { "profileName": profile_name, "keyRing": request.session['key_ring'], } result = rest_datasource_profile.auth(datasource_id=form.cleaned_data['datasource'], data=data) if hasError(result): messages.add_message(request, messages.ERROR, _(getErrorMsg(result))) else: request.session['auth_data'] = result if result['type'] == 'OAuth': request.session['next_step'] = 'datasource-auth' return redirect(result['redirectURL']) return redirect('datasource-auth') elif form.cleaned_data['datasource_profile']: request.session['datasource_profile_id'] = form.cleaned_data['datasource_profile'] try: del request.session['auth_data'] except Exception: pass return redirect('datasink-select') context = additional_context(request) context['form'] = form return render_to_response( "www/datasource_select.html", context, context_instance=RequestContext(request))