def results(qid, p, of, so, rm):
    """
    Generates results for cached query using POSTed filter.

    @param qid: query indentifier
    """
    try:
        recIDsHitSet = get_current_user_records_that_can_be_displayed(qid)
    except KeyError:
        return 'KeyError'
    except:
        return _('Please reload the page')

    try:
        filter_data = json.loads(request.values.get('filter', '[]'))
    except:
        return _('Invalid filter data')

    @check_collection(name_getter=functools.partial(
        get_collection_name_from_cache, qid))
    def make_results(collection):
        recids = faceted_results_filter(recIDsHitSet, filter_data,
                                        FACETS.elements)
        recids = sort_and_rank_records(recids, so=so, rm=rm, p=p)

        return response_formated_records(
            recids,
            collection,
            of,
            create_nearest_terms_box=_create_neareset_term_box)

    return make_results()
 def do_login_first(error=401):
     """Displays login page when user is not authorised."""
     if request.is_xhr:
         return _("Authorization failure"), 401
     flash(_("Authorization failure"), 'error')
     from invenio.webaccount_blueprint import login
     return login(referer=request.url), 401
Beispiel #3
0
def add_comment(recid):
    uid = current_user.get_id()
    in_reply = request.args.get('in_reply', type=int)
    if in_reply is not None:
        comment = CmtRECORDCOMMENT.query.get(in_reply)

        if comment.id_bibrec != recid or comment.is_deleted:
            abort(401)

        if comment is not None:
            c = CmtRECORDCOMMENT()
            c.title = _('Re: ') + comment.title
            c.body = email_quote_txt(comment.body or '')
            c.in_reply_to_id_cmtRECORDCOMMENT = in_reply
            form = AddCmtRECORDCOMMENTForm(request.form, obj=c)
            return render_template('webcomment_add.html', form=form)

    form = AddCmtRECORDCOMMENTForm(request.values)
    if form.validate_on_submit():
        c = CmtRECORDCOMMENT()
        form.populate_obj(c)
        c.id_bibrec = recid
        c.id_user = uid
        c.date_creation = datetime.now()
        c.star_score = 0
        try:
            db.session.add(c)
            db.session.commit()
            flash(_('Comment was sent'), "info")
            return redirect(url_for('webcomment.comments', recid=recid))
        except:
            db.session.rollback()

    return render_template('webcomment_add.html', form=form)
Beispiel #4
0
def edit(name):
    if name not in _USER_SETTINGS:
        flash(_('Invalid plugin name'), 'error')
        return redirect(url_for('.index'))

    plugin = _USER_SETTINGS[name]()
    form = None

    if request.method == 'POST':
        if plugin.form_builder:
            form = plugin.form_builder(request.form)

        if not form or form.validate():
            if form:
                # use the form to interpret data
                settings_data = form.data
            else:
                # no form provided, save the POST request values
                settings_data = flatten_multidict(request.values)

            plugin.store(settings_data)
            plugin.save()
            flash(_('Data has been saved.'), 'success')
            return redirect(url_for('.index'))

        flash(_('Please, corrent errors.'), 'error')

    # get post data or load data from settings
    if not form and plugin.form_builder:
        form = plugin.build_form()

    return render_template(getattr(plugin, 'edit_template', '')
                           or 'webaccount_edit.html',
                           plugin=plugin,
                           form=form)
def edit(name):
    if name not in _USER_SETTINGS:
        flash(_('Invalid plugin name'), 'error')
        return redirect(url_for('.index'))

    plugin = _USER_SETTINGS[name]()
    form = None

    if request.method == 'POST':
        if plugin.form_builder:
            form = plugin.form_builder(request.form)

        if not form or form.validate():
            if form:
                # use the form to interpret data
                settings_data = form.data
            else:
                # no form provided, save the POST request values
                settings_data = flatten_multidict(request.values)

            plugin.store(settings_data)
            plugin.save()
            flash(_('Data has been saved.'), 'success')
            return redirect(url_for('.index'))

        flash(_('Please, corrent errors.'), 'error')

    # get post data or load data from settings
    if not form and plugin.form_builder:
        form = plugin.build_form()

    return render_template(getattr(plugin, 'edit_template', '') or
                           'webaccount_edit.html', plugin=plugin, form=form)
def edit(name):
    if name not in _USER_SETTINGS:
        flash(_('Invalid plugin name'), 'error')
        return redirect(url_for('.index'))

    plugin = _USER_SETTINGS[name]()
    form = None

    if request.method == 'POST':
        if plugin.form_builder:
            form = plugin.form_builder(request.form)

        if not form or form.validate():
            plugin.store(request.form)
            plugin.save()
            flash(_('Data has been saved.'), 'success')
            return redirect(url_for('.index'))

        flash(_('Please, corrent errors.'), 'error')

    # get post data or load data from settings
    if not form and plugin.form_builder:
        form = plugin.form_builder(MultiDict(plugin.load()))

    return render_template(getattr(plugin, 'edit_template', '')
                           or 'webaccount_edit.html',
                           plugin=plugin,
                           form=form)
