Newer
Older
postorius / views.py
# -*- coding: utf-8 -*-
from django.http import HttpResponse, HttpResponseRedirect
from django.template import Context, loader
from django.shortcuts import render_to_response
from django.core.urlresolvers import reverse
from django.utils.translation import gettext as _
import re
from mailman_rest_client import MailmanRESTClient, MailmanRESTClientError
from forms import *

def login_required(fn):
    """Function (decorator) letting the user log in.
    """
    def _login_decorator(*request, **kwargs):
        """Inner decorator to login.
        """
        # If the user is already logged in, let them continue directly.
        try:
            if request[0].session['member_id']:
                return fn(request[0], **kwargs)
        except:
            pass
        template = 'mailman-django/lists/login.html'
        # Authenticate the user
        # This is just a mockup since the authenticate functionality in 
        # the rest server is still missing.
        # TODO Anna 2010-08-04: implement real authenticate when possible
        valid_users = {"james@example.com": "james",
                       "katie@example.com": "katie",
                       "kevin@example.com": "kevin"}
        if request[0].method == 'POST':
            form = Login(request[0].POST)
            if form.is_valid():
                if request[0].POST["address"] in valid_users.keys():
                    if request[0].POST["password"] == valid_users[request[0].POST["address"]]:
                        request[0].session['member_id'] = request[0].POST["address"]
                        # make sure to "reset" the method before continuing
                        request[0].method = 'GET'
                        return fn(request[0], **kwargs)
            message = "Your username and password didn't match."
        else:
            message = ""
        return render_to_response(template, {'form': Login(), 'message': message})
    return _login_decorator

@login_required
def list_new(request, template = 'mailman-django/lists/new.html'):
    """Show or process form to add a new mailing list.
    """
    if request.method == 'POST':
        form = ListNew(request.POST)
        if form.is_valid():
            listname = form.cleaned_data['listname']
            try:
                c = MailmanRESTClient('localhost:8001')
            except Exception, e:
                return HttpResponse(e)

            parts = listname.split('@')
            domain = c.get_domain(parts[1])
            if domain.info == 404: # failed to get domain so try creating one
                try:
                    domain = c.create_domain(parts[1])
                except MailmanRESTClientError, e: 
                    # I don't think this error can ever appear... -- Anna
                    return HttpResponse(e)
            try:
                response = domain.create_list(parts[0])
                return render_to_response('mailman-django/lists/created.html', 
                                          {'fqdn_listname': response.info['fqdn_listname'] })
            except MailmanRESTClientError, e:
                return HttpResponse(e)

    else:
        form = ListNew()

    return render_to_response(template, {'form': form})


def list_index(request, template = 'mailman-django/lists/index.html'):
    """Show a table of all mailing lists.
    """
    try:
        c = MailmanRESTClient('localhost:8001')
    except MailmanRESTClientError, e:
        return render_to_response('mailman-django/errors/generic.html', 
                                  {'message': e})

    try:
        lists = c.get_lists()
        return render_to_response(template, {'lists': lists})
    except MailmanRESTClientError, e:
        return render_to_response('mailman-django/errors/generic.html', 
                                  {'message': e})


