Exemple #1
0
def view_translate(session, request, language, description_id):
    """ Show the translation page for a description """
    lang = session.query(Languages).get(language)
    if not lang or not lang.enabled_ddtss:
        raise Http404()

    descr = session.query(Description).filter_by(description_id=description_id).first()
    if not descr:
        raise Http404()

    user = get_user(request, session)

    if not lang.translation_model.user_allowed(user, language, lang.translation_model.ACTION_REVIEW):
        return show_message_screen(request, 'User is not permitted to translate', 'ddtss_index_lang', language)

    # Select FOR UPDATE, to avoid concurrency issues.
    trans = session.query(PendingTranslation).filter_by(language=lang, description_id=description_id).with_lockmode('update').first()
    if not trans:
        message = Messages(
                message="",
                actionstring="fetched",
                to_user=None,
                language=language,
                for_description=description_id,
                from_user=user.username,
                in_reply_to=None,
                timestamp=int(time.time()))
        session.add(message)

        trans = PendingTranslation(
                description_id=description_id,
                language=lang,
                firstupdate=int(time.time()),
                lastupdate=int(time.time()),
                owner_username=user.username,
                owner_locktime=int(time.time()),
                iteration=0,
                state=PendingTranslation.STATE_PENDING_TRANSLATION)

        # Make a suggestion for the new translation
        trans.short, trans.long = PendingTranslation.make_suggestion(descr, language)
        session.add(trans)

    if trans.state != PendingTranslation.STATE_PENDING_TRANSLATION:
        session.commit()
        return show_message_screen(request, 'Already translated, redirecting to review screen', 'ddtss_forreview', language, description_id)

    # Try to lock the description, note sets the owner field
    if not trans.trylock(user):
        session.commit()
        return show_message_screen(request, 'Translation locked, try again later', 'ddtss_index_lang', language)

    if request.method == 'POST':
        form = TranslationForm(request.POST)

        if not form.is_valid():
            # Maybe return HTTP 400 - Bad request?
            return show_message_screen(request, 'Bad request %r' % form.errors, 'ddtss_index_lang', language)

        if form.cleaned_data['abandon']:
            trans.comment = form.cleaned_data['comment']
            trans.unlock()
            session.commit()
            return show_message_screen(request, 'Translation abandoned', 'ddtss_index_lang', language)

        if form.cleaned_data['submit']:
            trans.update_translation(form.cleaned_data['short'], form.cleaned_data['long'])
            trans.lastupdate=int(time.time())
            trans.comment = form.cleaned_data['comment']
            trans.unlock()

            # If no longer pending translation, add one to counter
            if trans.state != PendingTranslation.STATE_PENDING_TRANSLATION:
                user.counttranslations += 1

            message = ""
            if trans.comment:
                message = trans.comment
                trans.comment = None

            message = Messages(
                    message=message,
                    actionstring="text updated",
                    to_user=None,
                    language=language,
                    for_description=description_id,
                    from_user=user.username,
                    in_reply_to=None,
                    timestamp=int(time.time()))
            session.add(message)

            session.commit()
            return show_message_screen(request, 'Translation submitted', 'ddtss_index_lang', language)

    if trans.comment is None:
        trans.comment = ""
    if trans.short is None:
        trans.short, trans.long = PendingTranslation.make_suggestion(descr, language)

    descr_messages = session.query(Messages) \
                          .filter(Messages.language==language) \
                          .filter(Messages.for_description==description_id) \
                          .order_by(Messages.timestamp) \
                          .all()

    olddiffs = list()
    for olddescr in descr.get_description_predecessors:
        oneolddiff = dict()
        oneolddiff['id'] = descr.description_id
        oneolddiff['short'] = descr.short()
        oneolddiff['long'] = descr.long()
        oneolddiff['transshort'], oneolddiff['translong'] = PendingTranslation.make_quick_suggestion(descr, language)
        oneolddiff['oldid'] = olddescr.description_id
        oneolddiff['oldshort'] = olddescr.short()
        oneolddiff['oldlong'] = olddescr.long()
        oneolddiff['oldtransshort'], oneolddiff['oldtranslong'] = PendingTranslation.make_quick_suggestion(olddescr, language)
        oneolddiff['diff_short'] = generate_line_diff(oneolddiff['oldshort'],oneolddiff['short'])
        oneolddiff['diff_transshort'] = generate_line_diff(oneolddiff['oldtransshort'],oneolddiff['transshort'])
        oneolddiff['diff_long'] = generate_line_diff(oneolddiff['oldlong'],oneolddiff['long'])
        oneolddiff['diff_translong'] = generate_line_diff(oneolddiff['oldtranslong'],oneolddiff['translong'])
        olddiffs.append(oneolddiff)

    session.commit()

    return render_to_response("ddtss/translate.html", dict(
        forreview=False,
        lang=lang,
        descr=descr,
        trans=trans,
        olddiffs=olddiffs,
        descr_messages=descr_messages), context_instance=RequestContext(request))
