Exemple #1
0
class UnitSearchForm(forms.Form):

    count = forms.IntegerField(required=False)
    path = forms.CharField(max_length=2048, required=True)
    uid = forms.IntegerField(required=False)
    filter = forms.ChoiceField(required=False,
                               choices=UNIT_SEARCH_FILTER_CHOICES)
    checks = forms.MultipleChoiceField(
        required=False,
        widget=CommaSeparatedCheckboxSelectMultiple,
        choices=list(check_names.items()),
    )
    category = CategoryChoiceField(required=False,
                                   choices=list(CATEGORY_CODES.items()))
    month = forms.DateField(required=False, input_formats=["%Y-%m"])
    sort = forms.ChoiceField(required=False, choices=UNIT_SEARCH_SORT_CHOICES)

    user = forms.ModelChoiceField(
        queryset=get_user_model().objects.all(),
        required=False,
        to_field_name="username",
    )

    search = forms.CharField(required=False)

    soptions = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple,
        choices=(("exact", _("Exact Match")), ),
    )

    sfields = forms.MultipleChoiceField(
        required=False,
        widget=CommaSeparatedCheckboxSelectMultiple,
        choices=(
            ("source", _("Source Text")),
            ("target", _("Target Text")),
            ("notes", _("Comments")),
            ("locations", _("Locations")),
        ),
        initial=["source", "target"],
    )

    def __init__(self, *args, **kwargs):
        self.request_user = kwargs.pop("user")
        super(UnitSearchForm, self).__init__(*args, **kwargs)

    def clean(self):
        if "checks" in self.errors:
            del self.errors["checks"]
            self.cleaned_data["checks"] = None
        if "user" in self.errors:
            del self.errors["user"]
            self.cleaned_data["user"] = self.request_user
        if self.errors:
            return
        pootle_path = self.cleaned_data.get("path")
        path_keys = ["project_code", "language_code", "dir_path", "filename"]
        try:
            path_kwargs = {
                k: v
                for k, v in resolve(pootle_path).kwargs.items()
                if k in path_keys
            }
        except Resolver404:
            raise forms.ValidationError("Unrecognised path")
        self.cleaned_data.update(path_kwargs)
        sort_on = "units"
        if "filter" in self.cleaned_data:
            unit_filter = self.cleaned_data["filter"]
            if unit_filter in ("suggestions", "user-suggestions"):
                sort_on = "suggestions"
            elif unit_filter in ("user-submissions", ):
                sort_on = "submissions"
        sort_by_param = self.cleaned_data["sort"]
        self.cleaned_data["sort_by"] = ALLOWED_SORTS[sort_on].get(
            sort_by_param)
        self.cleaned_data["sort_on"] = sort_on

    def clean_month(self):
        if self.cleaned_data["month"]:
            return get_date_interval(
                self.cleaned_data["month"].strftime("%Y-%m"))

    def clean_user(self):
        return self.cleaned_data["user"] or self.request_user

    def clean_path(self):
        lang_code, proj_code = split_pootle_path(self.cleaned_data["path"])[:2]
        if not (lang_code or proj_code):
            permission_context = Directory.objects.projects
        elif proj_code and not lang_code:
            try:
                permission_context = (
                    Project.objects.select_related("directory").get(
                        code=proj_code).directory)
            except Project.DoesNotExist:
                raise forms.ValidationError("Unrecognized path")
        else:
            # no permission checking on lang translate views
            return self.cleaned_data["path"]
        if self.request_user.is_superuser:
            return self.cleaned_data["path"]
        can_view_path = check_user_permission(self.request_user,
                                              "administrate",
                                              permission_context)
        if can_view_path:
            return self.cleaned_data["path"]
        raise forms.ValidationError("Unrecognized path")