def login(nickname=None,
          password=None,
          login_method=None,
          action='',
          remember_me=False,
          referer=None):

    if CFG_ACCESS_CONTROL_LEVEL_SITE > 0:
        return abort(401)  # page is not authorized

    if action:
        try:
            action, arguments = mail_cookie_check_authorize_action(action)
        except InvenioWebAccessMailCookieError:
            pass
    form = LoginForm(CombinedMultiDict([
        ImmutableMultiDict({'referer': referer} if referer else {}),
        request.values
    ]),
                     csrf_enabled=False)
    try:
        user = None
        if not CFG_EXTERNAL_AUTH_USING_SSO:
            if login_method is 'Local':
                if form.validate_on_submit():
                    user = update_login(nickname, password, remember_me)
            elif login_method in ['openid', 'oauth1', 'oauth2']:
                pass
                req = request.get_legacy_request()
                (iden, nickname, password,
                 msgcode) = webuser.loginUser(req, nickname, password,
                                              login_method)
                if iden:
                    user = update_login(nickname)
            else:
                flash(_('Invalid login method.'), 'error')

        else:
            req = request.get_legacy_request()
            # Fake parameters for p_un & p_pw because SSO takes them from the environment
            (iden, nickname, password,
             msgcode) = webuser.loginUser(req, '', '',
                                          CFG_EXTERNAL_AUTH_USING_SSO)
            if iden:
                user = update_login(nickname)

        if user:
            flash(_("You are logged in as %s.") % user.nickname, "info")
            if referer is not None:
                # Change HTTP method to https if needed.
                referer = referer.replace(CFG_SITE_URL, CFG_SITE_SECURE_URL)
                return redirect(referer)
    except:
        flash(_("Problem with login."), "error")

    current_app.config.update(
        dict((k, v) for k, v in vars(websession_config).iteritems()
             if "CFG_" == k[:4]))

    return render_template('webaccount_login.html', form=form)
Beispiel #8
0
class RegisterForm(Form):
    """
    User registration form
    """
    email = TextField(_("Email address"),
                      validators=[Required(message=_("Email not provided"))],
                      description=_("Example") + ": [email protected]")
    nickname = TextField(
        _("Nickname"),
        validators=[Required(message=_("Nickname not provided"))],
        description=_("Example") + ": johnd")
    password = PasswordField(
        _("Password"),
        description=_(
            "The password phrase may contain punctuation, spaces, etc."))
    password2 = PasswordField(_("Confirm password"), )
    referer = HiddenField()
    action = HiddenField(default='login')
    submit = SubmitField(_("Register"))

    def validate_nickname(self, field):
        if nickname_valid_p(field.data) != 1:
            raise validators.ValidationError(
                _("Desired nickname %s is invalid.") % field.data)

        # is nickname already taken?
        try:
            User.query.filter(User.nickname == field.data).one()
            raise validators.ValidationError(
                _("Desired nickname %s already exists in the database.") %
                field.data)
        except SQLAlchemyError:
            pass

    def validate_email(self, field):
        field.data = field.data.lower()
        if email_valid_p(field.data.lower()) != 1:
            raise validators.ValidationError(
                _("Supplied email address %s is invalid.") % field.data)

        # is email already taken?
        try:
            User.query.filter(User.email == field.data).one()
            raise validators.ValidationError(
                _("Supplied email address %s already exists in the database.")
                % field.data)
        except SQLAlchemyError:
            pass

    def validate_password(self, field):
        CFG_ACCOUNT_MIN_PASSWORD_LENGTH = 6
        if len(field.data) < CFG_ACCOUNT_MIN_PASSWORD_LENGTH:
            raise validators.ValidationError(
                _("Password must be at least %d characters long." %
                  (CFG_ACCOUNT_MIN_PASSWORD_LENGTH, )))

    def validate_password2(self, field):
        if field.data != self.password.data:
            raise validators.ValidationError(_("Both passwords must match."))
Beispiel #9
0
def check_for_software_updates(flash_message=False):
    """Check for a new release of Invenio.

    @return: True if you have latest version, else False if you need to upgrade,
             or None if server was not reachable.
    """
    from invenio.config import CFG_VERSION
    from invenio.webinterface_handler_flask_utils import _
    try:
        find = re.compile('Invenio v[0-9]+.[0-9]+.[0-9]+(\-rc[0-9])?'
                          ' is released')

        webFile = urllib.urlopen("http://invenio-software.org/repo"
                                 "/invenio/tree/RELEASE-NOTES")

        temp = ""
        version = ""
        version1 = ""
        while 1:
            temp = webFile.readline()
            match1 = find.match(temp)
            try:
                version = match1.group()
                break
            except:
                pass
            if not temp:
                break

        webFile.close()
        submatch = re.compile('[0-9]+.[0-9]+.[0-9]+(\-rc[0-9])?')
        version1 = submatch.search(version)
        web_version = version1.group().split(".")

        local_version = CFG_VERSION.split(".")

        if (web_version[0] > local_version[0]
                or web_version[0] == local_version[0]
                and web_version[1] > local_version[1]
                or web_version[0] == local_version[0] and web_version[1]
                == local_version[1] and web_version[2] > local_version[2]):
            if flash_message:
                flash(
                    _('A newer version of Invenio is available for '
                      'download. You may want to visit %s') %
                    ('<a href=\"http://invenio-software.org/wiki'
                     '/Installation/Download\">http://invenio-software.org'
                     '/wiki/Installation/Download</a>'), 'warning')

            return False
    except Exception as e:
        print e
        if flash_message:
            flash(
                _('Cannot download or parse release notes from http://'
                  'invenio-software.org/repo/invenio/tree/RELEASE-NOTES'),
                'error')
        return None
    return True
class WebSearchUserSettingsForm(InvenioBaseForm):
    rg = SelectField(_('Results per page'),
                     choices=[('10', '10'), ('25', '25'), ('50', '50'),
                              ('100', '100')])
    websearch_hotkeys = SelectField(_('Hotkeys'),
                                    choices=[('0', _('Disable')),
                                             ('1', _('Enable'))])

    c = SelectMultipleField(_('Collections'), choices=GetCollections())
