Esempio n. 1
0
def resource_translations_delete(request, project_slug, resource_slug, lang_code):
    """
    Delete the set of Translation objects for a specific Language in a Resource.
    """
    resource = get_object_or_404(Resource, project__slug = project_slug,
                                 slug = resource_slug)

    language = get_object_or_404(Language, code=lang_code)

    # Use a flag to denote if there is an attempt to delete the source language.
    is_source_language = False
    if resource.source_language == language:
        is_source_language = True

    if request.method == 'POST':
        Translation.objects.filter(resource=resource,
            language=language).delete()

        messages.success(request,
                        _("Deleted %(lang)s translation for resource "
                        "%(resource)s.") % {
                          'lang': language.name,
                          'resource': resource.name})
        invalidate_stats_cache(resource, language, user=request.user)
        return HttpResponseRedirect(reverse('resource_detail',
                                    args=[resource.project.slug, resource.slug]),)
    else:
        return render_to_response(
            'resources/resource_translations_confirm_delete.html',
            {'resource': resource,
             'language': language,
             'is_source_language': is_source_language},
            context_instance=RequestContext(request))
Esempio n. 2
0
    def delete(self, *args, **kwargs):
        """
        Do some extra processing along with the actual delete to db.
        """
        # Import is here to avoid circular imports
        from transifex.resources.handlers import invalidate_stats_cache

        invalidate_stats_cache(self, self.source_language)
        RLStats.objects.filter(resource=self).delete()
        super(Resource, self).delete(*args, **kwargs)
Esempio n. 3
0
    def delete(self, *args, **kwargs):
        """
        Do some extra processing along with the actual delete to db.
        """
        # Import is here to avoid circular imports
        from transifex.resources.handlers import invalidate_stats_cache

        invalidate_stats_cache(self, self.source_language)
        RLStats.objects.filter(resource=self).delete()
        super(Resource, self).delete(*args, **kwargs)
Esempio n. 4
0
    def delete(self):
        """
        Delete a specific translation.

        Delete all Translation objects that belong to the specified resource
        and are in the specified language.
        """
        TranslationModel.objects.filter(resource=self.resource,
                                        language=self.language).delete()
        invalidate_stats_cache(self.resource,
                               self.language,
                               user=self.request.user)
Esempio n. 5
0
def proofread(request, project_slug, lang_code, resource_slug=None, *args, **kwargs):
    """AJAX view that sets the reviewed flag on Translations to true or false.

    The request data is expected in JSON, with the following format:

    {
        'true': [1,2,3]
        'false': [4,5]
    }

    Note: The IDs are source entity IDs.
    """
    if request.method != 'POST':
        return HttpResponse(status=405)

    project = get_object_or_404(Project, slug=project_slug)
    resource = get_object_or_404(Resource, slug=resource_slug, project=project)

    try:
        language = Language.objects.by_code_or_alias(lang_code)
    except Language.DoesNotExist:
        raise Http404

    # Check if the user has the necessary permissions to review strings.
    check = ProjectPermission(request.user)
    if not check.proofread(project, language):
        return permission_denied(request)

    request_data = simplejson.loads(request.raw_post_data)

    if 'true' in request_data:
        source_entity_ids = request_data['true']
        translations = Translation.objects.filter(
            source_entity__id__in=source_entity_ids,
            language__code=lang_code,
        )
        translations.update(reviewed=True)
        ReviewHistory.add_many(translations, request.user, project.id, reviewed=True)

    if 'false' in request_data:
        source_entity_ids = request_data['false']
        translations = Translation.objects.filter(
            source_entity__id__in=source_entity_ids,
            language__code=lang_code,
        )
        translations.update(reviewed=False)
        ReviewHistory.add_many(translations, request.user, project.id, reviewed=False)

    invalidate_stats_cache(resource, language, user=request.user)

    return HttpResponse(status=200)
