Пример #1
0
def add():

    form_args = None

    if request.args and 'term' in request.args and \
       'lang' in request.args and 'sf' in request.args:
        form_args = request.args.copy()

        form_args['add-subject_field'] = request.args.getlist('sf')
        form_args['add-syntrans_term'] = request.args['term']
        form_args['add-syntrans_lang'] = request.args['lang']
        form_args['add-syntrans'] = True
        form_args['add-transac_type'] = u'input'
        form_args['collision-subject_field'] = request.args.getlist('sf')
        form_args['collision-syntrans_term'] = request.args['term']
        form_args['collision-syntrans_lang'] = request.args['lang']
        form_args['collision-syntrans'] = True
        form_args['collision-transac_type'] = u'input'

        del form_args['sf']
        del form_args['term']
        del form_args['lang']

    if g.user.is_corrector:
        add_form_cls = AddTermFormCor
        upload_form_cls = UploadFormCor
        collision_form_cls = CollisionFormCor
    else:
        add_form_cls = AddTermForm
        upload_form_cls = UploadForm
        collision_form_cls = CollisionForm

    add_form = _gen_term_form(add_form_cls, formdata=form_args,
                                  prefix='add')
    collision_form = _gen_term_form(collision_form_cls, formdata=form_args,
                                  prefix='collision', csrf_enabled=False)
    upload_form = _gen_term_form(upload_form_cls, formdata=form_args,
                                     prefix='upload', csrf_enabled=False)

    if (add_form.submit.data and add_form.validate_on_submit()) or \
        ((collision_form.discard.data or collision_form.force.data) and \
        collision_form.validate_on_submit()):

        # Get desired extra action (only used in collision pages)
        force = False
        discard = False
        if collision_form.discard.data:
            discard = True
        elif collision_form.force.data:
            force = True

        if discard:
            flash(_(u"Term addition discarded."), 'success')
            return redirect(url_for('frontend.index'))

        term = Term()
        if collision_form.force.data:
            collision_form.populate_obj(term)
        else:
            add_form.populate_obj(term)

        _populate_equivalents(add_form, term)

        st, results, objects = term.insert_all(force=force)

        if st == u"success":
            msg = _(u'Term added successfully. '
                    '<a href="%(url)s">Go to the term</a>.',
                    url=url_for('terms.detail', id=term.id))
            flash(msg, 'success')

            return redirect(url_for("terms.add"))
        elif st == u"collision":
            msg = _(u'Collision detected!')
            flash(msg, 'warning')

            #
            # Fill in collision form
            #
            for fname in add_form._fields:

                if fname != 'csrf':
                    val = getattr(add_form, fname).data
                    f = getattr(collision_form, fname, None)

                    # FieldLists are tricky
                    if isinstance(f, FieldList):
                        f.pop_entry()
                        for entry in val:
                            f.append_entry(entry)
                    else:
                        f.data = val

            return render_template('terms/collision.html',
                    add_form=add_form,
                    collision_form=collision_form,
                    terms=objects)
        else:
            flash(_(u'Error while trying to add some terms.'), 'error')

    elif (upload_form.submit.data or upload_form.confirm.data or \
          upload_form.cancel.data) and upload_form.validate_on_submit():

        if upload_form.cancel.data:
            flash(_(u"Import action cancelled."), 'success')
            return redirect(url_for('frontend.index'))

        emulate = True
        if upload_form.confirm.data:
            emulate = False

        # Save for later reuse
        disk_fn = None
        if emulate:
            import os
            import random
            import string
            import tempfile

            f = request.files['upload-file']
            fn = ''.join(random.choice(string.lowercase) for x in range(6))
            disk_fn = os.path.join(tempfile.gettempdir(), fn)
            f.save(disk_fn)
            upload_form.fpath.data = disk_fn

        try:
            file = open(upload_form.fpath.data)
        except IOError:
            file = None

        fields = upload_form.columns.data.split(u";")
        fields.insert(0, upload_form.term_field.data)

        if file:
            import csv

            reader = csv.DictReader(file, fieldnames=fields, skipinitialspace=True)

            results = {}

            if not emulate:
                term_upload = TermUpload(author=g.user)

            for (count, row) in enumerate(reader):

                # Break on the max num. of allowed term uploads
                if count == current_app.config.get('TZOS_MAX_UPLOADS', 100):
                    break

                # Store current term for using as a reference for
                # synonyms and translations
                try:
                    # TODO: clean the input before blindly insert it
                    current_term = unicode(row[fields[0]], 'utf-8').strip()
                    current_language = fields[0][5:7]
                except IndexError:
                    current_term = None
                    current_language = None

                term = Term()
                upload_form.populate_obj(term)

                if term.working_status == u'starterElement':
                    term.working_status = u'importedElement'

                for field in fields:

                    if not row[field]:
                        continue

                    value = unicode(row[field], 'utf-8').strip()

                    if not value:
                        # No value passed, skip this field
                        continue

                    if field.startswith('term-'):

                        # Fill in fields
                        term.term = value
                        term.language = field[5:7]

                    elif field.startswith('trans-'):

                        lang = field[6:8]

                        if term.language == lang:
                            term.append_raw_synonym(value)
                        else:
                            term.append_raw_translation(lang, value)

                st, res, objects = term.insert_all(emulate=emulate)
                results.setdefault(st, []).append(res)

                # Add resulting terms to the upload tracking structure
                if not emulate:
                    for (term, status) in res:
                        if status == u'success':
                            term_upload.add(term)

            # Once all is processed, save the upload tracking structure
            if not emulate:
                db.session.add(term_upload)
                db.session.commit()

            # We need to set this again due to the postprocessing
            upload_form.fpath.data = disk_fn

            return render_template('terms/upload_results.html',
                    results=results,
                    upload_form=upload_form,
                    emulate=emulate)
        else:
            flash(_(u'Not a valid file.'), 'error')

    return render_template('terms/add.html', add_form=add_form,
                                             upload_form=upload_form)