Commit 0f8d021ef99be564d80df6b495104c26491d4c69
Exists in
master
and in
2 other branches
Merge pull request #134 from colab/master
Updating Stable
Showing
6 changed files
with
109 additions
and
101 deletions
Show diff stats
colab/accounts/views.py
@@ -13,7 +13,8 @@ from django.http import Http404 | @@ -13,7 +13,8 @@ from django.http import Http404 | ||
13 | 13 | ||
14 | from colab.super_archives.models import (EmailAddress, | 14 | from colab.super_archives.models import (EmailAddress, |
15 | EmailAddressValidation) | 15 | EmailAddressValidation) |
16 | -from colab.search.utils import get_collaboration_data, get_visible_threads | 16 | +from colab.plugins.utils.collaborations import (get_collaboration_data, |
17 | + get_visible_threads) | ||
17 | from colab.accounts.models import User | 18 | from colab.accounts.models import User |
18 | 19 | ||
19 | from .forms import (UserCreationForm, ListsForm, UserUpdateForm) | 20 | from .forms import (UserCreationForm, ListsForm, UserUpdateForm) |
colab/home/views.py
@@ -2,7 +2,7 @@ from django.conf import settings | @@ -2,7 +2,7 @@ from django.conf import settings | ||
2 | from django.shortcuts import render | 2 | from django.shortcuts import render |
3 | from django.http import HttpResponse, Http404 | 3 | from django.http import HttpResponse, Http404 |
4 | 4 | ||
5 | -from colab.search.utils import get_collaboration_data | 5 | +from colab.plugins.utils.collaborations import get_collaboration_data |
6 | from colab.super_archives.models import Thread | 6 | from colab.super_archives.models import Thread |
7 | from colab.accounts.utils import mailman | 7 | from colab.accounts.utils import mailman |
8 | from colab.accounts.models import User | 8 | from colab.accounts.models import User |
@@ -0,0 +1,67 @@ | @@ -0,0 +1,67 @@ | ||
1 | +import importlib | ||
2 | +import inspect | ||
3 | + | ||
4 | +from collections import OrderedDict | ||
5 | + | ||
6 | +from django.core.cache import cache | ||
7 | +from django.utils.translation import ugettext as _ | ||
8 | +from django.conf import settings | ||
9 | + | ||
10 | +from colab.plugins.utils.models import Collaboration | ||
11 | +from colab.super_archives.utils.collaborations import (get_visible_threads, | ||
12 | + count_threads) | ||
13 | + | ||
14 | + | ||
15 | +def get_collaboration_data(logged_user, filter_by_user=None): | ||
16 | + username = getattr(filter_by_user, 'username', '') | ||
17 | + cache_key = 'home_chart-{}'.format(username) | ||
18 | + count_types = cache.get(cache_key) | ||
19 | + | ||
20 | + latest_results = [] | ||
21 | + populate_count_types = False | ||
22 | + | ||
23 | + if count_types is None: | ||
24 | + populate_count_types = True | ||
25 | + count_types = OrderedDict() | ||
26 | + | ||
27 | + count_types[_('Emails')] = count_threads() | ||
28 | + | ||
29 | + messages = get_visible_threads(logged_user, filter_by_user) | ||
30 | + | ||
31 | + latest_results.extend(messages) | ||
32 | + | ||
33 | + for app in settings.COLAB_APPS.values(): | ||
34 | + module = importlib.import_module('{}.models'.format(app.get('name'))) | ||
35 | + | ||
36 | + for module_item_name in dir(module): | ||
37 | + module_item = getattr(module, module_item_name) | ||
38 | + if not inspect.isclass(module_item): | ||
39 | + continue | ||
40 | + if not issubclass(module_item, Collaboration): | ||
41 | + continue | ||
42 | + if module_item == Collaboration: | ||
43 | + continue | ||
44 | + | ||
45 | + queryset = module_item.objects | ||
46 | + | ||
47 | + if filter_by_user: | ||
48 | + elements = queryset.filter( | ||
49 | + user__username=filter_by_user) | ||
50 | + else: | ||
51 | + elements = queryset.all() | ||
52 | + | ||
53 | + latest_results.extend(elements) | ||
54 | + elements_count = elements.count() | ||
55 | + | ||
56 | + if elements_count > 1: | ||
57 | + verbose_name = module_item._meta.verbose_name_plural.title() | ||
58 | + else: | ||
59 | + verbose_name = module_item._meta.verbose_name.title() | ||
60 | + | ||
61 | + if populate_count_types: | ||
62 | + count_types[verbose_name] = elements_count | ||
63 | + | ||
64 | + if populate_count_types: | ||
65 | + cache.set(cache_key, count_types, 30) | ||
66 | + | ||
67 | + return latest_results, count_types |
colab/search/utils.py
@@ -1,96 +0,0 @@ | @@ -1,96 +0,0 @@ | ||
1 | -import importlib | ||
2 | -import inspect | ||
3 | - | ||
4 | -from collections import OrderedDict | ||
5 | - | ||
6 | -from django.core.cache import cache | ||
7 | -from django.utils.translation import ugettext as _ | ||
8 | -from django.conf import settings | ||
9 | -from django.db.models import Q as Condition | ||
10 | - | ||
11 | -from colab.super_archives.models import Thread, Message | ||
12 | -from colab.plugins.utils.models import Collaboration | ||
13 | -from colab.accounts.utils import mailman | ||
14 | - | ||
15 | - | ||
16 | -def get_visible_threads_queryset(logged_user): | ||
17 | - queryset = Thread.objects | ||
18 | - listnames_for_user = [] | ||
19 | - if logged_user: | ||
20 | - lists_for_user = mailman.get_user_mailinglists(logged_user) | ||
21 | - listnames_for_user = mailman.extract_listname_from_list(lists_for_user) | ||
22 | - | ||
23 | - user_lists = Condition(mailinglist__name__in=listnames_for_user) | ||
24 | - public_lists = Condition(mailinglist__is_private=False) | ||
25 | - queryset = Thread.objects.filter(user_lists | public_lists) | ||
26 | - | ||
27 | - return queryset | ||
28 | - | ||
29 | - | ||
30 | -def get_visible_threads(logged_user, filter_by_user=None): | ||
31 | - thread_qs = get_visible_threads_queryset(logged_user) | ||
32 | - | ||
33 | - if filter_by_user: | ||
34 | - message_qs = Message.objects.filter(thread__in=thread_qs) | ||
35 | - messages = message_qs.filter( | ||
36 | - from_address__user__pk=filter_by_user.pk) | ||
37 | - else: | ||
38 | - latest_threads = thread_qs.all() | ||
39 | - messages = [t.latest_message for t in latest_threads] | ||
40 | - | ||
41 | - return messages | ||
42 | - | ||
43 | - | ||
44 | -def get_collaboration_data(logged_user, filter_by_user=None): | ||
45 | - username = getattr(filter_by_user, 'username', '') | ||
46 | - cache_key = 'home_chart-{}'.format(username) | ||
47 | - count_types = cache.get(cache_key) | ||
48 | - | ||
49 | - latest_results = [] | ||
50 | - populate_count_types = False | ||
51 | - | ||
52 | - if count_types is None: | ||
53 | - populate_count_types = True | ||
54 | - count_types = OrderedDict() | ||
55 | - visible_threads = get_visible_threads(logged_user, filter_by_user) | ||
56 | - count_types[_('Emails')] = len(visible_threads) | ||
57 | - | ||
58 | - messages = get_visible_threads(logged_user, filter_by_user) | ||
59 | - | ||
60 | - latest_results.extend(messages) | ||
61 | - | ||
62 | - for app in settings.COLAB_APPS.values(): | ||
63 | - module = importlib.import_module('{}.models'.format(app.get('name'))) | ||
64 | - | ||
65 | - for module_item_name in dir(module): | ||
66 | - module_item = getattr(module, module_item_name) | ||
67 | - if not inspect.isclass(module_item): | ||
68 | - continue | ||
69 | - if not issubclass(module_item, Collaboration): | ||
70 | - continue | ||
71 | - if module_item == Collaboration: | ||
72 | - continue | ||
73 | - | ||
74 | - queryset = module_item.objects | ||
75 | - | ||
76 | - if filter_by_user: | ||
77 | - elements = queryset.filter( | ||
78 | - user__username=filter_by_user) | ||
79 | - else: | ||
80 | - elements = queryset.all() | ||
81 | - | ||
82 | - latest_results.extend(elements) | ||
83 | - elements_count = elements.count() | ||
84 | - | ||
85 | - if elements_count > 1: | ||
86 | - verbose_name = module_item._meta.verbose_name_plural.title() | ||
87 | - else: | ||
88 | - verbose_name = module_item._meta.verbose_name.title() | ||
89 | - | ||
90 | - if populate_count_types: | ||
91 | - count_types[verbose_name] = elements_count | ||
92 | - | ||
93 | - if populate_count_types: | ||
94 | - cache.set(cache_key, count_types, 30) | ||
95 | - | ||
96 | - return latest_results, count_types |
colab/super_archives/templates/superarchives/thread-dashboard.html
@@ -6,7 +6,6 @@ | @@ -6,7 +6,6 @@ | ||
6 | {% block main-content %} | 6 | {% block main-content %} |
7 | <h2>{% trans 'Groups'|title %}</h2> | 7 | <h2>{% trans 'Groups'|title %}</h2> |
8 | <hr/> | 8 | <hr/> |
9 | - | ||
10 | {% for mailinglist in lists %} | 9 | {% for mailinglist in lists %} |
11 | {% if mailinglist.get_latest or mailinglist.get_most_relevant %} | 10 | {% if mailinglist.get_latest or mailinglist.get_most_relevant %} |
12 | <h3><b>{{ mailinglist.name|title|lower }} {% if mailinglist.description %} ({{ mailinglist.description }}){% endif %}</b></h3> | 11 | <h3><b>{{ mailinglist.name|title|lower }} {% if mailinglist.description %} ({{ mailinglist.description }}){% endif %}</b></h3> |
@@ -20,7 +19,7 @@ | @@ -20,7 +19,7 @@ | ||
20 | <h4>{% trans 'latest'|title %}</h4> | 19 | <h4>{% trans 'latest'|title %}</h4> |
21 | <ul class="message-list"> | 20 | <ul class="message-list"> |
22 | {% for thread in mailinglist.get_latest %} | 21 | {% for thread in mailinglist.get_latest %} |
23 | - {% include "message-preview.html" with result=thread.latest_message %} | 22 | + {% include "dashboard-message-preview.html" with result=thread.latest_message %} |
24 | {% endfor %} | 23 | {% endfor %} |
25 | </ul> | 24 | </ul> |
26 | <div class="text-right"> | 25 | <div class="text-right"> |
@@ -34,7 +33,7 @@ | @@ -34,7 +33,7 @@ | ||
34 | <h4>{% trans 'most relevant'|title %}</h4> | 33 | <h4>{% trans 'most relevant'|title %}</h4> |
35 | <ul class="message-list"> | 34 | <ul class="message-list"> |
36 | {% for thread in mailinglist.get_most_relevant %} | 35 | {% for thread in mailinglist.get_most_relevant %} |
37 | - {% include "message-preview.html" with result=thread %} | 36 | + {% include "dashboard-message-preview.html" with result=thread %} |
38 | {% endfor %} | 37 | {% endfor %} |
39 | </ul> | 38 | </ul> |
40 | <div class="text-right"> | 39 | <div class="text-right"> |
@@ -0,0 +1,37 @@ | @@ -0,0 +1,37 @@ | ||
1 | + | ||
2 | +from django.db.models import Q | ||
3 | + | ||
4 | +from colab.accounts.utils import mailman | ||
5 | +from colab.super_archives.models import Thread, Message | ||
6 | + | ||
7 | + | ||
8 | +def count_threads(): | ||
9 | + return Thread.objects.count() | ||
10 | + | ||
11 | + | ||
12 | +def get_visible_threads_queryset(logged_user): | ||
13 | + queryset = Thread.objects | ||
14 | + listnames_for_user = [] | ||
15 | + if logged_user: | ||
16 | + lists_for_user = mailman.get_user_mailinglists(logged_user) | ||
17 | + listnames_for_user = mailman.extract_listname_from_list(lists_for_user) | ||
18 | + | ||
19 | + user_lists = Q(mailinglist__name__in=listnames_for_user) | ||
20 | + public_lists = Q(mailinglist__is_private=False) | ||
21 | + queryset = Thread.objects.filter(user_lists | public_lists) | ||
22 | + | ||
23 | + return queryset | ||
24 | + | ||
25 | + | ||
26 | +def get_visible_threads(logged_user, filter_by_user=None): | ||
27 | + thread_qs = get_visible_threads_queryset(logged_user) | ||
28 | + | ||
29 | + if filter_by_user: | ||
30 | + message_qs = Message.objects.filter(thread__in=thread_qs) | ||
31 | + messages = message_qs.filter( | ||
32 | + from_address__user__pk=filter_by_user.pk) | ||
33 | + else: | ||
34 | + latest_threads = thread_qs.all() | ||
35 | + messages = [t.latest_message for t in latest_threads] | ||
36 | + | ||
37 | + return messages |