Project

General

Profile

Download (6.11 KB) Statistics
| Branch: | Tag: | Revision:

root / corbo / views.py @ fe505764

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, RedirectView
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(RedirectView):
48
    pattern_name = 'manage'
49

    
50
homepage = HomepageView.as_view()
51

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

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

    
62
add_announce = AnnounceCreateView.as_view()
63

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

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

    
71
edit_announce = AnnounceEditView.as_view()
72

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

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

    
80
delete_announce = AnnounceDeleteView.as_view()
81

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

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

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

    
93
add_category = CategoryCreateView.as_view()
94

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

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

    
103
edit_category = CategoryEditView.as_view()
104

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

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

    
111
delete_category = CategoryDeleteView.as_view()
112

    
113

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

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

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

    
128
unsubscribe = UnsubscribeView.as_view()
129

    
130

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

    
134
unsubscription_done = UnsubscriptionDoneView.as_view()
135

    
136

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

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

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

    
158
manage = ManageView.as_view()
159

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

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

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

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

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

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

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

    
185
atom = AtomView()
186

    
187

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