Beispiel #11
0
class AddCmtRECORDCOMMENTForm(InvenioBaseForm):
    """Defines form for writing new comment."""
    title = TextField(_('Title'))
    body = TextAreaField(_('Message'), [
        validators.length(0, 10000,
        message = _("Your message is too long, please edit it. Maximum size allowed is %i characters.") % \
                (10000, ))])

    in_reply_to_id_cmtRECORDCOMMENT = HiddenField()
class JournalForm(WTFormDefault):
    name = QuerySelectField('',
                            get_pk=lambda i: i['key'],
                            get_label=lambda i: i['value'],
                            query_factory=lambda: [{
                                'key': '',
                                'value': _('Any journal')
                            }] + get_kb_mappings('EJOURNALS'))
    vol = TextField(_('Vol'))
    page = TextField(_('Pg'))
Beispiel #13
0
def validate_tag_exists(dummy_form, field):
    """ Check if id_tag matches a tag in database """
    if field.data:
        try:
            field.data = int(field.data)
        except ValueError:
            raise validators.ValidationError(_('Tag ID must be an integer.'))

        if not db.session.query(WtgTAG).get(field.data):
            raise validators.ValidationError(_('Tag does not exist.'))
Beispiel #14
0
def create_new(deposition_type):
    """ Creates new deposition
    """
    if deposition_type not in deposition_metadata:
        flash(_('Invalid deposition type `%s`.' % deposition_type), 'error')
        return redirect(url_for('.index_deposition_types'))
    workflow = create_workflow(deposition_type, current_user.get_id())
    uuid = workflow.get_uuid()
    flash(deposition_type + _(' deposition created!'), 'info')
    return redirect(
        url_for("webdeposit.add", deposition_type=deposition_type, uuid=uuid))
Beispiel #15
0
class WebSearchUserSettingsForm(InvenioBaseForm):
    rg = SelectField(_('Results per page'),
                     choices=[('10', '10'), ('25', '25'), ('50', '50'),
                              ('100', '100')])
    websearch_hotkeys = SelectField(_('Hotkeys'),
                                    choices=[('0', _('Disable')),
                                             ('1', _('Enable'))])
    c = QuerySelectMultipleField(_('Collections'),
                                 query_factory=get_collection,
                                 get_pk=lambda c: c.name,
                                 get_label=lambda c: c.name_ln)
Beispiel #16
0
def delete(deposition_type, uuid):
    """ Deletes the whole deposition with uuid=uuid
        (including form drafts)
        redirects to load another workflow
    """
    if deposition_type not in deposition_metadata:
        flash(_('Invalid deposition type `%s`.' % deposition_type), 'error')
        return redirect(url_for('.index_deposition_types'))
    delete_workflow(current_user.get_id(), uuid)
    flash(deposition_type + _(' deposition deleted!'), 'error')
    return redirect(
        url_for("webdeposit.index", deposition_type=deposition_type))
class LoginForm(Form):
    nickname = TextField(
        _("Nickname"),
        validators=[Required(message=_("Nickname not provided")), validate_nickname_or_email])
    password = PasswordField(_("Password"))
    remember = BooleanField(_("Remember Me"))
    referer = HiddenField()
    login_method = HiddenField()
    submit = SubmitField(_("Sign in"))

    def validate_login_method(self, field):
        field.data = wash_login_method(field.data)
Beispiel #18
0
def subscribe(recid):
    uid = current_user.get_id()
    subscription = CmtSUBSCRIPTION(id_bibrec=recid,
                                   id_user=uid,
                                   creation_time=datetime.now())
    try:
        db.session.add(subscription)
        db.session.commit()
        flash(_('You have been successfully subscribed'), 'success')
    except:
        flash(_('You are already subscribed'), 'error')
    return redirect(url_for('.comments', recid=recid))
Beispiel #19
0
    def validate_nickname(self, field):
        if nickname_valid_p(field.data) != 1:
            raise validators.ValidationError(
                _("Desired nickname %s is invalid.") % field.data)

        # is nickname already taken?
        try:
            User.query.filter(User.nickname == field.data).one()
            raise validators.ValidationError(
                _("Desired nickname %s already exists in the database.") %
                field.data)
        except SQLAlchemyError:
            pass
Beispiel #20
0
def report(recid, id):
    if CommentRights(id).can_perform_action():
        CmtRECORDCOMMENT.query.filter(CmtRECORDCOMMENT.id == id).update(
            dict(nb_abuse_reports=CmtRECORDCOMMENT.nb_abuse_reports + 1),
            synchronize_session='fetch')

        log_comment_action(CFG_WEBCOMMENT_ACTION_CODE['REPORT_ABUSE'], id,
                           recid)
        flash(_('Comment has been reported.'), 'success')
    else:
        flash(_('Comment has been already reported.'), 'error')

    return redirect(url_for('webcomment.comments', recid=recid))
Beispiel #21
0
    def validate_email(self, field):
        field.data = field.data.lower()
        if email_valid_p(field.data.lower()) != 1:
            raise validators.ValidationError(
                _("Supplied email address %s is invalid.") % field.data)

        # is email already taken?
        try:
            User.query.filter(User.email == field.data).one()
            raise validators.ValidationError(
                _("Supplied email address %s already exists in the database.")
                % field.data)
        except SQLAlchemyError:
            pass
Beispiel #22
0
def delete_all(confirmed=0):
    """
    Delete every message belonging a logged user.
    @param confirmed: 0 will produce a confirmation message.
    """
    uid = current_user.get_id()
    if confirmed != 1:
        return render_template('webmessage_confirm_delete.html')

    if dbquery.delete_all_messages(uid):
        flash(_("Your mailbox has been emptied."), "info")
    else:
        flash(_("Could not empty your mailbox."), "warning")
    return redirect(url_for('.index'))
