Merge branch 'ppt-gdrive' of https://github.com/FinalsClub/karmaworld into ppt-gdrive
[oweals/karmaworld.git] / karmaworld / apps / notes / views.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2012  FinalsClub Foundation
4
5 import os
6
7 from django.conf import settings
8 from django.contrib.sites.models import Site
9 from django.http import HttpResponse
10 from django.views.generic import DetailView
11 from django.views.generic import FormView
12 from django.views.generic import View
13 from django.views.generic import TemplateView
14 from django.views.generic.detail import SingleObjectMixin
15 from django.shortcuts import get_object_or_404
16
17 from karmaworld.apps.notes.models import Note
18 from karmaworld.apps.notes.forms import NoteForm
19
20
21 class NoteDetailView(DetailView):
22     """ Class-based view for the note html page """
23     model = Note
24     context_object_name = u"note" # name passed to template
25
26     def get_context_data(self, **kwargs):
27         """ Generate custom context for the page rendering a Note
28             + if pdf, set the `pdf` flag
29         """
30         #kwargs['file_url'] = os.path.basename(_path)
31         #kwargs['hostname'] = Site.objects.get_current()
32
33         def is_pdf(self):
34             _path = self.object.note_file.name
35             _, _extension = os.path.splitext(_path)
36             if _extension.lower() == '.pdf':
37                 return True
38             return False
39
40         kwargs['pdf'] = is_pdf(self)
41
42         return super(NoteDetailView, self).get_context_data(**kwargs)
43
44
45 class NoteSaveView(FormView, SingleObjectMixin):
46     """ Save a Note and then view the page, 
47         behaves the same as NoteDetailView, except for saving the
48         NoteForm ModelForm
49     """
50     form_class = NoteForm
51     model = Note
52     template_name = 'notes/note_detail.html'
53
54     def get_context_data(self, **kwargs):
55         context = {
56             'object': self.get_object(),
57         }
58         print "get context for NoteSaveView"
59         return super(NoteSaveView, self).get_context_data(**context)
60
61     def get_success_url(self):
62         """ On form submission success, redirect to what url """
63         #TODO: redirect to note slug if possible (auto-slugify)
64         return u'/{school_slug}/{course_slug}?url=/{school_slug}/{course_slug}/{pk}&name={name}&thankyou'.format(
65                 school_slug=self.object.course.school.slug,
66                 course_slug=self.object.course.slug,
67                 pk=self.object.pk,
68                 name=self.object.name
69             )
70
71     def form_valid(self, form):
72         """ Actions to take if the submitted form is valid
73             namely, saving the new data to the existing note object
74         """
75         self.object = self.get_object()
76         if len(form.cleaned_data['name'].strip()) > 0:
77             self.object.name = form.cleaned_data['name']
78         self.object.year = form.cleaned_data['year']
79         # use *arg expansion to pass tags a list of tags
80         self.object.tags.add(*form.cleaned_data['tags'])
81         self.object.save()
82         return super(NoteSaveView, self).form_valid(form)
83
84     def form_invalid(self, form):
85         """ Do stuff when the form is invalid !!! TODO """
86         # TODO: implement def form_invalid for returning a form with input and error
87         print "running form_invalid"
88         print form
89         print form.errors
90
91
92 class NoteView(View):
93     """ Notes superclass that wraps http methods """
94
95     def get(self, request, *args, **kwargs):
96         view = NoteDetailView.as_view()
97         return view(request, *args, **kwargs)
98
99     def post(self, request, *args, **kwargs):
100         view = NoteSaveView.as_view()
101         return view(request, *args, **kwargs)
102
103
104 class RawNoteDetailView(DetailView):
105     """ Class-based view for the raw note html for iframes """
106     template_name = u'notes/note_raw.html'
107     context_object_name = u"note"
108     model = Note
109
110
111 class PDFView(DetailView):
112     """ Render PDF files in an iframe based on ID"""
113     template_name = u'partial/pdfembed.html'
114     model = Note
115
116     def get_context_data(self, **kwargs):
117         """ Generate a path to the pdf file associated with this note
118             by generating a path to the MEDIA_URL by hand """
119         # FIXME: There may be an undocumented,
120         #   but better way of handling media files in django
121
122         kwargs['pdf_path'] = "{0}{1}".format(settings.MEDIA_URL,
123             os.path.basename(self.object.note_file.name))
124
125         return super(PDFView, self).get_context_data(**kwargs)