Esempio n. 6
0
    def delete(self):
        """
        Delete a specific translation.

        Delete all Translation objects that belong to the specified resource
        and are in the specified language.
        """
        TranslationModel.objects.filter(
            resource=self.resource,
            language=self.language
        ).delete()
        invalidate_stats_cache(
            self.resource, self.language, user=self.request.user
        )
Esempio n. 7
0
def clone_language(request,
                   project_slug=None,
                   resource_slug=None,
                   source_lang_code=None,
                   target_lang_code=None):
    '''
    Get a resource, a src lang and a target lang and clone all translation
    strings for the src to the target.

    The user is redirected to the online editor for the target language.
    '''

    resource = get_object_or_404(Resource,
                                 slug=resource_slug,
                                 project__slug=project_slug)

    # Permissions handling
    # Project should always be available
    project = get_object_or_404(Project, slug=project_slug)
    team = Team.objects.get_or_none(project, target_lang_code)
    check = ProjectPermission(request.user)
    if not check.submit_translations(team or project) or not \
        resource.accept_translations:
        return permission_denied(request)

    source_lang = get_object_or_404(Language, code=source_lang_code)
    target_lang = get_object_or_404(Language, code=target_lang_code)

    # get the strings which will be cloned
    strings = Translation.objects.filter(resource=resource,
                                         language=source_lang)

    # If the language we want to create, has the same plural rules with the
    # source, we also copy the pluralized translations!
    if not source_lang.get_pluralrules() == target_lang.get_pluralrules():
        strings = strings.exclude(source_entity__pluralized=True)

    # clone them in new translation
    for s in strings:
        Translation.objects.get_or_create(language=target_lang,
                                          string=s.string,
                                          source_entity=s.source_entity,
                                          rule=s.rule,
                                          resource=s.resource)

    invalidate_stats_cache(resource, target_lang, user=request.user)
    return HttpResponseRedirect(
        reverse('translate_resource',
                args=[project_slug, resource_slug, target_lang_code]), )
Esempio n. 8
0
    def handle(self, **options):
        from transifex.resources.models import Resource, SourceEntity, Translation
        from transifex.resources.handlers import invalidate_stats_cache

        en = Language.objects.get(code='en-US')
        p = Project.objects.get(slug="bzmenu")
        for r in Resource.objects.filter(project=p):
            for orig in Translation.objects.filter(resource=r, language=en):
                Translation.objects.exclude(language=en
                    ).filter(resource=r, string=orig.string).delete()

        # reset Stats
        for r in Resource.objects.filter(project=p):
            for l in Language.objects.filter(pk__in=Translation.objects.filter(resource=r
                    ).order_by('language').values_list('language', flat=True).distinct()):
                        invalidate_stats_cache(r, l)
Esempio n. 9
0
def clone_language(request, project_slug=None, resource_slug=None,
            source_lang_code=None, target_lang_code=None):
    '''
    Get a resource, a src lang and a target lang and clone all translation
    strings for the src to the target.

    The user is redirected to the online editor for the target language.
    '''

    resource = get_object_or_404(Resource, slug=resource_slug,
                                 project__slug=project_slug)

    # Permissions handling
    # Project should always be available
    project = get_object_or_404(Project, slug=project_slug)
    team = Team.objects.get_or_none(project, target_lang_code)
    check = ProjectPermission(request.user)
    if not check.submit_translations(team or project) or not \
        resource.accept_translations:
        return permission_denied(request)

    source_lang = get_object_or_404(Language, code=source_lang_code)
    target_lang = get_object_or_404(Language, code=target_lang_code)

    # get the strings which will be cloned
    strings = Translation.objects.filter(
                resource = resource,
                language = source_lang)

    # If the language we want to create, has the same plural rules with the
    # source, we also copy the pluralized translations!
    if not source_lang.get_pluralrules() == target_lang.get_pluralrules():
        strings = strings.exclude(source_entity__pluralized = True)

    # clone them in new translation
    for s in strings:
        Translation.objects.get_or_create(
            language=target_lang, string=s.string,
            source_entity=s.source_entity, rule=s.rule,
            resource=s.resource
        )

    invalidate_stats_cache(resource, target_lang, user=request.user)
    return HttpResponseRedirect(reverse('translate_resource', args=[project_slug,
                                resource_slug, target_lang_code]),)
