Example #1
0
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))
Example #2
0
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))
Example #3
0
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))