Projet

Général

Profil

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

root / corbo / views.py @ cd899cfc

1
from datetime import datetime
2
import urllib
3
import json
4

    
5
from django.conf import settings
6
from django.core import signing
7
from django.core.urlresolvers import reverse
8
from django.views.generic import CreateView, UpdateView, DeleteView, \
9
                                 ListView, TemplateView
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
14
from django.utils.http import urlencode
15
from django.http import HttpResponseRedirect, HttpResponse, Http404
16
from django.contrib.auth import logout as auth_logout
17
from django.contrib.auth import views as auth_views
18
from django.utils.translation import ugettext_lazy as _
19

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

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

    
28
def login(request, *args, **kwargs):
29
    if any(get_idps()):
30
        if not 'next' 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
def logout(request, next_page=None):
37
    if any(get_idps()):
38
        return HttpResponseRedirect(resolve_url('mellon_logout'))
39
    auth_logout(request)
40
    if next_page is not None:
41
        next_page = resolve_url(next_page)
42
    else:
43
        next_page = '/'
44
    return HttpResponseRedirect(next_page)
45

    
46

    
47
class HomepageView(ListView):
48
    model = models.Announce
49
    template_name = 'corbo/homepage.html'
50

    
51
homepage = HomepageView.as_view()
52

    
53
class AnnounceCreateView(CreateView):
54
    form_class = AnnounceForm
55
    template_name = 'corbo/announce_form.html'
56

    
57
    def get_success_url(self):
58
        """
59
        redirect to the category page of the new created announce
60
        """
61
        return reverse('manage') + '?' + urlencode({'category': self.object.category.id})
62

    
63
add_announce = AnnounceCreateView.as_view()
64

    
65
class AnnounceEditView(UpdateView):
66
    model = models.Announce
67
    form_class = AnnounceForm
68

    
69
    def get_success_url(self):
70
        return reverse('manage') + '?' + urlencode({'category': self.object.category.id})
71

    
72
edit_announce = AnnounceEditView.as_view()
73

    
74
class AnnounceDeleteView(DeleteView):
75
    model = models.Announce
76

    
77
    def get_success_url(self):
78
        return self.request.META['HTTP_REFERER'] or \
79
            reverse('manage') + '?' + urlencode({'category': self.object.category.id})
80

    
81
delete_announce = AnnounceDeleteView.as_view()
82

    
83
class CategoryCreateView(CreateView):
84
    form_class = CategoryForm
85
    template_name = 'corbo/category_form.html'
86

    
87
    def get_success_url(self):
88
        return reverse('manage')
89

    
90
    def form_valid(self, form):
91
        form.save()
92
        return super(CategoryCreateView, self).form_valid(form)
93

    
94
add_category = CategoryCreateView.as_view()
95

    
96
class CategoryEditView(UpdateView):
97
    form_class = CategoryForm
98
    model = models.Category
99

    
100
    def get_success_url(self):
101
        return self.request.META['HTTP_REFERER'] or \
102
            reverse('manage') + '?' + urlencode({'category': self.object.id})
103

    
104
edit_category = CategoryEditView.as_view()
105

    
106
class CategoryDeleteView(DeleteView):
107
    model = models.Category
108

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

    
112
delete_category = CategoryDeleteView.as_view()
113

    
114

    
115
class UnsubscribeView(DeleteView):
116
    model = models.Subscription
117

    
118
    def get_object(self, queryset=None):
119
        data = signing.loads(self.kwargs['unsubscription_token'])
120
        try:
121
            return models.Subscription.objects.get(category__pk=data['category'],
122
                                identifier=data['identifier'])
123
        except models.Subscription.DoesNotExist:
124
            raise Http404
125

    
126
    def get_success_url(self):
127
        return reverse('unsubscription_done')
128

    
129
unsubscribe = UnsubscribeView.as_view()
130

    
131

    
132
class UnsubscriptionDoneView(TemplateView):
133
    template_name='corbo/unsubscription_done.html'
134

    
135
unsubscription_done = UnsubscriptionDoneView.as_view()
136

    
137

    
138
class ManageView(ListView):
139
    paginate_by = settings.ANNOUNCES_PER_PAGE
140
    template_name = 'corbo/manage.html'
141
    model = models.Announce
142

    
143
    def get_queryset(self):
144
        queryset = super(ManageView, self).get_queryset()
145
        if self.request.GET.get('category'):
146
            queryset = queryset.filter(category__id=self.request.GET['category'])
147
        return queryset
148

    
149
    def get_context_data(self, **kwargs):
150
        context = super(ManageView, self).get_context_data(**kwargs)
151
        context['categories'] = models.Category.objects.all().order_by('-ctime')
152
        if self.request.GET.get('category'):
153
            try:
154
                context['category_id'] = int(self.request.GET['category'])
155
            except:
156
                pass
157
        return context
158

    
159
manage = ManageView.as_view()
160

    
161
class AtomView(Feed):
162
    title = settings.RSS_TITLE
163
    description = settings.RSS_DESCRIPTION
164
    link = settings.RSS_LINK
165
    feed_item_link_template = settings.RSS_LINK_TEMPLATE
166
    feed_type = Atom1Feed
167

    
168
    def __init__(self, **kwargs):
169
        self.__dict__.update(kwargs)
170

    
171
    def items(self):
172
        return models.Announce.objects.exclude(expiration_time__lt=datetime.now()).order_by('-publication_time')
173

    
174
    def item_title(self, item):
175
        return item.title
176

    
177
    def item_description(self, item):
178
        return item.text
179

    
180
    def item_link(self, item):
181
        return self.feed_item_link_template.format(item.pk)
182

    
183
    def item_pubdate(self, item):
184
        return item.publication_time or item.mtime
185

    
186
atom = AtomView()
187

    
188

    
189
def menu_json(request):
190
    label = _('Announces')
191
    json_str = json.dumps([{'label': force_text(label),
192
        'slug': 'announces',
193
        'url': request.build_absolute_uri(reverse('manage'))
194
        }])
195
    for variable in ('jsonpCallback', 'callback'):
196
        if variable in request.GET:
197
            response = HttpResponse(content_type='application/javascript')
198
            json_str = '%s(%s);' % (request.GET[variable], json_str)
199
            break
200
    else:
201
        response = HttpResponse(content_type='application/json')
202
    response.write(json_str)
203
    return response
(10-10/11)