Esempio n. 1
0
    def delete(self, request, dataset_id=None, *args, **kwargs):

        user, profile = user_and_profile(request)

        dataset = get_object_or_404_extended(Dataset,
                                             user,
                                             include={'id': dataset_id})

        id = request.POST.get('id', request.GET.get('id'))
        if not id:
            raise Http404
        include = {'id': id, 'dataset': dataset}
        resource = get_object_or_404_extended(Resource, user, include=include)

        try:
            resource.delete(current_user=user)
        except Exception as e:
            status = 500
            message = e.__str__()
            messages.error(request, message)
        else:
            status = 200
            message = 'La ressource a été supprimée avec succès.'
            messages.success(request, message)
            send_resource_delete_mail(user, resource)

        return HttpResponse(status=status)
Esempio n. 2
0
    def get(self, request, dataset_id=None, *args, **kwargs):

        user, profile = user_and_profile(request)

        dataset = get_object_or_404_extended(Dataset,
                                             user,
                                             include={'id': dataset_id})

        # Redirect to layer
        _resource = request.GET.get('resource')
        _layer = request.GET.get('layer')
        if _resource and _layer:
            return redirect(
                reverse('idgo_admin:layer_editor',
                        kwargs={
                            'dataset_id': dataset.id,
                            'resource_id': _resource,
                            'layer_id': _layer
                        }))

        resource = None
        id = request.GET.get('id')
        if id:
            include = {'id': id, 'dataset_id': dataset.id}
            resource = get_object_or_404_extended(Resource,
                                                  user,
                                                  include=include)

        form = Form(instance=resource, user=user)
        context = self.get_context(form, user, dataset, resource=resource)

        return render_with_info_profile(request, self.template, context)
Esempio n. 3
0
    def delete(self, request, id, *args, **kwargs):

        if id == 'new':
            raise Http404()

        user, profile = user_and_profile(request)

        if not LiaisonsContributeurs.objects.filter(
                profile=profile, validated_on__isnull=False).exists():
            raise Http404()

        dataset = get_object_or_404_extended(Dataset, user, include={'id': id})

        try:
            dataset.delete(current_user=user)
        except Exception as e:
            status = 500
            message = e.__str__()
            messages.error(request, message)
        else:
            status = 200
            message = 'Le jeu de données a été supprimé avec succès.'
            messages.success(request, message)

            send_dataset_delete_mail(user, dataset)

        return HttpResponse(status=status)
Esempio n. 4
0
    def get(self, request, id, *args, **kwargs):
        user = request.user

        if not LiaisonsContributeurs.objects.filter(
                profile=user.profile, validated_on__isnull=False).exists():
            raise Http404()

        if id != 'new':
            instance = get_object_or_404_extended(Dataset,
                                                  user,
                                                  include={'id': id})
        else:
            instance = None
            id = None

        include = {
            'user': user,
            'id': id,
            'identification': id and True or False,
        }
        form = Form(instance=instance, include=include)
        context = self.get_context(form, user, instance)

        return render(request,
                      'idgo_admin/dataset/dataset.html',
                      context=context)
Esempio n. 5
0
    def get(self, request, *args, **kwargs):

        user, profile = user_and_profile(request)

        dataset_id = request.GET.get('id', None)
        publish = request.GET.get('publish', None)

        if dataset_id and publish.lower() == 'toggle':
            dataset = get_object_or_404_extended(Dataset,
                                                 user,
                                                 include={'id': dataset_id})

            dataset.published = not dataset.published

            current_user = (user == dataset.editor) and user or None
            dataset.save(current_user=current_user)

            message = ('Le jeu de données <strong>{0}</strong> '
                       'est maintenant en accès <strong>{1}</strong>.').format(
                           dataset.title, dataset.published and 'public'
                           or 'privé')
            status = 200

        return render(request,
                      'idgo_admin/response.html',
                      context={'message': message},
                      status=status)
