def view_review(session, request, language, description_id): """ Show the review 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() # 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: raise Http404() if trans.state == PendingTranslation.STATE_PENDING_TRANSLATION: session.commit() return show_message_screen(request, 'Still need to translated, redirecting to translation screen', 'ddtss_translate', language, description_id) if trans.state != PendingTranslation.STATE_PENDING_REVIEW: session.commit() return show_message_screen(request, 'Translation not ready for review', 'ddtss_index_lang', language) 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 review', 'ddtss_index_lang', language) if request.method == 'POST': form = ReviewForm(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['timestamp'] != trans.lastupdate: return show_message_screen(request, 'The translation was updated before submission, please recheck changes', 'ddtss_forreview', language, description_id) if form.cleaned_data['nothing']: trans.comment = form.cleaned_data['comment'] if trans.comment: message = Messages( message=trans.comment, 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.comment = None trans.lastupdate=int(time.time()) session.commit() return show_message_screen(request, 'Changed comment only', 'ddtss_index_lang', language) if form.cleaned_data['accept']: trans.comment = form.cleaned_data['comment'] # Owner can't review own description if user == trans.user: session.commit() return show_message_screen(request, 'Translation was translated by you', 'ddtss_index_lang', language) # Check if user has already reviewed it for r in trans.reviews: if r.username == user.username: session.commit() return show_message_screen(request, 'Translation was already reviewed', 'ddtss_index_lang', language) # Add to reviewers trans.reviews.append( PendingTranslationReview(username=user.username) ) # count review user.countreviews += 1 trans.lastupdate=int(time.time()) message = "" if trans.comment: message = trans.comment trans.comment = None message = Messages( message=message, actionstring="reviewed", to_user=None, language=language, for_description=description_id, from_user=user.username, in_reply_to=None, timestamp=int(time.time())) session.add(message) if lang.translation_model.translation_accepted(trans): # Translation has been accepted, yay! trans.accept_translation() session.commit() return show_message_screen(request, 'Translation accepted', 'ddtss_index_lang', language) session.commit() return show_message_screen(request, 'Translation reviewed', 'ddtss_index_lang', language) if form.cleaned_data['submit']: trans.update_translation(form.cleaned_data['short'], form.cleaned_data['long']) trans.comment = form.cleaned_data['comment'] trans.owner_username = user.username trans.lastupdate=int(time.time()) # Clear reviews for review in trans.reviews: session.delete(review) 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 updated, review process restarted', 'ddtss_index_lang', language) if trans.comment is None: trans.comment = "" session.commit() diff_short = diff_long = None if trans.oldshort and trans.for_display(trans.oldshort) != trans.for_display(trans.short): diff_short = generate_line_diff(trans.for_display(trans.oldshort), trans.for_display(trans.short)) if trans.oldlong and trans.for_display(trans.oldlong) != trans.for_display(trans.long): diff_long = generate_long_description_diff(trans.for_display(trans.oldlong), trans.for_display(trans.long)) descr_messages = session.query(Messages) \ .filter(Messages.for_description==description_id) \ .filter(Messages.language==language) \ .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) return render_to_response("ddtss/translate.html", dict( forreview=True, diff_short=diff_short, diff_long=diff_long, lang=lang, descr=descr, trans=trans, olddiffs=olddiffs, descr_messages=descr_messages), context_instance=RequestContext(request))
def view_review(session, request, language, description_id): """ Show the review 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() # 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: raise Http404() if trans.state == PendingTranslation.STATE_PENDING_TRANSLATION: session.commit() return show_message_screen(request, 'Still need to translated, redirecting to translation screen', 'ddtss_translate', language, description_id) if trans.state != PendingTranslation.STATE_PENDING_REVIEW: session.commit() return show_message_screen(request, 'Translation not ready for review', 'ddtss_index_lang', language) 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 review', 'ddtss_index_lang', language) if request.method == 'POST': form = ReviewForm(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['timestamp'] != trans.lastupdate: return show_message_screen(request, 'The translation was updated before submission, please recheck changes', 'ddtss_forreview', language, description_id) if form.cleaned_data['nothing']: trans.comment = form.cleaned_data['comment'] if trans.comment: message = Messages( message=trans.comment, 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.comment = None trans.lastupdate = int(time.time()) session.commit() return show_message_screen(request, 'Changed comment only', 'ddtss_index_lang', language) if form.cleaned_data['accept']: trans.comment = form.cleaned_data['comment'] # Owner can't review own description if user == trans.user: session.commit() return show_message_screen(request, 'Translation was translated by you', 'ddtss_index_lang', language) # Check if user has already reviewed it for r in trans.reviews: if r.username == user.username: session.commit() return show_message_screen(request, 'Translation was already reviewed', 'ddtss_index_lang', language) # Add to reviewers trans.reviews.append(PendingTranslationReview(username=user.username)) # count review user.countreviews += 1 trans.lastupdate = int(time.time()) message = "" if trans.comment: message = trans.comment trans.comment = None message = Messages( message=message, actionstring="reviewed", to_user=None, language=language, for_description=description_id, from_user=user.username, in_reply_to=None, timestamp=int(time.time())) session.add(message) if lang.translation_model.translation_accepted(trans): # Translation has been accepted, yay! trans.accept_translation() session.commit() return show_message_screen(request, 'Translation accepted', 'ddtss_index_lang', language) session.commit() return show_message_screen(request, 'Translation reviewed', 'ddtss_index_lang', language) if form.cleaned_data['submit']: trans.update_translation(form.cleaned_data['short'], form.cleaned_data['long']) trans.comment = form.cleaned_data['comment'] trans.owner_username = user.username trans.lastupdate = int(time.time()) # Clear reviews for review in trans.reviews: session.delete(review) 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 updated, review process restarted', 'ddtss_index_lang', language) if trans.comment is None: trans.comment = "" session.commit() diff_short = diff_long = None if trans.oldshort and trans.for_display(trans.oldshort) != trans.for_display(trans.short): diff_short = generate_line_diff(trans.for_display(trans.oldshort), trans.for_display(trans.short)) if trans.oldlong and trans.for_display(trans.oldlong) != trans.for_display(trans.long): diff_long = generate_long_description_diff(trans.for_display(trans.oldlong), trans.for_display(trans.long)) 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) return render_to_response("ddtss/translate.html", dict( user=user, forreview=True, diff_short=diff_short, diff_long=diff_long, lang=lang, descr=descr, trans=trans, olddiffs=olddiffs, descr_messages=descr_messages, trans_messages=trans_messages), context_instance=RequestContext(request))
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))
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))