Beispiel #23
0
def vote(recid, id, value):
    if CommentRights(id).can_perform_action():
        value = 1 if int(value) > 0 else 0
        CmtRECORDCOMMENT.query.filter(CmtRECORDCOMMENT.id == id).update(
            dict(nb_votes_total=CmtRECORDCOMMENT.nb_votes_total + 1,
                 nb_votes_yes=CmtRECORDCOMMENT.nb_votes_yes + value),
            synchronize_session='fetch')

        log_comment_action(CFG_WEBCOMMENT_ACTION_CODE['VOTE'], id, recid)
        flash(_('Thank you for your vote.'), 'success')
    else:
        flash(_('You can not vote for this comment.'), 'error')

    return redirect(url_for('webcomment.comments', recid=recid))
Beispiel #24
0
def index(deposition_type):
    if deposition_type not in deposition_metadata:
        flash(_('Invalid deposition type `%s`.' % deposition_type), 'error')
        return redirect(url_for('.index_deposition_types'))
    current_app.config['breadcrumbs_map'][request.endpoint] = [
        (_('Home'), '')
    ] + blueprint.breadcrumbs + [(deposition_type, None)]
    user_id = current_user.get_id()
    drafts = draft_field_get_all(user_id, deposition_type)

    return render_template('webdeposit_index.html',
                           drafts=drafts,
                           deposition_type=deposition_type,
                           deposition_types=deposition_types)
def create_new(deposition_type):
    """ Creates new deposition
    """
    if deposition_type not in deposition_metadata:
        flash(_('Invalid deposition type `%s`.' % deposition_type), 'error')
        return redirect(url_for('.index_deposition_types'))
    try:
        workflow = create_workflow(deposition_type, current_user.get_id())
    except InvenioWebDepositNoDepositionType:
        flash(_('Deposition type `') + deposition_type + '` not found.',
              'error')
        return redirect(url_for('.index_deposition_types'))
    uuid = workflow.get_uuid()
    return redirect(url_for("webdeposit.add",
                            deposition_type=deposition_type,
                            uuid=uuid))
    def decorated(*args, **kwargs):
        uid = current_user.get_id()
        name = name_getter()
        if name:
            collection = Collection.query.filter(
                Collection.name == name).first_or_404()
        elif default_collection:
            collection = Collection.query.get_or_404(1)
        else:
            return abort(404)

        if collection.is_restricted:
            (auth_code,
             auth_msg) = acc_authorize_action(uid,
                                              VIEWRESTRCOLL,
                                              collection=collection.name)
            if auth_code:
                flash(_('This collection is restricted.'), 'error')
            if auth_code and current_user.is_guest:
                return redirect(
                    url_for('webaccount.login', referer=request.url))
            elif auth_code:
                return abort(401)

        return method(collection, *args, **kwargs)
Beispiel #27
0
class ZenodoEditForm(ZenodoForm, EditFormMixin):
    """
    Specialized form for editing a record
    """
    # Remove some fields.
    doi = fields.DOIField(
        label="Digital Object Identifier",
        description="Optional. Did your publisher already assign a DOI to your"
        " upload? If not, leave the field empty and we will register a new"
        " DOI for you. A DOI allow others to easily and unambiguously cite"
        " your upload.",
        placeholder="e.g. 10.1234/foo.bar...",
        validators=[
            doi_syntax_validator,
            minted_doi_validator(prefix=CFG_DATACITE_DOI_PREFIX),
            invalid_doi_prefix_validator(prefix=CFG_DATACITE_DOI_PREFIX),
        ],
        processors=[
            local_datacite_lookup
        ],
        export_key='doi',
    )
    prereserve_doi = None
    plupload_file = None

    _title = _('Edit upload')
    template = "webdeposit_edit.html"
 def __init__(self):
     super(WebMessageSettings, self).__init__()
     self.icon = 'envelope'
     self.title = _('Messages')
     self.view = url_for('webmessage.index')
     if True or CFG_WEBMESSAGE_EMAIL_ALERT:
         self.edit = url_for('webaccount.edit', name=self.name)
Beispiel #29
0
def validate_user_can_see_bibrec(dummy_form, field):
    """ Check if user has rights to view bibrec """
    if field.data:
        (auth_code, msg) = check_user_can_view_record(current_user, field.data)

        if auth_code > 0:
            raise validators.ValidationError(
                _('Unauthorized to view record: ') + msg)
Beispiel #30
0
def validate_user_owns_tag(dummy_form, field):
    """ Check if id_tag matches a tag in database """
    if field.data:
        tag = db.session.query(WtgTAG).get(field.data)

        if tag and tag.id_user != current_user.get_id():
            raise validators.ValidationError(
                _('You are not the owner of this tag.'))
Beispiel #31
0
def delete():
    """
    Delete message specified by 'msgid' that belongs to logged user.
    """
    uid = current_user.get_id()
    msgids = request.values.getlist('msgid', type=int)
    if len(msgids) <= 0:
        flash(_('Sorry, no valid message specified.'), "error")
    elif dbquery.check_user_owns_message(uid, msgids) < len(msgids):
        flash(_('Sorry, this message (#%s) is not in your mailbox.') % (str(msgids), ), "error")
    else:
        if dbquery.delete_message_from_user_inbox(uid, msgids) == 0:
            flash(_("The message could not be deleted."), "error")
        else:
            flash(_("The message was successfully deleted."), "info")

    return redirect(url_for('.index'))
 def __init__(self):
     super(DepositsSettings, self).__init__()
     self.icon = 'folder-open'
     self.title = _('Deposits')
     try:
         user = User.query.get(current_user.get_id())
         email = user.email
         email_field = "8560_"
         self.view = url_for('search.search', f=email_field, p=email)
     except:
         self.view = ''