Esempio n. 6
0
    def post(self, request, id, *args, **kwargs):

        user, profile = user_and_profile(request)

        if not LiaisonsContributeurs.objects.filter(
                profile=profile, validated_on__isnull=False).exists():
            raise Http404()

        if id != 'new':
            instance = get_object_or_404_extended(Dataset, user, include={'id': id})
        else:
            instance = None
            id = None

        include = {
            'user': user,
            'id': id,
            'identification': id and True or False,
            }
        form = Form(request.POST, request.FILES, instance=instance, include=include)
        context = self.get_context(form, user, instance)

        if not form.is_valid():
            errors = form._errors.get('__all__', [])
            errors and messages.error(request, ' '.join(errors))
            return render_with_info_profile(
                request, 'idgo_admin/dataset/dataset.html', context)

        data = form.cleaned_data
        kvp = {
            'broadcaster_name': data['broadcaster_name'],
            'broadcaster_email': data['broadcaster_email'],
            'slug': data['slug'],
            'date_creation': data['date_creation'],
            'date_modification': data['date_modification'],
            'date_publication': data['date_publication'],
            'description': data['description'],
            'geocover': data['geocover'],
            'granularity': data['granularity'],
            'license': data['license'],
            'title': data['title'],
            'organisation': data['organisation'],
            'owner_email': data['owner_email'],
            'owner_name': data['owner_name'],
            'update_frequency': data['update_frequency'],
            'published': data['published'],
            'support': data['support'],
            'thumbnail': data['thumbnail'],
            }

        try:
            with transaction.atomic():
                if id:
                    instance = Dataset.objects.get(pk=id)
                    for k, v in kvp.items():
                        setattr(instance, k, v)
                else:
                    kvp['editor'] = user
                    save_opts = {'current_user': user, 'synchronize': False}
                    instance = Dataset.default.create(save_opts=save_opts, **kvp)

                instance.categories.set(data.get('categories', []), clear=True)
                keywords = data.get('keywords')
                if keywords:
                    instance.keywords.clear()
                    for k in keywords:
                        instance.keywords.add(k)
                instance.data_type.set(data.get('data_type', []), clear=True)
                instance.save(current_user=user, synchronize=True)

        except ValidationError as e:
            messages.error(request, ' '.join(e))
        except CkanBaseError as e:
            form.add_error('__all__', e.__str__())
            messages.error(request, e.__str__())
        else:
            if id:
                send_dataset_update_mail(user, instance)
            else:
                send_dataset_creation_mail(user, instance)

            if id:
                messages.success(request, 'Le jeu de données a été mis à jour avec succès.')
            else:
                messages.success(request, (
                    'Le jeu de données a été créé avec succès. Souhaitez-vous '
                    '<a href="{0}">créer un nouveau jeu de données</a> ? ou '
                    '<a href="{1}">ajouter une ressource</a> ? ou bien '
                    '<a href="{2}/dataset/{3}" target="_blank">voir le jeu '
                    'de données dans CKAN</a> ?').format(
                        reverse('idgo_admin:dataset_editor', kwargs={'id': 'new'}),
                        reverse('idgo_admin:resource', kwargs={'dataset_id': instance.id}),
                        CKAN_URL, instance.slug))

            if 'continue' in request.POST:
                return HttpResponseRedirect(
                    reverse('idgo_admin:dataset_editor', kwargs={'id': instance.id}))

            target = instance.editor == profile.user and 'my' or 'all'
            url = reverse('idgo_admin:list_{target}_datasets'.format(target=target))
            return HttpResponseRedirect('{url}#{hash}'.format(url=url, hash=instance.slug))

        return render_with_info_profile(request, 'idgo_admin/dataset/dataset.html', context)
