from django import forms import zipfile import io import re from .models import Ovpn class VPNForm(forms.ModelForm): pattern_details = re.compile("(?P<country>.+?)\d*\.nordvpn\.com\.(?P<protocol>\w+?)(?P<port>\d+)\.ovpn") import_zip = forms.FileField( label="Importe from zip", help_text="import .ovpn files from zip", required=False ) def clean_import_zip(self): import_zip = self.cleaned_data.get('import_zip') if import_zip: if not zipfile.is_zipfile(import_zip.file): raise forms.ValidationError("Enter a zip file.") return import_zip def do_import(self, instance): """Import zip files""" import_zip = self.cleaned_data.get('import_zip') if import_zip and instance.pk is not None: zipf = zipfile.ZipFile(import_zip.file) for filename in zipf.namelist(): stream = zipf.read(filename) match = self.pattern_details.match(filename) if match: dgroup = match.groupdict() ovpn = Ovpn(vpn=instance, country=dgroup['country'], protocol=dgroup['protocol'], port=int(dgroup['port'])) _stream = io.BytesIO(stream) _stream.size = len(stream) ovpn.file.save(filename, _stream) ovpn.save() else: print '*' * 25 print filename def save(self, commit=True): instance = super(VPNForm, self).save(commit=commit) self.do_import(instance) return instance