Beispiel #33
0
def collection(name):
    collection = Collection.query.filter(Collection.name == name).first_or_404()
    #FIXME cache per language
    b = get_collection_breadcrumbs(collection, [(_('Home'), '')], ln=g.ln)
    current_app.config['breadcrumbs_map'][request.endpoint] = b

    @register_template_context_processor
    def index_context():
        return dict(
            format_record=cached_format_record,
            easy_search_form=EasySearchForm(csrf_enabled=False),
            get_creation_date=get_creation_date)
    return dict(collection=collection)
def index():
    """
    Index page with uploader and list of existing depositions
    """
    uid = current_user.get_id()
    ctx = mycollections_ctx(uid)
    ctx.update({
        'title': _('Community Collections'),
        'usercollections': UserCollection.query.filter(UserCollection.title != 'ZENODO').order_by(UserCollection.title).all(),
    })

    return render_template(
        "usercollection_index.html",
        **ctx
    )
Beispiel #35
0
def index(collection=None):
    """
    Index page with uploader and list of existing depositions
    """
    u = None
    upload_url = url_for('deposit.upload')
    dropbox_upload_url = url_for('deposit.dropbox_upload')

    if 'c' in request.values:
        u = UserCollection.query.get(request.values.get('c'))
        if u:
            upload_url = url_for('deposit.upload', c=u.id)
            dropbox_upload_url = url_for('deposit.dropbox_upload', c=u.id)

    return render_template(
        "openaire_index.html",
        title=_('Upload'),
        myresearch=get_exisiting_publications_for_uid(current_user.get_id()),
        pub=None,
        usercollection=u,
        upload_url=upload_url,
        dropbox_upload_url=dropbox_upload_url,
    )
Beispiel #36
0
def results(qid):
    """
    Generates results for cached query using POSTed filter.

    @param qid: query indentifier
    """
    try:
        recIDsHitSet = get_current_user_records_that_can_be_displayed(qid)
    except KeyError:
        return 'KeyError'
    except:
        return _('Please reload the page')

    cc = search_results_cache.get(
            get_search_results_cache_key_from_qid(qid) + '::cc')

    try:
        filter = json.loads(request.values.get('filter', '[]'))
    except:
        return _('Invalid filter data')
    collection = Collection.query.filter(Collection.name == cc).first_or_404()

    sortkeytype = lambda v: v[0]
    sortfacet = lambda v: v[1]
    data = sorted(filter, key=sortkeytype)
    out = {}
    for t, vs in groupby(data, key=sortkeytype):
        out[t] = {}
        for v, k in groupby(sorted(vs, key=sortfacet), key=sortfacet):
            out[t][v] = map(lambda i: i[2], k)

    filter = out
    output = recIDsHitSet
    FACET_DICTS = current_app.config.get('FACET_DICTS', {})

    if '+' in filter:
        values = filter['+']
        for key, facet in FACET_DICTS.iteritems():
            if key in values:
                output.intersection_update(facet.get_facet_recids(values[key]))

    if '-' in filter:
        values = filter['-']
        for key, facet in FACET_DICTS.iteritems():
            if key in values:
                output.difference_update(facet.get_facet_recids(values[key]))

    #TODO sort
    if request.values.get('so'):
        recids = output.tolist()
        recids.reverse()
    elif request.values.get('rm'):
        from invenio.bibrank_record_sorter import rank_records
        ranked = rank_records(
                    request.values.get('rm'),
                    0, output, request.values.get('p', '').split())
        if ranked[0]:
            recids = ranked[0]
            recids.reverse()
        else:
            recids = output.tolist()
    else:
        recids = output.tolist()
        recids.reverse()

    rg = request.values.get('rg', 10, type=int)
    page = request.values.get('jrec', 1, type=int)

    @register_template_context_processor
    def index_context():
        return dict(
                collection=collection,
                RecordInfo=RecordInfo,
                create_nearest_terms_box=_create_neareset_term_box,
                pagination=Pagination(int(ceil(page / float(rg))), rg, len(recids)),
                rg=rg,
                format_record=cached_format_record)

    if len(recids):
        return render_template('websearch_results.html',
                        recids=recids,
                        export_formats=get_export_formats())
    else:
        return _('Your search did not match any records. Please try again.')
