From 463f2b78ed26701a57f3f2eed221249d841f6449 Mon Sep 17 00:00:00 2001 From: yomguy Date: Wed, 19 Dec 2012 22:58:50 +0100 Subject: [PATCH] working form but wrong action, add styles --- setup.py | 1 + teleforma/models/pro.py | 2 - teleforma/static/teleforma/css/teleforma.css | 43 +++++- .../templates/teleforma/seminar_detail.html | 8 ++ teleforma/urls.py | 3 +- teleforma/views/core.py | 9 +- teleforma/views/pro.py | 124 ++++++++++++++---- 7 files changed, 157 insertions(+), 33 deletions(-) diff --git a/setup.py b/setup.py index c9e06c9f..7548e3ad 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,7 @@ setup( 'django-timezones', 'django-tinymce', 'django-forms-builder', + 'xhtml2pdf', ], platforms=['OS Independent'], license='CeCILL v2', diff --git a/teleforma/models/pro.py b/teleforma/models/pro.py index 2fe3a0bf..8d41d800 100644 --- a/teleforma/models/pro.py +++ b/teleforma/models/pro.py @@ -250,5 +250,3 @@ class Auditor(models.Model): verbose_name = _('Auditor') ordering = ['user__last_name'] - - diff --git a/teleforma/static/teleforma/css/teleforma.css b/teleforma/static/teleforma/css/teleforma.css index affe27ef..790dd785 100644 --- a/teleforma/static/teleforma/css/teleforma.css +++ b/teleforma/static/teleforma/css/teleforma.css @@ -1771,4 +1771,45 @@ form .exceed{ font: 1em Verdana, sans-serif; line-height: 1.3em; color: #333; -} \ No newline at end of file +} + + +.form p { + margin: 0em; + padding-top: 0.3em; + padding-left: 1em; + /*border-top: 1px solid #dfdfdf;*/ +} + +.form ul, .form ul ul, .form ol { + list-style: square; + padding: 0em; + margin-top: 0em; + margin-left: 2em; + padding-left: 2em; + font-size: 0.8em; + clear: both; +} + +.form ul ul { + font-size: 1.1em; + padding-left: 0; +} + +.form li { + font-size: 1.2em; + padding: .2em; + padding-left: 1em; + padding-top: 0.3em; + list-style:none; +} + +.form-button { + padding: 1em 0em 1em 1em; +} + +.form h5 { + font-size: 1em; + padding-left: 0; + font-weight: none; +} diff --git a/teleforma/templates/teleforma/seminar_detail.html b/teleforma/templates/teleforma/seminar_detail.html index 3caef4a1..64e96592 100644 --- a/teleforma/templates/teleforma/seminar_detail.html +++ b/teleforma/templates/teleforma/seminar_detail.html @@ -123,6 +123,7 @@ $(function() { {% endwith %} {% if validated %} + {% with seminar.docs_correct as docs %} {% if docs.all.count > 1 %} {% with _("Step 5 : read these corrected documents") as title %} @@ -134,6 +135,13 @@ $(function() { {% endwith %} {% endif %} {% endwith %} + + {% with seminar.form as form %} + {% with _("Step 6 : evaluate the seminar") as title %} + {% include "teleforma/inc/evaluation_form.html" %} + {% endwith %} + {% endwith %} + {% endif %} {% endblock course_content %} diff --git a/teleforma/urls.py b/teleforma/urls.py index 540d2f0f..eb6e1c85 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -64,7 +64,7 @@ urlpatterns = patterns('', # Desk url(r'^desk/$', SeminarsView.as_view(), name="teleforma-desk"), url(r'^desk/courses/(?P.*)/$', CourseView.as_view(), name="teleforma-course-detail"), - url(r'^desk/seminars/(?P.*)/$', SeminarView.as_view(), name="teleforma-seminar-detail"), + url(r'^desk/seminars/(?P.*)/detail/$', SeminarView.as_view(), name="teleforma-seminar-detail"), url(r'^desk/medias/(?P.*)/detail/$', MediaView.as_view(), name="teleforma-media-detail"), url(r'^desk/medias/(?P.*)/download/$', media.download, name="teleforma-media-download"), @@ -101,6 +101,7 @@ urlpatterns = patterns('', # Evaluations url(r'^forms/', include('forms_builder.forms.urls')), + url(r'^desk/seminars/(?P.*)/form/$', EvaluationView.as_view(), name="teleforma-seminar-form"), # Postman url(r'^messages/', include('postman.urls')), diff --git a/teleforma/views/core.py b/teleforma/views/core.py index fec6bc89..896aebc1 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -38,6 +38,8 @@ import random import urllib import urllib2 import json +import os +import StringIO from jsonrpc import jsonrpc_method @@ -47,7 +49,7 @@ from django.template import RequestContext, loader from django import template from django.http import HttpResponse, HttpResponseRedirect from django.http import Http404 -from django.shortcuts import render_to_response, redirect, get_object_or_404 +from django.shortcuts import render_to_response, redirect, get_object_or_404, render from django.views.generic import * from django.views.generic.base import * from django.conf import settings @@ -67,6 +69,10 @@ from django.contrib.auth.decorators import login_required from django.contrib.contenttypes.models import ContentType from django.views.generic.edit import FormView from django.core.urlresolvers import reverse, reverse_lazy +from django.template.loader import get_template +from django.template.context import Context +from django.utils.html import escape + from jsonrpc.proxy import ServiceProxy from teleforma.models import * @@ -75,6 +81,7 @@ from teleforma.views.pro import * from telemeta.views import * import jqchat.models from xlwt import Workbook +from xhtml2pdf import pisa try: from telecaster.models import * diff --git a/teleforma/views/pro.py b/teleforma/views/pro.py index c23f81ed..bf60d995 100644 --- a/teleforma/views/pro.py +++ b/teleforma/views/pro.py @@ -132,6 +132,7 @@ class SeminarView(DetailView): context['seminar_progress'] = seminar_progress(self.request.user, seminar) context['total_progress'] = total_progress(self.request.user) context['validated'] = seminar_validated(self.request.user, seminar) + context['evaluation'] = seminar.form return context @@ -155,34 +156,6 @@ class SeminarsView(ListView): return super(SeminarsView, self).dispatch(*args, **kwargs) - - -class AjaxableResponseMixin(object): - """ - Mixin to add AJAX support to a form. - Must be used with an object-based FormView (e.g. CreateView) - """ - def render_to_json_response(self, context, **response_kwargs): - data = json.dumps(context) - response_kwargs['content_type'] = 'application/json' - return HttpResponse(data, **response_kwargs) - - def form_invalid(self, form): - if self.request.is_ajax(): - return self.render_to_json_response(form.errors, status=400) - else: - return super(AjaxableResponseMixin, self).form_invalid(form) - - def form_valid(self, form): - if self.request.is_ajax(): - data = { - 'pk': form.instance.pk, - } - return self.render_to_json_response(data) - else: - return super(AjaxableResponseMixin, self).form_valid(form) - - class AnswerView(FormView): model = Answer @@ -341,3 +314,98 @@ class AnswerDetailView(DetailView): context['all_seminars'] = get_seminars(self.request.user) return context + +class AjaxableResponseMixin(object): + """ + Mixin to add AJAX support to a form. + Must be used with an object-based FormView (e.g. CreateView) + """ + def render_to_json_response(self, context, **response_kwargs): + data = json.dumps(context) + response_kwargs['content_type'] = 'application/json' + return HttpResponse(data, **response_kwargs) + + def form_invalid(self, form): + if self.request.is_ajax(): + return self.render_to_json_response(form.errors, status=400) + else: + return super(AjaxableResponseMixin, self).form_invalid(form) + + def form_valid(self, form): + if self.request.is_ajax(): + data = { + 'pk': form.instance.pk, + } + return self.render_to_json_response(data) + else: + return super(AjaxableResponseMixin, self).form_valid(form) + + + +class EvaluationView(DetailView): + + model = Seminar + template_name='teleforma/evaluation_form.html' + + def get_context_data(self, **kwargs): + context = super(EvaluationView, self).get_context_data(**kwargs) + context['all_seminars'] = get_seminars(self.request.user) + context['total_progress'] = total_progress(self.request.user) + context['form'] = self.get_object().form + context['seminar_progress'] = seminar_progress(self.request.user, self.get_object()) + return context + + +def fetch_resources(uri, rel): + """ + Callback to allow xhtml2pdf/reportlab to retrieve Images,Stylesheets, etc. + `uri` is the href attribute from the html link element. + `rel` gives a relative path, but it's not used here. + + """ + if uri.startswith(settings.MEDIA_URL): + path = os.path.join(settings.MEDIA_ROOT, + uri.replace(settings.MEDIA_URL, "")) + elif uri.startswith(settings.STATIC_URL): + path = os.path.join(settings.STATIC_ROOT, + uri.replace(settings.STATIC_URL, "")) + else: + path = os.path.join(settings.STATIC_ROOT, + uri.replace(settings.STATIC_URL, "")) + + if not os.path.isfile(path): + path = os.path.join(settings.MEDIA_ROOT, + uri.replace(settings.MEDIA_URL, "")) + + if not os.path.isfile(path): + raise UnsupportedMediaPathException( + 'media urls must start with %s or %s' % ( + settings.MEDIA_ROOT, settings.STATIC_ROOT)) + + return path + + +def render_to_pdf(template_src, context_dict): + """Function to render html template into a pdf file""" + template = get_template(template_src) + context = Context(context_dict) + html = template.render(context) + result = StringIO.StringIO() + + pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), + dest=result, + encoding='UTF-8', + link_callback=fetch_resources) + if not pdf.err: + response = HttpResponse(result.getvalue(), + mimetype='application/pdf') + + return response + + return HttpResponse('We had some errors
%s
' % escape(html)) + + +def download_pdf(request): + """Build briefing packages format and export as HTML and PDF.""" + response = HttpResponse(content_type='application/pdf') + return generate_pdf('app/test.html', file_object=response) \ No newline at end of file -- 2.39.5