Exemple #2
0
def view_translate(session, request, language, description_id):
    """ Show the translation page for a description """
    lang = session.query(Languages).get(language)
    if not lang or not lang.enabled_ddtss:
        raise Http404()

    descr = session.query(Description).filter_by(description_id=description_id).first()
    if not descr:
        raise Http404()

    user = get_user(request, session)

    if not lang.translation_model.user_allowed(user, language, lang.translation_model.ACTION_TRANSLATE):
        return show_message_screen(request, 'User is not permitted to translate', 'ddtss_index_lang', language)

    # Select FOR UPDATE, to avoid concurrency issues.
    trans = session.query(PendingTranslation).filter_by(language=lang, description_id=description_id).with_lockmode('update').first()
    if not trans:
        message = Messages(
                message="",
                actionstring="fetched",
                to_user=None,
                language=language,
                for_description=description_id,
                from_user=user.username,
                in_reply_to=None,
                timestamp=int(time.time()))
        session.add(message)

        trans = PendingTranslation(
                description_id=description_id,
                language=lang,
                firstupdate=int(time.time()),
                lastupdate=int(time.time()),
                owner_username=user.username,
                owner_locktime=int(time.time()),
                iteration=0,
                state=PendingTranslation.STATE_PENDING_TRANSLATION)

        # Make a suggestion for the new translation
        trans.short, trans.long = PendingTranslation.make_suggestion(descr, language)
        session.add(trans)

    if trans.state != PendingTranslation.STATE_PENDING_TRANSLATION:
        session.commit()
        return show_message_screen(request, 'Already translated, redirecting to review screen', 'ddtss_forreview', language, description_id)

    # Try to lock the description, note sets the owner field
    if not trans.trylock(user):
        session.commit()
        return show_message_screen(request, 'Translation locked, try again later', 'ddtss_index_lang', language)

    if request.method == 'POST':
        form = TranslationForm(request.POST)

        if not form.is_valid():
            # Maybe return HTTP 400 - Bad request?
            return show_message_screen(request, 'Bad request %r' % form.errors, 'ddtss_index_lang', language)

        if form.cleaned_data['abandon']:
            trans.comment = form.cleaned_data['comment']
            trans.unlock()
            session.commit()
            return show_message_screen(request, 'Translation abandoned', 'ddtss_index_lang', language)

        if form.cleaned_data['submit']:
            trans.update_translation(form.cleaned_data['short'], form.cleaned_data['long'])
            trans.lastupdate = int(time.time())
            trans.comment = form.cleaned_data['comment']
            trans.unlock()

            # If no longer pending translation, add one to counter
            if trans.state != PendingTranslation.STATE_PENDING_TRANSLATION:
                user.counttranslations += 1

            message = ""
            if trans.comment:
                message = trans.comment
                trans.comment = None

            message = Messages(
                    message=message,
                    actionstring="text updated",
                    to_user=None,
                    language=language,
                    for_description=description_id,
                    from_user=user.username,
                    in_reply_to=None,
                    timestamp=int(time.time()))
            session.add(message)

            session.commit()
            if trans.state != PendingTranslation.STATE_PENDING_TRANSLATION:
                return show_message_screen(request, 'Translation submitted for review', 'ddtss_index_lang', language)
            else:
                return show_message_screen(request, 'Translation saved for further translation', 'ddtss_index_lang', language)

    if trans.comment is None:
        trans.comment = ""
    if trans.short is None:
        trans.short, trans.long = PendingTranslation.make_suggestion(descr, language)

    descr_messages = Messages.description_messages(session, description_id) \
                             .order_by(Messages.timestamp) \
                             .all()
    trans_messages = Messages.translation_messages(session, language, description_id) \
                             .order_by(Messages.timestamp) \
                             .all()

    olddiffs = list()
    for olddescr in descr.get_description_predecessors:
        oneolddiff = dict()
        oneolddiff['id'] = descr.description_id
        oneolddiff['short'] = descr.short()
        oneolddiff['long'] = descr.long()
        oneolddiff['transshort'], oneolddiff['translong'] = PendingTranslation.make_quick_suggestion(descr, language)
        oneolddiff['oldid'] = olddescr.description_id
        oneolddiff['oldshort'] = olddescr.short()
        oneolddiff['oldlong'] = olddescr.long()
        oneolddiff['oldtransshort'], oneolddiff['oldtranslong'] = PendingTranslation.make_quick_suggestion(olddescr, language)
        oneolddiff['diff_short'] = generate_line_diff(oneolddiff['oldshort'], oneolddiff['short'])
        oneolddiff['diff_transshort'] = generate_line_diff(oneolddiff['oldtransshort'], oneolddiff['transshort'])
        oneolddiff['diff_long'] = generate_line_diff(oneolddiff['oldlong'], oneolddiff['long'])
        oneolddiff['diff_translong'] = generate_line_diff(oneolddiff['oldtranslong'], oneolddiff['translong'])
        olddiffs.append(oneolddiff)

    session.commit()

    return render_to_response("ddtss/translate.html", dict(
        user=user,
        forreview=False,
        lang=lang,
        descr=descr,
        trans=trans,
        olddiffs=olddiffs,
        descr_messages=descr_messages,
        trans_messages=trans_messages), context_instance=RequestContext(request))