Projet

Général

Profil

Télécharger (6,53 ko) Statistiques
| Branche: | Tag: | Révision:

root / corbo / views.py @ 2a14e3e1

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
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.utils.translation import ugettext_lazy as _
18

    
19
import models
20
from .forms import AnnounceForm, CategoryForm
21

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

    
27

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

    
36

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

    
47

    
48
class HomepageView(RedirectView):
49
    pattern_name = 'manage'
50

    
51

    
52
homepage = HomepageView.as_view()
53

    
54

    
55
class AnnounceCreateView(CreateView):
56

    
57
    form_class = AnnounceForm
58
    template_name = 'corbo/announce_form.html'
59

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

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

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

    
73

    
74
add_announce = AnnounceCreateView.as_view()
75

    
76

    
77
class AnnounceEditView(UpdateView):
78
    model = models.Announce
79
    form_class = AnnounceForm
80

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

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

    
90

    
91
edit_announce = AnnounceEditView.as_view()
92

    
93

    
94
class AnnounceDeleteView(DeleteView):
95
    model = models.Announce
96

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

    
100

    
101
delete_announce = AnnounceDeleteView.as_view()
102

    
103

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

    
108
    def get_success_url(self):
109
        return reverse('manage')
110

    
111
    def form_valid(self, form):
112
        form.save()
113
        return super(CategoryCreateView, self).form_valid(form)
114

    
115

    
116
add_category = CategoryCreateView.as_view()
117

    
118

    
119
class CategoryEditView(UpdateView):
120
    form_class = CategoryForm
121
    model = models.Category
122

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

    
126

    
127
edit_category = CategoryEditView.as_view()
128

    
129

    
130
class CategoryView(DetailView):
131
    model = models.Category
132

    
133
    def get_context_data(self, **kwargs):
134
        context = super(CategoryView, self).get_context_data(**kwargs)
135
        context['announces'] = self.object.announce_set.all().order_by(
136
                '-publication_time', '-ctime')
137
        return context
138

    
139

    
140
view_category = CategoryView.as_view()
141

    
142

    
143
class CategoryDeleteView(DeleteView):
144
    model = models.Category
145

    
146
    def get_success_url(self):
147
        return reverse('manage')
148

    
149

    
150
delete_category = CategoryDeleteView.as_view()
151

    
152

    
153
class UnsubscribeView(DeleteView):
154
    model = models.Subscription
155

    
156
    def get_object(self, queryset=None):
157
        data = signing.loads(self.kwargs['unsubscription_token'])
158
        try:
159
            return models.Subscription.objects.get(category__pk=data['category'],
160
                                                   identifier=data['identifier'])
161
        except models.Subscription.DoesNotExist:
162
            raise Http404
163

    
164
    def get_success_url(self):
165
        return reverse('unsubscription_done')
166

    
167

    
168
unsubscribe = UnsubscribeView.as_view()
169

    
170

    
171
class UnsubscriptionDoneView(TemplateView):
172
    template_name = 'corbo/unsubscription_done.html'
173

    
174

    
175
unsubscription_done = UnsubscriptionDoneView.as_view()
176

    
177

    
178
class ManageView(ListView):
179
    template_name = 'corbo/manage.html'
180
    model = models.Category
181

    
182

    
183
manage = ManageView.as_view()
184

    
185

    
186
class Atom1Feed(DjangoAtom1Feed):
187

    
188
    def root_attributes(self):
189
        attrs = super(Atom1Feed, self).root_attributes()
190
        attrs.update({'xml:base': self.feed['link']})
191
        return attrs
192

    
193

    
194
class AtomView(Feed):
195
    title = settings.RSS_TITLE
196
    description = settings.RSS_DESCRIPTION
197
    link = settings.RSS_LINK
198
    feed_item_link_template = settings.RSS_LINK_TEMPLATE
199
    feed_type = Atom1Feed
200

    
201
    def __init__(self, **kwargs):
202
        self.__dict__.update(kwargs)
203

    
204
    def items(self):
205
        return models.Announce.objects.filter(publication_time__lte=timezone.now()).exclude(
206
            expiration_time__lt=timezone.now()).order_by('-publication_time')
207

    
208
    def item_title(self, item):
209
        return item.title
210

    
211
    def item_description(self, item):
212
        return item.text
213

    
214
    def item_link(self, item):
215
        return self.feed_item_link_template.format(item.pk)
216

    
217
    def item_pubdate(self, item):
218
        return item.publication_time or item.mtime
219

    
220

    
221
atom = AtomView()
222

    
223

    
224
def menu_json(request):
225
    label = _('Announces')
226
    json_str = json.dumps([{'label': force_text(label),
227
                          'slug': 'announces',
228
                           'url': request.build_absolute_uri(reverse('manage'))}])
229

    
230
    for variable in ('jsonpCallback', 'callback'):
231
        if variable in request.GET:
232
            response = HttpResponse(content_type='application/javascript')
233
            json_str = '%s(%s);' % (request.GET[variable], json_str)
234
            break
235
    else:
236
        response = HttpResponse(content_type='application/json')
237
    response.write(json_str)
238
    return response
(10-10/11)