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