Commit 46870deb79911d876487a0b490d1e1a0c09ed5a5

Authored by Sergio Oliveira
1 parent ddae787b

View to manage list subscriptions

src/accounts/models.py
1 1  
2 2 import urlparse
3   -import requests
4 3  
5 4 from django.db import models
6   -from django.conf import settings
7 5 from django.contrib.auth.models import AbstractUser
8 6 from django.core.urlresolvers import reverse
9 7  
  8 +from .utils import mailman
  9 +
10 10  
11 11 class User(AbstractUser):
12 12 institution = models.CharField(max_length=128, null=True, blank=True)
... ... @@ -26,23 +26,11 @@ class User(AbstractUser):
26 26 def facebook_link(self):
27 27 return urlparse.urljoin('https://www.facebook.com', self.facebook)
28 28  
29   - def mailinglists(self, email=None):
30   - list_set = set()
31   -
32   - if not email:
33   - emails = self.emails.values_list('address', flat=True)
34   - else:
35   - emails = [email]
36   -
37   - for email in emails:
38   - try:
39   - lists = requests.get(settings.MAILMAN_API_URL, timeout=1,
40   - params={'address': email})
41   - list_set.update(lists.json())
42   - except requests.exceptions.Timeout:
43   - pass
  29 + def mailinglists(self):
  30 + return mailman.user_lists(self)
44 31  
45   - return tuple(list_set)
  32 + def update_subscription(self, email, lists):
  33 + mailman.update_subscription(email, lists)
46 34  
47 35  
48 36 # We need to have `email` field set as unique but Django does not
... ...
src/accounts/templates/accounts/manage_subscriptions.html 0 → 100644
... ... @@ -0,0 +1,43 @@
  1 +{% extends 'base.html' %}
  2 +{% load i18n %}
  3 +
  4 +{% block main-content %}
  5 +
  6 + <br>
  7 +
  8 + <form method='post'>
  9 + {% csrf_token %}
  10 +
  11 + <div class="row">
  12 + {% for email, lists in membership.items %}
  13 + <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
  14 + <div class="panel panel-default">
  15 + <div class="panel-heading">
  16 + <h3 class="panel-title">{{ email }}</h3>
  17 + </div>
  18 + <div class="panel-body">
  19 + {% for list, checked in lists %}
  20 + <div class="checkbox">
  21 + <label>
  22 + <input name="{{ email }}" value="{{ list }}" type="checkbox" {% if checked %}checked{% endif%}>{{ list }}</input>
  23 + </label>
  24 + </div>
  25 + {% endfor %}
  26 + </div>
  27 + </div>
  28 + </div>
  29 + {% endfor %}
  30 + </div>
  31 +
  32 + <div class="row">
  33 + <div class="text-center">
  34 + <button class="btn btn-lg btn-primary" type="submit">{% trans 'Update subscriptions' %}</button>
  35 + </div>
  36 + </div>
  37 +
  38 + </form>
  39 +
  40 + <br><br>
  41 + <br><br>
  42 +
  43 +{% endblock %}
... ...
src/accounts/utils/mailman.py 0 → 100644
... ... @@ -0,0 +1,68 @@
  1 +
  2 +import urlparse
  3 +import requests
  4 +
  5 +from django.conf import settings
  6 +
  7 +TIMEOUT = 1
  8 +
  9 +
  10 +def get_url(listname=None):
  11 + if listname:
  12 + return urlparse.urljoin(settings.MAILMAN_API_URL, '/' + listname)
  13 +
  14 + return settings.MAILMAN_API_URL
  15 +
  16 +
  17 +def subscribe(listname, address):
  18 + url = get_url(listname)
  19 + try:
  20 + requests.put(url, timeout=TIMEOUT, data={'address': address})
  21 + except requests.exceptions.RequestException:
  22 + return False
  23 + return True
  24 +
  25 +
  26 +def unsubscribe(listname, address):
  27 + url = get_url(listname)
  28 + try:
  29 + requests.delete(url, timeout=TIMEOUT, data={'address': address})
  30 + except requests.exceptions.RequestException:
  31 + return False
  32 + return True
  33 +
  34 +
  35 +def update_subscription(address, lists):
  36 + current_lists = address_lists(address)
  37 + print lists
  38 +
  39 + for maillist in current_lists:
  40 + if maillist not in lists:
  41 + unsubscribe(maillist, address)
  42 +
  43 + for maillist in lists:
  44 + if maillist not in current_lists:
  45 + subscribe(maillist, address)
  46 +
  47 +
  48 +def address_lists(address):
  49 + url = get_url()
  50 + try:
  51 + lists = requests.get(url, timeout=TIMEOUT, params={'address': address})
  52 + except requests.exceptions.RequestException:
  53 + return []
  54 +
  55 + return lists.json()
  56 +
  57 +
  58 +def all_lists():
  59 + return address_lists('')
  60 +
  61 +
  62 +def user_lists(user):
  63 + list_set = set()
  64 +
  65 + for email in user.emails.values_list('address', flat=True):
  66 + list_set.update(address_lists(email))
  67 +
  68 + return tuple(list_set)
... ...
src/accounts/views.py
... ... @@ -2,11 +2,9 @@
2 2 # encoding: utf-8
3 3  
4 4 import datetime
5   -import requests
6 5  
7 6 from collections import OrderedDict
8 7  
9   -from django.conf import settings
10 8 from django.contrib import messages
11 9 from django.db.models import Count
12 10 from django.contrib.auth import get_user_model
... ... @@ -22,6 +20,7 @@ from super_archives.models import EmailAddress, Message
22 20 from super_archives.utils.email import send_email_lists
23 21 from search.utils import trans
24 22 from .forms import UserCreationForm, ListsForm, UserUpdateForm
  23 +from .utils import mailman
25 24  
26 25  
27 26 class UserProfileBaseMixin(object):
... ... @@ -133,16 +132,31 @@ class ManageUserSubscriptionsView(UserProfileBaseMixin, DetailView):
133 132 def post(self, request, *args, **kwargs):
134 133 user = self.get_object()
135 134 for email in user.emails.values_list('address', flat=True):
136   - current_lists = user.mailinglists(email)
137   - #url = urlparse.urljoin(settings.MAILMAN_API_URL,
138   - # )
139   - #requests.put()
  135 + lists = self.request.POST.getlist(email)
  136 + user.update_subscription(email, lists)
  137 +
140 138 return self.get(request, *args, **kwargs)
141 139  
142 140 def get_context_data(self, **kwargs):
143 141 context = {}
144   - resp = requests.get(settings.MAILMAN_API_URL)
145   - context['lists'] = resp.json()
  142 + context['membership'] = {}
  143 +
  144 + user = self.get_object()
  145 + emails = user.emails.values_list('address', flat=True)
  146 + all_lists = mailman.all_lists()
  147 +
  148 + for email in emails:
  149 + lists = []
  150 + lists_for_address = mailman.address_lists(email)
  151 + for listname in all_lists:
  152 + if listname in lists_for_address:
  153 + checked = True
  154 + else:
  155 + checked = False
  156 + lists.append((listname, checked))
  157 +
  158 + context['membership'].update({email: lists})
146 159  
147 160 context.update(kwargs)
  161 +
148 162 return super(ManageUserSubscriptionsView, self).get_context_data(**context)
... ...