Esempio n. 10
0
def delete_translation(request,
                       project_slug=None,
                       resource_slug=None,
                       lang_code=None):
    """
    Delete a list of translations according to the post request.
    """

    if not request.POST:
        return HttpResponseBadRequest()

    project = get_object_or_404(Project, slug=project_slug)

    resource = get_object_or_404(Resource, slug=resource_slug, project=project)
    language = get_object_or_404(Language, code=lang_code)
    data = simplejson.loads(request.raw_post_data)
    to_delete = data["to_delete"]
    ids = []
    # Ensure that there are no empty '' ids
    for se_id in to_delete:
        if se_id:
            ids.append(se_id)

    try:
        translations = Translation.objects.filter(source_entity__pk__in=ids,
                                                  language=language)

        translations.delete()


#        request.user.message_set.create(
#            message=_("Translations deleted successfully!"))
    except:
        #        request.user.message_set.create(
        #            message=_("Failed to delete translations due to some error!"))
        raise Http404

    invalidate_stats_cache(resource, language, user=request.user)

    return HttpResponse(status=200)
Esempio n. 11
0
def resource_translations_delete(request, project_slug, resource_slug,
                                 lang_code):
    """
    Delete the set of Translation objects for a specific Language in a Resource.
    """
    resource = get_object_or_404(Resource,
                                 project__slug=project_slug,
                                 slug=resource_slug)

    language = get_object_or_404(Language, code=lang_code)

    # Use a flag to denote if there is an attempt to delete the source language.
    is_source_language = False
    if resource.source_language == language:
        is_source_language = True

    if request.method == 'POST':
        Translation.objects.filter(resource=resource,
                                   language=language).delete()

        messages.success(
            request,
            _("Deleted %(lang)s translation for resource "
              "%(resource)s.") % {
                  'lang': language.name,
                  'resource': resource.name
              })
        invalidate_stats_cache(resource, language, user=request.user)
        return HttpResponseRedirect(
            reverse('resource_detail',
                    args=[resource.project.slug, resource.slug]), )
    else:
        return render_to_response(
            'resources/resource_translations_confirm_delete.html', {
                'resource': resource,
                'language': language,
                'is_source_language': is_source_language
            },
            context_instance=RequestContext(request))
Esempio n. 12
0
def delete_translation(request, project_slug=None, resource_slug=None,
                        lang_code=None):
    """
    Delete a list of translations according to the post request.
    """

    if not request.POST:
        return HttpResponseBadRequest()

    project = get_object_or_404(Project, slug=project_slug)

    resource = get_object_or_404(Resource, slug=resource_slug, project=project)
    language = get_object_or_404(Language, code=lang_code)
    data = simplejson.loads(request.raw_post_data)
    to_delete = data["to_delete"]
    ids = []
    # Ensure that there are no empty '' ids
    for se_id in to_delete:
        if se_id:
            ids.append(se_id)


    try:
        translations = Translation.objects.filter(source_entity__pk__in=ids,
                                   language=language)

        translations.delete()
#        request.user.message_set.create(
#            message=_("Translations deleted successfully!"))
    except:
#        request.user.message_set.create(
#            message=_("Failed to delete translations due to some error!"))
        raise Http404

    invalidate_stats_cache(resource, language, user=request.user)

    return HttpResponse(status=200)