Esempio n. 7
0
def handle_pust_request(request, dataset_name, resource_id=None):
    # title -> name
    # description -> description
    # language -> lang
    # format -> format_type.pk
    # type -> data_type raw|annexe|service
    # restricted_level -> public|registered|only_allowed_users|same_organization|any_organization
    # restricted_list -> list of: user.username|organisation.slug
    # up_file -> {File}
    user = request.user
    dataset = get_object_or_404_extended(
        Dataset, user, include={'slug': dataset_name})
    resource = None
    if resource_id:
        resource = get_object_or_404(Resource, ckan_id=resource_id)

    query_data = getattr(request, request.method)  # QueryDict

    # `title` est obligatoire
    title = query_data.pop('title', resource and [resource.title])
    if title:
        query_data.__setitem__('title', title[-1])

    # `lang` est obligatoire
    lang = query_data.pop('language', query_data.pop('lang', resource and [resource.lang]))
    if lang:
        query_data.__setitem__('lang', lang[-1])

    # `data_type` est obligatoire
    data_type = query_data.pop('data_type', query_data.pop('type', resource and [resource.data_type]))
    if data_type:
        query_data.__setitem__('data_type', data_type[-1])

    restricted_list = query_data.pop('restricted_list', [])
    profiles_allowed = None
    organisations_allowed = None

    restricted_level = query_data.pop('restricted_level', resource and [resource.restricted_level] or ['public'])
    if restricted_level[-1] == 'only_allowed_users':
        profiles_allowed = User.objects.filter(username__in=restricted_list)
        query_data.__setitem__('profiles_allowed', [instance.pk for instance in profiles_allowed])
    elif restricted_level[-1] in ('same_organization', 'any_organization'):
        organisations_allowed = Organisation.objects.filter(slug__in=restricted_list)
        query_data.__setitem__('organisations_allowed', [instance.pk for instance in organisations_allowed])
    query_data.__setitem__('restricted_level', restricted_level[-1])

    format_type_slug = query_data.pop('format_type', query_data.pop('format', None))
    if format_type_slug:
        try:
            resource_format = ResourceFormats.objects.get(slug=format_type_slug[-1])
        except ResourceFormats.DoesNotExist as e:
            raise GenericException(details=e.__str__())
        query_data.__setitem__('format_type', resource_format.pk)

    form = Form(query_data, request.FILES, instance=resource, dataset=dataset, user=user)
    if not form.is_valid():
        raise GenericException(details=form._errors)

    data = form.cleaned_data
    kvp = {
        'dataset': dataset,
        'title': data['title'],
        'description': data['description'],
        'lang': data['lang'],
        'data_type': data['data_type'],
        'format_type': data['format_type'],
        # 'last_update': data['last_update'],
        'restricted_level': data['restricted_level'],
        'up_file': data['up_file'],
        'dl_url': data['dl_url'],
        # 'synchronisation': data['synchronisation'],
        # 'sync_frequency': data['sync_frequency'],
        'referenced_url': data['referenced_url'],
        # 'ftp_file': data['ftp_file'],
        'crs': data['crs'],
        'encoding': data.get('encoding') or None,
        'extractable': data['extractable'],
        'ogc_services': data['ogc_services'],
        'geo_restriction': data['geo_restriction'],
        }

    profiles_allowed = None
    organisations_allowed = None
    if data['restricted_level'] == 'only_allowed_users':
        profiles_allowed = data['profiles_allowed']
    if data['restricted_level'] == 'same_organization':
        organisations_allowed = [form._dataset.organisation]
    if data['restricted_level'] == 'any_organization':
        organisations_allowed = data['organisations_allowed']

    memory_up_file = request.FILES.get('up_file')
    file_extras = memory_up_file and {
        'mimetype': memory_up_file.content_type,
        'resource_type': memory_up_file.name,
        'size': memory_up_file.size} or None

    try:
        with transaction.atomic():
            save_opts = {
                'current_user': user,
                'file_extras': file_extras,
                'synchronize': True}
            if resource:
                for k, v in kvp.items():
                    setattr(resource, k, v)
            else:
                resource = Resource.default.create(save_opts=save_opts, **kvp)
            if organisations_allowed:
                resource.organisations_allowed = organisations_allowed
            if profiles_allowed:
                resource.profiles_allowed = profiles_allowed
                save_opts['synchronize'] = True
                save_opts['file_extras'] = None  # IMPORTANT
            resource.save(**save_opts)
    except ValidationError as e:
        if e.code == 'crs':
            form.add_error(e.code, '')
            form.add_error('__all__', e.message)
        elif e.code == 'encoding':
            form.add_error(e.code, '')
            form.add_error('__all__', e.message)
        else:
            form.add_error(e.code, e.message)
    except CkanBaseError as e:
        form.add_error('__all__', e.__str__())
    else:
        if resource_id:
            send_resource_update_mail(user, resource)
        else:
            send_resource_creation_mail(user, resource)
        return resource
    raise GenericException(details=form._errors)
