From: yomguy Date: Fri, 25 Jan 2013 17:04:59 +0000 (+0100) Subject: add seminar access rules through mixins X-Git-Tag: 0.9-probarreau~98 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=38ecf66d4c9689d07d650f8d1ad7287b5e8a3690;p=teleforma.git add seminar access rules through mixins --- diff --git a/teleforma/templates/teleforma/inc/document_simple_list.html b/teleforma/templates/teleforma/inc/document_simple_list.html index 76ef7e93..b11cd279 100644 --- a/teleforma/templates/teleforma/inc/document_simple_list.html +++ b/teleforma/templates/teleforma/inc/document_simple_list.html @@ -5,8 +5,8 @@ {% for doc in docs.all %} - {% if doc.file %}{% endif %} {{ doc.title }}{% if doc.file %}{% endif %} - {% if doc.file %}{% endif %} + {% if doc.file %}{% endif %} {{ doc.title }}{% if doc.file %}{% endif %} + {% if doc.file %}{% endif %} {% endfor %} diff --git a/teleforma/templates/teleforma/inc/document_step.html b/teleforma/templates/teleforma/inc/document_step.html index b97fccf0..be4c6d8a 100644 --- a/teleforma/templates/teleforma/inc/document_step.html +++ b/teleforma/templates/teleforma/inc/document_step.html @@ -5,7 +5,7 @@ {% for doc in docs.all %} - {% if doc.file %}{% endif %} {{ doc.title }}{% if doc.file %}{% endif %} + {% if doc.file %}{% endif %} {{ doc.title }}{% if doc.file %}{% endif %} {% endfor %} diff --git a/teleforma/urls.py b/teleforma/urls.py index 85fe954c..596dc94c 100644 --- a/teleforma/urls.py +++ b/teleforma/urls.py @@ -45,7 +45,7 @@ from jsonrpc import jsonrpc_site htdocs_forma = os.path.dirname(__file__) + '/static/teleforma/' user_export = UsersXLSExport() profile_view = ProfileView() -document = DocumentView() +document = SeminarDocumentView() media = MediaView() urlpatterns = patterns('', @@ -67,7 +67,7 @@ urlpatterns = patterns('', 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"), + # url(r'^desk/medias/(?P.*)/download/$', media.download, name="teleforma-media-download"), url(r'^desk/seminars/(?P.*)/media/(?P.*)/video/$', SeminarMediaView.as_view(template_name='teleforma/seminar_media_video.html'), @@ -79,11 +79,9 @@ urlpatterns = patterns('', SeminarMediaPreviewView.as_view(), name="teleforma-media-preview-video"), - url(r'^desk/documents/(?P.*)/detail/$', DocumentView.as_view(), - name="teleforma-document-detail"), - url(r'^desk/documents/(?P.*)/download/$', document.download, + url(r'^desk/seminars/(?P.*)/documents/(?P.*)/download/$', SeminarDocumentDownloadView.as_view(), name="teleforma-document-download"), - url(r'^desk/documents/(?P.*)/view/$', document.view, + url(r'^desk/seminars/(?P.*)/documents/(?P.*)/view/$', SeminarDocumentView.as_view(), name="teleforma-document-view"), # url(r'^desk/documents/(?P.*)/view/$', document_view, name="teleforma-document-view"), diff --git a/teleforma/views/core.py b/teleforma/views/core.py index f4d3d961..742857c8 100644 --- a/teleforma/views/core.py +++ b/teleforma/views/core.py @@ -199,6 +199,16 @@ def get_periods(user): return periods +class CourseAccessMixin(object): + + def render_to_response(self, context): + course = context['course'] + if not course in all_courses(self.request.user): + messages.warning(self.request, _("You do NOT have access to this resource and then have been redirected to your desk.")) + return redirect('teleforma-desk') + return super(CourseAccessMixin, self).render_to_response(context) + + class CourseView(DetailView): model = Course @@ -229,6 +239,7 @@ class CourseView(DetailView): return super(CourseView, self).dispatch(*args, **kwargs) + class CoursesView(ListView): model = Course @@ -348,35 +359,32 @@ class DocumentView(DetailView): def dispatch(self, *args, **kwargs): return super(DocumentView, self).dispatch(*args, **kwargs) - def download(self, request, pk): - document = Document.objects.get(id=pk) - courses = get_courses(request.user) - seminars = all_seminars(request)['all_seminars'] - if get_seminar_doc_access(document, seminars): - document.readers.add(request.user) - fsock = open(document.file.path, 'r') - mimetype = mimetypes.guess_type(document.file.path)[0] - extension = mimetypes.guess_extension(mimetype) - response = HttpResponse(fsock, mimetype=mimetype) - response['Content-Disposition'] = "attachment; filename=%s%s" % \ + +class DocumentDownloadView(DocumentView): + + def render_to_response(self, context): + document = self.get_object() + document.readers.add(self.request.user) + fsock = open(document.file.path, 'r') + mimetype = mimetypes.guess_type(document.file.path)[0] + extension = mimetypes.guess_extension(mimetype) + response = HttpResponse(fsock, mimetype=mimetype) + response['Content-Disposition'] = "attachment; filename=%s%s" % \ (document.title.encode('utf8'), extension) - return response - else: - return redirect('teleforma-document-detail', document.id) + return super(DocumentDownloadView, self).render_to_response(context) - def view(self, request, pk): - courses = get_courses(request.user) - seminars = all_seminars(request)['all_seminars'] - document = Document.objects.get(id=pk) - if get_seminar_doc_access(document, seminars): - document.readers.add(request.user) - fsock = open(document.file.path, 'r') - mimetype = mimetypes.guess_type(document.file.path)[0] - extension = mimetypes.guess_extension(mimetype) - response = HttpResponse(fsock, mimetype=mimetype) - return response - else: - return redirect('teleforma-document-detail', document.id) + +class DocumentReadView(DocumentView): + + def render_to_response(self, context): + courses = get_courses(self.request.user) + document = self.get_object() + document.readers.add(self.request.user) + fsock = open(document.file.path, 'r') + mimetype = mimetypes.guess_type(document.file.path)[0] + extension = mimetypes.guess_extension(mimetype) + response = HttpResponse(fsock, mimetype=mimetype) + return super(DocumentReadView, self).render_to_response(context) class ConferenceView(DetailView): diff --git a/teleforma/views/pro.py b/teleforma/views/pro.py index 96d2cc73..e2149daf 100644 --- a/teleforma/views/pro.py +++ b/teleforma/views/pro.py @@ -223,16 +223,41 @@ class SeminarMediaView(SeminarAccessMixin, MediaView): set_revision(user, seminar) return context - def get_object(self, queryset=None): - return Media.objects.get(id=self.pk) - @method_decorator(login_required) def dispatch(self, *args, **kwargs): - self.pk = kwargs.get('pk') - media = self.get_object() return super(SeminarMediaView, self).dispatch(*args, **kwargs) +class SeminarDocumentView(SeminarAccessMixin, DocumentReadView): + + def get_context_data(self, **kwargs): + context = super(SeminarDocumentView, self).get_context_data(**kwargs) + user = self.request.user + seminar = Seminar.objects.get(pk=self.kwargs['id']) + context['seminar'] = seminar + set_revision(user, seminar) + return context + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(SeminarDocumentView, self).dispatch(*args, **kwargs) + + +class SeminarDocumentDownloadView(SeminarAccessMixin, DocumentDownloadView): + + def get_context_data(self, **kwargs): + context = super(SeminarDocumentDownloadView, self).get_context_data(**kwargs) + user = self.request.user + seminar = Seminar.objects.get(pk=self.kwargs['id']) + context['seminar'] = seminar + set_revision(user, seminar) + return context + + @method_decorator(login_required) + def dispatch(self, *args, **kwargs): + return super(SeminarDocumentDownloadView, self).dispatch(*args, **kwargs) + + class SeminarMediaPreviewView(DetailView): model = Seminar @@ -246,6 +271,7 @@ class SeminarMediaPreviewView(DetailView): def dispatch(self, *args, **kwargs): return super(SeminarMediaPreviewView, self).dispatch(*args, **kwargs) + class AnswersView(ListView): model = Answer