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")
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")