class BaseMultimediaView(ApplicationViewMixin, View): @method_decorator( require_permission(Permissions.edit_apps, login_decorator=login_with_permission_from_post())) def dispatch(self, request, *args, **kwargs): return super(BaseMultimediaView, self).dispatch(request, *args, **kwargs)
class BaseProcessUploadedView(BaseMultimediaView): @property def username(self): return self.request.couch_user.username if self.request.couch_user else None @property def share_media(self): return self.request.POST.get('shared') == 't' @property def license_used(self): return self.request.POST.get('license', '') @property def author(self): return self.request.POST.get('author', '') @property def attribution_notes(self): return self.request.POST.get('attribution-notes', '') @property @memoized def uploaded_file(self): return self.request.FILES.get('Filedata') @property @memoized def mime_type(self): try: data = self.uploaded_file.file.read() return CommCareMultimedia.get_mime_type(data, filename=self.uploaded_file.name) except Exception as e: raise BadMediaFileException("There was an error fetching the MIME type of your file. Error: %s" % e) @method_decorator(require_permission(Permissions.edit_apps, login_decorator=login_with_permission_from_post())) # YUI js uploader library doesn't support csrf @csrf_exempt def dispatch(self, request, *args, **kwargs): return super(BaseMultimediaView, self).dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): return HttpResponseBadRequest("You may only post to this URL.") def post(self, request, *args, **kwargs): self.errors = [] response = {} try: self.validate_file() response.update(self.process_upload()) except BadMediaFileException as e: self.errors.append(e.message) response.update({ 'errors': self.errors, }) return HttpResponse(json.dumps(response)) def validate_file(self, replace_diff_ext=False): raise NotImplementedError("You must validate your uploaded file!") def process_upload(self): raise NotImplementedError("You definitely need to implement this guy.")