def add_json_view(self, request, form_url='', extra_context=None): "The 'add' admin view for this model. Communicating with client in JSON format only." if request.method.upper() != 'POST': msg = _( 'This view is designed for saving data only, thus POST method is required.' ) return HttpResponseForbidden(msg) context = self.get_add_view_context(request, form_url) context.update(extra_context or {}) if 'object_added' in context: obj = context['object'] msg = unicode(list(messages.get_messages(request))[0]) if request.FILES and not request.is_ajax(): return_url = '%s#/%s/%s/' % (reverse('newman:index'), obj._meta.app_label, obj._meta.module_name) if request.POST.get('_continue'): return_url += '%s/' % obj.pk if request.POST.get('_addanother'): return_url += 'add/' return HttpResponseRedirect(return_url) return utils.JsonResponse( msg, { 'id': obj.pk, 'title': getattr(obj, '__unicode__', obj.__str__)(), }) elif 'error_dict' in context: return self.json_error_response(request, context)
def delete_draft_view(self, request, extra_context=None): self.register_newman_variables(request) id = request.GET.get('id', None) if not id: return utils.JsonResponse( _('No id found in GET variable "id".'), status=newman_settings.STATUS_VAR_MISSING) try: draft = AdminUserDraft.objects.get(ct=self.model_content_type, user=request.user, pk=id) except AdminUserDraft.DoesNotExist: return utils.JsonResponse( _('No matching draft found.'), status=newman_settings.STATUS_OBJECT_NOT_FOUND) msg = _('Draft %s was deleted.' % draft.__unicode__()) draft.delete() return utils.JsonResponse(msg)
def load_draft_view(self, request, extra_context=None): """ Returns draft identified by request.GET['id'] variable. """ self.register_newman_variables(request) id = request.GET.get('id', None) if not id: return utils.JsonResponse( _('No id found in GET variable "id".'), status=newman_settings.STATUS_VAR_MISSING) drafts = AdminUserDraft.objects.filter(ct=self.model_content_type, user=request.user, pk=id) if not drafts: return utils.JsonResponse( _('No matching draft found.'), status=newman_settings.STATUS_OBJECT_NOT_FOUND) draft = drafts[0] return utils.JsonResponse(_('Loaded draft "%s"' % draft.__unicode__()), draft.data)
def model_detail_json_view(self, request, object_id, extra_context=None): " Outputs basic object's data. " obj = None try: obj = self.queryset(request).get(pk=unquote(object_id)) except obj.DoesNotExist: obj = None if not self.has_model_view_permission(request, obj): raise PermissionDenied result_dict = dict() for field in obj._meta.fields: result_dict[field.name] = field.value_to_string(obj) return utils.JsonResponse('JSON object detail data.', result_dict, status=newman_settings.STATUS_OK)
def save_draft_view(self, request, extra_context=None): """ Autosave data (dataloss-prevention) or save as (named) template """ def delete_too_old_drafts(): " remove autosaves too old to rock'n'roll " to_delete = AdminUserDraft.objects.filter( title__exact='', user=request.user).order_by('-ts') for draft in to_delete[newman_settings.AUTOSAVE_MAX_AMOUNT:]: log.debug('Deleting too old user draft (autosave) %d' % draft.pk) draft.delete() self.register_newman_variables(request) data = request.POST.get('data', None) if not data: return utils.JsonResponseError( _('No data passed in POST variable "data".'), status=newman_settings.STATUS_VAR_MISSING) title = request.POST.get('title', '') id = request.POST.get('id', None) if id: # modifying existing draft/preset try: obj = AdminUserDraft.objects.get(pk=id) obj.data = data obj.title = title obj.save() except AdminUserDraft.DoesNotExist: obj = AdminUserDraft.objects.create(ct=self.model_content_type, user=request.user, data=data, title=title) else: obj = AdminUserDraft.objects.create(ct=self.model_content_type, user=request.user, data=data, title=title) delete_too_old_drafts() data = {'id': obj.pk, 'title': obj.__unicode__()} return utils.JsonResponse( _('Preset %s was saved.' % obj.__unicode__()), data)
def change_json_view(self, request, object_id, extra_context=None): "The 'change' admin view for this model." if request.method.upper() != 'POST': msg = _( 'This view is designed for saving data only, thus POST method is required.' ) return HttpResponseForbidden(msg) context = self.change_view_prepare_context(request, object_id) if type(context) != dict: obj = self.get_change_view_object(object_id) opts = obj._meta if request.FILES and not request.is_ajax(): return_url = '%s#/%s/%s/' % (reverse('newman:index'), opts.app_label, opts.module_name) if request.POST.get('_continue'): return_url += '%s/' % object_id if request.POST.get('_addanother'): return_url += 'add/' return HttpResponseRedirect(return_url) redir = request.POST.get('http_redirect_to', None) if redir: return utils.JsonResponseRedirect(redir) return utils.JsonResponse( _('The %(name)s "%(obj)s" was changed successfully.') % { 'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj) }, { 'id': obj.pk, 'title': obj.__unicode__(), }, status=newman_settings.STATUS_OK) context.update(extra_context or {}) return self.json_error_response(request, context) # Json response
def json_error_response(self, request, context): """ Chyby v polich formulare Chyba v poli formulare napr.: context['adminform'].form['slug'].errors Chyba v poli inline napr.: context['inline_admin_formsets'][0].formset.errors tj.: [{'content': [u'Toto pole je povinn\xe9.']}] id inline v sablone: id_ + context['inline_admin_formsets'][0].formset.prefix + [poradove cislo formsetu tj. 0 + jmeno sloupce priklad id: id_articlecontents_set-0-content """ fcounter = {} def get_formset_counter(fset): if fset not in fcounter: fcounter[fset] = 0 else: fcounter[fset] += 1 return fcounter[fset] def give_me_unicode(ei): if not hasattr(ei, '__unicode__'): return u'%s' % ei return ei.__unicode__() error_list = [] # Form fields frm = context['adminform'].form for field_name in frm.fields: field = frm[field_name] if field.errors: err_dict = { 'id': u"id_%s" % field_name, 'label': u"%s" % field.label, 'messages': map(lambda item: u'%s' % item, map(give_me_unicode, field.errors)) } error_list.append(err_dict) # Inline Form fields for fset in context['inline_admin_formsets']: for err_item in fset.formset.errors: counter = get_formset_counter(fset.formset.prefix) for key in err_item: label = u'' """ for mfield in fset.formset.model._meta.fields: if mfield.name == key: label = mfield.verbose_name break """ for fkey, mfield in fset.formset.form.base_fields.items(): if fkey == key: if hasattr(mfield.label, '__unicode__'): label = mfield.label.__unicode__() else: label = mfield.label.__str__() break err_dict = { 'id': u'id_%s-%d-%s' % (fset.formset.prefix, counter, key), 'label': u"%s" % label, 'messages': map(lambda item: item, map(give_me_unicode, err_item[key])) } error_list.append(err_dict) # Other errors (e.g. db errors) if 'error_dict' in context and 'id___all__' in context['error_dict']: error_list.append({ 'messages': context['error_dict']['id___all__'], 'id': 'id___all__', }) return utils.JsonResponse(_('Please correct errors in form'), errors=error_list, status=newman_settings.STATUS_FORM_ERROR)