def list_info(request, fqdn_listname = None, 
              template = 'mailman-django/lists/info.html'):
    """Display list info and/or subscribe or unsubscribe a user to a list.
    """
    try:
        c = MailmanRESTClient('localhost:8001')
        the_list = c.get_list(fqdn_listname)
    except Exception, e:
        return HttpResponse(e)
    if request.method == 'POST':
        form = False
        action = request.POST.get('name', '')
        if action == "subscribe":
            form = ListSubscribe(request.POST)
        elif action == "unsubscribe":
            form = ListUnsubscribe(request.POST)
        if form and form.is_valid():
            listname = form.cleaned_data['listname']
            email = form.cleaned_data['email']
            if action == "subscribe":
                real_name = form.cleaned_data.get('real_name', '')
                try:
                    response = the_list.subscribe(address=email,
                                                real_name=real_name)
                    return HttpResponseRedirect(reverse('list_index'))
                except Exception, e:
                    return HttpResponse(e)
            elif action == "unsubscribe":
                try:
                    response = the_list.unsubscribe(address=email)
                    return render_to_response('mailman-django/lists/unsubscribed.html', 
                                              {'listname': fqdn_listname})
                except Exception, e:
                    return HttpResponse(e)
        else:
            if action == "subscribe":
                subscribe = ListSubscribe(request.POST)
                unsubscribe = ListUnsubscribe(initial = {'listname': fqdn_listname, 
                                                         'name' : 'unsubscribe'})
            elif action == "unsubscribe":
                subscribe = ListSubscribe(initial = {'listname': fqdn_listname, 
                                                     'name' : 'subscribe'})
                unsubscribe = ListUnsubscribe(request.POST)
    else:
        subscribe = ListSubscribe(initial = {'listname': fqdn_listname, 
                                             'name' : 'subscribe'})
        unsubscribe = ListUnsubscribe(initial = {'listname': fqdn_listname, 
                                                 'name' : 'unsubscribe'})

    listinfo = c.get_list(fqdn_listname)

    return render_to_response(template, {'subscribe': subscribe,
                                         'unsubscribe': unsubscribe,
                                         'fqdn_listname': fqdn_listname,
                                         'listinfo': listinfo})

def list_delete(request, fqdn_listname = None, 
                template = 'mailman-django/lists/index.html'):
    """Delete a list.
    """
    # create a connection to Mailman and get the list
    try:
        c = MailmanRESTClient('localhost:8001')
        the_list = c.get_list(fqdn_listname)
    except Exception, e:
        return HttpResponse(e)
    # get the parts of the list necessary to delete it
    parts = fqdn_listname.split('@')
    domain = the_list.get_domain(parts[1])
    domain.delete_list(parts[0])
    # let the user return to the list index page
    try:
        lists = c.get_lists()
        return render_to_response(template, {'lists': lists})
    except MailmanRESTClientError, e:
        return render_to_response('mailman-django/errors/generic.html', 
                                  {'message': e})

@login_required
def list_settings(request, fqdn_listname = None, 
                  template = 'mailman-django/lists/settings.html'):
    """The settings of a list."""
    message = ""
    try:
        c = MailmanRESTClient('localhost:8001')
        the_list = c.get_list(fqdn_listname)
    except Exception, e:
        return HttpResponse(e)
    if request.method == 'POST':
        form = ListSettings(request.POST)
        if form.is_valid():
            the_list.update_list(request.POST)
            message = "The list has been updated."
    else:
        form = ListSettings(the_list.info)
    return render_to_response(template, {'form': form,
                                         'message': message,
                                         'fqdn_listname': the_list.info['fqdn_listname']})

@login_required
def mass_subscribe(request, fqdn_listname = None, 
                   template = 'mailman-django/lists/mass_subscribe.html'):
    """Mass subscribe users to a list."""
    message = ""
    try:
        c = MailmanRESTClient('localhost:8001')
        the_list = c.get_list(fqdn_listname)
    except Exception, e:
        return HttpResponse(e)
    if request.method == 'POST':
        form = ListMassSubscription(request.POST)
        if form.is_valid():
            try:
                emails = request.POST["emails"].splitlines()
                message = "The mass subscription was successful."
                for email in emails:
                    # very simple test if email address is valid
                    parts = email.split('@')
                    if len(parts) == 2 and '.' in parts[1]:
                        the_list.subscribe(address=email, real_name="")
                    else:
                        message = "Please enter valid email addresses."
            except Exception, e:
                return HttpResponse(e)
    else:
        form = ListMassSubscription()
    return render_to_response(template, {'form': form,
                                         'message': message,
                                         'fqdn_listname': the_list.info['fqdn_listname']})

def logout(request):
    """Let the user logout.
    """
    try:
        del request.session['member_id']
    except KeyError:
        pass
    return list_index(request, template = 'mailman-django/lists/index.html')