Beispiel #37
0
def search():
    """
    Renders search pages.

    @FIXME: add parameter stream=True
    """

    uid = current_user.get_id()
    #url_args = SearchUrlargs(user=user, session=session, **request.args)

    name = request.args.get('cc')
    if name:
        collection = Collection.query.filter(Collection.name == name).first_or_404()
    else:
        collection = Collection.query.get_or_404(1)

    if collection.is_restricted:
        (auth_code, auth_msg) = acc_authorize_action(uid,
                                        VIEWRESTRCOLL,
                                        collection=collection.name)
        if auth_code and current_user.is_guest:
            return redirect(url_for('webaccount.login',
                                    referer=request.url))
        elif auth_code:
            return abort(401)

    from invenio.websearch_webinterface import wash_search_urlargd
    argd = argd_orig = wash_search_urlargd(request.args)
    argd['of'] = 'id'

    #FIXME
    b = []

    def _crumb_builder(collection):
        qargs = request.args.to_dict()
        qargs['cc'] = collection.name
        return (collection.name_ln, 'search.search', qargs)

    if collection.id > 1:
        qargs = request.args.to_dict()
        qargs['cc'] = Collection.query.get_or_404(1).name
        b = get_collection_breadcrumbs(collection, [
                (_('Home'), 'search.search', qargs)],
                builder=_crumb_builder)
    current_app.config['breadcrumbs_map'][request.endpoint] = b

    rg = request.args.get('rg', 10, type=int)
    page = request.args.get('jrec', 1, type=int)
    qid = get_search_query_id(**argd)

    recids = perform_request_search(req=request, **argd)
    if (argd_orig.get('so') or argd_orig.get('rm')):
        recids.reverse()

    FACET_SORTED_LIST = current_app.config.get('FACET_SORTED_LIST', [])
    facets = map(lambda x: x.get_conf(collection=collection, qid=qid),
                 FACET_SORTED_LIST)

    @register_template_context_processor
    def index_context():
        return dict(collection=collection,
                    facets=facets,
                    RecordInfo=RecordInfo,
                    create_nearest_terms_box=lambda: _create_neareset_term_box(argd_orig),
                    pagination=Pagination(int(ceil(page / float(rg))), rg, len(recids)),
                    rg=rg,
                    qid=qid,
                    easy_search_form=EasySearchForm(csrf_enabled=False),
                    format_record=cached_format_record,
                    #FIXME: move to DB layer
                    export_formats=get_export_formats())
    return dict(recids=recids)
from invenio.importutils import autodiscover_modules
from invenio.sqlalchemyutils import db
from invenio.webaccount_forms import LoginForm, RegisterForm
from invenio.websearch_model import Collection
from invenio.webinterface_handler_flask_utils import _, InvenioBlueprint
from invenio.websession_model import User
from invenio.websession_webinterface import wash_login_method
from invenio.webuser_flask import login_user, logout_user, current_user, UserInfo


CFG_HAS_HTTPS_SUPPORT = CFG_SITE_SECURE_URL.startswith("https://")
CFG_FULL_HTTPS = CFG_SITE_URL.lower().startswith("https://")

blueprint = InvenioBlueprint('webaccount', __name__,
                             url_prefix="/youraccount",
                             breadcrumbs=[(_("Your Account"),
                                           'webaccount.index')],
                             menubuilder=[('personalize', _('Personalize'),
                                           'webaccount.index')])


def update_login(nickname, password=None, remember_me=False):
    where = [db.or_(User.nickname == nickname, User.email == nickname)]
    if password is not None:
        where.append(User.password == password)
    user = User.query.filter(*where).one()
    login_user(UserInfo(user.id), remember=remember_me)
    return user


@blueprint.route('/login/', methods=['GET', 'POST'])
def register():
    req = request.get_legacy_request()

    # FIXME
    if CFG_ACCESS_CONTROL_LEVEL_SITE > 0:
        return webuser.page_not_authorized(req, "../youraccount/register?ln=%s" % g.ln,
                                           navmenuid='youraccount')

    form = RegisterForm(request.values, csrf_enabled=False)
    #uid = current_user.get_id()

    title = _("Register")
    messages = []
    state = ""

    if form.validate_on_submit():
        ruid = webuser.registerUser(req, form.email.data.encode('utf8'),
                                    form.password.data.encode('utf8'),
                                    form.nickname.data.encode('utf8'),
                                    ln=g.ln)
        if ruid == 0:
            title = _("Account created")
            messages.append(_("Your account has been successfully created."))
            state = "success"
            if CFG_ACCESS_CONTROL_NOTIFY_USER_ABOUT_NEW_ACCOUNT == 1:
                messages.append(_("In order to confirm its validity, an email message containing an account activation key has been sent to the given email address."))
                messages.append(_("Please follow instructions presented there in order to complete the account registration process."))
            if CFG_ACCESS_CONTROL_LEVEL_ACCOUNTS >= 1:
                messages.append(_("A second email will be sent when the account has been activated and can be used."))
            elif CFG_ACCESS_CONTROL_NOTIFY_USER_ABOUT_NEW_ACCOUNT != 1:
                user = User.query.filter(User.email == form.email.data.lower()).one()
                login_user(user.get_id())
                messages.append(_("You can now access your account."))
        else:
            title = _("Registration failure")
            state = "danger"
            if ruid == 5:
                messages.append(_("Users cannot register themselves, only admin can register them."))
            elif ruid == 6 or ruid == 1:
                # Note, code 1 is used both for invalid email, and email sending
                # problems, however the email address is validated by the form,
                # so we only have to report a problem sending the email here
                messages.append(_("The site is having troubles in sending you an email for confirming your email address."))
                messages.append(_("The error has been logged and will be taken in consideration as soon as possible."))
            else:
                # Errors [-2, (1), 2, 3, 4] taken care of by form validation
                messages.append(_("Internal error %s") % ruid)
    elif request.method == 'POST':
        title = _("Registration failure")
        state = "warning"

    return render_template('webaccount_register.html', form=form, title=title,
                           messages=messages, state=state)
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with Invenio; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.

"""OpenAIRE Flask Blueprint"""
from flask import render_template
from invenio.webinterface_handler_flask_utils import InvenioBlueprint, _

