Projet

Général

Profil

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

root / corbo / views.py @ a2aba77e

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

    
188

    
189
manage = ManageView.as_view()
190

    
191

    
192
class Atom1Feed(DjangoAtom1Feed):
193

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

    
199

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

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

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

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

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

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

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

    
227

    
228
atom = AtomView()
229

    
230

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

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

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

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

    
254
subscriptions_import = SubscriptionsImportView.as_view()
255

    
256

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

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