# -*- coding: utf-8 -*- from __future__ import unicode_literals import os import urllib2 from django.http import StreamingHttpResponse, HttpResponseServerError from django.shortcuts import render_to_response, get_object_or_404 from django.views.generic.detail import DetailView from django.views.generic.edit import UpdateView from django.conf import settings from django.contrib.messages.views import SuccessMessageMixin from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator from coin.members.models import Member from .models import VPNConfiguration class VPNView(SuccessMessageMixin, UpdateView): model = VPNConfiguration fields = ["ipv4_endpoint", "ipv6_endpoint", "comment"] success_message = "Configuration enregistrée avec succès !" @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(VPNView, self).dispatch(*args, **kwargs) def get_object(self): if self.request.user.is_superuser: return get_object_or_404(VPNConfiguration, pk=self.kwargs.get("pk")) # For normal users, ensure the VPN belongs to them. return get_object_or_404( VPNConfiguration, pk=self.kwargs.get("pk"), offersubscription__member=self.request.user, ) class VPNGeneratePasswordView(VPNView): """This generates a random password, saves it in hashed form, and returns it to the user in cleartext. """ def get_context_data(self, **kwargs): context = super(VPNGeneratePasswordView, self).get_context_data(**kwargs) # Generate a new random password and save it password = Member.objects.make_random_password() self.object.password = password # This will hash the password automatically self.object.full_clean() self.object.save() context["password"] = password return context @login_required def get_graph(request, vpn_id, period="daily"): """ This get the graph for the associated vpn_id and time period """ if request.user.is_superuser: vpn = get_object_or_404(VPNConfiguration, pk=vpn_id) else: # For normal users, ensure the VPN belongs to them vpn = get_object_or_404( VPNConfiguration, pk=vpn_id, offersubscription__member=request.user ) time_periods = { "hourly": "-1hour", "daily": "-24hours", "weekly": "-8days", "monthly": "-32days", "yearly": "-13months", } if period not in time_periods: period = "daily" graph_url = os.path.join( settings.GRAPHITE_SERVER, "render/?width=586&height=308&from=%(period)s&" "target=alias%%28scaleToSeconds%%28vpn1.%(login)s.downrxbytes%%2C1%%29%%2C%%20%%22Download%%22%%29&" "target=alias%%28scaleToSeconds%%28vpn1.%(login)s.uptxbytes%%2C1%%29%%2C%%20%%22Upload%%22%%29&" "title=VPN%%20Usage%%20%(login)s" % {"period": time_periods[period], "login": vpn.login}, ) try: return StreamingHttpResponse( urllib2.urlopen(graph_url), content_type="image/png" ) except urllib2.URLError: return HttpResponseServerError()