Esempio n. 8
0
    def post(self, request, dataset_id=None, *args, **kwargs):

        # Vider systèmatiquement les messages
        storage = messages.get_messages(request)
        storage.used = True

        user, profile = user_and_profile(request)

        dataset = get_object_or_404_extended(Dataset,
                                             user,
                                             include={'id': dataset_id})

        resource = None
        id = request.POST.get('id', request.GET.get('id'))
        if id:
            include = {'id': id, 'dataset': dataset}
            resource = get_object_or_404_extended(Resource,
                                                  user,
                                                  include=include)

        form = Form(request.POST,
                    request.FILES,
                    instance=resource,
                    dataset=dataset,
                    user=user)

        context = self.get_context(form, user, dataset, resource)

        ajax = 'ajax' in request.POST
        save_and_continue = 'continue' in request.POST

        if not form.is_valid():
            if ajax:
                error = dict([(k, [str(m) for m in v])
                              for k, v in form.errors.items()])
                msg = 'Veuillez corriger le formulaire.'
                if '__all__' in error:
                    error['__all__'].prepend(msg)
                else:
                    error['__all__'] = [msg]
                return JsonResponse(json.dumps({'error': error}), safe=False)
            return render_with_info_profile(request, self.template, context)

        data = form.cleaned_data

        kvp = {
            'dataset':
            dataset,
            'title':
            data['title'],
            'description':
            data['description'],
            'lang':
            data['lang'],
            'data_type':
            data['data_type'],
            'format_type':
            data['format_type'],
            'last_update':
            data['last_update'],
            'restricted_level':
            data['restricted_level'],
            'up_file':
            data['up_file'],
            'dl_url':
            data['dl_url'],
            'synchronisation':
            data['synchronisation'],
            'sync_frequency':
            data['sync_frequency'],
            'referenced_url':
            data['referenced_url'],
            'ftp_file':
            data['ftp_file']
            and os.path.join(FTP_DIR, user.username, data['ftp_file']) or None,
            'crs':
            data['crs'],
            'encoding':
            data.get('encoding') or None,
            'extractable':
            data['extractable'],
            'ogc_services':
            data['ogc_services'],
            'geo_restriction':
            data['geo_restriction'],
        }

        profiles_allowed = None
        organisations_allowed = None
        if data['restricted_level'] == 'only_allowed_users':
            profiles_allowed = data['profiles_allowed']
        elif data['restricted_level'] == 'same_organization':
            organisations_allowed = [form._dataset.organisation]
        elif data['restricted_level'] == 'any_organization':
            organisations_allowed = data['organisations_allowed']

        memory_up_file = request.FILES.get('up_file')
        file_extras = memory_up_file and {
            'mimetype': memory_up_file.content_type,
            'resource_type': memory_up_file.name,
            'size': memory_up_file.size
        } or None

        try:
            with transaction.atomic():
                save_opts = {
                    'current_user': user,
                    'file_extras': file_extras,
                    'synchronize': True
                }
                if not id:
                    resource = Resource.default.create(save_opts=save_opts,
                                                       **kvp)
                else:
                    resource = Resource.objects.get(pk=id)
                    for k, v in kvp.items():
                        setattr(resource, k, v)
                if organisations_allowed:
                    resource.organisations_allowed = organisations_allowed
                if profiles_allowed:
                    resource.profiles_allowed = profiles_allowed
                save_opts['synchronize'] = True
                save_opts['file_extras'] = None  # IMPORTANT
                resource.save(**save_opts)
        except ValidationError as e:
            if e.code == 'crs':
                form.add_error(e.code, '')
                form.add_error('__all__', e.message)
            elif e.code == 'encoding':
                form.add_error(e.code, '')
                form.add_error('__all__', e.message)
            else:
                form.add_error(e.code, e.message)
            messages.error(request, ' '.join(e))
            error = dict([(k, [str(m) for m in v])
                          for k, v in form.errors.items()])
        except CkanBaseError as e:
            error = {'__all__': [e.__str__()]}
            form.add_error('__all__', e.__str__())
            messages.error(request, e.__str__())
        else:
            if id:
                send_resource_update_mail(user, resource)
            else:
                send_resource_creation_mail(user, resource)

            dataset_href = reverse(self.namespace,
                                   kwargs={'dataset_id': dataset_id})
            messages.success(
                request,
                ('La ressource a été {0} avec succès. Souhaitez-vous '
                 '<a href="{1}">ajouter une nouvelle ressource</a> ? ou bien '
                 '<a href="{2}/dataset/{3}/resource/{4}" target="_blank">'
                 'voir la ressource dans CKAN</a> ?').format(
                     id and 'mise à jour' or 'créée', dataset_href, CKAN_URL,
                     dataset.slug, resource.ckan_id))

            if ajax:
                response = HttpResponse(status=201)  # Ugly hack
                if save_and_continue:
                    href = '{0}?id={1}'.format(dataset_href, resource.id)
                else:
                    href = '{0}?id={1}#resources/{2}'.format(
                        reverse('idgo_admin:dataset'), dataset_id, resource.id)
                response['Content-Location'] = href
                return response
            else:
                if save_and_continue:
                    url = '{0}?id={1}'.format(dataset_href, resource.id)
                    return HttpResponseRedirect(url)
                # else:
                url = '{0}?id={1}#resources/{2}'.format(
                    reverse('idgo_admin:dataset'), dataset_id, resource.id)
                return HttpResponseRedirect(url)

        if ajax:
            form._errors = None
            return JsonResponse(json.dumps({'error': error}), safe=False)
        return render_with_info_profile(request, self.template, context)
