Project

General

Profile

Download (6.11 KB) Statistics
| Branch: | Tag: | Revision:
from datetime import datetime
import urllib
import json

from django.conf import settings
from django.core import signing
from django.core.urlresolvers import reverse
from django.views.generic import CreateView, UpdateView, DeleteView, \
ListView, TemplateView, RedirectView
from django.contrib.syndication.views import Feed
from django.shortcuts import resolve_url
from django.utils.encoding import force_text
from django.utils.feedgenerator import Atom1Feed
from django.utils.http import urlencode
from django.http import HttpResponseRedirect, HttpResponse, Http404
from django.contrib.auth import logout as auth_logout
from django.contrib.auth import views as auth_views
from django.utils.translation import ugettext_lazy as _

import models
from .forms import AnnounceForm, CategoryForm

try:
from mellon.utils import get_idps
except ImportError:
get_idps = lambda: []

def login(request, *args, **kwargs):
if any(get_idps()):
if not 'next' in request.GET:
return HttpResponseRedirect(resolve_url('mellon_login'))
return HttpResponseRedirect(resolve_url('mellon_login') + '?next='
+ urllib.quote(request.GET.get('next')))
return auth_views.login(request, *args, **kwargs)

def logout(request, next_page=None):
if any(get_idps()):
return HttpResponseRedirect(resolve_url('mellon_logout'))
auth_logout(request)
if next_page is not None:
next_page = resolve_url(next_page)
else:
next_page = '/'
return HttpResponseRedirect(next_page)


class HomepageView(RedirectView):
pattern_name = 'manage'

homepage = HomepageView.as_view()

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

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

add_announce = AnnounceCreateView.as_view()

class AnnounceEditView(UpdateView):
model = models.Announce
form_class = AnnounceForm

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

edit_announce = AnnounceEditView.as_view()

class AnnounceDeleteView(DeleteView):
model = models.Announce

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

delete_announce = AnnounceDeleteView.as_view()

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

def get_success_url(self):
return reverse('manage')

def form_valid(self, form):
form.save()
return super(CategoryCreateView, self).form_valid(form)

add_category = CategoryCreateView.as_view()

class CategoryEditView(UpdateView):
form_class = CategoryForm
model = models.Category

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

edit_category = CategoryEditView.as_view()

class CategoryDeleteView(DeleteView):
model = models.Category

def get_success_url(self):
return reverse('manage')

delete_category = CategoryDeleteView.as_view()


class UnsubscribeView(DeleteView):
model = models.Subscription

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

def get_success_url(self):
return reverse('unsubscription_done')

unsubscribe = UnsubscribeView.as_view()


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

unsubscription_done = UnsubscriptionDoneView.as_view()


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

def get_queryset(self):
queryset = super(ManageView, self).get_queryset()
if self.request.GET.get('category'):
queryset = queryset.filter(category__id=self.request.GET['category'])
return queryset

def get_context_data(self, **kwargs):
context = super(ManageView, self).get_context_data(**kwargs)
context['categories'] = models.Category.objects.all().order_by('-ctime')
if self.request.GET.get('category'):
try:
context['category_id'] = int(self.request.GET['category'])
except:
pass
return context

manage = ManageView.as_view()

class AtomView(Feed):
title = settings.RSS_TITLE
description = settings.RSS_DESCRIPTION
link = settings.RSS_LINK
feed_item_link_template = settings.RSS_LINK_TEMPLATE
feed_type = Atom1Feed

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

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

def item_title(self, item):
return item.title

def item_description(self, item):
return item.text

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

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

atom = AtomView()


def menu_json(request):
label = _('Announces')
json_str = json.dumps([{'label': force_text(label),
'slug': 'announces',
'url': request.build_absolute_uri(reverse('manage'))
}])
for variable in ('jsonpCallback', 'callback'):
if variable in request.GET:
response = HttpResponse(content_type='application/javascript')
json_str = '%s(%s);' % (request.GET[variable], json_str)
break
else:
response = HttpResponse(content_type='application/json')
response.write(json_str)
return response
(10-10/11)