Пример #1
0
 def _render_edit_form(self, fs, params={}, clear_session=False):
     # errors arrive in c.error and fs.errors
     c.log_message = params.get('log_message', '')
     # rgrp: expunge everything from session before dealing with
     # validation errors) so we don't have any problematic saves
     # when the fs.render causes a flush.
     # seb: If the session is *expunged*, then the form can't be
     # rendered; I've settled with a rollback for now, which isn't
     # necessarily what's wanted here.
     # dread: I think this only happened with tags because until
     # this changeset, Tag objects were created in the Renderer
     # every time you hit preview. So I don't believe we need to
     # clear the session any more. Just in case I'm leaving it in
     # with the log comments to find out.
     if clear_session:
         # log to see if clearing the session is ever required
         if model.Session.new or model.Session.dirty or model.Session.deleted:
             log.warn('Expunging session changes which were not expected: '
                      '%r %r %r', (model.Session.new, model.Session.dirty,
                                   model.Session.deleted))
         try:
             model.Session.rollback()
         except AttributeError: # older SQLAlchemy versions
             model.Session.clear()
     edit_form_html = fs.render()
     c.form = h.literal(edit_form_html)
     return h.literal(render('package/edit_form.html'))
Пример #2
0
 def _render_edit_form(self, fs, params={}, clear_session=False):
     # errors arrive in c.error and fs.errors
     c.log_message = params.get('log_message', '')
     # rgrp: expunge everything from session before dealing with
     # validation errors) so we don't have any problematic saves
     # when the fs.render causes a flush.
     # seb: If the session is *expunged*, then the form can't be
     # rendered; I've settled with a rollback for now, which isn't
     # necessarily what's wanted here.
     # dread: I think this only happened with tags because until
     # this changeset, Tag objects were created in the Renderer
     # every time you hit preview. So I don't believe we need to
     # clear the session any more. Just in case I'm leaving it in
     # with the log comments to find out.
     if clear_session:
         # log to see if clearing the session is ever required
         if model.Session.new or model.Session.dirty or model.Session.deleted:
             log.warn(
                 'Expunging session changes which were not expected: '
                 '%r %r %r', (model.Session.new, model.Session.dirty,
                              model.Session.deleted))
         try:
             model.Session.rollback()
         except AttributeError:  # older SQLAlchemy versions
             model.Session.clear()
     edit_form_html = fs.render()
     c.form = h.literal(edit_form_html)
     return h.literal(render('package/edit_form.html'))
Пример #3
0
def dgu_linked_user(user, maxlength=16):  # Overwrite h.linked_user
    from ckan import model
    from ckan.lib.base import h
    from ckanext.dgu.plugins_toolkit import c

    if user in [model.PSEUDO_USER__LOGGED_IN, model.PSEUDO_USER__VISITOR]:
        return user
    if not isinstance(user, model.User):
        user_name = unicode(user)
        user = model.User.get(user_name)
    if not user:
        # may be in the format "NHS North Staffordshire (uid 6107 )"
        match = re.match(".*\(uid (\d+)\s?\)", user_name)
        if match:
            drupal_user_id = match.groups()[0]
            user = model.User.get("user_d%s" % drupal_user_id)

    if c.is_an_official:
        # only officials can see the actual user name
        if user:
            publisher = ", ".join([group.title for group in user.get_groups("publisher")])

            display_name = "%s (%s)" % (user.fullname, publisher)
            link_text = truncate(user.fullname or user.name, length=maxlength)
            return h.link_to(link_text, h.url_for(controller="user", action="read", id=user.name))
        else:
            return truncate(user_name, length=maxlength)
    else:
        # joe public just gets a link to the user's publisher(s)
        import ckan.authz

        if user:
            groups = user.get_groups("publisher")
            if groups:
                return h.literal(
                    " ".join(
                        [
                            h.link_to(truncate(group.title, length=maxlength), "/publisher/%s" % group.name)
                            for group in groups
                        ]
                    )
                )
            elif ckan.authz.Authorizer().is_sysadmin(user):
                return "System Administrator"
            else:
                return "Staff"
        else:
            return "Staff"