Esempio n. 13
0
            if translation_string.reviewed:
                if not review_perm:
                    raise LotteBadRequestError(
                        _('You are not allowed to edit a reviewed string.'))

            # FIXME: Maybe we don't want to permit anyone to delete!!!
            # If an empty string has been issued then we delete the translation.
            if target_string == "":
                translation_string.delete()
            else:
                translation_string.string = target_string
                translation_string.user = user
                translation_string.save()

            _add_copyright(source_string, target_language, user)
            invalidate_stats_cache(resource, target_language, user=user)
        except Translation.DoesNotExist:
            # Only create new if the translation string sent, is not empty!
            if target_string != "":
                Translation.objects.create(
                    source_entity=source_string.source_entity,
                    user=user,
                    language=target_language,
                    rule=rule,
                    string=target_string,
                    resource=resource)
                _add_copyright(source_string, target_language, user)
                invalidate_stats_cache(resource, target_language, user=user)
            else:
                # In cases of pluralized translations, sometimes only one
                # translation will exist and the rest plural forms will be
Esempio n. 14
0
            translation_string = Translation.objects.get(
                source_entity=source_string.source_entity,
                language=target_language, rule=rule
            )

            # FIXME: Maybe we don't want to permit anyone to delete!!!
            # If an empty string has been issued then we delete the translation.
            if target_string == "":
                translation_string.delete()
            else:
                translation_string.string = target_string
                translation_string.user = user
                translation_string.save()

            _add_copyright(source_string, target_language, user)
            invalidate_stats_cache(resource, target_language, user=user)
        except Translation.DoesNotExist:
            # Only create new if the translation string sent, is not empty!
            if target_string != "":
                Translation.objects.create(
                    source_entity=source_string.source_entity, user=user,
                    language=target_language, rule=rule, string=target_string,
                    resource=resource
                )
                _add_copyright(source_string, target_language, user)
                invalidate_stats_cache(resource, target_language, user=user)
            else:
                # In cases of pluralized translations, sometimes only one
                # translation will exist and the rest plural forms will be
                # empty. If the user wants to delete all of them, we need
                # to let by the ones that don't already have a translation.