Esempio n. 9
0
def handle_pust_request(request, dataset_name, resource_id=None):
    # title -> name
    # description -> description
    # language -> lang
    # format -> format_type.pk
    # type -> data_type raw|annexe|service
    # restricted_level -> public|registered|only_allowed_users|same_organization|any_organization
    # restricted_list -> list of: user.username|organisation.slug
    # up_file -> {File}
    user = request.user
    dataset = get_object_or_404_extended(Dataset,
                                         user,
                                         include={'slug': dataset_name})
    resource = None
    if resource_id:
        resource = get_object_or_404(Resource, ckan_id=resource_id)

    # TODO: Vérifier les droits

    data = getattr(request, request.method).dict()

    restricted_list = data.get('restricted_list', [])
    profiles_allowed = None
    organisations_allowed = None

    restricted_level = data.get('restricted_level')
    if restricted_level == 'only_allowed_users':
        profiles_allowed = User.objects.filter(username__in=restricted_list)
    elif restricted_level in ('same_organization', 'any_organization'):
        organisations_allowed = Organisation.objects.filter(
            slug__in=restricted_list)

    data_form = {
        'title': data.get('title'),
        'description': data.get('description'),
        'lang': data.get('language', 'french'),
        'format_type': data.get('format'),
        'data_type': data.get('type'),
        'restricted_level': restricted_level,
        'profiles_allowed': profiles_allowed,
        'organisations_allowed': organisations_allowed,
        # 'up_file': '',
        # 'dl_url': '',
        # 'synchronisation': '',
        # 'sync_frequency': '',
        # 'referenced_url': '',
        # 'ftp_file': '',
        'crs': data.get('crs', None),
        'encoding': data.get('encoding', None),
        # 'extractable': data.get('extractable'),
        # 'ogc_services': data.get('ogc_services'),
        # 'geo_restriction': data.get('geo_restriction'),
        # 'last_update': data.get('last_update'),
    }

    form = Form(data_form,
                request.FILES,
                instance=resource,
                dataset=dataset,
                user=user)
    if not form.is_valid():
        raise GenericException(details=form._errors)

    data = form.cleaned_data
    kvp = {
        'dataset': dataset,
        'title': data['title'],
        'description': data['description'],
        'lang': data['lang'],
        'data_type': data['data_type'],
        'format_type': data['format_type'],
        'last_update': data['last_update'],
        'restricted_level': data['restricted_level'],
        'up_file': data['up_file'],
        # 'dl_url': data['dl_url'],
        # 'synchronisation': data['synchronisation'],
        # 'sync_frequency': data['sync_frequency'],
        # 'referenced_url': data['referenced_url'],
        # 'ftp_file': data['ftp_file'],
        'crs': data['crs'],
        'encoding': data.get('encoding') or None,
        'extractable': data['extractable'],
        'ogc_services': data['ogc_services'],
        'geo_restriction': data['geo_restriction'],
    }

    profiles_allowed = None
    organisations_allowed = None
    if data['restricted_level'] == 'only_allowed_users':
        profiles_allowed = data['profiles_allowed']
    if data['restricted_level'] == 'same_organization':
        organisations_allowed = [form._dataset.organisation]
    if data['restricted_level'] == 'any_organization':
        organisations_allowed = data['organisations_allowed']

    memory_up_file = request.FILES.get('up_file')
    file_extras = memory_up_file and {
        'mimetype': memory_up_file.content_type,
        'resource_type': memory_up_file.name,
        'size': memory_up_file.size
    } or None

    try:
        with transaction.atomic():
            save_opts = {
                'current_user': user,
                'file_extras': file_extras,
                'synchronize': True
            }
            if not id:
                resource = Resource.default.create(save_opts=save_opts, **kvp)
            else:
                resource = Resource.objects.get(pk=id)
                for k, v in kvp.items():
                    setattr(resource, k, v)
            if organisations_allowed:
                resource.organisations_allowed = organisations_allowed
            if profiles_allowed:
                resource.profiles_allowed = profiles_allowed
                save_opts['synchronize'] = True
                save_opts['file_extras'] = None  # IMPORTANT
                resource.save(**save_opts)
    except ValidationError as e:
        if e.code == 'crs':
            form.add_error(e.code, '')
            form.add_error('__all__', e.message)
        elif e.code == 'encoding':
            form.add_error(e.code, '')
            form.add_error('__all__', e.message)
        else:
            form.add_error(e.code, e.message)
    except CkanBaseError as e:
        form.add_error('__all__', e.__str__())
    else:
        if resource_id:
            send_resource_update_mail(user, resource)
        else:
            send_resource_creation_mail(user, resource)
        return resource
    raise GenericException(details=form._errors)