blueprint = InvenioBlueprint('invenio_openaire', __name__,
  url_prefix="",
  menubuilder=[
    ('main.browse', _('Browse'), '', 2),
    ('main.browse.datasets', _('Datasets'), 'collection.datasets', 1),
    ('main.browse.images', _('Images'), 'collection.images', 2),
    ('main.browse.posters', _('Posters'), 'collection.posters', 3),
    ('main.browse.presentations', _('Presentations'), 'collection.presentations', 4),
    ('main.browse.publications', _('Publications'), 'collection.publications', 5),
    ('main.browse.software', _('Software'), 'collection.software', 6),
    ('main.browse.videos', _('Video/Audio'), 'collection.videos', 6),
    ('main.getstarted', _('Get started'), '', 4),
    ('main.getstarted.features', _('Features'), 'invenio_openaire.features', 1),
    #('main.getstarted.deposit_data', _('Deposit data'), 'invenio_openaire.deposit_data', 2),
    #('main.getstarted.use_data', _('Use data'), 'invenio_openaire.use_data', 3),
    ('main.getstarted.faq', _('FAQ'), 'invenio_openaire.faq', 4),
    ('footermenu_left.about', _('About'), 'invenio_openaire.about', 1),
    ('footermenu_left.contact', _('Contact'), 'invenio_openaire.contact', 2),
    ('footermenu_left.policies', _('Policies'), 'invenio_openaire.policies', 3),
def login(nickname=None, password=None, login_method=None, action='',
          remember_me=False, referer=None):

    if CFG_ACCESS_CONTROL_LEVEL_SITE > 0:
        return abort(401)  # page is not authorized

    if action:
        try:
            action, arguments = mail_cookie_check_authorize_action(action)
        except InvenioWebAccessMailCookieError:
            pass
    form = LoginForm(CombinedMultiDict([ImmutableMultiDict({'referer': referer}
                                        if referer else {}),
                                        request.values]),
                     csrf_enabled=False)
    try:
        user = None
        if not CFG_EXTERNAL_AUTH_USING_SSO:
            if login_method == 'Local':
                if form.validate_on_submit():
                    user = update_login(nickname, password, remember_me)
            elif login_method in ['openid', 'oauth1', 'oauth2']:
                pass
                req = request.get_legacy_request()
                (iden, nickname, password, msgcode) = webuser.loginUser(req, nickname,
                                                                        password,
                                                                        login_method)
                if iden:
                    user = update_login(nickname)
            else:
                flash(_('Invalid login method.'), 'error')

        else:
            req = request.get_legacy_request()
            # Fake parameters for p_un & p_pw because SSO takes them from the environment
            (iden, nickname, password, msgcode) = webuser.loginUser(req, '', '', CFG_EXTERNAL_AUTH_USING_SSO)
            if iden:
                user = update_login(nickname)

        if user:
            flash(_("You are logged in as %s.") % user.nickname, "info")
            if referer is not None:
                from urlparse import urlparse
                # we should not redirect to these URLs after login
                blacklist = [url_for('webaccount.register'),
                             url_for('webaccount.logout'),
                             url_for('webaccount.login')]
                if not urlparse(referer).path in blacklist:
                    # Change HTTP method to https if needed.
                    referer = referer.replace(CFG_SITE_URL, CFG_SITE_SECURE_URL)
                    return redirect(referer)
                return redirect('/')

    except:
        flash(_("Problem with login."), "error")

    current_app.config.update(dict((k, v) for k, v in
                              vars(websession_config).iteritems()
                              if "CFG_" == k[:4]))

    collection = Collection.query.get_or_404(1)

    from invenio.b2share_utils import get_latest_deposits
    latest_deposits = get_latest_deposits()
    # @register_template_context_processor
    #     def index_context():
    #         return dict(
    #             easy_search_form=EasySearchForm(csrf_enabled=False),
    #             format_record=cached_format_record,
    #             get_creation_date=get_creation_date,
    #             unregistered=(not current_user.is_authenticated())
    #         )
    return render_template('webaccount_login.html', form=form, 
                           collection=collection, latest_deposits=latest_deposits) 
Beispiel #42
0
from invenio.bibdocfile import download_external_url
from invenio.openaire_deposit_engine import get_exisiting_publications_for_uid,\
    OpenAIREPublication
from werkzeug.datastructures import MultiDict
import invenio.template
import os
from invenio.openaire_forms import DepositionForm, DepositionFormMapper, PublicationMapper
import json
from invenio.config import CFG_SITE_SUPPORT_EMAIL, CFG_SITE_NAME
from invenio.usercollection_model import UserCollection


blueprint = InvenioBlueprint('deposit', __name__,
    url_prefix="/deposit",
    breadcrumbs=[
        (_('Upload'), 'deposit.index'),
    ],
    menubuilder=[
        ('main.deposit', _('Upload'), 'deposit.index', 1),
    ],
)

openaire_deposit_templates = invenio.template.load('openaire_deposit')


def is_editable(pub):
    return pub.status in ['initialized', 'edited']


# - Wash url arg
# - check redirect to login on guest
Beispiel #43
0
    def decorated(recid, *args, **kwargs):
        # ensure recid to be integer
        recid = int(recid)
        g.collection = collection = Collection.query.filter(
            Collection.name == guess_primary_collection_of_a_record(recid)).\
            one()

        (auth_code, auth_msg) = check_user_can_view_record(current_user, recid)

        # only superadmins can use verbose parameter for obtaining debug information
        if not current_user.is_super_admin and 'verbose' in kwargs:
            kwargs['verbose'] = 0

        if auth_code and current_user.is_guest:
            cookie = mail_cookie_create_authorize_action(VIEWRESTRCOLL, {
                'collection': guess_primary_collection_of_a_record(recid)})
            url_args = {'action': cookie, 'ln': g.ln, 'referer': request.url}
            flash(_("Authorization failure"), 'error')
            return redirect(url_for('webaccount.login', **url_args))
        elif auth_code:
            flash(auth_msg, 'error')
            abort(apache.HTTP_UNAUTHORIZED)

        from invenio.bibfield import get_record
        from invenio.search_engine import record_exists, get_merged_recid
        # check if the current record has been deleted
        # and has been merged, case in which the deleted record
        # will be redirect to the new one
        record_status = record_exists(recid)
        merged_recid = get_merged_recid(recid)
        if record_status == -1 and merged_recid:
            return redirect(url_for('record.metadata', recid=merged_recid))
        elif record_status == -1:
            abort(apache.HTTP_GONE)  # The record is gone!

        g.bibrec = Bibrec.query.get(recid)
        record = get_record(recid)
        title = record.get('title.title', '')

        b = [(_('Home'), '')] + collection.breadcrumbs()[1:]
        b += [(title, 'record.metadata', dict(recid=recid))]
        current_app.config['breadcrumbs_map'][request.endpoint] = b
        g.record_tab_keys = []
        tabs = []
        counts = get_detailed_page_tabs_counts(recid)
        for k, v in get_detailed_page_tabs(collection.id, recid,
                                           g.ln).iteritems():
            t = {}
            b = 'record'
            if k == '':
                k = 'metadata'
            if k == 'comments' or k == 'reviews':
                b = 'webcomment'
            if k == 'linkbacks':
                b = 'weblinkback'
                k = 'index'

            t['key'] = b + '.' + k
            t['count'] = counts.get(k.capitalize(), -1)

            t.update(v)
            tabs.append(t)
            if v['visible']:
                g.record_tab_keys.append(b + '.' + k)

        if CFG_WEBLINKBACK_TRACKBACK_ENABLED:
            @register_template_context_processor
            def trackback_context():
                from invenio.weblinkback_templates import get_trackback_auto_discovery_tag
                return dict(headerLinkbackTrackbackLink=get_trackback_auto_discovery_tag(recid))

        def _format_record(recid, of='hd', user_info=current_user, *args, **kwargs):
            return print_record(recid, format=of, user_info=user_info, *args, **kwargs)

        @register_template_context_processor
        def record_context():
            files = [f for f in BibRecDocs(recid, human_readable=True).list_latest_files(list_hidden=False) \
                        if not f.is_icon() and f.is_restricted(current_user)[0] == 0]

            return dict(recid=recid,
                        record=record,
                        tabs=tabs,
                        title=title,
                        get_mini_reviews=lambda *args, **kwargs:
                        get_mini_reviews(*args, **kwargs).decode('utf8'),
                        collection=collection,
                        format_record=_format_record,
                        files=files
                        )
        return f(recid, *args, **kwargs)
Beispiel #44
0
from invenio.access_control_config import VIEWRESTRCOLL
from invenio.sqlalchemyutils import db
from invenio.websearch_forms import EasySearchForm
from invenio.websearch_model import Collection, Format, Tag
from invenio.webinterface_handler_flask_utils import _, InvenioBlueprint, \
    register_template_context_processor
from invenio.webuser_flask import current_user

from invenio.bibindex_engine import get_index_id_from_index_name
from invenio.search_engine import get_creation_date, perform_request_search,\
    search_pattern, print_record, create_nearest_terms_box

blueprint = InvenioBlueprint('search', __name__, url_prefix="",
                             config='invenio.search_engine_config',
                             breadcrumbs=[],
                             menubuilder=[('main.search', _('Search'),
                                           'search.index', 1)])


def insert(name):
    def _bfe_element(bfo, **kwargs):
        # convert to utf-8 for legacy app
        kwargs = dict((k, v.encode('utf-8') if isinstance(v, unicode) else v)
                      for k, v in kwargs.iteritems())
        format_element = get_format_element(name)
        (out, dummy) = eval_format_element(format_element,
                                           bfo,
                                           kwargs)
        # returns unicode for jinja2
        return out.decode('utf-8')
    return _bfe_element
    redirect, url_for, jsonify
from invenio.webinterface_handler_flask_utils import InvenioBlueprint, _
from invenio.webuser_flask import current_user
from invenio.usercollection_forms import CollectionForm, EditCollectionForm, \
    DeleteCollectionForm
from invenio.usercollection_model import UserCollection
from invenio.sqlalchemyutils import db
from invenio.search_engine import get_fieldvalues
from invenio.cache import cache

blueprint = InvenioBlueprint(
    'usercollection',
    __name__,
    url_prefix="/communities",
    breadcrumbs=[
        (_('Communities'), 'usercollection.index'),
    ],
    menubuilder=[
        ('main.usercollection', _('Communities'), 'usercollection.index', 2),
    ],
)


def mycollections_ctx(uid):
    """
    Helper method for return ctx used by many views
    """
    return {
        'mycollections': UserCollection.query.filter_by(
            id_user=uid).order_by(db.asc(UserCollection.title)).all()
    }
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with SimpleStore; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.

"""SimpleStore Flask Blueprint"""
from flask import request
from invenio.webinterface_handler_flask_utils import _, InvenioBlueprint
import invenio.simplestore_upload_handler as uph
import invenio.simplestore_deposit_handler as dep

blueprint = InvenioBlueprint('simplestore', __name__,
                             url_prefix='/deposit',
                             menubuilder=[('main.simplestore',
                                          _('Deposit'),
                                          'simplestore.deposit', 2)],
                             breadcrumbs=[(_('Deposit'),
                                          'simplestore.deposit')])


@blueprint.route('/', methods=['GET'])
@blueprint.invenio_authenticated
def deposit():
    return dep.deposit(request)


@blueprint.route('/addmeta/<sub_id>', methods=['POST'])
@blueprint.invenio_authenticated
def addmeta(sub_id):
    return dep.addmeta(request, sub_id)