Exemple #2
0
class UnitSearchForm(forms.Form):

    count = forms.IntegerField(required=False)
    offset = forms.IntegerField(required=False)
    path = forms.CharField(max_length=2048, required=True)
    previous_uids = MultipleArgsField(field=forms.IntegerField(),
                                      required=False)
    uids = MultipleArgsField(field=forms.IntegerField(), required=False)
    filter = forms.ChoiceField(required=False,
                               choices=UNIT_SEARCH_FILTER_CHOICES)
    checks = forms.MultipleChoiceField(
        required=False,
        widget=CommaSeparatedCheckboxSelectMultiple,
        choices=check_names.items())
    category = CategoryChoiceField(required=False,
                                   choices=CATEGORY_CODES.items())
    month = forms.DateField(required=False, input_formats=['%Y-%m'])
    sort = forms.ChoiceField(required=False, choices=UNIT_SEARCH_SORT_CHOICES)

    user = forms.ModelChoiceField(queryset=get_user_model().objects.all(),
                                  required=False,
                                  to_field_name="username")

    search = forms.CharField(required=False)

    soptions = forms.MultipleChoiceField(required=False,
                                         widget=forms.CheckboxSelectMultiple,
                                         choices=(('exact',
                                                   _('Exact Match')), ))

    sfields = forms.MultipleChoiceField(
        required=False,
        widget=CommaSeparatedCheckboxSelectMultiple,
        choices=(('source', _('Source Text')), ('target', _('Target Text')),
                 ('notes', _('Comments')), ('locations', _('Locations'))),
        initial=['source', 'target'])

    default_count = 10

    def __init__(self, *args, **kwargs):
        self.request_user = kwargs.pop("user")
        super(UnitSearchForm, self).__init__(*args, **kwargs)
        self.fields["modified-since"] = ISODateTimeField(required=False)

    def clean(self):
        if "checks" in self.errors:
            del self.errors["checks"]
            self.cleaned_data["checks"] = None
        if "user" in self.errors:
            del self.errors["user"]
            self.cleaned_data["user"] = self.request_user
        if self.errors:
            return
        if self.default_count:
            count = (self.cleaned_data.get("count", self.default_count)
                     or self.default_count)
            user_count = (self.cleaned_data["user"].get_unit_rows()
                          or self.default_count)
            self.cleaned_data['count'] = min(count, user_count)
        self.cleaned_data["vfolder"] = None
        pootle_path = self.cleaned_data.get("path")
        if 'virtualfolder' in settings.INSTALLED_APPS:
            from virtualfolder.helpers import extract_vfolder_from_path
            from virtualfolder.models import VirtualFolderTreeItem
            vfolder, pootle_path = extract_vfolder_from_path(
                pootle_path,
                vfti=VirtualFolderTreeItem.objects.select_related(
                    "directory", "vfolder"))
            self.cleaned_data["vfolder"] = vfolder
            self.cleaned_data["pootle_path"] = pootle_path
        path_keys = ["project_code", "language_code", "dir_path", "filename"]
        try:
            path_kwargs = {
                k: v
                for k, v in resolve(pootle_path).kwargs.items()
                if k in path_keys
            }
        except Resolver404:
            raise forms.ValidationError('Unrecognised path')
        self.cleaned_data.update(path_kwargs)
        sort_on = "units"
        if "filter" in self.cleaned_data:
            unit_filter = self.cleaned_data["filter"]
            if unit_filter in ('suggestions', 'user-suggestions'):
                sort_on = 'suggestions'
            elif unit_filter in ('user-submissions', ):
                sort_on = 'submissions'
        sort_by_param = self.cleaned_data["sort"]
        self.cleaned_data["sort_by"] = ALLOWED_SORTS[sort_on].get(
            sort_by_param)
        self.cleaned_data["sort_on"] = sort_on

    def clean_month(self):
        if self.cleaned_data["month"]:
            return get_date_interval(
                self.cleaned_data["month"].strftime("%Y-%m"))

    def clean_user(self):
        return self.cleaned_data["user"] or self.request_user

    def clean_path(self):
        lang_code, proj_code = split_pootle_path(self.cleaned_data["path"])[:2]
        if not (lang_code or proj_code):
            permission_context = Directory.objects.projects
        elif proj_code and not lang_code:
            try:
                permission_context = Project.objects.select_related(
                    "directory").get(code=proj_code).directory
            except Project.DoesNotExist:
                raise forms.ValidationError("Unrecognized path")
        else:
            # no permission checking on lang translate views
            return self.cleaned_data["path"]
        if self.request_user.is_superuser:
            return self.cleaned_data["path"]
        can_view_path = check_user_permission(self.request_user,
                                              "administrate",
                                              permission_context)
        if can_view_path:
            return self.cleaned_data["path"]
        raise forms.ValidationError("Unrecognized path")