Esempio n. 15
0
                    )
                except SourceEntity.DoesNotExist:
                    continue

                tr, created = Suggestion.objects.get_or_create(
                    string = j.translation,
                    source_entity = se,
                    language = self.language
                )

            self._post_save2db(strings_added, strings_updated, strings_deleted,
                is_source, user, overwrite_translations)

            if strings_added + strings_updated + strings_deleted > 0:
                # Invalidate cache after saving file
                invalidate_stats_cache(self.resource, self.language, user=user)

                if self.language == self.resource.source_language:
                    nt = 'project_resource_changed'
                else:
                    nt = 'project_resource_translated'
                context = {'project': self.resource.project,
                            'resource': self.resource,
                            'language': self.language}
                object_list = [self.resource.project, self.resource, self.language]
                # if we got no user, skip the log
                if user:
                    action_logging(user, object_list, nt, context=context)

                if settings.ENABLE_NOTICES:
                    txnotification.send_observation_notices_for(self.resource.project,
Esempio n. 16
0
    def handle(self, **options):
        from transifex.resources.models import Resource, SourceEntity, Translation
        from transifex.resources.handlers import invalidate_stats_cache

        en = Language.objects.get(code='en-US')

        # for e in legacy.Extension.objects.filter(slug='smarttemplate4'):
        for e in legacy.Extension.objects.filter(slug='babelzillamenu-13'):
            owner = migrate_user(e.owner.username)
            slug = NEW_SLUGS.get(e.slug, e.slug)
            p, created = Project.objects.get_or_create(slug=slug,
                defaults={
                    'name': smart_unicode(e.name),
                    'description': smart_unicode(e.description),
                    'homepage': e.homepage,
                    'source_language':en,
                    'owner': owner,
                })
            p.maintainers.add(owner)

            # import Strings and Translations
            for f in legacy.File.objects.filter(extension=e):
                r, created = Resource.objects.get_or_create(name=f.name, project=p, slug=slugify(f.name))
                if f.name.endswith('.dtd'):
                    r.i18n_type = 'DTD'
                elif f.name.endswith('.properties'):
                    r.i18n_type = 'MOZILLAPROPERTIES'
                else:
                    raise Exception("Unknown file type")
                r.save()
                for s in legacy.String.objects.filter(file=f, extension=e).select_related('language'):
                    entity, created = SourceEntity.objects.get_or_create(resource=r, string=s.name)
                    lang = LangLookup.get(s.language.name)
                    if not lang:
                        # pl_PL and ru_RU are actually never read when newer,
                        # shorter Languages like 'pl' and 'ru' are present
                        print "Language lookup failed for %s" % s.language.name
                        continue
                    try:
                        t, created = Translation.objects.get_or_create(
                            resource=r, source_entity=entity, language=lang
                            )
                        t.string = smart_unicode(s.string)
                        t.save()
                    except:
                        print "Error saving String {0}".format(s.id)

            # reset Stats
            for r in Resource.objects.filter(project=p):
                for l in Language.objects.filter(pk__in=Translation.objects.filter(resource=r
                        ).order_by('language').values_list('language', flat=True).distinct()):
                            invalidate_stats_cache(r, l)

            # import Teams
            for g in legacy.Group.objects.filter(extension=e):
                l_members = legacy.Membership.objects.filter(group=g).order_by('permissions')
                team_owner = migrate_user(e.owner.username)
                try:
                    if l_members and l_members[0].permissions == 'm':
                        # members exist and first one is a maintainer
                        team_owner = migrate_user(l_members[0].user.username)
                except legacy.User.DoesNotExist:
                    print "Invalid membership: %s" % l_members[0].id

                lang = LangLookup.get(g.language.name)
                team, created = Team.objects.get_or_create(language=lang, project=p,
                    defaults = {'creator': team_owner} )
                for m in l_members:
                    try:
                        user = migrate_user(m.user.username)
                    except legacy.User.DoesNotExist:
                        print "Invalid membership: %s" % l_members[0].id
                        continue
                    if m.permissions == 'm':
                        team.coordinators.add(user)
                    else:
                        team.members.add(user)
Esempio n. 17
0
def proofread(request,
              project_slug,
              lang_code,
              resource_slug=None,
              *args,
              **kwargs):
    """AJAX view that sets the reviewed flag on Translations to true or false.

    The request data is expected in JSON, with the following format:

    {
        'true': [1,2,3]
        'false': [4,5]
    }

    Note: The IDs are source entity IDs.
    """
    if request.method != 'POST':
        return HttpResponse(status=405)

    project = get_object_or_404(Project, slug=project_slug)
    resource = get_object_or_404(Resource, slug=resource_slug, project=project)

    try:
        language = Language.objects.by_code_or_alias(lang_code)
    except Language.DoesNotExist:
        raise Http404

    # Check if the user has the necessary permissions to review strings.
    check = ProjectPermission(request.user)
    if not check.proofread(project, language):
        return permission_denied(request)

    request_data = simplejson.loads(request.raw_post_data)

    if 'true' in request_data:
        source_entity_ids = request_data['true']
        translations = Translation.objects.filter(
            source_entity__id__in=source_entity_ids,
            language__code=lang_code,
        )
        translations.update(reviewed=True)
        ReviewHistory.add_many(translations,
                               request.user,
                               project.id,
                               reviewed=True)

    if 'false' in request_data:
        source_entity_ids = request_data['false']
        translations = Translation.objects.filter(
            source_entity__id__in=source_entity_ids,
            language__code=lang_code,
        )
        translations.update(reviewed=False)
        ReviewHistory.add_many(translations,
                               request.user,
                               project.id,
                               reviewed=False)

    invalidate_stats_cache(resource, language, user=request.user)

    return HttpResponse(status=200)