def sources() -> ResponseData:
    method = get_method(request)
    session = Session()

    if method == 'GET':
        context = auth_context(request)
        sources = session.query(Source).all()
        for source in sources:
            source.content_preview = source.content[0:250] + '...'
        context.update({'sources':sources})

        return render_template('sources.html', **context)

    if method == 'POST':
        s = Source()
        s.name = request.form['source_name']
        s.description = request.form['source_description']
        content = None
        if len(request.form['content_paste']) > 0:
            content = StringIO(request.form['content_paste'])
        elif request.files.get('content_file'):
            content = StringIOWrapper(request.files['content_file'].stream)

        if content is None:
            flash('Got empty content for source.')
            return redirect(url_for('sources'))

        # TODO handle error
        source_id = process_text(app.config['DB'], s, content)
        content.close()

        return redirect(url_for('source', source_id=source_id))
def source(source_id: str) -> ResponseData:
    method = request.form.get('_method', request.method)
    session = Session()

    if method == 'GET':
        context = auth_context(request)
        s = session.query(Source).filter(Source.id == source_id).one()
        context.update({
            'source':s,
        })
        return render_template('source.html', **context)

    if method == 'PUT':
        s = session.query(Source).filter(Source.id == source_id).one()
        s.name = request.form['source_name']
        s.description = request.form['source_description']
        new_content = request.form['source_content']
        if new_content != s.content:
            session.query(Phrase).filter(Phrase.source_id == s.id).delete()
            session.expunge(s)
            process_text(app.config['DB'], s, StringIO(new_content))
        session.commit()

        return redirect(url_for('sources'))

    if method == 'DELETE':
        # TODO for love of god get on delete cascade working
        s = session.query(Source).filter(Source.id==source_id).one()
        corpus_ids = session.query(corpora_sources.c.corpus_id).filter(
            corpora_sources.c.source_id == source_id
        ).all()
        for c in session.query(Corpus).filter(Corpus.id.in_(corpus_ids)):
            c.sources.remove(s)
        session.query(Phrase).filter(Phrase.source_id == source_id).delete()
        session.query(Source).filter(Source.id == source_id).delete()
        session.commit()

        return redirect(url_for('sources'))
Exemple #3
0
    def source_new(self):
        text_file = open(self.args.path, 'r')
        name = self.args.source_name
        description = self.args.source_description
        source = Source(name=name, description=description)

        error = process_text(self.db, source, text_file)
        if error is not None:
            print('There was an error extracting phrases:')
            print('********')
            print(error)
            print('********')
            print("The source '{}' was not saved.".format(name))

        text_file.close()