finish off changes to google drive to allow for ppt > pdf and pdf.js
[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
22 def is_pdf(self):
23     _path = self.object.note_file.name
24     _, _extension = os.path.splitext(_path)
25     if _extension.lower() == '.pdf':
26         return True
27     return False
28
29 def is_ppt(self):
30     if self.object.pdf_file:
31         print "is a ppt"
32         return True
33     return False
34
35
36 class NoteDetailView(DetailView):
37     """ Class-based view for the note html page """
38     model = Note
39     context_object_name = u"note" # name passed to template
40
41     def get_context_data(self, **kwargs):
42         """ Generate custom context for the page rendering a Note
43             + if pdf, set the `pdf` flag
44         """
45         #kwargs['file_url'] = os.path.basename(_path)
46         #kwargs['hostname'] = Site.objects.get_current()
47
48         kwargs['pdf'] = is_pdf(self)
49         kwargs['ppt'] = is_ppt(self)
50
51         return super(NoteDetailView, self).get_context_data(**kwargs)
52
53
54 class NoteSaveView(FormView, SingleObjectMixin):
55     """ Save a Note and then view the page, 
56         behaves the same as NoteDetailView, except for saving the
57         NoteForm ModelForm
58     """
59     form_class = NoteForm
60     model = Note
61     template_name = 'notes/note_detail.html'
62
63     def get_context_data(self, **kwargs):
64         context = {
65             'object': self.get_object(),
66         }
67         print "get context for NoteSaveView"
68         return super(NoteSaveView, self).get_context_data(**context)
69
70     def get_success_url(self):
71         """ On form submission success, redirect to what url """
72         #TODO: redirect to note slug if possible (auto-slugify)
73         return u'/{school_slug}/{course_slug}?url=/{school_slug}/{course_slug}/{pk}&name={name}&thankyou'.format(
74                 school_slug=self.object.course.school.slug,
75                 course_slug=self.object.course.slug,
76                 pk=self.object.pk,
77                 name=self.object.name
78             )
79
80     def form_valid(self, form):
81         """ Actions to take if the submitted form is valid
82             namely, saving the new data to the existing note object
83         """
84         self.object = self.get_object()
85         if len(form.cleaned_data['name'].strip()) > 0:
86             self.object.name = form.cleaned_data['name']
87         self.object.year = form.cleaned_data['year']
88         # use *arg expansion to pass tags a list of tags
89         self.object.tags.add(*form.cleaned_data['tags'])
90         self.object.save()
91         return super(NoteSaveView, self).form_valid(form)
92
93     def form_invalid(self, form):
94         """ Do stuff when the form is invalid !!! TODO """
95         # TODO: implement def form_invalid for returning a form with input and error
96         print "running form_invalid"
97         print form
98         print form.errors
99
100
101 class NoteView(View):
102     """ Notes superclass that wraps http methods """
103
104     def get(self, request, *args, **kwargs):
105         view = NoteDetailView.as_view()
106         return view(request, *args, **kwargs)
107
108     def post(self, request, *args, **kwargs):
109         view = NoteSaveView.as_view()
110         return view(request, *args, **kwargs)
111
112
113 class RawNoteDetailView(DetailView):
114     """ Class-based view for the raw note html for iframes """
115     template_name = u'notes/note_raw.html'
116     context_object_name = u"note"
117     model = Note
118
119
120 class PDFView(DetailView):
121     """ Render PDF files in an iframe based on ID"""
122     template_name = u'partial/pdfembed.html'
123     model = Note
124
125     def get_context_data(self, **kwargs):
126         """ Generate a path to the pdf file associated with this note
127             by generating a path to the MEDIA_URL by hand """
128         # FIXME: There may be an undocumented,
129         #   but better way of handling media files in django
130
131         if is_ppt:
132             kwargs['pdf_path'] = "{0}{1}".format(settings.MEDIA_URL,
133                 os.path.basename(self.object.pdf_file.name))
134         elif is_pdf:
135             kwargs['pdf_path'] = "{0}{1}".format(settings.MEDIA_URL,
136                 os.path.basename(self.object.note_file.name))
137
138         return super(PDFView, self).get_context_data(**kwargs)