Пример #4
0
def dgu_linked_user(user, maxlength=16):  # Overwrite h.linked_user
    from ckan import model
    from ckan.lib.base import h
    from ckanext.dgu.plugins_toolkit import c

    if user in [model.PSEUDO_USER__LOGGED_IN, model.PSEUDO_USER__VISITOR]:
        return user
    if not isinstance(user, model.User):
        user_name = unicode(user)
        user = model.User.get(user_name)
    if not user:
        # may be in the format "NHS North Staffordshire (uid 6107 )"
        match = re.match('.*\(uid (\d+)\s?\)', user_name)
        if match:
            drupal_user_id = match.groups()[0]
            user = model.User.get('user_d%s' % drupal_user_id)

    if (c.is_an_official):
        # only officials can see the actual user name
        if user:
            publisher = ', '.join([group.title for group in user.get_groups('publisher')])

            display_name = '%s (%s)' % (user.fullname, publisher)
            link_text = truncate(user.fullname or user.name, length=maxlength)
            return h.link_to(link_text,
                             h.url_for(controller='user', action='read', id=user.name))
        else:
            return truncate(user_name, length=maxlength)
    else:
        # joe public just gets a link to the user's publisher(s)
        import ckan.authz
        if user:
            groups = user.get_groups('publisher')
            if groups:
                return h.literal(' '.join([h.link_to(truncate(group.title, length=maxlength),
                                                     '/publisher/%s' % group.name) \
                                         for group in groups]))
            elif ckan.authz.Authorizer().is_sysadmin(user):
                return 'System Administrator'
            else:
                return 'Staff'
        else:
            return 'Staff'
            data = add_to_package_dict(get_package_dict(fs=fs), request.params)
            fs = fs.bind(model.Package, data=data, session=model.Session)

        else:
            fs = fs.bind(session=model.Session)
        #if 'preview' in request.params:
        #    c.preview = ' '
        c.form = self._render_edit_form(fs, request.params, clear_session=True)
        if 'preview' in request.params:
            c.is_preview = True
            try:
                PackageSaver().render_preview(fs,
                                              log_message=log_message,
                                              author=c.author, client=c)
                c.preview = h.literal(render('package/read_core.html'))
            except ValidationException, error:
                fs = error.args[0]
                c.form = self._render_edit_form(fs, request.params,
                        clear_session=True)
                return render('package/new.html')
        return render('package/new.html')

    def edit(self, id=None): # allow id=None to allow posting
        # TODO: refactor to avoid duplication between here and new
        c.error = ''
        c.pkg = pkg = model.Package.get(id)
        if pkg is None:
            abort(404, '404 Not Found')
        model.Session().autoflush = False
        am_authz = self.authorizer.am_authorized(c, model.Action.EDIT, pkg)
Пример #6
0
            data = add_to_package_dict(get_package_dict(fs=fs), request.params)
            fs = fs.bind(model.Package, data=data, session=model.Session)

        else:
            fs = fs.bind(session=model.Session)
        #if 'preview' in request.params:
        #    c.preview = ' '
        c.form = self._render_edit_form(fs, request.params, clear_session=True)
        if 'preview' in request.params:
            c.is_preview = True
            try:
                PackageSaver().render_preview(fs,
                                              log_message=log_message,
                                              author=c.author,
                                              client=c)
                c.preview = h.literal(render('package/read_core.html'))
            except ValidationException, error:
                fs = error.args[0]
                c.form = self._render_edit_form(fs,
                                                request.params,
                                                clear_session=True)
                return render('package/new.html')
        return render('package/new.html')

    def edit(self, id=None):  # allow id=None to allow posting
        # TODO: refactor to avoid duplication between here and new
        c.error = ''
        c.pkg = pkg = model.Package.get(id)
        if pkg is None:
            abort(404, '404 Not Found')
        model.Session().autoflush = False