147 lines
4.6 KiB
Python
147 lines
4.6 KiB
Python
from django.conf import settings
|
|
from django.contrib.auth import login, logout as auth_logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.forms import AuthenticationForm
|
|
from django.contrib.auth.models import User
|
|
from django.shortcuts import render, redirect
|
|
from rest_framework import viewsets, views
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
|
|
from mailadmin.api import CPanel
|
|
from mailadmin.models import OrgUnit
|
|
from mailadmin.serializers import UserSerializer, OrgUnitSerializer, ForwardSerializer
|
|
from mailadmin.permissions import DestinationPrefixOwner
|
|
|
|
|
|
def index(request):
|
|
form = {}
|
|
if request.method == "POST":
|
|
form = AuthenticationForm(data=request.POST)
|
|
if form.is_valid():
|
|
# Log the user in.
|
|
login(request, form.get_user())
|
|
return redirect('home')
|
|
else:
|
|
if request.user.is_authenticated():
|
|
return redirect('home')
|
|
else:
|
|
form = AuthenticationForm(request)
|
|
|
|
return render(request, "index.html", {'form': form})
|
|
|
|
@login_required
|
|
def home(request):
|
|
return render(request, "home.html")
|
|
|
|
|
|
def logout(request):
|
|
auth_logout(request)
|
|
return redirect('index')
|
|
|
|
|
|
class ForwardsViewSet(viewsets.ViewSet):
|
|
"""
|
|
Forwards from cPanel
|
|
"""
|
|
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def list(self, request):
|
|
group_filter = request.QUERY_PARAMS.get('groups', None)
|
|
if group_filter is None:
|
|
my_groups = request.user.groups.all()
|
|
else:
|
|
# Filter groups
|
|
if ',' in group_filter:
|
|
group_filter = group_filter.split(',')
|
|
else:
|
|
group_filter = [group_filter]
|
|
my_groups = request.user.groups.filter(pk__in=group_filter)
|
|
|
|
# Look for mailinglist prefixes
|
|
if request.user.is_superuser:
|
|
my_prefixes = OrgUnit.objects.all().distinct().values_list('prefix', flat=True)
|
|
else:
|
|
my_prefixes = OrgUnit.objects.filter(admin_groups__in=my_groups).distinct().values_list('prefix', flat=True)
|
|
# Prepare regular expression
|
|
regexp = '|'.join(['{0}-'.format(p) for p in my_prefixes])
|
|
|
|
if len(my_prefixes) == 0:
|
|
return Response({'result': 'No results'}) # Need at least one
|
|
|
|
cp = CPanel()
|
|
params = dict(
|
|
domain=settings.NEUF_EMAIL_DOMAIN,
|
|
regex=regexp
|
|
)
|
|
|
|
res = cp.api('Email', 'listforwards', params)
|
|
return Response(res)
|
|
|
|
|
|
class ForwardCreateView(views.APIView):
|
|
_cp = CPanel()
|
|
permission_classes = (DestinationPrefixOwner,)
|
|
|
|
def post(self, request):
|
|
fw = ForwardSerializer(data=request.DATA)
|
|
if not fw.is_valid():
|
|
return Response(fw.errors, status=400)
|
|
|
|
# fw.data
|
|
params = dict(
|
|
domain=settings.NEUF_EMAIL_DOMAIN,
|
|
email=fw.data['dest'].replace('@{0}'.format(settings.NEUF_EMAIL_DOMAIN), ''),
|
|
fwdopt='fwd',
|
|
fwdemail=fw.data['forward']
|
|
)
|
|
res = self._cp.api('Email', 'addforward', params)
|
|
return Response(res)
|
|
|
|
|
|
class ForwardDeleteView(views.APIView):
|
|
_cp = CPanel()
|
|
permission_classes = (DestinationPrefixOwner,)
|
|
|
|
def delete(self, request, forwarder=None):
|
|
invalid_forwarder = {'error': 'Invalid forwarder: {0}'.format(forwarder)}
|
|
if '=' not in forwarder:
|
|
return Response(invalid_forwarder, status=400)
|
|
|
|
fwd_data = forwarder.split("=")
|
|
|
|
fw = ForwardSerializer(data={'dest': fwd_data[0], 'forward': fwd_data[1]})
|
|
if not fw.is_valid():
|
|
return Response(fw.errors, status=400)
|
|
|
|
params = {
|
|
'arg-0': '{0}={1}'.format(fw.data['dest'], fw.data['forward'])
|
|
}
|
|
res = self._cp.api('Email', 'delforward', params, version=1)
|
|
return Response(res)
|
|
|
|
|
|
class MyUserViewSet(viewsets.ReadOnlyModelViewSet):
|
|
queryset = User.objects.none()
|
|
serializer_class = UserSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
return User.objects.filter(pk=self.request.user.pk)
|
|
|
|
|
|
class MyOrgUnitViewSet(viewsets.ReadOnlyModelViewSet):
|
|
queryset = OrgUnit.objects.none()
|
|
serializer_class = OrgUnitSerializer
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def get_queryset(self):
|
|
return OrgUnit.objects.filter(admin_groups__in=self.request.user.groups.values('id'))
|
|
|
|
|
|
class OrgUnitViewSet(viewsets.ReadOnlyModelViewSet):
|
|
queryset = OrgUnit.objects.all()
|
|
serializer_class = OrgUnitSerializer
|
|
permission_classes = [IsAuthenticated]
|