def submit(request, unit): """Processes translation submissions and stores them in the database. :return: An object in JSON notation that contains the previous and last units for the unit next to unit ``uid``. """ json = {} cantranslate = check_permission("translate", request) if not cantranslate: raise PermissionDenied(_("You do not have rights to access " "translation mode.")) translation_project = request.translation_project language = translation_project.language if unit.hasplural(): snplurals = len(unit.source.strings) else: snplurals = None # Update current unit instance's attributes unit.submitted_by = request.profile unit.submitted_on = timezone.now() form_class = unit_form_factory(language, snplurals, request) form = form_class(request.POST, instance=unit) if form.is_valid(): if form.updated_fields: # Store creation time so that it is the same for all submissions creation_time=timezone.now() for field, old_value, new_value in form.updated_fields: sub = Submission( creation_time=creation_time, translation_project=translation_project, submitter=request.profile, unit=unit, field=field, type=SubmissionTypes.NORMAL, old_value=old_value, new_value=new_value, ) sub.save() form.save() translation_submitted.send( sender=translation_project, unit=form.instance, profile=request.profile, ) rcode = 200 else: # Form failed #FIXME: we should display validation errors here rcode = 400 json["msg"] = _("Failed to process submission.") response = jsonify(json) return HttpResponse(response, status=rcode, mimetype="application/json")
def timedelta(date): """Returns a human-readable time delta, similar to Django's ``timesince`` template filter but allowing proper localizability. Adapted from http://djangosnippets.org/snippets/2275/ """ delta = timezone.now() - date num_years = delta.days / 365 if (num_years > 0): return ungettext(u"%d year ago", u"%d years ago", num_years) % num_years num_weeks = delta.days / 7 if (num_weeks > 0): return ungettext(u"%d week ago", u"%d weeks ago", num_weeks) % num_weeks if (delta.days > 0): return ungettext(u"%d day ago", u"%d days ago", delta.days) % delta.days num_hours = delta.seconds / 3600 if (num_hours > 0): return ungettext(u"%d hour ago", u"%d hours ago", num_hours) % num_hours num_minutes = delta.seconds / 60 if (num_minutes > 0): return ungettext(u"%d minute ago", u"%d minutes ago", num_minutes) % num_minutes return _(u"Few seconds ago")
def comment(request, unit): """Stores a new comment for the given ``unit``. :return: If the form validates, the cleaned comment is returned. An error message is returned otherwise. """ # Update current unit instance's attributes unit.commented_by = request.profile unit.commented_on = timezone.now() language = request.translation_project.language form = unit_comment_form_factory(language)(request.POST, instance=unit, request=request) if form.is_valid(): form.save() context = { 'comment': unit.translator_comment, 'language': language, 'submitter': request.profile, } t = loader.get_template('unit/xhr-comment.html') c = RequestContext(request, context) json = {'comment': t.render(c)} rcode = 200 else: json = {'msg': _("Comment submission failed.")} rcode = 400 response = simplejson.dumps(json) return HttpResponse(response, status=rcode, mimetype="application/json")
def accept_suggestion(request, unit, suggid): json = { 'udbid': unit.id, 'sugid': suggid, } translation_project = request.translation_project if request.POST.get('accept'): try: suggestion = unit.suggestion_set.get(id=suggid) except ObjectDoesNotExist: raise Http404 old_target = unit.target success = unit.accept_suggestion(suggid) json['newtargets'] = [highlight_whitespace(target) for target in unit.target.strings] json['newdiffs'] = {} for sugg in unit.get_suggestions(): json['newdiffs'][sugg.id] = \ [highlight_diffs(unit.target.strings[i], target) for i, target in enumerate(sugg.target.strings)] if suggestion is not None and success: if suggestion.user: translation_submitted.send(sender=translation_project, unit=unit, profile=suggestion.user) # FIXME: we need a totally different model for tracking stats, this # is just lame suggstat, created = SuggestionStat.objects.get_or_create( translation_project=translation_project, suggester=suggestion.user, state='pending', unit=unit.id, ) suggstat.reviewer = request.profile suggstat.state = 'accepted' suggstat.save() # For now assume the target changed # TODO: check all fields for changes creation_time = timezone.now() sub = Submission( creation_time=creation_time, translation_project=translation_project, submitter=suggestion.user, from_suggestion=suggstat, unit=unit, field=SubmissionFields.TARGET, type=SubmissionTypes.SUGG_ACCEPT, old_value=old_target, new_value=unit.target, ) sub.save() response = jsonify(json) return HttpResponse(response, mimetype="application/json")
def accept_suggestion(request, unit, suggid): json = {} translation_project = request.translation_project json["udbid"] = unit.id json["sugid"] = suggid if request.POST.get('accept'): try: suggestion = unit.suggestion_set.get(id=suggid) except ObjectDoesNotExist: raise Http404 old_target = unit.target success = unit.accept_suggestion(suggid) json['newtargets'] = [ highlight_whitespace(target) for target in unit.target.strings ] json['newdiffs'] = {} for sugg in unit.get_suggestions(): json['newdiffs'][sugg.id] = [highlight_diffs(unit.target.strings[i], target) \ for i, target in enumerate(sugg.target.strings)] if suggestion is not None and success: if suggestion.user: translation_submitted.send(sender=translation_project, unit=unit, profile=suggestion.user) #FIXME: we need a totally different model for tracking stats, this is just lame if suggestion.user != request.profile: suggstat, created = SuggestionStat.objects.get_or_create( translation_project=translation_project, suggester=suggestion.user, state='pending', unit=unit.id) suggstat.reviewer = request.profile suggstat.state = 'accepted' suggstat.save() else: suggstat = None # For now assume the target changed # TODO: check all fields for changes creation_time = timezone.now() sub = Submission( creation_time=creation_time, translation_project=translation_project, submitter=suggestion.user, from_suggestion=suggstat, unit=unit, field=SubmissionFields.TARGET, type=SubmissionTypes.SUGG_ACCEPT, old_value=old_target, new_value=unit.target, ) sub.save() response = jsonify(json) return HttpResponse(response, mimetype="application/json")
def do_upload(self, request, translation_project, directory, store): if self.form.is_valid() and 'file' in request.FILES: django_file = self.form.cleaned_data['file'] overwrite = self.form.cleaned_data['overwrite'] upload_to = self.form.cleaned_data['upload_to'] upload_to_dir = self.form.cleaned_data['upload_to_dir'] translation_project.scan_files() oldstats = translation_project.getquickstats() # The URL relative to the URL of the translation project. Thus, if # directory.pootle_path == /af/pootle/foo/bar, then # relative_root_dir == foo/bar. if django_file.name.endswith('.zip'): archive = True target_directory = upload_to_dir or directory upload_archive(request, target_directory, django_file, overwrite) else: archive = False upload_file(request, directory, django_file, overwrite, store=upload_to) translation_project.scan_files() newstats = translation_project.getquickstats() # create a submission, doesn't fix stats but at least # shows up in last activity column from pootle_misc.util import timezone s = Submission( creation_time=timezone.now(), translation_project=translation_project, submitter=get_profile(request.user), type=SubmissionTypes.UPLOAD, # the other fields are only relevant to unit-based changes ) s.save() post_file_upload.send(sender=translation_project, user=request.user, oldstats=oldstats, newstats=newstats, archive=archive) return {'upload': self}
def do_upload(self, request, translation_project, directory, store): if self.form.is_valid() and 'file' in request.FILES: django_file = self.form.cleaned_data['file'] overwrite = self.form.cleaned_data['overwrite'] upload_to = self.form.cleaned_data['upload_to'] upload_to_dir = self.form.cleaned_data['upload_to_dir'] # XXX Why do we scan here? translation_project.scan_files(vcs_sync=False) oldstats = translation_project.getquickstats() # The URL relative to the URL of the translation project. Thus, if # directory.pootle_path == /af/pootle/foo/bar, then # relative_root_dir == foo/bar. if django_file.name.endswith('.zip'): archive = True target_directory = upload_to_dir or directory upload_archive(request, target_directory, django_file, overwrite) else: archive = False upload_file(request, directory, django_file, overwrite, store=upload_to) translation_project.scan_files(vcs_sync=False) newstats = translation_project.getquickstats() # create a submission, doesn't fix stats but at least # shows up in last activity column from pootle_misc.util import timezone s = Submission( creation_time=timezone.now(), translation_project=translation_project, submitter=get_profile(request.user), type=SubmissionTypes.UPLOAD, # the other fields are only relevant to unit-based changes ) s.save() post_file_upload.send( sender=translation_project, user=request.user, oldstats=oldstats, newstats=newstats, archive=archive) return {'upload': self}
def save(self): """Registers the submission and saves the comment.""" if self.has_changed(): creation_time=timezone.now() translation_project = self.request.translation_project sub = Submission( creation_time=creation_time, translation_project=translation_project, submitter=self.request.profile, unit=self.instance, field=SubmissionFields.COMMENT, type=SubmissionTypes.NORMAL, old_value=u"", new_value=self.cleaned_data['translator_comment'] ) sub.save() super(UnitCommentForm, self).save()
def submit(request, unit): """Processes translation submissions and stores them in the database. :return: An object in JSON notation that contains the previous and last units for the unit next to unit ``uid``. """ json = {} cantranslate = check_permission("translate", request) if not cantranslate: raise PermissionDenied( _("You do not have rights to access " "translation mode.")) translation_project = request.translation_project language = translation_project.language if unit.hasplural(): snplurals = len(unit.source.strings) else: snplurals = None # Update current unit instance's attributes unit.submitted_by = request.profile unit.submitted_on = timezone.now() form_class = unit_form_factory(language, snplurals, request) form = form_class(request.POST, instance=unit) if form.is_valid(): if form.updated_fields: # Store creation time so that it is the same for all submissions creation_time = timezone.now() for field, old_value, new_value in form.updated_fields: sub = Submission( creation_time=creation_time, translation_project=translation_project, submitter=request.profile, unit=unit, field=field, type=SubmissionTypes.NORMAL, old_value=old_value, new_value=new_value, ) sub.save() form.save() translation_submitted.send( sender=translation_project, unit=form.instance, profile=request.profile, ) rcode = 200 else: # Form failed #FIXME: we should display validation errors here rcode = 400 json["msg"] = _("Failed to process submission.") response = jsonify(json) return HttpResponse(response, status=rcode, mimetype="application/json")