Esempio n. 10
0
    def get(self, request, dataset_id=None, *args, **kwargs):
        user, profile = user_and_profile(request)
        dataset = get_object_or_404_extended(Dataset, user, include={'id': dataset_id})

        context = {
            'dataset': dataset,
        }

        return render_with_info_profile(request, 'resource/new.html', context)


# @method_decorator(decorators, name='dispatch')
# class ResourceManager(View):
#     template = 'resource/resource.html'
#
#     def get_context(self, form, user, dataset, resource=None):
#         return {
#             'target': datasets_target(dataset, user),
#             'dataset': dataset,
#             'resource': resource,
#             'form': form,
#             }
#
#     def resource_router(self, dataset_id, app, instance_id=None, action='create'):
#         from django.apps import apps
#         from django.urls.exceptions import NoReverseMatch
#         if apps.is_installed(app):
#             url_pattern = "{0}:resource-{0}-{1}".format(app, action)
#             kvp = {'dataset_id': dataset_id}
#             if action == 'update':
#                 kvp['pk'] = instance_id
#             return reverse(url_pattern, kwargs=kvp)
#         else:
#             raise NoReverseMatch
#
#     @ExceptionsHandler(actions={ProfileHttp404: on_profile_http404})
#     def get(self, request, dataset_id=None, *args, **kwargs):
#
#         user, profile = user_and_profile(request)
#
#         dataset = get_object_or_404_extended(
#             Dataset, user, include={'id': dataset_id})
#         # redirect to resource children app:
#         app = request.POST.get('app', request.GET.get('app'))
#         if app:
#             return redirect(self.resource_router(dataset_id, app, action='create'))
#         # Redirect to layer
#         # _resource = request.GET.get('resource')
#         # _layer = request.GET.get('layer')
#         # if _resource and _layer:
#         #     return redirect(
#         #         reverse('idgo_admin:layer_editor', kwargs={
#         #             'dataset_id': dataset.id,
#         #             'resource_id': _resource,
#         #             'layer_id': _layer}))
#         #
#         # resource = None
#         # id = request.GET.get('id')
#         # if id:
#         #     include = {'id': id, 'dataset_id': dataset.id}
#         #     resource = get_object_or_404_extended(Resource, user, include=include)
#
#         # form = Form(instance=resource)
#         context = self.get_context(None, user, dataset, resource=resource)
#         return render_with_info_profile(request, self.template, context)
#
#     @ExceptionsHandler(ignore=[Http404], actions={ProfileHttp404: on_profile_http404})
#     @transaction.atomic
#     def post(self, request, dataset_id=None, *args, **kwargs):
#         user, profile = user_and_profile(request)
#         dataset = get_object_or_404_extended(
#             Dataset, user, include={'id': dataset_id})
#         form = Form(request.POST, request.FILES)
#         if form.is_valid():
#
#             try:
#                 resource = form.save()
#             except Exception:
#                 logger.excption('ResourceManager:post')
#             else:
#                 app = request.POST.get('app')
#                 return redirect(self.resource_router(dataset_id, app, action='create'))
#
#         context = self.get_context(form, user, dataset, resource)
#         return render_with_info_profile(request, self.template, context)


# @login_required(login_url=settings.LOGIN_URL)
# @csrf_exempt
# def resource(request, dataset_id=None, *args, **kwargs):
#     user, profile = user_and_profile(request)
#
#     id = request.GET.get('id', request.GET.get('ckan_id'))
#     if not id:
#         raise Http404()
#
#     kvp = {}
#     try:
#         id = int(id)
#     except ValueError:
#         kvp['ckan_id'] = id
#     else:
#         kvp['id'] = id
#     finally:
#         resource = get_object_or_404(Resource, **kvp)
#
#     # TODO:
#     # return redirect(reverse('idgo_admin:resource_editor', kwargs={
#     #     'dataset_id': resource.dataset.id, 'resource_id': resource.id}))
#     return redirect(
#         '{}?id={}'.format(
#             reverse(
#                 'resource:resource', kwargs={'dataset_id': resource.dataset.id}),
#             resource.id))