def error(self, request, status_code, error_dict=None): """ Return JSON error response that includes a human readable error message, application-specific errors and a machine readable status code. """ if not error_dict: error_dict = ErrorDict() response = HttpResponse(mimetype = self.mimetype) response.status_code = status_code response_dict = { "error-message" : '%d %s' % (status_code, STATUS_CODE_TEXT[status_code]), "status-code" : status_code, "model-errors" : error_dict.as_ul() } simplejson.dump(response_dict, response) return response
def fork(request, klass, id): """Create a new item of given klass. @param request: request data @type request: Django request @param klass: item's class for lookup in correct database table @type klass: either Data, Task or Method @return: user login page, item's view page or this page again on failed form validation @rtype: Django response @raise Http404: if given klass is unexpected """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('user_signin') + '?next=' + request.path) prev = klass.get_object(id) if not prev: raise Http404 if not prev.can_fork(request.user): return HttpResponseForbidden() prev.klass = klass.__name__ prev.name+=' (forked)' upload_limit = Preferences.objects.get(pk=1).max_data_size formfunc = eval(klass.__name__ + 'Form') if request.method == 'POST': form = formfunc(request.POST, request.FILES, request=request) # manual validation coz it's required for new, but not edited Data if not request.FILES and klass == Data: form.errors['file'] = ErrorDict({'': _('This field is required.')}).as_ul() # check whether file is too large if klass in (Data, Task) and 'file' in request.FILES: if len(request.FILES['file']) > upload_limit: form.errors['file'] = ErrorDict({'': _('File is too large! Must be smaller than %dMB!' % (upload_limit / MEGABYTE))}).as_ul() if form.is_valid(): new = form.save(commit=False) new.pub_date = datetime.datetime.now() try: new.slug = new.make_slug() except IntegrityError: # looks quirky... d = ErrorDict({'': _('The given name yields an already existing slug. Please try another name.')}) form.errors['name'] = d.as_ul() else: new.version = 1 new.is_current = True new.is_public = False new.user = request.user if not form.cleaned_data['keep_private']: new.is_public = True if klass == Data: new.file = request.FILES['file'] new.num_instances = -1 new.num_attributes = -1 new.save() # InMemoryUploadedFile returns file-like object whereas # zipfile/tarfile modules used in get_uncompressed() require # filename (prior to python 2.7), so we have to save it to # disk, then rename, then save object again. name_old = os.path.join(MEDIA_ROOT, new.file.name) uncompressed = ml2h5.data.get_uncompressed(name_old) if uncompressed: os.remove(name_old) name_old = uncompressed new.format = ml2h5.fileformat.get(name_old) name_new = os.path.join(DATAPATH, new.get_filename()) os.rename(name_old, os.path.join(MEDIA_ROOT, name_new)) new.file.name = name_new new.save() elif klass == Task: taskinfo = { 'train_idx': (form.cleaned_data['train_idx']), 'test_idx': (form.cleaned_data['test_idx']), 'input_variables': form.cleaned_data['input_variables'], 'output_variables': form.cleaned_data['output_variables'] } new.file = None if 'file' in request.FILES: new.file = request.FILES['file'] new.save() new.create_next_file(prev=None) else: new.save(taskinfo=taskinfo) new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA new.save(taskinfo=taskinfo) elif klass == Method: #if 'score' in request.FILES: # new.score = request.FILES['score'] # new.score.name = new.get_scorename() new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA new.save() elif klass == Challenge: new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA new.save() new.task=form.cleaned_data['task'] new.save() else: raise Http404 return HttpResponseRedirect(new.get_absolute_slugurl()) else: form = formfunc(request=request, instance=prev) info_dict = { 'klass': klass.__name__, 'uuid': uuid.uuid4(), # for upload progress bar 'url_new': request.path, 'form': form, 'request': request, 'tagcloud': get_tag_clouds(request), 'section': 'repository', 'upload_limit': "%dMB" % (upload_limit / MEGABYTE) } return _response_for(request, klass, 'item_new', info_dict)
def new(request, klass, default_arg=None): """Create a new item of given klass. @param request: request data @type request: Django request @param klass: item's class for lookup in correct database table @type klass: either Data, Task or Method @return: user login page, item's view page or this page again on failed form validation @rtype: Django response @raise Http404: if given klass is unexpected """ if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('user_signin') + '?next=' + request.path) upload_limit = Preferences.objects.get(pk=1).max_data_size formfunc = eval(klass.__name__ + 'Form') if request.method == 'POST': form = formfunc(request.POST, request.FILES, request=request) # manual validation coz it's required for new, but not edited Data if not request.FILES and klass == Data: form.errors['file'] = ErrorDict({'': _('This field is required.')}).as_ul() _validate_file_size(request, form, klass) if form.is_valid(): new = form.save(commit=False) new.pub_date = datetime.datetime.now() try: new.slug = new.make_slug() except IntegrityError: # looks quirky... d = ErrorDict({'': _('The given name yields an already existing slug. Please try another name.')}) form.errors['name'] = d.as_ul() else: new.version = 1 new.is_current = True new.is_public = False new.user = request.user if not form.cleaned_data['keep_private']: new.is_public = True if klass == Data: _upload_data_file(new, request.FILES['file']) new.save() form.save_m2m() # it couldn't be done automatically because of commit=False elif klass == Task: new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA taskinfo = { 'train_idx': (form.cleaned_data['train_idx']), 'val_idx': (form.cleaned_data['val_idx']), 'test_idx': (form.cleaned_data['test_idx']), 'input_variables': form.cleaned_data['input_variables'], 'output_variables': form.cleaned_data['output_variables'], 'data_size': form.cleaned_data['data'].num_instances } new.file = None if 'file' in request.FILES: new.file = request.FILES['file'] new.save() new.create_next_file(prev=None) else: new.save(taskinfo=taskinfo) elif klass == Method: #if 'score' in request.FILES: # new.score = request.FILES['score'] # new.score.name = new.get_scorename() new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA new.save() elif klass == Challenge: new.license = FixedLicense.objects.get(pk=1) # fixed to CC-BY-SA new.save() new.task=form.cleaned_data['task'] new.save() else: raise Http404 return HttpResponseRedirect(new.get_absolute_slugurl()) else: if default_arg: form = formfunc(request=request, default_arg=default_arg) else: form = formfunc(request=request) kname=klass.__name__.lower() info_dict = { 'klass': klass.__name__, kname: True, 'uuid': uuid.uuid4(), # for upload progress bar 'url_new': request.path, 'form': form, 'request': request, 'tagcloud': get_tag_clouds(request), 'section': 'repository', 'upload_limit': "%dMB" % (upload_limit / MEGABYTE) } return _response_for(request, klass, 'item_new', info_dict)
def fork(request, klass, id): """Create a new item of given klass. @param request: request data @type request: Django request @param klass: item's class for lookup in correct database table @type klass: either Data, Task or Method @return: user login page, item's view page or this page again on failed form validation @rtype: Django response @raise Http404: if given klass is unexpected """ if not request.user.is_authenticated(): return HttpResponseRedirect( reverse('user_signin') + '?next=' + request.path) prev = klass.get_object(id) if not prev: raise Http404 if not prev.can_fork(request.user): return HttpResponseForbidden() prev.klass = klass.__name__ prev.name += ' (forked)' upload_limit = Preferences.objects.get(pk=1).max_data_size formfunc = eval(klass.__name__ + 'Form') if request.method == 'POST': form = formfunc(request.POST, request.FILES, request=request) # manual validation coz it's required for new, but not edited Data if not request.FILES and klass == Data: form.errors['file'] = ErrorDict({ '': _('This field is required.') }).as_ul() # check whether file is too large if klass in (Data, Task) and 'file' in request.FILES: if len(request.FILES['file']) > upload_limit: form.errors['file'] = ErrorDict({ '': _('File is too large! Must be smaller than %dMB!' % (upload_limit / MEGABYTE)) }).as_ul() if form.is_valid(): new = form.save(commit=False) new.pub_date = datetime.datetime.now() try: new.slug = new.make_slug() except IntegrityError: # looks quirky... d = ErrorDict({ '': _('The given name yields an already existing slug. Please try another name.' ) }) form.errors['name'] = d.as_ul() else: new.version = 1 new.is_current = True new.is_public = False new.user = request.user if not form.cleaned_data['keep_private']: new.is_public = True if klass == Data: new.file = request.FILES['file'] new.num_instances = -1 new.num_attributes = -1 new.save() # InMemoryUploadedFile returns file-like object whereas # zipfile/tarfile modules used in get_uncompressed() require # filename (prior to python 2.7), so we have to save it to # disk, then rename, then save object again. name_old = os.path.join(MEDIA_ROOT, new.file.name) uncompressed = ml2h5.data.get_uncompressed(name_old) if uncompressed: os.remove(name_old) name_old = uncompressed new.format = ml2h5.fileformat.get(name_old) name_new = os.path.join(DATAPATH, new.get_filename()) os.rename(name_old, os.path.join(MEDIA_ROOT, name_new)) new.file.name = name_new new.save() elif klass == Task: taskinfo = { 'train_idx': (form.cleaned_data['train_idx']), 'test_idx': (form.cleaned_data['test_idx']), 'input_variables': form.cleaned_data['input_variables'], 'output_variables': form.cleaned_data['output_variables'] } new.file = None if 'file' in request.FILES: new.file = request.FILES['file'] new.save() new.create_next_file(prev=None) else: new.save(taskinfo=taskinfo) new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA new.save(taskinfo=taskinfo) elif klass == Method: #if 'score' in request.FILES: # new.score = request.FILES['score'] # new.score.name = new.get_scorename() new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA new.save() elif klass == Challenge: new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA new.save() new.task = form.cleaned_data['task'] new.save() else: raise Http404 return HttpResponseRedirect(new.get_absolute_slugurl()) else: form = formfunc(request=request, instance=prev) info_dict = { 'klass': klass.__name__, 'uuid': uuid.uuid4(), # for upload progress bar 'url_new': request.path, 'form': form, 'request': request, 'tagcloud': get_tag_clouds(request), 'section': 'repository', 'upload_limit': "%dMB" % (upload_limit / MEGABYTE) } return _response_for(request, klass, 'item_new', info_dict)
def new(request, klass, default_arg=None): """Create a new item of given klass. @param request: request data @type request: Django request @param klass: item's class for lookup in correct database table @type klass: either Data, Task or Method @return: user login page, item's view page or this page again on failed form validation @rtype: Django response @raise Http404: if given klass is unexpected """ if not request.user.is_authenticated(): return HttpResponseRedirect( reverse('user_signin') + '?next=' + request.path) upload_limit = Preferences.objects.get(pk=1).max_data_size formfunc = eval(klass.__name__ + 'Form') if request.method == 'POST': form = formfunc(request.POST, request.FILES, request=request) # manual validation coz it's required for new, but not edited Data if not request.FILES and klass == Data: form.errors['file'] = ErrorDict({ '': _('This field is required.') }).as_ul() _validate_file_size(request, form, klass) if form.is_valid(): new = form.save(commit=False) new.pub_date = datetime.datetime.now() try: new.slug = new.make_slug() except IntegrityError: # looks quirky... d = ErrorDict({ '': _('The given name yields an already existing slug. Please try another name.' ) }) form.errors['name'] = d.as_ul() else: new.version = 1 new.is_current = True new.is_public = False new.user = request.user if not form.cleaned_data['keep_private']: new.is_public = True if klass == Data: _upload_data_file(new, request.FILES['file']) new.save() form.save_m2m( ) # it couldn't be done automatically because of commit=False elif klass == Task: new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA taskinfo = { 'train_idx': (form.cleaned_data['train_idx']), 'val_idx': (form.cleaned_data['val_idx']), 'test_idx': (form.cleaned_data['test_idx']), 'input_variables': form.cleaned_data['input_variables'], 'output_variables': form.cleaned_data['output_variables'], 'data_size': form.cleaned_data['data'].num_instances } new.file = None if 'file' in request.FILES: new.file = request.FILES['file'] new.save() new.create_next_file(prev=None) else: new.save(taskinfo=taskinfo) elif klass == Method: #if 'score' in request.FILES: # new.score = request.FILES['score'] # new.score.name = new.get_scorename() new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA new.save() elif klass == Challenge: new.license = FixedLicense.objects.get( pk=1) # fixed to CC-BY-SA new.save() new.task = form.cleaned_data['task'] new.save() else: raise Http404 return HttpResponseRedirect(new.get_absolute_slugurl()) else: if default_arg: form = formfunc(request=request, default_arg=default_arg) else: form = formfunc(request=request) kname = klass.__name__.lower() info_dict = { 'klass': klass.__name__, kname: True, 'uuid': uuid.uuid4(), # for upload progress bar 'url_new': request.path, 'form': form, 'request': request, 'tagcloud': get_tag_clouds(request), 'section': 'repository', 'upload_limit': "%dMB" % (upload_limit / MEGABYTE) } return _response_for(request, klass, 'item_new', info_dict)