Beispiel #1
0
    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)
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    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
Beispiel #7
0
    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)