def viewvolume(request, volume_id): session = request.session username = session['login_email'] user = db.read_user(username) vol = db.read_volume(volume_id) if not vol: return redirect('django_volume.views.failure') UserInfo = namedtuple("UserInfo", ["email", "caps_str"]) user_info = [] user_info.append(UserInfo(email=user.email, caps_str="owner")) rw_users = db.list_rw_volume_users(vol.volume_id, sort=True, projection=['email']) ro_users = db.list_ro_volume_users(vol.volume_id, sort=True, projection=['email']) for u in rw_users: user_info.append(UserInfo(email=u.email, caps_str="read/write")) for u in ro_users: user_info.append(UserInfo(email=u.email, caps_str="read-only")) rgs = db.list_replica_gateways_by_volume(vol.volume_id) ags = db.list_acquisition_gateways_by_volume(vol.volume_id) t = loader.get_template('viewvolume.html') c = RequestContext( request, { 'username': username, 'volume': vol, 'ags': ags, 'rgs': rgs, 'user_info': user_info }) return HttpResponse(t.render(c))
def volumesettings(request, volume_id): ''' old_data is for keeping state while changing the description when the password is wrong, no password is entered, etc. initial_data is for keeping state of the gateways when mistakes are made etc. ''' session = request.session username = session['login_email'] vol = db.read_volume(volume_id) if not vol: return redirect('django_volume.views.viewvolume', volume_id) message = session.pop('message', "") initial_data_ag = session.get('volume_initial_ags' + str(volume_id), None) initial_data_rg = session.get('volume_initial_rgs' + str(volume_id), None) old_data = session.get('old_data' + str(volume_id), None) if not initial_data_ag: initial_data_ag = [] ags = db.list_acquisition_gateways_by_volume(vol.volume_id) for g in ags: initial_data_ag.append({'g_name': g.ms_username, 'remove': False}) session['volume_initial_ags' + str(volume_id)] = initial_data_ag if not initial_data_rg: initial_data_rg = [] rgs = db.list_replica_gateways_by_volume(vol.volume_id) for g in rgs: initial_data_rg.append({'g_name': g.ms_username, 'remove': False}) session['volume_initial_rgs' + str(volume_id)] = initial_data_rg if old_data: desc_form = forms.ChangeVolumeD(initial={'description': old_data}) else: desc_form = forms.ChangeVolumeD( initial={'description': vol.description}) pass_form = libforms.ChangePassword() password = libforms.Password() GatewayFormset = formset_factory(forms.Gateway, extra=0) if initial_data_rg: rg_form = GatewayFormset(initial=initial_data_rg) else: rg_form = None if initial_data_ag: ag_form = GatewayFormset(initial=initial_data_ag) else: ag_form = None t = loader.get_template('volumesettings.html') c = RequestContext( request, { 'username': username, 'volume': vol, 'desc_form': desc_form, 'pass_form': pass_form, 'password': password, 'message': message, 'ag_form': ag_form, 'rg_form': rg_form, }) return HttpResponse(t.render(c))
def deletevolume(request, volume_id): ''' View for deleting volumes. Since so many other entites have properties related to volume ID's, numerous db updates need to be checked. CQ, they are all grouped together into the transactional helper method multi_update(). ''' # Clear out volume_id in properties for users, UG's, AG's, and RG's. @transactional(xg=True) def multi_update(vol, users, usergateways, acquisitiongateways, replicagateways): v_id = vol.volume_id db.delete_volume(v_id) logging.info(users) for user in users: fields = {} if v_id in user.volumes_o: new_volumes_o = user.volumes_o new_volumes_o.remove(v_id) fields['volumes_o'] = new_volumes_o if v_id in user.volumes_rw: new_volumes_rw = user.volumes_rw new_volumes_rw.remove(v_id) fields['volumes_rw'] = new_volumes_rw if v_id in user.volumes_r: new_volumes_r = user.volumes_r new_volumes_r.remove(v_id) fields['volumes_r'] = new_volumes_r if fields: db.update_user(user.email, **fields) for ug in usergateways: fields = {} fields['volume_id'] = 0 db.update_user_gateway(ug.g_id, **fields) for ag in acquisitiongateways: logging.info(ag) fields = {} new_ids = ag.volume_ids.remove(v_id) if not new_ids: fields['volume_ids'] = [] else: fields['volume_ids'] = new_ids db.update_acquisition_gateway(ag.g_id, **fields) for rg in replicagateways: fields = {} new_ids = rg.volume_ids.remove(v_id) if not new_ids: fields['volume_ids'] = [] else: fields['volume_ids'] = new_ids db.update_replica_gateway(rg.g_id, **fields) # Clear initial data session variable to prevent stale tables in ag.views.viewgateway and rg.views.viewgateway session.pop("rg_initial_data" + str(v_id), None) session.pop("ag_initial_data" + str(v_id), None) # Clear initial data session variable to prevent stale data in volume settings, change rgs, and change ags. session.pop("volume_initial_ags" + str(v_id), None) session.pop("volume_initial_rgs" + str(v_id), None) session = request.session message = session.pop('message', "") username = session['login_email'] vol = db.read_volume(volume_id) if not vol: return redirect('django_volume.views.viewvolume', volume_id) if request.method == "POST": form = forms.DeleteVolume(request.POST) if form.is_valid(): # Check password hash hash_check = Volume.generate_password_hash( form.cleaned_data['password'], vol.volume_secret_salt) if hash_check == vol.volume_secret_salted_hash: # Ok to delete attrs = {} users = db.list_users( {'SyndicateUser.volumes_rw ==': vol.volume_id}) users.extend( db.list_users( {'SyndicateUser.volumes_r ==': vol.volume_id})) ags = db.list_acquisition_gateways_by_volume(vol.volume_id) rgs = db.list_replica_gateways_by_volume(vol.volume_id) ugs = db.list_user_gateways_by_volume(vol.volume_id) try: multi_update(vol, users, ugs, ags, rgs) except Exception as e: logging.error("Unable to delete volume %s" % e) session['message'] = "Unable to delete volume." return redirect('django_volume.views.deletevolume', volume_id=vol.volume_id) session['new_change'] = "We've deleted your volume." session['next_url'] = '/syn/volume/myvolumes/' session[ 'next_message'] = "Click here to go back to your volumes." return redirect('/syn/thanks') else: session['message'] = "Invalid password" return redirect('django_volume.views.deletevolume', volume_id=vol.volume_id) else: session['message'] = "Please fill out all entries" return redirect('django_volume.views.deletevolume', vol.volume_id) else: form = forms.DeleteVolume() t = loader.get_template('deletevolume.html') c = RequestContext(request, { 'username': username, 'form': form, 'message': message, 'volume': vol }) return HttpResponse(t.render(c))