Projet

Général

Profil

Télécharger (5,45 ko) Statistiques
| Branche: | Tag: | Révision:

root / corbo / views.py @ 78775031

1
from datetime import datetime
2
import urllib
3

    
4
from django.conf import settings
5
from django.core import signing
6
from django.core.urlresolvers import reverse
7
from django.views.generic import CreateView, UpdateView, DeleteView, \
8
                                 ListView, TemplateView
9
from django.contrib.syndication.views import Feed
10
from django.shortcuts import resolve_url
11
from django.utils.feedgenerator import Atom1Feed
12
from django.utils.http import urlencode
13
from django.http import Http404
14
from django.contrib.auth import logout as auth_logout
15
from django.contrib.auth import views as auth_views
16
from django.http import HttpResponseRedirect
17

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

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

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

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

    
44

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

    
49
homepage = HomepageView.as_view()
50

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

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

    
61
add_announce = AnnounceCreateView.as_view()
62

    
63
class AnnounceEditView(UpdateView):
64
    model = models.Announce
65
    form_class = AnnounceForm
66

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

    
70
edit_announce = AnnounceEditView.as_view()
71

    
72
class AnnounceDeleteView(DeleteView):
73
    model = models.Announce
74

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

    
79
delete_announce = AnnounceDeleteView.as_view()
80

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

    
85
    def get_success_url(self):
86
        return reverse('manage')
87

    
88
    def form_valid(self, form):
89
        form.save()
90
        return super(CategoryCreateView, self).form_valid(form)
91

    
92
add_category = CategoryCreateView.as_view()
93

    
94
class CategoryEditView(UpdateView):
95
    form_class = CategoryForm
96
    model = models.Category
97

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

    
102
edit_category = CategoryEditView.as_view()
103

    
104
class CategoryDeleteView(DeleteView):
105
    model = models.Category
106

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

    
110
delete_category = CategoryDeleteView.as_view()
111

    
112

    
113
class UnsubscribeView(DeleteView):
114
    model = models.Subscription
115

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

    
124
    def get_success_url(self):
125
        return reverse('unsubscription_done')
126

    
127
unsubscribe = UnsubscribeView.as_view()
128

    
129

    
130
class UnsubscriptionDoneView(TemplateView):
131
    template_name='corbo/unsubscription_done.html'
132

    
133
unsubscription_done = UnsubscriptionDoneView.as_view()
134

    
135

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

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

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

    
157
manage = ManageView.as_view()
158

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

    
166
    def __init__(self, **kwargs):
167
        self.__dict__.update(kwargs)
168

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

    
172
    def item_title(self, item):
173
        return item.title
174

    
175
    def item_description(self, item):
176
        return item.text
177

    
178
    def item_link(self, item):
179
        return self.feed_item_link_template.format(item.pk)
180

    
181
    def item_pubdate(self, item):
182
        return item.publication_time or item.mtime
183

    
184
atom = AtomView()
(10-10/11)