Projet

Général

Profil

Télécharger (7,99 ko) Statistiques
| Branche: | Tag: | Révision:

root / corbo / views.py @ f9ae729f

1
import urllib
2
import json
3

    
4
from django.conf import settings
5
from django.core import signing
6
from django.utils import timezone
7
from django.core.urlresolvers import reverse
8
from django.views.generic import CreateView, UpdateView, DeleteView, \
9
    ListView, TemplateView, RedirectView, DetailView, FormView
10
from django.contrib.syndication.views import Feed
11
from django.shortcuts import resolve_url
12
from django.utils.encoding import force_text
13
from django.utils.feedgenerator import Atom1Feed as DjangoAtom1Feed
14
from django.http import HttpResponseRedirect, HttpResponse, Http404
15
from django.contrib.auth import logout as auth_logout
16
from django.contrib.auth import views as auth_views
17
from django.contrib import messages
18
from django.utils.translation import ugettext_lazy as _
19
from django.utils.translation import ngettext
20

    
21
import models
22
from .forms import AnnounceForm, CategoryForm, SubscriptionsImportForm
23

    
24
try:
25
    from mellon.utils import get_idps
26
except ImportError:
27
    get_idps = lambda: []
28

    
29

    
30
def login(request, *args, **kwargs):
31
    if any(get_idps()):
32
        if 'next' not in request.GET:
33
            return HttpResponseRedirect(resolve_url('mellon_login'))
34
        return HttpResponseRedirect(resolve_url('mellon_login') + '?next=' +
35
                                    urllib.quote(request.GET.get('next')))
36
    return auth_views.login(request, *args, **kwargs)
37

    
38

    
39
def logout(request, next_page=None):
40
    if any(get_idps()):
41
        return HttpResponseRedirect(resolve_url('mellon_logout'))
42
    auth_logout(request)
43
    if next_page is not None:
44
        next_page = resolve_url(next_page)
45
    else:
46
        next_page = '/'
47
    return HttpResponseRedirect(next_page)
48

    
49

    
50
class HomepageView(RedirectView):
51
    pattern_name = 'manage'
52

    
53

    
54
homepage = HomepageView.as_view()
55

    
56

    
57
class AnnounceCreateView(CreateView):
58

    
59
    form_class = AnnounceForm
60
    template_name = 'corbo/announce_form.html'
61

    
62
    def get_success_url(self):
63
        return reverse('view_category', kwargs={'slug': self.object.category.slug})
64

    
65
    def get_initial(self):
66
        initial = super(AnnounceCreateView, self).get_initial()
67
        initial['category'] = models.Category.objects.get(slug=self.kwargs['slug'])
68
        return initial
69

    
70
    def get_context_data(self, **kwargs):
71
        context = super(AnnounceCreateView, self).get_context_data(**kwargs)
72
        context['category'] = kwargs['form'].initial['category']
73
        return context
74

    
75

    
76
add_announce = AnnounceCreateView.as_view()
77

    
78

    
79
class AnnounceEditView(UpdateView):
80
    model = models.Announce
81
    form_class = AnnounceForm
82

    
83
    def get_context_data(self, **kwargs):
84
        context = super(AnnounceEditView, self).get_context_data(**kwargs)
85
        category_id = kwargs['form'].initial['category']
86
        context['category'] = models.Category.objects.get(pk=category_id)
87
        return context
88

    
89
    def get_success_url(self):
90
        return reverse('view_category', kwargs={'pk': self.object.category.pk})
91

    
92

    
93
edit_announce = AnnounceEditView.as_view()
94

    
95

    
96
class AnnounceDeleteView(DeleteView):
97
    model = models.Announce
98

    
99
    def get_success_url(self):
100
        return reverse('view_category', kwargs={'slug': self.object.category.slug})
101

    
102

    
103
delete_announce = AnnounceDeleteView.as_view()
104

    
105

    
106
class CategoryCreateView(CreateView):
107
    form_class = CategoryForm
108
    template_name = 'corbo/category_form.html'
109

    
110
    def get_success_url(self):
111
        return reverse('manage')
112

    
113
    def form_valid(self, form):
114
        form.save()
115
        return super(CategoryCreateView, self).form_valid(form)
116

    
117

    
118
add_category = CategoryCreateView.as_view()
119

    
120

    
121
class CategoryEditView(UpdateView):
122
    form_class = CategoryForm
123
    model = models.Category
124

    
125
    def get_success_url(self):
126
        return reverse('view_category', kwargs={'slug': self.object.slug})
127

    
128

    
129
edit_category = CategoryEditView.as_view()
130

    
131

    
132
class CategoryView(ListView):
133
    model = models.Announce
134
    paginate_by = settings.ANNOUNCES_PER_PAGE
135

    
136
    def get_queryset(self):
137
        qs = super(CategoryView, self).get_queryset()
