def search(translation, request): ''' Performs search or returns cached search results. ''' # Already performed search if 'sid' in request.GET: # Grab from session storage search_id = 'search_%s' % request.GET['sid'] # Check if we know the search if search_id not in request.session: messages.error(request, _('Invalid search string!')) return redirect(translation) return request.session[search_id] # Possible new search search_form = SearchForm(request.GET) review_form = ReviewForm(request.GET) search_query = None if review_form.is_valid(): # Review allunits = translation.unit_set.review( review_form.cleaned_data['date'], request.user ) formatted_date = formats.date_format( review_form.cleaned_data['date'], 'SHORT_DATE_FORMAT' ) name = _('Review of translations since %s') % formatted_date elif search_form.is_valid(): # Apply search conditions allunits = translation.unit_set.search( translation, search_form.cleaned_data, ) search_query = search_form.cleaned_data['q'] name = search_form.get_name() else: # Error reporting if 'date' in request.GET: show_form_errors(request, review_form) elif 'q' in request.GET or 'type' in request.GET: show_form_errors(request, search_form) # Filtering by type allunits = translation.unit_set.all() name = _('All strings') # Grab unit IDs unit_ids = list(allunits.values_list('id', flat=True)) # Check empty search results if len(unit_ids) == 0: messages.warning(request, _('No string matched your search!')) return redirect(translation) # Checksum unit access offset = 0 if 'checksum' in request.GET: try: unit = allunits.filter(checksum=request.GET['checksum'])[0] offset = unit_ids.index(unit.id) except (Unit.DoesNotExist, IndexError): messages.warning(request, _('No string matched your search!')) return redirect(translation) # Remove old search results cleanup_session(request.session) if name is not None: name = unicode(name) # Store in cache and return search_id = str(uuid.uuid1()) search_result = { 'query': search_query, 'name': name, 'ids': unit_ids, 'search_id': search_id, 'ttl': int(time.time()) + 86400, 'offset': offset, } request.session['search_%s' % search_id] = search_result return search_result
def search(translation, request): """Perform search or returns cached search results.""" # Possible new search search_form = SearchForm(request.GET) review_form = ReviewForm(request.GET) # Process form if 'date' in request.GET: if review_form.is_valid(): form = review_form else: show_form_errors(request, review_form) # Use blank form form = SearchForm([]) form.is_valid() elif search_form.is_valid(): form = search_form else: show_form_errors(request, search_form) # Use blank form form = SearchForm([]) form.is_valid() search_result = { 'form': form, 'offset': form.cleaned_data['offset'], 'checksum': form.cleaned_data['checksum'], } search_url = form.urlencode() session_key = 'search_{0}_{1}'.format(translation.pk, search_url) if session_key in request.session and 'offset' in request.GET: search_result.update(request.session[session_key]) return search_result if form.cleaned_data['type'] == 'review': allunits = translation.unit_set.review(form.cleaned_data['date'], request.user) else: allunits = translation.unit_set.search( translation, form.cleaned_data, ) if form.cleaned_data['type'] == 'random': allunits = allunits[:25] search_query = form.get_search_query() name = form.get_name() # Grab unit IDs unit_ids = list(allunits.values_list('id', flat=True)) # Check empty search results if len(unit_ids) == 0: messages.warning(request, _('No string matched your search!')) return redirect(translation) # Remove old search results cleanup_session(request.session) store_result = { 'query': search_query, 'url': search_url, 'key': session_key, 'name': force_text(name), 'ids': unit_ids, 'ttl': int(time.time()) + 86400, } request.session[session_key] = store_result search_result.update(store_result) return search_result
def search(translation, request): """ Performs search or returns cached search results. """ # Already performed search if "sid" in request.GET: # Grab from session storage search_id = "search_%s" % request.GET["sid"] # Check if we know the search if search_id not in request.session: messages.error(request, _("Invalid search string!")) return redirect(translation) return request.session[search_id] # Possible new search rqtype = request.GET.get("type", "all") search_form = SearchForm(request.GET) review_form = ReviewForm(request.GET) search_query = None if review_form.is_valid(): # Review allunits = translation.unit_set.review(review_form.cleaned_data["date"], request.user) formatted_date = formats.date_format(review_form.cleaned_data["date"], "SHORT_DATE_FORMAT") name = _("Review of translations since %s") % formatted_date elif search_form.is_valid(): # Apply search conditions allunits = translation.unit_set.search(search_form.cleaned_data) search_query = search_form.cleaned_data["q"] name = get_search_name(search_form.cleaned_data["search"], search_query) else: # Error reporting if "date" in request.GET: show_form_errors(request, review_form) elif "q" in request.GET: show_form_errors(request, search_form) # Filtering by type allunits = translation.unit_set.filter_type(rqtype, translation, ignored="ignored" in request.GET) name = get_filter_name(rqtype) # Grab unit IDs unit_ids = list(allunits.values_list("id", flat=True)) # Check empty search results if len(unit_ids) == 0: messages.warning(request, _("No string matched your search!")) return redirect(translation) # Checksum unit access offset = 0 if "checksum" in request.GET: try: unit = allunits.filter(checksum=request.GET["checksum"])[0] offset = unit_ids.index(unit.id) except (Unit.DoesNotExist, IndexError): messages.warning(request, _("No string matched your search!")) return redirect(translation) # Remove old search results cleanup_session(request.session) # Store in cache and return search_id = str(uuid.uuid1()) search_result = { "query": search_query, "name": unicode(name), "ids": unit_ids, "search_id": search_id, "ttl": int(time.time()) + 86400, "offset": offset, } request.session["search_%s" % search_id] = search_result return search_result
def search(translation, request): """Perform search or returns cached search results.""" # Already performed search if 'sid' in request.GET: # Grab from session storage search_id = 'search_{0}'.format(request.GET['sid']) # Check if we know the search if search_id not in request.session: messages.error(request, _('Invalid search string!')) return redirect(translation) search_result = copy.copy(request.session[search_id]) if 'params' in search_result: search_result['form'] = SearchForm(search_result['params']) else: search_result['form'] = SearchForm() return search_result # Possible new search search_form = SearchForm(request.GET) review_form = ReviewForm(request.GET) search_query = None if 'date' in request.GET: if review_form.is_valid(): # Review allunits = translation.unit_set.review( review_form.cleaned_data['date'], request.user) formatted_date = formats.date_format( review_form.cleaned_data['date'], 'SHORT_DATE_FORMAT') name = _('Review of translations since %s') % formatted_date else: show_form_errors(request, review_form) # Filtering by type allunits = translation.unit_set.all() name = _('All strings') elif search_form.is_valid(): # Apply search conditions allunits = translation.unit_set.search( translation, search_form.cleaned_data, ) if search_form.cleaned_data['type'] == 'random': allunits = allunits[:25] search_query = search_form.cleaned_data['q'] name = search_form.get_name() else: # Error reporting show_form_errors(request, search_form) # Filtering by type allunits = translation.unit_set.all() name = _('All strings') # Grab unit IDs unit_ids = list(allunits.values_list('id', flat=True)) # Check empty search results if len(unit_ids) == 0: messages.warning(request, _('No string matched your search!')) return redirect(translation) # Checksum unit access offset = 0 if 'checksum' in request.GET: try: unit = allunits.filter( id_hash=checksum_to_hash(request.GET['checksum']))[0] offset = unit_ids.index(unit.id) except (Unit.DoesNotExist, IndexError, ValueError): messages.warning(request, _('No string matched your search!')) return redirect(translation) # Remove old search results cleanup_session(request.session) # Store in cache and return search_id = str(uuid.uuid1()) search_result = { 'params': request.GET, 'query': search_query, 'name': force_text(name), 'ids': unit_ids, 'search_id': search_id, 'ttl': int(time.time()) + 86400, 'offset': offset, } request.session['search_{0}'.format(search_id)] = search_result search_result = copy.copy(search_result) search_result['form'] = search_form return search_result
def translate(request, project, subproject, lang): obj = get_object_or_404(Translation, language__code = lang, subproject__slug = subproject, subproject__project__slug = project, enabled = True) if obj.subproject.locked: messages.error(request, _('This translation is currently locked for updates!')) if request.user.is_authenticated(): profile = request.user.get_profile() else: profile = None secondary = None unit = None rqtype, direction, pos, search_query, search_exact, search_source, search_target, search_context, search_url = parse_search_url(request) # Any form submitted? if request.method == 'POST': form = TranslationForm(request.POST) if form.is_valid() and not obj.subproject.locked: # Check whether translation is not outdated obj.check_sync() try: try: unit = Unit.objects.get(checksum = form.cleaned_data['checksum'], translation = obj) except Unit.MultipleObjectsReturned: # Possible temporary inconsistency caused by ongoing update of repo, # let's pretend everyting is okay unit = Unit.objects.filter(checksum = form.cleaned_data['checksum'], translation = obj)[0] if 'suggest' in request.POST: # Handle suggesion saving user = request.user if isinstance(user, AnonymousUser): user = None if form.cleaned_data['target'] == len(form.cleaned_data['target']) * ['']: messages.error(request, _('Your suggestion is empty!')) # Stay on same entry return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) Suggestion.objects.create( target = join_plural(form.cleaned_data['target']), checksum = unit.checksum, language = unit.translation.language, project = unit.translation.subproject.project, user = user) # Update suggestion stats if profile is not None: profile.suggested += 1 profile.save() elif not request.user.is_authenticated(): # We accept translations only from authenticated messages.error(request, _('You need to log in to be able to save translations!')) elif not request.user.has_perm('trans.save_translation'): # Need privilege to save messages.error(request, _('You don\'t have privileges to save translations!')) else: # Remember old checks oldchecks = set(unit.active_checks().values_list('check', flat = True)) # Update unit and save it unit.target = join_plural(form.cleaned_data['target']) unit.fuzzy = form.cleaned_data['fuzzy'] unit.save_backend(request) # Update stats profile.translated += 1 profile.save() # Get new set of checks newchecks = set(unit.active_checks().values_list('check', flat = True)) # Did we introduce any new failures? if newchecks > oldchecks: # Show message to user messages.error(request, _('Some checks have failed on your translation!')) # Stay on same entry return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) # Redirect to next entry return HttpResponseRedirect('%s?type=%s&pos=%d%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) except Unit.DoesNotExist: logger.error('message %s disappeared!', form.cleaned_data['checksum']) messages.error(request, _('Message you wanted to translate is no longer available!')) # Handle translation merging if 'merge' in request.GET: if not request.user.has_perm('trans.save_translation'): # Need privilege to save messages.error(request, _('You don\'t have privileges to save translations!')) else: try: mergeform = MergeForm(request.GET) if mergeform.is_valid(): try: unit = Unit.objects.get(checksum = mergeform.cleaned_data['checksum'], translation = obj) except Unit.MultipleObjectsReturned: # Possible temporary inconsistency caused by ongoing update of repo, # let's pretend everyting is okay unit = Unit.objects.filter(checksum = mergeform.cleaned_data['checksum'], translation = obj)[0] merged = Unit.objects.get(pk = mergeform.cleaned_data['merge']) if unit.checksum != merged.checksum: messages.error(request, _('Can not merge different messages!')) else: unit.target = merged.target unit.fuzzy = merged.fuzzy unit.save_backend(request) # Update stats profile.translated += 1 profile.save() # Redirect to next entry return HttpResponseRedirect('%s?type=%s&pos=%d%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) except Unit.DoesNotExist: logger.error('message %s disappeared!', form.cleaned_data['checksum']) messages.error(request, _('Message you wanted to translate is no longer available!')) # Handle accepting/deleting suggestions if not obj.subproject.locked and ('accept' in request.GET or 'delete' in request.GET): # Check for authenticated users if not request.user.is_authenticated(): messages.error(request, _('You need to log in to be able to manage suggestions!')) return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) # Parse suggestion ID if 'accept' in request.GET: if not request.user.has_perm('trans.accept_suggestion'): messages.error(request, _('You do not have privilege to accept suggestions!')) return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) sugid = request.GET['accept'] else: if not request.user.has_perm('trans.delete_suggestion'): messages.error(request, _('You do not have privilege to delete suggestions!')) return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) sugid = request.GET['delete'] try: sugid = int(sugid) suggestion = Suggestion.objects.get(pk = sugid) except: suggestion = None if suggestion is not None: if 'accept' in request.GET: # Accept suggesiont suggestion.accept(request) # Delete suggestion in both cases (accepted ones are no longer needed) suggestion.delete() else: messages.error(request, _('Invalid suggestion!')) # Redirect to same entry for possible editing return HttpResponseRedirect('%s?type=%s&pos=%d&dir=stay%s' % ( obj.get_translate_url(), rqtype, pos, search_url )) reviewform = ReviewForm(request.GET) if reviewform.is_valid(): allunits = obj.unit_set.review(reviewform.cleaned_data['date'], request.user) # Review if direction == 'stay': units = allunits.filter(position = pos) elif direction == 'back': units = allunits.filter(position__lt = pos).order_by('-position') else: units = allunits.filter(position__gt = pos) elif search_query != '': # Apply search conditions if search_exact: query = Q() if search_source: query |= Q(source = search_query) if search_target: query |= Q(target = search_query) if search_context: query |= Q(context = search_query) allunits = obj.unit_set.filter(query) else: allunits = obj.unit_set.search(search_query, search_source, search_context, search_target) if direction == 'stay': units = obj.unit_set.filter(position = pos) elif direction == 'back': units = allunits.filter(position__lt = pos).order_by('-position') else: units = allunits.filter(position__gt = pos) else: allunits = obj.unit_set.filter_type(rqtype) # What unit set is about to show if direction == 'stay': units = obj.unit_set.filter(position = pos) elif direction == 'back': units = allunits.filter(position__lt = pos).order_by('-position') else: units = allunits.filter(position__gt = pos) # If we failed to get unit above or on no POST if unit is None: # Grab actual unit try: unit = units[0] except IndexError: messages.info(request, _('You have reached end of translating.')) return HttpResponseRedirect(obj.get_absolute_url()) # Show secondary languages for logged in users if profile: secondary = Unit.objects.filter( checksum = unit.checksum, translated = True, translation__subproject__project = unit.translation.subproject.project, translation__language__in = profile.secondary_languages.exclude(id = unit.translation.language.id) ) # distinct('target') works with Django 1.4 so let's emulate that # based on presumption we won't get too many results targets = {} res = [] for s in secondary: if s.target in targets: continue targets[s.target] = 1 res.append(s) secondary = res # Prepare form form = TranslationForm(initial = { 'checksum': unit.checksum, 'target': (unit.translation.language, unit.get_target_plurals()), 'fuzzy': unit.fuzzy, }) total = obj.unit_set.all().count() filter_count = allunits.count() return render_to_response('translate.html', RequestContext(request, { 'object': obj, 'unit': unit, 'changes': unit.change_set.all()[:10], 'total': total, 'type': rqtype, 'filter_name': get_filter_name(rqtype, search_query), 'filter_count': filter_count, 'filter_pos': filter_count + 1 - units.count(), 'form': form, 'target_language': obj.language.code, 'secondary': secondary, 'search_query': search_query, 'search_url': search_url, 'search_query': search_query, 'search_source': bool2str(search_source), 'search_exact': bool2str(search_exact), 'search_target': bool2str(search_target), 'search_context': bool2str(search_context), }))
def search(translation, request): """Perform search or returns cached search results.""" # Possible new search search_form = SearchForm(request.GET) review_form = ReviewForm(request.GET) # Process form if 'date' in request.GET: if review_form.is_valid(): form = review_form else: show_form_errors(request, review_form) # Use blank form form = SearchForm([]) form.is_valid() elif search_form.is_valid(): form = search_form else: show_form_errors(request, search_form) # Use blank form form = SearchForm([]) form.is_valid() search_result = { 'form': form, 'offset': form.cleaned_data['offset'], 'checksum': form.cleaned_data['checksum'], } search_url = form.urlencode() session_key = 'search_{0}_{1}'.format(translation.pk, search_url) if session_key in request.session: search_result.update(request.session[session_key]) return search_result if form.cleaned_data['type'] == 'review': allunits = translation.unit_set.review( form.cleaned_data['date'], request.user ) else: allunits = translation.unit_set.search( translation, form.cleaned_data, ) if form.cleaned_data['type'] == 'random': allunits = allunits[:25] search_query = form.get_search_query() name = form.get_name() # Grab unit IDs unit_ids = list(allunits.values_list('id', flat=True)) # Check empty search results if len(unit_ids) == 0: messages.warning(request, _('No string matched your search!')) return redirect(translation) # Remove old search results cleanup_session(request.session) store_result = { 'query': search_query, 'url': search_url, 'key': session_key, 'name': force_text(name), 'ids': unit_ids, 'ttl': int(time.time()) + 86400, } request.session[session_key] = store_result search_result.update(store_result) return search_result