138
        return qs.filter(category__slug=self.kwargs['slug'])
139

    
140
    def get_context_data(self, **kwargs):
141
        context = super(CategoryView, self).get_context_data(**kwargs)
142
        context['category'] = models.Category.objects.get(slug=self.kwargs['slug'])
143
        return context
144

    
145

    
146
view_category = CategoryView.as_view()
147

    
148

    
149
class CategoryDeleteView(DeleteView):
150
    model = models.Category
151

    
152
    def get_success_url(self):
153
        return reverse('manage')
154

    
155

    
156
delete_category = CategoryDeleteView.as_view()
157

    
158

    
159
class UnsubscribeView(DeleteView):
160
    model = models.Subscription
161

    
162
    def get_object(self, queryset=None):
163
        data = signing.loads(self.kwargs['unsubscription_token'])
164
        try:
165
            return models.Subscription.objects.get(category__pk=data['category'],
166
                                                   identifier=data['identifier'])
167
        except models.Subscription.DoesNotExist:
168
            raise Http404
169

    
170
    def get_success_url(self):
171
        return reverse('unsubscription_done')
172

    
173

    
174
unsubscribe = UnsubscribeView.as_view()
175

    
176

    
177
class UnsubscriptionDoneView(TemplateView):
178
    template_name = 'corbo/unsubscription_done.html'
179

    
180

    
181
unsubscription_done = UnsubscriptionDoneView.as_view()
182

    
183

    
184
class ManageView(ListView):
185
    template_name = 'corbo/manage.html'
186
    model = models.Category
187
    paginate_by = settings.CATEGORIES_PER_PAGE
188

    
189

    
190
manage = ManageView.as_view()
191

    
192

    
193
class Atom1Feed(DjangoAtom1Feed):
194

    
195
    def root_attributes(self):
196
        attrs = super(Atom1Feed, self).root_attributes()
197
        attrs.update({'xml:base': self.feed['link']})
198
        return attrs
199

    
200

    
201
class AtomView(Feed):
202
    title = settings.RSS_TITLE
203
    description = settings.RSS_DESCRIPTION
204
    link = settings.RSS_LINK
205
    feed_item_link_template = settings.RSS_LINK_TEMPLATE
206
    feed_type = Atom1Feed
207

    
208
    def __init__(self, **kwargs):
209
        self.__dict__.update(kwargs)
210

    
211
    def items(self):
212
        limit = settings.RSS_ITEMS_LIMIT
213
        return models.Announce.objects.filter(publication_time__lte=timezone.now()).exclude(
214
            expiration_time__lt=timezone.now()).order_by('-publication_time')[:limit]
215

    
216
    def item_title(self, item):
217
        return item.title
218

    
219
    def item_description(self, item):
220
        return item.text
221

    
222
    def item_link(self, item):
223
        return self.feed_item_link_template.format(item.pk)
224

    
225
    def item_pubdate(self, item):
226
        return item.publication_time or item.mtime
227

    
228

    
229
atom = AtomView()
230

    
231

    
232
class SubscriptionsImportView(FormView):
233
    form_class = SubscriptionsImportForm
234
    template_name = 'corbo/subscriptions_import_form.html'
235

    
236
    def get_context_data(self, **kwargs):
237
        context = super(SubscriptionsImportView, self).get_context_data(**kwargs)
238
        context['category'] = models.Category.objects.get(slug=self.kwargs['slug'])
239
        return context
240

    
241
    def get_success_url(self):
242
        category = models.Category.objects.get(slug=self.kwargs['slug'])
243
        return reverse('view_category', kwargs={'slug': category.slug})
244

    
245
    def form_valid(self, form):
246
        new = 0
247
        c = models.Category.objects.get(slug=self.kwargs['slug'])
248
        for email in form.cleaned_data['subscribers']:
249
            obj, created = models.Subscription.objects.get_or_create(category=c, identifier='mailto:%s' % email)
250
            if created:
251
               new += 1
252
        messages.info(self.request, ngettext('%(new)d subscriber added', '%(new)d subscribers added', new) % {'new': new})
253
        return super(SubscriptionsImportView, self).form_valid(form)
254

    
255
subscriptions_import = SubscriptionsImportView.as_view()
256

    
257

    
258
def menu_json(request):
259
    label = _('Announces')
260
    json_str = json.dumps([{'label': force_text(label),
261
                          'slug': 'announces',
262
                           'url': request.build_absolute_uri(reverse('manage'))}])
263

    
264
    for variable in ('jsonpCallback', 'callback'):
265
        if variable in request.GET:
266
            response = HttpResponse(content_type='application/javascript')
267
            json_str = '%s(%s);' % (request.GET[variable], json_str)
268
            break
269
    else:
270
        response = HttpResponse(content_type='application/json')
271
    response.write(json_str)
272
    return response
(10-10/11)